ZGlmZiAtLWdpdCBhL0FuZHJvaWQuYnAgYi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3N2E4MDMKLS0tIC9kZXYvbnVsbAorKysgYi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNSBAQAorZGlyZ3JvdXAgeworICAgIG5hbWU6ICJ0cnVzdHlfZGlyZ3JvdXBfc3lzdGVtX2NvcmUiLAorICAgIGRpcnM6IFsiLiJdLAorICAgIHZpc2liaWxpdHk6IFsiLy90cnVzdHkvdmVuZG9yL2dvb2dsZS9hb3NwL3NjcmlwdHMiXSwKK30KZGlmZiAtLWdpdCBhL09XTkVSUyBiL09XTkVSUwppbmRleCA2ODJhMDY3Li45NmI0ZjU0IDEwMDY0NAotLS0gYS9PV05FUlMKKysrIGIvT1dORVJTCkBAIC0xICsxLDIgQEAKKyMgQnVnIGNvbXBvbmVudDogMTI4NTc3CiBlbmhAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvUFJFVVBMT0FELmNmZyBiL1BSRVVQTE9BRC5jZmcKaW5kZXggOWI5NmYzNi4uZjQ3YzMxNyAxMDA2NDQKLS0tIGEvUFJFVVBMT0FELmNmZworKysgYi9QUkVVUExPQUQuY2ZnCkBAIC0xLDYgKzEsNyBAQAogW0J1aWx0aW4gSG9va3NdCiBjbGFuZ19mb3JtYXQgPSB0cnVlCiBydXN0Zm10ID0gdHJ1ZQorYnBmbXQgPSB0cnVlCiAKIFtCdWlsdGluIEhvb2tzIE9wdGlvbnNdCiBjbGFuZ19mb3JtYXQgPSAtLWNvbW1pdCAke1BSRVVQTE9BRF9DT01NSVR9IC0tc3R5bGUgZmlsZSAtLWV4dGVuc2lvbnMgYyxoLGNjLGNwcApkaWZmIC0tZ2l0IGEvYm9vdHN0YXQvQW5kcm9pZC5icCBiL2Jvb3RzdGF0L0FuZHJvaWQuYnAKaW5kZXggY2E1OWVmMy4uMGM4NzYwYyAxMDA2NDQKLS0tIGEvYm9vdHN0YXQvQW5kcm9pZC5icAorKysgYi9ib290c3RhdC9BbmRyb2lkLmJwCkBAIC03Miw5ICs3Miw2IEBACiAgICAgXSwKICAgICBpbml0X3JjOiBbImJvb3RzdGF0LnJjIl0sCiAgICAgcHJvZHVjdF92YXJpYWJsZXM6IHsKLSAgICAgICAgcGRrOiB7Ci0gICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKLSAgICAgICAgfSwKICAgICAgICAgZGVidWdnYWJsZTogewogICAgICAgICAgICAgaW5pdF9yYzogWyJib290c3RhdC1kZWJ1Zy5yYyJdLAogICAgICAgICB9LApkaWZmIC0tZ2l0IGEvYm9vdHN0YXQvYm9vdHN0YXQuY3BwIGIvYm9vdHN0YXQvYm9vdHN0YXQuY3BwCmluZGV4IDg0NDM1N2MuLmQ0NzZkMzYgMTAwNjQ0Ci0tLSBhL2Jvb3RzdGF0L2Jvb3RzdGF0LmNwcAorKysgYi9ib290c3RhdC9ib290c3RhdC5jcHAKQEAgLTQ1OSw2ICs0NTksMTYgQEAKICAgICB7InJlYm9vdCxzeXNfbGRvX29rLHBtaWMsbWFpbiIsIDIyN30sCiAgICAgeyJyZWJvb3Qsc3lzX2xkb19vayxwbWljLHN1YiIsIDIyOH0sCiAgICAgeyJyZWJvb3Qsc21wbF90aW1lb3V0LHBtaWMsbWFpbiIsIDIyOX0sCisgICAgeyJyZWJvb3Qsb3RhLC4qIiwgMjMwfSwKKyAgICB7InJlYm9vdCxwZXJpb2RpYywuKiIsIDIzMX0sCisgICAgeyJyZWJvb3QsZWFybHksYWJsIiwgMjMyfSwKKyAgICB7InJlYm9vdCxlYXJseSxibDIiLCAyMzN9LAorICAgIHsicmVib290LGxvbmdrZXkscG1pY19jb2xkIiwgMjM0fSwKKyAgICB7InJlYm9vdCxsb25na2V5LG1hc3Rlcl9kYyIsIDIzNX0sCisgICAgeyJyZWJvb3Qsb2NwMixwbWljLGlmIiwgMjM2fSwKKyAgICB7InJlYm9vdCxvY3AscG1pYyxpZiIsIDIzN30sCisgICAgeyJyZWJvb3QsZnNoaXAiLCAyMzh9LAorICAgIHsicmVib290LG9jcCwuKiIsIDIzOX0sCiB9OwogCiAvLyBDb252ZXJ0cyBhIHN0cmluZyB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIHJlYXNvbiB0aGUgc3lzdGVtIGJvb3RlZCB0byBhbgpAQCAtNDg5LDcgKzQ5OSw3IEBACiB9CiAKIC8vIENhbm9uaWNhbCBsaXN0IG9mIHN1cHBvcnRlZCBwcmltYXJ5IHJlYm9vdCByZWFzb25zLgotY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3Qgc3RkOjpzdHJpbmc+IGtub3duUmVhc29ucyA9IHsKK2NvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBrbm93blJlYXNvbnMgPSB7CiAgICAgLy8gY2xhbmctZm9ybWF0IG9mZgogICAgIC8vIGtlcm5lbAogICAgICJ3YXRjaGRvZyIsCkBAIC04MjAsNyArODMwLDcgQEAKICAgcmV0dXJuIHN1YlJlYXNvbjsKIH0KIAotYm9vbCBhZGRLZXJuZWxQYW5pY1N1YlJlYXNvbihjb25zdCBwc3RvcmVDb25zb2xlJiBjb25zb2xlLCBzdGQ6OnN0cmluZyYgcmV0KSB7Cit2b2lkIGFkZEtlcm5lbFBhbmljU3ViUmVhc29uKGNvbnN0IHBzdG9yZUNvbnNvbGUmIGNvbnNvbGUsIHN0ZDo6c3RyaW5nJiByZXQpIHsKICAgLy8gQ2hlY2sgZm9yIGtlcm5lbCBwYW5pYyB0eXBlcyB0byByZWZpbmUgaW5mb3JtYXRpb24KICAgaWYgKChjb25zb2xlLnJmaW5kKCJTeXNScSA6IFRyaWdnZXIgYSBjcmFzaCIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB8fAogICAgICAgKGNvbnNvbGUucmZpbmQoIlBDIGlzIGF0IHN5c3JxX2hhbmRsZV9jcmFzaCsiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykpIHsKQEAgLTgzMiw2MyArODQyLDYxIEBACiAgICAgaWYgKHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewogICAgICAgcmV0ICs9ICIsIiArIGdldFN1YnJlYXNvbihjb25zb2xlLCBwb3MgKyBzdHJsZW4oc3lzcnFTdWJyZWFzb24pLCAvKiBxdW90ZWQgKi8gdHJ1ZSk7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybjsKICAgfQogICBpZiAoY29uc29sZS5yZmluZCgiVW5hYmxlIHRvIGhhbmRsZSBrZXJuZWwgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlIGF0IHZpcnR1YWwgYWRkcmVzcyIpICE9CiAgICAgICBzdGQ6OnN0cmluZzo6bnBvcykgewogICAgIHJldCA9ICJrZXJuZWxfcGFuaWMsbnVsbCI7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuOwogICB9CiAgIGlmIChjb25zb2xlLnJmaW5kKCJLZXJuZWwgQlVHIGF0ICIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CiAgICAgcmV0ID0gImtlcm5lbF9wYW5pYyxidWciOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybjsKICAgfQogCiAgIHN0ZDo6c3RyaW5nIHBhbmljKCJLZXJuZWwgcGFuaWMgLSBub3Qgc3luY2luZzogIik7CiAgIGF1dG8gcG9zID0gY29uc29sZS5yZmluZChwYW5pYyk7Ci0gIGlmIChwb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGNvbnN0IHN0ZDo6c3RyaW5nLCBjb25zdCBzdGQ6OnN0cmluZz4+IHBhbmljUmVhc29ucyA9IHsKLSAgICAgICAgeyJPdXQgb2YgbWVtb3J5IiwgIm9vbSJ9LAotICAgICAgICB7Im91dCBvZiBtZW1vcnkiLCAib29tIn0sCi0gICAgICAgIHsiT2ggYm95LCB0aGF0IGVhcmx5IG91dCBvZiBtZW1vcnkiLCAib29tIn0sICAvLyBvbWcKLSAgICAgICAgeyJCVUchIiwgImJ1ZyJ9LAotICAgICAgICB7Imh1bmdfdGFzazogYmxvY2tlZCB0YXNrcyIsICJodW5nIn0sCi0gICAgICAgIHsiYXVkaXQ6ICIsICJhdWRpdCJ9LAotICAgICAgICB7InNjaGVkdWxpbmcgd2hpbGUgYXRvbWljIiwgImF0b21pYyJ9LAotICAgICAgICB7IkF0dGVtcHRlZCB0byBraWxsIGluaXQhIiwgImluaXQifSwKLSAgICAgICAgeyJSZXF1ZXN0ZWQgaW5pdCIsICJpbml0In0sCi0gICAgICAgIHsiTm8gd29ya2luZyBpbml0IiwgImluaXQifSwKLSAgICAgICAgeyJDb3VsZCBub3QgZGVjb21wcmVzcyBpbml0IiwgImluaXQifSwKLSAgICAgICAgeyJSQ1UgU3RhbGwiLCAiaHVuZyxyY3UifSwKLSAgICAgICAgeyJzdGFjay1wcm90ZWN0b3IiLCAic3RhY2sifSwKLSAgICAgICAgeyJrZXJuZWwgc3RhY2sgb3ZlcmZsb3ciLCAic3RhY2sifSwKLSAgICAgICAgeyJDb3JydXB0IGtlcm5lbCBzdGFjayIsICJzdGFjayJ9LAotICAgICAgICB7ImxvdyBzdGFjayBkZXRlY3RlZCIsICJzdGFjayJ9LAotICAgICAgICB7ImNvcnJ1cHRlZCBzdGFjayBlbmQiLCAic3RhY2sifSwKLSAgICAgICAgeyJzdWJzeXMtcmVzdGFydDogUmVzZXR0aW5nIHRoZSBTb0MgLSBtb2RlbSBjcmFzaGVkLiIsICJtb2RlbSJ9LAotICAgICAgICB7InN1YnN5cy1yZXN0YXJ0OiBSZXNldHRpbmcgdGhlIFNvQyAtIGFkc3AgY3Jhc2hlZC4iLCAiYWRzcCJ9LAotICAgICAgICB7InN1YnN5cy1yZXN0YXJ0OiBSZXNldHRpbmcgdGhlIFNvQyAtIGRzcHMgY3Jhc2hlZC4iLCAiZHNwcyJ9LAotICAgICAgICB7InN1YnN5cy1yZXN0YXJ0OiBSZXNldHRpbmcgdGhlIFNvQyAtIHdjbnNzIGNyYXNoZWQuIiwgIndjbnNzIn0sCi0gICAgfTsKKyAgaWYgKHBvcyA9PSBzdGQ6OnN0cmluZzo6bnBvcykgcmV0dXJuOwogCi0gICAgcmV0ID0gImtlcm5lbF9wYW5pYyI7Ci0gICAgZm9yIChhdXRvJiBzIDogcGFuaWNSZWFzb25zKSB7Ci0gICAgICBpZiAoY29uc29sZS5maW5kKHBhbmljICsgcy5maXJzdCwgcG9zKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgICByZXQgKz0gIiwiICsgcy5zZWNvbmQ7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQorICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGNvbnN0IHN0ZDo6c3RyaW5nLCBjb25zdCBzdGQ6OnN0cmluZz4+IHBhbmljUmVhc29ucyA9IHsKKyAgICAgIHsiT3V0IG9mIG1lbW9yeSIsICJvb20ifSwKKyAgICAgIHsib3V0IG9mIG1lbW9yeSIsICJvb20ifSwKKyAgICAgIHsiT2ggYm95LCB0aGF0IGVhcmx5IG91dCBvZiBtZW1vcnkiLCAib29tIn0sICAvLyBvbWcKKyAgICAgIHsiQlVHISIsICJidWcifSwKKyAgICAgIHsiaHVuZ190YXNrOiBibG9ja2VkIHRhc2tzIiwgImh1bmcifSwKKyAgICAgIHsiYXVkaXQ6ICIsICJhdWRpdCJ9LAorICAgICAgeyJzY2hlZHVsaW5nIHdoaWxlIGF0b21pYyIsICJhdG9taWMifSwKKyAgICAgIHsiQXR0ZW1wdGVkIHRvIGtpbGwgaW5pdCEiLCAiaW5pdCJ9LAorICAgICAgeyJSZXF1ZXN0ZWQgaW5pdCIsICJpbml0In0sCisgICAgICB7Ik5vIHdvcmtpbmcgaW5pdCIsICJpbml0In0sCisgICAgICB7IkNvdWxkIG5vdCBkZWNvbXByZXNzIGluaXQiLCAiaW5pdCJ9LAorICAgICAgeyJSQ1UgU3RhbGwiLCAiaHVuZyxyY3UifSwKKyAgICAgIHsic3RhY2stcHJvdGVjdG9yIiwgInN0YWNrIn0sCisgICAgICB7Imtlcm5lbCBzdGFjayBvdmVyZmxvdyIsICJzdGFjayJ9LAorICAgICAgeyJDb3JydXB0IGtlcm5lbCBzdGFjayIsICJzdGFjayJ9LAorICAgICAgeyJsb3cgc3RhY2sgZGV0ZWN0ZWQiLCAic3RhY2sifSwKKyAgICAgIHsiY29ycnVwdGVkIHN0YWNrIGVuZCIsICJzdGFjayJ9LAorICAgICAgeyJzdWJzeXMtcmVzdGFydDogUmVzZXR0aW5nIHRoZSBTb0MgLSBtb2RlbSBjcmFzaGVkLiIsICJtb2RlbSJ9LAorICAgICAgeyJzdWJzeXMtcmVzdGFydDogUmVzZXR0aW5nIHRoZSBTb0MgLSBhZHNwIGNyYXNoZWQuIiwgImFkc3AifSwKKyAgICAgIHsic3Vic3lzLXJlc3RhcnQ6IFJlc2V0dGluZyB0aGUgU29DIC0gZHNwcyBjcmFzaGVkLiIsICJkc3BzIn0sCisgICAgICB7InN1YnN5cy1yZXN0YXJ0OiBSZXNldHRpbmcgdGhlIFNvQyAtIHdjbnNzIGNyYXNoZWQuIiwgIndjbnNzIn0sCisgIH07CisKKyAgcmV0ID0gImtlcm5lbF9wYW5pYyI7CisgIGZvciAoYXV0byYgcyA6IHBhbmljUmVhc29ucykgeworICAgIGlmIChjb25zb2xlLmZpbmQocGFuaWMgKyBzLmZpcnN0LCBwb3MpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICByZXQgKz0gIiwiICsgcy5zZWNvbmQ7CisgICAgICByZXR1cm47CiAgICAgfQotICAgIGF1dG8gcmVhc29uID0gZ2V0U3VicmVhc29uKGNvbnNvbGUsIHBvcyArIHBhbmljLmxlbmd0aCgpLCAvKiBuZXdsaW5lICovIGZhbHNlKTsKLSAgICBpZiAocmVhc29uLmxlbmd0aCgpID4gMykgewotICAgICAgcmV0ICs9ICIsIiArIHJlYXNvbjsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7CiAgIH0KLSAgcmV0dXJuIGZhbHNlOworICBhdXRvIHJlYXNvbiA9IGdldFN1YnJlYXNvbihjb25zb2xlLCBwb3MgKyBwYW5pYy5sZW5ndGgoKSwgLyogbmV3bGluZSAqLyBmYWxzZSk7CisgIGlmIChyZWFzb24ubGVuZ3RoKCkgPiAzKSB7CisgICAgcmV0ICs9ICIsIiArIHJlYXNvbjsKKyAgfQogfQogCi1ib29sIGFkZEtlcm5lbFBhbmljU3ViUmVhc29uKGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250ZW50LCBzdGQ6OnN0cmluZyYgcmV0KSB7Ci0gIHJldHVybiBhZGRLZXJuZWxQYW5pY1N1YlJlYXNvbihwc3RvcmVDb25zb2xlKGNvbnRlbnQpLCByZXQpOwordm9pZCBhZGRLZXJuZWxQYW5pY1N1YlJlYXNvbihjb25zdCBzdGQ6OnN0cmluZyYgY29udGVudCwgc3RkOjpzdHJpbmcmIHJldCkgeworICBhZGRLZXJuZWxQYW5pY1N1YlJlYXNvbihwc3RvcmVDb25zb2xlKGNvbnRlbnQpLCByZXQpOwogfQogCiBjb25zdCBjaGFyIHN5c3RlbV9yZWJvb3RfcmVhc29uX3Byb3BlcnR5W10gPSAic3lzLmJvb3QucmVhc29uIjsKQEAgLTEwNjksMTIgKzEwNzcsNyBAQAogICAgICAgfQogCiAgICAgICAvLyBDaGVjayBmb3Iga2VybmVsIHBhbmljcywgYWxsb3dlZCB0byBvdmVycmlkZSByZWJvb3QgY29tbWFuZC4KLSAgICAgIGlmICghYWRkS2VybmVsUGFuaWNTdWJSZWFzb24oY29uc29sZSwgcmV0KSAmJgotICAgICAgICAgIC8vIGNoZWNrIGZvciBsb25nLXByZXNzIHBvd2VyIGRvd24KLSAgICAgICAgICAoKGNvbnNvbGUucmZpbmQoIlBvd2VyIGhlbGQgZm9yICIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB8fAotICAgICAgICAgICAoY29uc29sZS5yZmluZCgiY2hhcmdlcjogWyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSkpIHsKLSAgICAgICAgcmV0ID0gImNvbGQiOwotICAgICAgfQorICAgICAgKHZvaWQpYWRkS2VybmVsUGFuaWNTdWJSZWFzb24oY29uc29sZSwgcmV0KTsKICAgICB9CiAKICAgICAvLyBUT0RPOiB1c2UgdGhlIEhBTCB0byBnZXQgYmF0dGVyeSBsZXZlbCAoaHR0cDovL2IvNzc3MjU3MDIpLgpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL0FuZHJvaWQuYnAgYi9kZWJ1Z2dlcmQvQW5kcm9pZC5icAppbmRleCBkMjBkZTZiLi4zMjU3YTJjIDEwMDY0NAotLS0gYS9kZWJ1Z2dlcmQvQW5kcm9pZC5icAorKysgYi9kZWJ1Z2dlcmQvQW5kcm9pZC5icApAQCAtMTIsNiArMTIsNyBAQAogICAgICAgICAiLVduby11bnVzZWQtYXJndW1lbnQiLAogICAgICAgICAiLVduby11bnVzZWQtZnVuY3Rpb24iLAogICAgICAgICAiLVduby1udWxsYWJpbGl0eS1jb21wbGV0ZW5lc3MiLAorICAgICAgICAiLVduby1yZW9yZGVyLWluaXQtbGlzdCIsCiAgICAgICAgICItT3MiLAogICAgICAgICAiLWZuby1maW5pdGUtbG9vcHMiLAogICAgICAgICAiLURBTkRST0lEX0RFQlVHR0FCTEU9MCIsCkBAIC0yMCw4ICsyMSwxMSBAQAogICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiAgICAgcHJvZHVjdF92YXJpYWJsZXM6IHsKICAgICAgICAgZGVidWdnYWJsZTogewotICAgICAgICAgICAgY2ZsYWdzOiBbIi1VQU5EUk9JRF9ERUJVR0dBQkxFIiwgIi1EQU5EUk9JRF9ERUJVR0dBQkxFPTEiXSwKLSAgICAgICAgfQorICAgICAgICAgICAgY2ZsYWdzOiBbCisgICAgICAgICAgICAgICAgIi1VQU5EUk9JRF9ERUJVR0dBQkxFIiwKKyAgICAgICAgICAgICAgICAiLURBTkRST0lEX0RFQlVHR0FCTEU9MSIsCisgICAgICAgICAgICBdLAorICAgICAgICB9LAogICAgIH0sCiB9CiAKQEAgLTMxLDkgKzM1LDEwIEBACiAgICAgcmVjb3ZlcnlfYXZhaWxhYmxlOiB0cnVlLAogICAgIHZlbmRvcl9yYW1kaXNrX2F2YWlsYWJsZTogdHJ1ZSwKICAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiY29tLmFuZHJvaWQucnVudGltZSIsCiAgICAgICAgICJjb20uYW5kcm9pZC52aXJ0IiwKICAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAotICAgXSwKKyAgICBdLAogfQogCiBjY19saWJyYXJ5X3NoYXJlZCB7CkBAIC04NCw2ICs4OSw3IEBACiAKICAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbImxpYmRlYnVnZ2VyZF9jb21tb25faGVhZGVycyJdLAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsidG9tYnN0b25lZC9pbmNsdWRlIl0sCisgICAgYXBleF9hdmFpbGFibGU6IFsiY29tLmFuZHJvaWQucnVudGltZSJdLAogfQogCiAvLyBDb3JlIGltcGxlbWVudGF0aW9uLCBsaW5rZWQgaW50byBsaWJkZWJ1Z2dlcmRfaGFuZGxlciBhbmQgdGhlIGR5bmFtaWMgbGlua2VyLgpAQCAtMTA5LDYgKzExNSw5IEBACiAKICAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbImxpYmRlYnVnZ2VyZF9jb21tb25faGVhZGVycyJdLAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICJjb20uYW5kcm9pZC5ydW50aW1lIiwKKyAgICBdLAogfQogCiAvLyBJbXBsZW1lbnRhdGlvbiB3aXRoIGEgbm8tb3AgZmFsbGJhY2suCkBAIC0xODUsOSArMTk0LDQ1IEBACiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiB9CiAKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJkZWJ1Z2dlcmRfdG9tYnN0b25lX3Byb3RvX3RvX3RleHQiLAorICAgIGRlZmF1bHRzOiBbImRlYnVnZ2VyZF9kZWZhdWx0cyJdLAorICAgIHJhbWRpc2tfYXZhaWxhYmxlOiB0cnVlLAorICAgIHJlY292ZXJ5X2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2ZW5kb3JfcmFtZGlza19hdmFpbGFibGU6IHRydWUsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsibGliZGVidWdnZXJkL2luY2x1ZGUiXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImxpYmRlYnVnZ2VyZC9pbmNsdWRlIl0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJsaWJkZWJ1Z2dlcmQvdG9tYnN0b25lX3Byb3RvX3RvX3RleHQuY3BwIiwKKyAgICAgICAgImxpYmRlYnVnZ2VyZC91dGlsaXR5X2hvc3QuY3BwIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgIF0sCisKKyAgICB3aG9sZV9zdGF0aWNfbGliczogWworICAgICAgICAibGlidG9tYnN0b25lX3Byb3RvIiwKKyAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLnJ1bnRpbWUiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGliZGVidWdnZXJkIiwKICAgICBkZWZhdWx0czogWyJkZWJ1Z2dlcmRfZGVmYXVsdHMiXSwKKyAgICByYW1kaXNrX2F2YWlsYWJsZTogdHJ1ZSwKICAgICByZWNvdmVyeV9hdmFpbGFibGU6IHRydWUsCiAgICAgdmVuZG9yX3JhbWRpc2tfYXZhaWxhYmxlOiB0cnVlLAogCkBAIC0xOTUsMTIgKzI0MCwxNiBAQAogICAgICAgICAibGliZGVidWdnZXJkL2JhY2t0cmFjZS5jcHAiLAogICAgICAgICAibGliZGVidWdnZXJkL2d3cF9hc2FuLmNwcCIsCiAgICAgICAgICJsaWJkZWJ1Z2dlcmQvb3Blbl9maWxlc19saXN0LmNwcCIsCisgICAgICAgICJsaWJkZWJ1Z2dlcmQvc2N1ZG8uY3BwIiwKICAgICAgICAgImxpYmRlYnVnZ2VyZC90b21ic3RvbmUuY3BwIiwKICAgICAgICAgImxpYmRlYnVnZ2VyZC90b21ic3RvbmVfcHJvdG8uY3BwIiwKLSAgICAgICAgImxpYmRlYnVnZ2VyZC90b21ic3RvbmVfcHJvdG9fdG9fdGV4dC5jcHAiLAogICAgICAgICAibGliZGVidWdnZXJkL3V0aWxpdHkuY3BwIiwKICAgICBdLAogCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRFVTRV9TQ1VETyIsCisgICAgXSwKKwogICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJsaWJkZWJ1Z2dlcmQvaW5jbHVkZSJdLAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsibGliZGVidWdnZXJkL2luY2x1ZGUiXSwKIApAQCAtMjEyLDI1ICsyNjEsMjUgQEAKICAgICAgICAgImJpb25pY19saWJjX3BsYXRmb3JtX2hlYWRlcnMiLAogICAgICAgICAiZ3dwX2FzYW5faGVhZGVycyIsCiAgICAgICAgICJsaWJsb2dfaGVhZGVycyIsCisgICAgICAgICJzY3Vkb19oZWFkZXJzIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmRleGZpbGVfc3VwcG9ydCIsICAvLyBsaWJ1bndpbmRzdGFjayBkZXBlbmRlbmN5CisgICAgICAgICJsaWJkZXhmaWxlX3N1cHBvcnQiLCAvLyBsaWJ1bndpbmRzdGFjayBkZXBlbmRlbmN5CiAgICAgICAgICJsaWJ1bndpbmRzdGFjayIsCiAgICAgICAgICJsaWJsem1hIiwKICAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICBdLAotICAgIHJ1bnRpbWVfbGliczogWwotICAgICAgICAibGliZGV4ZmlsZSIsICAgICAgICAgICAvLyBsaWJkZXhmaWxlX3N1cHBvcnQgZGVwZW5kZW5jeQotICAgIF0sCiAKICAgICB3aG9sZV9zdGF0aWNfbGliczogWworICAgICAgICAibGliZGVidWdnZXJkX3RvbWJzdG9uZV9wcm90b190b190ZXh0IiwKICAgICAgICAgImxpYmFzeW5jX3NhZmUiLAogICAgICAgICAiZ3dwX2FzYW5fY3Jhc2hfaGFuZGxlciIsCiAgICAgICAgICJsaWJ0b21ic3RvbmVfcHJvdG8iLAogICAgICAgICAibGlicHJvY2luZm8iLAogICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAorICAgICAgICAibGlic2N1ZG8iLAogICAgIF0sCiAKICAgICB0YXJnZXQ6IHsKQEAgLTI1MCw2ICsyOTksMTkgQEAKICAgICAgICAgICAgICAgICAibGliZGV4ZmlsZSIsCiAgICAgICAgICAgICBdLAogICAgICAgICB9LAorICAgICAgICByYW1kaXNrOiB7CisgICAgICAgICAgICBleGNsdWRlX3N0YXRpY19saWJzOiBbCisgICAgICAgICAgICAgICAgImxpYmRleGZpbGVfc3VwcG9ydCIsCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgZXhjbHVkZV9ydW50aW1lX2xpYnM6IFsKKyAgICAgICAgICAgICAgICAibGliZGV4ZmlsZSIsCisgICAgICAgICAgICBdLAorICAgICAgICB9LAorICAgICAgICBhbmRyb2lkOiB7CisgICAgICAgICAgICBydW50aW1lX2xpYnM6IFsKKyAgICAgICAgICAgICAgICAibGliZGV4ZmlsZSIsIC8vIGxpYmRleGZpbGVfc3VwcG9ydCBkZXBlbmRlbmN5CisgICAgICAgICAgICBdLAorICAgICAgICB9LAogICAgIH0sCiAKICAgICBwcm9kdWN0X3ZhcmlhYmxlczogewpAQCAtMjU3LDI2ICszMTksMzAgQEAKICAgICAgICAgICAgIGNmbGFnczogWyItRFJPT1RfUE9TU0lCTEUiXSwKICAgICAgICAgfSwKIAotICAgICAgICBtYWxsb2Nfbm90X3N2ZWx0ZTogewotICAgICAgICAgICAgY2ZsYWdzOiBbIi1EVVNFX1NDVURPIl0sCi0gICAgICAgICAgICB3aG9sZV9zdGF0aWNfbGliczogWyJsaWJzY3VkbyJdLAotICAgICAgICAgICAgc3JjczogWyJsaWJkZWJ1Z2dlcmQvc2N1ZG8uY3BwIl0sCi0gICAgICAgICAgICBoZWFkZXJfbGliczogWyJzY3Vkb19oZWFkZXJzIl0sCisgICAgICAgIG1hbGxvY19sb3dfbWVtb3J5OiB7CisgICAgICAgICAgICBjZmxhZ3M6IFsiLVVVU0VfU0NVRE8iXSwKKyAgICAgICAgICAgIGV4Y2x1ZGVfc3RhdGljX2xpYnM6IFsibGlic2N1ZG8iXSwKICAgICAgICAgfSwKICAgICB9LAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICJjb20uYW5kcm9pZC5ydW50aW1lIiwKKyAgICBdLAogfQogCiBjY19iaW5hcnkgewogICAgIG5hbWU6ICJwYnRvbWJzdG9uZSIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCiAgICAgZGVmYXVsdHM6IFsiZGVidWdnZXJkX2RlZmF1bHRzIl0sCi0gICAgc3JjczogWyJwYnRvbWJzdG9uZS5jcHAiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJwYnRvbWJzdG9uZS5jcHAiLAorICAgICAgICAidG9tYnN0b25lX3N5bWJvbGl6ZS5jcHAiLAorICAgIF0sCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYmJhc2UiLAotICAgICAgICAibGliZGVidWdnZXJkIiwKKyAgICAgICAgImxpYmRlYnVnZ2VyZF90b21ic3RvbmVfcHJvdG9fdG9fdGV4dCIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAogICAgICAgICAibGlidG9tYnN0b25lX3Byb3RvIiwKLSAgICAgICAgImxpYnVud2luZHN0YWNrIiwKICAgICBdLAogfQogCkBAIC0yOTYsOCArMzYyLDkgQEAKICAgICAgICAgImxpYmRlYnVnZ2VyZC90ZXN0L2R1bXBfbWVtb3J5X3Rlc3QuY3BwIiwKICAgICAgICAgImxpYmRlYnVnZ2VyZC90ZXN0L2VsZl9mYWtlLmNwcCIsCiAgICAgICAgICJsaWJkZWJ1Z2dlcmQvdGVzdC9sb2dfZmFrZS5jcHAiLAorICAgICAgICAibGliZGVidWdnZXJkL3Rlc3QvbXRlX3N0YWNrX3JlY29yZF90ZXN0LmNwcCIsCiAgICAgICAgICJsaWJkZWJ1Z2dlcmQvdGVzdC9vcGVuX2ZpbGVzX2xpc3RfdGVzdC5jcHAiLAotICAgICAgICAibGliZGVidWdnZXJkL3Rlc3QvdXRpbGl0eV90ZXN0LmNwcCIsCisgICAgICAgICJsaWJkZWJ1Z2dlcmQvdGVzdC90b21ic3RvbmVfcHJvdG9fdG9fdGV4dF90ZXN0LmNwcCIsCiAgICAgXSwKIAogICAgIHRhcmdldDogewpAQCAtMzEzLDYgKzM4MCwxMCBAQAogICAgICAgICB9LAogICAgIH0sCiAKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtZW10YWdfaGVhcDogdHJ1ZSwKKyAgICB9LAorCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliY3V0aWxzIiwKQEAgLTM4NSw2ICs0NTYsNyBAQAogCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImJpb25pY19saWJjX3BsYXRmb3JtX2hlYWRlcnMiLAorICAgICAgICAibGlibmF0aXZlX2JyaWRnZV9zdXBwb3J0X2FjY2Vzc29yX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwpAQCAtMzk0LDYgKzQ2Niw4IEBACiAKICAgICAgICAgImxpYnRvbWJzdG9uZV9wcm90byIsCiAgICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCisKKyAgICAgICAgImxpYm5hdGl2ZV9icmlkZ2VfZ3Vlc3Rfc3RhdGVfYWNjZXNzb3IiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwpAQCAtNDA5LDYgKzQ4MywxNSBAQAogCiAgICAgLy8gUmVxdWlyZWQgZm9yIHRlc3RzLgogICAgIHJlcXVpcmVkOiBbImNyYXNoX2R1bXAucG9saWN5Il0sCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgYW5kcm9pZDogeworICAgICAgICAgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgICAgICAgICAibGlibmF0aXZlX2JyaWRnZV9zdXBwb3J0X2FjY2Vzc29yX2hlYWRlcnMiLCAvLyBGb3IgZGxleHRfbmFtZXNwYWNlcy5oCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgc2hhcmVkX2xpYnM6IFsibGliZGxfYW5kcm9pZCJdLCAvLyBGb3IgYW5kcm9pZF9nZXRfZXhwb3J0ZWRfbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCisgICAgICAgIH0sCisgICAgfSwKIH0KIAogY2NfYmluYXJ5IHsKQEAgLTQzOSw3ICs1MjIsNyBAQAogCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImJpb25pY19saWJjX3BsYXRmb3JtX2hlYWRlcnMiLAotICAgICAgICAibGliZGVidWdnZXJkX2NvbW1vbl9oZWFkZXJzIgorICAgICAgICAibGliZGVidWdnZXJkX2NvbW1vbl9oZWFkZXJzIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKQEAgLTQ5Nyw3ICs1ODAsNiBAQAogICAgIH0sCiB9CiAKLQogLy8gVGhpcyBpbnN0YWxscyB0aGUgIm90aGVyIiBhcmNoaXRlY3R1cmUgKHNvIDMyLWJpdCBvbiA2NC1iaXQgZGV2aWNlKS4KIHByZWJ1aWx0X2V0YyB7CiAgICAgbmFtZTogImNyYXNoX2R1bXAucG9saWN5X290aGVyIiwKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9URVNUX01BUFBJTkcgYi9kZWJ1Z2dlcmQvVEVTVF9NQVBQSU5HCmluZGV4IDg2MzNjYjguLjgyNGQyMGEgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC9URVNUX01BUFBJTkcKKysrIGIvZGVidWdnZXJkL1RFU1RfTUFQUElORwpAQCAtNCw2ICs0LDEwIEBACiAgICAgICAibmFtZSI6ICJkZWJ1Z2dlcmRfdGVzdCIKICAgICB9LAogICAgIHsKKyAgICAgICJuYW1lIjogImRlYnVnZ2VyZF90ZXN0IiwKKyAgICAgICJrZXl3b3JkcyI6IFsicHJpbWFyeS1kZXZpY2UiXQorICAgIH0sCisgICAgewogICAgICAgIm5hbWUiOiAibGlidG9tYnN0b25lZF9jbGllbnRfcnVzdF90ZXN0IgogICAgIH0sCiAgICAgewpAQCAtMTQsNSArMTgsMTAgQEAKICAgICB7CiAgICAgICAibmFtZSI6ICJkZWJ1Z2dlcmRfdGVzdCIKICAgICB9CisgIF0sCisgICJwb3N0c3VibWl0IjogWworICAgIHsKKyAgICAgICJuYW1lIjogIkN0c0NyYXNoRGV0YWlsSG9zdFRlc3RDYXNlcyIKKyAgICB9CiAgIF0KIH0KZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9jbGllbnQvZGVidWdnZXJkX2NsaWVudC5jcHAgYi9kZWJ1Z2dlcmQvY2xpZW50L2RlYnVnZ2VyZF9jbGllbnQuY3BwCmluZGV4IGM5ZTA5N2UuLjYzMmY2ZjEgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC9jbGllbnQvZGVidWdnZXJkX2NsaWVudC5jcHAKKysrIGIvZGVidWdnZXJkL2NsaWVudC9kZWJ1Z2dlcmRfY2xpZW50LmNwcApAQCAtMTE2LDcgKzExNiw2IEBACiAKIGJvb2wgZGVidWdnZXJkX3RyaWdnZXJfZHVtcChwaWRfdCB0aWQsIERlYnVnZ2VyZER1bXBUeXBlIGR1bXBfdHlwZSwgdW5zaWduZWQgaW50IHRpbWVvdXRfbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlX2ZkIG91dHB1dF9mZCkgewotICBwaWRfdCBwaWQgPSB0aWQ7CiAgIGlmIChkdW1wX3R5cGUgPT0ga0RlYnVnZ2VyZEphdmFCYWNrdHJhY2UpIHsKICAgICAvLyBKYXZhIGR1bXBzIGFsd2F5cyBnZXQgc2VudCB0byB0aGUgdGdpZCwgc28gd2UgbmVlZCB0byByZXNvbHZlIG91ciB0aWQgdG8gYSB0Z2lkLgogICAgIGFuZHJvaWQ6OnByb2NpbmZvOjpQcm9jZXNzSW5mbyBwcm9jaW5mbzsKQEAgLTEyNSwxMCArMTI0LDEwIEBACiAgICAgICBsb2dfZXJyb3Iob3V0cHV0X2ZkLCAwLCAiZmFpbGVkIHRvIGdldCBwcm9jZXNzIGluZm86ICVzIiwgZXJyb3IuY19zdHIoKSk7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIHBpZCA9IHByb2NpbmZvLnBpZDsKKyAgICB0aWQgPSBwcm9jaW5mby5waWQ7CiAgIH0KIAotICBMT0coSU5GTykgPDwgVEFHICJzdGFydGVkIGR1bXBpbmcgcHJvY2VzcyAiIDw8IHBpZDsKKyAgTE9HKElORk8pIDw8IFRBRyAic3RhcnRlZCBkdW1waW5nIHByb2Nlc3MgIiA8PCB0aWQ7CiAKICAgLy8gUmF0aGVyIHRoYW4gdHJ5IHRvIGRlYWwgd2l0aCBwb2xsKCkgYWxsIHRoZSB3YXkgdGhyb3VnaCB0aGUgZmxvdywgd2UgdXBkYXRlCiAgIC8vIHRoZSBzb2NrZXQgdGltZW91dCBiZXR3ZWVuIGVhY2ggc3RlcCAoYW5kIG9ubHkgdXNlIHBvbGwoKSBkdXJpbmcgdGhlIGZpbmFsCkBAIC0xMzksNyArMTM4LDcgQEAKIAogICAgIGF1dG8gcmVtYWluaW5nID0gZW5kIC0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CiAgICAgaWYgKHJlbWFpbmluZyA8IGRlY2x0eXBlKHJlbWFpbmluZyk6Onplcm8oKSkgewotICAgICAgbG9nX2Vycm9yKG91dHB1dF9mZCwgMCwgInRpbWVvdXQgZXhwaXJlZCIpOworICAgICAgbG9nX2Vycm9yKG91dHB1dF9mZCwgMCwgInRpbWVvdXQgZXhwaXJlZCAodXBkYXRlX3RpbWVvdXQpIik7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkBAIC0xNzIsNyArMTcxLDcgQEAKIAogICBJbnRlcmNlcHRSZXF1ZXN0IHJlcSA9IHsKICAgICAgIC5kdW1wX3R5cGUgPSBkdW1wX3R5cGUsCi0gICAgICAucGlkID0gcGlkLAorICAgICAgLnBpZCA9IHRpZCwKICAgfTsKIAogICAvLyBDcmVhdGUgYW4gaW50ZXJtZWRpYXRlIHBpcGUgdG8gcGFzcyB0byB0aGUgb3RoZXIgZW5kLgpAQCAtMjM1LDggKzIzNCw4IEBACiAgIC8vIFNlbmQgdGhlIHNpZ25hbC4KICAgY29uc3QgaW50IHNpZ25hbCA9IChkdW1wX3R5cGUgPT0ga0RlYnVnZ2VyZEphdmFCYWNrdHJhY2UpID8gU0lHUVVJVCA6IEJJT05JQ19TSUdOQUxfREVCVUdHRVI7CiAgIHNpZ3ZhbCB2YWwgPSB7LnNpdmFsX2ludCA9IChkdW1wX3R5cGUgPT0ga0RlYnVnZ2VyZE5hdGl2ZUJhY2t0cmFjZSkgPyAxIDogMH07Ci0gIGlmIChzaWdxdWV1ZShwaWQsIHNpZ25hbCwgdmFsKSAhPSAwKSB7Ci0gICAgbG9nX2Vycm9yKG91dHB1dF9mZCwgZXJybm8sICJmYWlsZWQgdG8gc2VuZCBzaWduYWwgdG8gcGlkICVkIiwgcGlkKTsKKyAgaWYgKHNpZ3F1ZXVlKHRpZCwgc2lnbmFsLCB2YWwpICE9IDApIHsKKyAgICBsb2dfZXJyb3Iob3V0cHV0X2ZkLCBlcnJubywgImZhaWxlZCB0byBzZW5kIHNpZ25hbCB0byBwaWQgJWQiLCB0aWQpOwogICAgIHJldHVybiBmYWxzZTsKICAgfQogCkBAIC0yNTUsNyArMjU0LDcgQEAKICAgICBpZiAodGltZW91dF9tcyA8PSAwKSB7CiAgICAgICByZW1haW5pbmdfbXMgPSAtMTsKICAgICB9IGVsc2UgaWYgKHJlbWFpbmluZ19tcyA8IDApIHsKLSAgICAgIGxvZ19lcnJvcihvdXRwdXRfZmQsIDAsICJ0aW1lb3V0IGV4cGlyZWQiKTsKKyAgICAgIGxvZ19lcnJvcihvdXRwdXRfZmQsIDAsICJ0aW1lb3V0IGV4cGlyZWQgYmVmb3JlIHBvbGwiKTsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTI3MiwxMCArMjcxLDE3IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgIH0KICAgICB9IGVsc2UgaWYgKHJjID09IDApIHsKLSAgICAgIGxvZ19lcnJvcihvdXRwdXRfZmQsIDAsICJ0aW1lb3V0IGV4cGlyZWQiKTsKKyAgICAgIGxvZ19lcnJvcihvdXRwdXRfZmQsIDAsICJwb2xsIHRpbWVvdXQgZXhwaXJlZCIpOwogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIC8vIFdBUk5JTkc6IEl0J3Mgbm90IHBvc3NpYmxlIHRvIHJlcGxhY2UgdGhlIGJlbG93IHdpdGggYSBzcGxpY2UgY2FsbC4KKyAgICAvLyBEdWUgdG8gdGhlIHdheSBkZWJ1Z2dlcmQgZG9lcyBtYW55IHNtYWxsIHdyaXRlcyBhY3Jvc3MgdGhlIHBpcGUsCisgICAgLy8gdGhpcyB3b3VsZCBjYXVzZSBzcGxpY2UgdG8gY29weSBhIHBhZ2UgZm9yIGVhY2ggd3JpdGUuIFRoZSBzZWNvbmQKKyAgICAvLyBwaXBlIGZpbGxzIHVwIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgcGFnZXMgYmVpbmcgY29waWVkLCBldmVuCisgICAgLy8gdGhvdWdoIHRoZXJlIGlzIG5vdCBtdWNoIGRhdGEgYmVpbmcgdHJhbnNmZXJyZWQgcGVyIHBhZ2UuIFdoZW4KKyAgICAvLyB0aGUgc2Vjb25kIHBpcGUgaXMgZnVsbCwgZXZlcnl0aGluZyBzdG9wcyBzaW5jZSB0aGVyZSBpcyBub3RoaW5nCisgICAgLy8gcmVhZGluZyB0aGUgc2Vjb25kIHBpcGUgdG8gY2xlYXIgaXQuCiAgICAgY2hhciBidWZbMTAyNF07CiAgICAgcmMgPSBURU1QX0ZBSUxVUkVfUkVUUlkocmVhZChwaXBlX3JlYWQuZ2V0KCksIGJ1Ziwgc2l6ZW9mKGJ1ZikpKTsKICAgICBpZiAocmMgPT0gMCkgewpAQCAtMjkyLDcgKzI5OCw3IEBACiAgICAgfQogICB9CiAKLSAgTE9HKElORk8pIDw8IFRBRyAiZG9uZSBkdW1waW5nIHByb2Nlc3MgIiA8PCBwaWQ7CisgIExPRyhJTkZPKSA8PCBUQUcgImRvbmUgZHVtcGluZyBwcm9jZXNzICIgPDwgdGlkOwogCiAgIHJldHVybiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL2NsaWVudC9kZWJ1Z2dlcmRfY2xpZW50X3Rlc3QuY3BwIGIvZGVidWdnZXJkL2NsaWVudC9kZWJ1Z2dlcmRfY2xpZW50X3Rlc3QuY3BwCmluZGV4IGViYjhkODYuLjMzZmYwNWYgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC9jbGllbnQvZGVidWdnZXJkX2NsaWVudF90ZXN0LmNwcAorKysgYi9kZWJ1Z2dlcmQvY2xpZW50L2RlYnVnZ2VyZF9jbGllbnRfdGVzdC5jcHAKQEAgLTE4LDYgKzE4LDcgQEAKIAogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvZXZlbnRmZC5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8Y2hyb25vPgpAQCAtNTEsMjMgKzUyLDM1IEBACiAKIFRFU1QoZGVidWdnZXJkX2NsaWVudCwgcmFjZSkgewogICBzdGF0aWMgaW50IFRIUkVBRF9DT1VOVCA9IGdldFRocmVhZENvdW50KCk7CisKKyAgLy8gU2VtYXBob3JlIGluY3JlbWVudGVkIG9uY2UgcGVyIHRocmVhZCBzdGFydGVkLgorICB1bmlxdWVfZmQgYmFycmllcihldmVudGZkKDAsIEVGRF9TRU1BUEhPUkUpKTsKKyAgQVNTRVJUX05FKC0xLCBiYXJyaWVyLmdldCgpKTsKKwogICBwaWRfdCBmb3JrcGlkID0gZm9yaygpOwotCiAgIEFTU0VSVF9ORSgtMSwgZm9ya3BpZCk7Ci0KICAgaWYgKGZvcmtwaWQgPT0gMCkgewogICAgIC8vIFNwYXduIGEgYnVuY2ggb2YgdGhyZWFkcywgdG8gbWFrZSBjcmFzaF9kdW1wIHRha2UgbG9uZ2VyLgogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dGhyZWFkPiB0aHJlYWRzOworICAgIHRocmVhZHMucmVzZXJ2ZShUSFJFQURfQ09VTlQpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVEhSRUFEX0NPVU5UOyArK2kpIHsKLSAgICAgIHRocmVhZHMuZW1wbGFjZV9iYWNrKFtdKCkgewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2Zvcig2MHMpOworICAgICAgdGhyZWFkcy5lbXBsYWNlX2JhY2soWyZiYXJyaWVyXSgpIHsKKyAgICAgICAgdWludDY0X3QgY291bnQgPSAxOworICAgICAgICBBU1NFUlRfTkUoLTEsIHdyaXRlKGJhcnJpZXIuZ2V0KCksICZjb3VudCwgc2l6ZW9mKGNvdW50KSkpOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgcGF1c2UoKTsKICAgICAgICAgfQogICAgICAgfSk7CiAgICAgfQorICAgIGZvciAoOzspIHsKKyAgICAgIHBhdXNlKCk7CisgICAgfQorICB9CiAKLSAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoNjBzKTsKLSAgICBleGl0KDApOworICAvLyBXYWl0IGZvciB0aGUgY2hpbGQgdG8gc3Bhd24gYWxsIG9mIGl0cyB0aHJlYWRzLgorICBmb3IgKGludCBpID0gMDsgaSA8IFRIUkVBRF9DT1VOVDsgKytpKSB7CisgICAgdWludDY0X3QgY291bnQ7CisgICAgQVNTRVJUX05FKC0xLCByZWFkKGJhcnJpZXIuZ2V0KCksICZjb3VudCwgc2l6ZW9mKGNvdW50KSkpOwogICB9CiAKICAgdW5pcXVlX2ZkIHBpcGVfcmVhZCwgcGlwZV93cml0ZTsKQEAgLTc3LDkgKzkwLDYgQEAKICAgY29uc3RleHByIGludCBQSVBFX1NJWkUgPSAxNiAqIDEwMjQgKiAxMDI0OwogICBBU1NFUlRfRVEoUElQRV9TSVpFLCBmY250bChwaXBlX3JlYWQuZ2V0KCksIEZfU0VUUElQRV9TWiwgUElQRV9TSVpFKSk7CiAKLSAgLy8gV2FpdCBmb3IgYSBiaXQgdG8gbGV0IHRoZSBjaGlsZCBzcGF3biBhbGwgb2YgaXRzIHRocmVhZHMuCi0gIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2Zvcigxcyk7Ci0KICAgQVNTRVJUX1RSVUUoCiAgICAgICBkZWJ1Z2dlcmRfdHJpZ2dlcl9kdW1wKGZvcmtwaWQsIGtEZWJ1Z2dlcmROYXRpdmVCYWNrdHJhY2UsIDYwMDAwLCBzdGQ6Om1vdmUocGlwZV93cml0ZSkpKTsKICAgLy8gSW1tZWRpYXRlbHkga2lsbCB0aGUgZm9ya2VkIGNoaWxkLCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZHVtcCBkaWRuJ3QgcmV0dXJuIGVhcmx5LgpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL2NvbW1vbi9pbmNsdWRlL2R1bXBfdHlwZS5oIGIvZGVidWdnZXJkL2NvbW1vbi9pbmNsdWRlL2R1bXBfdHlwZS5oCmluZGV4IGEzZTE3MWIuLjgyZWY3YjYgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC9jb21tb24vaW5jbHVkZS9kdW1wX3R5cGUuaAorKysgYi9kZWJ1Z2dlcmQvY29tbW9uL2luY2x1ZGUvZHVtcF90eXBlLmgKQEAgLTI4LDI2ICsyOCwyNCBAQAogICBrRGVidWdnZXJkVG9tYnN0b25lUHJvdG8sCiB9OwogCi1pbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgc3RyZWFtLCBjb25zdCBEZWJ1Z2dlcmREdW1wVHlwZSYgcmhzKSB7Ci0gIHN3aXRjaCAocmhzKSB7CitpbmxpbmUgY29uc3QgY2hhciogZ2V0X2R1bXBfdHlwZV9uYW1lKGNvbnN0IERlYnVnZ2VyZER1bXBUeXBlJiBkdW1wX3R5cGUpIHsKKyAgc3dpdGNoIChkdW1wX3R5cGUpIHsKICAgICBjYXNlIGtEZWJ1Z2dlcmROYXRpdmVCYWNrdHJhY2U6Ci0gICAgICBzdHJlYW0gPDwgImtEZWJ1Z2dlcmROYXRpdmVCYWNrdHJhY2UiOwotICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gImtEZWJ1Z2dlcmROYXRpdmVCYWNrdHJhY2UiOwogICAgIGNhc2Uga0RlYnVnZ2VyZFRvbWJzdG9uZToKLSAgICAgIHN0cmVhbSA8PCAia0RlYnVnZ2VyZFRvbWJzdG9uZSI7Ci0gICAgICBicmVhazsKKyAgICAgIHJldHVybiAia0RlYnVnZ2VyZFRvbWJzdG9uZSI7CiAgICAgY2FzZSBrRGVidWdnZXJkSmF2YUJhY2t0cmFjZToKLSAgICAgIHN0cmVhbSA8PCAia0RlYnVnZ2VyZEphdmFCYWNrdHJhY2UiOwotICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gImtEZWJ1Z2dlcmRKYXZhQmFja3RyYWNlIjsKICAgICBjYXNlIGtEZWJ1Z2dlcmRBbnlJbnRlcmNlcHQ6Ci0gICAgICBzdHJlYW0gPDwgImtEZWJ1Z2dlcmRBbnlJbnRlcmNlcHQiOwotICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gImtEZWJ1Z2dlcmRBbnlJbnRlcmNlcHQiOwogICAgIGNhc2Uga0RlYnVnZ2VyZFRvbWJzdG9uZVByb3RvOgotICAgICAgc3RyZWFtIDw8ICJrRGVidWdnZXJkVG9tYnN0b25lUHJvdG8iOwotICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gImtEZWJ1Z2dlcmRUb21ic3RvbmVQcm90byI7CiAgICAgZGVmYXVsdDoKLSAgICAgIHN0cmVhbSA8PCAiW3Vua25vd25dIjsKKyAgICAgIHJldHVybiAiW3Vua25vd25dIjsKICAgfQorfQogCitpbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgc3RyZWFtLCBjb25zdCBEZWJ1Z2dlcmREdW1wVHlwZSYgcmhzKSB7CisgIHN0cmVhbSA8PCBnZXRfZHVtcF90eXBlX25hbWUocmhzKTsKICAgcmV0dXJuIHN0cmVhbTsKIH0KZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9jcmFzaF9kdW1wLmNwcCBiL2RlYnVnZ2VyZC9jcmFzaF9kdW1wLmNwcAppbmRleCAzNTYzNDM2Li4xNWU4MzE5IDEwMDY0NAotLS0gYS9kZWJ1Z2dlcmQvY3Jhc2hfZHVtcC5jcHAKKysrIGIvZGVidWdnZXJkL2NyYXNoX2R1bXAuY3BwCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8c3lzL3dhaXQuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAorI2luY2x1ZGUgPGNzdGRpbnQ+CiAjaW5jbHVkZSA8bGltaXRzPgogI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDxtZW1vcnk+CkBAIC00Miw2ICs0Myw3IEBACiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgogI2luY2x1ZGUgPGJpb25pYy9tYWNyb3MuaD4KICNpbmNsdWRlIDxiaW9uaWMvcmVzZXJ2ZWRfc2lnbmFscy5oPgorI2luY2x1ZGUgPGJpb25pYy90bHNfZGVmaW5lcy5oPgogI2luY2x1ZGUgPGN1dGlscy9zb2NrZXRzLmg+CiAjaW5jbHVkZSA8bG9nL2xvZy5oPgogI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgpAQCAtNTIsNyArNTQsMTggQEAKIAogI2luY2x1ZGUgPHVud2luZHN0YWNrL0FuZHJvaWRVbndpbmRlci5oPgogI2luY2x1ZGUgPHVud2luZHN0YWNrL0Vycm9yLmg+CisjaW5jbHVkZSA8dW53aW5kc3RhY2svTWFjaGluZUFybS5oPgorI2luY2x1ZGUgPHVud2luZHN0YWNrL01hY2hpbmVBcm02NC5oPgorI2luY2x1ZGUgPHVud2luZHN0YWNrL01hY2hpbmVSaXNjdjY0Lmg+CiAjaW5jbHVkZSA8dW53aW5kc3RhY2svUmVncy5oPgorI2luY2x1ZGUgPHVud2luZHN0YWNrL1JlZ3NBcm0uaD4KKyNpbmNsdWRlIDx1bndpbmRzdGFjay9SZWdzQXJtNjQuaD4KKyNpbmNsdWRlIDx1bndpbmRzdGFjay9SZWdzUmlzY3Y2NC5oPgorI2luY2x1ZGUgPHVud2luZHN0YWNrL1VzZXJBcm0uaD4KKyNpbmNsdWRlIDx1bndpbmRzdGFjay9Vc2VyQXJtNjQuaD4KKyNpbmNsdWRlIDx1bndpbmRzdGFjay9Vc2VyUmlzY3Y2NC5oPgorCisjaW5jbHVkZSA8bmF0aXZlX2JyaWRnZV9zdXBwb3J0L2d1ZXN0X3N0YXRlX2FjY2Vzc29yL2FjY2Vzc29yLmg+CiAKICNpbmNsdWRlICJsaWJkZWJ1Z2dlcmQvYmFja3RyYWNlLmgiCiAjaW5jbHVkZSAibGliZGVidWdnZXJkL3RvbWJzdG9uZS5oIgpAQCAtNjgsNiArODEsMTAgQEAKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZDsKIAorLy8gVGhpcyBzdG9yZXMgZ3Vlc3QgYXJjaGl0ZWN0dXJlLiBXaGVuIHRoZSBhcmNoaXRlY3R1cmUgaXMgc3VwcG9ydGVkLCB0b21ic3RvbmUgZmlsZSB3aWxsIG91dHB1dAorLy8gZ3Vlc3Qgc3RhdGUgaW5mb3JtYXRpb24uCitzdGF0aWMgQXJjaGl0ZWN0dXJlIGdfZ3Vlc3RfYXJjaCA9IEFyY2hpdGVjdHVyZTo6Tk9ORTsKKwogc3RhdGljIGJvb2wgcGlkX2NvbnRhaW5zX3RpZChpbnQgcGlkX3Byb2NfZmQsIHBpZF90IHRpZCkgewogICBzdHJ1Y3Qgc3RhdCBzdDsKICAgc3RkOjpzdHJpbmcgdGFza19wYXRoID0gU3RyaW5nUHJpbnRmKCJ0YXNrLyVkIiwgdGlkKTsKQEAgLTE0Myw3ICsxNjAsNyBAQAogfQogCiBzdGF0aWMgYm9vbCBhY3Rpdml0eV9tYW5hZ2VyX25vdGlmeShwaWRfdCBwaWQsIGludCBzaWduYWwsIGNvbnN0IHN0ZDo6c3RyaW5nJiBhbWZkX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlY292ZXJhYmxlX2d3cF9hc2FuX2NyYXNoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlY292ZXJhYmxlX2NyYXNoKSB7CiAgIEFUUkFDRV9DQUxMKCk7CiAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBhbWZkKHNvY2tldF9sb2NhbF9jbGllbnQoCiAgICAgICAiL2RhdGEvc3lzdGVtL25kZWJ1Z3NvY2tldCIsIEFORFJPSURfU09DS0VUX05BTUVTUEFDRV9GSUxFU1lTVEVNLCBTT0NLX1NUUkVBTSkpOwpAQCAtMTY5LDcgKzE4Niw3IEBACiAgIC8vIEFjdGl2aXR5IE1hbmFnZXIgcHJvdG9jb2w6CiAgIC8vICAtIDMyLWJpdCBuZXR3b3JrLWJ5dGUtb3JkZXI6IHBpZAogICAvLyAgLSAzMi1iaXQgbmV0d29yay1ieXRlLW9yZGVyOiBzaWduYWwgbnVtYmVyCi0gIC8vICAtIGJ5dGU6IHJlY292ZXJhYmxlX2d3cF9hc2FuX2NyYXNoCisgIC8vICAtIGJ5dGU6IHJlY292ZXJhYmxlX2NyYXNoCiAgIC8vICAtIGJ5dGVzOiByYXcgdGV4dCBvZiB0aGUgZHVtcAogICAvLyAgLSBudWxsIHRlcm1pbmF0b3IKIApAQCAtMTg1LDEwICsyMDIsOSBAQAogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIHVpbnQ4X3QgcmVjb3ZlcmFibGVfZ3dwX2FzYW5fY3Jhc2hfYnl0ZSA9IHJlY292ZXJhYmxlX2d3cF9hc2FuX2NyYXNoID8gMSA6IDA7Ci0gIGlmICghYW5kcm9pZDo6YmFzZTo6V3JpdGVGdWxseShhbWZkLCAmcmVjb3ZlcmFibGVfZ3dwX2FzYW5fY3Jhc2hfYnl0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihyZWNvdmVyYWJsZV9nd3BfYXNhbl9jcmFzaF9ieXRlKSkpIHsKLSAgICBQTE9HKEVSUk9SKSA8PCAiQU0gcmVjb3ZlcmFibGVfZ3dwX2FzYW5fY3Jhc2hfYnl0ZSB3cml0ZSBmYWlsZWQiOworICB1aW50OF90IHJlY292ZXJhYmxlX2NyYXNoX2J5dGUgPSByZWNvdmVyYWJsZV9jcmFzaCA/IDEgOiAwOworICBpZiAoIWFuZHJvaWQ6OmJhc2U6OldyaXRlRnVsbHkoYW1mZCwgJnJlY292ZXJhYmxlX2NyYXNoX2J5dGUsIHNpemVvZihyZWNvdmVyYWJsZV9jcmFzaF9ieXRlKSkpIHsKKyAgICBQTE9HKEVSUk9SKSA8PCAiQU0gcmVjb3ZlcmFibGVfY3Jhc2hfYnl0ZSB3cml0ZSBmYWlsZWQiOwogICAgIHJldHVybiBmYWxzZTsKICAgfQogCkBAIC0yODAsMzUgKzI5NiwzNCBAQAogCiBzdGF0aWMgdm9pZCBSZWFkQ3Jhc2hJbmZvKHVuaXF1ZV9mZCYgZmQsIHNpZ2luZm9fdCogc2lnaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHVud2luZHN0YWNrOjpSZWdzPiogcmVncywgUHJvY2Vzc0luZm8qIHByb2Nlc3NfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcmVjb3ZlcmFibGVfZ3dwX2FzYW5fY3Jhc2gpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcmVjb3ZlcmFibGVfY3Jhc2gpIHsKICAgc3RkOjphbGlnbmVkX3N0b3JhZ2U8c2l6ZW9mKENyYXNoSW5mbykgKyAxLCBhbGlnbm9mKENyYXNoSW5mbyk+Ojp0eXBlIGJ1ZjsKICAgQ3Jhc2hJbmZvKiBjcmFzaF9pbmZvID0gcmVpbnRlcnByZXRfY2FzdDxDcmFzaEluZm8qPigmYnVmKTsKICAgc3NpemVfdCByYyA9IFRFTVBfRkFJTFVSRV9SRVRSWShyZWFkKGZkLmdldCgpLCAmYnVmLCBzaXplb2YoYnVmKSkpOwotICAqcmVjb3ZlcmFibGVfZ3dwX2FzYW5fY3Jhc2ggPSBmYWxzZTsKKyAgKnJlY292ZXJhYmxlX2NyYXNoID0gZmFsc2U7CiAgIGlmIChyYyA9PSAtMSkgewogICAgIFBMT0coRkFUQUwpIDw8ICJmYWlsZWQgdG8gcmVhZCB0YXJnZXQgdWNvbnRleHQiOwotICB9IGVsc2UgewotICAgIHNzaXplX3QgZXhwZWN0ZWRfc2l6ZSA9IDA7Ci0gICAgc3dpdGNoIChjcmFzaF9pbmZvLT5oZWFkZXIudmVyc2lvbikgewotICAgICAgY2FzZSAxOgotICAgICAgY2FzZSAyOgotICAgICAgY2FzZSAzOgotICAgICAgICBleHBlY3RlZF9zaXplID0gc2l6ZW9mKENyYXNoSW5mb0hlYWRlcikgKyBzaXplb2YoQ3Jhc2hJbmZvRGF0YVN0YXRpYyk7Ci0gICAgICAgIGJyZWFrOworICB9CisgIHNzaXplX3QgZXhwZWN0ZWRfc2l6ZSA9IDA7CisgIHN3aXRjaCAoY3Jhc2hfaW5mby0+aGVhZGVyLnZlcnNpb24pIHsKKyAgICBjYXNlIDE6CisgICAgY2FzZSAyOgorICAgIGNhc2UgMzoKKyAgICAgIGV4cGVjdGVkX3NpemUgPSBzaXplb2YoQ3Jhc2hJbmZvSGVhZGVyKSArIHNpemVvZihDcmFzaEluZm9EYXRhU3RhdGljKTsKKyAgICAgIGJyZWFrOwogCi0gICAgICBjYXNlIDQ6Ci0gICAgICAgIGV4cGVjdGVkX3NpemUgPSBzaXplb2YoQ3Jhc2hJbmZvSGVhZGVyKSArIHNpemVvZihDcmFzaEluZm9EYXRhRHluYW1pYyk7Ci0gICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIGV4cGVjdGVkX3NpemUgPSBzaXplb2YoQ3Jhc2hJbmZvSGVhZGVyKSArIHNpemVvZihDcmFzaEluZm9EYXRhRHluYW1pYyk7CisgICAgICBicmVhazsKIAotICAgICAgZGVmYXVsdDoKLSAgICAgICAgTE9HKEZBVEFMKSA8PCAidW5leHBlY3RlZCBDcmFzaEluZm8gdmVyc2lvbjogIiA8PCBjcmFzaF9pbmZvLT5oZWFkZXIudmVyc2lvbjsKLSAgICAgICAgYnJlYWs7Ci0gICAgfTsKKyAgICBkZWZhdWx0OgorICAgICAgTE9HKEZBVEFMKSA8PCAidW5leHBlY3RlZCBDcmFzaEluZm8gdmVyc2lvbjogIiA8PCBjcmFzaF9pbmZvLT5oZWFkZXIudmVyc2lvbjsKKyAgICAgIGJyZWFrOworICB9CiAKLSAgICBpZiAocmMgPCBleHBlY3RlZF9zaXplKSB7Ci0gICAgICBMT0coRkFUQUwpIDw8ICJyZWFkICIgPDwgcmMgPDwgIiBieXRlcyB3aGVuIHJlYWRpbmcgdGFyZ2V0IGNyYXNoIGluZm9ybWF0aW9uLCBleHBlY3RlZCAiCi0gICAgICAgICAgICAgICAgIDw8IGV4cGVjdGVkX3NpemU7Ci0gICAgfQorICBpZiAocmMgPCBleHBlY3RlZF9zaXplKSB7CisgICAgTE9HKEZBVEFMKSA8PCAicmVhZCAiIDw8IHJjIDw8ICIgYnl0ZXMgd2hlbiByZWFkaW5nIHRhcmdldCBjcmFzaCBpbmZvcm1hdGlvbiwgZXhwZWN0ZWQgIgorICAgICAgICAgICAgICAgIDw8IGV4cGVjdGVkX3NpemU7CiAgIH0KIAogICBzd2l0Y2ggKGNyYXNoX2luZm8tPmhlYWRlci52ZXJzaW9uKSB7CkBAIC0zMTcsMTAgKzMzMiwxMiBAQAogICAgICAgcHJvY2Vzc19pbmZvLT5nd3BfYXNhbl9zdGF0ZSA9IGNyYXNoX2luZm8tPmRhdGEuZC5nd3BfYXNhbl9zdGF0ZTsKICAgICAgIHByb2Nlc3NfaW5mby0+Z3dwX2FzYW5fbWV0YWRhdGEgPSBjcmFzaF9pbmZvLT5kYXRhLmQuZ3dwX2FzYW5fbWV0YWRhdGE7CiAgICAgICBwcm9jZXNzX2luZm8tPnNjdWRvX3N0YWNrX2RlcG90ID0gY3Jhc2hfaW5mby0+ZGF0YS5kLnNjdWRvX3N0YWNrX2RlcG90OworICAgICAgcHJvY2Vzc19pbmZvLT5zY3Vkb19zdGFja19kZXBvdF9zaXplID0gY3Jhc2hfaW5mby0+ZGF0YS5kLnNjdWRvX3N0YWNrX2RlcG90X3NpemU7CiAgICAgICBwcm9jZXNzX2luZm8tPnNjdWRvX3JlZ2lvbl9pbmZvID0gY3Jhc2hfaW5mby0+ZGF0YS5kLnNjdWRvX3JlZ2lvbl9pbmZvOwogICAgICAgcHJvY2Vzc19pbmZvLT5zY3Vkb19yaW5nX2J1ZmZlciA9IGNyYXNoX2luZm8tPmRhdGEuZC5zY3Vkb19yaW5nX2J1ZmZlcjsKICAgICAgIHByb2Nlc3NfaW5mby0+c2N1ZG9fcmluZ19idWZmZXJfc2l6ZSA9IGNyYXNoX2luZm8tPmRhdGEuZC5zY3Vkb19yaW5nX2J1ZmZlcl9zaXplOwotICAgICAgKnJlY292ZXJhYmxlX2d3cF9hc2FuX2NyYXNoID0gY3Jhc2hfaW5mby0+ZGF0YS5kLnJlY292ZXJhYmxlX2d3cF9hc2FuX2NyYXNoOworICAgICAgKnJlY292ZXJhYmxlX2NyYXNoID0gY3Jhc2hfaW5mby0+ZGF0YS5kLnJlY292ZXJhYmxlX2NyYXNoOworICAgICAgcHJvY2Vzc19pbmZvLT5jcmFzaF9kZXRhaWxfcGFnZSA9IGNyYXNoX2luZm8tPmRhdGEuZC5jcmFzaF9kZXRhaWxfcGFnZTsKICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgIGNhc2UgMToKICAgICBjYXNlIDI6CkBAIC00MDIsNiArNDE5LDExNCBAQAogICBzaWdhY3Rpb24oU0lHUElQRSwgJmFjdGlvbiwgbnVsbHB0cik7CiB9CiAKK3N0YXRpYyBib29sIFB0cmFjZVBlZWsoaW50IHJlcXVlc3QsIHBpZF90IHRpZCwgdWludHB0cl90IGFkZHIsIHZvaWQqIGRhdGEsIHN0ZDo6c3RyaW5nX3ZpZXcgZXJyX21zZywKKyAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90KiByZXN1bHQpIHsKKyAgZXJybm8gPSAwOworICAqcmVzdWx0ID0gcHRyYWNlKHJlcXVlc3QsIHRpZCwgYWRkciwgZGF0YSk7CisgIGlmIChlcnJubyAhPSAwKSB7CisgICAgUExPRyhFUlJPUikgPDwgZXJyX21zZzsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIEdldEd1ZXN0UmVnaXN0ZXJzRnJvbUNyYXNoZWRQcm9jZXNzKFtbbWF5YmVfdW51c2VkXV0gcGlkX3QgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmF0aXZlQnJpZGdlR3Vlc3RSZWdzKiBndWVzdF9yZWdzKSB7CisgIGF1dG8gcHJvY2Vzc19tZW1vcnkgPSB1bndpbmRzdGFjazo6TWVtb3J5OjpDcmVhdGVQcm9jZXNzTWVtb3J5Q2FjaGVkKHRpZCk7CisKKyAgdWludHB0cl90IGhlYWRlcl9wdHIgPSAwOworICB1aW50cHRyX3QgYmFzZSA9IDA7CisjaWYgZGVmaW5lZChfX3g4Nl82NF9fKQorICBpZiAoIVB0cmFjZVBlZWsoUFRSQUNFX1BFRUtVU0VSLCB0aWQsIG9mZnNldG9mKHVzZXJfcmVnc19zdHJ1Y3QsIGZzX2Jhc2UpLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byByZWFkIHRocmVhZCByZWdpc3RlciBmb3IgdGhyZWFkICIgKyBzdGQ6OnRvX3N0cmluZyh0aWQpLCAmYmFzZSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyNlbGlmIGRlZmluZWQoX19hYXJjaDY0X18pCisgIC8vIGJhc2UgaXMgaW1wbGljaXRseSBjYXN0ZWQgdG8gdWludDY0X3QuCisgIHN0cnVjdCBpb3ZlYyBwdF9pb3YgeworICAgIC5pb3ZfYmFzZSA9ICZiYXNlLCAuaW92X2xlbiA9IHNpemVvZihiYXNlKSwKKyAgfTsKKworICBpZiAocHRyYWNlKFBUUkFDRV9HRVRSRUdTRVQsIHRpZCwgTlRfQVJNX1RMUywgJnB0X2lvdikgIT0gMCkgeworICAgIFBMT0coRVJST1IpIDw8ICJmYWlsZWQgdG8gcmVhZCB0aHJlYWQgcmVnaXN0ZXIgZm9yIHRocmVhZCAiIDw8IHRpZDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyNlbGlmIGRlZmluZWQoX19yaXNjdikKKyAgc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QgcmVnczsKKyAgc3RydWN0IGlvdmVjIHB0X2lvdiA9IHsuaW92X2Jhc2UgPSAmcmVncywgLmlvdl9sZW4gPSBzaXplb2YocmVncyl9OworICBpZiAocHRyYWNlKFBUUkFDRV9HRVRSRUdTRVQsIHRpZCwgTlRfUFJTVEFUVVMsICZwdF9pb3YpICE9IDApIHsKKyAgICBQTE9HKEVSUk9SKSA8PCAiZmFpbGVkIHRvIHJlYWQgdGhyZWFkIHJlZ2lzdGVyIGZvciB0aHJlYWQgIiA8PCB0aWQ7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGJhc2UgPSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4ocmVncy50cCk7CisjZWxzZQorICAvLyBUT0RPKGIvMzM5Mjg3MjE5KTogQWRkIGNhc2UgZm9yIFJpc2N2IGhvc3QuCisgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorICBhdXRvIHB0cl90b19ndWVzdF9zbG90ID0gYmFzZSArIFRMU19TTE9UX05BVElWRV9CUklER0VfR1VFU1RfU1RBVEUgKiBzaXplb2YodWludHB0cl90KTsKKyAgaWYgKCFwcm9jZXNzX21lbW9yeS0+UmVhZEZ1bGx5KHB0cl90b19ndWVzdF9zbG90LCAmaGVhZGVyX3B0ciwgc2l6ZW9mKHVpbnRwdHJfdCkpKSB7CisgICAgUExPRyhFUlJPUikgPDwgImZhaWxlZCB0byBnZXQgZ3Vlc3Qgc3RhdGUgVExTIHNsb3QgY29udGVudCBmb3IgdGhyZWFkICIgPDwgdGlkOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIE5hdGl2ZUJyaWRnZUd1ZXN0U3RhdGVIZWFkZXIgaGVhZGVyOworICBpZiAoIXByb2Nlc3NfbWVtb3J5LT5SZWFkRnVsbHkoaGVhZGVyX3B0ciwgJmhlYWRlciwgc2l6ZW9mKE5hdGl2ZUJyaWRnZUd1ZXN0U3RhdGVIZWFkZXIpKSB8fAorICAgICAgaGVhZGVyLnNpZ25hdHVyZSAhPSBOQVRJVkVfQlJJREdFX0dVRVNUX1NUQVRFX1NJR05BVFVSRSkgeworICAgIC8vIFJldHVybiB3aGVuIHB0ciBwb2ludHMgdG8gdW5tYXBwZWQgbWVtb3J5IG9yIG5vIHZhbGlkIGd1ZXN0IHN0YXRlLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGF1dG8gZ3Vlc3Rfc3RhdGVfZGF0YV9jb3B5ID0gc3RkOjptYWtlX3VuaXF1ZTx1bnNpZ25lZCBjaGFyW10+KGhlYWRlci5ndWVzdF9zdGF0ZV9kYXRhX3NpemUpOworICBpZiAoIXByb2Nlc3NfbWVtb3J5LT5SZWFkRnVsbHkocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGhlYWRlci5ndWVzdF9zdGF0ZV9kYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1ZXN0X3N0YXRlX2RhdGFfY29weS5nZXQoKSwgaGVhZGVyLmd1ZXN0X3N0YXRlX2RhdGFfc2l6ZSkpIHsKKyAgICBQTE9HKEVSUk9SKSA8PCAiZmFpbGVkIHRvIHJlYWQgdGhlIGd1ZXN0IHN0YXRlIGRhdGEgZm9yIHRocmVhZCAiIDw8IHRpZDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBMb2FkR3Vlc3RTdGF0ZVJlZ2lzdGVycyhndWVzdF9zdGF0ZV9kYXRhX2NvcHkuZ2V0KCksIGhlYWRlci5ndWVzdF9zdGF0ZV9kYXRhX3NpemUsIGd1ZXN0X3JlZ3MpOworICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgUmVhZEd1ZXN0UmVnaXN0ZXJzKFtbbWF5YmVfdW51c2VkXV0gc3RkOjp1bmlxdWVfcHRyPHVud2luZHN0YWNrOjpSZWdzPiogcmVncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCB0aWQpIHsKKyAgLy8gVE9ETzogcmVtb3ZlIFtbbWF5YmVfdW51c2VkXV0sIHdoZW4gdGhlIEFSTTMyIGNhc2UgaXMgcmVtb3ZlZCBmcm9tIHRoZSBuYXRpdmUgYnJpZGdlIHN1cHBvcnQuCisgIE5hdGl2ZUJyaWRnZUd1ZXN0UmVncyBndWVzdF9yZWdzOworICBpZiAoIUdldEd1ZXN0UmVnaXN0ZXJzRnJvbUNyYXNoZWRQcm9jZXNzKHRpZCwgJmd1ZXN0X3JlZ3MpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgc3dpdGNoIChndWVzdF9yZWdzLmd1ZXN0X2FyY2gpIHsKKyNpZiBkZWZpbmVkKF9fTFA2NF9fKQorICAgIGNhc2UgTkFUSVZFX0JSSURHRV9BUkNIX0FSTTY0OiB7CisgICAgICB1bndpbmRzdGFjazo6YXJtNjRfdXNlcl9yZWdzIGFybTY0X3VzZXJfcmVncyA9IHt9OworICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB1bndpbmRzdGFjazo6QVJNNjRfUkVHX1IzMTsgaSsrKSB7CisgICAgICAgIGFybTY0X3VzZXJfcmVncy5yZWdzW2ldID0gZ3Vlc3RfcmVncy5yZWdzX2FybTY0LnhbaV07CisgICAgICB9CisgICAgICBhcm02NF91c2VyX3JlZ3Muc3AgPSBndWVzdF9yZWdzLnJlZ3NfYXJtNjQuc3A7CisgICAgICBhcm02NF91c2VyX3JlZ3MucGMgPSBndWVzdF9yZWdzLnJlZ3NfYXJtNjQuaXA7CisgICAgICByZWdzLT5yZXNldCh1bndpbmRzdGFjazo6UmVnc0FybTY0OjpSZWFkKCZhcm02NF91c2VyX3JlZ3MpKTsKKworICAgICAgZ19ndWVzdF9hcmNoID0gQXJjaGl0ZWN0dXJlOjpBUk02NDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIE5BVElWRV9CUklER0VfQVJDSF9SSVNDVjY0OiB7CisgICAgICB1bndpbmRzdGFjazo6cmlzY3Y2NF91c2VyX3JlZ3MgcmlzY3Y2NF91c2VyX3JlZ3MgPSB7fTsKKyAgICAgIC8vIFJJU0NWNjRfUkVHX1BDIGlzIGF0IHRoZSBmaXJzdCBwb3NpdGlvbi4KKyAgICAgIHJpc2N2NjRfdXNlcl9yZWdzLnJlZ3NbMF0gPSBndWVzdF9yZWdzLnJlZ3NfcmlzY3Y2NC5pcDsKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgdW53aW5kc3RhY2s6OlJJU0NWNjRfUkVHX1JFQUxfQ09VTlQ7IGkrKykgeworICAgICAgICByaXNjdjY0X3VzZXJfcmVncy5yZWdzW2ldID0gZ3Vlc3RfcmVncy5yZWdzX3Jpc2N2NjQueFtpXTsKKyAgICAgIH0KKyAgICAgIHJlZ3MtPnJlc2V0KHVud2luZHN0YWNrOjpSZWdzUmlzY3Y2NDo6UmVhZCgmcmlzY3Y2NF91c2VyX3JlZ3MsIHRpZCkpOworCisgICAgICBnX2d1ZXN0X2FyY2ggPSBBcmNoaXRlY3R1cmU6OlJJU0NWNjQ7CisgICAgICBicmVhazsKKyAgICB9CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKwogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CiAgIERlZnVzZVNpZ25hbEhhbmRsZXJzKCk7CiAgIEluc3RhbGxTaWdQaXBlSGFuZGxlcigpOwpAQCAtNDg1LDcgKzYxMCw3IEBACiAgIHN0ZDo6bWFwPHBpZF90LCBUaHJlYWRJbmZvPiB0aHJlYWRfaW5mbzsKICAgc2lnaW5mb190IHNpZ2luZm87CiAgIHN0ZDo6c3RyaW5nIGVycm9yOwotICBib29sIHJlY292ZXJhYmxlX2d3cF9hc2FuX2NyYXNoID0gZmFsc2U7CisgIGJvb2wgcmVjb3ZlcmFibGVfY3Jhc2ggPSBmYWxzZTsKIAogICB7CiAgICAgQVRSQUNFX05BTUUoInB0cmFjZSIpOwpAQCAtNTM1LDEwICs2NjAsMTggQEAKICAgICAgICAgaW5mby5wYWNfZW5hYmxlZF9rZXlzID0gLTE7CiAgICAgICB9CiAKKyNpZiBkZWZpbmVkKF9fYWFyY2g2NF9fKQorICAgICAgc3RydWN0IGlvdmVjIHRsc19pb3YgPSB7CisgICAgICAgICAgJmluZm8udGxzLAorICAgICAgICAgIHNpemVvZihpbmZvLnRscyksCisgICAgICB9OworICAgICAgaWYgKHB0cmFjZShQVFJBQ0VfR0VUUkVHU0VULCB0aHJlYWQsIE5UX0FSTV9UTFMsIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KCZ0bHNfaW92KSkgPT0gLTEpIHsKKyAgICAgICAgaW5mby50bHMgPSAwOworICAgICAgfQorI2VuZGlmCiAgICAgICBpZiAodGhyZWFkID09IGdfdGFyZ2V0X3RocmVhZCkgewogICAgICAgICAvLyBSZWFkIHRoZSB0aHJlYWQncyByZWdpc3RlcnMgYWxvbmcgd2l0aCB0aGUgcmVzdCBvZiB0aGUgY3Jhc2ggaW5mbyBvdXQgb2YgdGhlIHBpcGUuCi0gICAgICAgIFJlYWRDcmFzaEluZm8oaW5wdXRfcGlwZSwgJnNpZ2luZm8sICZpbmZvLnJlZ2lzdGVycywgJnByb2Nlc3NfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAmcmVjb3ZlcmFibGVfZ3dwX2FzYW5fY3Jhc2gpOworICAgICAgICBSZWFkQ3Jhc2hJbmZvKGlucHV0X3BpcGUsICZzaWdpbmZvLCAmaW5mby5yZWdpc3RlcnMsICZwcm9jZXNzX2luZm8sICZyZWNvdmVyYWJsZV9jcmFzaCk7CiAgICAgICAgIGluZm8uc2lnaW5mbyA9ICZzaWdpbmZvOwogICAgICAgICBpbmZvLnNpZ25vID0gaW5mby5zaWdpbmZvLT5zaV9zaWdubzsKIApAQCAtNTUxLDYgKzY4NCw3IEBACiAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgIH0KKyAgICAgIFJlYWRHdWVzdFJlZ2lzdGVycygmaW5mby5ndWVzdF9yZWdpc3RlcnMsIHRocmVhZCk7CiAKICAgICAgIHRocmVhZF9pbmZvW3RocmVhZF0gPSBzdGQ6Om1vdmUoaW5mbyk7CiAgICAgfQpAQCAtNjYwLDE1ICs3OTQsMzUgQEAKIAogICAgIHsKICAgICAgIEFUUkFDRV9OQU1FKCJlbmdyYXZlX3RvbWJzdG9uZSIpOwotICAgICAgZW5ncmF2ZV90b21ic3RvbmUoc3RkOjptb3ZlKGdfb3V0cHV0X2ZkKSwgc3RkOjptb3ZlKGdfcHJvdG9fZmQpLCAmdW53aW5kZXIsIHRocmVhZF9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgZ190YXJnZXRfdGhyZWFkLCBwcm9jZXNzX2luZm8sICZvcGVuX2ZpbGVzLCAmYW1mZF9kYXRhKTsKKyAgICAgIHVud2luZHN0YWNrOjpBcmNoRW51bSByZWdzX2FyY2ggPSB1bndpbmRzdGFjazo6QVJDSF9VTktOT1dOOworICAgICAgc3dpdGNoIChnX2d1ZXN0X2FyY2gpIHsKKyAgICAgICAgY2FzZSBBcmNoaXRlY3R1cmU6OkFSTTY0OiB7CisgICAgICAgICAgcmVnc19hcmNoID0gdW53aW5kc3RhY2s6OkFSQ0hfQVJNNjQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBBcmNoaXRlY3R1cmU6OlJJU0NWNjQ6IHsKKyAgICAgICAgICByZWdzX2FyY2ggPSB1bndpbmRzdGFjazo6QVJDSF9SSVNDVjY0OworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHJlZ3NfYXJjaCA9PSB1bndpbmRzdGFjazo6QVJDSF9VTktOT1dOKSB7CisgICAgICAgIGVuZ3JhdmVfdG9tYnN0b25lKHN0ZDo6bW92ZShnX291dHB1dF9mZCksIHN0ZDo6bW92ZShnX3Byb3RvX2ZkKSwgJnVud2luZGVyLCB0aHJlYWRfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ190YXJnZXRfdGhyZWFkLCBwcm9jZXNzX2luZm8sICZvcGVuX2ZpbGVzLCAmYW1mZF9kYXRhKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHVud2luZHN0YWNrOjpBbmRyb2lkUmVtb3RlVW53aW5kZXIgZ3Vlc3RfdW53aW5kZXIodm1fcGlkLCByZWdzX2FyY2gpOworICAgICAgICBlbmdyYXZlX3RvbWJzdG9uZShzdGQ6Om1vdmUoZ19vdXRwdXRfZmQpLCBzdGQ6Om1vdmUoZ19wcm90b19mZCksICZ1bndpbmRlciwgdGhyZWFkX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdfdGFyZ2V0X3RocmVhZCwgcHJvY2Vzc19pbmZvLCAmb3Blbl9maWxlcywgJmFtZmRfZGF0YSwgJmdfZ3Vlc3RfYXJjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmd1ZXN0X3Vud2luZGVyKTsKKyAgICAgIH0KICAgICB9CiAgIH0KIAogICBpZiAoZmF0YWxfc2lnbmFsKSB7CiAgICAgLy8gRG9uJ3QgdHJ5IHRvIG5vdGlmeSBBY3Rpdml0eU1hbmFnZXIgaWYgaXQganVzdCBjcmFzaGVkLCBvciB3ZSBtaWdodCBoYW5nIHVudGlsIHRpbWVvdXQuCiAgICAgaWYgKHRocmVhZF9pbmZvW3RhcmdldF9wcm9jZXNzXS50aHJlYWRfbmFtZSAhPSAic3lzdGVtX3NlcnZlciIpIHsKLSAgICAgIGFjdGl2aXR5X21hbmFnZXJfbm90aWZ5KHRhcmdldF9wcm9jZXNzLCBzaWdubywgYW1mZF9kYXRhLCByZWNvdmVyYWJsZV9nd3BfYXNhbl9jcmFzaCk7CisgICAgICBhY3Rpdml0eV9tYW5hZ2VyX25vdGlmeSh0YXJnZXRfcHJvY2Vzcywgc2lnbm8sIGFtZmRfZGF0YSwgcmVjb3ZlcmFibGVfY3Jhc2gpOwogICAgIH0KICAgfQogCmRpZmYgLS1naXQgYS9kZWJ1Z2dlcmQvY3Jhc2hlci9BbmRyb2lkLmJwIGIvZGVidWdnZXJkL2NyYXNoZXIvQW5kcm9pZC5icAppbmRleCBmZTE2ODljLi40YzZhNDAwIDEwMDY0NAotLS0gYS9kZWJ1Z2dlcmQvY3Jhc2hlci9BbmRyb2lkLmJwCisrKyBiL2RlYnVnZ2VyZC9jcmFzaGVyL0FuZHJvaWQuYnAKQEAgLTE1LDcgKzE1LDcgQEAKICAgICAgICAgIi1mc3RhY2stcHJvdGVjdG9yLWFsbCIsCiAgICAgICAgICItV25vLWRhdGUtdGltZSIsCiAgICAgXSwKLSAgICB0aWR5OiBmYWxzZSwgIC8vIGNyYXNoZXIuY3BwIHRlc3RzIG1hbnkgbWVtb3J5IGFjY2VzcyBlcnJvcnMKKyAgICB0aWR5OiBmYWxzZSwgLy8gY3Jhc2hlci5jcHAgdGVzdHMgbWFueSBtZW1vcnkgYWNjZXNzIGVycm9ycwogICAgIHNyY3M6IFsiY3Jhc2hlci5jcHAiXSwKICAgICBhcmNoOiB7CiAgICAgICAgIGFybTogewpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL2NyYXNoZXIvYXJtL2NyYXNoZ2x1ZS5TIGIvZGVidWdnZXJkL2NyYXNoZXIvYXJtL2NyYXNoZ2x1ZS5TCmluZGV4IGU0YWRmNDAuLjMwMDFjYTEgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC9jcmFzaGVyL2FybS9jcmFzaGdsdWUuUworKysgYi9kZWJ1Z2dlcmQvY3Jhc2hlci9hcm0vY3Jhc2hnbHVlLlMKQEAgLTEsMyArMSwxOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwogLmdsb2JsIGNyYXNoMQogLnR5cGUgY3Jhc2gxLCAlZnVuY3Rpb24KIGNyYXNoMToKQEAgLTIzLDEwICszOSwxMSBAQAogCWxkciBsciwgW2xyXQogCWIgLgogCS5jZmlfZW5kcHJvYworCS5zaXplIGNyYXNoMSwgLi1jcmFzaDEKIAotLmdsb2JsIGNyYXNobm9zdGFjawotLnR5cGUgY3Jhc2hub3N0YWNrLCAlZnVuY3Rpb24KLWNyYXNobm9zdGFjazoKKy5nbG9ibCBjcmFzaF9ub19zdGFjaworLnR5cGUgY3Jhc2hfbm9fc3RhY2ssICVmdW5jdGlvbgorY3Jhc2hfbm9fc3RhY2s6CiAJLmNmaV9zdGFydHByb2MKIAltb3YgcjEsIHNwCiAJLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyIHIxCkBAIC0zNSwzICs1Miw0IEBACiAJbGRyIHIwLCBbcjBdCiAJYiAuCiAJLmNmaV9lbmRwcm9jCisJLnNpemUgY3Jhc2hfbm9fc3RhY2ssIC4tY3Jhc2hfbm9fc3RhY2sKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9jcmFzaGVyL2FybTY0L2NyYXNoZ2x1ZS5TIGIvZGVidWdnZXJkL2NyYXNoZXIvYXJtNjQvY3Jhc2hnbHVlLlMKaW5kZXggOTdjODI0ZS4uOTBiYTlhMSAxMDA2NDQKLS0tIGEvZGVidWdnZXJkL2NyYXNoZXIvYXJtNjQvY3Jhc2hnbHVlLlMKKysrIGIvZGVidWdnZXJkL2NyYXNoZXIvYXJtNjQvY3Jhc2hnbHVlLlMKQEAgLTEsMyArMSwxOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEzLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwogLmdsb2JsIGNyYXNoMQogLnR5cGUgY3Jhc2gxLCAlZnVuY3Rpb24KIGNyYXNoMToKQEAgLTQxLDExICs1NywxMiBAQAogCWxkciB4MzAsIFt4MzBdCiAJYiAuCiAJLmNmaV9lbmRwcm9jCisJLnNpemUgY3Jhc2gxLCAuLWNyYXNoMQogCiAKLS5nbG9ibCBjcmFzaG5vc3RhY2sKLS50eXBlIGNyYXNobm9zdGFjaywgJWZ1bmN0aW9uCi1jcmFzaG5vc3RhY2s6CisuZ2xvYmwgY3Jhc2hfbm9fc3RhY2sKKy50eXBlIGNyYXNoX25vX3N0YWNrLCAlZnVuY3Rpb24KK2NyYXNoX25vX3N0YWNrOgogCS5jZmlfc3RhcnRwcm9jCiAJbW92IHgxLCBzcAogCS5jZmlfZGVmX2NmYV9yZWdpc3RlciB4MQpAQCAtNTQsMyArNzEsNDEgQEAKIAlsZHIgeDAsIFt4MF0KIAliIC4KIAkuY2ZpX2VuZHByb2MKKwkuc2l6ZSBjcmFzaF9ub19zdGFjaywgLi1jcmFzaF9ub19zdGFjaworCisKKy5nbG9ibCBjcmFzaF9idGkKKy50eXBlIGNyYXNoX2J0aSwgJWZ1bmN0aW9uCitjcmFzaF9idGk6CisJLmNmaV9zdGFydHByb2MKKwlhZHIgeDE2LCAxZgorCWJyIHgxNgorMToJLy8gRGVsaWJlcmF0bHkgbm90IGEgYnRpIGluc3RydWN0aW9uIHNvIHdlIGNyYXNoIGhlcmUuCisJYiAuCisJLmNmaV9lbmRwcm9jCisJLnNpemUgY3Jhc2hfYnRpLCAuLWNyYXNoX2J0aQorCisKKy5nbG9ibCBjcmFzaF9wYWMKKy50eXBlIGNyYXNoX3BhYywgJWZ1bmN0aW9uCitjcmFzaF9wYWM6CisJLmNmaV9zdGFydHByb2MKKwlwYWNpYXNwCisJLy8gU2luY2Ugc3AgaXMgYSBwYWMgaW5wdXQsIHRoaXMgZW5zdXJlcyBhIG1pc21hdGNoLgorCXN1YiBzcCwgc3AsICMxNgorCWF1dGlhc3AKKwliIC4KKwkuY2ZpX2VuZHByb2MKKwkuc2l6ZSBjcmFzaF9wYWMsIC4tY3Jhc2hfcGFjCisKKy8vIFNldCB0aGUgUEFDIGFuZCBCVEkgYml0cyBmb3IgdGhpcyBvYmplY3QgZmlsZS4KKy5zZWN0aW9uIC5ub3RlLmdudS5wcm9wZXJ0eSwgImEiCisuYmFsaWduIDgKKy5sb25nIDQKKy5sb25nIDB4MTAKKy5sb25nIDB4NQorLmFzY2l6ICJHTlUiCisubG9uZyAweGMwMDAwMDAwCisubG9uZyA0CisubG9uZyAweDMKKy5sb25nIDAKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9jcmFzaGVyL2NyYXNoZXIuY3BwIGIvZGVidWdnZXJkL2NyYXNoZXIvY3Jhc2hlci5jcHAKaW5kZXggNmExOTg3OC4uMDUxNDNlZCAxMDA2NDQKLS0tIGEvZGVidWdnZXJkL2NyYXNoZXIvY3Jhc2hlci5jcHAKKysrIGIvZGVidWdnZXJkL2NyYXNoZXIvY3Jhc2hlci5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxkaXJlbnQuaD4KICNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGVycm9yLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAjaW5jbHVkZSA8c2lnbmFsLmg+CkBAIC0yOSw2ICszMCw5IEBACiAjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CisKIC8vIFdlIHRlc3QgYm90aCBraW5kcyBvZiBsb2dnaW5nLgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8bG9nL2xvZy5oPgpAQCAtNTksOCArNjMsMTAgQEAKIC8vIEF2b2lkIG5hbWUgbWFuZ2xpbmcgc28gdGhhdCBzdGFja3MgYXJlIG1vcmUgcmVhZGFibGUuCiBleHRlcm4gIkMiIHsKIAotdm9pZCBjcmFzaDEodm9pZCk7Ci12b2lkIGNyYXNobm9zdGFjayh2b2lkKTsKK3ZvaWQgY3Jhc2gxKCk7Cit2b2lkIGNyYXNoX25vX3N0YWNrKCk7Cit2b2lkIGNyYXNoX2J0aSgpOwordm9pZCBjcmFzaF9wYWMoKTsKIAogaW50IGRvX2FjdGlvbihjb25zdCBjaGFyKiBhcmcpOwogCkBAIC0xNDgsNyArMTU0LDcgQEAKIG5vaW5saW5lIHZvaWQgbGVhaygpIHsKICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICB2b2lkKiBtYXBwaW5nID0KLSAgICAgICAgICAgIG1tYXAobnVsbHB0ciwgUEFHRV9TSVpFLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfUFJJVkFURSB8IE1BUF9BTk9OWU1PVVMsIC0xLCAwKTsKKyAgICAgICAgICAgIG1tYXAobnVsbHB0ciwgZ2V0cGFnZXNpemUoKSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTllNT1VTLCAtMSwgMCk7CiAgICAgICAgIHN0YXRpY19jYXN0PHZvbGF0aWxlIGNoYXIqPihtYXBwaW5nKVswXSA9ICdhJzsKICAgICB9CiB9CkBAIC0xOTYsMTQgKzIwMiw5IEBACiAgICAgZnByaW50ZihzdGRlcnIsICIgIGZkc2FuX2ZpbGUgICAgICAgICAgICBjbG9zZSBhIGZpbGUgZGVzY3JpcHRvciB0aGF0J3Mgb3duZWQgYnkgYSBGSUxFKlxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgIGZkc2FuX2RpciAgICAgICAgICAgICBjbG9zZSBhIGZpbGUgZGVzY3JpcHRvciB0aGF0J3Mgb3duZWQgYnkgYSBESVIqXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgc2VjY29tcCAgICAgICAgICAgICAgIGZhaWwgYSBzZWNjb21wIGNoZWNrXG4iKTsKLSNpZiBkZWZpbmVkKF9fYXJtX18pCi0gICAgZnByaW50ZihzdGRlcnIsICIgIGt1c2VyX2hlbHBlcl92ZXJzaW9uICBjYWxsIGt1c2VyX2hlbHBlcl92ZXJzaW9uXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAga3VzZXJfZ2V0X3RscyAgICAgICAgIGNhbGwga3VzZXJfZ2V0X3Rsc1xuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgIGt1c2VyX2NtcHhjaGcgICAgICAgICBjYWxsIGt1c2VyX2NtcHhjaGdcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICBrdXNlcl9tZW1vcnlfYmFycmllciAgY2FsbCBrdXNlcl9tZW1vcnlfYmFycmllclxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgIGt1c2VyX2NtcHhjaGc2NCAgICAgICBjYWxsIGt1c2VyX2NtcHhjaGc2NFxuIik7Ci0jZW5kaWYKKyNpZiBkZWZpbmVkKF9fTFA2NF9fKQogICAgIGZwcmludGYoc3RkZXJyLCAiICB4b20gICAgICAgICAgICAgICAgICAgcmVhZCBleGVjdXRlLW9ubHkgbWVtb3J5XG4iKTsKKyNlbmRpZgogICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgTE9HX0FMV0FZU19GQVRBTCAgICAgIGNhbGwgbGlibG9nIExPR19BTFdBWVNfRkFUQUxcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICBMT0dfQUxXQVlTX0ZBVEFMX0lGICAgY2FsbCBsaWJsb2cgTE9HX0FMV0FZU19GQVRBTF9JRlxuIik7CkBAIC0yMjMsNiArMjI0LDIwIEBACiAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICBub19uZXdfcHJpdnMgICAgICAgICAgc2V0IFBSX1NFVF9OT19ORVdfUFJJVlMgYW5kIHRoZW4gYWJvcnRcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyNpZiBkZWZpbmVkKF9fYXJtX18pCisgICAgZnByaW50ZihzdGRlcnIsICJBbHNvLCBzaW5jZSB0aGlzIGlzIGFuIGFybTMyIGJpbmFyeTpcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICBrdXNlcl9oZWxwZXJfdmVyc2lvbiAgY2FsbCBrdXNlcl9oZWxwZXJfdmVyc2lvblxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgIGt1c2VyX2dldF90bHMgICAgICAgICBjYWxsIGt1c2VyX2dldF90bHNcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICBrdXNlcl9jbXB4Y2hnICAgICAgICAgY2FsbCBrdXNlcl9jbXB4Y2hnXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAga3VzZXJfbWVtb3J5X2JhcnJpZXIgIGNhbGwga3VzZXJfbWVtb3J5X2JhcnJpZXJcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICBrdXNlcl9jbXB4Y2hnNjQgICAgICAgY2FsbCBrdXNlcl9jbXB4Y2hnNjRcbiIpOworI2VuZGlmCisjaWYgZGVmaW5lZChfX2FhcmNoNjRfXykKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkFsc28sIHNpbmNlIHRoaXMgaXMgYW4gYXJtNjQgYmluYXJ5OlxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgIGJ0aSAgICAgICAgICAgICAgICAgICBmYWlsIGEgYnJhbmNoIHRhcmdldCBpZGVudGlmaWNhdGlvbiAoQlRJKSBjaGVja1xuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgIHBhYyAgICAgICAgICAgICAgICAgICBmYWlsIGEgcG9pbnRlciBhdXRoZW50aWNhdGlvbiAoUEFDKSBjaGVja1xuIik7CisjZW5kaWYKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICJwcmVmaXggYW55IG9mIHRoZSBhYm92ZSB3aXRoICd0aHJlYWQtJyB0byBydW4gb24gYSBuZXcgdGhyZWFkXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgInByZWZpeCBhbnkgb2YgdGhlIGFib3ZlIHdpdGggJ2V4aGF1c3RmZC0nIHRvIGV4aGF1c3RcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiYWxsIGF2YWlsYWJsZSBmaWxlIGRlc2NyaXB0b3JzIGJlZm9yZSBjcmFzaGluZy5cbiIpOwpAQCAtMjMxLDYgKzI0NiwyMSBAQAogICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CiB9CiAKK1tbbWF5YmVfdW51c2VkXV0gc3RhdGljIHZvaWQgQ2hlY2tDcHVGZWF0dXJlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgICAgc3RkOjpzdHJpbmcgY3B1aW5mbzsKKyAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmcoIi9wcm9jL2NwdWluZm8iLCAmY3B1aW5mbykpIHsKKyAgICAgICAgZXJyb3IoMSwgZXJybm8sICJjb3VsZG4ndCByZWFkIC9wcm9jL2NwdWluZm8iKTsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpbmVzID0gYW5kcm9pZDo6YmFzZTo6U3BsaXQoY3B1aW5mbywgIlxuIik7CisgICAgZm9yIChzdGQ6OnN0cmluZ192aWV3IGxpbmUgOiBsaW5lcykgeworICAgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OkNvbnN1bWVQcmVmaXgoJmxpbmUsICJGZWF0dXJlc1x0OiIpKSBjb250aW51ZTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGZlYXR1cmVzID0gYW5kcm9pZDo6YmFzZTo6U3BsaXQoc3RkOjpzdHJpbmcobGluZSksICIgIik7CisgICAgICAgIGlmIChzdGQ6OmZpbmQoZmVhdHVyZXMuYmVnaW4oKSwgZmVhdHVyZXMuZW5kKCksIG5hbWUpID09IGZlYXR1cmVzLmVuZCgpKSB7CisgICAgICAgICAgZXJyb3IoMSwgMCwgIi9wcm9jL2NwdWluZm8gZG9lcyBub3QgcmVwb3J0IGZlYXR1cmUgJyVzJyIsIG5hbWUuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIG5vaW5saW5lIGludCBkb19hY3Rpb24oY29uc3QgY2hhciogYXJnKSB7CiAgICAgLy8gUHJlZml4ZXMuCiAgICAgaWYgKCFzdHJuY21wKGFyZywgIndhaXQtIiwgc3RybGVuKCJ3YWl0LSIpKSkgewpAQCAtMjU2LDcgKzI4Niw3IEBACiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChhcmcsICJzdGFjay1vdmVyZmxvdyIpKSB7CiAgICAgICBvdmVyZmxvd19zdGFjayhudWxscHRyKTsKICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKGFyZywgIm5vc3RhY2siKSkgewotICAgICAgY3Jhc2hub3N0YWNrKCk7CisgICAgICBjcmFzaF9ub19zdGFjaygpOwogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJnLCAiZXhpdCIpKSB7CiAgICAgICBleGl0KDEpOwogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJnLCAiY2FsbC1udWxsIikpIHsKQEAgLTM1MCw2ICszODAsMTQgQEAKICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKGFyZywgImt1c2VyX2NtcHhjaGc2NCIpKSB7CiAgICAgICAgIHJldHVybiBfX2t1c2VyX2NtcHhjaGc2NCgwLCAwLCAwKTsKICNlbmRpZgorI2lmIGRlZmluZWQoX19hYXJjaDY0X18pCisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChhcmcsICJidGkiKSkgeworICAgICAgICBDaGVja0NwdUZlYXR1cmUoImJ0aSIpOworICAgICAgICBjcmFzaF9idGkoKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKGFyZywgInBhYyIpKSB7CisgICAgICAgIENoZWNrQ3B1RmVhdHVyZSgicGFjYSIpOworICAgICAgICBjcmFzaF9wYWMoKTsKKyNlbmRpZgogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJnLCAibm9fbmV3X3ByaXZzIikpIHsKICAgICAgICAgaWYgKHByY3RsKFBSX1NFVF9OT19ORVdfUFJJVlMsIDEpICE9IDApIHsKICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInByY3RsKFBSX1NFVF9OT19ORVdfUFJJVlMsIDEpIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CmRpZmYgLS1naXQgYS9kZWJ1Z2dlcmQvY3Jhc2hlci9yaXNjdjY0L2NyYXNoZ2x1ZS5TIGIvZGVidWdnZXJkL2NyYXNoZXIvcmlzY3Y2NC9jcmFzaGdsdWUuUwppbmRleCA0MmY1OWIzLi44MDRhNTExIDEwMDY0NAotLS0gYS9kZWJ1Z2dlcmQvY3Jhc2hlci9yaXNjdjY0L2NyYXNoZ2x1ZS5TCisrKyBiL2RlYnVnZ2VyZC9jcmFzaGVyL3Jpc2N2NjQvY3Jhc2hnbHVlLlMKQEAgLTEsMyArMSwxOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIyLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwogLmdsb2JsIGNyYXNoMQogY3Jhc2gxOgogCS5jZmlfc3RhcnRwcm9jCkBAIC00MywxMCArNTksMTEgQEAKIAlsZCB0MiwgMCh6ZXJvKQogCWogLgogCS5jZmlfZW5kcHJvYworCS5zaXplIGNyYXNoMSwgLi1jcmFzaDEKIAogCi0uZ2xvYmwgY3Jhc2hub3N0YWNrCi1jcmFzaG5vc3RhY2s6CisuZ2xvYmwgY3Jhc2hfbm9fc3RhY2sKK2NyYXNoX25vX3N0YWNrOgogCS5jZmlfc3RhcnRwcm9jCiAJbXYgdDEsIHNwCiAJLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyIHQxCkBAIC01NCwzICs3MSw0IEBACiAJbGQgdDIsIDAoemVybykKIAlqIC4KIAkuY2ZpX2VuZHByb2MKKwkuc2l6ZSBjcmFzaF9ub19zdGFjaywgLi1jcmFzaF9ub19zdGFjawpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL2NyYXNoZXIveDg2L2NyYXNoZ2x1ZS5TIGIvZGVidWdnZXJkL2NyYXNoZXIveDg2L2NyYXNoZ2x1ZS5TCmluZGV4IGU4ZWIzYTcuLmZlN2M2NDggMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC9jcmFzaGVyL3g4Ni9jcmFzaGdsdWUuUworKysgYi9kZWJ1Z2dlcmQvY3Jhc2hlci94ODYvY3Jhc2hnbHVlLlMKQEAgLTEsMyArMSwxOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwogLmdsb2JsIGNyYXNoMQogY3Jhc2gxOgogCW1vdmwgJDB4YTVhNTAwMDAsICVlYXgKQEAgLTYsMTMgKzIyLDE1IEBACiAKIAltb3ZsICQwLCAlZWR4CiAJam1wIColZWR4CisJLnNpemUgY3Jhc2gxLCAuLWNyYXNoMQogCiAKLS5nbG9ibCBjcmFzaG5vc3RhY2sKLWNyYXNobm9zdGFjazoKKy5nbG9ibCBjcmFzaF9ub19zdGFjaworY3Jhc2hfbm9fc3RhY2s6CiAJLmNmaV9zdGFydHByb2MKIAltb3ZsICVlc3AsICVlYXgKIAkuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIgJWVheAogCW1vdmwgJDAsICVlc3AKIAltb3ZsICglZXNwKSwgJWVieAogCS5jZmlfZW5kcHJvYworCS5zaXplIGNyYXNoX25vX3N0YWNrLCAuLWNyYXNoX25vX3N0YWNrCmRpZmYgLS1naXQgYS9kZWJ1Z2dlcmQvY3Jhc2hlci94ODZfNjQvY3Jhc2hnbHVlLlMgYi9kZWJ1Z2dlcmQvY3Jhc2hlci94ODZfNjQvY3Jhc2hnbHVlLlMKaW5kZXggOGY2NzIxNC4uYWUxM2FhNyAxMDA2NDQKLS0tIGEvZGVidWdnZXJkL2NyYXNoZXIveDg2XzY0L2NyYXNoZ2x1ZS5TCisrKyBiL2RlYnVnZ2VyZC9jcmFzaGVyL3g4Nl82NC9jcmFzaGdsdWUuUwpAQCAtMSwzICsxLDE5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCiAuZ2xvYmwgY3Jhc2gxCiBjcmFzaDE6CiAJbW92bCAkMHhhNWE1MDAwMCwgJWVheApAQCAtNiwxMyArMjIsMTUgQEAKIAogCW1vdmwgJDAsICVlZHgKIAlqbXAgKiVyZHgKKwkuc2l6ZSBjcmFzaDEsIC4tY3Jhc2gxCiAKIAotLmdsb2JsIGNyYXNobm9zdGFjawotY3Jhc2hub3N0YWNrOgorLmdsb2JsIGNyYXNoX25vX3N0YWNrCitjcmFzaF9ub19zdGFjazoKIAkuY2ZpX3N0YXJ0cHJvYwogCW1vdnEgJXJzcCwgJXJheAogCS5jZmlfZGVmX2NmYV9yZWdpc3RlciAlcmF4CiAJbW92cSAkMCwgJXJzcAogCW1vdnEgKCVyc3ApLCAlcmJ4CiAJLmNmaV9lbmRwcm9jCisJLnNpemUgY3Jhc2hfbm9fc3RhY2ssIC4tY3Jhc2hfbm9fc3RhY2sKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9kZWJ1Z2dlcmQuY3BwIGIvZGVidWdnZXJkL2RlYnVnZ2VyZC5jcHAKaW5kZXggZTIwZThkOS4uMGQ0YjkxZiAxMDA2NDQKLS0tIGEvZGVidWdnZXJkL2RlYnVnZ2VyZC5jcHAKKysrIGIvZGVidWdnZXJkL2RlYnVnZ2VyZC5jcHAKQEAgLTQxLDIyICs0MSw2IEBACiAgIF9leGl0KGV4aXRfY29kZSk7CiB9CiAKLXN0YXRpYyBzdGQ6OnRocmVhZCBzcGF3bl9yZWRpcmVjdF90aHJlYWQodW5pcXVlX2ZkIGZkKSB7Ci0gIHJldHVybiBzdGQ6OnRocmVhZChbZmR7IHN0ZDo6bW92ZShmZCkgfV0oKSB7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIGNoYXIgYnVmW0JVRlNJWl07Ci0gICAgICBzc2l6ZV90IHJjID0gVEVNUF9GQUlMVVJFX1JFVFJZKHJlYWQoZmQuZ2V0KCksIGJ1Ziwgc2l6ZW9mKGJ1ZikpKTsKLSAgICAgIGlmIChyYyA8PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpXcml0ZUZ1bGx5KFNURE9VVF9GSUxFTk8sIGJ1ZiwgcmMpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gIH0pOwotfQotCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CiAgIGlmIChhcmdjIDw9IDEpIHVzYWdlKDApOwogICBpZiAoYXJnYyA+IDMpIHVzYWdlKDEpOwpAQCAtMTA3LDE0ICs5MSwyMCBAQAogICAgIH0KICAgfQogCi0gIHVuaXF1ZV9mZCBwaXBlcmVhZCwgcGlwZXdyaXRlOwotICBpZiAoIVBpcGUoJnBpcGVyZWFkLCAmcGlwZXdyaXRlKSkgewotICAgIGVycigxLCAiZmFpbGVkIHRvIGNyZWF0ZSBwaXBlIik7CisgIC8vIHVuZnJlZXplIGlmIHBpZCBpcyBmcm96ZW4uCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGZyZWV6ZV9maWxlID0gYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKAorICAgICAgIi9zeXMvZnMvY2dyb3VwL3VpZF8lZC9waWRfJWQvY2dyb3VwLmZyZWV6ZSIsIHByb2NfaW5mby51aWQsIHByb2NfaW5mby5waWQpOworICBpZiAoc3RkOjpzdHJpbmcgZnJlZXplX3N0YXR1czsKKyAgICAgIGFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmcoZnJlZXplX2ZpbGUsICZmcmVlemVfc3RhdHVzKSAmJiBmcmVlemVfc3RhdHVzWzBdID09ICcxJykgeworICAgIGFuZHJvaWQ6OmJhc2U6OldyaXRlU3RyaW5nVG9GaWxlKCIwIiwgZnJlZXplX2ZpbGUpOworICAgIC8vIHdlIGRvbid0IHJlc3RvcmUgdGhlIGZyb3plbiBzdGF0ZSBhcyB0aGlzIGlzIGNvbnNpZGVyZWQgYSBiZW5pZ24gY2hhbmdlLgogICB9CiAKLSAgc3RkOjp0aHJlYWQgcmVkaXJlY3RfdGhyZWFkID0gc3Bhd25fcmVkaXJlY3RfdGhyZWFkKHN0ZDo6bW92ZShwaXBlcmVhZCkpOwotICBpZiAoIWRlYnVnZ2VyZF90cmlnZ2VyX2R1bXAocHJvY19pbmZvLnBpZCwgZHVtcF90eXBlLCAwLCBzdGQ6Om1vdmUocGlwZXdyaXRlKSkpIHsKLSAgICByZWRpcmVjdF90aHJlYWQuam9pbigpOworICB1bmlxdWVfZmQgb3V0cHV0X2ZkKGZjbnRsKFNURE9VVF9GSUxFTk8sIEZfRFVQRkRfQ0xPRVhFQywgMCkpOworICBpZiAob3V0cHV0X2ZkLmdldCgpID09IC0xKSB7CisgICAgZXJyKDEsICJmYWlsZWQgdG8gZmNudGwgZHVwIHN0ZG91dCIpOworICB9CisgIGlmICghZGVidWdnZXJkX3RyaWdnZXJfZHVtcChwcm9jX2luZm8ucGlkLCBkdW1wX3R5cGUsIDAsIHN0ZDo6bW92ZShvdXRwdXRfZmQpKSkgewogICAgIGlmIChwaWQgPT0gcHJvY19pbmZvLnBpZCkgewogICAgICAgZXJyeCgxLCAiZmFpbGVkIHRvIGR1bXAgcHJvY2VzcyAlZCIsIHBpZCk7CiAgICAgfSBlbHNlIHsKQEAgLTEyMiw2ICsxMTIsNSBAQAogICAgIH0KICAgfQogCi0gIHJlZGlyZWN0X3RocmVhZC5qb2luKCk7CiAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL2RlYnVnZ2VyZF90ZXN0LmNwcCBiL2RlYnVnZ2VyZC9kZWJ1Z2dlcmRfdGVzdC5jcHAKaW5kZXggNGNkNjE5My4uMTNjOGQ3MCAxMDA2NDQKLS0tIGEvZGVidWdnZXJkL2RlYnVnZ2VyZF90ZXN0LmNwcAorKysgYi9kZWJ1Z2dlcmQvZGVidWdnZXJkX3Rlc3QuY3BwCkBAIC0xOCw5ICsxOCwxMSBAQAogI2luY2x1ZGUgPGRsZmNuLmg+CiAjaW5jbHVkZSA8ZXJyLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3ByY3RsLmg+CiAjaW5jbHVkZSA8bWFsbG9jLmg+CiAjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHNldGptcC5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN5cy9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KQEAgLTM3LDYgKzM5LDcgQEAKICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dGhyZWFkPgogCisjaW5jbHVkZSA8YW5kcm9pZC9jcmFzaF9kZXRhaWwuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2RsZXh0Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9mZHNhbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvc2V0X2Fib3J0X21lc3NhZ2UuaD4KQEAgLTY3LDcgKzcwLDcgQEAKICNpbmNsdWRlICJjcmFzaF90ZXN0LmgiCiAjaW5jbHVkZSAiZGVidWdnZXJkL2hhbmRsZXIuaCIKICNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgotI2luY2x1ZGUgImxpYmRlYnVnZ2VyZC91dGlsaXR5LmgiCisjaW5jbHVkZSAibGliZGVidWdnZXJkL3V0aWxpdHlfaG9zdC5oIgogI2luY2x1ZGUgInByb3RvY29sLmgiCiAjaW5jbHVkZSAidG9tYnN0b25lZC90b21ic3RvbmVkLmgiCiAjaW5jbHVkZSAidXRpbC5oIgpAQCAtOTQsNyArOTcsNyBAQAogICAgIGlmIChzaWdhY3Rpb24oU0lHQUxSTSwgJm5ld19zaWdhY3Rpb24sICZvbGRfc2lnYWN0aW9uKSAhPSAwKSB7IFwKICAgICAgIGVycigxLCAic2lnYWN0aW9uIGZhaWxlZCIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGFsYXJtKHNlY29uZHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhbGFybShzZWNvbmRzICogYW5kcm9pZDo6YmFzZTo6SHdUaW1lb3V0TXVsdGlwbGllcigpKTsgICAgICAgICBcCiAgICAgYXV0byB2YWx1ZSA9IGV4cHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGludCBzYXZlZF9lcnJubyA9IGVycm5vOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBpZiAoc2lnYWN0aW9uKFNJR0FMUk0sICZvbGRfc2lnYWN0aW9uLCBudWxscHRyKSAhPSAwKSB7ICAgICAgICBcCkBAIC0xMTQsNyArMTE3LDcgQEAKICAgICAgICAgICAgICAgIFIiKCNcZFxkIHBjIFswLTlhLWZdK1xzKyBcUysgKFwob2Zmc2V0IDB4WzAtOWEtZl0rXCkgKT9cKCkiIGZyYW1lX25hbWUgUiIoXCspIik7CiAKIHN0YXRpYyB2b2lkIHRvbWJzdG9uZWRfaW50ZXJjZXB0KHBpZF90IHRhcmdldF9waWQsIHVuaXF1ZV9mZCogaW50ZXJjZXB0X2ZkLCB1bmlxdWVfZmQqIG91dHB1dF9mZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVyY2VwdFN0YXR1cyogc3RhdHVzLCBEZWJ1Z2dlcmREdW1wVHlwZSBpbnRlcmNlcHRfdHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJjZXB0UmVzcG9uc2UqIHJlc3BvbnNlLCBEZWJ1Z2dlcmREdW1wVHlwZSBpbnRlcmNlcHRfdHlwZSkgewogICBpbnRlcmNlcHRfZmQtPnJlc2V0KHNvY2tldF9sb2NhbF9jbGllbnQoa1RvbWJzdG9uZWRJbnRlcmNlcHRTb2NrZXROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TT0NLRVRfTkFNRVNQQUNFX1JFU0VSVkVELCBTT0NLX1NFUVBBQ0tFVCkpOwogICBpZiAoaW50ZXJjZXB0X2ZkLT5nZXQoKSA9PSAtMSkgewpAQCAtMTU1LDE4ICsxNTgsMTUgQEAKICAgICBGQUlMKCkgPDwgImZhaWxlZCB0byBzZW5kIG91dHB1dCBmZCB0byB0b21ic3RvbmVkOiAiIDw8IHN0cmVycm9yKGVycm5vKTsKICAgfQogCi0gIEludGVyY2VwdFJlc3BvbnNlIHJlc3BvbnNlOwotICByYyA9IFRFTVBfRkFJTFVSRV9SRVRSWShyZWFkKGludGVyY2VwdF9mZC0+Z2V0KCksICZyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSkpOworICByYyA9IFRFTVBfRkFJTFVSRV9SRVRSWShyZWFkKGludGVyY2VwdF9mZC0+Z2V0KCksIHJlc3BvbnNlLCBzaXplb2YoKnJlc3BvbnNlKSkpOwogICBpZiAocmMgPT0gLTEpIHsKICAgICBGQUlMKCkgPDwgImZhaWxlZCB0byByZWFkIHJlc3BvbnNlIGZyb20gdG9tYnN0b25lZDogIiA8PCBzdHJlcnJvcihlcnJubyk7CiAgIH0gZWxzZSBpZiAocmMgPT0gMCkgewogICAgIEZBSUwoKSA8PCAiZmFpbGVkIHRvIHJlYWQgcmVzcG9uc2UgZnJvbSB0b21ic3RvbmVkIChFT0YpIjsKLSAgfSBlbHNlIGlmIChyYyAhPSBzaXplb2YocmVzcG9uc2UpKSB7Ci0gICAgRkFJTCgpIDw8ICJyZWNlaXZlZCBwYWNrZXQgb2YgdW5leHBlY3RlZCBsZW5ndGggZnJvbSB0b21ic3RvbmVkOiBleHBlY3RlZCAiIDw8IHNpemVvZihyZXNwb25zZSkKKyAgfSBlbHNlIGlmIChyYyAhPSBzaXplb2YoKnJlc3BvbnNlKSkgeworICAgIEZBSUwoKSA8PCAicmVjZWl2ZWQgcGFja2V0IG9mIHVuZXhwZWN0ZWQgbGVuZ3RoIGZyb20gdG9tYnN0b25lZDogZXhwZWN0ZWQgIiA8PCBzaXplb2YoKnJlc3BvbnNlKQogICAgICAgICAgICA8PCAiLCByZWNlaXZlZCAiIDw8IHJjOwogICB9Ci0KLSAgKnN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1czsKIH0KIAogc3RhdGljIGJvb2wgcGFjX3N1cHBvcnRlZCgpIHsKQEAgLTIyNSw5ICsyMjUsMTAgQEAKICAgICBGQUlMKCkgPDwgImNyYXNoZXIgaGFzbid0IGJlZW4gc3RhcnRlZCI7CiAgIH0KIAotICBJbnRlcmNlcHRTdGF0dXMgc3RhdHVzOwotICB0b21ic3RvbmVkX2ludGVyY2VwdChjcmFzaGVyX3BpZCwgJnRoaXMtPmludGVyY2VwdF9mZCwgb3V0cHV0X2ZkLCAmc3RhdHVzLCBpbnRlcmNlcHRfdHlwZSk7Ci0gIEFTU0VSVF9FUShJbnRlcmNlcHRTdGF0dXM6OmtSZWdpc3RlcmVkLCBzdGF0dXMpOworICBJbnRlcmNlcHRSZXNwb25zZSByZXNwb25zZSA9IHt9OworICB0b21ic3RvbmVkX2ludGVyY2VwdChjcmFzaGVyX3BpZCwgJnRoaXMtPmludGVyY2VwdF9mZCwgb3V0cHV0X2ZkLCAmcmVzcG9uc2UsIGludGVyY2VwdF90eXBlKTsKKyAgQVNTRVJUX0VRKEludGVyY2VwdFN0YXR1czo6a1JlZ2lzdGVyZWQsIHJlc3BvbnNlLnN0YXR1cykKKyAgICAgIDw8ICJFcnJvciBtZXNzYWdlOiAiIDw8IHJlc3BvbnNlLmVycm9yX21lc3NhZ2U7CiB9CiAKIHZvaWQgQ3Jhc2hlclRlc3Q6OkZpbmlzaEludGVyY2VwdChpbnQqIHJlc3VsdCkgewpAQCAtMzAwLDI0ICszMDEsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBDb25zdW1lRmQodW5pcXVlX2ZkIGZkLCBzdGQ6OnN0cmluZyogb3V0cHV0KSB7Ci0gIGNvbnN0ZXhwciBzaXplX3QgcmVhZF9sZW5ndGggPSBQQUdFX1NJWkU7Ci0gIHN0ZDo6c3RyaW5nIHJlc3VsdDsKLQotICB3aGlsZSAodHJ1ZSkgewotICAgIHNpemVfdCBvZmZzZXQgPSByZXN1bHQuc2l6ZSgpOwotICAgIHJlc3VsdC5yZXNpemUocmVzdWx0LnNpemUoKSArIFBBR0VfU0laRSk7Ci0gICAgc3NpemVfdCByYyA9IFRFTVBfRkFJTFVSRV9SRVRSWShyZWFkKGZkLmdldCgpLCAmcmVzdWx0W29mZnNldF0sIHJlYWRfbGVuZ3RoKSk7Ci0gICAgaWYgKHJjID09IC0xKSB7Ci0gICAgICBGQUlMKCkgPDwgInJlYWQgZmFpbGVkOiAiIDw8IHN0cmVycm9yKGVycm5vKTsKLSAgICB9IGVsc2UgaWYgKHJjID09IDApIHsKLSAgICAgIHJlc3VsdC5yZXNpemUocmVzdWx0LnNpemUoKSAtIFBBR0VfU0laRSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXN1bHQucmVzaXplKHJlc3VsdC5zaXplKCkgLSBQQUdFX1NJWkUgKyByYyk7Ci0gIH0KLQotICAqb3V0cHV0ID0gc3RkOjptb3ZlKHJlc3VsdCk7CisgIEFTU0VSVF9UUlVFKGFuZHJvaWQ6OmJhc2U6OlJlYWRGZFRvU3RyaW5nKGZkLCBvdXRwdXQpKTsKIH0KIAogY2xhc3MgTG9nY2F0Q29sbGVjdG9yIHsKQEAgLTM0OSwxMiArMzMzLDcgQEAKIAogICBzdGQ6OnN0cmluZyByZXN1bHQ7CiAgIENvbnN1bWVGZChzdGQ6Om1vdmUob3V0cHV0X2ZkKSwgJnJlc3VsdCk7Ci0jaWZkZWYgX19MUDY0X18KLSAgQVNTRVJUX01BVENIKHJlc3VsdCwKLSAgICAgICAgICAgICAgIFIiKHNpZ25hbCAxMSBcKFNJR1NFR1ZcKSwgY29kZSAxIFwoU0VHVl9NQVBFUlJcKSwgZmF1bHQgYWRkciAweDAwMDAwMDAwMDAwMGRlYWQpIik7Ci0jZWxzZQotICBBU1NFUlRfTUFUQ0gocmVzdWx0LCBSIihzaWduYWwgMTEgXChTSUdTRUdWXCksIGNvZGUgMSBcKFNFR1ZfTUFQRVJSXCksIGZhdWx0IGFkZHIgMHgwMDAwZGVhZCkiKTsKLSNlbmRpZgorICBBU1NFUlRfTUFUQ0gocmVzdWx0LCBSIihzaWduYWwgMTEgXChTSUdTRUdWXCksIGNvZGUgMSBcKFNFR1ZfTUFQRVJSXCksIGZhdWx0IGFkZHIgMHgwK2RlYWQpIik7CiAKICAgaWYgKG10ZV9zdXBwb3J0ZWQoKSkgewogICAgIC8vIFRlc3QgdGhhdCB0aGUgZGVmYXVsdCBUQUdHRURfQUREUl9DVFJMIHZhbHVlIGlzIHNldC4KQEAgLTYxOSw2ICs1OTgsNTQgQEAKICNlbmRpZgogfQogCitfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpIHZvaWQgbXRlX2lsbGVnYWxfc2V0am1wX2hlbHBlcihqbXBfYnVmJiBqdW1wX2J1ZikgeworICAvLyBUaGlzIGZyYW1lIGlzIGF0IGxlYXN0IDggYnl0ZXMgZm9yIHN0b3JpbmcgYW5kIHJlc3RvcmluZyB0aGUgTFIgYmVmb3JlIHRoZQorICAvLyBzZXRqbXAgYmVsb3cuIFNvIHRoaXMgY2FuIG5ldmVyIGdldCBhbiBlbXB0eSBzdGFjayBmcmFtZSwgZXZlbiBpZiB3ZSBvbWl0CisgIC8vIHRoZSBmcmFtZSBwb2ludGVyLiBTbywgdGhlIFNQIG9mIHRoaXMgaXMgYWx3YXlzIGxlc3MgKG51bWVyaWNhbGx5KSB0aGFuIHRoZQorICAvLyBjYWxsaW5nIGZ1bmN0aW9uIGZyYW1lLgorICBzZXRqbXAoanVtcF9idWYpOworfQorCitURVNUX0YoQ3Jhc2hlclRlc3QsIERJU0FCTEVEX210ZV9pbGxlZ2FsX3NldGptcCkgeworICAvLyBUaGlzIHNldGptcCBpcyBpbGxlZ2FsIGJlY2F1c2UgaXQganVtcHMgYmFjayBpbnRvIGEgZnVuY3Rpb24gdGhhdCBhbHJlYWR5IHJldHVybmVkLgorICAvLyBRdW90aW5nIG1hbiAzIHNldGptcDoKKyAgLy8gICAgIElmIHRoZSBmdW5jdGlvbiB3aGljaCBjYWxsZWQgc2V0am1wKCkgcmV0dXJucyBiZWZvcmUgbG9uZ2ptcCgpIGlzCisgIC8vICAgICBjYWxsZWQsIHRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWQuICBTb21lIGtpbmQgb2Ygc3VidGxlIG9yCisgIC8vICAgICB1bnN1YnRsZSBjaGFvcyBpcyBzdXJlIHRvIHJlc3VsdC4KKyAgLy8gaHR0cHM6Ly9tYW43Lm9yZy9saW51eC9tYW4tcGFnZXMvbWFuMy9sb25nam1wLjMuaHRtbAorI2lmIGRlZmluZWQoX19hYXJjaDY0X18pCisgIGlmICghbXRlX3N1cHBvcnRlZCgpKSB7CisgICAgR1RFU1RfU0tJUCgpIDw8ICJSZXF1aXJlcyBNVEUiOworICB9CisKKyAgaW50IGludGVyY2VwdF9yZXN1bHQ7CisgIHVuaXF1ZV9mZCBvdXRwdXRfZmQ7CisgIFN0YXJ0UHJvY2VzcyhbJl0oKSB7CisgICAgU2V0VGFnQ2hlY2tpbmdMZXZlbFN5bmMoKTsKKyAgICBqbXBfYnVmIGp1bXBfYnVmOworICAgIG10ZV9pbGxlZ2FsX3NldGptcF9oZWxwZXIoanVtcF9idWYpOworICAgIGxvbmdqbXAoanVtcF9idWYsIDEpOworICB9KTsKKworICBTdGFydEludGVyY2VwdCgmb3V0cHV0X2ZkKTsKKyAgRmluaXNoQ3Jhc2hlcigpOworICBBc3NlcnREZWF0aChTSUdBQlJUKTsKKyAgRmluaXNoSW50ZXJjZXB0KCZpbnRlcmNlcHRfcmVzdWx0KTsKKworICBBU1NFUlRfRVEoMSwgaW50ZXJjZXB0X3Jlc3VsdCkgPDwgInRvbWJzdG9uZWQgcmVwb3J0ZWQgZmFpbHVyZSI7CisKKyAgc3RkOjpzdHJpbmcgcmVzdWx0OworICBDb25zdW1lRmQoc3RkOjptb3ZlKG91dHB1dF9mZCksICZyZXN1bHQpOworCisgIC8vIEluIG91ciB0ZXN0LWNhc2UsIHdlIGhhdmUgYSBORUdBVElWRSBzdGFjayBhZGp1c3RtZW50LCB3aGljaCBpcyBiZWluZworICAvLyBpbnRlcnByZXRlZCBhcyB1bnNpZ25lZCBpbnRlZ2VyLCBhbmQgdGh1cyBpcyAidG9vIGxhcmdlIi4KKyAgLy8gVE9ETyhmbWF5ZXIpOiBmaXggdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoaXMKKyAgQVNTRVJUX01BVENIKHJlc3VsdCwgUiIobWVtdGFnX2hhbmRsZV9sb25nam1wOiBzdGFjayBhZGp1c3RtZW50IHRvbyBsYXJnZSkiKTsKKyNlbHNlCisgIEdURVNUX1NLSVAoKSA8PCAiUmVxdWlyZXMgYWFyY2g2NCI7CisjZW5kaWYKK30KKwogVEVTVF9GKENyYXNoZXJUZXN0LCBtdGVfYXN5bmMpIHsKICNpZiBkZWZpbmVkKF9fYWFyY2g2NF9fKQogICBpZiAoIW10ZV9zdXBwb3J0ZWQoKSkgewpAQCAtOTU4LDYgKzk4NSwyMzMgQEAKICAgQVNTRVJUX01BVENIKHJlc3VsdCwgUiIoQWJvcnQgbWVzc2FnZTogJ3h7NDA0NX0nKSIpOwogfQogCitzdGF0aWMgY2hhciBnX2NyYXNoX2RldGFpbF92YWx1ZV9jaGFuZ2VzW10gPSAiY3Jhc2hfZGV0YWlsX3ZhbHVlIjsKK3N0YXRpYyBjaGFyIGdfY3Jhc2hfZGV0YWlsX3ZhbHVlW10gPSAiY3Jhc2hfZGV0YWlsX3ZhbHVlIjsKK3N0YXRpYyBjaGFyIGdfY3Jhc2hfZGV0YWlsX3ZhbHVlMltdID0gImNyYXNoX2RldGFpbF92YWx1ZTIiOworCitpbmxpbmUgY3Jhc2hfZGV0YWlsX3QqIF9OdWxsYWJsZSBhbmRyb2lkX3JlZ2lzdGVyX2NyYXNoX2RldGFpbF9zdHJzKGNvbnN0IGNoYXIqIF9Ob25udWxsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIF9Ob25udWxsIGRhdGEpIHsKKyAgcmV0dXJuIGFuZHJvaWRfY3Jhc2hfZGV0YWlsX3JlZ2lzdGVyKG5hbWUsIHN0cmxlbihuYW1lKSwgZGF0YSwgc3RybGVuKGRhdGEpKTsKK30KKworVEVTVF9GKENyYXNoZXJUZXN0LCBjcmFzaF9kZXRhaWxfc2luZ2xlKSB7CisgIGludCBpbnRlcmNlcHRfcmVzdWx0OworICB1bmlxdWVfZmQgb3V0cHV0X2ZkOworICBTdGFydFByb2Nlc3MoW10oKSB7CisgICAgYW5kcm9pZF9yZWdpc3Rlcl9jcmFzaF9kZXRhaWxfc3RycygiQ1JBU0hfREVUQUlMX05BTUUiLCBnX2NyYXNoX2RldGFpbF92YWx1ZSk7CisgICAgYWJvcnQoKTsKKyAgfSk7CisgIFN0YXJ0SW50ZXJjZXB0KCZvdXRwdXRfZmQpOworICBGaW5pc2hDcmFzaGVyKCk7CisgIEFzc2VydERlYXRoKFNJR0FCUlQpOworICBGaW5pc2hJbnRlcmNlcHQoJmludGVyY2VwdF9yZXN1bHQpOworCisgIEFTU0VSVF9FUSgxLCBpbnRlcmNlcHRfcmVzdWx0KSA8PCAidG9tYnN0b25lZCByZXBvcnRlZCBmYWlsdXJlIjsKKworICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgIENvbnN1bWVGZChzdGQ6Om1vdmUob3V0cHV0X2ZkKSwgJnJlc3VsdCk7CisgIEFTU0VSVF9NQVRDSChyZXN1bHQsIFIiKENSQVNIX0RFVEFJTF9OQU1FOiAnY3Jhc2hfZGV0YWlsX3ZhbHVlJykiKTsKK30KKworVEVTVF9GKENyYXNoZXJUZXN0LCBjcmFzaF9kZXRhaWxfcmVwbGFjZV9kYXRhKSB7CisgIGludCBpbnRlcmNlcHRfcmVzdWx0OworICB1bmlxdWVfZmQgb3V0cHV0X2ZkOworICBTdGFydFByb2Nlc3MoW10oKSB7CisgICAgYXV0byAqY2QgPSBhbmRyb2lkX3JlZ2lzdGVyX2NyYXNoX2RldGFpbF9zdHJzKCJDUkFTSF9ERVRBSUxfTkFNRSIsICJvcmlnaW5hbF9kYXRhIik7CisgICAgYW5kcm9pZF9jcmFzaF9kZXRhaWxfcmVwbGFjZV9kYXRhKGNkLCAibmV3X2RhdGEiLCBzdHJsZW4oIm5ld19kYXRhIikpOworICAgIGFib3J0KCk7CisgIH0pOworICBTdGFydEludGVyY2VwdCgmb3V0cHV0X2ZkKTsKKyAgRmluaXNoQ3Jhc2hlcigpOworICBBc3NlcnREZWF0aChTSUdBQlJUKTsKKyAgRmluaXNoSW50ZXJjZXB0KCZpbnRlcmNlcHRfcmVzdWx0KTsKKworICBBU1NFUlRfRVEoMSwgaW50ZXJjZXB0X3Jlc3VsdCkgPDwgInRvbWJzdG9uZWQgcmVwb3J0ZWQgZmFpbHVyZSI7CisKKyAgc3RkOjpzdHJpbmcgcmVzdWx0OworICBDb25zdW1lRmQoc3RkOjptb3ZlKG91dHB1dF9mZCksICZyZXN1bHQpOworICBBU1NFUlRfTUFUQ0gocmVzdWx0LCBSIihDUkFTSF9ERVRBSUxfTkFNRTogJ25ld19kYXRhJykiKTsKKyAgLy8gRW5zdXJlIHRoZSBvbGQgb25lIG5vIGxvbmdlciBzaG93cyB1cCwgaS5lLiB0aGF0IHdlIGFjdHVhbGx5IHJlcGxhY2VkCisgIC8vIGl0LCBub3QgYWRkZWQgYSBuZXcgb25lLgorICBBU1NFUlRfTk9UX01BVENIKHJlc3VsdCwgUiIoQ1JBU0hfREVUQUlMX05BTUU6ICdvcmlnaW5hbF9kYXRhJykiKTsKK30KKworVEVTVF9GKENyYXNoZXJUZXN0LCBjcmFzaF9kZXRhaWxfcmVwbGFjZV9uYW1lKSB7CisgIGludCBpbnRlcmNlcHRfcmVzdWx0OworICB1bmlxdWVfZmQgb3V0cHV0X2ZkOworICBTdGFydFByb2Nlc3MoW10oKSB7CisgICAgYXV0byAqY2QgPSBhbmRyb2lkX3JlZ2lzdGVyX2NyYXNoX2RldGFpbF9zdHJzKCJvbGRfbmFtZSIsIGdfY3Jhc2hfZGV0YWlsX3ZhbHVlKTsKKyAgICBhbmRyb2lkX2NyYXNoX2RldGFpbF9yZXBsYWNlX25hbWUoY2QsICJuZXdfbmFtZSIsIHN0cmxlbigibmV3X25hbWUiKSk7CisgICAgYWJvcnQoKTsKKyAgfSk7CisgIFN0YXJ0SW50ZXJjZXB0KCZvdXRwdXRfZmQpOworICBGaW5pc2hDcmFzaGVyKCk7CisgIEFzc2VydERlYXRoKFNJR0FCUlQpOworICBGaW5pc2hJbnRlcmNlcHQoJmludGVyY2VwdF9yZXN1bHQpOworCisgIEFTU0VSVF9FUSgxLCBpbnRlcmNlcHRfcmVzdWx0KSA8PCAidG9tYnN0b25lZCByZXBvcnRlZCBmYWlsdXJlIjsKKworICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgIENvbnN1bWVGZChzdGQ6Om1vdmUob3V0cHV0X2ZkKSwgJnJlc3VsdCk7CisgIEFTU0VSVF9NQVRDSChyZXN1bHQsIFIiKG5ld19uYW1lOiAnY3Jhc2hfZGV0YWlsX3ZhbHVlJykiKTsKKyAgLy8gRW5zdXJlIHRoZSBvbGQgb25lIG5vIGxvbmdlciBzaG93cyB1cCwgaS5lLiB0aGF0IHdlIGFjdHVhbGx5IHJlcGxhY2VkCisgIC8vIGl0LCBub3QgYWRkZWQgYSBuZXcgb25lLgorICBBU1NFUlRfTk9UX01BVENIKHJlc3VsdCwgUiIob2xkX25hbWU6ICdjcmFzaF9kZXRhaWxfdmFsdWUnKSIpOworfQorCitURVNUX0YoQ3Jhc2hlclRlc3QsIGNyYXNoX2RldGFpbF9zaW5nbGVfYnl0ZV9uYW1lKSB7CisgIGludCBpbnRlcmNlcHRfcmVzdWx0OworICB1bmlxdWVfZmQgb3V0cHV0X2ZkOworICBTdGFydFByb2Nlc3MoW10oKSB7CisgICAgYW5kcm9pZF9yZWdpc3Rlcl9jcmFzaF9kZXRhaWxfc3RycygiQ1JBU0hfREVUQUlMX05BTUVcMSIsIGdfY3Jhc2hfZGV0YWlsX3ZhbHVlKTsKKyAgICBhYm9ydCgpOworICB9KTsKKyAgU3RhcnRJbnRlcmNlcHQoJm91dHB1dF9mZCk7CisgIEZpbmlzaENyYXNoZXIoKTsKKyAgQXNzZXJ0RGVhdGgoU0lHQUJSVCk7CisgIEZpbmlzaEludGVyY2VwdCgmaW50ZXJjZXB0X3Jlc3VsdCk7CisKKyAgQVNTRVJUX0VRKDEsIGludGVyY2VwdF9yZXN1bHQpIDw8ICJ0b21ic3RvbmVkIHJlcG9ydGVkIGZhaWx1cmUiOworCisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgQ29uc3VtZUZkKHN0ZDo6bW92ZShvdXRwdXRfZmQpLCAmcmVzdWx0KTsKKyAgQVNTRVJUX01BVENIKHJlc3VsdCwgUiIoQ1JBU0hfREVUQUlMX05BTUVcXDE6ICdjcmFzaF9kZXRhaWxfdmFsdWUnKSIpOworfQorCisKK1RFU1RfRihDcmFzaGVyVGVzdCwgY3Jhc2hfZGV0YWlsX3NpbmdsZV9ieXRlcykgeworICBpbnQgaW50ZXJjZXB0X3Jlc3VsdDsKKyAgdW5pcXVlX2ZkIG91dHB1dF9mZDsKKyAgU3RhcnRQcm9jZXNzKFtdKCkgeworICAgIGFuZHJvaWRfY3Jhc2hfZGV0YWlsX3JlZ2lzdGVyKCJDUkFTSF9ERVRBSUxfTkFNRSIsIHN0cmxlbigiQ1JBU0hfREVUQUlMX05BTUUiKSwgIlwxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIlwxIikpOworICAgIGFib3J0KCk7CisgIH0pOworICBTdGFydEludGVyY2VwdCgmb3V0cHV0X2ZkKTsKKyAgRmluaXNoQ3Jhc2hlcigpOworICBBc3NlcnREZWF0aChTSUdBQlJUKTsKKyAgRmluaXNoSW50ZXJjZXB0KCZpbnRlcmNlcHRfcmVzdWx0KTsKKworICBBU1NFUlRfRVEoMSwgaW50ZXJjZXB0X3Jlc3VsdCkgPDwgInRvbWJzdG9uZWQgcmVwb3J0ZWQgZmFpbHVyZSI7CisKKyAgc3RkOjpzdHJpbmcgcmVzdWx0OworICBDb25zdW1lRmQoc3RkOjptb3ZlKG91dHB1dF9mZCksICZyZXN1bHQpOworICBBU1NFUlRfTUFUQ0gocmVzdWx0LCBSIihDUkFTSF9ERVRBSUxfTkFNRTogJ1xcMVxcMCcpIik7Cit9CisKK1RFU1RfRihDcmFzaGVyVGVzdCwgY3Jhc2hfZGV0YWlsX21peGVkKSB7CisgIGludCBpbnRlcmNlcHRfcmVzdWx0OworICB1bmlxdWVfZmQgb3V0cHV0X2ZkOworICBTdGFydFByb2Nlc3MoW10oKSB7CisgICAgY29uc3QgY2hhciBkYXRhW10gPSAiaGVsbG93b3JsZFwxXDI1NVwzIjsKKyAgICBhbmRyb2lkX3JlZ2lzdGVyX2NyYXNoX2RldGFpbF9zdHJzKCJDUkFTSF9ERVRBSUxfTkFNRSIsIGRhdGEpOworICAgIGFib3J0KCk7CisgIH0pOworICBTdGFydEludGVyY2VwdCgmb3V0cHV0X2ZkKTsKKyAgRmluaXNoQ3Jhc2hlcigpOworICBBc3NlcnREZWF0aChTSUdBQlJUKTsKKyAgRmluaXNoSW50ZXJjZXB0KCZpbnRlcmNlcHRfcmVzdWx0KTsKKworICBBU1NFUlRfRVEoMSwgaW50ZXJjZXB0X3Jlc3VsdCkgPDwgInRvbWJzdG9uZWQgcmVwb3J0ZWQgZmFpbHVyZSI7CisKKyAgc3RkOjpzdHJpbmcgcmVzdWx0OworICBDb25zdW1lRmQoc3RkOjptb3ZlKG91dHB1dF9mZCksICZyZXN1bHQpOworICBBU1NFUlRfTUFUQ0gocmVzdWx0LCBSIihDUkFTSF9ERVRBSUxfTkFNRTogJ2hlbGxvd29ybGRcXDFcXDI1NVxcMycpIik7Cit9CisKK1RFU1RfRihDcmFzaGVyVGVzdCwgY3Jhc2hfZGV0YWlsX21hbnkpIHsKKyAgaW50IGludGVyY2VwdF9yZXN1bHQ7CisgIHVuaXF1ZV9mZCBvdXRwdXRfZmQ7CisgIFN0YXJ0UHJvY2VzcyhbXSgpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7ICsraSkgeworICAgICAgc3RkOjpzdHJpbmcgbmFtZSA9ICJDUkFTSF9ERVRBSUxfTkFNRSIgKyBzdGQ6OnRvX3N0cmluZyhpKTsKKyAgICAgIHN0ZDo6c3RyaW5nIHZhbHVlID0gIkNSQVNIX0RFVEFJTF9WQUxVRSIgKyBzdGQ6OnRvX3N0cmluZyhpKTsKKyAgICAgIGF1dG8qIGggPSBhbmRyb2lkX3JlZ2lzdGVyX2NyYXNoX2RldGFpbF9zdHJzKG5hbWUuZGF0YSgpLCB2YWx1ZS5kYXRhKCkpOworICAgICAgYW5kcm9pZF9jcmFzaF9kZXRhaWxfdW5yZWdpc3RlcihoKTsKKyAgICB9CisKKyAgICBhbmRyb2lkX3JlZ2lzdGVyX2NyYXNoX2RldGFpbF9zdHJzKCJGSU5BTF9OQU1FIiwgIkZJTkFMX1ZBTFVFIik7CisgICAgYW5kcm9pZF9yZWdpc3Rlcl9jcmFzaF9kZXRhaWxfc3RycygiRklOQUxfTkFNRTIiLCAiRklOQUxfVkFMVUUyIik7CisgICAgYWJvcnQoKTsKKyAgfSk7CisgIFN0YXJ0SW50ZXJjZXB0KCZvdXRwdXRfZmQpOworICBGaW5pc2hDcmFzaGVyKCk7CisgIEFzc2VydERlYXRoKFNJR0FCUlQpOworICBGaW5pc2hJbnRlcmNlcHQoJmludGVyY2VwdF9yZXN1bHQpOworCisgIEFTU0VSVF9FUSgxLCBpbnRlcmNlcHRfcmVzdWx0KSA8PCAidG9tYnN0b25lZCByZXBvcnRlZCBmYWlsdXJlIjsKKworICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgIENvbnN1bWVGZChzdGQ6Om1vdmUob3V0cHV0X2ZkKSwgJnJlc3VsdCk7CisgIEFTU0VSVF9OT1RfTUFUQ0gocmVzdWx0LCAiQ1JBU0hfREVUQUlMX05BTUUiKTsKKyAgQVNTRVJUX05PVF9NQVRDSChyZXN1bHQsICJDUkFTSF9ERVRBSUxfVkFMVUUiKTsKKyAgQVNTRVJUX01BVENIKHJlc3VsdCwgUiIoRklOQUxfTkFNRTogJ0ZJTkFMX1ZBTFVFJykiKTsKKyAgQVNTRVJUX01BVENIKHJlc3VsdCwgUiIoRklOQUxfTkFNRTI6ICdGSU5BTF9WQUxVRTInKSIpOworfQorCitURVNUX0YoQ3Jhc2hlclRlc3QsIGNyYXNoX2RldGFpbF9zaW5nbGVfY2hhbmdlcykgeworICBpbnQgaW50ZXJjZXB0X3Jlc3VsdDsKKyAgdW5pcXVlX2ZkIG91dHB1dF9mZDsKKyAgU3RhcnRQcm9jZXNzKFtdKCkgeworICAgIGFuZHJvaWRfcmVnaXN0ZXJfY3Jhc2hfZGV0YWlsX3N0cnMoIkNSQVNIX0RFVEFJTF9OQU1FIiwgZ19jcmFzaF9kZXRhaWxfdmFsdWVfY2hhbmdlcyk7CisgICAgZ19jcmFzaF9kZXRhaWxfdmFsdWVfY2hhbmdlc1swXSA9ICdDJzsKKyAgICBhYm9ydCgpOworICB9KTsKKyAgU3RhcnRJbnRlcmNlcHQoJm91dHB1dF9mZCk7CisgIEZpbmlzaENyYXNoZXIoKTsKKyAgQXNzZXJ0RGVhdGgoU0lHQUJSVCk7CisgIEZpbmlzaEludGVyY2VwdCgmaW50ZXJjZXB0X3Jlc3VsdCk7CisKKyAgQVNTRVJUX0VRKDEsIGludGVyY2VwdF9yZXN1bHQpIDw8ICJ0b21ic3RvbmVkIHJlcG9ydGVkIGZhaWx1cmUiOworCisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgQ29uc3VtZUZkKHN0ZDo6bW92ZShvdXRwdXRfZmQpLCAmcmVzdWx0KTsKKyAgQVNTRVJUX01BVENIKHJlc3VsdCwgUiIoQ1JBU0hfREVUQUlMX05BTUU6ICdDcmFzaF9kZXRhaWxfdmFsdWUnKSIpOworfQorCitURVNUX0YoQ3Jhc2hlclRlc3QsIGNyYXNoX2RldGFpbF9tdWx0aXBsZSkgeworICBpbnQgaW50ZXJjZXB0X3Jlc3VsdDsKKyAgdW5pcXVlX2ZkIG91dHB1dF9mZDsKKyAgU3RhcnRQcm9jZXNzKFtdKCkgeworICAgIGFuZHJvaWRfcmVnaXN0ZXJfY3Jhc2hfZGV0YWlsX3N0cnMoIkNSQVNIX0RFVEFJTF9OQU1FIiwgZ19jcmFzaF9kZXRhaWxfdmFsdWUpOworICAgIGFuZHJvaWRfcmVnaXN0ZXJfY3Jhc2hfZGV0YWlsX3N0cnMoIkNSQVNIX0RFVEFJTF9OQU1FMiIsIGdfY3Jhc2hfZGV0YWlsX3ZhbHVlMik7CisgICAgYWJvcnQoKTsKKyAgfSk7CisgIFN0YXJ0SW50ZXJjZXB0KCZvdXRwdXRfZmQpOworICBGaW5pc2hDcmFzaGVyKCk7CisgIEFzc2VydERlYXRoKFNJR0FCUlQpOworICBGaW5pc2hJbnRlcmNlcHQoJmludGVyY2VwdF9yZXN1bHQpOworCisgIEFTU0VSVF9FUSgxLCBpbnRlcmNlcHRfcmVzdWx0KSA8PCAidG9tYnN0b25lZCByZXBvcnRlZCBmYWlsdXJlIjsKKworICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgIENvbnN1bWVGZChzdGQ6Om1vdmUob3V0cHV0X2ZkKSwgJnJlc3VsdCk7CisgIEFTU0VSVF9NQVRDSChyZXN1bHQsIFIiKENSQVNIX0RFVEFJTF9OQU1FOiAnY3Jhc2hfZGV0YWlsX3ZhbHVlJykiKTsKKyAgQVNTRVJUX01BVENIKHJlc3VsdCwgUiIoQ1JBU0hfREVUQUlMX05BTUUyOiAnY3Jhc2hfZGV0YWlsX3ZhbHVlMicpIik7Cit9CisKK1RFU1RfRihDcmFzaGVyVGVzdCwgY3Jhc2hfZGV0YWlsX3JlbW92ZSkgeworICBpbnQgaW50ZXJjZXB0X3Jlc3VsdDsKKyAgdW5pcXVlX2ZkIG91dHB1dF9mZDsKKyAgU3RhcnRQcm9jZXNzKFtdKCkgeworICAgIGF1dG8qIGRldGFpbDEgPSBhbmRyb2lkX3JlZ2lzdGVyX2NyYXNoX2RldGFpbF9zdHJzKCJDUkFTSF9ERVRBSUxfTkFNRSIsIGdfY3Jhc2hfZGV0YWlsX3ZhbHVlKTsKKyAgICBhbmRyb2lkX2NyYXNoX2RldGFpbF91bnJlZ2lzdGVyKGRldGFpbDEpOworICAgIGFuZHJvaWRfcmVnaXN0ZXJfY3Jhc2hfZGV0YWlsX3N0cnMoIkNSQVNIX0RFVEFJTF9OQU1FMiIsIGdfY3Jhc2hfZGV0YWlsX3ZhbHVlMik7CisgICAgYWJvcnQoKTsKKyAgfSk7CisgIFN0YXJ0SW50ZXJjZXB0KCZvdXRwdXRfZmQpOworICBGaW5pc2hDcmFzaGVyKCk7CisgIEFzc2VydERlYXRoKFNJR0FCUlQpOworICBGaW5pc2hJbnRlcmNlcHQoJmludGVyY2VwdF9yZXN1bHQpOworCisgIEFTU0VSVF9FUSgxLCBpbnRlcmNlcHRfcmVzdWx0KSA8PCAidG9tYnN0b25lZCByZXBvcnRlZCBmYWlsdXJlIjsKKworICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgIENvbnN1bWVGZChzdGQ6Om1vdmUob3V0cHV0X2ZkKSwgJnJlc3VsdCk7CisgIEFTU0VSVF9OT1RfTUFUQ0gocmVzdWx0LCBSIihDUkFTSF9ERVRBSUxfTkFNRTogJ2NyYXNoX2RldGFpbF92YWx1ZScpIik7CisgIEFTU0VSVF9NQVRDSChyZXN1bHQsIFIiKENSQVNIX0RFVEFJTF9OQU1FMjogJ2NyYXNoX2RldGFpbF92YWx1ZTInKSIpOworfQorCiBURVNUX0YoQ3Jhc2hlclRlc3QsIGFib3J0X21lc3NhZ2VfbmV3bGluZV90cmltbWVkKSB7CiAgIGludCBpbnRlcmNlcHRfcmVzdWx0OwogICB1bmlxdWVfZmQgb3V0cHV0X2ZkOwpAQCAtMTQwOSw2ICsxNjYzLDkgQEAKIAogICBzdGQ6OnN0cmluZyByZXN1bHQ7CiAgIENvbnN1bWVGZChzdGQ6Om1vdmUob3V0cHV0X2ZkKSwgJnJlc3VsdCk7CisgIEFTU0VSVF9NQVRDSCgKKyAgICAgIHJlc3VsdCwKKyAgICAgIFIiKHNpZ25hbCA2IFwoU0lHQUJSVFwpKSIpOwogICBBU1NFUlRfQkFDS1RSQUNFX0ZSQU1FKHJlc3VsdCwgImFib3J0Iik7CiB9CiAKQEAgLTE1MTUsNiArMTc3Miw3NSBAQAogICBBc3NlcnREZWF0aChTSUdBQlJUKTsKIH0KIAorZXh0ZXJuICJDIiB2b2lkIG1hbGxvY19lbmFibGUoKTsKK2V4dGVybiAiQyIgdm9pZCBtYWxsb2NfZGlzYWJsZSgpOworCitURVNUX0YoQ3Jhc2hlclRlc3QsIHNlY2NvbXBfdG9tYnN0b25lX25vX2FsbG9jYXRpb24pIHsKKyAgaW50IGludGVyY2VwdF9yZXN1bHQ7CisgIHVuaXF1ZV9mZCBvdXRwdXRfZmQ7CisKKyAgc3RhdGljIGNvbnN0IGF1dG8gZHVtcF90eXBlID0ga0RlYnVnZ2VyZFRvbWJzdG9uZTsKKyAgU3RhcnRQcm9jZXNzKAorICAgICAgW10oKSB7CisgICAgICAgIHN0ZDo6dGhyZWFkIGEoZm9vKTsKKyAgICAgICAgc3RkOjp0aHJlYWQgYihiYXIpOworCisgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcigxMDBtcyk7CisKKyAgICAgICAgLy8gRGlzYWJsZSBhbGxvY2F0aW9ucyB0byB2ZXJpZnkgdGhhdCBub3RoaW5nIGluIHRoZSBmYWxsYmFjaworICAgICAgICAvLyBzaWduYWwgaGFuZGxlciBkb2VzIGFuIGFsbG9jYXRpb24uCisgICAgICAgIG1hbGxvY19kaXNhYmxlKCk7CisgICAgICAgIHJhaXNlX2RlYnVnZ2VyX3NpZ25hbChkdW1wX3R5cGUpOworICAgICAgICBfZXhpdCgwKTsKKyAgICAgIH0sCisgICAgICAmc2VjY29tcF9mb3JrKTsKKworICBTdGFydEludGVyY2VwdCgmb3V0cHV0X2ZkLCBkdW1wX3R5cGUpOworICBGaW5pc2hDcmFzaGVyKCk7CisgIEFzc2VydERlYXRoKDApOworICBGaW5pc2hJbnRlcmNlcHQoJmludGVyY2VwdF9yZXN1bHQpOworICBBU1NFUlRfRVEoMSwgaW50ZXJjZXB0X3Jlc3VsdCkgPDwgInRvbWJzdG9uZWQgcmVwb3J0ZWQgZmFpbHVyZSI7CisKKyAgc3RkOjpzdHJpbmcgcmVzdWx0OworICBDb25zdW1lRmQoc3RkOjptb3ZlKG91dHB1dF9mZCksICZyZXN1bHQpOworICBBU1NFUlRfQkFDS1RSQUNFX0ZSQU1FKHJlc3VsdCwgInJhaXNlX2RlYnVnZ2VyX3NpZ25hbCIpOworICBBU1NFUlRfQkFDS1RSQUNFX0ZSQU1FKHJlc3VsdCwgImZvbyIpOworICBBU1NFUlRfQkFDS1RSQUNFX0ZSQU1FKHJlc3VsdCwgImJhciIpOworfQorCitURVNUX0YoQ3Jhc2hlclRlc3QsIHNlY2NvbXBfYmFja3RyYWNlX25vX2FsbG9jYXRpb24pIHsKKyAgaW50IGludGVyY2VwdF9yZXN1bHQ7CisgIHVuaXF1ZV9mZCBvdXRwdXRfZmQ7CisKKyAgc3RhdGljIGNvbnN0IGF1dG8gZHVtcF90eXBlID0ga0RlYnVnZ2VyZE5hdGl2ZUJhY2t0cmFjZTsKKyAgU3RhcnRQcm9jZXNzKAorICAgICAgW10oKSB7CisgICAgICAgIHN0ZDo6dGhyZWFkIGEoZm9vKTsKKyAgICAgICAgc3RkOjp0aHJlYWQgYihiYXIpOworCisgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcigxMDBtcyk7CisKKyAgICAgICAgLy8gRGlzYWJsZSBhbGxvY2F0aW9ucyB0byB2ZXJpZnkgdGhhdCBub3RoaW5nIGluIHRoZSBmYWxsYmFjaworICAgICAgICAvLyBzaWduYWwgaGFuZGxlciBkb2VzIGFuIGFsbG9jYXRpb24uCisgICAgICAgIG1hbGxvY19kaXNhYmxlKCk7CisgICAgICAgIHJhaXNlX2RlYnVnZ2VyX3NpZ25hbChkdW1wX3R5cGUpOworICAgICAgICBfZXhpdCgwKTsKKyAgICAgIH0sCisgICAgICAmc2VjY29tcF9mb3JrKTsKKworICBTdGFydEludGVyY2VwdCgmb3V0cHV0X2ZkLCBkdW1wX3R5cGUpOworICBGaW5pc2hDcmFzaGVyKCk7CisgIEFzc2VydERlYXRoKDApOworICBGaW5pc2hJbnRlcmNlcHQoJmludGVyY2VwdF9yZXN1bHQpOworICBBU1NFUlRfRVEoMSwgaW50ZXJjZXB0X3Jlc3VsdCkgPDwgInRvbWJzdG9uZWQgcmVwb3J0ZWQgZmFpbHVyZSI7CisKKyAgc3RkOjpzdHJpbmcgcmVzdWx0OworICBDb25zdW1lRmQoc3RkOjptb3ZlKG91dHB1dF9mZCksICZyZXN1bHQpOworICBBU1NFUlRfQkFDS1RSQUNFX0ZSQU1FKHJlc3VsdCwgInJhaXNlX2RlYnVnZ2VyX3NpZ25hbCIpOworICBBU1NFUlRfQkFDS1RSQUNFX0ZSQU1FKHJlc3VsdCwgImZvbyIpOworICBBU1NFUlRfQkFDS1RSQUNFX0ZSQU1FKHJlc3VsdCwgImJhciIpOworfQorCiBURVNUX0YoQ3Jhc2hlclRlc3QsIGNvbXBldGluZ190cmFjZXIpIHsKICAgaW50IGludGVyY2VwdF9yZXN1bHQ7CiAgIHVuaXF1ZV9mZCBvdXRwdXRfZmQ7CkBAIC0xNTY4LDEwICsxODk0LDE0IEBACiAgICAgICJVc2UgQWZ0ZXIgRnJlZSwgMCBieXRlcyBpbnRvIGEgNy1ieXRlIGFsbG9jYXRpb24ifSwKICAgICB7LyogYWxsb2Nfc2l6ZSAqLyAxNSwgLyogZnJlZV9iZWZvcmVfYWNjZXNzICovIHRydWUsIC8qIGFjY2Vzc19vZmZzZXQgKi8gMSwKICAgICAgIlVzZSBBZnRlciBGcmVlLCAxIGJ5dGUgaW50byBhIDE1LWJ5dGUgYWxsb2NhdGlvbiJ9LAotICAgIHsvKiBhbGxvY19zaXplICovIDQwOTYsIC8qIGZyZWVfYmVmb3JlX2FjY2VzcyAqLyBmYWxzZSwgLyogYWNjZXNzX29mZnNldCAqLyA0MDk4LAotICAgICAiQnVmZmVyIE92ZXJmbG93LCAyIGJ5dGVzIHJpZ2h0IG9mIGEgNDA5Ni1ieXRlIGFsbG9jYXRpb24ifSwKLSAgICB7LyogYWxsb2Nfc2l6ZSAqLyA0MDk2LCAvKiBmcmVlX2JlZm9yZV9hY2Nlc3MgKi8gZmFsc2UsIC8qIGFjY2Vzc19vZmZzZXQgKi8gLTEsCi0gICAgICJCdWZmZXIgVW5kZXJmbG93LCAxIGJ5dGUgbGVmdCBvZiBhIDQwOTYtYnl0ZSBhbGxvY2F0aW9uIn0sCisgICAgey8qIGFsbG9jX3NpemUgKi8gc3RhdGljX2Nhc3Q8c2l6ZV90PihnZXRwYWdlc2l6ZSgpKSwgLyogZnJlZV9iZWZvcmVfYWNjZXNzICovIGZhbHNlLAorICAgICAvKiBhY2Nlc3Nfb2Zmc2V0ICovIGdldHBhZ2VzaXplKCkgKyAyLAorICAgICBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoIkJ1ZmZlciBPdmVyZmxvdywgMiBieXRlcyByaWdodCBvZiBhICVkLWJ5dGUgYWxsb2NhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRwYWdlc2l6ZSgpKX0sCisgICAgey8qIGFsbG9jX3NpemUgKi8gc3RhdGljX2Nhc3Q8c2l6ZV90PihnZXRwYWdlc2l6ZSgpKSwgLyogZnJlZV9iZWZvcmVfYWNjZXNzICovIGZhbHNlLAorICAgICAvKiBhY2Nlc3Nfb2Zmc2V0ICovIC0xLAorICAgICBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoIkJ1ZmZlciBVbmRlcmZsb3csIDEgYnl0ZSBsZWZ0IG9mIGEgJWQtYnl0ZSBhbGxvY2F0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldHBhZ2VzaXplKCkpfSwKIH07CiAKIElOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKQEAgLTE2MTYsOCArMTk0Niw4IEBACiAgIFN0YXJ0UHJvY2VzcyhbJnJlY292ZXJhYmxlXSgpIHsKICAgICBjb25zdCBjaGFyKiBlbnZbXSA9IHsiR1dQX0FTQU5fU0FNUExFX1JBVEU9MSIsICJHV1BfQVNBTl9QUk9DRVNTX1NBTVBMSU5HPTEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJHV1BfQVNBTl9NQVhfQUxMT0NTPTQwMDAwIiwgbnVsbHB0ciwgbnVsbHB0cn07Ci0gICAgaWYgKHJlY292ZXJhYmxlKSB7Ci0gICAgICBlbnZbM10gPSAiR1dQX0FTQU5fUkVDT1ZFUkFCTEU9dHJ1ZSI7CisgICAgaWYgKCFyZWNvdmVyYWJsZSkgeworICAgICAgZW52WzNdID0gIkdXUF9BU0FOX1JFQ09WRVJBQkxFPWZhbHNlIjsKICAgICB9CiAgICAgc3RkOjpzdHJpbmcgdGVzdF9uYW1lID0gOjp0ZXN0aW5nOjpVbml0VGVzdDo6R2V0SW5zdGFuY2UoKS0+Y3VycmVudF90ZXN0X2luZm8oKS0+bmFtZSgpOwogICAgIHRlc3RfbmFtZSA9IHN0ZDo6cmVnZXhfcmVwbGFjZSh0ZXN0X25hbWUsIHN0ZDo6cmVnZXgoInJ1bl9nd3BfYXNhbl90ZXN0IiksCkBAIC0xNzYxLDkgKzIwOTEsMTAgQEAKICAgICBwaWRfdCBwaWQgPSAxMjMnNDU2Jzc4OSArIGk7CiAKICAgICB1bmlxdWVfZmQgaW50ZXJjZXB0X2ZkLCBvdXRwdXRfZmQ7Ci0gICAgSW50ZXJjZXB0U3RhdHVzIHN0YXR1czsKLSAgICB0b21ic3RvbmVkX2ludGVyY2VwdChwaWQsICZpbnRlcmNlcHRfZmQsICZvdXRwdXRfZmQsICZzdGF0dXMsIGtEZWJ1Z2dlcmRUb21ic3RvbmUpOwotICAgIEFTU0VSVF9FUShJbnRlcmNlcHRTdGF0dXM6OmtSZWdpc3RlcmVkLCBzdGF0dXMpOworICAgIEludGVyY2VwdFJlc3BvbnNlIHJlc3BvbnNlID0ge307CisgICAgdG9tYnN0b25lZF9pbnRlcmNlcHQocGlkLCAmaW50ZXJjZXB0X2ZkLCAmb3V0cHV0X2ZkLCAmcmVzcG9uc2UsIGtEZWJ1Z2dlcmRUb21ic3RvbmUpOworICAgIEFTU0VSVF9FUShJbnRlcmNlcHRTdGF0dXM6OmtSZWdpc3RlcmVkLCByZXNwb25zZS5zdGF0dXMpCisgICAgICAgIDw8ICJFcnJvciBtZXNzYWdlOiAiIDw8IHJlc3BvbnNlLmVycm9yX21lc3NhZ2U7CiAKICAgICB7CiAgICAgICB1bmlxdWVfZmQgdG9tYnN0b25lZF9zb2NrZXQsIGlucHV0X2ZkOwpAQCAtMTc5NSw5ICsyMTI2LDEwIEBACiAgICAgICBwaWRfdCBwaWQgPSBwaWRfYmFzZSArIGR1bXA7CiAKICAgICAgIHVuaXF1ZV9mZCBpbnRlcmNlcHRfZmQsIG91dHB1dF9mZDsKLSAgICAgIEludGVyY2VwdFN0YXR1cyBzdGF0dXM7Ci0gICAgICB0b21ic3RvbmVkX2ludGVyY2VwdChwaWQsICZpbnRlcmNlcHRfZmQsICZvdXRwdXRfZmQsICZzdGF0dXMsIGtEZWJ1Z2dlcmRUb21ic3RvbmUpOwotICAgICAgQVNTRVJUX0VRKEludGVyY2VwdFN0YXR1czo6a1JlZ2lzdGVyZWQsIHN0YXR1cyk7CisgICAgICBJbnRlcmNlcHRSZXNwb25zZSByZXNwb25zZSA9IHt9OworICAgICAgdG9tYnN0b25lZF9pbnRlcmNlcHQocGlkLCAmaW50ZXJjZXB0X2ZkLCAmb3V0cHV0X2ZkLCAmcmVzcG9uc2UsIGtEZWJ1Z2dlcmRUb21ic3RvbmUpOworICAgICAgQVNTRVJUX0VRKEludGVyY2VwdFN0YXR1czo6a1JlZ2lzdGVyZWQsIHJlc3BvbnNlLnN0YXR1cykKKyAgICAgICAgICA8PCAiRXJyb3IgbWVzc2VhZ2U6ICIgPDwgcmVzcG9uc2UuZXJyb3JfbWVzc2FnZTsKIAogICAgICAgLy8gUHJldGVuZCB0byBjcmFzaCwgYW5kIHRoZW4gaW1tZWRpYXRlbHkgY2xvc2UgdGhlIHNvY2tldC4KICAgICAgIHVuaXF1ZV9mZCBzb2NrZmQoc29ja2V0X2xvY2FsX2NsaWVudChrVG9tYnN0b25lZENyYXNoU29ja2V0TmFtZSwKQEAgLTE4MjgsOSArMjE2MCwxMCBAQAogICAgICAgcGlkX3QgcGlkID0gcGlkX2Jhc2UgKyBkdW1wOwogCiAgICAgICB1bmlxdWVfZmQgaW50ZXJjZXB0X2ZkLCBvdXRwdXRfZmQ7Ci0gICAgICBJbnRlcmNlcHRTdGF0dXMgc3RhdHVzOwotICAgICAgdG9tYnN0b25lZF9pbnRlcmNlcHQocGlkLCAmaW50ZXJjZXB0X2ZkLCAmb3V0cHV0X2ZkLCAmc3RhdHVzLCBrRGVidWdnZXJkVG9tYnN0b25lKTsKLSAgICAgIEFTU0VSVF9FUShJbnRlcmNlcHRTdGF0dXM6OmtSZWdpc3RlcmVkLCBzdGF0dXMpOworICAgICAgSW50ZXJjZXB0UmVzcG9uc2UgcmVzcG9uc2UgPSB7fTsKKyAgICAgIHRvbWJzdG9uZWRfaW50ZXJjZXB0KHBpZCwgJmludGVyY2VwdF9mZCwgJm91dHB1dF9mZCwgJnJlc3BvbnNlLCBrRGVidWdnZXJkVG9tYnN0b25lKTsKKyAgICAgIEFTU0VSVF9FUShJbnRlcmNlcHRTdGF0dXM6OmtSZWdpc3RlcmVkLCByZXNwb25zZS5zdGF0dXMpCisgICAgICAgICAgPDwgIkVycm9yIG1lc3NhZ2U6ICIgPDwgcmVzcG9uc2UuZXJyb3JfbWVzc2FnZTsKIAogICAgICAgewogICAgICAgICB1bmlxdWVfZmQgdG9tYnN0b25lZF9zb2NrZXQsIGlucHV0X2ZkOwpAQCAtMTg1NSwxNiArMjE4OCwxNyBAQAogICB9CiB9CiAKLVRFU1QodG9tYnN0b25lZCwgamF2YV90cmFjZV9pbnRlcmNlcHRfc21va2UpIHsKK1RFU1QodG9tYnN0b25lZCwgaW50ZXJjZXB0X2phdmFfdHJhY2Vfc21va2UpIHsKICAgLy8gVXNpbmcgYSAicmVhbCIgUElEIGlzIGEgbGl0dGxlIGRhbmdlcm91cyBoZXJlIC0gaWYgdGhlIHRlc3QgZmFpbHMKICAgLy8gb3IgY3Jhc2hlcywgd2UgbWlnaHQgZW5kIHVwIGdldHRpbmcgYSBib2d1cyAvIHVucmVsaWFibGUgc3RhY2sKICAgLy8gdHJhY2UuCiAgIGNvbnN0IHBpZF90IHNlbGYgPSBnZXRwaWQoKTsKIAogICB1bmlxdWVfZmQgaW50ZXJjZXB0X2ZkLCBvdXRwdXRfZmQ7Ci0gIEludGVyY2VwdFN0YXR1cyBzdGF0dXM7Ci0gIHRvbWJzdG9uZWRfaW50ZXJjZXB0KHNlbGYsICZpbnRlcmNlcHRfZmQsICZvdXRwdXRfZmQsICZzdGF0dXMsIGtEZWJ1Z2dlcmRKYXZhQmFja3RyYWNlKTsKLSAgQVNTRVJUX0VRKEludGVyY2VwdFN0YXR1czo6a1JlZ2lzdGVyZWQsIHN0YXR1cyk7CisgIEludGVyY2VwdFJlc3BvbnNlIHJlc3BvbnNlID0ge307CisgIHRvbWJzdG9uZWRfaW50ZXJjZXB0KHNlbGYsICZpbnRlcmNlcHRfZmQsICZvdXRwdXRfZmQsICZyZXNwb25zZSwga0RlYnVnZ2VyZEphdmFCYWNrdHJhY2UpOworICBBU1NFUlRfRVEoSW50ZXJjZXB0U3RhdHVzOjprUmVnaXN0ZXJlZCwgcmVzcG9uc2Uuc3RhdHVzKQorICAgICAgPDwgIkVycm9yIG1lc3NhZ2U6ICIgPDwgcmVzcG9uc2UuZXJyb3JfbWVzc2FnZTsKIAogICAvLyBGaXJzdCBjb25uZWN0IHRvIHRvbWJzdG9uZWQgcmVxdWVzdGluZyBhIG5hdGl2ZSB0b21ic3RvbmUuIFRoaXMKICAgLy8gc2hvdWxkIHJlc3VsdCBpbiBhICJyZWd1bGFyIiBGRCBhbmQgbm90IHRoZSBpbnN0YWxsZWQgaW50ZXJjZXB0LgpAQCAtMTg4NiwyNSArMjIyMCw5NiBAQAogICBBU1NFUlRfU1RSRVEoImphdmEiLCBvdXRidWYpOwogfQogCi1URVNUKHRvbWJzdG9uZWQsIG11bHRpcGxlX2ludGVyY2VwdHMpIHsKK1RFU1QodG9tYnN0b25lZCwgaW50ZXJjZXB0X211bHRpcGxlX2R1bXBfdHlwZXMpIHsKICAgY29uc3QgcGlkX3QgZmFrZV9waWQgPSAxJzIzNCc1Njc7CiAgIHVuaXF1ZV9mZCBpbnRlcmNlcHRfZmQsIG91dHB1dF9mZDsKLSAgSW50ZXJjZXB0U3RhdHVzIHN0YXR1czsKLSAgdG9tYnN0b25lZF9pbnRlcmNlcHQoZmFrZV9waWQsICZpbnRlcmNlcHRfZmQsICZvdXRwdXRfZmQsICZzdGF0dXMsIGtEZWJ1Z2dlcmRKYXZhQmFja3RyYWNlKTsKLSAgQVNTRVJUX0VRKEludGVyY2VwdFN0YXR1czo6a1JlZ2lzdGVyZWQsIHN0YXR1cyk7CisgIEludGVyY2VwdFJlc3BvbnNlIHJlc3BvbnNlID0ge307CisgIHRvbWJzdG9uZWRfaW50ZXJjZXB0KGZha2VfcGlkLCAmaW50ZXJjZXB0X2ZkLCAmb3V0cHV0X2ZkLCAmcmVzcG9uc2UsIGtEZWJ1Z2dlcmRKYXZhQmFja3RyYWNlKTsKKyAgQVNTRVJUX0VRKEludGVyY2VwdFN0YXR1czo6a1JlZ2lzdGVyZWQsIHJlc3BvbnNlLnN0YXR1cykKKyAgICAgIDw8ICJFcnJvciBtZXNzYWdlOiAiIDw8IHJlc3BvbnNlLmVycm9yX21lc3NhZ2U7CiAKICAgdW5pcXVlX2ZkIGludGVyY2VwdF9mZF8yLCBvdXRwdXRfZmRfMjsKLSAgdG9tYnN0b25lZF9pbnRlcmNlcHQoZmFrZV9waWQsICZpbnRlcmNlcHRfZmRfMiwgJm91dHB1dF9mZF8yLCAmc3RhdHVzLCBrRGVidWdnZXJkTmF0aXZlQmFja3RyYWNlKTsKLSAgQVNTRVJUX0VRKEludGVyY2VwdFN0YXR1czo6a0ZhaWxlZEFscmVhZHlSZWdpc3RlcmVkLCBzdGF0dXMpOworICB0b21ic3RvbmVkX2ludGVyY2VwdChmYWtlX3BpZCwgJmludGVyY2VwdF9mZF8yLCAmb3V0cHV0X2ZkXzIsICZyZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAga0RlYnVnZ2VyZE5hdGl2ZUJhY2t0cmFjZSk7CisgIEFTU0VSVF9FUShJbnRlcmNlcHRTdGF0dXM6OmtSZWdpc3RlcmVkLCByZXNwb25zZS5zdGF0dXMpCisgICAgICA8PCAiRXJyb3IgbWVzc2FnZTogIiA8PCByZXNwb25zZS5lcnJvcl9tZXNzYWdlOworfQorCitURVNUKHRvbWJzdG9uZWQsIGludGVyY2VwdF9iYWRfcGlkKSB7CisgIGNvbnN0IHBpZF90IGZha2VfcGlkID0gLTE7CisgIHVuaXF1ZV9mZCBpbnRlcmNlcHRfZmQsIG91dHB1dF9mZDsKKyAgSW50ZXJjZXB0UmVzcG9uc2UgcmVzcG9uc2UgPSB7fTsKKyAgdG9tYnN0b25lZF9pbnRlcmNlcHQoZmFrZV9waWQsICZpbnRlcmNlcHRfZmQsICZvdXRwdXRfZmQsICZyZXNwb25zZSwga0RlYnVnZ2VyZE5hdGl2ZUJhY2t0cmFjZSk7CisgIEFTU0VSVF9FUShJbnRlcmNlcHRTdGF0dXM6OmtGYWlsZWQsIHJlc3BvbnNlLnN0YXR1cykKKyAgICAgIDw8ICJFcnJvciBtZXNzYWdlOiAiIDw8IHJlc3BvbnNlLmVycm9yX21lc3NhZ2U7CisgIEFTU0VSVF9NQVRDSChyZXNwb25zZS5lcnJvcl9tZXNzYWdlLCAiYmFkIHBpZCIpOworfQorCitURVNUKHRvbWJzdG9uZWQsIGludGVyY2VwdF9iYWRfZHVtcF90eXBlcykgeworICBjb25zdCBwaWRfdCBmYWtlX3BpZCA9IDEnMjM0JzU2NzsKKyAgdW5pcXVlX2ZkIGludGVyY2VwdF9mZCwgb3V0cHV0X2ZkOworICBJbnRlcmNlcHRSZXNwb25zZSByZXNwb25zZSA9IHt9OworICB0b21ic3RvbmVkX2ludGVyY2VwdChmYWtlX3BpZCwgJmludGVyY2VwdF9mZCwgJm91dHB1dF9mZCwgJnJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxEZWJ1Z2dlcmREdW1wVHlwZT4oMjApKTsKKyAgQVNTRVJUX0VRKEludGVyY2VwdFN0YXR1czo6a0ZhaWxlZCwgcmVzcG9uc2Uuc3RhdHVzKQorICAgICAgPDwgIkVycm9yIG1lc3NhZ2U6ICIgPDwgcmVzcG9uc2UuZXJyb3JfbWVzc2FnZTsKKyAgQVNTRVJUX01BVENIKHJlc3BvbnNlLmVycm9yX21lc3NhZ2UsICJiYWQgZHVtcCB0eXBlIFxcW3Vua25vd25cXF0iKTsKKworICB0b21ic3RvbmVkX2ludGVyY2VwdChmYWtlX3BpZCwgJmludGVyY2VwdF9mZCwgJm91dHB1dF9mZCwgJnJlc3BvbnNlLCBrRGVidWdnZXJkQW55SW50ZXJjZXB0KTsKKyAgQVNTRVJUX0VRKEludGVyY2VwdFN0YXR1czo6a0ZhaWxlZCwgcmVzcG9uc2Uuc3RhdHVzKQorICAgICAgPDwgIkVycm9yIG1lc3NhZ2U6ICIgPDwgcmVzcG9uc2UuZXJyb3JfbWVzc2FnZTsKKyAgQVNTRVJUX01BVENIKHJlc3BvbnNlLmVycm9yX21lc3NhZ2UsICJiYWQgZHVtcCB0eXBlIGtEZWJ1Z2dlcmRBbnlJbnRlcmNlcHQiKTsKKworICB0b21ic3RvbmVkX2ludGVyY2VwdChmYWtlX3BpZCwgJmludGVyY2VwdF9mZCwgJm91dHB1dF9mZCwgJnJlc3BvbnNlLCBrRGVidWdnZXJkVG9tYnN0b25lUHJvdG8pOworICBBU1NFUlRfRVEoSW50ZXJjZXB0U3RhdHVzOjprRmFpbGVkLCByZXNwb25zZS5zdGF0dXMpCisgICAgICA8PCAiRXJyb3IgbWVzc2FnZTogIiA8PCByZXNwb25zZS5lcnJvcl9tZXNzYWdlOworICBBU1NFUlRfTUFUQ0gocmVzcG9uc2UuZXJyb3JfbWVzc2FnZSwgImJhZCBkdW1wIHR5cGUga0RlYnVnZ2VyZFRvbWJzdG9uZVByb3RvIik7Cit9CisKK1RFU1QodG9tYnN0b25lZCwgaW50ZXJjZXB0X2FscmVhZHlfcmVnaXN0ZXJlZCkgeworICBjb25zdCBwaWRfdCBmYWtlX3BpZCA9IDEnMjM0JzU2NzsKKyAgdW5pcXVlX2ZkIGludGVyY2VwdF9mZDEsIG91dHB1dF9mZDE7CisgIEludGVyY2VwdFJlc3BvbnNlIHJlc3BvbnNlID0ge307CisgIHRvbWJzdG9uZWRfaW50ZXJjZXB0KGZha2VfcGlkLCAmaW50ZXJjZXB0X2ZkMSwgJm91dHB1dF9mZDEsICZyZXNwb25zZSwga0RlYnVnZ2VyZFRvbWJzdG9uZSk7CisgIEFTU0VSVF9FUShJbnRlcmNlcHRTdGF0dXM6OmtSZWdpc3RlcmVkLCByZXNwb25zZS5zdGF0dXMpCisgICAgICA8PCAiRXJyb3IgbWVzc2FnZTogIiA8PCByZXNwb25zZS5lcnJvcl9tZXNzYWdlOworCisgIHVuaXF1ZV9mZCBpbnRlcmNlcHRfZmQyLCBvdXRwdXRfZmQyOworICB0b21ic3RvbmVkX2ludGVyY2VwdChmYWtlX3BpZCwgJmludGVyY2VwdF9mZDIsICZvdXRwdXRfZmQyLCAmcmVzcG9uc2UsIGtEZWJ1Z2dlcmRUb21ic3RvbmUpOworICBBU1NFUlRfRVEoSW50ZXJjZXB0U3RhdHVzOjprRmFpbGVkQWxyZWFkeVJlZ2lzdGVyZWQsIHJlc3BvbnNlLnN0YXR1cykKKyAgICAgIDw8ICJFcnJvciBtZXNzYWdlOiAiIDw8IHJlc3BvbnNlLmVycm9yX21lc3NhZ2U7CisgIEFTU0VSVF9NQVRDSChyZXNwb25zZS5lcnJvcl9tZXNzYWdlLCAiYWxyZWFkeSByZWdpc3RlcmVkLCB0eXBlIGtEZWJ1Z2dlcmRUb21ic3RvbmUiKTsKK30KKworVEVTVCh0b21ic3RvbmVkLCBpbnRlcmNlcHRfdG9tYnN0b25lX3Byb3RvX21hdGNoZWRfdG9fdG9tYnN0b25lKSB7CisgIGNvbnN0IHBpZF90IGZha2VfcGlkID0gMScyMzQnNTY3OworCisgIHVuaXF1ZV9mZCBpbnRlcmNlcHRfZmQsIG91dHB1dF9mZDsKKyAgSW50ZXJjZXB0UmVzcG9uc2UgcmVzcG9uc2UgPSB7fTsKKyAgdG9tYnN0b25lZF9pbnRlcmNlcHQoZmFrZV9waWQsICZpbnRlcmNlcHRfZmQsICZvdXRwdXRfZmQsICZyZXNwb25zZSwga0RlYnVnZ2VyZFRvbWJzdG9uZSk7CisgIEFTU0VSVF9FUShJbnRlcmNlcHRTdGF0dXM6OmtSZWdpc3RlcmVkLCByZXNwb25zZS5zdGF0dXMpCisgICAgICA8PCAiRXJyb3IgbWVzc2FnZTogIiA8PCByZXNwb25zZS5lcnJvcl9tZXNzYWdlOworCisgIGNvbnN0IGNoYXIgZGF0YVtdID0gInRvbWJzdG9uZV9wcm90byI7CisgIHVuaXF1ZV9mZCB0b21ic3RvbmVkX3NvY2tldCwgaW5wdXRfZmQ7CisgIEFTU0VSVF9UUlVFKAorICAgICAgdG9tYnN0b25lZF9jb25uZWN0KGZha2VfcGlkLCAmdG9tYnN0b25lZF9zb2NrZXQsICZpbnB1dF9mZCwga0RlYnVnZ2VyZFRvbWJzdG9uZVByb3RvKSk7CisgIEFTU0VSVF9UUlVFKGFuZHJvaWQ6OmJhc2U6OldyaXRlRnVsbHkoaW5wdXRfZmQuZ2V0KCksIGRhdGEsIHNpemVvZihkYXRhKSkpOworICB0b21ic3RvbmVkX25vdGlmeV9jb21wbGV0aW9uKHRvbWJzdG9uZWRfc29ja2V0LmdldCgpKTsKKworICBjaGFyIG91dGJ1ZltzaXplb2YoZGF0YSldOworICBBU1NFUlRfVFJVRShhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHkob3V0cHV0X2ZkLmdldCgpLCBvdXRidWYsIHNpemVvZihvdXRidWYpKSk7CisgIEFTU0VSVF9TVFJFUSgidG9tYnN0b25lX3Byb3RvIiwgb3V0YnVmKTsKIH0KIAogVEVTVCh0b21ic3RvbmVkLCBpbnRlcmNlcHRfYW55KSB7CiAgIGNvbnN0IHBpZF90IGZha2VfcGlkID0gMScyMzQnNTY3OwogCiAgIHVuaXF1ZV9mZCBpbnRlcmNlcHRfZmQsIG91dHB1dF9mZDsKLSAgSW50ZXJjZXB0U3RhdHVzIHN0YXR1czsKLSAgdG9tYnN0b25lZF9pbnRlcmNlcHQoZmFrZV9waWQsICZpbnRlcmNlcHRfZmQsICZvdXRwdXRfZmQsICZzdGF0dXMsIGtEZWJ1Z2dlcmROYXRpdmVCYWNrdHJhY2UpOwotICBBU1NFUlRfRVEoSW50ZXJjZXB0U3RhdHVzOjprUmVnaXN0ZXJlZCwgc3RhdHVzKTsKKyAgSW50ZXJjZXB0UmVzcG9uc2UgcmVzcG9uc2UgPSB7fTsKKyAgdG9tYnN0b25lZF9pbnRlcmNlcHQoZmFrZV9waWQsICZpbnRlcmNlcHRfZmQsICZvdXRwdXRfZmQsICZyZXNwb25zZSwga0RlYnVnZ2VyZE5hdGl2ZUJhY2t0cmFjZSk7CisgIEFTU0VSVF9FUShJbnRlcmNlcHRTdGF0dXM6OmtSZWdpc3RlcmVkLCByZXNwb25zZS5zdGF0dXMpCisgICAgICA8PCAiRXJyb3IgbWVzc2FnZTogIiA8PCByZXNwb25zZS5lcnJvcl9tZXNzYWdlOwogCiAgIGNvbnN0IGNoYXIgYW55W10gPSAiYW55IjsKICAgdW5pcXVlX2ZkIHRvbWJzdG9uZWRfc29ja2V0LCBpbnB1dF9mZDsKQEAgLTE5MTcsNiArMjMyMiw3NyBAQAogICBBU1NFUlRfU1RSRVEoImFueSIsIG91dGJ1Zik7CiB9CiAKK1RFU1QodG9tYnN0b25lZCwgaW50ZXJjZXB0X2FueV9mYWlsZWRfd2l0aF9tdWx0aXBsZV9pbnRlcmNlcHRzKSB7CisgIGNvbnN0IHBpZF90IGZha2VfcGlkID0gMScyMzQnNTY3OworCisgIEludGVyY2VwdFJlc3BvbnNlIHJlc3BvbnNlID0ge307CisgIHVuaXF1ZV9mZCBpbnRlcmNlcHRfZmQxLCBvdXRwdXRfZmQxOworICB0b21ic3RvbmVkX2ludGVyY2VwdChmYWtlX3BpZCwgJmludGVyY2VwdF9mZDEsICZvdXRwdXRfZmQxLCAmcmVzcG9uc2UsIGtEZWJ1Z2dlcmROYXRpdmVCYWNrdHJhY2UpOworICBBU1NFUlRfRVEoSW50ZXJjZXB0U3RhdHVzOjprUmVnaXN0ZXJlZCwgcmVzcG9uc2Uuc3RhdHVzKQorICAgICAgPDwgIkVycm9yIG1lc3NhZ2U6ICIgPDwgcmVzcG9uc2UuZXJyb3JfbWVzc2FnZTsKKworICB1bmlxdWVfZmQgaW50ZXJjZXB0X2ZkMiwgb3V0cHV0X2ZkMjsKKyAgdG9tYnN0b25lZF9pbnRlcmNlcHQoZmFrZV9waWQsICZpbnRlcmNlcHRfZmQyLCAmb3V0cHV0X2ZkMiwgJnJlc3BvbnNlLCBrRGVidWdnZXJkSmF2YUJhY2t0cmFjZSk7CisgIEFTU0VSVF9FUShJbnRlcmNlcHRTdGF0dXM6OmtSZWdpc3RlcmVkLCByZXNwb25zZS5zdGF0dXMpCisgICAgICA8PCAiRXJyb3IgbWVzc2FnZTogIiA8PCByZXNwb25zZS5lcnJvcl9tZXNzYWdlOworCisgIHVuaXF1ZV9mZCB0b21ic3RvbmVkX3NvY2tldCwgaW5wdXRfZmQ7CisgIEFTU0VSVF9GQUxTRSh0b21ic3RvbmVkX2Nvbm5lY3QoZmFrZV9waWQsICZ0b21ic3RvbmVkX3NvY2tldCwgJmlucHV0X2ZkLCBrRGVidWdnZXJkQW55SW50ZXJjZXB0KSk7Cit9CisKK1RFU1QodG9tYnN0b25lZCwgaW50ZXJjZXB0X211bHRpcGxlX3ZlcmlmeV9pbnRlcmNlcHQpIHsKKyAgLy8gTmVlZCB0byB1c2Ugb3VyIHBpZCBmb3IgamF2YSBzaW5jZSB0aGF0IHdpbGwgdmVyaWZ5IHRoZSBwaWQuCisgIGNvbnN0IHBpZF90IGZha2VfcGlkID0gZ2V0cGlkKCk7CisKKyAgSW50ZXJjZXB0UmVzcG9uc2UgcmVzcG9uc2UgPSB7fTsKKyAgdW5pcXVlX2ZkIGludGVyY2VwdF9mZDEsIG91dHB1dF9mZDE7CisgIHRvbWJzdG9uZWRfaW50ZXJjZXB0KGZha2VfcGlkLCAmaW50ZXJjZXB0X2ZkMSwgJm91dHB1dF9mZDEsICZyZXNwb25zZSwga0RlYnVnZ2VyZE5hdGl2ZUJhY2t0cmFjZSk7CisgIEFTU0VSVF9FUShJbnRlcmNlcHRTdGF0dXM6OmtSZWdpc3RlcmVkLCByZXNwb25zZS5zdGF0dXMpCisgICAgICA8PCAiRXJyb3IgbWVzc2FnZTogIiA8PCByZXNwb25zZS5lcnJvcl9tZXNzYWdlOworCisgIHVuaXF1ZV9mZCBpbnRlcmNlcHRfZmQyLCBvdXRwdXRfZmQyOworICB0b21ic3RvbmVkX2ludGVyY2VwdChmYWtlX3BpZCwgJmludGVyY2VwdF9mZDIsICZvdXRwdXRfZmQyLCAmcmVzcG9uc2UsIGtEZWJ1Z2dlcmRKYXZhQmFja3RyYWNlKTsKKyAgQVNTRVJUX0VRKEludGVyY2VwdFN0YXR1czo6a1JlZ2lzdGVyZWQsIHJlc3BvbnNlLnN0YXR1cykKKyAgICAgIDw8ICJFcnJvciBtZXNzYWdlOiAiIDw8IHJlc3BvbnNlLmVycm9yX21lc3NhZ2U7CisKKyAgdW5pcXVlX2ZkIGludGVyY2VwdF9mZDMsIG91dHB1dF9mZDM7CisgIHRvbWJzdG9uZWRfaW50ZXJjZXB0KGZha2VfcGlkLCAmaW50ZXJjZXB0X2ZkMywgJm91dHB1dF9mZDMsICZyZXNwb25zZSwga0RlYnVnZ2VyZFRvbWJzdG9uZSk7CisgIEFTU0VSVF9FUShJbnRlcmNlcHRTdGF0dXM6OmtSZWdpc3RlcmVkLCByZXNwb25zZS5zdGF0dXMpCisgICAgICA8PCAiRXJyb3IgbWVzc2FnZTogIiA8PCByZXNwb25zZS5lcnJvcl9tZXNzYWdlOworCisgIGNvbnN0IGNoYXIgbmF0aXZlX2RhdGFbXSA9ICJuYXRpdmUiOworICB1bmlxdWVfZmQgdG9tYnN0b25lZF9zb2NrZXQxLCBpbnB1dF9mZDE7CisgIEFTU0VSVF9UUlVFKAorICAgICAgdG9tYnN0b25lZF9jb25uZWN0KGZha2VfcGlkLCAmdG9tYnN0b25lZF9zb2NrZXQxLCAmaW5wdXRfZmQxLCBrRGVidWdnZXJkTmF0aXZlQmFja3RyYWNlKSk7CisgIEFTU0VSVF9UUlVFKGFuZHJvaWQ6OmJhc2U6OldyaXRlRnVsbHkoaW5wdXRfZmQxLmdldCgpLCBuYXRpdmVfZGF0YSwgc2l6ZW9mKG5hdGl2ZV9kYXRhKSkpOworICB0b21ic3RvbmVkX25vdGlmeV9jb21wbGV0aW9uKHRvbWJzdG9uZWRfc29ja2V0MS5nZXQoKSk7CisKKyAgY2hhciBuYXRpdmVfb3V0YnVmW3NpemVvZihuYXRpdmVfZGF0YSldOworICBBU1NFUlRfVFJVRShhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHkob3V0cHV0X2ZkMS5nZXQoKSwgbmF0aXZlX291dGJ1Ziwgc2l6ZW9mKG5hdGl2ZV9vdXRidWYpKSk7CisgIEFTU0VSVF9TVFJFUSgibmF0aXZlIiwgbmF0aXZlX291dGJ1Zik7CisKKyAgY29uc3QgY2hhciBqYXZhX2RhdGFbXSA9ICJqYXZhIjsKKyAgdW5pcXVlX2ZkIHRvbWJzdG9uZWRfc29ja2V0MiwgaW5wdXRfZmQyOworICBBU1NFUlRfVFJVRSgKKyAgICAgIHRvbWJzdG9uZWRfY29ubmVjdChmYWtlX3BpZCwgJnRvbWJzdG9uZWRfc29ja2V0MiwgJmlucHV0X2ZkMiwga0RlYnVnZ2VyZEphdmFCYWNrdHJhY2UpKTsKKyAgQVNTRVJUX1RSVUUoYW5kcm9pZDo6YmFzZTo6V3JpdGVGdWxseShpbnB1dF9mZDIuZ2V0KCksIGphdmFfZGF0YSwgc2l6ZW9mKGphdmFfZGF0YSkpKTsKKyAgdG9tYnN0b25lZF9ub3RpZnlfY29tcGxldGlvbih0b21ic3RvbmVkX3NvY2tldDIuZ2V0KCkpOworCisgIGNoYXIgamF2YV9vdXRidWZbc2l6ZW9mKGphdmFfZGF0YSldOworICBBU1NFUlRfVFJVRShhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHkob3V0cHV0X2ZkMi5nZXQoKSwgamF2YV9vdXRidWYsIHNpemVvZihqYXZhX291dGJ1ZikpKTsKKyAgQVNTRVJUX1NUUkVRKCJqYXZhIiwgamF2YV9vdXRidWYpOworCisgIGNvbnN0IGNoYXIgdG9tYl9kYXRhW10gPSAidG9tYnN0b25lIjsKKyAgdW5pcXVlX2ZkIHRvbWJzdG9uZWRfc29ja2V0MywgaW5wdXRfZmQzOworICBBU1NFUlRfVFJVRSh0b21ic3RvbmVkX2Nvbm5lY3QoZmFrZV9waWQsICZ0b21ic3RvbmVkX3NvY2tldDMsICZpbnB1dF9mZDMsIGtEZWJ1Z2dlcmRUb21ic3RvbmUpKTsKKyAgQVNTRVJUX1RSVUUoYW5kcm9pZDo6YmFzZTo6V3JpdGVGdWxseShpbnB1dF9mZDMuZ2V0KCksIHRvbWJfZGF0YSwgc2l6ZW9mKHRvbWJfZGF0YSkpKTsKKyAgdG9tYnN0b25lZF9ub3RpZnlfY29tcGxldGlvbih0b21ic3RvbmVkX3NvY2tldDMuZ2V0KCkpOworCisgIGNoYXIgdG9tYl9vdXRidWZbc2l6ZW9mKHRvbWJfZGF0YSldOworICBBU1NFUlRfVFJVRShhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHkob3V0cHV0X2ZkMy5nZXQoKSwgdG9tYl9vdXRidWYsIHNpemVvZih0b21iX291dGJ1ZikpKTsKKyAgQVNTRVJUX1NUUkVRKCJ0b21ic3RvbmUiLCB0b21iX291dGJ1Zik7Cit9CisKIFRFU1QodG9tYnN0b25lZCwgaW50ZXJjZXB0bGVzc19iYWNrdHJhY2UpIHsKICAgLy8gR2VuZXJhdGUgNTAgYmFja3RyYWNlcywgYW5kIHRoZW4gY2hlY2sgdG8gc2VlIHRoYXQgd2UgaGF2ZW4ndCBjcmVhdGVkIDUwIG5ldyB0b21ic3RvbmVzLgogICBhdXRvIGdldF90b21ic3RvbmVfdGltZXN0YW1wcyA9IFtdKCkgLT4gc3RkOjptYXA8aW50LCB0aW1lX3Q+IHsKQEAgLTIwOTQsMjggKzI1NzAsMTAgQEAKICAgQVNTRVJUX01BVENIKHJlc3VsdCwgbWF0Y2hfc3RyKTsKIH0KIAotVEVTVCh0b21ic3RvbmVkLCBwcm90bykgewotICBjb25zdCBwaWRfdCBzZWxmID0gZ2V0cGlkKCk7Ci0gIHVuaXF1ZV9mZCB0b21ic3RvbmVkX3NvY2tldCwgdGV4dF9mZCwgcHJvdG9fZmQ7Ci0gIEFTU0VSVF9UUlVFKAotICAgICAgdG9tYnN0b25lZF9jb25uZWN0KHNlbGYsICZ0b21ic3RvbmVkX3NvY2tldCwgJnRleHRfZmQsICZwcm90b19mZCwga0RlYnVnZ2VyZFRvbWJzdG9uZVByb3RvKSk7Ci0KLSAgdG9tYnN0b25lZF9ub3RpZnlfY29tcGxldGlvbih0b21ic3RvbmVkX3NvY2tldC5nZXQoKSk7Ci0KLSAgQVNTRVJUX05FKC0xLCB0ZXh0X2ZkLmdldCgpKTsKLSAgQVNTRVJUX05FKC0xLCBwcm90b19mZC5nZXQoKSk7Ci0KLSAgc3RydWN0IHN0YXQgdGV4dF9zdDsKLSAgQVNTRVJUX0VRKDAsIGZzdGF0KHRleHRfZmQuZ2V0KCksICZ0ZXh0X3N0KSk7Ci0KLSAgLy8gR2l2ZSB0b21ic3RvbmVkIHNvbWUgdGltZSB0byBsaW5rIHRoZSBmaWxlcyBpbnRvIHBsYWNlLgotICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoMTAwbXMpOwotCi0gIC8vIEZpbmQgdGhlIHRvbWJzdG9uZS4KLSAgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gdG9tYnN0b25lX2ZpbGU7Cit2b2lkIENoZWNrRm9yVG9tYnN0b25lKGNvbnN0IHN0cnVjdCBzdGF0JiB0ZXh0X3N0LCBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiYgdG9tYnN0b25lX2ZpbGUpIHsKKyAgc3RhdGljIHN0ZDo6cmVnZXggdG9tYnN0b25lX3JlKCJ0b21ic3RvbmVfXFxkKyIpOwogICBzdGQ6OnVuaXF1ZV9wdHI8RElSLCBkZWNsdHlwZSgmY2xvc2VkaXIpPiBkaXJfaChvcGVuZGlyKCIvZGF0YS90b21ic3RvbmVzIiksIGNsb3NlZGlyKTsKICAgQVNTRVJUX1RSVUUoZGlyX2ggIT0gbnVsbHB0cik7Ci0gIHN0ZDo6cmVnZXggdG9tYnN0b25lX3JlKCJ0b21ic3RvbmVfXFxkKyIpOwogICBkaXJlbnQqIGVudHJ5OwogICB3aGlsZSAoKGVudHJ5ID0gcmVhZGRpcihkaXJfaC5nZXQoKSkpICE9IG51bGxwdHIpIHsKICAgICBpZiAoIXN0ZDo6cmVnZXhfbWF0Y2goZW50cnktPmRfbmFtZSwgdG9tYnN0b25lX3JlKSkgewpAQCAtMjEzMyw4ICsyNTkxLDM4IEBACiAgICAgICBicmVhazsKICAgICB9CiAgIH0KK30KIAotICBBU1NFUlRfVFJVRSh0b21ic3RvbmVfZmlsZSk7CitURVNUKHRvbWJzdG9uZWQsIHByb3RvKSB7CisgIGNvbnN0IHBpZF90IHNlbGYgPSBnZXRwaWQoKTsKKyAgdW5pcXVlX2ZkIHRvbWJzdG9uZWRfc29ja2V0LCB0ZXh0X2ZkLCBwcm90b19mZDsKKyAgQVNTRVJUX1RSVUUoCisgICAgICB0b21ic3RvbmVkX2Nvbm5lY3Qoc2VsZiwgJnRvbWJzdG9uZWRfc29ja2V0LCAmdGV4dF9mZCwgJnByb3RvX2ZkLCBrRGVidWdnZXJkVG9tYnN0b25lUHJvdG8pKTsKKworICB0b21ic3RvbmVkX25vdGlmeV9jb21wbGV0aW9uKHRvbWJzdG9uZWRfc29ja2V0LmdldCgpKTsKKworICBBU1NFUlRfTkUoLTEsIHRleHRfZmQuZ2V0KCkpOworICBBU1NFUlRfTkUoLTEsIHByb3RvX2ZkLmdldCgpKTsKKworICBzdHJ1Y3Qgc3RhdCB0ZXh0X3N0OworICBBU1NFUlRfRVEoMCwgZnN0YXQodGV4dF9mZC5nZXQoKSwgJnRleHRfc3QpKTsKKworICBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiB0b21ic3RvbmVfZmlsZTsKKyAgLy8gQWxsb3cgdXAgdG8gNSBzZWNvbmRzIGZvciB0aGUgdG9tYnN0b25lIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIHN5c3RlbS4KKyAgY29uc3QgYXV0byBtYXhfd2FpdF90aW1lID0gc3RkOjpjaHJvbm86OnNlY29uZHMoNSkgKiBhbmRyb2lkOjpiYXNlOjpId1RpbWVvdXRNdWx0aXBsaWVyKCk7CisgIGNvbnN0IGF1dG8gc3RhcnQgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoMTAwbXMpOworICAgIENoZWNrRm9yVG9tYnN0b25lKHRleHRfc3QsIHRvbWJzdG9uZV9maWxlKTsKKyAgICBpZiAodG9tYnN0b25lX2ZpbGUpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCkgLSBzdGFydCA+IG1heF93YWl0X3RpbWUpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIEFTU0VSVF9UUlVFKHRvbWJzdG9uZV9maWxlKSA8PCAiVGltZWQgb3V0IHRyeWluZyB0byBmaW5kIHRvbWJzdG9uZSBmaWxlLiI7CiAgIHN0ZDo6c3RyaW5nIHByb3RvX3BhdGggPSB0b21ic3RvbmVfZmlsZS52YWx1ZSgpICsgIi5wYiI7CiAKICAgc3RydWN0IHN0YXQgcHJvdG9fZmRfc3Q7CkBAIC0yMTQ5LDEwICsyNjM3LDExIEBACiBURVNUKHRvbWJzdG9uZWQsIHByb3RvX2ludGVyY2VwdCkgewogICBjb25zdCBwaWRfdCBzZWxmID0gZ2V0cGlkKCk7CiAgIHVuaXF1ZV9mZCBpbnRlcmNlcHRfZmQsIG91dHB1dF9mZDsKLSAgSW50ZXJjZXB0U3RhdHVzIHN0YXR1czsKIAotICB0b21ic3RvbmVkX2ludGVyY2VwdChzZWxmLCAmaW50ZXJjZXB0X2ZkLCAmb3V0cHV0X2ZkLCAmc3RhdHVzLCBrRGVidWdnZXJkVG9tYnN0b25lKTsKLSAgQVNTRVJUX0VRKEludGVyY2VwdFN0YXR1czo6a1JlZ2lzdGVyZWQsIHN0YXR1cyk7CisgIEludGVyY2VwdFJlc3BvbnNlIHJlc3BvbnNlID0ge307CisgIHRvbWJzdG9uZWRfaW50ZXJjZXB0KHNlbGYsICZpbnRlcmNlcHRfZmQsICZvdXRwdXRfZmQsICZyZXNwb25zZSwga0RlYnVnZ2VyZFRvbWJzdG9uZSk7CisgIEFTU0VSVF9FUShJbnRlcmNlcHRTdGF0dXM6OmtSZWdpc3RlcmVkLCByZXNwb25zZS5zdGF0dXMpCisgICAgICA8PCAiRXJyb3IgbWVzc2FnZTogIiA8PCByZXNwb25zZS5lcnJvcl9tZXNzYWdlOwogCiAgIHVuaXF1ZV9mZCB0b21ic3RvbmVkX3NvY2tldCwgdGV4dF9mZCwgcHJvdG9fZmQ7CiAgIEFTU0VSVF9UUlVFKApAQCAtMjI3OSwxMiArMjc2OCwxNiBAQAogICBtYXRjaF9zdHIgKz0gZm9ybWF0X2Z1bGxfcG9pbnRlcihjcmFzaF91cHRyKTsKICAgQVNTRVJUX01BVENIKHJlc3VsdCwgbWF0Y2hfc3RyKTsKIAotICBBU1NFUlRfTUFUQ0gocmVzdWx0LCBSIihcbm1lbW9yeSBtYXAgXCguKlwpOiBcKGZhdWx0IGFkZHJlc3MgcHJlZml4ZWQgd2l0aCAtLS0+KVxuKSIpOworICBBU1NFUlRfTUFUQ0gocmVzdWx0LCBSIihcbm1lbW9yeSBtYXAgXCguKlwpOiBcKGZhdWx0IGFkZHJlc3MgcHJlZml4ZWQgd2l0aCAtLS0+XClcbikiKTsKIAotICAvLyBBc3N1bWVzIHRoYXQgdGhlIG9wZW4gZmlsZXMgc2VjdGlvbiBjb21lcyBhZnRlciB0aGUgbWFwIHNlY3Rpb24uCi0gIC8vIElmIHRoYXQgYXNzdW1wdGlvbiBjaGFuZ2VzLCB0aGUgcmVnZXggYmVsb3cgbmVlZHMgdG8gY2hhbmdlLgorICAvLyBWZXJpZmllcyB0aGF0IHRoZSBmYXVsdCBhZGRyZXNzIGVycm9yIG1lc3NhZ2UgaXMgYXQgdGhlIGVuZCBvZiB0aGUKKyAgLy8gbWFwcyBzZWN0aW9uLiBUbyBkbyB0aGlzLCB0aGUgY2hlY2sgYmVsb3cgbG9va3MgZm9yIHRoZSBzdGFydCBvZiB0aGUKKyAgLy8gb3BlbiBmaWxlcyBzZWN0aW9uIG9yIHRoZSBzdGFydCBvZiB0aGUgbG9nIGZpbGUgc2VjdGlvbi4gSXQncyBwb3NzaWJsZQorICAvLyBmb3IgZWl0aGVyIG9mIHRoZXNlIHNlY3Rpb25zIHRvIGJlIHByZXNlbnQgYWZ0ZXIgdGhlIG1hcHMgc2VjdGlvbiByaWdodAorICAvLyBub3cuCisgIC8vIElmIHRoZSBzZWN0aW9ucyBtb3ZlIGFyb3VuZCwgdGhpcyBjaGVjayBtaWdodCBuZWVkIHRvIGJlIG1vZGlmaWVkLgogICBtYXRjaF9zdHIgPSBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoCi0gICAgICBSIihcbi0tLT5GYXVsdCBhZGRyZXNzIGZhbGxzIGF0ICVzIGFmdGVyIGFueSBtYXBwZWQgcmVnaW9uc1xuXG5vcGVuIGZpbGVzOikiLAorICAgICAgUiIoXG4tLS0+RmF1bHQgYWRkcmVzcyBmYWxscyBhdCAlcyBhZnRlciBhbnkgbWFwcGVkIHJlZ2lvbnNcbigtLS0tLS0tLS18XG5vcGVuIGZpbGVzOikpIiwKICAgICAgIGZvcm1hdF9wb2ludGVyKGNyYXNoX3VwdHIpLmNfc3RyKCkpOwogICBBU1NFUlRfTUFUQ0gocmVzdWx0LCBtYXRjaF9zdHIpOwogfQpAQCAtMjMyNyw3ICsyODIwLDcgQEAKICAgbWF0Y2hfc3RyICs9IGZvcm1hdF9mdWxsX3BvaW50ZXIocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KG1pZGRsZV9wdHIpKTsKICAgQVNTRVJUX01BVENIKHJlc3VsdCwgbWF0Y2hfc3RyKTsKIAotICBBU1NFUlRfTUFUQ0gocmVzdWx0LCBSIihcbm1lbW9yeSBtYXAgXCguKlwpOiBcKGZhdWx0IGFkZHJlc3MgcHJlZml4ZWQgd2l0aCAtLS0+KVxuKSIpOworICBBU1NFUlRfTUFUQ0gocmVzdWx0LCBSIihcbm1lbW9yeSBtYXAgXCguKlwpOiBcKGZhdWx0IGFkZHJlc3MgcHJlZml4ZWQgd2l0aCAtLS0+XClcbikiKTsKIAogICBtYXRjaF9zdHIgPSBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoCiAgICAgICBSIiggICAgJXMuKlxuLS0tPkZhdWx0IGFkZHJlc3MgZmFsbHMgYXQgJXMgYmV0d2VlbiBtYXBwZWQgcmVnaW9uc1xuICAgICVzKSIsCkBAIC0yMzY1LDcgKzI4NTgsNyBAQAogICBtYXRjaF9zdHIgKz0gZm9ybWF0X2Z1bGxfcG9pbnRlcihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4ocHRyKSk7CiAgIEFTU0VSVF9NQVRDSChyZXN1bHQsIG1hdGNoX3N0cik7CiAKLSAgQVNTRVJUX01BVENIKHJlc3VsdCwgUiIoXG5tZW1vcnkgbWFwIFwoLipcKTogXChmYXVsdCBhZGRyZXNzIHByZWZpeGVkIHdpdGggLS0tPilcbikiKTsKKyAgQVNTRVJUX01BVENIKHJlc3VsdCwgUiIoXG5tZW1vcnkgbWFwIFwoLipcKTogXChmYXVsdCBhZGRyZXNzIHByZWZpeGVkIHdpdGggLS0tPlwpXG4pIik7CiAKICAgbWF0Y2hfc3RyID0gYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKFIiKFxuLS0tPiVzLipcbikiLCBmb3JtYXRfcG9pbnRlcihwdHIpLmNfc3RyKCkpOwogICBBU1NFUlRfTUFUQ0gocmVzdWx0LCBtYXRjaF9zdHIpOwpAQCAtMjU1MywzMCArMzA0NiwzNCBAQAogICBzdGQ6OnN0cmluZyBtYXRjaF9zdHI7CiAgIC8vIFZlcmlmeSBub25lLgogICBtYXRjaF9zdHIgPSBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoCi0gICAgICAiICAgICVzLSVzIC0tLSAgICAgICAgIDAgICAgICAxMDAwXFxuIiwKKyAgICAgICIgICAgJXMtJXMgLS0tICAgICAgICAgMCAgICAgICV4XFxuIiwKICAgICAgIGZvcm1hdF9tYXBfcG9pbnRlcihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4obm9uZV9tYXApKS5jX3N0cigpLAotICAgICAgZm9ybWF0X21hcF9wb2ludGVyKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pihub25lX21hcCkgKyBnZXRwYWdlc2l6ZSgpIC0gMSkuY19zdHIoKSk7CisgICAgICBmb3JtYXRfbWFwX3BvaW50ZXIocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KG5vbmVfbWFwKSArIGdldHBhZ2VzaXplKCkgLSAxKS5jX3N0cigpLAorICAgICAgZ2V0cGFnZXNpemUoKSk7CiAgIEFTU0VSVF9NQVRDSChyZXN1bHQsIG1hdGNoX3N0cik7CiAKICAgLy8gVmVyaWZ5IHJlYWQtb25seS4KICAgbWF0Y2hfc3RyID0gYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKAotICAgICAgIiAgICAlcy0lcyByLS0gICAgICAgICAwICAgICAgMTAwMFxcbiIsCisgICAgICAiICAgICVzLSVzIHItLSAgICAgICAgIDAgICAgICAleFxcbiIsCiAgICAgICBmb3JtYXRfbWFwX3BvaW50ZXIocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHJfbWFwKSkuY19zdHIoKSwKLSAgICAgIGZvcm1hdF9tYXBfcG9pbnRlcihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4ocl9tYXApICsgZ2V0cGFnZXNpemUoKSAtIDEpLmNfc3RyKCkpOworICAgICAgZm9ybWF0X21hcF9wb2ludGVyKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihyX21hcCkgKyBnZXRwYWdlc2l6ZSgpIC0gMSkuY19zdHIoKSwKKyAgICAgIGdldHBhZ2VzaXplKCkpOwogICBBU1NFUlRfTUFUQ0gocmVzdWx0LCBtYXRjaF9zdHIpOwogCiAgIC8vIFZlcmlmeSB3cml0ZS1vbmx5LgogICBtYXRjaF9zdHIgPSBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoCi0gICAgICAiICAgICVzLSVzIC13LSAgICAgICAgIDAgICAgICAxMDAwXFxuIiwKKyAgICAgICIgICAgJXMtJXMgLXctICAgICAgICAgMCAgICAgICV4XFxuIiwKICAgICAgIGZvcm1hdF9tYXBfcG9pbnRlcihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4od19tYXApKS5jX3N0cigpLAotICAgICAgZm9ybWF0X21hcF9wb2ludGVyKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pih3X21hcCkgKyBnZXRwYWdlc2l6ZSgpIC0gMSkuY19zdHIoKSk7CisgICAgICBmb3JtYXRfbWFwX3BvaW50ZXIocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHdfbWFwKSArIGdldHBhZ2VzaXplKCkgLSAxKS5jX3N0cigpLAorICAgICAgZ2V0cGFnZXNpemUoKSk7CiAgIEFTU0VSVF9NQVRDSChyZXN1bHQsIG1hdGNoX3N0cik7CiAKICAgLy8gVmVyaWZ5IGV4ZWMtb25seS4KICAgbWF0Y2hfc3RyID0gYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKAotICAgICAgIiAgICAlcy0lcyAtLXggICAgICAgICAwICAgICAgMTAwMFxcbiIsCisgICAgICAiICAgICVzLSVzIC0teCAgICAgICAgIDAgICAgICAleFxcbiIsCiAgICAgICBmb3JtYXRfbWFwX3BvaW50ZXIocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHhfbWFwKSkuY19zdHIoKSwKLSAgICAgIGZvcm1hdF9tYXBfcG9pbnRlcihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oeF9tYXApICsgZ2V0cGFnZXNpemUoKSAtIDEpLmNfc3RyKCkpOworICAgICAgZm9ybWF0X21hcF9wb2ludGVyKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pih4X21hcCkgKyBnZXRwYWdlc2l6ZSgpIC0gMSkuY19zdHIoKSwKKyAgICAgIGdldHBhZ2VzaXplKCkpOwogICBBU1NFUlRfTUFUQ0gocmVzdWx0LCBtYXRjaF9zdHIpOwogCiAgIC8vIFZlcmlmeSBmaWxlIG1hcCB3aXRoIG5vbi16ZXJvIG9mZnNldCBhbmQgYSBuYW1lLgpAQCAtMjY5Myw3ICszMTkwLDggQEAKICAgICB9CiAKICAgICBwcmV2X2ZpbGUgPSBtYXRjaFsxXTsKLSAgICB1bndpbmRzdGFjazo6RWxmIGVsZih1bndpbmRzdGFjazo6TWVtb3J5OjpDcmVhdGVGaWxlTWVtb3J5KHByZXZfZmlsZSwgMCkucmVsZWFzZSgpKTsKKyAgICBhdXRvIGVsZl9tZW1vcnkgPSB1bndpbmRzdGFjazo6TWVtb3J5OjpDcmVhdGVGaWxlTWVtb3J5KHByZXZfZmlsZSwgMCk7CisgICAgdW53aW5kc3RhY2s6OkVsZiBlbGYoZWxmX21lbW9yeSk7CiAgICAgaWYgKCFlbGYuSW5pdCgpIHx8ICFlbGYudmFsaWQoKSkgewogICAgICAgLy8gU2tpcHBpbmcgaW52YWxpZCBlbGYgZmlsZXMuCiAgICAgICBjb250aW51ZTsKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9oYW5kbGVyL2RlYnVnZ2VyZF9mYWxsYmFjay5jcHAgYi9kZWJ1Z2dlcmQvaGFuZGxlci9kZWJ1Z2dlcmRfZmFsbGJhY2suY3BwCmluZGV4IDQ3MjEzOTEuLjhhYjVmMjUgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC9oYW5kbGVyL2RlYnVnZ2VyZF9mYWxsYmFjay5jcHAKKysrIGIvZGVidWdnZXJkL2hhbmRsZXIvZGVidWdnZXJkX2ZhbGxiYWNrLmNwcApAQCAtNDgsNTAgKzQ4LDY5IEBACiBleHRlcm4gIkMiIGJvb2wgX19saW5rZXJfZW5hYmxlX2ZhbGxiYWNrX2FsbG9jYXRvcigpOwogZXh0ZXJuICJDIiB2b2lkIF9fbGlua2VyX2Rpc2FibGVfZmFsbGJhY2tfYWxsb2NhdG9yKCk7CiAKLS8vIFRoaXMgaXMgaW5jcmVkaWJseSBza2V0Y2h5IHRvIGRvIGluc2lkZSBvZiBhIHNpZ25hbCBoYW5kbGVyLCBlc3BlY2lhbGx5IHdoZW4gbGliYmFja3RyYWNlCi0vLyB1c2VzIHRoZSBDKysgc3RhbmRhcmQgbGlicmFyeSB0aHJvdWdob3V0LCBidXQgdGhpcyBjb2RlIHJ1bnMgaW4gdGhlIGxpbmtlciwgc28gd2UnbGwgYmUgdXNpbmcKLS8vIHRoZSBsaW5rZXIncyBtYWxsb2MgaW5zdGVhZCBvZiB0aGUgbGliYyBvbmUuIFN3aXRjaCBpdCBvdXQgZm9yIGEgcmVwbGFjZW1lbnQsIGp1c3QgaW4gY2FzZS4KLS8vCi0vLyBUaGlzIGlzbid0IHRoZSBkZWZhdWx0IG1ldGhvZCBvZiBkdW1waW5nIGJlY2F1c2UgaXQgY2FuIGZhaWwgaW4gY2FzZXMgc3VjaCBhcyBhZGRyZXNzIHNwYWNlCi0vLyBleGhhdXN0aW9uLgorLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgYSBmYWxsYmFjayBwYXRoIGZvciBwcm9jZXNzZXMgdGhhdCBkbyBub3QgYWxsb3cgdGhlCisvLyBub3JtYWwgZm9yayBhbmQgZXhlYyBvZiBjcmFzaF9kdW1wIHRvIGhhbmRsZSBjcmFzaGVzL3Vud2luZHMuCisvLyBUaGUgaXNzdWUgaXMgdGhhdCBhbGwgb2YgdGhpcyBoYXBwZW5zIGZyb20gd2l0aGluIGEgc2lnbmFsIGhhbmRsZXIsIHdoaWNoCisvLyBjYW4gY2F1c2UgcHJvYmxlbXMgc2luY2UgdGhpcyBjb2RlIHVzZXMgdGhlIGxpbmtlciBhbGxvY2F0b3Igd2hpY2ggaXMgbm90CisvLyB0aHJlYWQgc2FmZS4gSW4gb3JkZXIgdG8gYXZvaWQgYW55IHByb2JsZW1zIGFsbG9jYXRpbmcsIHRoZSBjb2RlIGNhbGxzCisvLyBhIGZ1bmN0aW9uIHRvIHN3aXRjaCB0byB1c2UgYSBmYWxsYmFjayBhbGxvY2F0b3IgaW4gdGhlIGxpbmtlciB0aGF0IHdpbGwKKy8vIG9ubHkgYmUgdXNlZCBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLiBBbGwgb2YgdGhlIGxpYnVud2luZHN0YWNrIGNvZGUgZG9lcworLy8gYWxsb2NhdGlvbnMgdXNpbmcgQysrIHN0bCwgYnV0IHNob3VsZCBiZSBmaW5lIHNpbmNlIHRoZSBjb2RlIHJ1bnMgaW4gdGhlCisvLyBsaW5rZXIgYW5kIHNob3VsZCB1c2UgdGhlIGZhbGxiYWNrIGhhbmRsZXIuCisKKy8vIFRoaXMgbWV0aG9kIGNhbiBzdGlsbCBmYWlsIGlmIHRoZSB2aXJ0dWFsIHNwYWNlIGlzIGV4aGF1c3RlZCBvbiBhIDMyIGJpdAorLy8gcHJvY2VzcyBvciBtbWFwIGZhaWxpbmcgZHVlIHRvIGhpdHRpbmcgdGhlIG1heGltdW0gbnVtYmVyIG9mIG1hcHMgKDY1NTM1CisvLyB0b3RhbCBtYXBzKSBvbiBhIDY0IGJpdCBwcm9jZXNzLgorCisvLyBDbGFzcyB0byBoYW5kbGUgYXV0b21hdGljYWxseSB0dXJuaW5nIG9uIGFuZCBvZmYgdGhlIGZhbGxiYWNrIGFsbG9jYXRvci4KK2NsYXNzIFNjb3BlZFVzZUZhbGxiYWNrQWxsb2NhdG9yIHsKKyBwdWJsaWM6CisgIFNjb3BlZFVzZUZhbGxiYWNrQWxsb2NhdG9yKCkgeyBFbmFibGUoKTsgfQorCisgIH5TY29wZWRVc2VGYWxsYmFja0FsbG9jYXRvcigpIHsgRGlzYWJsZSgpOyB9CisKKyAgYm9vbCBFbmFibGUoKSB7CisgICAgaWYgKCFlbmFibGVkXykgeworICAgICAgZW5hYmxlZF8gPSBfX2xpbmtlcl9lbmFibGVfZmFsbGJhY2tfYWxsb2NhdG9yKCk7CisgICAgICBpZiAoIWVuYWJsZWRfKSB7CisgICAgICAgIGFzeW5jX3NhZmVfZm9ybWF0X2xvZyhBTkRST0lEX0xPR19FUlJPUiwgImxpYmMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBlbmFibGUgZmFsbGJhY2sgYWxsb2NhdG9yLCBhbHJlYWR5IGluIHVzZS4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVuYWJsZWRfOworICB9CisKKyAgdm9pZCBEaXNhYmxlKCkgeworICAgIGlmIChlbmFibGVkXykgeworICAgICAgX19saW5rZXJfZGlzYWJsZV9mYWxsYmFja19hbGxvY2F0b3IoKTsKKyAgICAgIGVuYWJsZWRfID0gZmFsc2U7CisgICAgfQorICB9CisKKyAgYm9vbCBlbmFibGVkKCkgeyByZXR1cm4gZW5hYmxlZF87IH0KKworIHByaXZhdGU6CisgIGJvb2wgZW5hYmxlZF8gPSBmYWxzZTsKK307CisKIHN0YXRpYyB2b2lkIGRlYnVnZ2VyZF9mYWxsYmFja190cmFjZShpbnQgb3V0cHV0X2ZkLCB1Y29udGV4dF90KiB1Y29udGV4dCkgewotICBpZiAoIV9fbGlua2VyX2VuYWJsZV9mYWxsYmFja19hbGxvY2F0b3IoKSkgewotICAgIGFzeW5jX3NhZmVfZm9ybWF0X2xvZyhBTkRST0lEX0xPR19FUlJPUiwgImxpYmMiLCAiZmFsbGJhY2sgYWxsb2NhdG9yIGFscmVhZHkgaW4gdXNlIik7Ci0gICAgcmV0dXJuOwotICB9CisgIHN0ZDo6dW5pcXVlX3B0cjx1bndpbmRzdGFjazo6UmVncz4gcmVnczsKIAotICB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHVud2luZHN0YWNrOjpSZWdzPiByZWdzOworICBUaHJlYWRJbmZvIHRocmVhZDsKKyAgdGhyZWFkLnBpZCA9IGdldHBpZCgpOworICB0aHJlYWQudGlkID0gZ2V0dGlkKCk7CisgIHRocmVhZC50aHJlYWRfbmFtZSA9IGdldF90aHJlYWRfbmFtZShnZXR0aWQoKSk7CisgIHRocmVhZC5yZWdpc3RlcnMucmVzZXQoCisgICAgICB1bndpbmRzdGFjazo6UmVnczo6Q3JlYXRlRnJvbVVjb250ZXh0KHVud2luZHN0YWNrOjpSZWdzOjpDdXJyZW50QXJjaCgpLCB1Y29udGV4dCkpOwogCi0gICAgVGhyZWFkSW5mbyB0aHJlYWQ7Ci0gICAgdGhyZWFkLnBpZCA9IGdldHBpZCgpOwotICAgIHRocmVhZC50aWQgPSBnZXR0aWQoKTsKLSAgICB0aHJlYWQudGhyZWFkX25hbWUgPSBnZXRfdGhyZWFkX25hbWUoZ2V0dGlkKCkpOwotICAgIHRocmVhZC5yZWdpc3RlcnMucmVzZXQoCi0gICAgICAgIHVud2luZHN0YWNrOjpSZWdzOjpDcmVhdGVGcm9tVWNvbnRleHQodW53aW5kc3RhY2s6OlJlZ3M6OkN1cnJlbnRBcmNoKCksIHVjb250ZXh0KSk7Ci0KLSAgICAvLyBEbyBub3QgdXNlIHRoZSB0aHJlYWQgY2FjaGUgaGVyZSBiZWNhdXNlIGl0IHdpbGwgY2FsbCBwdGhyZWFkX2tleV9jcmVhdGUKLSAgICAvLyB3aGljaCBkb2Vzbid0IHdvcmsgaW4gbGlua2VyIGNvZGUuIFNlZSBiLzE4OTgwMzAwOS4KLSAgICAvLyBVc2UgYSBub3JtYWwgY2FjaGVkIG9iamVjdCBiZWNhdXNlIHRoZSB0aHJlYWQgaXMgc3RvcHBlZCwgYW5kIHRoZXJlCi0gICAgLy8gaXMgbm8gY2hhbmNlIG9mIGRhdGEgY2hhbmdpbmcgYmV0d2VlbiByZWFkcy4KLSAgICBhdXRvIHByb2Nlc3NfbWVtb3J5ID0gdW53aW5kc3RhY2s6Ok1lbW9yeTo6Q3JlYXRlUHJvY2Vzc01lbW9yeUNhY2hlZChnZXRwaWQoKSk7Ci0gICAgLy8gVE9ETzogQ3JlYXRlIHRoaXMgb25jZSBhbmQgc3RvcmUgaXQgaW4gYSBnbG9iYWw/Ci0gICAgdW53aW5kc3RhY2s6OkFuZHJvaWRMb2NhbFVud2luZGVyIHVud2luZGVyKHByb2Nlc3NfbWVtb3J5KTsKLSAgICBkdW1wX2JhY2t0cmFjZV90aHJlYWQob3V0cHV0X2ZkLCAmdW53aW5kZXIsIHRocmVhZCk7Ci0gIH0KLSAgX19saW5rZXJfZGlzYWJsZV9mYWxsYmFja19hbGxvY2F0b3IoKTsKLX0KLQotc3RhdGljIHZvaWQgZGVidWdnZXJkX2ZhbGxiYWNrX3RvbWJzdG9uZShpbnQgb3V0cHV0X2ZkLCBpbnQgcHJvdG9fZmQsIHVjb250ZXh0X3QqIHVjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWdpbmZvX3QqIHNpZ2luZm8sIHZvaWQqIGFib3J0X21lc3NhZ2UpIHsKLSAgaWYgKCFfX2xpbmtlcl9lbmFibGVfZmFsbGJhY2tfYWxsb2NhdG9yKCkpIHsKLSAgICBhc3luY19zYWZlX2Zvcm1hdF9sb2coQU5EUk9JRF9MT0dfRVJST1IsICJsaWJjIiwgImZhbGxiYWNrIGFsbG9jYXRvciBhbHJlYWR5IGluIHVzZSIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGVuZ3JhdmVfdG9tYnN0b25lX3Vjb250ZXh0KG91dHB1dF9mZCwgcHJvdG9fZmQsIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihhYm9ydF9tZXNzYWdlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnaW5mbywgdWNvbnRleHQpOwotICBfX2xpbmtlcl9kaXNhYmxlX2ZhbGxiYWNrX2FsbG9jYXRvcigpOworICAvLyBEbyBub3QgdXNlIHRoZSB0aHJlYWQgY2FjaGUgaGVyZSBiZWNhdXNlIGl0IHdpbGwgY2FsbCBwdGhyZWFkX2tleV9jcmVhdGUKKyAgLy8gd2hpY2ggZG9lc24ndCB3b3JrIGluIGxpbmtlciBjb2RlLiBTZWUgYi8xODk4MDMwMDkuCisgIC8vIFVzZSBhIG5vcm1hbCBjYWNoZWQgb2JqZWN0IGJlY2F1c2UgdGhlIHRocmVhZCBpcyBzdG9wcGVkLCBhbmQgdGhlcmUKKyAgLy8gaXMgbm8gY2hhbmNlIG9mIGRhdGEgY2hhbmdpbmcgYmV0d2VlbiByZWFkcy4KKyAgYXV0byBwcm9jZXNzX21lbW9yeSA9IHVud2luZHN0YWNrOjpNZW1vcnk6OkNyZWF0ZVByb2Nlc3NNZW1vcnlDYWNoZWQoZ2V0cGlkKCkpOworICAvLyBUT0RPOiBDcmVhdGUgdGhpcyBvbmNlIGFuZCBzdG9yZSBpdCBpbiBhIGdsb2JhbD8KKyAgdW53aW5kc3RhY2s6OkFuZHJvaWRMb2NhbFVud2luZGVyIHVud2luZGVyKHByb2Nlc3NfbWVtb3J5KTsKKyAgZHVtcF9iYWNrdHJhY2VfdGhyZWFkKG91dHB1dF9mZCwgJnVud2luZGVyLCB0aHJlYWQpOwogfQogCiBzdGF0aWMgYm9vbCBmb3J3YXJkX291dHB1dChpbnQgc3JjX2ZkLCBpbnQgZHN0X2ZkLCBwaWRfdCBleHBlY3RlZF90aWQpIHsKQEAgLTE1NCw2ICsxNzMsMTEgQEAKIH0KIAogc3RhdGljIHZvaWQgdHJhY2VfaGFuZGxlcihzaWdpbmZvX3QqIGluZm8sIHVjb250ZXh0X3QqIHVjb250ZXh0KSB7CisgIFNjb3BlZFVzZUZhbGxiYWNrQWxsb2NhdG9yIGFsbG9jYXRvcjsKKyAgaWYgKCFhbGxvY2F0b3IuZW5hYmxlZCgpKSB7CisgICAgcmV0dXJuOworICB9CisKICAgc3RhdGljIHN0ZDo6YXRvbWljPHVpbnQ2NF90PiB0cmFjZV9vdXRwdXQocGFja190aHJlYWRfZmQoLTEsIC0xKSk7CiAKICAgaWYgKGluZm8tPnNpX3ZhbHVlLnNpdmFsX3B0ciA9PSBrRGVidWdnZXJkRmFsbGJhY2tTaXZhbFB0clJlcXVlc3REdW1wKSB7CkBAIC0xODEsNiArMjA1LDExIEBACiAgICAgICBhc3luY19zYWZlX2Zvcm1hdF9sb2coQU5EUk9JRF9MT0dfRVJST1IsICJsaWJjIiwgImZhaWxlZCB0byB3cml0ZSB0byBvdXRwdXQgZmQiKTsKICAgICB9CiAKKyAgICAvLyBTdG9wIHVzaW5nIHRoZSBmYWxsYmFjayBhbGxvY2F0b3IgYmVmb3JlIHRoZSBjbG9zZS4gVGhpcyB3aWxsIHByZXZlbnQKKyAgICAvLyBhIHJhY2UgY29uZGl0aW9uIHdoZXJlIHRoZSB0aHJlYWQgYmFja3RyYWNpbmcgYWxsIG9mIHRoZSB0aHJlYWRzIHRyaWVzCisgICAgLy8gdG8gcmUtYWNxdWlyZSB0aGUgZmFsbGJhY2sgYWxsb2NhdG9yLgorICAgIGFsbG9jYXRvci5EaXNhYmxlKCk7CisKICAgICBjbG9zZShmZCk7CiAgICAgcmV0dXJuOwogICB9CkBAIC0yMTAsMTAgKzIzOSwxNSBAQAogCiAgIC8vIFNlbmQgYSBzaWduYWwgdG8gYWxsIG9mIG91ciBzaWJsaW5ncywgYXNraW5nIHRoZW0gdG8gZHVtcCB0aGVpciBzdGFjay4KICAgcGlkX3QgY3VycmVudF90aWQgPSBnZXR0aWQoKTsKLSAgaWYgKCFpdGVyYXRlX3RpZHMoY3VycmVudF90aWQsIFsmb3V0cHV0X2ZkLCAmY3VycmVudF90aWRdKHBpZF90IHRpZCkgeworICBpZiAoIWl0ZXJhdGVfdGlkcyhjdXJyZW50X3RpZCwgWyZhbGxvY2F0b3IsICZvdXRwdXRfZmQsICZjdXJyZW50X3RpZF0ocGlkX3QgdGlkKSB7CiAgICAgICAgIGlmIChjdXJyZW50X3RpZCA9PSB0aWQpIHsKICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKworICAgICAgICBpZiAoIWFsbG9jYXRvci5lbmFibGVkKCkpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKwogICAgICAgICAvLyBVc2UgYSBwaXBlLCB0byBiZSBhYmxlIHRvIGRldGVjdCBzaXR1YXRpb25zIHdoZXJlIHRoZSB0aHJlYWQgZ3JhY2VmdWxseSBleGl0cyBiZWZvcmUKICAgICAgICAgLy8gcmVjZWl2aW5nIG91ciBzaWduYWwuCiAgICAgICAgIHVuaXF1ZV9mZCBwaXBlX3JlYWQsIHBpcGVfd3JpdGU7CkBAIC0yMzMsMjIgKzI2NywyOSBAQAogICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCisgICAgICAgIC8vIERpc2FibGUgb3VyIHVzZSBvZiB0aGUgZmFsbGJhY2sgYWxsb2NhdG9yIHdoaWxlIHRoZSB0YXJnZXQgdGhyZWFkCisgICAgICAgIC8vIGlzIGdldHRpbmcgdGhlIGJhY2t0cmFjZS4KKyAgICAgICAgYWxsb2NhdG9yLkRpc2FibGUoKTsKKwogICAgICAgICBzaWdpbmZvX3Qgc2lnaW5mbyA9IHt9OwogICAgICAgICBzaWdpbmZvLnNpX2NvZGUgPSBTSV9RVUVVRTsKICAgICAgICAgc2lnaW5mby5zaV92YWx1ZS5zaXZhbF9wdHIgPSBrRGVidWdnZXJkRmFsbGJhY2tTaXZhbFB0clJlcXVlc3REdW1wOwogICAgICAgICBzaWdpbmZvLnNpX3BpZCA9IGdldHBpZCgpOwogICAgICAgICBzaWdpbmZvLnNpX3VpZCA9IGdldHVpZCgpOwogCi0gICAgICAgIGlmIChzeXNjYWxsKF9fTlJfcnRfdGdzaWdxdWV1ZWluZm8sIGdldHBpZCgpLCB0aWQsIEJJT05JQ19TSUdOQUxfREVCVUdHRVIsICZzaWdpbmZvKSAhPSAwKSB7CisgICAgICAgIGlmIChzeXNjYWxsKF9fTlJfcnRfdGdzaWdxdWV1ZWluZm8sIGdldHBpZCgpLCB0aWQsIEJJT05JQ19TSUdOQUxfREVCVUdHRVIsICZzaWdpbmZvKSA9PSAwKSB7CisgICAgICAgICAgaWYgKCFmb3J3YXJkX291dHB1dChwaXBlX3JlYWQuZ2V0KCksIG91dHB1dF9mZC5nZXQoKSwgdGlkKSkgeworICAgICAgICAgICAgYXN5bmNfc2FmZV9mb3JtYXRfbG9nKEFORFJPSURfTE9HX0VSUk9SLCAibGliYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVvdXQgZXhwaXJlZCB3aGlsZSB3YWl0aW5nIGZvciB0aHJlYWQgJWQgdG8gZHVtcCIsIHRpZCk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgewogICAgICAgICAgIGFzeW5jX3NhZmVfZm9ybWF0X2xvZyhBTkRST0lEX0xPR19FUlJPUiwgImxpYmMiLCAiZmFpbGVkIHRvIHNlbmQgdHJhY2Ugc2lnbmFsIHRvICVkOiAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpZCwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBib29sIHN1Y2Nlc3MgPSBmb3J3YXJkX291dHB1dChwaXBlX3JlYWQuZ2V0KCksIG91dHB1dF9mZC5nZXQoKSwgdGlkKTsKLSAgICAgICAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgICAgICAgYXN5bmNfc2FmZV9mb3JtYXRfbG9nKEFORFJPSURfTE9HX0VSUk9SLCAibGliYyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lb3V0IGV4cGlyZWQgd2hpbGUgd2FpdGluZyBmb3IgdGhyZWFkICVkIHRvIGR1bXAiLCB0aWQpOworICAgICAgICAvLyBUaGUgdGhyZWFkIHNob3VsZCBiZSBmaW5pc2hlZCBub3csIHNvIHRyeSBhbmQgcmUtZW5hYmxlIHRoZSBmYWxsYmFjayBhbGxvY2F0b3IuCisgICAgICAgIGlmICghYWxsb2NhdG9yLkVuYWJsZSgpKSB7CisgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKICAgICAgICAgLy8gUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBwb2xsIHN1Y2NlZWRzLCBjaGVjayB0byBzZWUgaWYgdGhlIHRocmVhZCB0b29rIGZkIG93bmVyc2hpcC4KQEAgLTI2MCwxNCArMzAxLDE1IEBACiAgICAgICAgICAgICBjbG9zZShmZCk7CiAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuOwogICAgICAgfSkpIHsKICAgICBhc3luY19zYWZlX2Zvcm1hdF9sb2coQU5EUk9JRF9MT0dfRVJST1IsICJsaWJjIiwgImZhaWxlZCB0byBvcGVuIC9wcm9jLyVkL3Rhc2s6ICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF90aWQsIHN0cmVycm9yKGVycm5vKSk7CiAgIH0KIAotICBkdW1wX2JhY2t0cmFjZV9mb290ZXIob3V0cHV0X2ZkLmdldCgpKTsKKyAgaWYgKGFsbG9jYXRvci5lbmFibGVkKCkpIHsKKyAgICBkdW1wX2JhY2t0cmFjZV9mb290ZXIob3V0cHV0X2ZkLmdldCgpKTsKKyAgfQorCiAgIHRvbWJzdG9uZWRfbm90aWZ5X2NvbXBsZXRpb24odG9tYnN0b25lX3NvY2tldC5nZXQoKSk7CiB9CiAKQEAgLTI5NSw3ICszMzcsMTMgQEAKICAgdW5pcXVlX2ZkIHRvbWJzdG9uZV9zb2NrZXQsIG91dHB1dF9mZCwgcHJvdG9fZmQ7CiAgIGJvb2wgdG9tYnN0b25lZF9jb25uZWN0ZWQgPSB0b21ic3RvbmVkX2Nvbm5lY3QoZ2V0cGlkKCksICZ0b21ic3RvbmVfc29ja2V0LCAmb3V0cHV0X2ZkLCAmcHJvdG9fZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RlYnVnZ2VyZFRvbWJzdG9uZVByb3RvKTsKLSAgZGVidWdnZXJkX2ZhbGxiYWNrX3RvbWJzdG9uZShvdXRwdXRfZmQuZ2V0KCksIHByb3RvX2ZkLmdldCgpLCB1Y29udGV4dCwgaW5mbywgYWJvcnRfbWVzc2FnZSk7CisgIHsKKyAgICBTY29wZWRVc2VGYWxsYmFja0FsbG9jYXRvciBhbGxvY2F0b3I7CisgICAgaWYgKGFsbG9jYXRvci5lbmFibGVkKCkpIHsKKyAgICAgIGVuZ3JhdmVfdG9tYnN0b25lX3Vjb250ZXh0KG91dHB1dF9mZC5nZXQoKSwgcHJvdG9fZmQuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oYWJvcnRfbWVzc2FnZSksIGluZm8sIHVjb250ZXh0KTsKKyAgICB9CisgIH0KICAgaWYgKHRvbWJzdG9uZWRfY29ubmVjdGVkKSB7CiAgICAgdG9tYnN0b25lZF9ub3RpZnlfY29tcGxldGlvbih0b21ic3RvbmVfc29ja2V0LmdldCgpKTsKICAgfQpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL2hhbmRsZXIvZGVidWdnZXJkX2hhbmRsZXIuY3BwIGIvZGVidWdnZXJkL2hhbmRsZXIvZGVidWdnZXJkX2hhbmRsZXIuY3BwCmluZGV4IGM2YTUzNWEuLjg4Mjc4Y2EgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC9oYW5kbGVyL2RlYnVnZ2VyZF9oYW5kbGVyLmNwcAorKysgYi9kZWJ1Z2dlcmQvaGFuZGxlci9kZWJ1Z2dlcmRfaGFuZGxlci5jcHAKQEAgLTM2LDEwICszNiwxMiBAQAogI2luY2x1ZGUgPHN5cy91aW8uaD4KICNpbmNsdWRlIDxzeXMvdW4uaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcGFyc2Vib29sLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3BhcnNlaW50Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CiAjaW5jbHVkZSA8YXN5bmNfc2FmZS9sb2cuaD4KQEAgLTEwOCwxMyArMTEwLDY2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGVyc2lzdC5kZXZpY2VfY29uZmlnLm1lbW9yeV9zYWZldHlfbmF0aXZlLnBlcm1pc3NpdmUucHJvY2Vzcy4lcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRwcm9nbmFtZSgpKTsKICAgLy8gRE8gTk9UIFJFUExBQ0UgdGhpcyB3aXRoIEdldEJvb2xQcm9wZXJ0eS4gVGhhdCB1c2VzIHN0ZDo6c3RyaW5nIHdoaWNoIGFsbG9jYXRlcywgc28gaXQgaXMKLSAgLy8gbm90IGFzeW5jLXNhZmUgKGFuZCB0aGlzIGZ1bmN0aW9uZyBnZXRzIHVzZWQgaW4gYSBzaWduYWwgaGFuZGxlcikuCisgIC8vIG5vdCBhc3luYy1zYWZlLCBhbmQgdGhpcyBmdW5jdGlvbiBnZXRzIHVzZWQgaW4gYSBzaWduYWwgaGFuZGxlci4KICAgcmV0dXJuIHByb3BlcnR5X3BhcnNlX2Jvb2woInBlcnNpc3Quc3lzLm10ZS5wZXJtaXNzaXZlIikgfHwKICAgICAgICAgIHByb3BlcnR5X3BhcnNlX2Jvb2woInBlcnNpc3QuZGV2aWNlX2NvbmZpZy5tZW1vcnlfc2FmZXR5X25hdGl2ZS5wZXJtaXNzaXZlLmRlZmF1bHQiKSB8fAogICAgICAgICAgcHJvcGVydHlfcGFyc2VfYm9vbChwcm9jZXNzX3N5c3Byb3BfbmFtZSkgfHwKICAgICAgICAgIChwZXJtaXNzaXZlX2VudiAmJiBQYXJzZUJvb2wocGVybWlzc2l2ZV9lbnYpID09IFBhcnNlQm9vbFJlc3VsdDo6a1RydWUpOwogfQogCitzdGF0aWMgYm9vbCBwYXJzZV91aW50X3dpdGhfZXJyb3JfcmVwb3J0aW5nKGNvbnN0IGNoYXIqIHMsIGNvbnN0IGNoYXIqIG5hbWUsIGludCogdikgeworICBpZiAoYW5kcm9pZDo6YmFzZTo6UGFyc2VJbnQocywgdikgJiYgKnYgPj0gMCkgeworICAgIHJldHVybiB0cnVlOworICB9CisgIGFzeW5jX3NhZmVfZm9ybWF0X2xvZyhBTkRST0lEX0xPR19FUlJPUiwgImxpYmMiLCAiaW52YWxpZCAlczogJXMiLCBuYW1lLCBzKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBXZSBjYW5ub3QgdXNlIGJhc2U6OkdldEludFByb3BlcnR5LCBiZWNhdXNlIHRoYXQgaW50ZXJuYWxseSB1c2VzCisvLyBzdGQ6OnN0cmluZywgd2hpY2ggYWxsb2NhdGVzLgorc3RhdGljIGJvb2wgcHJvcGVydHlfcGFyc2VfaW50KGNvbnN0IGNoYXIqIG5hbWUsIGludCogb3V0KSB7CisgIGNvbnN0IHByb3BfaW5mbyogcGkgPSBfX3N5c3RlbV9wcm9wZXJ0eV9maW5kKG5hbWUpOworICBpZiAoIXBpKSByZXR1cm4gZmFsc2U7CisgIHN0cnVjdCBjb29raWVfdCB7CisgICAgaW50KiBvdXQ7CisgICAgYm9vbCBlbXB0eTsKKyAgfSBjb29raWV7b3V0LCB0cnVlfTsKKyAgX19zeXN0ZW1fcHJvcGVydHlfcmVhZF9jYWxsYmFjaygKKyAgICAgIHBpLAorICAgICAgW10odm9pZCogcmF3X2Nvb2tpZSwgY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogdmFsdWUsIHVpbnQzMl90KSB7CisgICAgICAgIC8vIFByb3BlcnR5IGlzIHNldCB0byBlbXB0eSB2YWx1ZSwgaWdub3JpbmcuCisgICAgICAgIGlmICghKnZhbHVlKSByZXR1cm47CisgICAgICAgIGNvb2tpZV90KiBjb29raWUgPSByZWludGVycHJldF9jYXN0PGNvb2tpZV90Kj4ocmF3X2Nvb2tpZSk7CisgICAgICAgIGlmIChwYXJzZV91aW50X3dpdGhfZXJyb3JfcmVwb3J0aW5nKHZhbHVlLCBuYW1lLCBjb29raWUtPm91dCkpIGNvb2tpZS0+ZW1wdHkgPSBmYWxzZTsKKyAgICAgIH0sCisgICAgICAmY29va2llKTsKKyAgcmV0dXJuICFjb29raWUuZW1wdHk7Cit9CisKK3N0YXRpYyBpbnQgcGVybWlzc2l2ZV9tdGVfcmVuYWJsZV90aW1lcigpIHsKKyAgaWYgKGNoYXIqIGVudiA9IGdldGVudigiTVRFX1BFUk1JU1NJVkVfUkVFTkFCTEVfVElNRV9DUFVNUyIpKSB7CisgICAgaW50IHY7CisgICAgaWYgKHBhcnNlX3VpbnRfd2l0aF9lcnJvcl9yZXBvcnRpbmcoZW52LCAiTVRFX1BFUk1JU1NJVkVfUkVFTkFCTEVfVElNRV9DUFVNUyIsICZ2KSkgcmV0dXJuIHY7CisgIH0KKworICBjaGFyIHByb2Nlc3Nfc3lzcHJvcF9uYW1lWzUxMl07CisgIGFzeW5jX3NhZmVfZm9ybWF0X2J1ZmZlcihwcm9jZXNzX3N5c3Byb3BfbmFtZSwgc2l6ZW9mKHByb2Nlc3Nfc3lzcHJvcF9uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJwZXJzaXN0LnN5cy5tdGUucGVybWlzc2l2ZV9yZWVuYWJsZV90aW1lci5wcm9jZXNzLiVzIiwgZ2V0cHJvZ25hbWUoKSk7CisgIGludCB2OworICBpZiAocHJvcGVydHlfcGFyc2VfaW50KHByb2Nlc3Nfc3lzcHJvcF9uYW1lLCAmdikpIHJldHVybiB2OworICBpZiAocHJvcGVydHlfcGFyc2VfaW50KCJwZXJzaXN0LnN5cy5tdGUucGVybWlzc2l2ZV9yZWVuYWJsZV90aW1lci5kZWZhdWx0IiwgJnYpKSByZXR1cm4gdjsKKyAgY2hhciBwcm9jZXNzX2RldmljZWNvbmZfc3lzcHJvcF9uYW1lWzUxMl07CisgIGFzeW5jX3NhZmVfZm9ybWF0X2J1ZmZlcigKKyAgICAgIHByb2Nlc3NfZGV2aWNlY29uZl9zeXNwcm9wX25hbWUsIHNpemVvZihwcm9jZXNzX2RldmljZWNvbmZfc3lzcHJvcF9uYW1lKSwKKyAgICAgICJwZXJzaXN0LmRldmljZV9jb25maWcubWVtb3J5X3NhZmV0eV9uYXRpdmUucGVybWlzc2l2ZV9yZWVuYWJsZV90aW1lci5wcm9jZXNzLiVzIiwKKyAgICAgIGdldHByb2duYW1lKCkpOworICBpZiAocHJvcGVydHlfcGFyc2VfaW50KHByb2Nlc3NfZGV2aWNlY29uZl9zeXNwcm9wX25hbWUsICZ2KSkgcmV0dXJuIHY7CisgIGlmIChwcm9wZXJ0eV9wYXJzZV9pbnQoCisgICAgICAgICAgInBlcnNpc3QuZGV2aWNlX2NvbmZpZy5tZW1vcnlfc2FmZXR5X25hdGl2ZS5wZXJtaXNzaXZlX3JlZW5hYmxlX3RpbWVyLmRlZmF1bHQiLCAmdikpCisgICAgcmV0dXJuIHY7CisgIHJldHVybiAwOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgZnV0ZXhfd2FpdCh2b2xhdGlsZSB2b2lkKiBmdHgsIGludCB2YWx1ZSkgewogICBzeXNjYWxsKF9fTlJfZnV0ZXgsIGZ0eCwgRlVURVhfV0FJVCwgdmFsdWUsIG51bGxwdHIsIG51bGxwdHIsIDApOwogfQpAQCAtMjc1LDEwICszMzAsNiBAQAogICB9CiB9CiAKLXN0YXRpYyBwaWRfdCBfX2ZvcmsoKSB7Ci0gIHJldHVybiBjbG9uZShudWxscHRyLCBudWxscHRyLCAwLCBudWxscHRyKTsKLX0KLQogLy8gRG91YmxlLWNsb25lLCB3aXRoIENMT05FX0ZJTEVTIHRvIHNoYXJlIHRoZSBmaWxlIGRlc2NyaXB0b3IgdGFibGUgZm9yIGtjbXAgdmFsaWRhdGlvbi4KIC8vIFJldHVybnMgMCBpbiB0aGUgb3JwaGFuZWQgY2hpbGQsIHRoZSBwaWQgb2YgdGhlIG9ycGhhbiBpbiB0aGUgb3JpZ2luYWwgcHJvY2Vzcywgb3IgLTEgb24gZmFpbHVyZS4KIHN0YXRpYyB2b2lkIGNyZWF0ZV92bV9wcm9jZXNzKCkgewpAQCAtMzM4LDYgKzM4OSwxMyBAQAogICByZXR1cm4ga0RlYnVnZ2VyZFRvbWJzdG9uZVByb3RvOwogfQogCitzdGF0aWMgY29uc3QgY2hhciogZ2V0X3Vud2luZF90eXBlKGNvbnN0IGRlYnVnZ2VyX3RocmVhZF9pbmZvKiB0aHJlYWRfaW5mbykgeworICBpZiAodGhyZWFkX2luZm8tPnNpZ2luZm8tPnNpX3NpZ25vID09IEJJT05JQ19TSUdOQUxfREVCVUdHRVIpIHsKKyAgICByZXR1cm4gIlVud2luZCByZXF1ZXN0IjsKKyAgfQorICByZXR1cm4gIkNyYXNoIGR1ZSB0byBzaWduYWwiOworfQorCiBzdGF0aWMgaW50IGRlYnVnZ2VyZF9kaXNwYXRjaF9wc2V1ZG90aHJlYWQodm9pZCogYXJnKSB7CiAgIGRlYnVnZ2VyX3RocmVhZF9pbmZvKiB0aHJlYWRfaW5mbyA9IHN0YXRpY19jYXN0PGRlYnVnZ2VyX3RocmVhZF9pbmZvKj4oYXJnKTsKIApAQCAtMzk1LDcgKzQ1Myw5IEBACiAgICAgQVNTRVJUX1NBTUVfT0ZGU0VUKHNjdWRvX3JlZ2lvbl9pbmZvLCBzY3Vkb19yZWdpb25faW5mbyk7CiAgICAgQVNTRVJUX1NBTUVfT0ZGU0VUKHNjdWRvX3JpbmdfYnVmZmVyLCBzY3Vkb19yaW5nX2J1ZmZlcik7CiAgICAgQVNTRVJUX1NBTUVfT0ZGU0VUKHNjdWRvX3JpbmdfYnVmZmVyX3NpemUsIHNjdWRvX3JpbmdfYnVmZmVyX3NpemUpOwotICAgIEFTU0VSVF9TQU1FX09GRlNFVChyZWNvdmVyYWJsZV9nd3BfYXNhbl9jcmFzaCwgcmVjb3ZlcmFibGVfZ3dwX2FzYW5fY3Jhc2gpOworICAgIEFTU0VSVF9TQU1FX09GRlNFVChzY3Vkb19zdGFja19kZXBvdF9zaXplLCBzY3Vkb19zdGFja19kZXBvdF9zaXplKTsKKyAgICBBU1NFUlRfU0FNRV9PRkZTRVQocmVjb3ZlcmFibGVfY3Jhc2gsIHJlY292ZXJhYmxlX2NyYXNoKTsKKyAgICBBU1NFUlRfU0FNRV9PRkZTRVQoY3Jhc2hfZGV0YWlsX3BhZ2UsIGNyYXNoX2RldGFpbF9wYWdlKTsKICN1bmRlZiBBU1NFUlRfU0FNRV9PRkZTRVQKIAogICAgIGlvdnNbM10gPSB7Lmlvdl9iYXNlID0gJnRocmVhZF9pbmZvLT5wcm9jZXNzX2luZm8sCkBAIC00MjQsNyArNDg0LDcgQEAKICAgfQogCiAgIC8vIERvbid0IHVzZSBmb3JrKDIpIHRvIGF2b2lkIGNhbGxpbmcgcHRocmVhZF9hdGZvcmsgaGFuZGxlcnMuCi0gIHBpZF90IGNyYXNoX2R1bXBfcGlkID0gX19mb3JrKCk7CisgIHBpZF90IGNyYXNoX2R1bXBfcGlkID0gX0ZvcmsoKTsKICAgaWYgKGNyYXNoX2R1bXBfcGlkID09IC0xKSB7CiAgICAgYXN5bmNfc2FmZV9mb3JtYXRfbG9nKEFORFJPSURfTE9HX0ZBVEFMLCAibGliYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gZm9yayBpbiBkZWJ1Z2dlcmQgc2lnbmFsIGhhbmRsZXI6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKQEAgLTQ0OSw4ICs1MDksOCBAQAogCiAgICAgZXhlY2xlKENSQVNIX0RVTVBfUEFUSCwgQ1JBU0hfRFVNUF9OQU1FLCBtYWluX3RpZCwgcHNldWRvdGhyZWFkX3RpZCwgZGVidWdnZXJkX2R1bXBfdHlwZSwKICAgICAgICAgICAgbnVsbHB0ciwgbnVsbHB0cik7Ci0gICAgYXN5bmNfc2FmZV9mb3JtYXRfbG9nKEFORFJPSURfTE9HX0ZBVEFMLCAibGliYyIsICJmYWlsZWQgdG8gZXhlYyBjcmFzaF9kdW1wIGhlbHBlcjogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOworICAgIGFzeW5jX3NhZmVfZm9ybWF0X2xvZyhBTkRST0lEX0xPR19GQVRBTCwgImxpYmMiLCAiJXM6IGZhaWxlZCB0byBleGVjIGNyYXNoX2R1bXAgaGVscGVyOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF91bndpbmRfdHlwZSh0aHJlYWRfaW5mbyksIHN0cmVycm9yKGVycm5vKSk7CiAgICAgcmV0dXJuIDE7CiAgIH0KIApAQCAtNDcxLDI2ICs1MzEsMzAgQEAKICAgfSBlbHNlIHsKICAgICAvLyBTb21ldGhpbmcgd2VudCB3cm9uZywgbG9nIGl0LgogICAgIGlmIChyYyA9PSAtMSkgewotICAgICAgYXN5bmNfc2FmZV9mb3JtYXRfbG9nKEFORFJPSURfTE9HX0ZBVEFMLCAibGliYyIsICJyZWFkIG9mIElQQyBwaXBlIGZhaWxlZDogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7CisgICAgICBhc3luY19zYWZlX2Zvcm1hdF9sb2coQU5EUk9JRF9MT0dfRkFUQUwsICJsaWJjIiwgIiVzOiByZWFkIG9mIElQQyBwaXBlIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF91bndpbmRfdHlwZSh0aHJlYWRfaW5mbyksIHN0cmVycm9yKGVycm5vKSk7CiAgICAgfSBlbHNlIGlmIChyYyA9PSAwKSB7CiAgICAgICBhc3luY19zYWZlX2Zvcm1hdF9sb2coQU5EUk9JRF9MT0dfRkFUQUwsICJsaWJjIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jhc2hfZHVtcCBoZWxwZXIgZmFpbGVkIHRvIGV4ZWMsIG9yIHdhcyBraWxsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IGNyYXNoX2R1bXAgaGVscGVyIGZhaWxlZCB0byBleGVjLCBvciB3YXMga2lsbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfdW53aW5kX3R5cGUodGhyZWFkX2luZm8pKTsKICAgICB9IGVsc2UgaWYgKHJjICE9IDEpIHsKICAgICAgIGFzeW5jX3NhZmVfZm9ybWF0X2xvZyhBTkRST0lEX0xPR19GQVRBTCwgImxpYmMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkIG9mIElQQyBwaXBlIHJldHVybmVkIHVuZXhwZWN0ZWQgdmFsdWU6ICV6ZCIsIHJjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IHJlYWQgb2YgSVBDIHBpcGUgcmV0dXJuZWQgdW5leHBlY3RlZCB2YWx1ZTogJXpkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfdW53aW5kX3R5cGUodGhyZWFkX2luZm8pLCByYyk7CiAgICAgfSBlbHNlIGlmIChidWZbMF0gIT0gJ1wxJykgewotICAgICAgYXN5bmNfc2FmZV9mb3JtYXRfbG9nKEFORFJPSURfTE9HX0ZBVEFMLCAibGliYyIsICJjcmFzaF9kdW1wIGhlbHBlciByZXBvcnRlZCBmYWlsdXJlIik7CisgICAgICBhc3luY19zYWZlX2Zvcm1hdF9sb2coQU5EUk9JRF9MT0dfRkFUQUwsICJsaWJjIiwgIiVzOiBjcmFzaF9kdW1wIGhlbHBlciByZXBvcnRlZCBmYWlsdXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfdW53aW5kX3R5cGUodGhyZWFkX2luZm8pKTsKICAgICB9CiAgIH0KIAogICAvLyBEb24ndCBsZWF2ZSBhIHpvbWJpZSBjaGlsZC4KICAgaW50IHN0YXR1czsKICAgaWYgKFRFTVBfRkFJTFVSRV9SRVRSWSh3YWl0cGlkKGNyYXNoX2R1bXBfcGlkLCAmc3RhdHVzLCAwKSkgPT0gLTEpIHsKLSAgICBhc3luY19zYWZlX2Zvcm1hdF9sb2coQU5EUk9JRF9MT0dfRkFUQUwsICJsaWJjIiwgImZhaWxlZCB0byB3YWl0IGZvciBjcmFzaF9kdW1wIGhlbHBlcjogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOworICAgIGFzeW5jX3NhZmVfZm9ybWF0X2xvZyhBTkRST0lEX0xPR19GQVRBTCwgImxpYmMiLCAiJXM6IGZhaWxlZCB0byB3YWl0IGZvciBjcmFzaF9kdW1wIGhlbHBlcjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfdW53aW5kX3R5cGUodGhyZWFkX2luZm8pLCBzdHJlcnJvcihlcnJubykpOwogICB9IGVsc2UgaWYgKFdJRlNUT1BQRUQoc3RhdHVzKSB8fCBXSUZTSUdOQUxFRChzdGF0dXMpKSB7Ci0gICAgYXN5bmNfc2FmZV9mb3JtYXRfbG9nKEFORFJPSURfTE9HX0ZBVEFMLCAibGliYyIsICJjcmFzaF9kdW1wIGhlbHBlciBjcmFzaGVkIG9yIHN0b3BwZWQiKTsKKyAgICBhc3luY19zYWZlX2Zvcm1hdF9sb2coQU5EUk9JRF9MT0dfRkFUQUwsICJsaWJjIiwgIiVzOiBjcmFzaF9kdW1wIGhlbHBlciBjcmFzaGVkIG9yIHN0b3BwZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfdW53aW5kX3R5cGUodGhyZWFkX2luZm8pKTsKICAgfQogCiAgIGlmIChzdWNjZXNzKSB7CkBAIC01NTIsOCArNjE2LDE0IEBACiAgIH0KIAogICBkZWJ1Z2dlcl9wcm9jZXNzX2luZm8gcHJvY2Vzc19pbmZvID0ge307CisgIGlmIChnX2NhbGxiYWNrcy5nZXRfcHJvY2Vzc19pbmZvKSB7CisgICAgcHJvY2Vzc19pbmZvID0gZ19jYWxsYmFja3MuZ2V0X3Byb2Nlc3NfaW5mbygpOworICB9CiAgIHVpbnRwdHJfdCBzaV92YWwgPSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oaW5mby0+c2lfcHRyKTsKICAgaWYgKHNpZ25hbF9udW1iZXIgPT0gQklPTklDX1NJR05BTF9ERUJVR0dFUikgeworICAgIC8vIEFwcGxpY2F0aW9ucyBjYW4gc2V0IGFib3J0IG1lc3NhZ2VzIHZpYSBhbmRyb2lkX3NldF9hYm9ydF9tZXNzYWdlIHdpdGhvdXQKKyAgICAvLyBhY3R1YWxseSBhYm9ydGluZzsgaWdub3JlIHRob3NlIG1lc3NhZ2VzIGluIG5vbi1mYXRhbCBkdW1wcy4KKyAgICBwcm9jZXNzX2luZm8uYWJvcnRfbXNnID0gbnVsbHB0cjsKICAgICBpZiAoaW5mby0+c2lfY29kZSA9PSBTSV9RVUVVRSAmJiBpbmZvLT5zaV9waWQgPT0gX19nZXRwaWQoKSkgewogICAgICAgLy8gQWxsb3cgZm9yIHRoZSBhYm9ydCBtZXNzYWdlIHRvIGJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkIHZpYSB0aGUgc2lncXVldWUgdmFsdWUuCiAgICAgICAvLyBLZWVwIHRoZSBib3R0b20gYml0IGludGFjdCBmb3IgcmVwcmVzZW50aW5nIHdoZXRoZXIgd2Ugd2FudCBhIGJhY2t0cmFjZSBvciBhIHRvbWJzdG9uZS4KQEAgLTU2MiwxMSArNjMyLDEwIEBACiAgICAgICAgIGluZm8tPnNpX3B0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHNpX3ZhbCAmIDEpOwogICAgICAgfQogICAgIH0KLSAgfSBlbHNlIGlmIChnX2NhbGxiYWNrcy5nZXRfcHJvY2Vzc19pbmZvKSB7Ci0gICAgcHJvY2Vzc19pbmZvID0gZ19jYWxsYmFja3MuZ2V0X3Byb2Nlc3NfaW5mbygpOwogICB9CiAKICAgZ3dwX2FzYW5fY2FsbGJhY2tzX3QgZ3dwX2FzYW5fY2FsbGJhY2tzID0ge307CisgIGJvb2wgcmVjb3ZlcmFibGVfZ3dwX2FzYW5fY3Jhc2ggPSBmYWxzZTsKICAgaWYgKGdfY2FsbGJhY2tzLmdldF9nd3BfYXNhbl9jYWxsYmFja3MgIT0gbnVsbHB0cikgewogICAgIC8vIEdXUC1BU2FuIGNhdGNoZXMgdXNlLWFmdGVyLWZyZWUgYW5kIGhlYXAtYnVmZmVyLW92ZXJmbG93IGJ5IHVzaW5nIFBST1RfTk9ORQogICAgIC8vIGd1YXJkIHBhZ2VzLCB3aGljaCBsZWFkIHRvIFNFR1YuIE5vcm1hbGx5LCBkZWJ1Z2dlcmQgcHJpbnRzIGEgYnVnIHJlcG9ydApAQCAtNTgxLDEwICs2NTAsNTggQEAKICAgICAgICAgZ3dwX2FzYW5fY2FsbGJhY2tzLmRlYnVnZ2VyZF9nd3BfYXNhbl9wb3N0X2NyYXNoX3JlcG9ydCAmJgogICAgICAgICBnd3BfYXNhbl9jYWxsYmFja3MuZGVidWdnZXJkX25lZWRzX2d3cF9hc2FuX3JlY292ZXJ5KGluZm8tPnNpX2FkZHIpKSB7CiAgICAgICBnd3BfYXNhbl9jYWxsYmFja3MuZGVidWdnZXJkX2d3cF9hc2FuX3ByZV9jcmFzaF9yZXBvcnQoaW5mby0+c2lfYWRkcik7Ci0gICAgICBwcm9jZXNzX2luZm8ucmVjb3ZlcmFibGVfZ3dwX2FzYW5fY3Jhc2ggPSB0cnVlOworICAgICAgcmVjb3ZlcmFibGVfZ3dwX2FzYW5fY3Jhc2ggPSB0cnVlOworICAgICAgcHJvY2Vzc19pbmZvLnJlY292ZXJhYmxlX2NyYXNoID0gdHJ1ZTsKICAgICB9CiAgIH0KIAorICBpZiAoaW5mby0+c2lfc2lnbm8gPT0gU0lHU0VHViAmJgorICAgICAgKGluZm8tPnNpX2NvZGUgPT0gU0VHVl9NVEVTRVJSIHx8IGluZm8tPnNpX2NvZGUgPT0gU0VHVl9NVEVBRVJSKSAmJiBpc19wZXJtaXNzaXZlX210ZSgpKSB7CisgICAgcHJvY2Vzc19pbmZvLnJlY292ZXJhYmxlX2NyYXNoID0gdHJ1ZTsKKyAgICAvLyBJZiB3ZSBhcmUgaW4gcGVybWlzc2l2ZSBNVEUgbW9kZSwgd2UgZG8gbm90IGNyYXNoLCBidXQgaW5zdGVhZCBkaXNhYmxlIE1URSBvbiB0aGlzIHRocmVhZCwKKyAgICAvLyBhbmQgdGhlbiBsZXQgdGhlIGZhaWxpbmcgaW5zdHJ1Y3Rpb24gYmUgcmV0cmllZC4gVGhlIHNlY29uZCB0aW1lIHNob3VsZCB3b3JrIChleGNlcHQKKyAgICAvLyBpZiB0aGVyZSBpcyBhbm90aGVyIG5vbi1NVEUgZmF1bHQpLgorICAgIGludCB0YWdnZWRfYWRkcl9jdHJsID0gcHJjdGwoUFJfR0VUX1RBR0dFRF9BRERSX0NUUkwsIDAsIDAsIDAsIDApOworICAgIGlmICh0YWdnZWRfYWRkcl9jdHJsIDwgMCkgeworICAgICAgZmF0YWxfZXJybm8oImZhaWxlZCB0byBQUl9HRVRfVEFHR0VEX0FERFJfQ1RSTCIpOworICAgIH0KKyAgICBpbnQgcHJldmlvdXMgPSB0YWdnZWRfYWRkcl9jdHJsICYgUFJfTVRFX1RDRl9NQVNLOworICAgIHRhZ2dlZF9hZGRyX2N0cmwgPSAodGFnZ2VkX2FkZHJfY3RybCAmIH5QUl9NVEVfVENGX01BU0spIHwgUFJfTVRFX1RDRl9OT05FOworICAgIGlmIChwcmN0bChQUl9TRVRfVEFHR0VEX0FERFJfQ1RSTCwgdGFnZ2VkX2FkZHJfY3RybCwgMCwgMCwgMCkgPCAwKSB7CisgICAgICBmYXRhbF9lcnJubygiZmFpbGVkIHRvIFBSX1NFVF9UQUdHRURfQUREUl9DVFJMIik7CisgICAgfQorICAgIGlmIChpbnQgcmVlbmFibGVfdGltZXIgPSBwZXJtaXNzaXZlX210ZV9yZW5hYmxlX3RpbWVyKCkpIHsKKyAgICAgIGFzeW5jX3NhZmVfZm9ybWF0X2xvZyhBTkRST0lEX0xPR19FUlJPUiwgImxpYmMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNVEUgRVJST1IgREVURUNURUQgQlVUIFJVTk5JTkcgSU4gUEVSTUlTU0lWRSBNT0RFLiBDT05USU5VSU5HIFdJVEggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNVEUgRElTQUJMRUQgRk9SICVkIE1TIE9GIENQVSBUSU1FLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVlbmFibGVfdGltZXIpOworICAgICAgdGltZXJfdCB0aW1lcmlke307CisgICAgICBzdHJ1Y3Qgc2lnZXZlbnQgc2V2IHt9OworICAgICAgc2V2LnNpZ2V2X3NpZ25vID0gQklPTklDX0VOQUJMRV9NVEU7CisgICAgICBzZXYuc2lnZXZfbm90aWZ5ID0gU0lHRVZfVEhSRUFEX0lEOworICAgICAgc2V2LnNpZ2V2X3ZhbHVlLnNpdmFsX2ludCA9IHByZXZpb3VzOworICAgICAgc2V2LnNpZ2V2X25vdGlmeV90aHJlYWRfaWQgPSBfX2dldHRpZCgpOworICAgICAgLy8gVGhpcyBNVVNUIGJlIENMT0NLX1RIUkVBRF9DUFVUSU1FX0lELiBJZiB3ZSB1c2VkIENMT0NLX01PTk9UT05JQyB3ZSBjb3VsZCBnZXQgc3R1Y2sKKyAgICAgIC8vIGluIGFuIGVuZGxlc3MgbG9vcCBvZiByZS1ydW5uaW5nIHRoZSBzYW1lIGluc3RydWN0aW9uLCBjYWxsaW5nIHRoaXMgc2lnbmFsIGhhbmRsZXIsCisgICAgICAvLyBhbmQgcmUtZW5hYmxpbmcgTVRFIGJlZm9yZSB3ZSBoYWQgYSBjaGFuY2UgdG8gcmUtcnVuIHRoZSBpbnN0cnVjdGlvbi4KKyAgICAgIGlmICh0aW1lcl9jcmVhdGUoQ0xPQ0tfVEhSRUFEX0NQVVRJTUVfSUQsICZzZXYsICZ0aW1lcmlkKSA9PSAtMSkgeworICAgICAgICBmYXRhbF9lcnJubygidGltZXJfY3JlYXRlKCkgZmFpbGVkIik7CisgICAgICB9CisgICAgICBzdHJ1Y3QgaXRpbWVyc3BlYyBpdHMge307CisgICAgICBpdHMuaXRfdmFsdWUudHZfc2VjID0gcmVlbmFibGVfdGltZXIgLyAxMDAwOworICAgICAgaXRzLml0X3ZhbHVlLnR2X25zZWMgPSAocmVlbmFibGVfdGltZXIgJSAxMDAwKSAqIDEwMDAwMDA7CisKKyAgICAgIGlmICh0aW1lcl9zZXR0aW1lKHRpbWVyaWQsIDAsICZpdHMsIG51bGxwdHIpID09IC0xKSB7CisgICAgICAgIGZhdGFsX2Vycm5vKCJ0aW1lcl9zZXR0aW1lKCkgZmFpbGVkIik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGFzeW5jX3NhZmVfZm9ybWF0X2xvZygKKyAgICAgICAgICBBTkRST0lEX0xPR19FUlJPUiwgImxpYmMiLAorICAgICAgICAgICJNVEUgRVJST1IgREVURUNURUQgQlVUIFJVTk5JTkcgSU4gUEVSTUlTU0lWRSBNT0RFLiBDT05USU5VSU5HIFdJVEggTVRFIERJU0FCTEVELiIpOworICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmY3Jhc2hfbXV0ZXgpOworICB9CisKICAgLy8gSWYgc2l2YWxfaW50IGlzIH4wLCBpdCBtZWFucyB0aGF0IHRoZSBmYWxsYmFjayBoYW5kbGVyIGhhcyBiZWVuIGNhbGxlZAogICAvLyBvbmNlIGJlZm9yZSBhbmQgdGhpcyBmdW5jdGlvbiBpcyBiZWluZyBjYWxsZWQgYWdhaW4gdG8gZHVtcCB0aGUgc3RhY2sKICAgLy8gb2YgYSBzcGVjaWZpYyB0aHJlYWQuIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIHByY3RsIGNhbGwgbWlnaHQgcmV0dXJuIDEsCkBAIC01OTYsNyArNzEzLDcgQEAKICAgICAvLyB5b3UgY2FuIG9ubHkgc2V0IE5PX05FV19QUklWUyB0byAxLCBhbmQgdGhlIGVmZmVjdCBzaG91bGQgYmUgYXQgd29yc3QgYSBzaW5nbGUgbWlzc2luZwogICAgIC8vIEFOUiB0cmFjZS4KICAgICBkZWJ1Z2dlcmRfZmFsbGJhY2tfaGFuZGxlcihpbmZvLCB1Y29udGV4dCwgcHJvY2Vzc19pbmZvLmFib3J0X21zZyk7Ci0gICAgaWYgKG5vX25ld19wcml2cyAmJiBwcm9jZXNzX2luZm8ucmVjb3ZlcmFibGVfZ3dwX2FzYW5fY3Jhc2gpIHsKKyAgICBpZiAobm9fbmV3X3ByaXZzICYmIHJlY292ZXJhYmxlX2d3cF9hc2FuX2NyYXNoKSB7CiAgICAgICBnd3BfYXNhbl9jYWxsYmFja3MuZGVidWdnZXJkX2d3cF9hc2FuX3Bvc3RfY3Jhc2hfcmVwb3J0KGluZm8tPnNpX2FkZHIpOwogICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTY3MywyOSArNzkwLDE0IEBACiAgICAgLy8gSWYgdGhlIHNpZ25hbCBpcyBmYXRhbCwgZG9uJ3QgdW5sb2NrIHRoZSBtdXRleCB0byBwcmV2ZW50IG90aGVyIGNyYXNoaW5nIHRocmVhZHMgZnJvbQogICAgIC8vIHN0YXJ0aW5nIHRvIGR1bXAgcmlnaHQgYmVmb3JlIG91ciBkZWF0aC4KICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmY3Jhc2hfbXV0ZXgpOwotICB9IGVsc2UgaWYgKHByb2Nlc3NfaW5mby5yZWNvdmVyYWJsZV9nd3BfYXNhbl9jcmFzaCkgewotICAgIGd3cF9hc2FuX2NhbGxiYWNrcy5kZWJ1Z2dlcmRfZ3dwX2FzYW5fcG9zdF9jcmFzaF9yZXBvcnQoaW5mby0+c2lfYWRkcik7CisgIH0gZWxzZSBpZiAocHJvY2Vzc19pbmZvLnJlY292ZXJhYmxlX2NyYXNoKSB7CisgICAgaWYgKHJlY292ZXJhYmxlX2d3cF9hc2FuX2NyYXNoKSB7CisgICAgICBnd3BfYXNhbl9jYWxsYmFja3MuZGVidWdnZXJkX2d3cF9hc2FuX3Bvc3RfY3Jhc2hfcmVwb3J0KGluZm8tPnNpX2FkZHIpOworICAgIH0KICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmY3Jhc2hfbXV0ZXgpOwogICB9CiAjaWZkZWYgX19hYXJjaDY0X18KLSAgZWxzZSBpZiAoaW5mby0+c2lfc2lnbm8gPT0gU0lHU0VHViAmJgotICAgICAgICAgICAoaW5mby0+c2lfY29kZSA9PSBTRUdWX01URVNFUlIgfHwgaW5mby0+c2lfY29kZSA9PSBTRUdWX01URUFFUlIpICYmCi0gICAgICAgICAgIGlzX3Blcm1pc3NpdmVfbXRlKCkpIHsKLSAgICAvLyBJZiB3ZSBhcmUgaW4gcGVybWlzc2l2ZSBNVEUgbW9kZSwgd2UgZG8gbm90IGNyYXNoLCBidXQgaW5zdGVhZCBkaXNhYmxlIE1URSBvbiB0aGlzIHRocmVhZCwKLSAgICAvLyBhbmQgdGhlbiBsZXQgdGhlIGZhaWxpbmcgaW5zdHJ1Y3Rpb24gYmUgcmV0cmllZC4gVGhlIHNlY29uZCB0aW1lIHNob3VsZCB3b3JrIChleGNlcHQKLSAgICAvLyBpZiB0aGVyZSBpcyBhbm90aGVyIG5vbi1NVEUgZmF1bHQpLgotICAgIGludCB0YWdnZWRfYWRkcl9jdHJsID0gcHJjdGwoUFJfR0VUX1RBR0dFRF9BRERSX0NUUkwsIDAsIDAsIDAsIDApOwotICAgIGlmICh0YWdnZWRfYWRkcl9jdHJsIDwgMCkgewotICAgICAgZmF0YWxfZXJybm8oImZhaWxlZCB0byBQUl9HRVRfVEFHR0VEX0FERFJfQ1RSTCIpOwotICAgIH0KLSAgICB0YWdnZWRfYWRkcl9jdHJsID0gKHRhZ2dlZF9hZGRyX2N0cmwgJiB+UFJfTVRFX1RDRl9NQVNLKSB8IFBSX01URV9UQ0ZfTk9ORTsKLSAgICBpZiAocHJjdGwoUFJfU0VUX1RBR0dFRF9BRERSX0NUUkwsIHRhZ2dlZF9hZGRyX2N0cmwsIDAsIDAsIDApIDwgMCkgewotICAgICAgZmF0YWxfZXJybm8oImZhaWxlZCB0byBQUl9TRVRfVEFHR0VEX0FERFJfQ1RSTCIpOwotICAgIH0KLSAgICBhc3luY19zYWZlX2Zvcm1hdF9sb2coQU5EUk9JRF9MT0dfRVJST1IsICJsaWJjIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIk1URSBFUlJPUiBERVRFQ1RFRCBCVVQgUlVOTklORyBJTiBQRVJNSVNTSVZFIE1PREUuIENPTlRJTlVJTkcuIik7Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJmNyYXNoX211dGV4KTsKLSAgfSBlbHNlIGlmIChpbmZvLT5zaV9zaWdubyA9PSBTSUdTRUdWICYmIGluZm8tPnNpX2NvZGUgPT0gU0VHVl9NVEVBRVJSICYmIGdldHBwaWQoKSA9PSAxKSB7CisgIGVsc2UgaWYgKGluZm8tPnNpX3NpZ25vID09IFNJR1NFR1YgJiYgaW5mby0+c2lfY29kZSA9PSBTRUdWX01URUFFUlIgJiYgZ2V0cHBpZCgpID09IDEpIHsKICAgICAvLyBCYWNrIGNoYW5uZWwgdG8gaW5pdCAoc2VlIHN5c3RlbS9jb3JlL2luaXQvc2VydmljZS5jcHApIHRvIHNpZ25hbCB0aGF0CiAgICAgLy8gdGhpcyBwcm9jZXNzIGNyYXNoZWQgZHVlIHRvIGFuIEFTWU5DIE1URSBmYXVsdCBhbmQgc2hvdWxkIGJlIGNvbnNpZGVyZWQKICAgICAvLyBmb3IgdXBncmFkZSB0byBTWU5DIG1vZGUuIFdlIGFyZSByZS11c2luZyB0aGUgQVJUIHByb2ZpbGVyIHNpZ25hbCwgd2hpY2gKQEAgLTcyMSwxOSArODIzLDE5IEBACiAgIH0KIAogICBzaXplX3QgdGhyZWFkX3N0YWNrX3BhZ2VzID0gODsKLSAgdm9pZCogdGhyZWFkX3N0YWNrX2FsbG9jYXRpb24gPSBtbWFwKG51bGxwdHIsIFBBR0VfU0laRSAqICh0aHJlYWRfc3RhY2tfcGFnZXMgKyAyKSwgUFJPVF9OT05FLAorICB2b2lkKiB0aHJlYWRfc3RhY2tfYWxsb2NhdGlvbiA9IG1tYXAobnVsbHB0ciwgZ2V0cGFnZXNpemUoKSAqICh0aHJlYWRfc3RhY2tfcGFnZXMgKyAyKSwgUFJPVF9OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7CiAgIGlmICh0aHJlYWRfc3RhY2tfYWxsb2NhdGlvbiA9PSBNQVBfRkFJTEVEKSB7CiAgICAgZmF0YWxfZXJybm8oImZhaWxlZCB0byBhbGxvY2F0ZSBkZWJ1Z2dlcmQgdGhyZWFkIHN0YWNrIik7CiAgIH0KIAotICBjaGFyKiBzdGFjayA9IHN0YXRpY19jYXN0PGNoYXIqPih0aHJlYWRfc3RhY2tfYWxsb2NhdGlvbikgKyBQQUdFX1NJWkU7Ci0gIGlmIChtcHJvdGVjdChzdGFjaywgUEFHRV9TSVpFICogdGhyZWFkX3N0YWNrX3BhZ2VzLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFKSAhPSAwKSB7CisgIGNoYXIqIHN0YWNrID0gc3RhdGljX2Nhc3Q8Y2hhcio+KHRocmVhZF9zdGFja19hbGxvY2F0aW9uKSArIGdldHBhZ2VzaXplKCk7CisgIGlmIChtcHJvdGVjdChzdGFjaywgZ2V0cGFnZXNpemUoKSAqIHRocmVhZF9zdGFja19wYWdlcywgUFJPVF9SRUFEIHwgUFJPVF9XUklURSkgIT0gMCkgewogICAgIGZhdGFsX2Vycm5vKCJmYWlsZWQgdG8gbXByb3RlY3QgZGVidWdnZXJkIHRocmVhZCBzdGFjayIpOwogICB9CiAKICAgLy8gU3RhY2sgZ3Jvd3MgbmVnYXRpdmVseSwgc2V0IGl0IHRvIHRoZSBsYXN0IGJ5dGUgaW4gdGhlIHBhZ2UuLi4KLSAgc3RhY2sgPSAoc3RhY2sgKyB0aHJlYWRfc3RhY2tfcGFnZXMgKiBQQUdFX1NJWkUgLSAxKTsKKyAgc3RhY2sgPSAoc3RhY2sgKyB0aHJlYWRfc3RhY2tfcGFnZXMgKiBnZXRwYWdlc2l6ZSgpIC0gMSk7CiAgIC8vIGFuZCBhbGlnbiBpdC4KICAgc3RhY2sgLT0gMTU7CiAgIHBzZXVkb3RocmVhZF9zdGFjayA9IHN0YWNrOwpAQCAtNzQ3LDcgKzg0OSw2IEBACiAgIC8vIFVzZSB0aGUgYWx0ZXJuYXRlIHNpZ25hbCBzdGFjayBpZiBhdmFpbGFibGUgc28gd2UgY2FuIGNhdGNoIHN0YWNrIG92ZXJmbG93cy4KICAgYWN0aW9uLnNhX2ZsYWdzIHw9IFNBX09OU1RBQ0s7CiAKLSNkZWZpbmUgU0FfRVhQT1NFX1RBR0JJVFMgMHgwMDAwMDgwMAogICAvLyBSZXF1ZXN0IHRoYXQgdGhlIGtlcm5lbCBzZXQgdGFnIGJpdHMgaW4gdGhlIGZhdWx0IGFkZHJlc3MuIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBkaWFnbm9zaW5nIE1URQogICAvLyBmYXVsdHMuCiAgIGFjdGlvbi5zYV9mbGFncyB8PSBTQV9FWFBPU0VfVEFHQklUUzsKQEAgLTc1NSwxOCArODU2LDcgQEAKICAgZGVidWdnZXJkX3JlZ2lzdGVyX2hhbmRsZXJzKCZhY3Rpb24pOwogfQogCi0vLyBXaGVuIGRlYnVnZ2VyZCdzIHNpZ25hbCBoYW5kbGVyIGlzIHRoZSBmaXJzdCBoYW5kbGVyIGNhbGxlZCwgaXQncyBncmVhdCBhdAotLy8gaGFuZGxpbmcgdGhlIHJlY292ZXJhYmxlIEdXUC1BU2FuIG1vZGUuIEZvciBhcHBzLCBzaWdjaGFpbiAoZnJvbSBsaWJhcnQpIGlzCi0vLyBhbHdheXMgdGhlIGZpcnN0IHNpZ25hbCBoYW5kbGVyLCBhbmQgc28gdGhlIGZvbGxvd2luZyBmdW5jdGlvbiBpcyB3aGF0Ci0vLyBzaWdjaGFpbiBtdXN0IGNhbGwgYmVmb3JlIHByb2Nlc3NpbmcgdGhlIHNpZ25hbC4gVGhpcyBhbGxvd3MgZm9yIHByb2Nlc3NpbmcKLS8vIG9mIGEgcG90ZW50aWFsbHkgcmVjb3ZlcmFibGUgR1dQLUFTYW4gY3Jhc2guIElmIHRoZSBzaWduYWwgcmVxdWlyZXMgR1dQLUFTYW4KLS8vIHJlY292ZXJ5LCB0aGVuIGR1bXAgYSByZXBvcnQgKHZpYSB0aGUgcmVndWxhciBkZWJ1Z2dlcmQgaGFubmRsZXIpLCBhbmQgcGF0Y2gKLS8vIHVwIHRoZSBhbGxvY2F0b3IsIGFuZCBhbGxvdyB0aGUgcHJvY2VzcyB0byBjb250aW51ZSAoaW5kaWNhdGVkIGJ5IHJldHVybmluZwotLy8gJ3RydWUnKS4gSWYgdGhlIGNyYXNoIGhhcyBub3RoaW5nIHRvIGRvIHdpdGggR1dQLUFTYW4sIG9yIHJlY292ZXJ5IGlzbid0Ci0vLyBwb3NzaWJsZSwgcmV0dXJuICdmYWxzZScuCi1ib29sIGRlYnVnZ2VyZF9oYW5kbGVfc2lnbmFsKGludCBzaWduYWxfbnVtYmVyLCBzaWdpbmZvX3QqIGluZm8sIHZvaWQqIGNvbnRleHQpIHsKLSAgaWYgKHNpZ25hbF9udW1iZXIgIT0gU0lHU0VHViB8fCAhc2lnbmFsX2hhc19zaV9hZGRyKGluZm8pKSByZXR1cm4gZmFsc2U7Ci0KK2Jvb2wgZGVidWdnZXJkX2hhbmRsZV9nd3BfYXNhbl9zaWduYWwoaW50IHNpZ25hbF9udW1iZXIsIHNpZ2luZm9fdCogaW5mbywgdm9pZCogY29udGV4dCkgewogICBpZiAoZ19jYWxsYmFja3MuZ2V0X2d3cF9hc2FuX2NhbGxiYWNrcyA9PSBudWxscHRyKSByZXR1cm4gZmFsc2U7CiAgIGd3cF9hc2FuX2NhbGxiYWNrc190IGd3cF9hc2FuX2NhbGxiYWNrcyA9IGdfY2FsbGJhY2tzLmdldF9nd3BfYXNhbl9jYWxsYmFja3MoKTsKICAgaWYgKGd3cF9hc2FuX2NhbGxiYWNrcy5kZWJ1Z2dlcmRfbmVlZHNfZ3dwX2FzYW5fcmVjb3ZlcnkgPT0gbnVsbHB0ciB8fApAQCAtODA0LDMgKzg5NCwzMyBAQAogICBwdGhyZWFkX211dGV4X3VubG9jaygmZmlyc3RfY3Jhc2hfbXV0ZXgpOwogICByZXR1cm4gdHJ1ZTsKIH0KKworLy8gV2hlbiBkZWJ1Z2dlcmQncyBzaWduYWwgaGFuZGxlciBpcyB0aGUgZmlyc3QgaGFuZGxlciBjYWxsZWQsIGl0J3MgZ3JlYXQgYXQKKy8vIGhhbmRsaW5nIHRoZSByZWNvdmVyYWJsZSBHV1AtQVNhbiBhbmQgcGVybWlzc2l2ZSBNVEUgbW9kZXMuIEZvciBhcHBzLAorLy8gc2lnY2hhaW4gKGZyb20gbGliYXJ0KSBpcyBhbHdheXMgdGhlIGZpcnN0IHNpZ25hbCBoYW5kbGVyLCBhbmQgc28gdGhlCisvLyBmb2xsb3dpbmcgZnVuY3Rpb24gaXMgd2hhdCBzaWdjaGFpbiBtdXN0IGNhbGwgYmVmb3JlIHByb2Nlc3NpbmcgdGhlIHNpZ25hbC4KKy8vIFRoaXMgYWxsb3dzIGZvciBwcm9jZXNzaW5nIG9mIGEgcG90ZW50aWFsbHkgcmVjb3ZlcmFibGUgR1dQLUFTYW4gb3IgTVRFCisvLyBjcmFzaC4gSWYgdGhlIHNpZ25hbCByZXF1aXJlcyByZWNvdmVyeSwgdGhlbiBkdW1wIGEgcmVwb3J0ICh2aWEgdGhlIHJlZ3VsYXIKKy8vIGRlYnVnZ2VyZCBoYW5uZGxlciksIGFuZCBwYXRjaCB1cCB0aGUgYWxsb2NhdG9yIChpbiB0aGUgY2FzZSBvZiBHV1AtQVNhbikgb3IKKy8vIGRpc2FibGUgTVRFIG9uIHRoZSB0aHJlYWQsIGFuZCBhbGxvdyB0aGUgcHJvY2VzcyB0byBjb250aW51ZSAoaW5kaWNhdGVkIGJ5CisvLyByZXR1cm5pbmcgJ3RydWUnKS4gSWYgdGhlIGNyYXNoIGhhcyBub3RoaW5nIHRvIGRvIHdpdGggR1dQLUFTYW4vTVRFLCBvcgorLy8gcmVjb3ZlcnkgaXNuJ3QgcG9zc2libGUsIHJldHVybiAnZmFsc2UnLgorYm9vbCBkZWJ1Z2dlcmRfaGFuZGxlX3NpZ25hbChpbnQgc2lnbmFsX251bWJlciwgc2lnaW5mb190KiBpbmZvLCB2b2lkKiBjb250ZXh0KSB7CisgIGlmIChzaWduYWxfbnVtYmVyICE9IFNJR1NFR1YpIHJldHVybiBmYWxzZTsKKyAgaWYgKGluZm8tPnNpX2NvZGUgPT0gU0VHVl9NVEVBRVJSIHx8IGluZm8tPnNpX2NvZGUgPT0gU0VHVl9NVEVTRVJSKSB7CisgICAgaWYgKCFpc19wZXJtaXNzaXZlX210ZSgpKSByZXR1cm4gZmFsc2U7CisgICAgLy8gQmVjYXVzZSBwZXJtaXNzaXZlIE1URSBkaXNhYmxlcyBNVEUgZm9yIHRoZSBlbnRpcmUgdGhyZWFkLCB3ZSdyZSBsZXNzCisgICAgLy8gd29ycmllZCBhYm91dCBnZXR0aW5nIGEgd2hvbGUgYnVuY2ggb2YgY3Jhc2hlcyBpbiBhIHJvdy4gQWN0aXZpdHlNYW5hZ2VyCisgICAgLy8gZG9lc24ndCBsaWtlIG11bHRpcGxlIG5hdGl2ZSBjcmFzaGVzIGZvciBhbiBhcHAgaW4gYSBzaG9ydCBwZXJpb2Qgb2YgdGltZQorICAgIC8vIChzZWUgdGhlIGNvbW1lbnQgYWJvdXQgcmVjb3ZlcmFibGUgR1dQLUFTYW4gaW4KKyAgICAvLyBgZGVidWdnZXJkX2hhbmRsZV9nd3BfYXNhbl9zaWduYWxgKSwgYnV0IHRoYXQgc2hvdWxkbid0IGhhcHBlbiBpZiBNVEUgaXMKKyAgICAvLyBkaXNhYmxlZCBmb3IgdGhlIGVudGlyZSB0aHJlYWQuIFRoaXMgbWlnaHQgbmVlZCB0byBiZSBjaGFuZ2VkIGlmIHRoZXJlJ3MKKyAgICAvLyBzb21lIGxvdy1oYW5naW5nIGJ1ZyB0aGF0IGhhcHBlbnMgYWNyb3NzIG11bHRpcGxlIHRocmVhZHMgaW4gcXVpY2sKKyAgICAvLyBzdWNjZXNzaW9uLgorICAgIGRlYnVnZ2VyZF9zaWduYWxfaGFuZGxlcihzaWduYWxfbnVtYmVyLCBpbmZvLCBjb250ZXh0KTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGlmICghc2lnbmFsX2hhc19zaV9hZGRyKGluZm8pKSByZXR1cm4gZmFsc2U7CisgIHJldHVybiBkZWJ1Z2dlcmRfaGFuZGxlX2d3cF9hc2FuX3NpZ25hbChzaWduYWxfbnVtYmVyLCBpbmZvLCBjb250ZXh0KTsKK30KZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9pbmNsdWRlL2RlYnVnZ2VyZC9jbGllbnQuaCBiL2RlYnVnZ2VyZC9pbmNsdWRlL2RlYnVnZ2VyZC9jbGllbnQuaAppbmRleCBiNzI4NGIwLi5lNzQwMWNjIDEwMDY0NAotLS0gYS9kZWJ1Z2dlcmQvaW5jbHVkZS9kZWJ1Z2dlcmQvY2xpZW50LmgKKysrIGIvZGVidWdnZXJkL2luY2x1ZGUvZGVidWdnZXJkL2NsaWVudC5oCkBAIC0yNiw3ICsyNiw3IEBACiAKIC8vIFRyaWdnZXIgYSBkdW1wIG9mIHNwZWNpZmllZCBwcm9jZXNzIHRvIG91dHB1dF9mZC4KIC8vIG91dHB1dF9mZCBpcyBjb25zdW1lZCwgdGltZW91dCBvZiAwIHdpbGwgd2FpdCBmb3JldmVyLgotYm9vbCBkZWJ1Z2dlcmRfdHJpZ2dlcl9kdW1wKHBpZF90IHBpZCwgZW51bSBEZWJ1Z2dlcmREdW1wVHlwZSBkdW1wX3R5cGUsIHVuc2lnbmVkIGludCB0aW1lb3V0X21zLAorYm9vbCBkZWJ1Z2dlcmRfdHJpZ2dlcl9kdW1wKHBpZF90IHRpZCwgZW51bSBEZWJ1Z2dlcmREdW1wVHlwZSBkdW1wX3R5cGUsIHVuc2lnbmVkIGludCB0aW1lb3V0X21zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBvdXRwdXRfZmQpOwogCiBpbnQgZHVtcF9iYWNrdHJhY2VfdG9fZmlsZShwaWRfdCB0aWQsIGVudW0gRGVidWdnZXJkRHVtcFR5cGUgZHVtcF90eXBlLCBpbnQgb3V0cHV0X2ZkKTsKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9pbmNsdWRlL2RlYnVnZ2VyZC9oYW5kbGVyLmggYi9kZWJ1Z2dlcmQvaW5jbHVkZS9kZWJ1Z2dlcmQvaGFuZGxlci5oCmluZGV4IGViYjUzNzIuLjk1NGYwNDkgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC9pbmNsdWRlL2RlYnVnZ2VyZC9oYW5kbGVyLmgKKysrIGIvZGVidWdnZXJkL2luY2x1ZGUvZGVidWdnZXJkL2hhbmRsZXIuaApAQCAtMzMsNiArMzMsOCBAQAogc3RydWN0IEFsbG9jYXRpb25NZXRhZGF0YTsKIH07ICAvLyBuYW1lc3BhY2UgZ3dwX2FzYW4KIAorc3RydWN0IGNyYXNoX2RldGFpbF9wYWdlX3Q7CisKIC8vIFdoZW4gdXBkYXRpbmcgdGhpcyBkYXRhIHN0cnVjdHVyZSwgQ3Jhc2hJbmZvRGF0YUR5bmFtaWMgYW5kIHRoZSBjb2RlIGluCiAvLyBSZWFkQ3Jhc2hJbmZvKCkgbXVzdCBhbHNvIGJlIHVwZGF0ZWQuCiBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygocGFja2VkKSkgZGVidWdnZXJfcHJvY2Vzc19pbmZvIHsKQEAgLTQ0LDcgKzQ2LDkgQEAKICAgY29uc3QgY2hhciogc2N1ZG9fcmVnaW9uX2luZm87CiAgIGNvbnN0IGNoYXIqIHNjdWRvX3JpbmdfYnVmZmVyOwogICBzaXplX3Qgc2N1ZG9fcmluZ19idWZmZXJfc2l6ZTsKLSAgYm9vbCByZWNvdmVyYWJsZV9nd3BfYXNhbl9jcmFzaDsKKyAgc2l6ZV90IHNjdWRvX3N0YWNrX2RlcG90X3NpemU7CisgIGJvb2wgcmVjb3ZlcmFibGVfY3Jhc2g7CisgIHN0cnVjdCBjcmFzaF9kZXRhaWxfcGFnZV90KiBjcmFzaF9kZXRhaWxfcGFnZTsKIH07CiAKIC8vIEdXUC1BU2FuIGNhbGJhY2tzIHRvIHN1cHBvcnQgdGhlIHJlY292ZXJhYmxlIG1vZGUuIFNlcGFyYXRlIGZyb20gdGhlCmRpZmYgLS1naXQgYS9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL2luY2x1ZGUvbGliZGVidWdnZXJkL3NjdWRvLmggYi9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL2luY2x1ZGUvbGliZGVidWdnZXJkL3NjdWRvLmgKaW5kZXggYTUwNjg1OS4uODliZjVhOSAxMDA2NDQKLS0tIGEvZGVidWdnZXJkL2xpYmRlYnVnZ2VyZC9pbmNsdWRlL2xpYmRlYnVnZ2VyZC9zY3Vkby5oCisrKyBiL2RlYnVnZ2VyZC9saWJkZWJ1Z2dlcmQvaW5jbHVkZS9saWJkZWJ1Z2dlcmQvc2N1ZG8uaApAQCAtMTYsNiArMTYsOCBAQAogCiAjcHJhZ21hIG9uY2UKIAorI2lmIGRlZmluZWQoVVNFX1NDVURPKQorCiAjaW5jbHVkZSAidHlwZXMuaCIKICNpbmNsdWRlICJ1dGlsaXR5LmgiCiAKQEAgLTQ5LDMgKzUxLDUgQEAKICAgdm9pZCBGaWxsSW5DYXVzZShDYXVzZSogY2F1c2UsIGNvbnN0IHNjdWRvX2Vycm9yX3JlcG9ydCogcmVwb3J0LAogICAgICAgICAgICAgICAgICAgIHVud2luZHN0YWNrOjpBbmRyb2lkVW53aW5kZXIqIHVud2luZGVyKSBjb25zdDsKIH07CisKKyNlbmRpZiAgLy8gVVNFX1NDVURPCmRpZmYgLS1naXQgYS9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL2luY2x1ZGUvbGliZGVidWdnZXJkL3RvbWJzdG9uZS5oIGIvZGVidWdnZXJkL2xpYmRlYnVnZ2VyZC9pbmNsdWRlL2xpYmRlYnVnZ2VyZC90b21ic3RvbmUuaAppbmRleCBiZTk5OWUwLi4zOTk4OWMzIDEwMDY0NAotLS0gYS9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL2luY2x1ZGUvbGliZGVidWdnZXJkL3RvbWJzdG9uZS5oCisrKyBiL2RlYnVnZ2VyZC9saWJkZWJ1Z2dlcmQvaW5jbHVkZS9saWJkZWJ1Z2dlcmQvdG9tYnN0b25lLmgKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CiAKICNpbmNsdWRlICJvcGVuX2ZpbGVzX2xpc3QuaCIKKyNpbmNsdWRlICJ0b21ic3RvbmUucGIuaCIKICNpbmNsdWRlICJ0eXBlcy5oIgogCiAvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucwpAQCAtNTQsMjAgKzU1LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgIHVud2luZHN0YWNrOjpBbmRyb2lkVW53aW5kZXIqIHVud2luZGVyLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxwaWRfdCwgVGhyZWFkSW5mbz4mIHRocmVhZF9pbmZvLCBwaWRfdCB0YXJnZXRfdGhyZWFkLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcm9jZXNzSW5mbyYgcHJvY2Vzc19pbmZvLCBPcGVuRmlsZXNMaXN0KiBvcGVuX2ZpbGVzLAotICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogYW1mZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGFtZmRfZGF0YSwgY29uc3QgQXJjaGl0ZWN0dXJlKiBndWVzdF9hcmNoID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgdW53aW5kc3RhY2s6OkFuZHJvaWRVbndpbmRlciogZ3Vlc3RfdW53aW5kZXIgPSBudWxscHRyKTsKIAogdm9pZCBlbmdyYXZlX3RvbWJzdG9uZV91Y29udGV4dChpbnQgdG9tYnN0b25lX2ZkLCBpbnQgcHJvdG9fZmQsIHVpbnQ2NF90IGFib3J0X21zZ19hZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWdpbmZvX3QqIHNpZ2luZm8sIHVjb250ZXh0X3QqIHVjb250ZXh0KTsKIAogdm9pZCBlbmdyYXZlX3RvbWJzdG9uZV9wcm90byhUb21ic3RvbmUqIHRvbWJzdG9uZSwgdW53aW5kc3RhY2s6OkFuZHJvaWRVbndpbmRlciogdW53aW5kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHBpZF90LCBUaHJlYWRJbmZvPiYgdGhyZWFkcywgcGlkX3QgdGFyZ2V0X3RocmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvY2Vzc0luZm8mIHByb2Nlc3NfaW5mbywgY29uc3QgT3BlbkZpbGVzTGlzdCogb3Blbl9maWxlcyk7Ci0KLWJvb2wgdG9tYnN0b25lX3Byb3RvX3RvX3RleHQoCi0gICAgY29uc3QgVG9tYnN0b25lJiB0b21ic3RvbmUsCi0gICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6c3RyaW5nJiBsaW5lLCBib29sIHNob3VsZF9sb2cpPiBjYWxsYmFjayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb2Nlc3NJbmZvJiBwcm9jZXNzX2luZm8sIGNvbnN0IE9wZW5GaWxlc0xpc3QqIG9wZW5fZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyY2hpdGVjdHVyZSogZ3Vlc3RfYXJjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW53aW5kc3RhY2s6OkFuZHJvaWRVbndpbmRlciogZ3Vlc3RfdW53aW5kZXIpOwogCiB2b2lkIGZpbGxfaW5fYmFja3RyYWNlX2ZyYW1lKEJhY2t0cmFjZUZyYW1lKiBmLCBjb25zdCB1bndpbmRzdGFjazo6RnJhbWVEYXRhJiBmcmFtZSk7CiB2b2lkIHNldF9odW1hbl9yZWFkYWJsZV9jYXVzZShDYXVzZSogY2F1c2UsIHVpbnQ2NF90IGZhdWx0X2FkZHIpOwotCisjaWYgZGVmaW5lZChfX2FhcmNoNjRfXykKK3ZvaWQgZHVtcF9zdGFja19oaXN0b3J5KHVud2luZHN0YWNrOjpBbmRyb2lkVW53aW5kZXIqIHVud2luZGVyLCB1aW50cHRyX3QgdGFyZ2V0X3RscywKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0YWNrSGlzdG9yeUJ1ZmZlciYgc2hiX29iLCBib29sIG5vdW53aW5kID0gZmFsc2UpOworI2VuZGlmCiAjZW5kaWYgIC8vIF9ERUJVR0dFUkRfVE9NQlNUT05FX0gKZGlmZiAtLWdpdCBhL2luaXQvaG9zdF9pbml0X3ZlcmlmaWVyLmggYi9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL2luY2x1ZGUvbGliZGVidWdnZXJkL3RvbWJzdG9uZV9wcm90b190b190ZXh0LmgKc2ltaWxhcml0eSBpbmRleCA2MiUKY29weSBmcm9tIGluaXQvaG9zdF9pbml0X3ZlcmlmaWVyLmgKY29weSB0byBkZWJ1Z2dlcmQvbGliZGVidWdnZXJkL2luY2x1ZGUvbGliZGVidWdnZXJkL3RvbWJzdG9uZV9wcm90b190b190ZXh0LmgKaW5kZXggNWQyNGYyYS4uMmRlOTcyMyAxMDA2NDQKLS0tIGEvaW5pdC9ob3N0X2luaXRfdmVyaWZpZXIuaAorKysgYi9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL2luY2x1ZGUvbGliZGVidWdnZXJkL3RvbWJzdG9uZV9wcm90b190b190ZXh0LmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNiwxMiArMTYsMTMgQEAKIAogI3ByYWdtYSBvbmNlCiAKLSNpbmNsdWRlIDxwcm9wZXJ0eV9pbmZvX3BhcnNlci9wcm9wZXJ0eV9pbmZvX3BhcnNlci5oPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8c3RyaW5nPgogCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgaW5pdCB7CitjbGFzcyBCYWNrdHJhY2VGcmFtZTsKK2NsYXNzIFRvbWJzdG9uZTsKIAotZXh0ZXJuIGNvbnN0IGFuZHJvaWQ6OnByb3BlcnRpZXM6OlByb3BlcnR5SW5mb0FyZWEqIHByb3BlcnR5X2luZm9fYXJlYTsKLQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCitib29sIHRvbWJzdG9uZV9wcm90b190b190ZXh0KAorICAgIGNvbnN0IFRvbWJzdG9uZSYgdG9tYnN0b25lLAorICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnN0cmluZyYgbGluZSwgYm9vbCBzaG91bGRfbG9nKT4gY2FsbGJhY2ssCisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IEJhY2t0cmFjZUZyYW1lJiBmcmFtZSk+IHN5bWJvbGl6ZSk7CmRpZmYgLS1naXQgYS9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL2luY2x1ZGUvbGliZGVidWdnZXJkL3R5cGVzLmggYi9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL2luY2x1ZGUvbGliZGVidWdnZXJkL3R5cGVzLmgKaW5kZXggNWEyYTdhYi4uZjdmYzJhMyAxMDA2NDQKLS0tIGEvZGVidWdnZXJkL2xpYmRlYnVnZ2VyZC9pbmNsdWRlL2xpYmRlYnVnZ2VyZC90eXBlcy5oCisrKyBiL2RlYnVnZ2VyZC9saWJkZWJ1Z2dlcmQvaW5jbHVkZS9saWJkZWJ1Z2dlcmQvdHlwZXMuaApAQCAtMzksNiArMzksMTEgQEAKIAogICBpbnQgc2lnbm8gPSAwOwogICBzaWdpbmZvX3QqIHNpZ2luZm8gPSBudWxscHRyOworCisgIHN0ZDo6dW5pcXVlX3B0cjx1bndpbmRzdGFjazo6UmVncz4gZ3Vlc3RfcmVnaXN0ZXJzOworI2lmIGRlZmluZWQoX19hYXJjaDY0X18pCisgIHVpbnRwdHJfdCB0bHM7ICAvLyBUaGlzIGlzIGN1cnJlbnRseSB1c2VkIGZvciBNVEUgc3RhY2sgaGlzdG9yeSBidWZmZXIuCisjZW5kaWYKIH07CiAKIC8vIFRoaXMgc3RydWN0IGlzIHdyaXR0ZW4gaW50byBhIHBpcGUgZnJvbSBpbnNpZGUgdGhlIGNyYXNoaW5nIHByb2Nlc3MuCkBAIC01MSw4ICs1NiwxMCBAQAogICB1aW50cHRyX3Qgc2N1ZG9fcmVnaW9uX2luZm8gPSAwOwogICB1aW50cHRyX3Qgc2N1ZG9fcmluZ19idWZmZXIgPSAwOwogICBzaXplX3Qgc2N1ZG9fcmluZ19idWZmZXJfc2l6ZSA9IDA7CisgIHNpemVfdCBzY3Vkb19zdGFja19kZXBvdF9zaXplID0gMDsKIAogICBib29sIGhhc19mYXVsdF9hZGRyZXNzID0gZmFsc2U7CiAgIHVpbnRwdHJfdCB1bnRhZ2dlZF9mYXVsdF9hZGRyZXNzID0gMDsKICAgdWludHB0cl90IG1heWJlX3RhZ2dlZF9mYXVsdF9hZGRyZXNzID0gMDsKKyAgdWludHB0cl90IGNyYXNoX2RldGFpbF9wYWdlID0gMDsKIH07CmRpZmYgLS1naXQgYS9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL2luY2x1ZGUvbGliZGVidWdnZXJkL3V0aWxpdHkuaCBiL2RlYnVnZ2VyZC9saWJkZWJ1Z2dlcmQvaW5jbHVkZS9saWJkZWJ1Z2dlcmQvdXRpbGl0eS5oCmluZGV4IDE5OGRlMzcuLmI4NmMxM2QgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC9saWJkZWJ1Z2dlcmQvaW5jbHVkZS9saWJkZWJ1Z2dlcmQvdXRpbGl0eS5oCisrKyBiL2RlYnVnZ2VyZC9saWJkZWJ1Z2dlcmQvaW5jbHVkZS9saWJkZWJ1Z2dlcmQvdXRpbGl0eS5oCkBAIC05MSwxMiArOTEsMyBAQAogdm9pZCBnZXRfc2lnbmFsX3NlbmRlcihjaGFyKiBidWYsIHNpemVfdCBuLCBjb25zdCBzaWdpbmZvX3QqKTsKIGNvbnN0IGNoYXIqIGdldF9zaWduYW1lKGNvbnN0IHNpZ2luZm9fdCopOwogY29uc3QgY2hhciogZ2V0X3NpZ2NvZGUoY29uc3Qgc2lnaW5mb190Kik7Ci1zdGQ6OnN0cmluZyBkZXNjcmliZV90YWdnZWRfYWRkcl9jdHJsKGxvbmcgY3RybCk7Ci1zdGQ6OnN0cmluZyBkZXNjcmliZV9wYWNfZW5hYmxlZF9rZXlzKGxvbmcga2V5cyk7Ci0KLS8vIE51bWJlciBvZiBieXRlcyBwZXIgTVRFIGdyYW51bGUuCi1jb25zdGV4cHIgc2l6ZV90IGtUYWdHcmFudWxlU2l6ZSA9IDE2OwotCi0vLyBOdW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucyB0byBkaXNwbGF5IGluIGFuIE1URSB0YWcgZHVtcC4KLWNvbnN0ZXhwciBzaXplX3Qga051bVRhZ0NvbHVtbnMgPSAxNjsKLWNvbnN0ZXhwciBzaXplX3Qga051bVRhZ1Jvd3MgPSAxNjsKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9saWJkZWJ1Z2dlcmQvaW5jbHVkZS9saWJkZWJ1Z2dlcmQvdXRpbGl0eV9ob3N0LmggYi9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL2luY2x1ZGUvbGliZGVidWdnZXJkL3V0aWxpdHlfaG9zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZmI4YmQKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL2luY2x1ZGUvbGliZGVidWdnZXJkL3V0aWxpdHlfaG9zdC5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK3N0ZDo6c3RyaW5nIGRlc2NyaWJlX3RhZ2dlZF9hZGRyX2N0cmwobG9uZyBjdHJsKTsKK3N0ZDo6c3RyaW5nIGRlc2NyaWJlX3BhY19lbmFibGVkX2tleXMobG9uZyBrZXlzKTsKKworLy8gTnVtYmVyIG9mIGJ5dGVzIHBlciBNVEUgZ3JhbnVsZS4KK2NvbnN0ZXhwciBzaXplX3Qga1RhZ0dyYW51bGVTaXplID0gMTY7CisKKy8vIE51bWJlciBvZiByb3dzIGFuZCBjb2x1bW5zIHRvIGRpc3BsYXkgaW4gYW4gTVRFIHRhZyBkdW1wLgorY29uc3RleHByIHNpemVfdCBrTnVtVGFnQ29sdW1ucyA9IDE2OworY29uc3RleHByIHNpemVfdCBrTnVtVGFnUm93cyA9IDE2OwpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL2xpYmRlYnVnZ2VyZC9zY3Vkby5jcHAgYi9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL3NjdWRvLmNwcAppbmRleCA1YTYyZmUxLi43MWQ1ZmNmIDEwMDY0NAotLS0gYS9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL3NjdWRvLmNwcAorKysgYi9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL3NjdWRvLmNwcApAQCAtMTQsMTQgKzE0LDE4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaWYgZGVmaW5lZChVU0VfU0NVRE8pCisKICNpbmNsdWRlICJsaWJkZWJ1Z2dlcmQvc2N1ZG8uaCIKICNpbmNsdWRlICJsaWJkZWJ1Z2dlcmQvdG9tYnN0b25lLmgiCisjaW5jbHVkZSAibGliZGVidWdnZXJkL3V0aWxpdHlfaG9zdC5oIgogCiAjaW5jbHVkZSAidW53aW5kc3RhY2svQW5kcm9pZFVud2luZGVyLmgiCiAjaW5jbHVkZSAidW53aW5kc3RhY2svTWVtb3J5LmgiCiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CiAjaW5jbHVkZSA8YmlvbmljL21hY3Jvcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSAidG9tYnN0b25lLnBiLmgiCiAKQEAgLTQwLDggKzQ0LDYgQEAKICAgICByZXR1cm47CiAgIH0KIAotICBhdXRvIHN0YWNrX2RlcG90ID0gQWxsb2NBbmRSZWFkRnVsbHkocHJvY2Vzc19tZW1vcnksIHByb2Nlc3NfaW5mby5zY3Vkb19zdGFja19kZXBvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fc2N1ZG9fZ2V0X3N0YWNrX2RlcG90X3NpemUoKSk7CiAgIGF1dG8gcmVnaW9uX2luZm8gPSBBbGxvY0FuZFJlYWRGdWxseShwcm9jZXNzX21lbW9yeSwgcHJvY2Vzc19pbmZvLnNjdWRvX3JlZ2lvbl9pbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19zY3Vkb19nZXRfcmVnaW9uX2luZm9fc2l6ZSgpKTsKICAgc3RkOjp1bmlxdWVfcHRyPGNoYXJbXT4gcmluZ19idWZmZXI7CkBAIC00OSwyNiArNTEsMzEgQEAKICAgICByaW5nX2J1ZmZlciA9IEFsbG9jQW5kUmVhZEZ1bGx5KHByb2Nlc3NfbWVtb3J5LCBwcm9jZXNzX2luZm8uc2N1ZG9fcmluZ19idWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzX2luZm8uc2N1ZG9fcmluZ19idWZmZXJfc2l6ZSk7CiAgIH0KLSAgaWYgKCFzdGFja19kZXBvdCB8fCAhcmVnaW9uX2luZm8pIHsKKyAgc3RkOjp1bmlxdWVfcHRyPGNoYXJbXT4gc3RhY2tfZGVwb3Q7CisgIGlmIChwcm9jZXNzX2luZm8uc2N1ZG9fc3RhY2tfZGVwb3Rfc2l6ZSAhPSAwKSB7CisgICAgc3RhY2tfZGVwb3QgPSBBbGxvY0FuZFJlYWRGdWxseShwcm9jZXNzX21lbW9yeSwgcHJvY2Vzc19pbmZvLnNjdWRvX3N0YWNrX2RlcG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc19pbmZvLnNjdWRvX3N0YWNrX2RlcG90X3NpemUpOworICB9CisgIGlmICghcmVnaW9uX2luZm8pIHsKICAgICByZXR1cm47CiAgIH0KIAogICB1bnRhZ2dlZF9mYXVsdF9hZGRyXyA9IHByb2Nlc3NfaW5mby51bnRhZ2dlZF9mYXVsdF9hZGRyZXNzOwotICB1aW50cHRyX3QgZmF1bHRfcGFnZSA9IHVudGFnZ2VkX2ZhdWx0X2FkZHJfICYgfihQQUdFX1NJWkUgLSAxKTsKKyAgdWludHB0cl90IGZhdWx0X3BhZ2UgPSB1bnRhZ2dlZF9mYXVsdF9hZGRyXyAmIH4oZ2V0cGFnZXNpemUoKSAtIDEpOwogCi0gIHVpbnRwdHJfdCBtZW1vcnlfYmVnaW4gPSBmYXVsdF9wYWdlIC0gUEFHRV9TSVpFICogMTY7CisgIHVpbnRwdHJfdCBtZW1vcnlfYmVnaW4gPSBmYXVsdF9wYWdlIC0gZ2V0cGFnZXNpemUoKSAqIDE2OwogICBpZiAobWVtb3J5X2JlZ2luID4gZmF1bHRfcGFnZSkgewogICAgIHJldHVybjsKICAgfQogCi0gIHVpbnRwdHJfdCBtZW1vcnlfZW5kID0gZmF1bHRfcGFnZSArIFBBR0VfU0laRSAqIDE2OworICB1aW50cHRyX3QgbWVtb3J5X2VuZCA9IGZhdWx0X3BhZ2UgKyBnZXRwYWdlc2l6ZSgpICogMTY7CiAgIGlmIChtZW1vcnlfZW5kIDwgZmF1bHRfcGFnZSkgewogICAgIHJldHVybjsKICAgfQogCiAgIGF1dG8gbWVtb3J5ID0gc3RkOjptYWtlX3VuaXF1ZTxjaGFyW10+KG1lbW9yeV9lbmQgLSBtZW1vcnlfYmVnaW4pOwotICBmb3IgKGF1dG8gaSA9IG1lbW9yeV9iZWdpbjsgaSAhPSBtZW1vcnlfZW5kOyBpICs9IFBBR0VfU0laRSkgewotICAgIHByb2Nlc3NfbWVtb3J5LT5SZWFkRnVsbHkoaSwgbWVtb3J5LmdldCgpICsgaSAtIG1lbW9yeV9iZWdpbiwgUEFHRV9TSVpFKTsKKyAgZm9yIChhdXRvIGkgPSBtZW1vcnlfYmVnaW47IGkgIT0gbWVtb3J5X2VuZDsgaSArPSBnZXRwYWdlc2l6ZSgpKSB7CisgICAgcHJvY2Vzc19tZW1vcnktPlJlYWRGdWxseShpLCBtZW1vcnkuZ2V0KCkgKyBpIC0gbWVtb3J5X2JlZ2luLCBnZXRwYWdlc2l6ZSgpKTsKICAgfQogCiAgIGF1dG8gbWVtb3J5X3RhZ3MgPSBzdGQ6Om1ha2VfdW5pcXVlPGNoYXJbXT4oKG1lbW9yeV9lbmQgLSBtZW1vcnlfYmVnaW4pIC8ga1RhZ0dyYW51bGVTaXplKTsKQEAgLTc3LDcgKzg0LDggQEAKICAgfQogCiAgIF9fc2N1ZG9fZ2V0X2Vycm9yX2luZm8oJmVycm9yX2luZm9fLCBwcm9jZXNzX2luZm8ubWF5YmVfdGFnZ2VkX2ZhdWx0X2FkZHJlc3MsIHN0YWNrX2RlcG90LmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbl9pbmZvLmdldCgpLCByaW5nX2J1ZmZlci5nZXQoKSwgbWVtb3J5LmdldCgpLCBtZW1vcnlfdGFncy5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzX2luZm8uc2N1ZG9fc3RhY2tfZGVwb3Rfc2l6ZSwgcmVnaW9uX2luZm8uZ2V0KCksIHJpbmdfYnVmZmVyLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NfaW5mby5zY3Vkb19yaW5nX2J1ZmZlcl9zaXplLCBtZW1vcnkuZ2V0KCksIG1lbW9yeV90YWdzLmdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeV9iZWdpbiwgbWVtb3J5X2VuZCAtIG1lbW9yeV9iZWdpbik7CiB9CiAKQEAgLTEzNiwzICsxNDQsNSBAQAogICAgIEZpbGxJbkNhdXNlKHRvbWJzdG9uZS0+YWRkX2NhdXNlcygpLCAmZXJyb3JfaW5mb18ucmVwb3J0c1tyZXBvcnRfbnVtKytdLCB1bndpbmRlcik7CiAgIH0KIH0KKworI2VuZGlmICAvLyBVU0VfU0NVRE8KZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9saWJkZWJ1Z2dlcmQvdGVzdC9kdW1wX21lbW9yeV90ZXN0LmNwcCBiL2RlYnVnZ2VyZC9saWJkZWJ1Z2dlcmQvdGVzdC9kdW1wX21lbW9yeV90ZXN0LmNwcAppbmRleCA1YmUxNDVhLi5kZWU3YjQ4IDEwMDY0NAotLS0gYS9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL3Rlc3QvZHVtcF9tZW1vcnlfdGVzdC5jcHAKKysrIGIvZGVidWdnZXJkL2xpYmRlYnVnZ2VyZC90ZXN0L2R1bXBfbWVtb3J5X3Rlc3QuY3BwCkBAIC0yMCw2ICsyMCw4IEBACiAjaW5jbHVkZSA8c3RyaW5nPgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogI2luY2x1ZGUgPHVud2luZHN0YWNrL01lbW9yeS5oPgogCkBAIC0yNyw2MSArMjksNjQgQEAKIAogI2luY2x1ZGUgImxvZ19mYWtlLmgiCiAKLWNvbnN0IGNoYXIgZ19leHBlY3RlZF9mdWxsX2R1bXBbXSA9Ci0iXG5tZW1vcnkgbmVhciByMTpcbiIKLSNpZiBkZWZpbmVkKF9fTFA2NF9fKQotIiAgICAwMDAwMDAwMDEyMzQ1NjUwIDA3MDYwNTA0MDMwMjAxMDAgMGYwZTBkMGMwYjBhMDkwOCAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICAwMDAwMDAwMDEyMzQ1NjYwIDE3MTYxNTE0MTMxMjExMTAgMWYxZTFkMWMxYjFhMTkxOCAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICAwMDAwMDAwMDEyMzQ1NjcwIDI3MjYyNTI0MjMyMjIxMjAgMmYyZTJkMmMyYjJhMjkyOCAgICFcIiMkJSYnKCkqKywtLi9cbiIKLSIgICAgMDAwMDAwMDAxMjM0NTY4MCAzNzM2MzUzNDMzMzIzMTMwIDNmM2UzZDNjM2IzYTM5MzggIDAxMjM0NTY3ODk6Ozw9Pj9cbiIKLSIgICAgMDAwMDAwMDAxMjM0NTY5MCA0NzQ2NDU0NDQzNDI0MTQwIDRmNGU0ZDRjNGI0YTQ5NDggIEBBQkNERUZHSElKS0xNTk9cbiIKLSIgICAgMDAwMDAwMDAxMjM0NTZhMCA1NzU2NTU1NDUzNTI1MTUwIDVmNWU1ZDVjNWI1YTU5NTggIFBRUlNUVVZXWFlaW1xcXV5fXG4iCi0iICAgIDAwMDAwMDAwMTIzNDU2YjAgNjc2NjY1NjQ2MzYyNjE2MCA2ZjZlNmQ2YzZiNmE2OTY4ICBgYWJjZGVmZ2hpamtsbW5vXG4iCi0iICAgIDAwMDAwMDAwMTIzNDU2YzAgNzc3Njc1NzQ3MzcyNzE3MCA3ZjdlN2Q3YzdiN2E3OTc4ICBwcXJzdHV2d3h5ent8fX4uXG4iCi0iICAgIDAwMDAwMDAwMTIzNDU2ZDAgODc4Njg1ODQ4MzgyODE4MCA4ZjhlOGQ4YzhiOGE4OTg4ICAuLi4uLi4uLi4uLi4uLi4uXG4iCi0iICAgIDAwMDAwMDAwMTIzNDU2ZTAgOTc5Njk1OTQ5MzkyOTE5MCA5ZjllOWQ5YzliOWE5OTk4ICAuLi4uLi4uLi4uLi4uLi4uXG4iCi0iICAgIDAwMDAwMDAwMTIzNDU2ZjAgYTdhNmE1YTRhM2EyYTFhMCBhZmFlYWRhY2FiYWFhOWE4ICAuLi4uLi4uLi4uLi4uLi4uXG4iCi0iICAgIDAwMDAwMDAwMTIzNDU3MDAgYjdiNmI1YjRiM2IyYjFiMCBiZmJlYmRiY2JiYmFiOWI4ICAuLi4uLi4uLi4uLi4uLi4uXG4iCi0iICAgIDAwMDAwMDAwMTIzNDU3MTAgYzdjNmM1YzRjM2MyYzFjMCBjZmNlY2RjY2NiY2FjOWM4ICAuLi4uLi4uLi4uLi4uLi4uXG4iCi0iICAgIDAwMDAwMDAwMTIzNDU3MjAgZDdkNmQ1ZDRkM2QyZDFkMCBkZmRlZGRkY2RiZGFkOWQ4ICAuLi4uLi4uLi4uLi4uLi4uXG4iCi0iICAgIDAwMDAwMDAwMTIzNDU3MzAgZTdlNmU1ZTRlM2UyZTFlMCBlZmVlZWRlY2ViZWFlOWU4ICAuLi4uLi4uLi4uLi4uLi4uXG4iCi0iICAgIDAwMDAwMDAwMTIzNDU3NDAgZjdmNmY1ZjRmM2YyZjFmMCBmZmZlZmRmY2ZiZmFmOWY4ICAuLi4uLi4uLi4uLi4uLi4uXG4iOwotI2Vsc2UKLSIgICAgMTIzNDU2NTAgMDMwMjAxMDAgMDcwNjA1MDQgMGIwYTA5MDggMGYwZTBkMGMgIC4uLi4uLi4uLi4uLi4uLi5cbiIKLSIgICAgMTIzNDU2NjAgMTMxMjExMTAgMTcxNjE1MTQgMWIxYTE5MTggMWYxZTFkMWMgIC4uLi4uLi4uLi4uLi4uLi5cbiIKLSIgICAgMTIzNDU2NzAgMjMyMjIxMjAgMjcyNjI1MjQgMmIyYTI5MjggMmYyZTJkMmMgICAhXCIjJCUmJygpKissLS4vXG4iCi0iICAgIDEyMzQ1NjgwIDMzMzIzMTMwIDM3MzYzNTM0IDNiM2EzOTM4IDNmM2UzZDNjICAwMTIzNDU2Nzg5Ojs8PT4/XG4iCi0iICAgIDEyMzQ1NjkwIDQzNDI0MTQwIDQ3NDY0NTQ0IDRiNGE0OTQ4IDRmNGU0ZDRjICBAQUJDREVGR0hJSktMTU5PXG4iCi0iICAgIDEyMzQ1NmEwIDUzNTI1MTUwIDU3NTY1NTU0IDViNWE1OTU4IDVmNWU1ZDVjICBQUVJTVFVWV1hZWltcXF1eX1xuIgotIiAgICAxMjM0NTZiMCA2MzYyNjE2MCA2NzY2NjU2NCA2YjZhNjk2OCA2ZjZlNmQ2YyAgYGFiY2RlZmdoaWprbG1ub1xuIgotIiAgICAxMjM0NTZjMCA3MzcyNzE3MCA3Nzc2NzU3NCA3YjdhNzk3OCA3ZjdlN2Q3YyAgcHFyc3R1dnd4eXp7fH1+LlxuIgotIiAgICAxMjM0NTZkMCA4MzgyODE4MCA4Nzg2ODU4NCA4YjhhODk4OCA4ZjhlOGQ4YyAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICAxMjM0NTZlMCA5MzkyOTE5MCA5Nzk2OTU5NCA5YjlhOTk5OCA5ZjllOWQ5YyAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICAxMjM0NTZmMCBhM2EyYTFhMCBhN2E2YTVhNCBhYmFhYTlhOCBhZmFlYWRhYyAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICAxMjM0NTcwMCBiM2IyYjFiMCBiN2I2YjViNCBiYmJhYjliOCBiZmJlYmRiYyAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICAxMjM0NTcxMCBjM2MyYzFjMCBjN2M2YzVjNCBjYmNhYzljOCBjZmNlY2RjYyAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICAxMjM0NTcyMCBkM2QyZDFkMCBkN2Q2ZDVkNCBkYmRhZDlkOCBkZmRlZGRkYyAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICAxMjM0NTczMCBlM2UyZTFlMCBlN2U2ZTVlNCBlYmVhZTllOCBlZmVlZWRlYyAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICAxMjM0NTc0MCBmM2YyZjFmMCBmN2Y2ZjVmNCBmYmZhZjlmOCBmZmZlZmRmYyAgLi4uLi4uLi4uLi4uLi4uLlxuIjsKLSNlbmRpZgorc3RkOjpzdHJpbmcgR2V0TWVtb3J5U3RyaW5nKHVpbnRwdHJfdCBhZGRyLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4mIGRhdGEpIHsKKyAgLy8gTXVzdCBiZSBldmVuIG51bWJlciBvZiBkYXRhIHZhbHVlcy4KKyAgQ0hFQ0soKGRhdGEuc2l6ZSgpICYgMSkgPT0gMCk7CiAKLWNvbnN0IGNoYXIgZ19leHBlY3RlZF9wYXJ0aWFsX2R1bXBbXSA9IFwKLSJcbm1lbW9yeSBuZWFyIHBjOlxuIgorICBzdGQ6OnN0cmluZyBzdHI7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGF0YS5zaXplKCk7IGkgKz0gMikgeworICAgIHN0ciArPSAiICAgICI7CisgICAgc3RkOjpzdHJpbmcgYXNjaWlfc3RyID0gIiI7CisgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCAyOyBqKyspIHsKKyAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgODsgaysrKSB7CisgICAgICAgIHVpbnQ4X3QgYyA9IChkYXRhW2kgKyBqXSA+PiAoayAqIDgpKSAmIDB4ZmY7CisgICAgICAgIGlmIChjID49IDB4MjAgJiYgYyA8IDB4N2YpIHsKKyAgICAgICAgICBhc2NpaV9zdHIgKz0gYzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBhc2NpaV9zdHIgKz0gJy4nOworICAgICAgICB9CisgICAgICB9CisgICAgfQogI2lmIGRlZmluZWQoX19MUDY0X18pCi0iICAgIDAwMDAwMDAwMTIzNDU1ZTAgMDcwNjA1MDQwMzAyMDEwMCAwZjBlMGQwYzBiMGEwOTA4ICAuLi4uLi4uLi4uLi4uLi4uXG4iCi0iICAgIDAwMDAwMDAwMTIzNDU1ZjAgMTcxNjE1MTQxMzEyMTExMCAxZjFlMWQxYzFiMWExOTE4ICAuLi4uLi4uLi4uLi4uLi4uXG4iCi0iICAgIDAwMDAwMDAwMTIzNDU2MDAgMjcyNjI1MjQyMzIyMjEyMCAyZjJlMmQyYzJiMmEyOTI4ICAgIVwiIyQlJicoKSorLC0uL1xuIgotIiAgICAwMDAwMDAwMDEyMzQ1NjEwIDM3MzYzNTM0MzMzMjMxMzAgM2YzZTNkM2MzYjNhMzkzOCAgMDEyMzQ1Njc4OTo7PD0+P1xuIgotIiAgICAwMDAwMDAwMDEyMzQ1NjIwIDQ3NDY0NTQ0NDM0MjQxNDAgNGY0ZTRkNGM0YjRhNDk0OCAgQEFCQ0RFRkdISUpLTE1OT1xuIgotIiAgICAwMDAwMDAwMDEyMzQ1NjMwIDU3NTY1NTU0NTM1MjUxNTAgNWY1ZTVkNWM1YjVhNTk1OCAgUFFSU1RVVldYWVpbXFxdXl9cbiI7CisgICAgc3RyICs9IGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigiJTAxNnp4ICUwMTZ6eCAlMDE2enggICIsIGFkZHIsIGRhdGFbaV0sIGRhdGFbaSArIDFdKTsKICNlbHNlCi0iICAgIDEyMzQ1NWUwIDAzMDIwMTAwIDA3MDYwNTA0IDBiMGEwOTA4IDBmMGUwZDBjICAuLi4uLi4uLi4uLi4uLi4uXG4iCi0iICAgIDEyMzQ1NWYwIDEzMTIxMTEwIDE3MTYxNTE0IDFiMWExOTE4IDFmMWUxZDFjICAuLi4uLi4uLi4uLi4uLi4uXG4iCi0iICAgIDEyMzQ1NjAwIDIzMjIyMTIwIDI3MjYyNTI0IDJiMmEyOTI4IDJmMmUyZDJjICAgIVwiIyQlJicoKSorLC0uL1xuIgotIiAgICAxMjM0NTYxMCAzMzMyMzEzMCAzNzM2MzUzNCAzYjNhMzkzOCAzZjNlM2QzYyAgMDEyMzQ1Njc4OTo7PD0+P1xuIgotIiAgICAxMjM0NTYyMCA0MzQyNDE0MCA0NzQ2NDU0NCA0YjRhNDk0OCA0ZjRlNGQ0YyAgQEFCQ0RFRkdISUpLTE1OT1xuIgotIiAgICAxMjM0NTYzMCA1MzUyNTE1MCA1NzU2NTU1NCA1YjVhNTk1OCA1ZjVlNWQ1YyAgUFFSU1RVVldYWVpbXFxdXl9cbiI7CisgICAgc3RyICs9IGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigKKyAgICAgICAgIiUwOHp4ICUwOHp4ICUwOHp4ICUwOHp4ICUwOHp4ICAiLCBhZGRyLCBzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KGRhdGFbaV0gJiAweGZmZmZmZmZmKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8dWludHB0cl90PihkYXRhW2ldID4+IDMyKSwgc3RhdGljX2Nhc3Q8dWludHB0cl90PihkYXRhW2kgKyAxXSAmIDB4ZmZmZmZmZmYpLAorICAgICAgICBzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KGRhdGFbaSArIDFdID4+IDMyKSk7CiAjZW5kaWYKKyAgICBzdHIgKz0gYXNjaWlfc3RyICsgIlxuIjsKKyAgICBhZGRyICs9IDB4MTA7CisgIH0KKyAgcmV0dXJuIHN0cjsKK30KKworY29uc3Qgc3RkOjp2ZWN0b3I8dWludDY0X3Q+JiBHZXREZWZhdWx0RGF0YSgpIHsKKyAgc3RhdGljIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBkYXRhKAorICAgICAgezB4MDcwNjA1MDQwMzAyMDEwMFVMLCAweDBmMGUwZDBjMGIwYTA5MDhVTCwgMHgxNzE2MTUxNDEzMTIxMTEwVUwsIDB4MWYxZTFkMWMxYjFhMTkxOFVMLAorICAgICAgIDB4MjcyNjI1MjQyMzIyMjEyMFVMLCAweDJmMmUyZDJjMmIyYTI5MjhVTCwgMHgzNzM2MzUzNDMzMzIzMTMwVUwsIDB4M2YzZTNkM2MzYjNhMzkzOFVMLAorICAgICAgIDB4NDc0NjQ1NDQ0MzQyNDE0MFVMLCAweDRmNGU0ZDRjNGI0YTQ5NDhVTCwgMHg1NzU2NTU1NDUzNTI1MTUwVUwsIDB4NWY1ZTVkNWM1YjVhNTk1OFVMLAorICAgICAgIDB4Njc2NjY1NjQ2MzYyNjE2MFVMLCAweDZmNmU2ZDZjNmI2YTY5NjhVTCwgMHg3Nzc2NzU3NDczNzI3MTcwVUwsIDB4N2Y3ZTdkN2M3YjdhNzk3OFVMLAorICAgICAgIDB4ODc4Njg1ODQ4MzgyODE4MFVMLCAweDhmOGU4ZDhjOGI4YTg5ODhVTCwgMHg5Nzk2OTU5NDkzOTI5MTkwVUwsIDB4OWY5ZTlkOWM5YjlhOTk5OFVMLAorICAgICAgIDB4YTdhNmE1YTRhM2EyYTFhMFVMLCAweGFmYWVhZGFjYWJhYWE5YThVTCwgMHhiN2I2YjViNGIzYjJiMWIwVUwsIDB4YmZiZWJkYmNiYmJhYjliOFVMLAorICAgICAgIDB4YzdjNmM1YzRjM2MyYzFjMFVMLCAweGNmY2VjZGNjY2JjYWM5YzhVTCwgMHhkN2Q2ZDVkNGQzZDJkMWQwVUwsIDB4ZGZkZWRkZGNkYmRhZDlkOFVMLAorICAgICAgIDB4ZTdlNmU1ZTRlM2UyZTFlMFVMLCAweGVmZWVlZGVjZWJlYWU5ZThVTCwgMHhmN2Y2ZjVmNGYzZjJmMWYwVUwsIDB4ZmZmZWZkZmNmYmZhZjlmOFVMfSk7CisgIHJldHVybiBkYXRhOworfQorCitzdGQ6OnN0cmluZyBHZXRGdWxsRHVtcFN0cmluZygpIHsKKyAgc3RkOjpzdHJpbmcgc3RyID0gIlxubWVtb3J5IG5lYXIgcjE6XG4iOworICBzdHIgKz0gR2V0TWVtb3J5U3RyaW5nKDB4MTIzNDU2NTBVLCBHZXREZWZhdWx0RGF0YSgpKTsKKyAgcmV0dXJuIHN0cjsKK30KKworc3RkOjpzdHJpbmcgR2V0UGFydGlhbER1bXBTdHJpbmcoKSB7CisgIHN0ZDo6c3RyaW5nIHN0ciA9ICJcbm1lbW9yeSBuZWFyIHBjOlxuIjsKKyAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IGRhdGEgPSBHZXREZWZhdWx0RGF0YSgpOworICBkYXRhLnJlc2l6ZSgxMik7CisgIHN0ciArPSBHZXRNZW1vcnlTdHJpbmcoMHgxMjM0NTVlMFUsIGRhdGEpOworICByZXR1cm4gc3RyOworfQogCiBjbGFzcyBNZW1vcnlNb2NrIDogcHVibGljIHVud2luZHN0YWNrOjpNZW1vcnkgewogIHB1YmxpYzoKQEAgLTE4OSw3ICsxOTQsNyBAQAogICBzdGQ6OnN0cmluZyB0b21ic3RvbmVfY29udGVudHM7CiAgIEFTU0VSVF9UUlVFKGxzZWVrKGxvZ18udGZkLCAwLCBTRUVLX1NFVCkgPT0gMCk7CiAgIEFTU0VSVF9UUlVFKGFuZHJvaWQ6OmJhc2U6OlJlYWRGZFRvU3RyaW5nKGxvZ18udGZkLCAmdG9tYnN0b25lX2NvbnRlbnRzKSk7Ci0gIEFTU0VSVF9TVFJFUShnX2V4cGVjdGVkX2Z1bGxfZHVtcCwgdG9tYnN0b25lX2NvbnRlbnRzLmNfc3RyKCkpOworICBBU1NFUlRfRVEoR2V0RnVsbER1bXBTdHJpbmcoKSwgdG9tYnN0b25lX2NvbnRlbnRzKTsKIAogICAvLyBWZXJpZnkgdGhhdCB0aGUgbG9nIGJ1ZiBpcyBlbXB0eSwgYW5kIG5vIGVycm9yIG1lc3NhZ2VzLgogICBBU1NFUlRfU1RSRVEoIiIsIGdldEZha2VMb2dCdWYoKS5jX3N0cigpKTsKQEAgLTIwOSw3ICsyMTQsNyBAQAogICBzdGQ6OnN0cmluZyB0b21ic3RvbmVfY29udGVudHM7CiAgIEFTU0VSVF9UUlVFKGxzZWVrKGxvZ18udGZkLCAwLCBTRUVLX1NFVCkgPT0gMCk7CiAgIEFTU0VSVF9UUlVFKGFuZHJvaWQ6OmJhc2U6OlJlYWRGZFRvU3RyaW5nKGxvZ18udGZkLCAmdG9tYnN0b25lX2NvbnRlbnRzKSk7Ci0gIEFTU0VSVF9TVFJFUShnX2V4cGVjdGVkX2Z1bGxfZHVtcCwgdG9tYnN0b25lX2NvbnRlbnRzLmNfc3RyKCkpOworICBBU1NFUlRfRVEoR2V0RnVsbER1bXBTdHJpbmcoKSwgdG9tYnN0b25lX2NvbnRlbnRzKTsKIAogICAvLyBWZXJpZnkgdGhhdCB0aGUgbG9nIGJ1ZiBpcyBlbXB0eSwgYW5kIG5vIGVycm9yIG1lc3NhZ2VzLgogICBBU1NFUlRfU1RSRVEoIiIsIGdldEZha2VMb2dCdWYoKS5jX3N0cigpKTsKQEAgLTIyOCw3ICsyMzMsNyBAQAogICBzdGQ6OnN0cmluZyB0b21ic3RvbmVfY29udGVudHM7CiAgIEFTU0VSVF9UUlVFKGxzZWVrKGxvZ18udGZkLCAwLCBTRUVLX1NFVCkgPT0gMCk7CiAgIEFTU0VSVF9UUlVFKGFuZHJvaWQ6OmJhc2U6OlJlYWRGZFRvU3RyaW5nKGxvZ18udGZkLCAmdG9tYnN0b25lX2NvbnRlbnRzKSk7Ci0gIEFTU0VSVF9TVFJFUShnX2V4cGVjdGVkX2Z1bGxfZHVtcCwgdG9tYnN0b25lX2NvbnRlbnRzLmNfc3RyKCkpOworICBBU1NFUlRfRVEoR2V0RnVsbER1bXBTdHJpbmcoKSwgdG9tYnN0b25lX2NvbnRlbnRzKTsKIAogICAvLyBWZXJpZnkgdGhhdCB0aGUgbG9nIGJ1ZiBpcyBlbXB0eSwgYW5kIG5vIGVycm9yIG1lc3NhZ2VzLgogICBBU1NFUlRfU1RSRVEoIiIsIGdldEZha2VMb2dCdWYoKS5jX3N0cigpKTsKQEAgLTI2MCw3ICsyNjUsNyBAQAogICBzdGQ6OnN0cmluZyB0b21ic3RvbmVfY29udGVudHM7CiAgIEFTU0VSVF9UUlVFKGxzZWVrKGxvZ18udGZkLCAwLCBTRUVLX1NFVCkgPT0gMCk7CiAgIEFTU0VSVF9UUlVFKGFuZHJvaWQ6OmJhc2U6OlJlYWRGZFRvU3RyaW5nKGxvZ18udGZkLCAmdG9tYnN0b25lX2NvbnRlbnRzKSk7Ci0gIEFTU0VSVF9TVFJFUShnX2V4cGVjdGVkX3BhcnRpYWxfZHVtcCwgdG9tYnN0b25lX2NvbnRlbnRzLmNfc3RyKCkpOworICBBU1NFUlRfRVEoR2V0UGFydGlhbER1bXBTdHJpbmcoKSwgdG9tYnN0b25lX2NvbnRlbnRzKTsKIAogICAvLyBWZXJpZnkgdGhhdCB0aGUgbG9nIGJ1ZiBpcyBlbXB0eSwgYW5kIG5vIGVycm9yIG1lc3NhZ2VzLgogICBBU1NFUlRfU1RSRVEoIiIsIGdldEZha2VMb2dCdWYoKS5jX3N0cigpKTsKQEAgLTI4MCw3ICsyODUsNyBAQAogICBzdGQ6OnN0cmluZyB0b21ic3RvbmVfY29udGVudHM7CiAgIEFTU0VSVF9UUlVFKGxzZWVrKGxvZ18udGZkLCAwLCBTRUVLX1NFVCkgPT0gMCk7CiAgIEFTU0VSVF9UUlVFKGFuZHJvaWQ6OmJhc2U6OlJlYWRGZFRvU3RyaW5nKGxvZ18udGZkLCAmdG9tYnN0b25lX2NvbnRlbnRzKSk7Ci0gIEFTU0VSVF9TVFJFUShnX2V4cGVjdGVkX3BhcnRpYWxfZHVtcCwgdG9tYnN0b25lX2NvbnRlbnRzLmNfc3RyKCkpOworICBBU1NFUlRfRVEoR2V0UGFydGlhbER1bXBTdHJpbmcoKSwgdG9tYnN0b25lX2NvbnRlbnRzKTsKIAogI2lmIGRlZmluZWQoX19MUDY0X18pCiAgIEFTU0VSVF9TVFJFUSgiNiBERUJVRyBCeXRlcyByZWFkIDEwMiwgaXMgbm90IGEgbXVsdGlwbGUgb2YgOFxuIiwgZ2V0RmFrZUxvZ1ByaW50KCkuY19zdHIoKSk7CkBAIC0zMDUsNyArMzEwLDcgQEAKICAgc3RkOjpzdHJpbmcgdG9tYnN0b25lX2NvbnRlbnRzOwogICBBU1NFUlRfVFJVRShsc2Vlayhsb2dfLnRmZCwgMCwgU0VFS19TRVQpID09IDApOwogICBBU1NFUlRfVFJVRShhbmRyb2lkOjpiYXNlOjpSZWFkRmRUb1N0cmluZyhsb2dfLnRmZCwgJnRvbWJzdG9uZV9jb250ZW50cykpOwotICBBU1NFUlRfU1RSRVEoZ19leHBlY3RlZF9wYXJ0aWFsX2R1bXAsIHRvbWJzdG9uZV9jb250ZW50cy5jX3N0cigpKTsKKyAgQVNTRVJUX0VRKEdldFBhcnRpYWxEdW1wU3RyaW5nKCksIHRvbWJzdG9uZV9jb250ZW50cyk7CiAKICNpZiBkZWZpbmVkKF9fTFA2NF9fKQogICBBU1NFUlRfU1RSRVEoIjYgREVCVUcgQnl0ZXMgcmVhZCA0NSwgaXMgbm90IGEgbXVsdGlwbGUgb2YgOFxuIgpAQCAtMzMxLDQ0ICszMzYsOSBAQAogICBzdGQ6OnN0cmluZyB0b21ic3RvbmVfY29udGVudHM7CiAgIEFTU0VSVF9UUlVFKGxzZWVrKGxvZ18udGZkLCAwLCBTRUVLX1NFVCkgPT0gMCk7CiAgIEFTU0VSVF9UUlVFKGFuZHJvaWQ6OmJhc2U6OlJlYWRGZFRvU3RyaW5nKGxvZ18udGZkLCAmdG9tYnN0b25lX2NvbnRlbnRzKSk7Ci0gIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2R1bXAgPSBcCi0iXG5tZW1vcnkgbmVhciByMTpcbiIKLSNpZiBkZWZpbmVkKF9fTFA2NF9fKQotIiAgICAwMDAwMDAwMDAwMDAxMDAwIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICAwMDAwMDAwMDAwMDAxMDEwIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICAwMDAwMDAwMDAwMDAxMDIwIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICAwMDAwMDAwMDAwMDAxMDMwIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICAwMDAwMDAwMDAwMDAxMDQwIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICAwMDAwMDAwMDAwMDAxMDUwIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICAwMDAwMDAwMDAwMDAxMDYwIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICAwMDAwMDAwMDAwMDAxMDcwIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICAwMDAwMDAwMDAwMDAxMDgwIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICAwMDAwMDAwMDAwMDAxMDkwIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICAwMDAwMDAwMDAwMDAxMGEwIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICAwMDAwMDAwMDAwMDAxMGIwIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICAwMDAwMDAwMDAwMDAxMGMwIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICAwMDAwMDAwMDAwMDAxMGQwIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICAwMDAwMDAwMDAwMDAxMGUwIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICAwMDAwMDAwMDAwMDAxMGYwIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAgLi4uLi4uLi4uLi4uLi4uLlxuIjsKLSNlbHNlCi0iICAgIDAwMDAxMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwICAuLi4uLi4uLi4uLi4uLi4uXG4iCi0iICAgIDAwMDAxMDEwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwICAuLi4uLi4uLi4uLi4uLi4uXG4iCi0iICAgIDAwMDAxMDIwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwICAuLi4uLi4uLi4uLi4uLi4uXG4iCi0iICAgIDAwMDAxMDMwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwICAuLi4uLi4uLi4uLi4uLi4uXG4iCi0iICAgIDAwMDAxMDQwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwICAuLi4uLi4uLi4uLi4uLi4uXG4iCi0iICAgIDAwMDAxMDUwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwICAuLi4uLi4uLi4uLi4uLi4uXG4iCi0iICAgIDAwMDAxMDYwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwICAuLi4uLi4uLi4uLi4uLi4uXG4iCi0iICAgIDAwMDAxMDcwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwICAuLi4uLi4uLi4uLi4uLi4uXG4iCi0iICAgIDAwMDAxMDgwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwICAuLi4uLi4uLi4uLi4uLi4uXG4iCi0iICAgIDAwMDAxMDkwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwICAuLi4uLi4uLi4uLi4uLi4uXG4iCi0iICAgIDAwMDAxMGEwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwICAuLi4uLi4uLi4uLi4uLi4uXG4iCi0iICAgIDAwMDAxMGIwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwICAuLi4uLi4uLi4uLi4uLi4uXG4iCi0iICAgIDAwMDAxMGMwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwICAuLi4uLi4uLi4uLi4uLi4uXG4iCi0iICAgIDAwMDAxMGQwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwICAuLi4uLi4uLi4uLi4uLi4uXG4iCi0iICAgIDAwMDAxMGUwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwICAuLi4uLi4uLi4uLi4uLi4uXG4iCi0iICAgIDAwMDAxMGYwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAwICAuLi4uLi4uLi4uLi4uLi4uXG4iOwotI2VuZGlmCi0gIEFTU0VSVF9TVFJFUShleHBlY3RlZF9kdW1wLCB0b21ic3RvbmVfY29udGVudHMuY19zdHIoKSk7CisgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkX2R1bXAgPSAiXG5tZW1vcnkgbmVhciByMTpcbiI7CisgIGV4cGVjdGVkX2R1bXAgKz0gR2V0TWVtb3J5U3RyaW5nKDB4MTAwMCwgc3RkOjp2ZWN0b3I8dWludDY0X3Q+KDMyLCAwVUwpKTsKKyAgQVNTRVJUX0VRKGV4cGVjdGVkX2R1bXAsIHRvbWJzdG9uZV9jb250ZW50cyk7CiAKICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGxvZyBidWYgaXMgZW1wdHksIGFuZCBubyBlcnJvciBtZXNzYWdlcy4KICAgQVNTRVJUX1NUUkVRKCIiLCBnZXRGYWtlTG9nQnVmKCkuY19zdHIoKSk7CkBAIC00MTQsNjEgKzM4NCwxNyBAQAogICBzdGQ6OnN0cmluZyB0b21ic3RvbmVfY29udGVudHM7CiAgIEFTU0VSVF9UUlVFKGxzZWVrKGxvZ18udGZkLCAwLCBTRUVLX1NFVCkgPT0gMCk7CiAgIEFTU0VSVF9UUlVFKGFuZHJvaWQ6OmJhc2U6OlJlYWRGZFRvU3RyaW5nKGxvZ18udGZkLCAmdG9tYnN0b25lX2NvbnRlbnRzKSk7Ci0gIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2R1bXAgPSBcCi0iXG5tZW1vcnkgbmVhciByNDpcbiIKKyAgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfZHVtcCA9ICJcbm1lbW9yeSBuZWFyIHI0OlxuIjsKKyAgdWludHB0cl90IGFkZHI7CiAjaWYgZGVmaW5lZChfX2FhcmNoNjRfXykKLSIgICAgMDBmZmZmZmZmZmZmZmYwMCAwNzA2MDUwNDAzMDIwMTAwIDBmMGUwZDBjMGIwYTA5MDggIC4uLi4uLi4uLi4uLi4uLi5cbiIKLSIgICAgMDBmZmZmZmZmZmZmZmYxMCAxNzE2MTUxNDEzMTIxMTEwIDFmMWUxZDFjMWIxYTE5MTggIC4uLi4uLi4uLi4uLi4uLi5cbiIKLSIgICAgMDBmZmZmZmZmZmZmZmYyMCAyNzI2MjUyNDIzMjIyMTIwIDJmMmUyZDJjMmIyYTI5MjggICAhXCIjJCUmJygpKissLS4vXG4iCi0iICAgIDAwZmZmZmZmZmZmZmZmMzAgMzczNjM1MzQzMzMyMzEzMCAzZjNlM2QzYzNiM2EzOTM4ICAwMTIzNDU2Nzg5Ojs8PT4/XG4iCi0iICAgIDAwZmZmZmZmZmZmZmZmNDAgNDc0NjQ1NDQ0MzQyNDE0MCA0ZjRlNGQ0YzRiNGE0OTQ4ICBAQUJDREVGR0hJSktMTU5PXG4iCi0iICAgIDAwZmZmZmZmZmZmZmZmNTAgNTc1NjU1NTQ1MzUyNTE1MCA1ZjVlNWQ1YzViNWE1OTU4ICBQUVJTVFVWV1hZWltcXF1eX1xuIgotIiAgICAwMGZmZmZmZmZmZmZmZjYwIDY3NjY2NTY0NjM2MjYxNjAgNmY2ZTZkNmM2YjZhNjk2OCAgYGFiY2RlZmdoaWprbG1ub1xuIgotIiAgICAwMGZmZmZmZmZmZmZmZjcwIDc3NzY3NTc0NzM3MjcxNzAgN2Y3ZTdkN2M3YjdhNzk3OCAgcHFyc3R1dnd4eXp7fH1+LlxuIgotIiAgICAwMGZmZmZmZmZmZmZmZjgwIDg3ODY4NTg0ODM4MjgxODAgOGY4ZThkOGM4YjhhODk4OCAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICAwMGZmZmZmZmZmZmZmZjkwIDk3OTY5NTk0OTM5MjkxOTAgOWY5ZTlkOWM5YjlhOTk5OCAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICAwMGZmZmZmZmZmZmZmZmEwIGE3YTZhNWE0YTNhMmExYTAgYWZhZWFkYWNhYmFhYTlhOCAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICAwMGZmZmZmZmZmZmZmZmIwIGI3YjZiNWI0YjNiMmIxYjAgYmZiZWJkYmNiYmJhYjliOCAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICAwMGZmZmZmZmZmZmZmZmMwIGM3YzZjNWM0YzNjMmMxYzAgY2ZjZWNkY2NjYmNhYzljOCAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICAwMGZmZmZmZmZmZmZmZmQwIGQ3ZDZkNWQ0ZDNkMmQxZDAgZGZkZWRkZGNkYmRhZDlkOCAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICAwMGZmZmZmZmZmZmZmZmUwIGU3ZTZlNWU0ZTNlMmUxZTAgZWZlZWVkZWNlYmVhZTllOCAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICAwMGZmZmZmZmZmZmZmZmYwIGY3ZjZmNWY0ZjNmMmYxZjAgZmZmZWZkZmNmYmZhZjlmOCAgLi4uLi4uLi4uLi4uLi4uLlxuIjsKKyAgYWRkciA9IDB4MDBmZmZmZmZmZmZmZmYwMFVMOwogI2VsaWYgZGVmaW5lZChfX0xQNjRfXykKLSIgICAgZmZmZmZmZmZmZmZmZmYwMCAwNzA2MDUwNDAzMDIwMTAwIDBmMGUwZDBjMGIwYTA5MDggIC4uLi4uLi4uLi4uLi4uLi5cbiIKLSIgICAgZmZmZmZmZmZmZmZmZmYxMCAxNzE2MTUxNDEzMTIxMTEwIDFmMWUxZDFjMWIxYTE5MTggIC4uLi4uLi4uLi4uLi4uLi5cbiIKLSIgICAgZmZmZmZmZmZmZmZmZmYyMCAyNzI2MjUyNDIzMjIyMTIwIDJmMmUyZDJjMmIyYTI5MjggICAhXCIjJCUmJygpKissLS4vXG4iCi0iICAgIGZmZmZmZmZmZmZmZmZmMzAgMzczNjM1MzQzMzMyMzEzMCAzZjNlM2QzYzNiM2EzOTM4ICAwMTIzNDU2Nzg5Ojs8PT4/XG4iCi0iICAgIGZmZmZmZmZmZmZmZmZmNDAgNDc0NjQ1NDQ0MzQyNDE0MCA0ZjRlNGQ0YzRiNGE0OTQ4ICBAQUJDREVGR0hJSktMTU5PXG4iCi0iICAgIGZmZmZmZmZmZmZmZmZmNTAgNTc1NjU1NTQ1MzUyNTE1MCA1ZjVlNWQ1YzViNWE1OTU4ICBQUVJTVFVWV1hZWltcXF1eX1xuIgotIiAgICBmZmZmZmZmZmZmZmZmZjYwIDY3NjY2NTY0NjM2MjYxNjAgNmY2ZTZkNmM2YjZhNjk2OCAgYGFiY2RlZmdoaWprbG1ub1xuIgotIiAgICBmZmZmZmZmZmZmZmZmZjcwIDc3NzY3NTc0NzM3MjcxNzAgN2Y3ZTdkN2M3YjdhNzk3OCAgcHFyc3R1dnd4eXp7fH1+LlxuIgotIiAgICBmZmZmZmZmZmZmZmZmZjgwIDg3ODY4NTg0ODM4MjgxODAgOGY4ZThkOGM4YjhhODk4OCAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICBmZmZmZmZmZmZmZmZmZjkwIDk3OTY5NTk0OTM5MjkxOTAgOWY5ZTlkOWM5YjlhOTk5OCAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICBmZmZmZmZmZmZmZmZmZmEwIGE3YTZhNWE0YTNhMmExYTAgYWZhZWFkYWNhYmFhYTlhOCAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICBmZmZmZmZmZmZmZmZmZmIwIGI3YjZiNWI0YjNiMmIxYjAgYmZiZWJkYmNiYmJhYjliOCAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICBmZmZmZmZmZmZmZmZmZmMwIGM3YzZjNWM0YzNjMmMxYzAgY2ZjZWNkY2NjYmNhYzljOCAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICBmZmZmZmZmZmZmZmZmZmQwIGQ3ZDZkNWQ0ZDNkMmQxZDAgZGZkZWRkZGNkYmRhZDlkOCAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICBmZmZmZmZmZmZmZmZmZmUwIGU3ZTZlNWU0ZTNlMmUxZTAgZWZlZWVkZWNlYmVhZTllOCAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICBmZmZmZmZmZmZmZmZmZmYwIGY3ZjZmNWY0ZjNmMmYxZjAgZmZmZWZkZmNmYmZhZjlmOCAgLi4uLi4uLi4uLi4uLi4uLlxuIjsKKyAgYWRkciA9IDB4ZmZmZmZmZmZmZmZmZmYwMFVMOwogI2Vsc2UKLSIgICAgZmZmZmZmMDAgMDMwMjAxMDAgMDcwNjA1MDQgMGIwYTA5MDggMGYwZTBkMGMgIC4uLi4uLi4uLi4uLi4uLi5cbiIKLSIgICAgZmZmZmZmMTAgMTMxMjExMTAgMTcxNjE1MTQgMWIxYTE5MTggMWYxZTFkMWMgIC4uLi4uLi4uLi4uLi4uLi5cbiIKLSIgICAgZmZmZmZmMjAgMjMyMjIxMjAgMjcyNjI1MjQgMmIyYTI5MjggMmYyZTJkMmMgICAhXCIjJCUmJygpKissLS4vXG4iCi0iICAgIGZmZmZmZjMwIDMzMzIzMTMwIDM3MzYzNTM0IDNiM2EzOTM4IDNmM2UzZDNjICAwMTIzNDU2Nzg5Ojs8PT4/XG4iCi0iICAgIGZmZmZmZjQwIDQzNDI0MTQwIDQ3NDY0NTQ0IDRiNGE0OTQ4IDRmNGU0ZDRjICBAQUJDREVGR0hJSktMTU5PXG4iCi0iICAgIGZmZmZmZjUwIDUzNTI1MTUwIDU3NTY1NTU0IDViNWE1OTU4IDVmNWU1ZDVjICBQUVJTVFVWV1hZWltcXF1eX1xuIgotIiAgICBmZmZmZmY2MCA2MzYyNjE2MCA2NzY2NjU2NCA2YjZhNjk2OCA2ZjZlNmQ2YyAgYGFiY2RlZmdoaWprbG1ub1xuIgotIiAgICBmZmZmZmY3MCA3MzcyNzE3MCA3Nzc2NzU3NCA3YjdhNzk3OCA3ZjdlN2Q3YyAgcHFyc3R1dnd4eXp7fH1+LlxuIgotIiAgICBmZmZmZmY4MCA4MzgyODE4MCA4Nzg2ODU4NCA4YjhhODk4OCA4ZjhlOGQ4YyAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICBmZmZmZmY5MCA5MzkyOTE5MCA5Nzk2OTU5NCA5YjlhOTk5OCA5ZjllOWQ5YyAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICBmZmZmZmZhMCBhM2EyYTFhMCBhN2E2YTVhNCBhYmFhYTlhOCBhZmFlYWRhYyAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICBmZmZmZmZiMCBiM2IyYjFiMCBiN2I2YjViNCBiYmJhYjliOCBiZmJlYmRiYyAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICBmZmZmZmZjMCBjM2MyYzFjMCBjN2M2YzVjNCBjYmNhYzljOCBjZmNlY2RjYyAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICBmZmZmZmZkMCBkM2QyZDFkMCBkN2Q2ZDVkNCBkYmRhZDlkOCBkZmRlZGRkYyAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICBmZmZmZmZlMCBlM2UyZTFlMCBlN2U2ZTVlNCBlYmVhZTllOCBlZmVlZWRlYyAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICBmZmZmZmZmMCBmM2YyZjFmMCBmN2Y2ZjVmNCBmYmZhZjlmOCBmZmZlZmRmYyAgLi4uLi4uLi4uLi4uLi4uLlxuIjsKKyAgYWRkciA9IDB4ZmZmZmZmMDBVTDsKICNlbmRpZgotICBBU1NFUlRfU1RSRVEoZXhwZWN0ZWRfZHVtcCwgdG9tYnN0b25lX2NvbnRlbnRzLmNfc3RyKCkpOworICBleHBlY3RlZF9kdW1wICs9IEdldE1lbW9yeVN0cmluZyhhZGRyLCBHZXREZWZhdWx0RGF0YSgpKTsKKyAgQVNTRVJUX0VRKGV4cGVjdGVkX2R1bXAsIHRvbWJzdG9uZV9jb250ZW50cyk7CiAKICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGxvZyBidWYgaXMgZW1wdHksIGFuZCBubyBlcnJvciBtZXNzYWdlcy4KICAgQVNTRVJUX1NUUkVRKCIiLCBnZXRGYWtlTG9nQnVmKCkuY19zdHIoKSk7CkBAIC00OTAsMzAgKzQxNiwxNSBAQAogICBzdGQ6OnN0cmluZyB0b21ic3RvbmVfY29udGVudHM7CiAgIEFTU0VSVF9UUlVFKGxzZWVrKGxvZ18udGZkLCAwLCBTRUVLX1NFVCkgPT0gMCk7CiAgIEFTU0VSVF9UUlVFKGFuZHJvaWQ6OmJhc2U6OlJlYWRGZFRvU3RyaW5nKGxvZ18udGZkLCAmdG9tYnN0b25lX2NvbnRlbnRzKSk7Ci0gIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2R1bXAgPSBcCi0iXG5tZW1vcnkgbmVhciByNDpcbiIKLSNpZiBkZWZpbmVkKF9fTFA2NF9fKQotUiIoICAgIDAwMDAwMDAwMTAwMDEwMDAgODc4Njg1ODQ4MzgyODE4MCA4ZjhlOGQ4YzhiOGE4OTg4ICAuLi4uLi4uLi4uLi4uLi4uCi0gICAgMDAwMDAwMDAxMDAwMTAxMCA5Nzk2OTU5NDkzOTI5MTkwIDlmOWU5ZDljOWI5YTk5OTggIC4uLi4uLi4uLi4uLi4uLi4KLSAgICAwMDAwMDAwMDEwMDAxMDIwIGE3YTZhNWE0YTNhMmExYTAgYWZhZWFkYWNhYmFhYTlhOCAgLi4uLi4uLi4uLi4uLi4uLgotICAgIDAwMDAwMDAwMTAwMDEwMzAgYjdiNmI1YjRiM2IyYjFiMCBiZmJlYmRiY2JiYmFiOWI4ICAuLi4uLi4uLi4uLi4uLi4uCi0gICAgMDAwMDAwMDAxMDAwMTA0MCBjN2M2YzVjNGMzYzJjMWMwIGNmY2VjZGNjY2JjYWM5YzggIC4uLi4uLi4uLi4uLi4uLi4KLSAgICAwMDAwMDAwMDEwMDAxMDUwIGQ3ZDZkNWQ0ZDNkMmQxZDAgZGZkZWRkZGNkYmRhZDlkOCAgLi4uLi4uLi4uLi4uLi4uLgotICAgIDAwMDAwMDAwMTAwMDEwNjAgZTdlNmU1ZTRlM2UyZTFlMCBlZmVlZWRlY2ViZWFlOWU4ICAuLi4uLi4uLi4uLi4uLi4uCi0gICAgMDAwMDAwMDAxMDAwMTA3MCBmN2Y2ZjVmNGYzZjJmMWYwIGZmZmVmZGZjZmJmYWY5ZjggIC4uLi4uLi4uLi4uLi4uLi4KLSkiOwotI2Vsc2UKLVIiKCAgICAxMDAwMTAwMCA4MzgyODE4MCA4Nzg2ODU4NCA4YjhhODk4OCA4ZjhlOGQ4YyAgLi4uLi4uLi4uLi4uLi4uLgotICAgIDEwMDAxMDEwIDkzOTI5MTkwIDk3OTY5NTk0IDliOWE5OTk4IDlmOWU5ZDljICAuLi4uLi4uLi4uLi4uLi4uCi0gICAgMTAwMDEwMjAgYTNhMmExYTAgYTdhNmE1YTQgYWJhYWE5YTggYWZhZWFkYWMgIC4uLi4uLi4uLi4uLi4uLi4KLSAgICAxMDAwMTAzMCBiM2IyYjFiMCBiN2I2YjViNCBiYmJhYjliOCBiZmJlYmRiYyAgLi4uLi4uLi4uLi4uLi4uLgotICAgIDEwMDAxMDQwIGMzYzJjMWMwIGM3YzZjNWM0IGNiY2FjOWM4IGNmY2VjZGNjICAuLi4uLi4uLi4uLi4uLi4uCi0gICAgMTAwMDEwNTAgZDNkMmQxZDAgZDdkNmQ1ZDQgZGJkYWQ5ZDggZGZkZWRkZGMgIC4uLi4uLi4uLi4uLi4uLi4KLSAgICAxMDAwMTA2MCBlM2UyZTFlMCBlN2U2ZTVlNCBlYmVhZTllOCBlZmVlZWRlYyAgLi4uLi4uLi4uLi4uLi4uLgotICAgIDEwMDAxMDcwIGYzZjJmMWYwIGY3ZjZmNWY0IGZiZmFmOWY4IGZmZmVmZGZjICAuLi4uLi4uLi4uLi4uLi4uCi0pIjsKLSNlbmRpZgotICBBU1NFUlRfU1RSRVEoZXhwZWN0ZWRfZHVtcCwgdG9tYnN0b25lX2NvbnRlbnRzLmNfc3RyKCkpOworICBzdGQ6OnN0cmluZyBleHBlY3RlZF9kdW1wID0gIlxubWVtb3J5IG5lYXIgcjQ6XG4iOworICBleHBlY3RlZF9kdW1wICs9IEdldE1lbW9yeVN0cmluZygKKyAgICAgIDB4MTAwMDAwMDAgKyBwYWdlX3NpemUsCisgICAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD57CisgICAgICAgICAgMHg4Nzg2ODU4NDgzODI4MTgwVUwsIDB4OGY4ZThkOGM4YjhhODk4OFVMLCAweDk3OTY5NTk0OTM5MjkxOTBVTCwgMHg5ZjllOWQ5YzliOWE5OTk4VUwsCisgICAgICAgICAgMHhhN2E2YTVhNGEzYTJhMWEwVUwsIDB4YWZhZWFkYWNhYmFhYTlhOFVMLCAweGI3YjZiNWI0YjNiMmIxYjBVTCwgMHhiZmJlYmRiY2JiYmFiOWI4VUwsCisgICAgICAgICAgMHhjN2M2YzVjNGMzYzJjMWMwVUwsIDB4Y2ZjZWNkY2NjYmNhYzljOFVMLCAweGQ3ZDZkNWQ0ZDNkMmQxZDBVTCwgMHhkZmRlZGRkY2RiZGFkOWQ4VUwsCisgICAgICAgICAgMHhlN2U2ZTVlNGUzZTJlMWUwVUwsIDB4ZWZlZWVkZWNlYmVhZTllOFVMLCAweGY3ZjZmNWY0ZjNmMmYxZjBVTCwgMHhmZmZlZmRmY2ZiZmFmOWY4VUx9KTsKKyAgQVNTRVJUX0VRKGV4cGVjdGVkX2R1bXAsIHRvbWJzdG9uZV9jb250ZW50cyk7CiAKICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGxvZyBidWYgaXMgZW1wdHksIGFuZCBubyBlcnJvciBtZXNzYWdlcy4KICAgQVNTRVJUX1NUUkVRKCIiLCBnZXRGYWtlTG9nQnVmKCkuY19zdHIoKSk7CkBAIC01MzUsMTYgKzQ0NiwxMSBAQAogICBzdGQ6OnN0cmluZyB0b21ic3RvbmVfY29udGVudHM7CiAgIEFTU0VSVF9UUlVFKGxzZWVrKGxvZ18udGZkLCAwLCBTRUVLX1NFVCkgPT0gMCk7CiAgIEFTU0VSVF9UUlVFKGFuZHJvaWQ6OmJhc2U6OlJlYWRGZFRvU3RyaW5nKGxvZ18udGZkLCAmdG9tYnN0b25lX2NvbnRlbnRzKSk7Ci0gIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2R1bXAgPSBcCi0iXG5tZW1vcnkgbmVhciByNDpcbiIKLSNpZiBkZWZpbmVkKF9fTFA2NF9fKQotIiAgICAwMDAwMDAwMDEwMDAxMDAwIGM3YzZjNWM0YzNjMmMxYzAgY2ZjZWNkY2NjYmNhYzljOCAgLi4uLi4uLi4uLi4uLi4uLlxuIgotIiAgICAwMDAwMDAwMDEwMDAxMDEwIGQ3ZDZkNWQ0ZDNkMmQxZDAgZGZkZWRkZGNkYmRhZDlkOCAgLi4uLi4uLi4uLi4uLi4uLlxuIjsKLSNlbHNlCi0iICAgIDEwMDAxMDAwIGMzYzJjMWMwIGM3YzZjNWM0IGNiY2FjOWM4IGNmY2VjZGNjICAuLi4uLi4uLi4uLi4uLi4uXG4iCi0iICAgIDEwMDAxMDEwIGQzZDJkMWQwIGQ3ZDZkNWQ0IGRiZGFkOWQ4IGRmZGVkZGRjICAuLi4uLi4uLi4uLi4uLi4uXG4iOwotI2VuZGlmCi0gIEFTU0VSVF9TVFJFUShleHBlY3RlZF9kdW1wLCB0b21ic3RvbmVfY29udGVudHMuY19zdHIoKSk7CisgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkX2R1bXAgPSAiXG5tZW1vcnkgbmVhciByNDpcbiI7CisgIGV4cGVjdGVkX2R1bXAgKz0gR2V0TWVtb3J5U3RyaW5nKAorICAgICAgMHgxMDAwMDAwMCArIHBhZ2Vfc2l6ZSwgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ezB4YzdjNmM1YzRjM2MyYzFjMFVMLCAweGNmY2VjZGNjY2JjYWM5YzhVTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGQ3ZDZkNWQ0ZDNkMmQxZDBVTCwgMHhkZmRlZGRkY2RiZGFkOWQ4VUx9KTsKKyAgQVNTRVJUX0VRKGV4cGVjdGVkX2R1bXAsIHRvbWJzdG9uZV9jb250ZW50cyk7CiAKICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGxvZyBidWYgaXMgZW1wdHksIGFuZCBubyBlcnJvciBtZXNzYWdlcy4KICAgQVNTRVJUX1NUUkVRKCIiLCBnZXRGYWtlTG9nQnVmKCkuY19zdHIoKSk7CmRpZmYgLS1naXQgYS9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL3Rlc3QvaG9zdF9zaWduYWxfZml4dXAuaCBiL2RlYnVnZ2VyZC9saWJkZWJ1Z2dlcmQvdGVzdC9ob3N0X3NpZ25hbF9maXh1cC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjJiYWU1Li4wMDAwMDAwCi0tLSBhL2RlYnVnZ2VyZC9saWJkZWJ1Z2dlcmQvdGVzdC9ob3N0X3NpZ25hbF9maXh1cC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX0RFQlVHR0VSRF9URVNUX0hPU1RfU0lHTkFMX0ZJWFVQX0gKLSNkZWZpbmUgX0RFQlVHR0VSRF9URVNUX0hPU1RfU0lHTkFMX0ZJWFVQX0gKLQotI2luY2x1ZGUgPHNpZ25hbC5oPgotCi0jaWYgIWRlZmluZWQoX19CSU9OSUNfXykKLQotLy8gSW4gb3JkZXIgdG8gY29tcGlsZSBwYXJ0cyBvZiBkZWJ1Z2dlcmQgZm9yIHRoZSBob3N0LCB3ZSBuZWVkIHRvCi0vLyBkZWZpbmUgdGhlc2UgdmFsdWVzLgotCi0jaWYgIWRlZmluZWQoTlNJR0lMTCkKLSNkZWZpbmUgTlNJR0lMTCBJTExfQkFEU1RLCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKEJVU19NQ0VFUlJfQVIpCi0jZGVmaW5lIEJVU19NQ0VFUlJfQVIgNAotI2VuZGlmCi0jaWYgIWRlZmluZWQoQlVTX01DRUVSUl9BTykKLSNkZWZpbmUgQlVTX01DRUVSUl9BTyA1Ci0jZW5kaWYKLSNpZiAhZGVmaW5lZChOU0lHQlVTKQotI2RlZmluZSBOU0lHQlVTIEJVU19NQ0VFUlJfQU8KLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoTlNJR0ZQRSkKLSNkZWZpbmUgTlNJR0ZQRSBGUEVfRkxUU1VCCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKE5TSUdTRUdWKQotI2RlZmluZSBOU0lHU0VHViBTRUdWX0FDQ0VSUgotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChUUkFQX0JSQU5DSCkKLSNkZWZpbmUgVFJBUF9CUkFOQ0ggMwotI2VuZGlmCi0jaWYgIWRlZmluZWQoVFJBUF9IV0JLUFQpCi0jZGVmaW5lIFRSQVBfSFdCS1BUIDQKLSNlbmRpZgotI2lmICFkZWZpbmVkKE5TSUdUUkFQKQotI2RlZmluZSBOU0lHVFJBUCBUUkFQX0hXQktQVAotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChTSV9ERVRIUkVBRCkKLSNkZWZpbmUgU0lfREVUSFJFQUQgKC03KQotI2VuZGlmCi0KLSNlbmRpZgotCi0jZW5kaWYgLy8gX0RFQlVHR0VSRF9URVNUX0hPU1RfU0lHTkFMX0ZJWFVQX0gKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9saWJkZWJ1Z2dlcmQvdGVzdC9tdGVfc3RhY2tfcmVjb3JkX3Rlc3QuY3BwIGIvZGVidWdnZXJkL2xpYmRlYnVnZ2VyZC90ZXN0L210ZV9zdGFja19yZWNvcmRfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNkYTBjYQotLS0gL2Rldi9udWxsCisrKyBiL2RlYnVnZ2VyZC9saWJkZWJ1Z2dlcmQvdGVzdC9tdGVfc3RhY2tfcmVjb3JkX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMTg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZiBkZWZpbmVkKF9fYWFyY2g2NF9fKQorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworI2luY2x1ZGUgPG9wdGlvbmFsPgorCisjaW5jbHVkZSAiYmlvbmljL210ZS5oIgorI2luY2x1ZGUgImJpb25pYy9wYWdlLmgiCisjaW5jbHVkZSAidW53aW5kc3RhY2svQW5kcm9pZFVud2luZGVyLmgiCisjaW5jbHVkZSAidW53aW5kc3RhY2svTWVtb3J5LmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdGVzdF91dGlscy5oPgorI2luY2x1ZGUgPHByb2NpbmZvL3Byb2Nlc3NfbWFwLmg+CisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisjaW5jbHVkZSAibGliZGVidWdnZXJkL3RvbWJzdG9uZS5oIgorCitzdHJ1Y3QgU2NvcGVkVW5tYXAgeworICB2b2lkKiBwdHI7CisgIHNpemVfdCBzaXplOworICB+U2NvcGVkVW5tYXAoKSB7IG11bm1hcChwdHIsIHNpemUpOyB9Cit9OworCitjbGFzcyBNdGVTdGFja0hpc3RvcnlUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxpbnQ+IHsKKyAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyNpZiAhZGVmaW5lZChfX2FhcmNoNjRfXykKKyAgICBHVEVTVF9TS0lQKCk7CisjZW5kaWYKKyAgICBTS0lQX1dJVEhfSFdBU0FOOworICAgIHVud2luZGVyLmVtcGxhY2UoKTsKKyAgICB1bndpbmRzdGFjazo6RXJyb3JEYXRhIEU7CisgICAgQVNTRVJUX1RSVUUodW53aW5kZXItPkluaXRpYWxpemUoRSkpOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIC8vIHN0ZDo6b3B0aW9uYWwgc28gd2UgZG9uJ3QgY29uc3RydWN0IGl0IGZvciB0aGUgU0tJUCBjYXNlcy4KKyAgc3RkOjpvcHRpb25hbDx1bndpbmRzdGFjazo6QW5kcm9pZExvY2FsVW53aW5kZXI+IHVud2luZGVyOworfTsKKworVEVTVChNdGVTdGFja0hpc3RvcnlVbndpbmRUZXN0LCBUZXN0T25lKSB7CisjaWYgIWRlZmluZWQoX19hYXJjaDY0X18pCisgIEdURVNUX1NLSVAoKTsKKyNlbmRpZgorICBTS0lQX1dJVEhfSFdBU0FOOworICBzaXplX3Qgc2l6ZSA9IHN0YWNrX210ZV9yaW5nYnVmZmVyX3NpemUoMCk7CisgIGNoYXIqIGRhdGEgPSBzdGF0aWNfY2FzdDxjaGFyKj4oc3RhY2tfbXRlX3JpbmdidWZmZXJfYWxsb2NhdGUoMCwgbnVsbHB0cikpOworICBTY29wZWRVbm1hcCBze2RhdGEsIHNpemV9OworCisgIHVpbnRwdHJfdCB0YWdnZWRmcCA9ICgxVUxMIDw8IDU2KSB8IDE7CisgIHVpbnRwdHJfdCBwYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PigmbWVtY3B5KTsKKyAgbWVtY3B5KGRhdGEsICZwYywgc2l6ZW9mKHBjKSk7CisgIG1lbWNweShkYXRhICsgOCwgJnRhZ2dlZGZwLCBzaXplb2YodGFnZ2VkZnApKTsKKworICAvLyBUaGUgTVRFIFRMUyBpcyBhdCBUTFMgLSAzLCBzbyB3ZSBhbGxvY2F0ZSAzIHBsYWNlaG9sZGVycy4KKyAgdm9pZCogdGxzWzRdID0ge2RhdGEgKyAxNn07CisKKyAgdW53aW5kc3RhY2s6OkFuZHJvaWRMb2NhbFVud2luZGVyIHVud2luZGVyOworICB1bndpbmRzdGFjazo6RXJyb3JEYXRhIEU7CisgIHVud2luZGVyLkluaXRpYWxpemUoRSk7CisgIFN0YWNrSGlzdG9yeUJ1ZmZlciBzaGI7CisgIGR1bXBfc3RhY2tfaGlzdG9yeSgmdW53aW5kZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PigmdGxzWzNdKSwgc2hiLCAvKiBub3Vud2luZD0gKi8gZmFsc2UpOworICBBU1NFUlRfRVEoc2hiLmVudHJpZXNfc2l6ZSgpLCAxKTsKKyAgY29uc3QgU3RhY2tIaXN0b3J5QnVmZmVyRW50cnkmIGUgPSBzaGIuZW50cmllcygwKTsKKyAgRVhQRUNUX0VRKGUuYWRkcigpLnBjKCksIHBjKTsKKyAgRVhQRUNUX0VRKGUuYWRkcigpLmZpbGVfbmFtZSgpLCAiL2FwZXgvY29tLmFuZHJvaWQucnVudGltZS9saWI2NC9iaW9uaWMvbGliYy5zbyIpOworICBFWFBFQ1RfRVEoZS5mcCgpLCAxVUxMKTsKKyAgRVhQRUNUX0VRKGUudGFnKCksIDFVTEwpOworfQorCitzdGF0aWMgc3RkOjpvcHRpb25hbDxhbmRyb2lkOjpwcm9jaW5mbzo6TWFwSW5mbz4gRmluZE1hcHBpbmcodm9pZCogZGF0YSkgeworICBzdGQ6Om9wdGlvbmFsPGFuZHJvaWQ6OnByb2NpbmZvOjpNYXBJbmZvPiByZXN1bHQ7CisgIGFuZHJvaWQ6OnByb2NpbmZvOjpSZWFkTWFwRmlsZSgKKyAgICAgICIvcHJvYy9zZWxmL21hcHMiLCBbJnJlc3VsdCwgZGF0YV0oY29uc3QgYW5kcm9pZDo6cHJvY2luZm86Ok1hcEluZm8mIGluZm8pIHsKKyAgICAgICAgYXV0byBkYXRhX2ludCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3Q+KGRhdGEpICYgKCgxVUxMIDw8IDU2VUxMKSAtIDFVTEwpOworICAgICAgICBpZiAoaW5mby5zdGFydCA8PSBkYXRhX2ludCAmJiBkYXRhX2ludCA8IGluZm8uZW5kKSB7CisgICAgICAgICAgcmVzdWx0ID0gaW5mbzsKKyAgICAgICAgfQorICAgICAgfSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK1RFU1RfUChNdGVTdGFja0hpc3RvcnlUZXN0LCBUZXN0RnJlZSkgeworICBpbnQgc2l6ZV9jbHMgPSBHZXRQYXJhbSgpOworICBzaXplX3Qgc2l6ZSA9IHN0YWNrX210ZV9yaW5nYnVmZmVyX3NpemUoc2l6ZV9jbHMpOworICB2b2lkKiBkYXRhID0gc3RhY2tfbXRlX3JpbmdidWZmZXJfYWxsb2NhdGUoc2l6ZV9jbHMsIG51bGxwdHIpOworICBFWFBFQ1RfRVEoc3RhY2tfbXRlX3JpbmdidWZmZXJfc2l6ZV9mcm9tX3BvaW50ZXIocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGRhdGEpKSwgc2l6ZSk7CisgIGF1dG8gYmVmb3JlID0gRmluZE1hcHBpbmcoZGF0YSk7CisgIEFTU0VSVF9UUlVFKGJlZm9yZS5oYXNfdmFsdWUoKSk7CisgIEVYUEVDVF9FUShiZWZvcmUtPmVuZCAtIGJlZm9yZS0+c3RhcnQsIHNpemUpOworICBzdGFja19tdGVfZnJlZV9yaW5nYnVmZmVyKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihkYXRhKSk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSArPSBwYWdlX3NpemUoKSkgeworICAgIGF1dG8gYWZ0ZXIgPSBGaW5kTWFwcGluZyhzdGF0aWNfY2FzdDxjaGFyKj4oZGF0YSkgKyBpKTsKKyAgICBFWFBFQ1RfVFJVRSghYWZ0ZXIuaGFzX3ZhbHVlKCkgfHwgYWZ0ZXItPm5hbWUgIT0gYmVmb3JlLT5uYW1lKTsKKyAgfQorfQorCitURVNUX1AoTXRlU3RhY2tIaXN0b3J5VGVzdCwgVGVzdEVtcHR5KSB7CisgIGludCBzaXplX2NscyA9IEdldFBhcmFtKCk7CisgIHNpemVfdCBzaXplID0gc3RhY2tfbXRlX3JpbmdidWZmZXJfc2l6ZShzaXplX2Nscyk7CisgIHZvaWQqIGRhdGEgPSBzdGFja19tdGVfcmluZ2J1ZmZlcl9hbGxvY2F0ZShzaXplX2NscywgbnVsbHB0cik7CisgIFNjb3BlZFVubWFwIHN7ZGF0YSwgc2l6ZX07CisgIC8vIFRoZSBNVEUgVExTIGlzIGF0IFRMUyAtIDMsIHNvIHdlIGFsbG9jYXRlIDMgcGxhY2Vob2xkZXJzLgorICB2b2lkKiB0bHNbNF0gPSB7ZGF0YX07CisKKyAgU3RhY2tIaXN0b3J5QnVmZmVyIHNoYjsKKyAgZHVtcF9zdGFja19oaXN0b3J5KCYqdW53aW5kZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PigmdGxzWzNdKSwgc2hiLCAvKiBub3Vud2luZD0gKi8gdHJ1ZSk7CisgIEVYUEVDVF9FUShzaGIuZW50cmllc19zaXplKCksIDApOworfQorCitURVNUX1AoTXRlU3RhY2tIaXN0b3J5VGVzdCwgVGVzdEZ1bGwpIHsKKyAgaW50IHNpemVfY2xzID0gR2V0UGFyYW0oKTsKKyAgc2l6ZV90IHNpemUgPSBzdGFja19tdGVfcmluZ2J1ZmZlcl9zaXplKHNpemVfY2xzKTsKKyAgY2hhciogZGF0YSA9IHN0YXRpY19jYXN0PGNoYXIqPihzdGFja19tdGVfcmluZ2J1ZmZlcl9hbGxvY2F0ZShzaXplX2NscywgbnVsbHB0cikpOworICBTY29wZWRVbm1hcCBze2RhdGEsIHNpemV9OworICB1aW50cHRyX3QgaXRyID0gMTsKKyAgZm9yIChjaGFyKiBkID0gZGF0YTsgZCA8ICZkYXRhW3NpemVdOyBkICs9IDE2KSB7CisgICAgdWludHB0cl90IHRhZ2dlZGZwID0gKChpdHIgJiAxNSkgPDwgNTYpIHwgaXRyOworICAgIHVpbnRwdHJfdCBwYyA9IGl0cjsKKyAgICBtZW1jcHkoZCwgJnBjLCBzaXplb2YocGMpKTsKKyAgICBtZW1jcHkoZCArIDgsICZ0YWdnZWRmcCwgc2l6ZW9mKHRhZ2dlZGZwKSk7CisgICAgKytpdHI7CisgIH0KKyAgLy8gVGhlIE1URSBUTFMgaXMgYXQgVExTIC0gMywgc28gd2UgYWxsb2NhdGUgMyBwbGFjZWhvbGRlcnMuCisgIC8vIEJlY2F1c2UgdGhlIGJ1ZmZlciBpcyBmdWxsLCBhbmQgd2UgcG9pbnQgYXQgb25lIHBhc3QgdGhlIGxhc3QgaW5zZXJ0ZWQgZWxlbWVudCwKKyAgLy8gZHVlIHRvIHdyYXAtYXJvdW5kIHdlIHBvaW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlci4KKyAgdm9pZCogdGxzWzRdID0ge2RhdGF9OworCisgIFN0YWNrSGlzdG9yeUJ1ZmZlciBzaGI7CisgIGR1bXBfc3RhY2tfaGlzdG9yeSgmKnVud2luZGVyLCByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oJnRsc1szXSksIHNoYiwgLyogbm91bndpbmQ9ICovIHRydWUpOworICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8c2l6ZV90PihzaGIuZW50cmllc19zaXplKCkpLCBzaXplIC8gMTYpOworICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogc2hiLmVudHJpZXMoKSkgeworICAgIEVYUEVDVF9FUShlbnRyeS5hZGRyKCkucGMoKSwgLS1pdHIpOworICAgIEVYUEVDVF9FUShlbnRyeS5hZGRyKCkucGMoKSwgZW50cnkuZnAoKSk7CisgICAgRVhQRUNUX0VRKGVudHJ5LmFkZHIoKS5wYygpICYgMTUsIGVudHJ5LnRhZygpKTsKKyAgfQorfQorCitURVNUX1AoTXRlU3RhY2tIaXN0b3J5VGVzdCwgVGVzdEhhbGZGdWxsKSB7CisgIGludCBzaXplX2NscyA9IEdldFBhcmFtKCk7CisgIHNpemVfdCBzaXplID0gc3RhY2tfbXRlX3JpbmdidWZmZXJfc2l6ZShzaXplX2Nscyk7CisgIHNpemVfdCBoYWxmX3NpemUgPSBzaXplIC8gMjsKKworICBjaGFyKiBkYXRhID0gc3RhdGljX2Nhc3Q8Y2hhcio+KHN0YWNrX210ZV9yaW5nYnVmZmVyX2FsbG9jYXRlKHNpemVfY2xzLCBudWxscHRyKSk7CisgIFNjb3BlZFVubWFwIHN7ZGF0YSwgc2l6ZX07CisKKyAgdWludHB0cl90IGl0ciA9IDE7CisgIGZvciAoY2hhciogZCA9IGRhdGE7IGQgPCAmZGF0YVtoYWxmX3NpemVdOyBkICs9IDE2KSB7CisgICAgdWludHB0cl90IHRhZ2dlZGZwID0gKChpdHIgJiAxNSkgPDwgNTYpIHwgaXRyOworICAgIHVpbnRwdHJfdCBwYyA9IGl0cjsKKyAgICBtZW1jcHkoZCwgJnBjLCBzaXplb2YocGMpKTsKKyAgICBtZW1jcHkoZCArIDgsICZ0YWdnZWRmcCwgc2l6ZW9mKHRhZ2dlZGZwKSk7CisgICAgKytpdHI7CisgIH0KKyAgLy8gVGhlIE1URSBUTFMgaXMgYXQgVExTIC0gMywgc28gd2UgYWxsb2NhdGUgMyBwbGFjZWhvbGRlcnMuCisgIHZvaWQqIHRsc1s0XSA9IHsmZGF0YVtoYWxmX3NpemVdfTsKKworICBTdGFja0hpc3RvcnlCdWZmZXIgc2hiOworICBkdW1wX3N0YWNrX2hpc3RvcnkoJip1bndpbmRlciwgcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KCZ0bHNbM10pLCBzaGIsIC8qIG5vdW53aW5kPSAqLyB0cnVlKTsKKyAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PHNpemVfdD4oc2hiLmVudHJpZXNfc2l6ZSgpKSwgaGFsZl9zaXplIC8gMTYpOworICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogc2hiLmVudHJpZXMoKSkgeworICAgIEVYUEVDVF9FUShlbnRyeS5hZGRyKCkucGMoKSwgLS1pdHIpOworICAgIEVYUEVDVF9FUShlbnRyeS5hZGRyKCkucGMoKSwgZW50cnkuZnAoKSk7CisgICAgRVhQRUNUX0VRKGVudHJ5LmFkZHIoKS5wYygpICYgMTUsIGVudHJ5LnRhZygpKTsKKyAgfQorfQorCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoTXRlU3RhY2tIaXN0b3J5VGVzdEluc3RhbmNlLCBNdGVTdGFja0hpc3RvcnlUZXN0LCB0ZXN0aW5nOjpSYW5nZSgwLCA4KSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL2xpYmRlYnVnZ2VyZC90ZXN0L3RvbWJzdG9uZV9wcm90b190b190ZXh0X3Rlc3QuY3BwIGIvZGVidWdnZXJkL2xpYmRlYnVnZ2VyZC90ZXN0L3RvbWJzdG9uZV9wcm90b190b190ZXh0X3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZDIwOWEKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL3Rlc3QvdG9tYnN0b25lX3Byb3RvX3RvX3RleHRfdGVzdC5jcHAKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS90ZXN0X3V0aWxzLmg+CisKKyNpbmNsdWRlICJsaWJkZWJ1Z2dlcmQvdG9tYnN0b25lLmgiCisjaW5jbHVkZSAibGliZGVidWdnZXJkL3RvbWJzdG9uZV9wcm90b190b190ZXh0LmgiCisjaW5jbHVkZSAidG9tYnN0b25lLnBiLmgiCisKK3VzaW5nIENhbGxiYWNrVHlwZSA9IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnN0cmluZyYgbGluZSwgYm9vbCBzaG91bGRfbG9nKT47CisKK2NsYXNzIFRvbWJzdG9uZVByb3RvVG9UZXh0VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgdm9pZCBTZXRVcCgpIHsKKyAgICB0b21ic3RvbmVfLnJlc2V0KG5ldyBUb21ic3RvbmUpOworCisgICAgdG9tYnN0b25lXy0+c2V0X2FyY2goQXJjaGl0ZWN0dXJlOjpBUk02NCk7CisgICAgdG9tYnN0b25lXy0+c2V0X2J1aWxkX2ZpbmdlcnByaW50KCJUZXN0IGZpbmdlcnByaW50Iik7CisgICAgdG9tYnN0b25lXy0+c2V0X3RpbWVzdGFtcCgiMTk3MC0wMS0wMSAwMDowMDowMCIpOworICAgIHRvbWJzdG9uZV8tPnNldF9waWQoMTAwKTsKKyAgICB0b21ic3RvbmVfLT5zZXRfdGlkKDEwMCk7CisgICAgdG9tYnN0b25lXy0+c2V0X3VpZCgwKTsKKyAgICB0b21ic3RvbmVfLT5zZXRfc2VsaW51eF9sYWJlbCgibm9uZSIpOworCisgICAgU2lnbmFsIHNpZ25hbDsKKyAgICBzaWduYWwuc2V0X251bWJlcihTSUdTRUdWKTsKKyAgICBzaWduYWwuc2V0X25hbWUoIlNJR1NFR1YiKTsKKyAgICBzaWduYWwuc2V0X2NvZGUoMCk7CisgICAgc2lnbmFsLnNldF9jb2RlX25hbWUoIm5vbmUiKTsKKworICAgICp0b21ic3RvbmVfLT5tdXRhYmxlX3NpZ25hbF9pbmZvKCkgPSBzaWduYWw7CisKKyAgICBUaHJlYWQgdGhyZWFkOworICAgIHRocmVhZC5zZXRfaWQoMTAwKTsKKyAgICB0aHJlYWQuc2V0X25hbWUoIm1haW4iKTsKKyAgICB0aHJlYWQuc2V0X3RhZ2dlZF9hZGRyX2N0cmwoMCk7CisgICAgdGhyZWFkLnNldF9wYWNfZW5hYmxlZF9rZXlzKDApOworCisgICAgYXV0byYgdGhyZWFkcyA9ICp0b21ic3RvbmVfLT5tdXRhYmxlX3RocmVhZHMoKTsKKyAgICB0aHJlYWRzWzEwMF0gPSB0aHJlYWQ7CisgICAgbWFpbl90aHJlYWRfID0gJnRocmVhZHNbMTAwXTsKKyAgfQorCisgIHZvaWQgUHJvdG9Ub1N0cmluZygpIHsKKyAgICB0ZXh0XyA9ICIiOworICAgIEVYUEVDVF9UUlVFKHRvbWJzdG9uZV9wcm90b190b190ZXh0KAorICAgICAgICAqdG9tYnN0b25lXywKKyAgICAgICAgW3RoaXNdKGNvbnN0IHN0ZDo6c3RyaW5nJiBsaW5lLCBib29sIHNob3VsZF9sb2cpIHsKKyAgICAgICAgICBpZiAoc2hvdWxkX2xvZykgeworICAgICAgICAgICAgdGV4dF8gKz0gIkxPRyAiOworICAgICAgICAgIH0KKyAgICAgICAgICB0ZXh0XyArPSBsaW5lICsgJ1xuJzsKKyAgICAgICAgfSwKKyAgICAgICAgWyZdKGNvbnN0IEJhY2t0cmFjZUZyYW1lJiBmcmFtZSkgeworICAgICAgICAgIHRleHRfICs9ICJTWU1CT0xJWkUgIiArIGZyYW1lLmJ1aWxkX2lkKCkgKyAiICIgKyBzdGQ6OnRvX3N0cmluZyhmcmFtZS5wYygpKSArICJcbiI7CisgICAgICAgIH0pKTsKKyAgfQorCisgIFRocmVhZCogbWFpbl90aHJlYWRfOworICBzdGQ6OnN0cmluZyB0ZXh0XzsKKyAgc3RkOjp1bmlxdWVfcHRyPFRvbWJzdG9uZT4gdG9tYnN0b25lXzsKK307CisKK1RFU1RfRihUb21ic3RvbmVQcm90b1RvVGV4dFRlc3QsIHRhZ2dlZF9hZGRyX2N0cmwpIHsKKyAgbWFpbl90aHJlYWRfLT5zZXRfdGFnZ2VkX2FkZHJfY3RybCgwKTsKKyAgUHJvdG9Ub1N0cmluZygpOworICBFWFBFQ1RfTUFUQ0godGV4dF8sICJMT0cgdGFnZ2VkX2FkZHJfY3RybDogMDAwMDAwMDAwMDAwMDAwMFxcbiIpOworCisgIG1haW5fdGhyZWFkXy0+c2V0X3RhZ2dlZF9hZGRyX2N0cmwoUFJfVEFHR0VEX0FERFJfRU5BQkxFKTsKKyAgUHJvdG9Ub1N0cmluZygpOworICBFWFBFQ1RfTUFUQ0godGV4dF8sICJMT0cgdGFnZ2VkX2FkZHJfY3RybDogMDAwMDAwMDAwMDAwMDAwMSBcXChQUl9UQUdHRURfQUREUl9FTkFCTEVcXClcXG4iKTsKKworICBtYWluX3RocmVhZF8tPnNldF90YWdnZWRfYWRkcl9jdHJsKFBSX1RBR0dFRF9BRERSX0VOQUJMRSB8IFBSX01URV9UQ0ZfU1lOQyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ZmZmZSA8PCBQUl9NVEVfVEFHX1NISUZUKSk7CisgIFByb3RvVG9TdHJpbmcoKTsKKyAgRVhQRUNUX01BVENIKHRleHRfLAorICAgICAgICAgICAgICAgIkxPRyB0YWdnZWRfYWRkcl9jdHJsOiAwMDAwMDAwMDAwMDdmZmYzIFxcKFBSX1RBR0dFRF9BRERSX0VOQUJMRSwgUFJfTVRFX1RDRl9TWU5DLCAiCisgICAgICAgICAgICAgICAibWFzayAweGZmZmVcXClcXG4iKTsKKworICBtYWluX3RocmVhZF8tPnNldF90YWdnZWRfYWRkcl9jdHJsKDB4ZjAwMDAwMDAgfCBQUl9UQUdHRURfQUREUl9FTkFCTEUgfCBQUl9NVEVfVENGX1NZTkMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSX01URV9UQ0ZfQVNZTkMgfCAoMHhmZmZlIDw8IFBSX01URV9UQUdfU0hJRlQpKTsKKyAgUHJvdG9Ub1N0cmluZygpOworICBFWFBFQ1RfTUFUQ0godGV4dF8sCisgICAgICAgICAgICAgICAiTE9HIHRhZ2dlZF9hZGRyX2N0cmw6IDAwMDAwMDAwZjAwN2ZmZjcgXFwoUFJfVEFHR0VEX0FERFJfRU5BQkxFLCBQUl9NVEVfVENGX1NZTkMsICIKKyAgICAgICAgICAgICAgICJQUl9NVEVfVENGX0FTWU5DLCBtYXNrIDB4ZmZmZSwgdW5rbm93biAweGYwMDAwMDAwXFwpXFxuIik7Cit9CisKK1RFU1RfRihUb21ic3RvbmVQcm90b1RvVGV4dFRlc3QsIHBhY19lbmFibGVkX2tleXMpIHsKKyAgbWFpbl90aHJlYWRfLT5zZXRfcGFjX2VuYWJsZWRfa2V5cygwKTsKKyAgUHJvdG9Ub1N0cmluZygpOworICBFWFBFQ1RfTUFUQ0godGV4dF8sICJMT0cgcGFjX2VuYWJsZWRfa2V5czogMDAwMDAwMDAwMDAwMDAwMFxcbiIpOworCisgIG1haW5fdGhyZWFkXy0+c2V0X3BhY19lbmFibGVkX2tleXMoUFJfUEFDX0FQSUFLRVkpOworICBQcm90b1RvU3RyaW5nKCk7CisgIEVYUEVDVF9NQVRDSCh0ZXh0XywgIkxPRyBwYWNfZW5hYmxlZF9rZXlzOiAwMDAwMDAwMDAwMDAwMDAxIFxcKFBSX1BBQ19BUElBS0VZXFwpXFxuIik7CisKKyAgbWFpbl90aHJlYWRfLT5zZXRfcGFjX2VuYWJsZWRfa2V5cyhQUl9QQUNfQVBJQUtFWSB8IFBSX1BBQ19BUERCS0VZKTsKKyAgUHJvdG9Ub1N0cmluZygpOworICBFWFBFQ1RfTUFUQ0godGV4dF8sCisgICAgICAgICAgICAgICAiTE9HIHBhY19lbmFibGVkX2tleXM6IDAwMDAwMDAwMDAwMDAwMDkgXFwoUFJfUEFDX0FQSUFLRVksIFBSX1BBQ19BUERCS0VZXFwpXFxuIik7CisKKyAgbWFpbl90aHJlYWRfLT5zZXRfcGFjX2VuYWJsZWRfa2V5cyhQUl9QQUNfQVBJQUtFWSB8IFBSX1BBQ19BUERCS0VZIHwgMHgxMDAwKTsKKyAgUHJvdG9Ub1N0cmluZygpOworICBFWFBFQ1RfTUFUQ0godGV4dF8sCisgICAgICAgICAgICAgICAiTE9HIHBhY19lbmFibGVkX2tleXM6IDAwMDAwMDAwMDAwMDEwMDkgXFwoUFJfUEFDX0FQSUFLRVksIFBSX1BBQ19BUERCS0VZLCB1bmtub3duICIKKyAgICAgICAgICAgICAgICIweDEwMDBcXClcXG4iKTsKK30KKworVEVTVF9GKFRvbWJzdG9uZVByb3RvVG9UZXh0VGVzdCwgY3Jhc2hfZGV0YWlsX3N0cmluZykgeworICBhdXRvKiBjcmFzaF9kZXRhaWwgPSB0b21ic3RvbmVfLT5hZGRfY3Jhc2hfZGV0YWlscygpOworICBjcmFzaF9kZXRhaWwtPnNldF9uYW1lKCJDUkFTSF9ERVRBSUxfTkFNRSIpOworICBjcmFzaF9kZXRhaWwtPnNldF9kYXRhKCJjcmFzaF9kZXRhaWxfdmFsdWUiKTsKKyAgUHJvdG9Ub1N0cmluZygpOworICBFWFBFQ1RfTUFUQ0godGV4dF8sICIoQ1JBU0hfREVUQUlMX05BTUU6ICdjcmFzaF9kZXRhaWxfdmFsdWUnKSIpOworfQorCitURVNUX0YoVG9tYnN0b25lUHJvdG9Ub1RleHRUZXN0LCBjcmFzaF9kZXRhaWxfYnl0ZXMpIHsKKyAgYXV0byogY3Jhc2hfZGV0YWlsID0gdG9tYnN0b25lXy0+YWRkX2NyYXNoX2RldGFpbHMoKTsKKyAgY3Jhc2hfZGV0YWlsLT5zZXRfbmFtZSgiQ1JBU0hfREVUQUlMX05BTUUiKTsKKyAgY3Jhc2hfZGV0YWlsLT5zZXRfZGF0YSgiaGVsbG93b3JsZFwxXDI1NVwzIik7CisgIFByb3RvVG9TdHJpbmcoKTsKKyAgRVhQRUNUX01BVENIKHRleHRfLCBSIihDUkFTSF9ERVRBSUxfTkFNRTogJ2hlbGxvd29ybGRcXDFcXDI1NVxcMycpIik7Cit9CisKK1RFU1RfRihUb21ic3RvbmVQcm90b1RvVGV4dFRlc3QsIHN0YWNrX3JlY29yZCkgeworICBhdXRvKiBjYXVzZSA9IHRvbWJzdG9uZV8tPmFkZF9jYXVzZXMoKTsKKyAgY2F1c2UtPnNldF9odW1hbl9yZWFkYWJsZSgic3RhY2sgdGFnLW1pc21hdGNoIG9uIHRocmVhZCAxMjMiKTsKKyAgYXV0byogc3RhY2sgPSB0b21ic3RvbmVfLT5tdXRhYmxlX3N0YWNrX2hpc3RvcnlfYnVmZmVyKCk7CisgIHN0YWNrLT5zZXRfdGlkKDEyMyk7CisgIHsKKyAgICBhdXRvKiBzaGJfZW50cnkgPSBzdGFjay0+YWRkX2VudHJpZXMoKTsKKyAgICBzaGJfZW50cnktPnNldF9mcCgweDEpOworICAgIHNoYl9lbnRyeS0+c2V0X3RhZygweGIpOworICAgIGF1dG8qIGFkZHIgPSBzaGJfZW50cnktPm11dGFibGVfYWRkcigpOworICAgIGFkZHItPnNldF9yZWxfcGMoMHg1NjcpOworICAgIGFkZHItPnNldF9maWxlX25hbWUoImZvby5zbyIpOworICAgIGFkZHItPnNldF9idWlsZF9pZCgiQUJDMTIzIik7CisgIH0KKyAgeworICAgIGF1dG8qIHNoYl9lbnRyeSA9IHN0YWNrLT5hZGRfZW50cmllcygpOworICAgIHNoYl9lbnRyeS0+c2V0X2ZwKDB4Mik7CisgICAgc2hiX2VudHJ5LT5zZXRfdGFnKDB4Yyk7CisgICAgYXV0byogYWRkciA9IHNoYl9lbnRyeS0+bXV0YWJsZV9hZGRyKCk7CisgICAgYWRkci0+c2V0X3JlbF9wYygweDY3OCk7CisgICAgYWRkci0+c2V0X2ZpbGVfbmFtZSgiYmFyLnNvIik7CisgIH0KKyAgUHJvdG9Ub1N0cmluZygpOworICBFWFBFQ1RfTUFUQ0godGV4dF8sICJzdGFjayB0YWctbWlzbWF0Y2ggb24gdGhyZWFkIDEyMyIpOworICBFWFBFQ1RfTUFUQ0godGV4dF8sICJzdGFja19yZWNvcmQgZnA6MHgxIHRhZzoweGIgcGM6Zm9vXFwuc29cXCsweDU2NyBcXChCdWlsZElkOiBBQkMxMjNcXCkiKTsKKyAgRVhQRUNUX01BVENIKHRleHRfLCAic3RhY2tfcmVjb3JkIGZwOjB4MiB0YWc6MHhjIHBjOmJhclxcLnNvXFwrMHg2NzgiKTsKK30KKworVEVTVF9GKFRvbWJzdG9uZVByb3RvVG9UZXh0VGVzdCwgc3ltYm9saXplKSB7CisgIEJhY2t0cmFjZUZyYW1lKiBmcmFtZSA9IG1haW5fdGhyZWFkXy0+YWRkX2N1cnJlbnRfYmFja3RyYWNlKCk7CisgIGZyYW1lLT5zZXRfcGMoMTIzNDUpOworICBmcmFtZS0+c2V0X2J1aWxkX2lkKCIwMTIzNDU2Nzg5YWJjZGVmIik7CisgIFByb3RvVG9TdHJpbmcoKTsKKyAgRVhQRUNUX01BVENIKHRleHRfLCAiXFwoQnVpbGRJZDogMDEyMzQ1Njc4OWFiY2RlZlxcKVxcblNZTUJPTElaRSAwMTIzNDU2Nzg5YWJjZGVmIDEyMzQ1XFxuIik7Cit9CmRpZmYgLS1naXQgYS9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL3Rlc3QvdXRpbGl0eV90ZXN0LmNwcCBiL2RlYnVnZ2VyZC9saWJkZWJ1Z2dlcmQvdGVzdC91dGlsaXR5X3Rlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWQzMzgwLi4wMDAwMDAwCi0tLSBhL2RlYnVnZ2VyZC9saWJkZWJ1Z2dlcmQvdGVzdC91dGlsaXR5X3Rlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgotCi0jaW5jbHVkZSAibGliZGVidWdnZXJkL3V0aWxpdHkuaCIKLQotVEVTVChVdGlsaXR5VGVzdCwgZGVzY3JpYmVfdGFnZ2VkX2FkZHJfY3RybCkgewotICBFWFBFQ1RfRVEoIiIsIGRlc2NyaWJlX3RhZ2dlZF9hZGRyX2N0cmwoMCkpOwotICBFWFBFQ1RfRVEoIiAoUFJfVEFHR0VEX0FERFJfRU5BQkxFKSIsIGRlc2NyaWJlX3RhZ2dlZF9hZGRyX2N0cmwoUFJfVEFHR0VEX0FERFJfRU5BQkxFKSk7Ci0gIEVYUEVDVF9FUSgiIChQUl9UQUdHRURfQUREUl9FTkFCTEUsIFBSX01URV9UQ0ZfU1lOQywgbWFzayAweGZmZmUpIiwKLSAgICAgICAgICAgIGRlc2NyaWJlX3RhZ2dlZF9hZGRyX2N0cmwoUFJfVEFHR0VEX0FERFJfRU5BQkxFIHwgUFJfTVRFX1RDRl9TWU5DIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ZmZmZSA8PCBQUl9NVEVfVEFHX1NISUZUKSkpOwotICBFWFBFQ1RfRVEoCi0gICAgICAiIChQUl9UQUdHRURfQUREUl9FTkFCTEUsIFBSX01URV9UQ0ZfU1lOQywgUFJfTVRFX1RDRl9BU1lOQywgbWFzayAweGZmZmUsIHVua25vd24gIgotICAgICAgIjB4ZjAwMDAwMDApIiwKLSAgICAgIGRlc2NyaWJlX3RhZ2dlZF9hZGRyX2N0cmwoMHhmMDAwMDAwMCB8IFBSX1RBR0dFRF9BRERSX0VOQUJMRSB8IFBSX01URV9UQ0ZfU1lOQyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSX01URV9UQ0ZfQVNZTkMgfCAoMHhmZmZlIDw8IFBSX01URV9UQUdfU0hJRlQpKSk7Ci19Ci0KLVRFU1QoVXRpbGl0eVRlc3QsIGRlc2NyaWJlX3BhY19lbmFibGVkX2tleXMpIHsKLSAgRVhQRUNUX0VRKCIiLCBkZXNjcmliZV9wYWNfZW5hYmxlZF9rZXlzKDApKTsKLSAgRVhQRUNUX0VRKCIgKFBSX1BBQ19BUElBS0VZKSIsIGRlc2NyaWJlX3BhY19lbmFibGVkX2tleXMoUFJfUEFDX0FQSUFLRVkpKTsKLSAgRVhQRUNUX0VRKCIgKFBSX1BBQ19BUElBS0VZLCBQUl9QQUNfQVBEQktFWSkiLAotICAgICAgICAgICAgZGVzY3JpYmVfcGFjX2VuYWJsZWRfa2V5cyhQUl9QQUNfQVBJQUtFWSB8IFBSX1BBQ19BUERCS0VZKSk7Ci0gIEVYUEVDVF9FUSgiIChQUl9QQUNfQVBJQUtFWSwgUFJfUEFDX0FQREJLRVksIHVua25vd24gMHgxMDAwKSIsCi0gICAgICAgICAgICBkZXNjcmliZV9wYWNfZW5hYmxlZF9rZXlzKFBSX1BBQ19BUElBS0VZIHwgUFJfUEFDX0FQREJLRVkgfCAweDEwMDApKTsKLX0KZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9saWJkZWJ1Z2dlcmQvdG9tYnN0b25lLmNwcCBiL2RlYnVnZ2VyZC9saWJkZWJ1Z2dlcmQvdG9tYnN0b25lLmNwcAppbmRleCAzNzVlZDhhLi4zMGM2ZmU0IDEwMDY0NAotLS0gYS9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL3RvbWJzdG9uZS5jcHAKKysrIGIvZGVidWdnZXJkL2xpYmRlYnVnZ2VyZC90b21ic3RvbmUuY3BwCkBAIC0xNyw2ICsxNyw3IEBACiAjZGVmaW5lIExPR19UQUcgIkRFQlVHIgogCiAjaW5jbHVkZSAibGliZGVidWdnZXJkL3RvbWJzdG9uZS5oIgorI2luY2x1ZGUgImxpYmRlYnVnZ2VyZC90b21ic3RvbmVfcHJvdG9fdG9fdGV4dC5oIgogCiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxzaWduYWwuaD4KQEAgLTc2LDcgKzc3LDcgQEAKICAgdGhyZWFkc1t0YXJnZXRfdGlkXSA9IFRocmVhZEluZm8gewogICAgIC5yZWdpc3RlcnMgPSBzdGQ6Om1vdmUocmVncyksIC51aWQgPSB1aWQsIC50aWQgPSB0YXJnZXRfdGlkLAogICAgIC50aHJlYWRfbmFtZSA9IHN0ZDo6bW92ZSh0aHJlYWRfbmFtZSksIC5waWQgPSBwaWQsIC5jb21tYW5kX2xpbmUgPSBzdGQ6Om1vdmUoY29tbWFuZF9saW5lKSwKLSAgICAuc2VsaW51eF9sYWJlbCA9IHN0ZDo6bW92ZShzZWxpbnV4X2xhYmVsKSwgLnNpZ2luZm8gPSBzaWdpbmZvLAorICAgIC5zZWxpbnV4X2xhYmVsID0gc3RkOjptb3ZlKHNlbGludXhfbGFiZWwpLCAuc2lnaW5mbyA9IHNpZ2luZm8sIC5zaWdubyA9IHNpZ2luZm8tPnNpX3NpZ25vLAogICAgIC8vIE9ubHkgc3VwcG9ydGVkIG9uIGFhcmNoNjQgZm9yIG5vdy4KICNpZiBkZWZpbmVkKF9fYWFyY2g2NF9fKQogICAgIC50YWdnZWRfYWRkcl9jdHJsID0gcHJjdGwoUFJfR0VUX1RBR0dFRF9BRERSX0NUUkwsIDAsIDAsIDAsIDApLApAQCAtMTI1LDEwICsxMjYsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgdW53aW5kc3RhY2s6OkFuZHJvaWRVbndpbmRlciogdW53aW5kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHBpZF90LCBUaHJlYWRJbmZvPiYgdGhyZWFkcywgcGlkX3QgdGFyZ2V0X3RocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvY2Vzc0luZm8mIHByb2Nlc3NfaW5mbywgT3BlbkZpbGVzTGlzdCogb3Blbl9maWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGFtZmRfZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogYW1mZF9kYXRhLCBjb25zdCBBcmNoaXRlY3R1cmUqIGd1ZXN0X2FyY2gsCisgICAgICAgICAgICAgICAgICAgICAgIHVud2luZHN0YWNrOjpBbmRyb2lkVW53aW5kZXIqIGd1ZXN0X3Vud2luZGVyKSB7CiAgIC8vIERvbid0IGNvcHkgbG9nIG1lc3NhZ2VzIHRvIHRvbWJzdG9uZSB1bmxlc3MgdGhpcyBpcyBhIGRldmVsb3BtZW50IGRldmljZS4KICAgVG9tYnN0b25lIHRvbWJzdG9uZTsKLSAgZW5ncmF2ZV90b21ic3RvbmVfcHJvdG8oJnRvbWJzdG9uZSwgdW53aW5kZXIsIHRocmVhZHMsIHRhcmdldF90aHJlYWQsIHByb2Nlc3NfaW5mbywgb3Blbl9maWxlcyk7CisgIGVuZ3JhdmVfdG9tYnN0b25lX3Byb3RvKCZ0b21ic3RvbmUsIHVud2luZGVyLCB0aHJlYWRzLCB0YXJnZXRfdGhyZWFkLCBwcm9jZXNzX2luZm8sIG9wZW5fZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGd1ZXN0X2FyY2gsIGd1ZXN0X3Vud2luZGVyKTsKIAogICBpZiAocHJvdG9fZmQgIT0gLTEpIHsKICAgICBpZiAoIXRvbWJzdG9uZS5TZXJpYWxpemVUb0ZpbGVEZXNjcmlwdG9yKHByb3RvX2ZkLmdldCgpKSkgewpAQCAtMTQzLDcgKzE0NiwxMCBAQAogICBsb2cudGZkID0gb3V0cHV0X2ZkLmdldCgpOwogICBsb2cuYW1mZF9kYXRhID0gYW1mZF9kYXRhOwogCi0gIHRvbWJzdG9uZV9wcm90b190b190ZXh0KHRvbWJzdG9uZSwgWyZsb2ddKGNvbnN0IHN0ZDo6c3RyaW5nJiBsaW5lLCBib29sIHNob3VsZF9sb2cpIHsKLSAgICBfTE9HKCZsb2csIHNob3VsZF9sb2cgPyBsb2d0eXBlOjpIRUFERVIgOiBsb2d0eXBlOjpMT0dTLCAiJXNcbiIsIGxpbmUuY19zdHIoKSk7Ci0gIH0pOworICB0b21ic3RvbmVfcHJvdG9fdG9fdGV4dCgKKyAgICAgIHRvbWJzdG9uZSwKKyAgICAgIFsmbG9nXShjb25zdCBzdGQ6OnN0cmluZyYgbGluZSwgYm9vbCBzaG91bGRfbG9nKSB7CisgICAgICAgIF9MT0coJmxvZywgc2hvdWxkX2xvZyA/IGxvZ3R5cGU6OkhFQURFUiA6IGxvZ3R5cGU6OkxPR1MsICIlc1xuIiwgbGluZS5jX3N0cigpKTsKKyAgICAgIH0sCisgICAgICBbXShjb25zdCBCYWNrdHJhY2VGcmFtZSYpIHt9KTsKIH0KZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9saWJkZWJ1Z2dlcmQvdG9tYnN0b25lX3Byb3RvLmNwcCBiL2RlYnVnZ2VyZC9saWJkZWJ1Z2dlcmQvdG9tYnN0b25lX3Byb3RvLmNwcAppbmRleCA3YjJlMDY4Li5kNTkzNThjIDEwMDY0NAotLS0gYS9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL3RvbWJzdG9uZV9wcm90by5jcHAKKysrIGIvZGVidWdnZXJkL2xpYmRlYnVnZ2VyZC90b21ic3RvbmVfcHJvdG8uY3BwCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxzaWduYWwuaD4KICNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzeXMvbW1hbi5oPgpAQCAtNDgsOCArNDksMTIgQEAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CiAKICNpbmNsdWRlIDxhbmRyb2lkL2xvZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvc2V0X2Fib3J0X21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxiaW9uaWMvY3Jhc2hfZGV0YWlsX2ludGVybmFsLmg+CiAjaW5jbHVkZSA8YmlvbmljL21hY3Jvcy5oPgorI2luY2x1ZGUgPGJpb25pYy9tdGUuaD4KICNpbmNsdWRlIDxiaW9uaWMvcmVzZXJ2ZWRfc2lnbmFscy5oPgorI2luY2x1ZGUgPGJpb25pYy90bHNfZGVmaW5lcy5oPgogI2luY2x1ZGUgPGxvZy9sb2cuaD4KICNpbmNsdWRlIDxsb2cvbG9nX3JlYWQuaD4KICNpbmNsdWRlIDxsb2cvbG9ncHJpbnQuaD4KQEAgLTY0LDYgKzY5LDcgQEAKIAogI2luY2x1ZGUgImxpYmRlYnVnZ2VyZC9vcGVuX2ZpbGVzX2xpc3QuaCIKICNpbmNsdWRlICJsaWJkZWJ1Z2dlcmQvdXRpbGl0eS5oIgorI2luY2x1ZGUgImxpYmRlYnVnZ2VyZC91dGlsaXR5X2hvc3QuaCIKICNpbmNsdWRlICJ1dGlsLmgiCiAKICNpbmNsdWRlICJ0b21ic3RvbmUucGIuaCIKQEAgLTk0LDYgKzEwMCwxMSBAQAogCiBzdGF0aWMgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gZ2V0X3N0YWNrX292ZXJmbG93X2NhdXNlKHVpbnQ2NF90IGZhdWx0X2FkZHIsIHVpbnQ2NF90IHNwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bndpbmRzdGFjazo6TWFwcyogbWFwcykgeworICAvLyBVbmRlciBzdGFjayBNVEUgdGhlIHN0YWNrIHBvaW50ZXIgYW5kL29yIHRoZSBmYXVsdCBhZGRyZXNzIGNhbiBiZSB0YWdnZWQuCisgIC8vIEluIG9yZGVyIHRvIGNhbGN1bGF0ZSBkZWx0YXMgYmV0d2VlbiB0aGVtLCBzdHJpcCBvZmYgdGhlIHRhZ3Mgb2ZmIGJvdGgKKyAgLy8gYWRkcmVzc2VzLgorICBmYXVsdF9hZGRyID0gdW50YWdfYWRkcmVzcyhmYXVsdF9hZGRyKTsKKyAgc3AgPSB1bnRhZ19hZGRyZXNzKHNwKTsKICAgc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrTWF4RGlmZmVyZW5jZUJ5dGVzID0gMjU2OwogICB1aW50NjRfdCBkaWZmZXJlbmNlOwogICBpZiAoc3AgPj0gZmF1bHRfYWRkcikgewpAQCAtMTk1LDggKzIwNiwxMTcgQEAKICAgICAgIGVycm9yX3R5cGVfc3RyLCBkaWZmLCBieXRlX3N1ZmZpeCwgbG9jYXRpb25fc3RyLCBoZWFwX29iamVjdC5zaXplKCksIGhlYXBfb2JqZWN0LmFkZHJlc3MoKSkpOwogfQogCisjaWYgZGVmaW5lZChfX2FhcmNoNjRfXykKK3ZvaWQgZHVtcF9zdGFja19oaXN0b3J5KHVud2luZHN0YWNrOjpBbmRyb2lkVW53aW5kZXIqIHVud2luZGVyLCB1aW50cHRyX3QgdGFyZ2V0X3RscywKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0YWNrSGlzdG9yeUJ1ZmZlciYgc2hiX29iaiwgYm9vbCBub3Vud2luZCkgeworICBhdXRvIHByb2Nlc3NfbWVtb3J5ID0gdW53aW5kZXItPkdldFByb2Nlc3NNZW1vcnkoKTsKKyAgdGFyZ2V0X3RscyArPSBzaXplb2Yodm9pZCopICogVExTX1NMT1RfU1RBQ0tfTVRFOworICB1aW50cHRyX3Qgc3RhY2tfbXRlOworICBpZiAoIXByb2Nlc3NfbWVtb3J5LT5SZWFkRnVsbHkodGFyZ2V0X3RscywgJnN0YWNrX210ZSwgc2l6ZW9mKHN0YWNrX210ZSkpKSB7CisgICAgYXN5bmNfc2FmZV9mb3JtYXRfbG9nKEFORFJPSURfTE9HX0VSUk9SLCBMT0dfVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZHVtcF9zdGFja19oaXN0b3J5OiBmYWlsZWQgdG8gcmVhZCBUTFNfU0xPVF9TVEFDS19NVEU6ICVtIik7CisgICAgcmV0dXJuOworICB9CisgIGlmIChzdGFja19tdGUgPT0gMCkgeworICAgIGFzeW5jX3NhZmVfZm9ybWF0X2xvZyhBTkRST0lEX0xPR19ERUJVRywgTE9HX1RBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImR1bXBfc3RhY2tfaGlzdG9yeTogc3RhY2sgaGlzdG9yeSBidWZmZXIgaXMgbnVsbCIpOworICAgIHJldHVybjsKKyAgfQorICB1aW50cHRyX3QgdW50YWdnZWRfc3RhY2tfbXRlID0gdW50YWdfYWRkcmVzcyhzdGFja19tdGUpOworICB1aW50cHRyX3QgYnVmX3NpemUgPSBzdGFja19tdGVfcmluZ2J1ZmZlcl9zaXplX2Zyb21fcG9pbnRlcihzdGFja19tdGUpOworICBpZiAoYnVmX3NpemUgPT0gMCkgeworICAgIGFzeW5jX3NhZmVfZm9ybWF0X2xvZyhBTkRST0lEX0xPR19FUlJPUiwgTE9HX1RBRywgImR1bXBfc3RhY2tfaGlzdG9yeTogZW1wdHkgc2l6ZSIpOworICAgIHJldHVybjsKKyAgfQorICB1aW50cHRyX3QgYnVmX3N0YXJ0ID0gdW50YWdnZWRfc3RhY2tfbXRlICYgfihidWZfc2l6ZSAtIDFVTEwpOworICBzdGQ6OnZlY3RvcjxjaGFyPiBidWYoYnVmX3NpemUpOworICBpZiAoIXByb2Nlc3NfbWVtb3J5LT5SZWFkRnVsbHkoYnVmX3N0YXJ0LCBidWYuZGF0YSgpLCBidWYuc2l6ZSgpKSkgeworICAgIGFzeW5jX3NhZmVfZm9ybWF0X2xvZyhBTkRST0lEX0xPR19FUlJPUiwgTE9HX1RBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImR1bXBfc3RhY2tfaGlzdG9yeTogZmFpbGVkIHRvIHJlYWQgc3RhY2sgaGlzdG9yeTogJW0iKTsKKyAgICByZXR1cm47CisgIH0KKyAgdWludHB0cl90IG9yaWdpbmFsX29mZiA9IHVudGFnZ2VkX3N0YWNrX210ZSAtIGJ1Zl9zdGFydDsKKyAgaWYgKG9yaWdpbmFsX29mZiAlIDE2IHx8IG9yaWdpbmFsX29mZiA+IGJ1Zl9zaXplKSB7CisgICAgYXN5bmNfc2FmZV9mb3JtYXRfbG9nKEFORFJPSURfTE9HX0VSUk9SLCBMT0dfVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZHVtcF9zdGFja19oaXN0b3J5OiBpbnZhbGlkIG9mZnNldDogJSIgUFJJdVBUUiwgb3JpZ2luYWxfb2ZmKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBUaGUgb3JpZ2luYWxfb2ZmIGlzIHRoZSBuZXh0IHNsb3QgdGhhdCB3b3VsZCBoYXZlIGJlZW4gd3JpdHRlbiwgc28gdGhlIGxhc3QKKyAgLy8gc2xvdCB0aGF0IHdhcyB3cml0dGVuIGlzIHRoZSBwcmV2aW91cyBvbmUuCisgIGZvciAodWludHB0cl90IGlkeCA9IDE2OyBpZHggPD0gYnVmX3NpemU7IGlkeCArPSAxNikgeworICAgIGludDY0X3Qgb2ZmID0gb3JpZ2luYWxfb2ZmIC0gaWR4OworICAgIGlmIChvZmYgPCAwKSBvZmYgKz0gYnVmX3NpemU7CisgICAgdWludHB0cl90IHBjLCB0YWdnZWRmcDsKKyAgICBtZW1jcHkoJnBjLCAmKGJ1ZltvZmZdKSwgc2l6ZW9mKHBjKSk7CisgICAgbWVtY3B5KCZ0YWdnZWRmcCwgJihidWZbb2ZmICsgc2l6ZW9mKHBjKV0pLCBzaXplb2YodGFnZ2VkZnApKTsKKworICAgIGlmIChwYyA9PSAwKSBicmVhazsKKyAgICB1aW50cHRyX3QgZnAgPSB1bnRhZ19hZGRyZXNzKHRhZ2dlZGZwKTsKKyAgICB1aW50cHRyX3QgdGFnID0gdGFnZ2VkZnAgPj4gNTY7CisKKyAgICB1bndpbmRzdGFjazo6RnJhbWVEYXRhIGZyYW1lX2RhdGE7CisKKyAgICBpZiAobm91bndpbmQpIHsKKyAgICAgIGZyYW1lX2RhdGEucGMgPSBwYzsKKyAgICB9IGVsc2UgeworICAgICAgLy8gKzQgaXMgdG8gY291bnRlcmFjdCB0aGUgInBjIGFkanVzdG1lbnQiIGluIEJ1aWxkRnJhbWVGcm9tUGNPbmx5LgorICAgICAgLy8gQnVpbGRGcmFtZUZyb21QY09ubHkgYXNzdW1lcyB3ZSBhcmUgdW53aW5kaW5nLCBzbyBpdCBuZWVkcyB0byBjb3JyZWN0IGZvciB0aGF0CisgICAgICAvLyB0aGUgUEMgaXMgdGhlIHJldHVybiBhZGRyZXNzLiBUaGF0IGlzIG5vdCB0aGUgY2FzZSBoZXJlLgorICAgICAgLy8gSXQgZG9lc24ndCByZWFsbHkgbWF0dGVyLCBiZWNhdXNlIGVpdGhlciBzaG91bGQgYmUgaW4gdGhlIGNvcnJlY3QgZnVuY3Rpb24sIGJ1dAorICAgICAgLy8gdGhpcyBpcyBtb3JlIGNvcnJlY3QgKGFuZCBjb25zaXN0ZW50IHdpdGggdGhlIG5vdW53aW5kIGNhc2UpLgorICAgICAgZnJhbWVfZGF0YSA9IHVud2luZGVyLT5CdWlsZEZyYW1lRnJvbVBjT25seShwYyk7CisgICAgICBmcmFtZV9kYXRhLnBjICs9IDQ7CisgICAgICBmcmFtZV9kYXRhLnJlbF9wYyArPSA0OworICAgIH0KKworICAgIFN0YWNrSGlzdG9yeUJ1ZmZlckVudHJ5KiBlbnRyeSA9IHNoYl9vYmouYWRkX2VudHJpZXMoKTsKKyAgICBmaWxsX2luX2JhY2t0cmFjZV9mcmFtZShlbnRyeS0+bXV0YWJsZV9hZGRyKCksIGZyYW1lX2RhdGEpOworICAgIGVudHJ5LT5zZXRfZnAoZnApOworICAgIGVudHJ5LT5zZXRfdGFnKHRhZyk7CisgIH0KK30KKworc3RhdGljIHBpZF90IGdldF9jb250YWluaW5nX3RocmVhZCh1bndpbmRzdGFjazo6TWFwSW5mbyogbWFwX2luZm8sIHBpZF90IG1haW5fdGlkKSB7CisgIGlmIChtYXBfaW5mbyA9PSBudWxscHRyKSByZXR1cm4gMDsKKworICBzdGQ6OnN0cmluZyBuYW1lID0gbWFwX2luZm8tPm5hbWUoKTsKKyAgaWYgKG5hbWUgPT0gIltzdGFja10iKSB7CisgICAgcmV0dXJuIG1haW5fdGlkOworICB9CisgIGludCB0aWQ7CisgIGlmIChzc2NhbmYobmFtZS5jX3N0cigpLCAiW2Fub246c3RhY2tfYW5kX3RsczolZCIsICZ0aWQpICE9IDEpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gdGlkOworfQorCitzdGF0aWMgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gbWF5YmVfc3RhY2tfbXRlX2NhdXNlKAorICAgIFRvbWJzdG9uZSogdG9tYnN0b25lLCB1bndpbmRzdGFjazo6QW5kcm9pZFVud2luZGVyKiB1bndpbmRlciwgY29uc3QgVGhyZWFkSW5mbyYgdGFyZ2V0X3RocmVhZCwKKyAgICBbW21heWJlX3VudXNlZF1dIGNvbnN0IHN0ZDo6bWFwPHBpZF90LCBUaHJlYWRJbmZvPiYgdGhyZWFkcywgdWludDY0X3QgZmF1bHRfYWRkcikgeworICB1bndpbmRzdGFjazo6TWFwcyogbWFwcyA9IHVud2luZGVyLT5HZXRNYXBzKCk7CisgIGF1dG8gbWFwX2luZm8gPSBtYXBzLT5GaW5kKHVudGFnX2FkZHJlc3MoZmF1bHRfYWRkcikpOworICBwaWRfdCB0aWQgPSBnZXRfY29udGFpbmluZ190aHJlYWQobWFwX2luZm8uZ2V0KCksIHRhcmdldF90aHJlYWQudGlkKTsKKyAgaWYgKCF0aWQpIHsKKyAgICByZXR1cm4gc3RkOjpudWxsb3B0OworICB9CisgIGF1dG8gaXQgPSB0aHJlYWRzLmZpbmQodGlkKTsKKyAgaWYgKGl0ICE9IHRocmVhZHMuZW5kKCkpIHsKKyAgICBTdGFja0hpc3RvcnlCdWZmZXIqIHNoYiA9IHRvbWJzdG9uZS0+bXV0YWJsZV9zdGFja19oaXN0b3J5X2J1ZmZlcigpOworICAgIHNoYi0+c2V0X3RpZCh0aWQpOworICAgIGR1bXBfc3RhY2tfaGlzdG9yeSh1bndpbmRlciwgaXQtPnNlY29uZC50bHMsICpzaGIpOworICB9IGVsc2UgeworICAgIGFzeW5jX3NhZmVfZm9ybWF0X2xvZyhBTkRST0lEX0xPR19FUlJPUiwgTE9HX1RBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImR1bXBfcHJvYmFibGVfY2F1c2U6IHVua25vd24gdGFyZ2V0IHRocmVhZCAlZCIsIHRpZCk7CisgIH0KKyAgcmV0dXJuIFN0cmluZ1ByaW50Zigic3RhY2sgdGFnLW1pc21hdGNoIG9uIHRocmVhZCAldSIsIHRpZCk7Cit9CisKKyNlbmRpZgorCiBzdGF0aWMgdm9pZCBkdW1wX3Byb2JhYmxlX2NhdXNlKFRvbWJzdG9uZSogdG9tYnN0b25lLCB1bndpbmRzdGFjazo6QW5kcm9pZFVud2luZGVyKiB1bndpbmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvY2Vzc0luZm8mIHByb2Nlc3NfaW5mbywgY29uc3QgVGhyZWFkSW5mbyYgbWFpbl90aHJlYWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvY2Vzc0luZm8mIHByb2Nlc3NfaW5mbywgY29uc3QgVGhyZWFkSW5mbyYgdGFyZ2V0X3RocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1ttYXliZV91bnVzZWRdXSBjb25zdCBzdGQ6Om1hcDxwaWRfdCwgVGhyZWFkSW5mbz4mIHRocmVhZHMpIHsKICNpZiBkZWZpbmVkKFVTRV9TQ1VETykKICAgU2N1ZG9DcmFzaERhdGEgc2N1ZG9fY3Jhc2hfZGF0YSh1bndpbmRlci0+R2V0UHJvY2Vzc01lbW9yeSgpLmdldCgpLCBwcm9jZXNzX2luZm8pOwogICBpZiAoc2N1ZG9fY3Jhc2hfZGF0YS5DcmFzaElzTWluZSgpKSB7CkBAIC0yMDYsMTMgKzMyNiwxMyBAQAogI2VuZGlmCiAKICAgR3dwQXNhbkNyYXNoRGF0YSBnd3BfYXNhbl9jcmFzaF9kYXRhKHVud2luZGVyLT5HZXRQcm9jZXNzTWVtb3J5KCkuZ2V0KCksIHByb2Nlc3NfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fdGhyZWFkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF90aHJlYWQpOwogICBpZiAoZ3dwX2FzYW5fY3Jhc2hfZGF0YS5DcmFzaElzTWluZSgpKSB7CiAgICAgZ3dwX2FzYW5fY3Jhc2hfZGF0YS5BZGRDYXVzZVByb3Rvcyh0b21ic3RvbmUsIHVud2luZGVyKTsKICAgICByZXR1cm47CiAgIH0KIAotICBjb25zdCBzaWdpbmZvICpzaSA9IG1haW5fdGhyZWFkLnNpZ2luZm87CisgIGNvbnN0IHNpZ2luZm8gKnNpID0gdGFyZ2V0X3RocmVhZC5zaWdpbmZvOwogICBhdXRvIGZhdWx0X2FkZHIgPSByZWludGVycHJldF9jYXN0PHVpbnQ2NF90PihzaS0+c2lfYWRkcik7CiAgIHVud2luZHN0YWNrOjpNYXBzKiBtYXBzID0gdW53aW5kZXItPkdldE1hcHMoKTsKIApAQCAtMjMxLDE2ICszNTEsMjcgQEAKICAgICB9IGVsc2UgaWYgKGZhdWx0X2FkZHIgPT0gMHhmZmZmMGY2MCkgewogICAgICAgY2F1c2UgPSAiY2FsbCB0byBrdXNlcl9jbXB4Y2hnNjQiOwogICAgIH0gZWxzZSB7Ci0gICAgICBjYXVzZSA9IGdldF9zdGFja19vdmVyZmxvd19jYXVzZShmYXVsdF9hZGRyLCBtYWluX3RocmVhZC5yZWdpc3RlcnMtPnNwKCksIG1hcHMpOworICAgICAgY2F1c2UgPSBnZXRfc3RhY2tfb3ZlcmZsb3dfY2F1c2UoZmF1bHRfYWRkciwgdGFyZ2V0X3RocmVhZC5yZWdpc3RlcnMtPnNwKCksIG1hcHMpOwogICAgIH0KICAgfSBlbHNlIGlmIChzaS0+c2lfc2lnbm8gPT0gU0lHU0VHViAmJiBzaS0+c2lfY29kZSA9PSBTRUdWX0FDQ0VSUikgewogICAgIGF1dG8gbWFwX2luZm8gPSBtYXBzLT5GaW5kKGZhdWx0X2FkZHIpOwogICAgIGlmIChtYXBfaW5mbyAhPSBudWxscHRyICYmIG1hcF9pbmZvLT5mbGFncygpID09IFBST1RfRVhFQykgewogICAgICAgY2F1c2UgPSAiZXhlY3V0ZS1vbmx5IChuby1yZWFkKSBtZW1vcnkgYWNjZXNzIGVycm9yOyBsaWtlbHkgZHVlIHRvIGRhdGEgaW4gLnRleHQuIjsKKyAgICB9IGVsc2UgaWYgKGZhdWx0X2FkZHIgPT0gdGFyZ2V0X3RocmVhZC5yZWdpc3RlcnMtPnBjKCkgJiYKKyAgICAgICAgICAgICAgIG1hcF9pbmZvICE9IG51bGxwdHIgJiYgKG1hcF9pbmZvLT5mbGFncygpICYgUFJPVF9FWEVDKSA9PSAwKSB7CisgICAgICBjYXVzZSA9ICJ0cnlpbmcgdG8gZXhlY3V0ZSBub24tZXhlY3V0YWJsZSBtZW1vcnkuIjsKICAgICB9IGVsc2UgewotICAgICAgY2F1c2UgPSBnZXRfc3RhY2tfb3ZlcmZsb3dfY2F1c2UoZmF1bHRfYWRkciwgbWFpbl90aHJlYWQucmVnaXN0ZXJzLT5zcCgpLCBtYXBzKTsKKyAgICAgIGNhdXNlID0gZ2V0X3N0YWNrX292ZXJmbG93X2NhdXNlKGZhdWx0X2FkZHIsIHRhcmdldF90aHJlYWQucmVnaXN0ZXJzLT5zcCgpLCBtYXBzKTsKICAgICB9Ci0gIH0gZWxzZSBpZiAoc2ktPnNpX3NpZ25vID09IFNJR1NZUyAmJiBzaS0+c2lfY29kZSA9PSBTWVNfU0VDQ09NUCkgeworICB9CisjaWYgZGVmaW5lZChfX2FhcmNoNjRfXykgJiYgZGVmaW5lZChTRUdWX01URVNFUlIpCisgIGVsc2UgaWYgKHNpLT5zaV9zaWdubyA9PSBTSUdTRUdWICYmIHNpLT5zaV9jb2RlID09IFNFR1ZfTVRFU0VSUikgeworICAgIC8vIElmIHRoaXMgd2FzIGEgaGVhcCBNVEUgY3Jhc2gsIGl0IHdvdWxkIGhhdmUgYmVlbiBoYW5kbGVkIGJ5IHNjdWRvLiBDaGVja2luZyB3aGV0aGVyIGl0CisgICAgLy8gaXMgYSBzdGFjayBvbmUuCisgICAgY2F1c2UgPSBtYXliZV9zdGFja19tdGVfY2F1c2UodG9tYnN0b25lLCB1bndpbmRlciwgdGFyZ2V0X3RocmVhZCwgdGhyZWFkcywgZmF1bHRfYWRkcik7CisgIH0KKyNlbmRpZgorICBlbHNlIGlmIChzaS0+c2lfc2lnbm8gPT0gU0lHU1lTICYmIHNpLT5zaV9jb2RlID09IFNZU19TRUNDT01QKSB7CiAgICAgY2F1c2UgPSBTdHJpbmdQcmludGYoInNlY2NvbXAgcHJldmVudGVkIGNhbGwgdG8gZGlzYWxsb3dlZCAlcyBzeXN0ZW0gY2FsbCAlZCIsIEFCSV9TVFJJTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2ktPnNpX3N5c2NhbGwpOwogICB9CkBAIC0yNTEsNiArMzgyLDQ2IEBACiAgIH0KIH0KIAorc3RhdGljIHZvaWQgZHVtcF9jcmFzaF9kZXRhaWxzKFRvbWJzdG9uZSogdG9tYnN0b25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjx1bndpbmRzdGFjazo6TWVtb3J5PiYgcHJvY2Vzc19tZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvY2Vzc0luZm8mIHByb2Nlc3NfaW5mbykgeworICB1aW50cHRyX3QgYWRkcmVzcyA9IHByb2Nlc3NfaW5mby5jcmFzaF9kZXRhaWxfcGFnZTsKKyAgd2hpbGUgKGFkZHJlc3MpIHsKKyAgICBzdHJ1Y3QgY3Jhc2hfZGV0YWlsX3BhZ2VfdCBwYWdlOworICAgIGlmICghcHJvY2Vzc19tZW1vcnktPlJlYWRGdWxseShhZGRyZXNzLCAmcGFnZSwgc2l6ZW9mKHBhZ2UpKSkgeworICAgICAgYXN5bmNfc2FmZV9mb3JtYXRfbG9nKEFORFJPSURfTE9HX0VSUk9SLCBMT0dfVEFHLCAiZmFpbGVkIHRvIHJlYWQgY3Jhc2ggZGV0YWlsIHBhZ2U6ICVtIik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHBhZ2UudXNlZCA+IGtOdW1DcmFzaERldGFpbHMpIHsKKyAgICAgIGFzeW5jX3NhZmVfZm9ybWF0X2xvZyhBTkRST0lEX0xPR19FUlJPUiwgTE9HX1RBRywgImNyYXNoIGRldGFpbDogcGFnZSBjb3JydXB0ZWQiKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhZ2UudXNlZDsgKytpKSB7CisgICAgICBjb25zdCBjcmFzaF9kZXRhaWxfdCYgY3Jhc2hfZGV0YWlsID0gcGFnZS5jcmFzaF9kZXRhaWxzW2ldOworICAgICAgaWYgKCFjcmFzaF9kZXRhaWwuZGF0YSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHN0ZDo6c3RyaW5nIG5hbWUoY3Jhc2hfZGV0YWlsLm5hbWVfc2l6ZSwgJ1wwJyk7CisgICAgICBpZiAoIXByb2Nlc3NfbWVtb3J5LT5SZWFkRnVsbHkocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGNyYXNoX2RldGFpbC5uYW1lKSwgbmFtZS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jhc2hfZGV0YWlsLm5hbWVfc2l6ZSkpIHsKKyAgICAgICAgYXN5bmNfc2FmZV9mb3JtYXRfbG9nKEFORFJPSURfTE9HX0VSUk9SLCBMT0dfVEFHLCAiY3Jhc2ggZGV0YWlsOiBmYWlsZWQgdG8gcmVhZCBuYW1lOiAlbSIpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHN0ZDo6c3RyaW5nIGRhdGEoY3Jhc2hfZGV0YWlsLmRhdGFfc2l6ZSwgJ1wwJyk7CisgICAgICBpZiAoIXByb2Nlc3NfbWVtb3J5LT5SZWFkRnVsbHkocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGNyYXNoX2RldGFpbC5kYXRhKSwgZGF0YS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jhc2hfZGV0YWlsLmRhdGFfc2l6ZSkpIHsKKyAgICAgICAgYXN5bmNfc2FmZV9mb3JtYXRfbG9nKEFORFJPSURfTE9HX0VSUk9SLCBMT0dfVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyYXNoIGRldGFpbDogZmFpbGVkIHRvIHJlYWQgZGF0YSBmb3IgJXM6ICVtIiwgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBhdXRvKiBwcm90b19kZXRhaWwgPSB0b21ic3RvbmUtPmFkZF9jcmFzaF9kZXRhaWxzKCk7CisgICAgICBwcm90b19kZXRhaWwtPnNldF9uYW1lKG5hbWUpOworICAgICAgcHJvdG9fZGV0YWlsLT5zZXRfZGF0YShkYXRhKTsKKyAgICB9CisgICAgYWRkcmVzcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihwYWdlLnByZXYpOworICB9Cit9CisKIHN0YXRpYyB2b2lkIGR1bXBfYWJvcnRfbWVzc2FnZShUb21ic3RvbmUqIHRvbWJzdG9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8dW53aW5kc3RhY2s6Ok1lbW9yeT4mIHByb2Nlc3NfbWVtb3J5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb2Nlc3NJbmZvJiBwcm9jZXNzX2luZm8pIHsKQEAgLTQzNSw3ICs2MDYsOCBAQAogfQogCiBzdGF0aWMgdm9pZCBkdW1wX3RocmVhZChUb21ic3RvbmUqIHRvbWJzdG9uZSwgdW53aW5kc3RhY2s6OkFuZHJvaWRVbndpbmRlciogdW53aW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJlYWRJbmZvJiB0aHJlYWRfaW5mbywgYm9vbCBtZW1vcnlfZHVtcCA9IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJlYWRJbmZvJiB0aHJlYWRfaW5mbywgYm9vbCBtZW1vcnlfZHVtcCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgdW53aW5kc3RhY2s6OkFuZHJvaWRVbndpbmRlciogZ3Vlc3RfdW53aW5kZXIgPSBudWxscHRyKSB7CiAgIFRocmVhZCB0aHJlYWQ7CiAKICAgdGhyZWFkLnNldF9pZCh0aHJlYWRfaW5mby50aWQpOwpAQCAtNDYyLDYgKzYzNCwyNyBAQAogCiAgIGF1dG8mIHRocmVhZHMgPSAqdG9tYnN0b25lLT5tdXRhYmxlX3RocmVhZHMoKTsKICAgdGhyZWFkc1t0aHJlYWRfaW5mby50aWRdID0gdGhyZWFkOworCisgIGlmIChndWVzdF91bndpbmRlcikgeworICAgIGlmICghdGhyZWFkX2luZm8uZ3Vlc3RfcmVnaXN0ZXJzKSB7CisgICAgICBhc3luY19zYWZlX2Zvcm1hdF9sb2coQU5EUk9JRF9MT0dfSU5GTywgTE9HX1RBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gZ3Vlc3Qgc3RhdGUgcmVnaXN0ZXJzIGluZm9ybWF0aW9uIGZvciB0aWQgJWQiLCB0aHJlYWRfaW5mby50aWQpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBUaHJlYWQgZ3Vlc3RfdGhyZWFkOworICAgIHVud2luZHN0YWNrOjpBbmRyb2lkVW53aW5kZXJEYXRhIGd1ZXN0X2RhdGE7CisgICAgZ3Vlc3RfZGF0YS5zYXZlZF9pbml0aWFsX3JlZ3MgPSBzdGQ6Om1ha2Vfb3B0aW9uYWw8c3RkOjp1bmlxdWVfcHRyPHVud2luZHN0YWNrOjpSZWdzPj4oKTsKKyAgICBpZiAoZ3Vlc3RfdW53aW5kZXItPlVud2luZCh0aHJlYWRfaW5mby5ndWVzdF9yZWdpc3RlcnMuZ2V0KCksIGd1ZXN0X2RhdGEpKSB7CisgICAgICBkdW1wX3RocmVhZF9iYWNrdHJhY2UoZ3Vlc3RfZGF0YS5mcmFtZXMsIGd1ZXN0X3RocmVhZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGFzeW5jX3NhZmVfZm9ybWF0X2xvZyhBTkRST0lEX0xPR19FUlJPUiwgTE9HX1RBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW53aW5kIGd1ZXN0IHN0YXRlIHJlZ2lzdGVycyBmYWlsZWQgZm9yIHRpZCAlZDogRXJyb3IgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZF9pbmZvLnRpZCwgZ3Vlc3RfZGF0YS5HZXRFcnJvclN0cmluZygpLmNfc3RyKCkpOworICAgIH0KKyAgICBkdW1wX3JlZ2lzdGVycyhndWVzdF91bndpbmRlciwgKmd1ZXN0X2RhdGEuc2F2ZWRfaW5pdGlhbF9yZWdzLCBndWVzdF90aHJlYWQsIG1lbW9yeV9kdW1wKTsKKyAgICBhdXRvJiBndWVzdF90aHJlYWRzID0gKnRvbWJzdG9uZS0+bXV0YWJsZV9ndWVzdF90aHJlYWRzKCk7CisgICAgZ3Vlc3RfdGhyZWFkc1t0aHJlYWRfaW5mby50aWRdID0gZ3Vlc3RfdGhyZWFkOworICB9CiB9CiAKIHN0YXRpYyB2b2lkIGR1bXBfbWFwcGluZ3MoVG9tYnN0b25lKiB0b21ic3RvbmUsIHVud2luZHN0YWNrOjpNYXBzKiBtYXBzLApAQCAtNDkzLDI3ICs2ODYsNDggQEAKICAgfQogfQogCisvLyBUaGlzIGNyZWF0ZXMgYSBmYWtlIGxvZyBtZXNzYWdlIHRoYXQgaW5kaWNhdGVzIGFuIGVycm9yIG9jY3VycmVkIHdoZW4KKy8vIHJlYWRpbmcgdGhlIGxvZy4KK3N0YXRpYyB2b2lkIGFkZF9lcnJvcl9sb2dfbXNnKFRvbWJzdG9uZSogdG9tYnN0b25lLCBjb25zdCBzdGQ6OnN0cmluZyYmIGVycm9yX21zZykgeworICBMb2dCdWZmZXIgYnVmZmVyOworICBidWZmZXIuc2V0X25hbWUoIkVSUk9SIik7CisKKyAgTG9nTWVzc2FnZSogbG9nX21zZyA9IGJ1ZmZlci5hZGRfbG9ncygpOworICBsb2dfbXNnLT5zZXRfdGltZXN0YW1wKCIwMC0wMCAwMDowMDowMC4wMDAiKTsKKyAgbG9nX21zZy0+c2V0X3BpZCgwKTsKKyAgbG9nX21zZy0+c2V0X3RpZCgwKTsKKyAgbG9nX21zZy0+c2V0X3ByaW9yaXR5KEFORFJPSURfTE9HX0VSUk9SKTsKKyAgbG9nX21zZy0+c2V0X3RhZygiIik7CisgIGxvZ19tc2ctPnNldF9tZXNzYWdlKGVycm9yX21zZyk7CisKKyAgKnRvbWJzdG9uZS0+YWRkX2xvZ19idWZmZXJzKCkgPSBzdGQ6Om1vdmUoYnVmZmVyKTsKKworICBhc3luY19zYWZlX2Zvcm1hdF9sb2coQU5EUk9JRF9MT0dfRVJST1IsIExPR19UQUcsICIlcyIsIGVycm9yX21zZy5jX3N0cigpKTsKK30KKwogc3RhdGljIHZvaWQgZHVtcF9sb2dfZmlsZShUb21ic3RvbmUqIHRvbWJzdG9uZSwgY29uc3QgY2hhciogbG9nZ2VyLCBwaWRfdCBwaWQpIHsKICAgbG9nZ2VyX2xpc3QqIGxvZ2dlcl9saXN0ID0gYW5kcm9pZF9sb2dnZXJfbGlzdF9vcGVuKGFuZHJvaWRfbmFtZV90b19sb2dfaWQobG9nZ2VyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfTE9HX05PTkJMT0NLLCBrTWF4TG9nTWVzc2FnZXMsIHBpZCk7CisgIGlmIChsb2dnZXJfbGlzdCA9PSBudWxscHRyKSB7CisgICAgYWRkX2Vycm9yX2xvZ19tc2codG9tYnN0b25lLCBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoIkNhbm5vdCBvcGVuIGxvZyBmaWxlICVzIiwgbG9nZ2VyKSk7CisgICAgcmV0dXJuOworICB9CiAKICAgTG9nQnVmZmVyIGJ1ZmZlcjsKLQogICB3aGlsZSAodHJ1ZSkgewogICAgIGxvZ19tc2cgbG9nX2VudHJ5OwogICAgIHNzaXplX3QgYWN0dWFsID0gYW5kcm9pZF9sb2dnZXJfbGlzdF9yZWFkKGxvZ2dlcl9saXN0LCAmbG9nX2VudHJ5KTsKLQogICAgIGlmIChhY3R1YWwgPCAwKSB7CiAgICAgICBpZiAoYWN0dWFsID09IC1FSU5UUikgewogICAgICAgICAvLyBpbnRlcnJ1cHRlZCBieSBzaWduYWwsIHJldHJ5CiAgICAgICAgIGNvbnRpbnVlOwogICAgICAgfQotICAgICAgaWYgKGFjdHVhbCA9PSAtRUFHQUlOKSB7Ci0gICAgICAgIC8vIG5vbi1ibG9ja2luZyBFT0Y7IHdlJ3JlIGRvbmUKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBicmVhazsKKyAgICAgIC8vIERvbid0IGNvbnNpZGVyIEVBR0FJTiBhbiBlcnJvciBzaW5jZSB0aGlzIGlzIGEgbm9uLWJsb2NraW5nIGNhbGwuCisgICAgICBpZiAoYWN0dWFsICE9IC1FQUdBSU4pIHsKKyAgICAgICAgYWRkX2Vycm9yX2xvZ19tc2codG9tYnN0b25lLCBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoInJlYWRpbmcgbG9nICVzIGZhaWxlZCAoJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLCBzdHJlcnJvcigtYWN0dWFsKSkpOwogICAgICAgfQorICAgICAgYnJlYWs7CiAgICAgfSBlbHNlIGlmIChhY3R1YWwgPT0gMCkgewogICAgICAgYnJlYWs7CiAgICAgfQpAQCAtNjE3LDI4ICs4MzEsMzUgQEAKIH0KIAogdm9pZCBlbmdyYXZlX3RvbWJzdG9uZV9wcm90byhUb21ic3RvbmUqIHRvbWJzdG9uZSwgdW53aW5kc3RhY2s6OkFuZHJvaWRVbndpbmRlciogdW53aW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHBpZF90LCBUaHJlYWRJbmZvPiYgdGhyZWFkcywgcGlkX3QgdGFyZ2V0X3RocmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvY2Vzc0luZm8mIHByb2Nlc3NfaW5mbywgY29uc3QgT3BlbkZpbGVzTGlzdCogb3Blbl9maWxlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxwaWRfdCwgVGhyZWFkSW5mbz4mIHRocmVhZHMsIHBpZF90IHRhcmdldF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb2Nlc3NJbmZvJiBwcm9jZXNzX2luZm8sIGNvbnN0IE9wZW5GaWxlc0xpc3QqIG9wZW5fZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyY2hpdGVjdHVyZSogZ3Vlc3RfYXJjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW53aW5kc3RhY2s6OkFuZHJvaWRVbndpbmRlciogZ3Vlc3RfdW53aW5kZXIpIHsKICAgVG9tYnN0b25lIHJlc3VsdDsKIAogICByZXN1bHQuc2V0X2FyY2goZ2V0X2FyY2goKSk7CisgIGlmIChndWVzdF9hcmNoICE9IG51bGxwdHIpIHsKKyAgICByZXN1bHQuc2V0X2d1ZXN0X2FyY2goKmd1ZXN0X2FyY2gpOworICB9IGVsc2UgeworICAgIHJlc3VsdC5zZXRfZ3Vlc3RfYXJjaChBcmNoaXRlY3R1cmU6Ok5PTkUpOworICB9CiAgIHJlc3VsdC5zZXRfYnVpbGRfZmluZ2VycHJpbnQoYW5kcm9pZDo6YmFzZTo6R2V0UHJvcGVydHkoInJvLmJ1aWxkLmZpbmdlcnByaW50IiwgInVua25vd24iKSk7CiAgIHJlc3VsdC5zZXRfcmV2aXNpb24oYW5kcm9pZDo6YmFzZTo6R2V0UHJvcGVydHkoInJvLnJldmlzaW9uIiwgInVua25vd24iKSk7CiAgIHJlc3VsdC5zZXRfdGltZXN0YW1wKGdldF90aW1lc3RhbXAoKSk7CiAKLSAgY29uc3QgVGhyZWFkSW5mbyYgbWFpbl90aHJlYWQgPSB0aHJlYWRzLmF0KHRhcmdldF90aHJlYWQpOwotICByZXN1bHQuc2V0X3BpZChtYWluX3RocmVhZC5waWQpOwotICByZXN1bHQuc2V0X3RpZChtYWluX3RocmVhZC50aWQpOwotICByZXN1bHQuc2V0X3VpZChtYWluX3RocmVhZC51aWQpOwotICByZXN1bHQuc2V0X3NlbGludXhfbGFiZWwobWFpbl90aHJlYWQuc2VsaW51eF9sYWJlbCk7CisgIGNvbnN0IFRocmVhZEluZm8mIHRhcmdldF90aHJlYWQgPSB0aHJlYWRzLmF0KHRhcmdldF90aWQpOworICByZXN1bHQuc2V0X3BpZCh0YXJnZXRfdGhyZWFkLnBpZCk7CisgIHJlc3VsdC5zZXRfdGlkKHRhcmdldF90aHJlYWQudGlkKTsKKyAgcmVzdWx0LnNldF91aWQodGFyZ2V0X3RocmVhZC51aWQpOworICByZXN1bHQuc2V0X3NlbGludXhfbGFiZWwodGFyZ2V0X3RocmVhZC5zZWxpbnV4X2xhYmVsKTsKICAgLy8gVGhlIG1haW4gdGhyZWFkIG11c3QgaGF2ZSBhIHZhbGlkIHNpZ2luZm8uCi0gIENIRUNLKG1haW5fdGhyZWFkLnNpZ2luZm8gIT0gbnVsbHB0cik7CisgIENIRUNLKHRhcmdldF90aHJlYWQuc2lnaW5mbyAhPSBudWxscHRyKTsKIAogICBzdHJ1Y3Qgc3lzaW5mbyBzaTsKICAgc3lzaW5mbygmc2kpOwogICBhbmRyb2lkOjpwcm9jaW5mbzo6UHJvY2Vzc0luZm8gcHJvY19pbmZvOwogICBzdGQ6OnN0cmluZyBlcnJvcjsKLSAgaWYgKGFuZHJvaWQ6OnByb2NpbmZvOjpHZXRQcm9jZXNzSW5mbyhtYWluX3RocmVhZC5waWQsICZwcm9jX2luZm8sICZlcnJvcikpIHsKKyAgaWYgKGFuZHJvaWQ6OnByb2NpbmZvOjpHZXRQcm9jZXNzSW5mbyh0YXJnZXRfdGhyZWFkLnBpZCwgJnByb2NfaW5mbywgJmVycm9yKSkgewogICAgIHVpbnQ2NF90IHN0YXJ0dGltZSA9IHByb2NfaW5mby5zdGFydHRpbWUgLyBzeXNjb25mKF9TQ19DTEtfVENLKTsKICAgICByZXN1bHQuc2V0X3Byb2Nlc3NfdXB0aW1lKHNpLnVwdGltZSAtIHN0YXJ0dGltZSk7CiAgIH0gZWxzZSB7CkBAIC02NDYsMjUgKzg2NywyOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5jX3N0cigpKTsKICAgfQogCisgIHJlc3VsdC5zZXRfcGFnZV9zaXplKGdldHBhZ2VzaXplKCkpOworICByZXN1bHQuc2V0X2hhc19iZWVuXzE2a2JfbW9kZShhbmRyb2lkOjpiYXNlOjpHZXRCb29sUHJvcGVydHkoInJvLm1pc2N0cmwuMTZrYl9iZWZvcmUiLCBmYWxzZSkpOworCiAgIGF1dG8gY21kX2xpbmUgPSByZXN1bHQubXV0YWJsZV9jb21tYW5kX2xpbmUoKTsKLSAgZm9yIChjb25zdCBhdXRvJiBhcmcgOiBtYWluX3RocmVhZC5jb21tYW5kX2xpbmUpIHsKKyAgZm9yIChjb25zdCBhdXRvJiBhcmcgOiB0YXJnZXRfdGhyZWFkLmNvbW1hbmRfbGluZSkgewogICAgICpjbWRfbGluZS0+QWRkKCkgPSBhcmc7CiAgIH0KIAotICBpZiAoIW1haW5fdGhyZWFkLnNpZ2luZm8pIHsKKyAgaWYgKCF0YXJnZXRfdGhyZWFkLnNpZ2luZm8pIHsKICAgICBhc3luY19zYWZlX2ZhdGFsKCJzaWdpbmZvIG1pc3NpbmciKTsKICAgfQogCiAgIFNpZ25hbCBzaWc7Ci0gIHNpZy5zZXRfbnVtYmVyKG1haW5fdGhyZWFkLnNpZ25vKTsKLSAgc2lnLnNldF9uYW1lKGdldF9zaWduYW1lKG1haW5fdGhyZWFkLnNpZ2luZm8pKTsKLSAgc2lnLnNldF9jb2RlKG1haW5fdGhyZWFkLnNpZ2luZm8tPnNpX2NvZGUpOwotICBzaWcuc2V0X2NvZGVfbmFtZShnZXRfc2lnY29kZShtYWluX3RocmVhZC5zaWdpbmZvKSk7CisgIHNpZy5zZXRfbnVtYmVyKHRhcmdldF90aHJlYWQuc2lnbm8pOworICBzaWcuc2V0X25hbWUoZ2V0X3NpZ25hbWUodGFyZ2V0X3RocmVhZC5zaWdpbmZvKSk7CisgIHNpZy5zZXRfY29kZSh0YXJnZXRfdGhyZWFkLnNpZ2luZm8tPnNpX2NvZGUpOworICBzaWcuc2V0X2NvZGVfbmFtZShnZXRfc2lnY29kZSh0YXJnZXRfdGhyZWFkLnNpZ2luZm8pKTsKIAotICBpZiAoc2lnbmFsX2hhc19zZW5kZXIobWFpbl90aHJlYWQuc2lnaW5mbywgbWFpbl90aHJlYWQucGlkKSkgeworICBpZiAoc2lnbmFsX2hhc19zZW5kZXIodGFyZ2V0X3RocmVhZC5zaWdpbmZvLCB0YXJnZXRfdGhyZWFkLnBpZCkpIHsKICAgICBzaWcuc2V0X2hhc19zZW5kZXIodHJ1ZSk7Ci0gICAgc2lnLnNldF9zZW5kZXJfdWlkKG1haW5fdGhyZWFkLnNpZ2luZm8tPnNpX3VpZCk7Ci0gICAgc2lnLnNldF9zZW5kZXJfcGlkKG1haW5fdGhyZWFkLnNpZ2luZm8tPnNpX3BpZCk7CisgICAgc2lnLnNldF9zZW5kZXJfdWlkKHRhcmdldF90aHJlYWQuc2lnaW5mby0+c2lfdWlkKTsKKyAgICBzaWcuc2V0X3NlbmRlcl9waWQodGFyZ2V0X3RocmVhZC5zaWdpbmZvLT5zaV9waWQpOwogICB9CiAKICAgaWYgKHByb2Nlc3NfaW5mby5oYXNfZmF1bHRfYWRkcmVzcykgewpAQCAtNjc3LDI5ICs5MDEsMjkgQEAKICAgKnJlc3VsdC5tdXRhYmxlX3NpZ25hbF9pbmZvKCkgPSBzaWc7CiAKICAgZHVtcF9hYm9ydF9tZXNzYWdlKCZyZXN1bHQsIHVud2luZGVyLT5HZXRQcm9jZXNzTWVtb3J5KCksIHByb2Nlc3NfaW5mbyk7Ci0KLSAgLy8gRHVtcCB0aGUgbWFpbiB0aHJlYWQsIGJ1dCBzYXZlIHRoZSBtZW1vcnkgYXJvdW5kIHRoZSByZWdpc3RlcnMuCi0gIGR1bXBfdGhyZWFkKCZyZXN1bHQsIHVud2luZGVyLCBtYWluX3RocmVhZCwgLyogbWVtb3J5X2R1bXAgKi8gdHJ1ZSk7CisgIGR1bXBfY3Jhc2hfZGV0YWlscygmcmVzdWx0LCB1bndpbmRlci0+R2V0UHJvY2Vzc01lbW9yeSgpLCBwcm9jZXNzX2luZm8pOworICAvLyBEdW1wIHRoZSB0YXJnZXQgdGhyZWFkLCBidXQgc2F2ZSB0aGUgbWVtb3J5IGFyb3VuZCB0aGUgcmVnaXN0ZXJzLgorICBkdW1wX3RocmVhZCgmcmVzdWx0LCB1bndpbmRlciwgdGFyZ2V0X3RocmVhZCwgLyogbWVtb3J5X2R1bXAgKi8gdHJ1ZSwgZ3Vlc3RfdW53aW5kZXIpOwogCiAgIGZvciAoY29uc3QgYXV0byYgW3RpZCwgdGhyZWFkX2luZm9dIDogdGhyZWFkcykgewotICAgIGlmICh0aWQgIT0gdGFyZ2V0X3RocmVhZCkgewotICAgICAgZHVtcF90aHJlYWQoJnJlc3VsdCwgdW53aW5kZXIsIHRocmVhZF9pbmZvKTsKKyAgICBpZiAodGlkICE9IHRhcmdldF90aWQpIHsKKyAgICAgIGR1bXBfdGhyZWFkKCZyZXN1bHQsIHVud2luZGVyLCB0aHJlYWRfaW5mbywgLyogbWVtb3J5X2R1bXAgKi8gZmFsc2UsIGd1ZXN0X3Vud2luZGVyKTsKICAgICB9CiAgIH0KIAotICBkdW1wX3Byb2JhYmxlX2NhdXNlKCZyZXN1bHQsIHVud2luZGVyLCBwcm9jZXNzX2luZm8sIG1haW5fdGhyZWFkKTsKKyAgZHVtcF9wcm9iYWJsZV9jYXVzZSgmcmVzdWx0LCB1bndpbmRlciwgcHJvY2Vzc19pbmZvLCB0YXJnZXRfdGhyZWFkLCB0aHJlYWRzKTsKIAogICBkdW1wX21hcHBpbmdzKCZyZXN1bHQsIHVud2luZGVyLT5HZXRNYXBzKCksIHVud2luZGVyLT5HZXRQcm9jZXNzTWVtb3J5KCkpOwogCiAgIC8vIE9ubHkgZHVtcCBsb2dzIG9uIGRlYnVnZ2FibGUgZGV2aWNlcy4KICAgaWYgKGFuZHJvaWQ6OmJhc2U6OkdldEJvb2xQcm9wZXJ0eSgicm8uZGVidWdnYWJsZSIsIGZhbHNlKSkgewogICAgIC8vIEdldCB0aGUgdGhyZWFkIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIG1haW4gcGlkIG9mIHRoZSBwcm9jZXNzLgotICAgIGNvbnN0IFRocmVhZEluZm8mIHRocmVhZCA9IHRocmVhZHMuYXQobWFpbl90aHJlYWQucGlkKTsKKyAgICBjb25zdCBUaHJlYWRJbmZvJiB0aHJlYWQgPSB0aHJlYWRzLmF0KHRhcmdldF90aHJlYWQucGlkKTsKIAogICAgIC8vIERvIG5vdCBhdHRlbXB0IHRvIGR1bXAgbG9ncyBvZiB0aGUgbG9nZCBwcm9jZXNzIGJlY2F1c2UgdGhlIGdhdGhlcmluZwogICAgIC8vIG9mIGxvZ3MgY2FuIGhhbmcgdW50aWwgYSB0aW1lb3V0IG9jY3Vycy4KICAgICBpZiAodGhyZWFkLnRocmVhZF9uYW1lICE9ICJsb2dkIikgewotICAgICAgZHVtcF9sb2djYXQoJnJlc3VsdCwgbWFpbl90aHJlYWQucGlkKTsKKyAgICAgIGR1bXBfbG9nY2F0KCZyZXN1bHQsIHRhcmdldF90aHJlYWQucGlkKTsKICAgICB9CiAgIH0KIApkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL2xpYmRlYnVnZ2VyZC90b21ic3RvbmVfcHJvdG9fdG9fdGV4dC5jcHAgYi9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL3RvbWJzdG9uZV9wcm90b190b190ZXh0LmNwcAppbmRleCA4ZTZhYmRmLi5mZWRhZmMwIDEwMDY0NAotLS0gYS9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL3RvbWJzdG9uZV9wcm90b190b190ZXh0LmNwcAorKysgYi9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL3RvbWJzdG9uZV9wcm90b190b190ZXh0LmNwcApAQCAtMTQsMTEgKzE0LDE0IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8bGliZGVidWdnZXJkL3RvbWJzdG9uZS5oPgorI2luY2x1ZGUgPGxpYmRlYnVnZ2VyZC90b21ic3RvbmVfcHJvdG9fdG9fdGV4dC5oPgorI2luY2x1ZGUgPGxpYmRlYnVnZ2VyZC91dGlsaXR5X2hvc3QuaD4KIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKKyNpbmNsdWRlIDxjaGFyY29udj4KICNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGxpbWl0cz4KICNpbmNsdWRlIDxzZXQ+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CkBAIC0yOCw4ICszMSw2IEBACiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgotI2luY2x1ZGUgPGFzeW5jX3NhZmUvbG9nLmg+Ci0jaW5jbHVkZSA8YmlvbmljL21hY3Jvcy5oPgogCiAjaW5jbHVkZSAidG9tYnN0b25lLnBiLmgiCiAKQEAgLTQwLDkgKzQxLDI0IEBACiAjZGVmaW5lIENCTCguLi4pIENCKHRydWUsIF9fVkFfQVJHU19fKQogI2RlZmluZSBDQlMoLi4uKSBDQihmYWxzZSwgX19WQV9BUkdTX18pCiB1c2luZyBDYWxsYmFja1R5cGUgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjpzdHJpbmcmIGxpbmUsIGJvb2wgc2hvdWxkX2xvZyk+OwordXNpbmcgU3ltYm9saXplQ2FsbGJhY2tUeXBlID0gc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IEJhY2t0cmFjZUZyYW1lJiBmcmFtZSk+OwogCi1zdGF0aWMgY29uc3QgY2hhciogYWJpX3N0cmluZyhjb25zdCBUb21ic3RvbmUmIHRvbWJzdG9uZSkgewotICBzd2l0Y2ggKHRvbWJzdG9uZS5hcmNoKCkpIHsKKyNkZWZpbmUgREVTQ1JJQkVfRkxBRyhmbGFnKSBcCisgIGlmICh2YWx1ZSAmIGZsYWcpIHsgICAgICAgXAorICAgIGRlc2MgKz0gIiwgIjsgICAgICAgICAgIFwKKyAgICBkZXNjICs9ICNmbGFnOyAgICAgICAgICBcCisgICAgdmFsdWUgJj0gfmZsYWc7ICAgICAgICAgXAorICB9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBkZXNjcmliZV9lbmQobG9uZyB2YWx1ZSwgc3RkOjpzdHJpbmcmIGRlc2MpIHsKKyAgaWYgKHZhbHVlKSB7CisgICAgZGVzYyArPSBTdHJpbmdQcmludGYoIiwgdW5rbm93biAweCVseCIsIHZhbHVlKTsKKyAgfQorICByZXR1cm4gZGVzYy5lbXB0eSgpID8gIiIgOiAiICgiICsgZGVzYy5zdWJzdHIoMikgKyAiKSI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBhYmlfc3RyaW5nKGNvbnN0IEFyY2hpdGVjdHVyZSYgYXJjaCkgeworICBzd2l0Y2ggKGFyY2gpIHsKICAgICBjYXNlIEFyY2hpdGVjdHVyZTo6QVJNMzI6CiAgICAgICByZXR1cm4gImFybSI7CiAgICAgY2FzZSBBcmNoaXRlY3R1cmU6OkFSTTY0OgpAQCAtNzUsMTIgKzkxLDIxIEBACiAgIH0KIH0KIAorc3RhdGljIHVpbnQ2NF90IHVudGFnX2FkZHJlc3MoQXJjaGl0ZWN0dXJlIGFyY2gsIHVpbnQ2NF90IGFkZHIpIHsKKyAgaWYgKGFyY2ggPT0gQXJjaGl0ZWN0dXJlOjpBUk02NCkgeworICAgIHJldHVybiBhZGRyICYgKCgxVUxMIDw8IDU2KSAtIDEpOworICB9CisgIHJldHVybiBhZGRyOworfQorCiBzdGF0aWMgdm9pZCBwcmludF90aHJlYWRfaGVhZGVyKENhbGxiYWNrVHlwZSBjYWxsYmFjaywgY29uc3QgVG9tYnN0b25lJiB0b21ic3RvbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmVhZCYgdGhyZWFkLCBib29sIHNob3VsZF9sb2cpIHsKICAgY29uc3QgY2hhciogcHJvY2Vzc19uYW1lID0gIjx1bmtub3duPiI7CiAgIGlmICghdG9tYnN0b25lLmNvbW1hbmRfbGluZSgpLmVtcHR5KCkpIHsKICAgICBwcm9jZXNzX25hbWUgPSB0b21ic3RvbmUuY29tbWFuZF9saW5lKClbMF0uY19zdHIoKTsKICAgICBDQihzaG91bGRfbG9nLCAiQ21kbGluZTogJXMiLCBhbmRyb2lkOjpiYXNlOjpKb2luKHRvbWJzdG9uZS5jb21tYW5kX2xpbmUoKSwgIiAiKS5jX3N0cigpKTsKKyAgfSBlbHNlIHsKKyAgICBDQihzaG91bGRfbG9nLCAiQ21kbGluZTogPHVua25vd24+Iik7CiAgIH0KICAgQ0Ioc2hvdWxkX2xvZywgInBpZDogJWQsIHRpZDogJWQsIG5hbWU6ICVzICA+Pj4gJXMgPDw8IiwgdG9tYnN0b25lLnBpZCgpLCB0aHJlYWQuaWQoKSwKICAgICAgdGhyZWFkLm5hbWUoKS5jX3N0cigpLCBwcm9jZXNzX25hbWUpOwpAQCAtMTM2LDcgKzE2MSw4IEBACiAgICAgICBicmVhazsKIAogICAgIGRlZmF1bHQ6Ci0gICAgICBhc3luY19zYWZlX2ZhdGFsKCJ1bmtub3duIGFyY2hpdGVjdHVyZSIpOworICAgICAgQ0JMKCJVbmtub3duIGFyY2hpdGVjdHVyZSAlZCBwcmludGluZyB0aHJlYWQgcmVnaXN0ZXJzIiwgdG9tYnN0b25lLmFyY2goKSk7CisgICAgICByZXR1cm47CiAgIH0KIAogICBmb3IgKGNvbnN0IGF1dG8mIHJlZyA6IHRocmVhZC5yZWdpc3RlcnMoKSkgewpAQCAtMTU5LDcgKzE4NSw4IEBACiAgIHByaW50X3JlZ2lzdGVyX3JvdyhjYWxsYmFjaywgd29yZF9zaXplLCBzcGVjaWFsX3Jvdywgc2hvdWxkX2xvZyk7CiB9CiAKLXN0YXRpYyB2b2lkIHByaW50X2JhY2t0cmFjZShDYWxsYmFja1R5cGUgY2FsbGJhY2ssIGNvbnN0IFRvbWJzdG9uZSYgdG9tYnN0b25lLAorc3RhdGljIHZvaWQgcHJpbnRfYmFja3RyYWNlKENhbGxiYWNrVHlwZSBjYWxsYmFjaywgU3ltYm9saXplQ2FsbGJhY2tUeXBlIHN5bWJvbGl6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUb21ic3RvbmUmIHRvbWJzdG9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPEJhY2t0cmFjZUZyYW1lPiYgYmFja3RyYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2hvdWxkX2xvZykgewogICBpbnQgaW5kZXggPSAwOwpAQCAtMTg0LDExICsyMTEsMTQgQEAKICAgICB9CiAgICAgbGluZSArPSBmdW5jdGlvbiArIGJ1aWxkX2lkOwogICAgIENCKHNob3VsZF9sb2csICIlcyIsIGxpbmUuY19zdHIoKSk7CisKKyAgICBzeW1ib2xpemUoZnJhbWUpOwogICB9CiB9CiAKLXN0YXRpYyB2b2lkIHByaW50X3RocmVhZF9iYWNrdHJhY2UoQ2FsbGJhY2tUeXBlIGNhbGxiYWNrLCBjb25zdCBUb21ic3RvbmUmIHRvbWJzdG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyZWFkJiB0aHJlYWQsIGJvb2wgc2hvdWxkX2xvZykgeworc3RhdGljIHZvaWQgcHJpbnRfdGhyZWFkX2JhY2t0cmFjZShDYWxsYmFja1R5cGUgY2FsbGJhY2ssIFN5bWJvbGl6ZUNhbGxiYWNrVHlwZSBzeW1ib2xpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRvbWJzdG9uZSYgdG9tYnN0b25lLCBjb25zdCBUaHJlYWQmIHRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzaG91bGRfbG9nKSB7CiAgIENCUygiIik7CiAgIENCKHNob3VsZF9sb2csICIlZCB0b3RhbCBmcmFtZXMiLCB0aHJlYWQuY3VycmVudF9iYWNrdHJhY2UoKS5zaXplKCkpOwogICBDQihzaG91bGRfbG9nLCAiYmFja3RyYWNlOiIpOwpAQCAtMTk2LDcgKzIyNiw3IEBACiAgICAgQ0Ioc2hvdWxkX2xvZywgIiAgTk9URTogJXMiLAogICAgICAgIGFuZHJvaWQ6OmJhc2U6OkpvaW4odGhyZWFkLmJhY2t0cmFjZV9ub3RlKCksICJcbiAgTk9URTogIikuY19zdHIoKSk7CiAgIH0KLSAgcHJpbnRfYmFja3RyYWNlKGNhbGxiYWNrLCB0b21ic3RvbmUsIHRocmVhZC5jdXJyZW50X2JhY2t0cmFjZSgpLCBzaG91bGRfbG9nKTsKKyAgcHJpbnRfYmFja3RyYWNlKGNhbGxiYWNrLCBzeW1ib2xpemUsIHRvbWJzdG9uZSwgdGhyZWFkLmN1cnJlbnRfYmFja3RyYWNlKCksIHNob3VsZF9sb2cpOwogfQogCiBzdGF0aWMgdm9pZCBwcmludF90aHJlYWRfbWVtb3J5X2R1bXAoQ2FsbGJhY2tUeXBlIGNhbGxiYWNrLCBjb25zdCBUb21ic3RvbmUmIHRvbWJzdG9uZSwKQEAgLTI0OSwxMCArMjc5LDExIEBACiAgIH0KIH0KIAotc3RhdGljIHZvaWQgcHJpbnRfdGhyZWFkKENhbGxiYWNrVHlwZSBjYWxsYmFjaywgY29uc3QgVG9tYnN0b25lJiB0b21ic3RvbmUsIGNvbnN0IFRocmVhZCYgdGhyZWFkKSB7CitzdGF0aWMgdm9pZCBwcmludF90aHJlYWQoQ2FsbGJhY2tUeXBlIGNhbGxiYWNrLCBTeW1ib2xpemVDYWxsYmFja1R5cGUgc3ltYm9saXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRvbWJzdG9uZSYgdG9tYnN0b25lLCBjb25zdCBUaHJlYWQmIHRocmVhZCkgewogICBwcmludF90aHJlYWRfaGVhZGVyKGNhbGxiYWNrLCB0b21ic3RvbmUsIHRocmVhZCwgZmFsc2UpOwogICBwcmludF90aHJlYWRfcmVnaXN0ZXJzKGNhbGxiYWNrLCB0b21ic3RvbmUsIHRocmVhZCwgZmFsc2UpOwotICBwcmludF90aHJlYWRfYmFja3RyYWNlKGNhbGxiYWNrLCB0b21ic3RvbmUsIHRocmVhZCwgZmFsc2UpOworICBwcmludF90aHJlYWRfYmFja3RyYWNlKGNhbGxiYWNrLCBzeW1ib2xpemUsIHRvbWJzdG9uZSwgdGhyZWFkLCBmYWxzZSk7CiAgIHByaW50X3RocmVhZF9tZW1vcnlfZHVtcChjYWxsYmFjaywgdG9tYnN0b25lLCB0aHJlYWQpOwogfQogCkBAIC0yODAsNyArMzExLDggQEAKIAogICBzaXplX3QgdGFnX2luZGV4ID0gMDsKICAgc2l6ZV90IG51bV90YWdzID0gdGFncy5sZW5ndGgoKTsKLSAgdWludHB0cl90IGZhdWx0X2dyYW51bGUgPSB1bnRhZ19hZGRyZXNzKHNpZ25hbC5mYXVsdF9hZGRyZXNzKCkpICYgfihrVGFnR3JhbnVsZVNpemUgLSAxKTsKKyAgdWludHB0cl90IGZhdWx0X2dyYW51bGUgPQorICAgICAgdW50YWdfYWRkcmVzcyh0b21ic3RvbmUuYXJjaCgpLCBzaWduYWwuZmF1bHRfYWRkcmVzcygpKSAmIH4oa1RhZ0dyYW51bGVTaXplIC0gMSk7CiAgIGZvciAoc2l6ZV90IHJvdyA9IDA7IHRhZ19pbmRleCA8IG51bV90YWdzOyArK3JvdykgewogICAgIHVpbnRwdHJfdCByb3dfYWRkciA9CiAgICAgICAgIChtZW1vcnlfZHVtcC5iZWdpbl9hZGRyZXNzKCkgKyByb3cgKiBrTnVtVGFnQ29sdW1ucyAqIGtUYWdHcmFudWxlU2l6ZSkgJiBrUm93U3RhcnRNYXNrOwpAQCAtMzI4LDcgKzM2MCw3IEBACiAKICAgY29uc3QgU2lnbmFsJiBzaWduYWxfaW5mbyA9IHRvbWJzdG9uZS5zaWduYWxfaW5mbygpOwogICBib29sIGhhc19mYXVsdF9hZGRyZXNzID0gc2lnbmFsX2luZm8uaGFzX2ZhdWx0X2FkZHJlc3MoKTsKLSAgdWludDY0X3QgZmF1bHRfYWRkcmVzcyA9IHVudGFnX2FkZHJlc3Moc2lnbmFsX2luZm8uZmF1bHRfYWRkcmVzcygpKTsKKyAgdWludDY0X3QgZmF1bHRfYWRkcmVzcyA9IHVudGFnX2FkZHJlc3ModG9tYnN0b25lLmFyY2goKSwgc2lnbmFsX2luZm8uZmF1bHRfYWRkcmVzcygpKTsKICAgYm9vbCBwcmVhbWJsZV9wcmludGVkID0gZmFsc2U7CiAgIGJvb2wgcHJpbnRlZF9mYXVsdF9hZGRyZXNzX21hcmtlciA9IGZhbHNlOwogICBmb3IgKGNvbnN0IGF1dG8mIG1hcCA6IHRvbWJzdG9uZS5tZW1vcnlfbWFwcGluZ3MoKSkgewpAQCAtMzg2LDggKzQxOCwyOSBAQAogICB9CiB9CiAKLXN0YXRpYyB2b2lkIHByaW50X21haW5fdGhyZWFkKENhbGxiYWNrVHlwZSBjYWxsYmFjaywgY29uc3QgVG9tYnN0b25lJiB0b21ic3RvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJlYWQmIHRocmVhZCkgeworc3RhdGljIHN0ZDo6c3RyaW5nIG9jdF9lbmNvZGUoY29uc3Qgc3RkOjpzdHJpbmcmIGRhdGEpIHsKKyAgc3RkOjpzdHJpbmcgb2N0X2VuY29kZWQ7CisgIG9jdF9lbmNvZGVkLnJlc2VydmUoZGF0YS5zaXplKCkpOworCisgIC8vIE4uQi4gdGhlIHVuc2lnbmVkIGhlcmUgaXMgdmVyeSBpbXBvcnRhbnQsIG90aGVyd2lzZSBlLmcuIFwyNTUgd291bGQgcmVuZGVyIGFzCisgIC8vIFwtMTIzIChhbmQgb3ZlcmZsb3cgb3VyIGJ1ZmZlcikuCisgIGZvciAodW5zaWduZWQgY2hhciBjIDogZGF0YSkgeworICAgIGlmIChpc3ByaW50KGMpKSB7CisgICAgICBvY3RfZW5jb2RlZCArPSBjOworICAgIH0gZWxzZSB7CisgICAgICBzdGQ6OnN0cmluZyBvY3RfZGlnaXRzKCJcXFwwXDBcMCIsIDQpOworICAgICAgLy8gY2hhciBpcyBlbmNvZGFibGUgaW4gMyBvY3QgZGlnaXRzCisgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQgY2hhcj46Om1heCgpIDw9IDggKiA4ICogOCk7CisgICAgICBhdXRvIFtwdHIsIGVjXSA9IHN0ZDo6dG9fY2hhcnMob2N0X2RpZ2l0cy5kYXRhKCkgKyAxLCBvY3RfZGlnaXRzLmRhdGEoKSArIDQsIGMsIDgpOworICAgICAgb2N0X2RpZ2l0cy5yZXNpemUocHRyIC0gb2N0X2RpZ2l0cy5kYXRhKCkpOworICAgICAgb2N0X2VuY29kZWQgKz0gb2N0X2RpZ2l0czsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG9jdF9lbmNvZGVkOworfQorCitzdGF0aWMgdm9pZCBwcmludF9tYWluX3RocmVhZChDYWxsYmFja1R5cGUgY2FsbGJhY2ssIFN5bWJvbGl6ZUNhbGxiYWNrVHlwZSBzeW1ib2xpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUb21ic3RvbmUmIHRvbWJzdG9uZSwgY29uc3QgVGhyZWFkJiB0aHJlYWQpIHsKICAgcHJpbnRfdGhyZWFkX2hlYWRlcihjYWxsYmFjaywgdG9tYnN0b25lLCB0aHJlYWQsIHRydWUpOwogCiAgIGNvbnN0IFNpZ25hbCYgc2lnbmFsX2luZm8gPSB0b21ic3RvbmUuc2lnbmFsX2luZm8oKTsKQEAgLTQyOSwxMyArNDgyLDE5IEBACiAgICAgQ0JMKCJBYm9ydCBtZXNzYWdlOiAnJXMnIiwgdG9tYnN0b25lLmFib3J0X21lc3NhZ2UoKS5jX3N0cigpKTsKICAgfQogCisgIGZvciAoY29uc3QgYXV0byYgY3Jhc2hfZGV0YWlsIDogdG9tYnN0b25lLmNyYXNoX2RldGFpbHMoKSkgeworICAgIHN0ZDo6c3RyaW5nIG9jdF9lbmNvZGVkX25hbWUgPSBvY3RfZW5jb2RlKGNyYXNoX2RldGFpbC5uYW1lKCkpOworICAgIHN0ZDo6c3RyaW5nIG9jdF9lbmNvZGVkX2RhdGEgPSBvY3RfZW5jb2RlKGNyYXNoX2RldGFpbC5kYXRhKCkpOworICAgIENCTCgiRXh0cmEgY3Jhc2ggZGV0YWlsOiAlczogJyVzJyIsIG9jdF9lbmNvZGVkX25hbWUuY19zdHIoKSwgb2N0X2VuY29kZWRfZGF0YS5jX3N0cigpKTsKKyAgfQorCiAgIHByaW50X3RocmVhZF9yZWdpc3RlcnMoY2FsbGJhY2ssIHRvbWJzdG9uZSwgdGhyZWFkLCB0cnVlKTsKICAgaWYgKGlzX2FzeW5jX210ZV9jcmFzaCkgewogICAgIENCTCgiTm90ZTogVGhpcyBjcmFzaCBpcyBhIGRlbGF5ZWQgYXN5bmMgTVRFIGNyYXNoLiBNZW1vcnkgY29ycnVwdGlvbiBoYXMgb2NjdXJyZWQiKTsKICAgICBDQkwoIiAgICAgIGluIHRoaXMgcHJvY2Vzcy4gVGhlIHN0YWNrIHRyYWNlIGJlbG93IGlzIHRoZSBmaXJzdCBzeXN0ZW0gY2FsbCBvciBjb250ZXh0Iik7CiAgICAgQ0JMKCIgICAgICBzd2l0Y2ggdGhhdCB3YXMgZXhlY3V0ZWQgYWZ0ZXIgdGhlIG1lbW9yeSBjb3JydXB0aW9uIGhhcHBlbmVkLiIpOwogICB9Ci0gIHByaW50X3RocmVhZF9iYWNrdHJhY2UoY2FsbGJhY2ssIHRvbWJzdG9uZSwgdGhyZWFkLCB0cnVlKTsKKyAgcHJpbnRfdGhyZWFkX2JhY2t0cmFjZShjYWxsYmFjaywgc3ltYm9saXplLCB0b21ic3RvbmUsIHRocmVhZCwgdHJ1ZSk7CiAKICAgaWYgKHRvbWJzdG9uZS5jYXVzZXNfc2l6ZSgpID4gMSkgewogICAgIENCUygiIik7CkBAIC00NDMsNiArNTAyLDE5IEBACiAgICAgICAgICJvcmRlciBvZiBsaWtlbGlob29kLiIpOwogICB9CiAKKyAgaWYgKHRvbWJzdG9uZS5oYXNfc3RhY2tfaGlzdG9yeV9idWZmZXIoKSkgeworICAgIGZvciAoY29uc3QgU3RhY2tIaXN0b3J5QnVmZmVyRW50cnkmIHNoYmUgOiB0b21ic3RvbmUuc3RhY2tfaGlzdG9yeV9idWZmZXIoKS5lbnRyaWVzKCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIHN0YWNrX3JlY29yZF9zdHIgPSBTdHJpbmdQcmludGYoCisgICAgICAgICAgInN0YWNrX3JlY29yZCBmcDoweCUiIFBSSXg2NCAiIHRhZzoweCUiIFBSSXg2NCAiIHBjOiVzKzB4JSIgUFJJeDY0LCBzaGJlLmZwKCksIHNoYmUudGFnKCksCisgICAgICAgICAgc2hiZS5hZGRyKCkuZmlsZV9uYW1lKCkuY19zdHIoKSwgc2hiZS5hZGRyKCkucmVsX3BjKCkpOworICAgICAgaWYgKCFzaGJlLmFkZHIoKS5idWlsZF9pZCgpLmVtcHR5KCkpIHsKKyAgICAgICAgU3RyaW5nQXBwZW5kRigmc3RhY2tfcmVjb3JkX3N0ciwgIiAoQnVpbGRJZDogJXMpIiwgc2hiZS5hZGRyKCkuYnVpbGRfaWQoKS5jX3N0cigpKTsKKyAgICAgIH0KKworICAgICAgQ0JMKCIlcyIsIHN0YWNrX3JlY29yZF9zdHIuY19zdHIoKSk7CisgICAgfQorICB9CisKICAgZm9yIChjb25zdCBDYXVzZSYgY2F1c2UgOiB0b21ic3RvbmUuY2F1c2VzKCkpIHsKICAgICBpZiAodG9tYnN0b25lLmNhdXNlc19zaXplKCkgPiAxKSB7CiAgICAgICBDQlMoIiIpOwpAQCAtNDU1LDEzICs1MjcsMTMgQEAKICAgICAgIGlmIChoZWFwX29iamVjdC5kZWFsbG9jYXRpb25fYmFja3RyYWNlX3NpemUoKSAhPSAwKSB7CiAgICAgICAgIENCUygiIik7CiAgICAgICAgIENCTCgiZGVhbGxvY2F0ZWQgYnkgdGhyZWFkICUiIFBSSXU2NCAiOiIsIGhlYXBfb2JqZWN0LmRlYWxsb2NhdGlvbl90aWQoKSk7Ci0gICAgICAgIHByaW50X2JhY2t0cmFjZShjYWxsYmFjaywgdG9tYnN0b25lLCBoZWFwX29iamVjdC5kZWFsbG9jYXRpb25fYmFja3RyYWNlKCksIHRydWUpOworICAgICAgICBwcmludF9iYWNrdHJhY2UoY2FsbGJhY2ssIHN5bWJvbGl6ZSwgdG9tYnN0b25lLCBoZWFwX29iamVjdC5kZWFsbG9jYXRpb25fYmFja3RyYWNlKCksIHRydWUpOwogICAgICAgfQogCiAgICAgICBpZiAoaGVhcF9vYmplY3QuYWxsb2NhdGlvbl9iYWNrdHJhY2Vfc2l6ZSgpICE9IDApIHsKICAgICAgICAgQ0JTKCIiKTsKICAgICAgICAgQ0JMKCJhbGxvY2F0ZWQgYnkgdGhyZWFkICUiIFBSSXU2NCAiOiIsIGhlYXBfb2JqZWN0LmFsbG9jYXRpb25fdGlkKCkpOwotICAgICAgICBwcmludF9iYWNrdHJhY2UoY2FsbGJhY2ssIHRvbWJzdG9uZSwgaGVhcF9vYmplY3QuYWxsb2NhdGlvbl9iYWNrdHJhY2UoKSwgdHJ1ZSk7CisgICAgICAgIHByaW50X2JhY2t0cmFjZShjYWxsYmFjaywgc3ltYm9saXplLCB0b21ic3RvbmUsIGhlYXBfb2JqZWN0LmFsbG9jYXRpb25fYmFja3RyYWNlKCksIHRydWUpOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtNTEwLDE0ICs1ODIsNDAgQEAKICAgfQogfQogCi1ib29sIHRvbWJzdG9uZV9wcm90b190b190ZXh0KGNvbnN0IFRvbWJzdG9uZSYgdG9tYnN0b25lLCBDYWxsYmFja1R5cGUgY2FsbGJhY2spIHsKK3N0YXRpYyB2b2lkIHByaW50X2d1ZXN0X3RocmVhZChDYWxsYmFja1R5cGUgY2FsbGJhY2ssIFN5bWJvbGl6ZUNhbGxiYWNrVHlwZSBzeW1ib2xpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVG9tYnN0b25lJiB0b21ic3RvbmUsIGNvbnN0IFRocmVhZCYgZ3Vlc3RfdGhyZWFkLCBwaWRfdCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzaG91bGRfbG9nKSB7CisgIENCUygiLS0tIC0tLSAtLS0gLS0tIC0tLSAtLS0gLS0tIC0tLSAtLS0gLS0tIC0tLSAtLS0gLS0tIC0tLSAtLS0gLS0tIik7CisgIENCUygiR3Vlc3QgdGhyZWFkIGluZm9ybWF0aW9uIGZvciB0aWQ6ICVkIiwgdGlkKTsKKyAgcHJpbnRfdGhyZWFkX3JlZ2lzdGVycyhjYWxsYmFjaywgdG9tYnN0b25lLCBndWVzdF90aHJlYWQsIHNob3VsZF9sb2cpOworCisgIENCUygiIik7CisgIENCKHRydWUsICIlZCB0b3RhbCBmcmFtZXMiLCBndWVzdF90aHJlYWQuY3VycmVudF9iYWNrdHJhY2UoKS5zaXplKCkpOworICBDQih0cnVlLCAiYmFja3RyYWNlOiIpOworICBwcmludF9iYWNrdHJhY2UoY2FsbGJhY2ssIHN5bWJvbGl6ZSwgdG9tYnN0b25lLCBndWVzdF90aHJlYWQuY3VycmVudF9iYWNrdHJhY2UoKSwgc2hvdWxkX2xvZyk7CisKKyAgcHJpbnRfdGhyZWFkX21lbW9yeV9kdW1wKGNhbGxiYWNrLCB0b21ic3RvbmUsIGd1ZXN0X3RocmVhZCk7Cit9CisKK2Jvb2wgdG9tYnN0b25lX3Byb3RvX3RvX3RleHQoY29uc3QgVG9tYnN0b25lJiB0b21ic3RvbmUsIENhbGxiYWNrVHlwZSBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ltYm9saXplQ2FsbGJhY2tUeXBlIHN5bWJvbGl6ZSkgewogICBDQkwoIioqKiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKiAqKiogKioqICoqKiIpOwogICBDQkwoIkJ1aWxkIGZpbmdlcnByaW50OiAnJXMnIiwgdG9tYnN0b25lLmJ1aWxkX2ZpbmdlcnByaW50KCkuY19zdHIoKSk7CiAgIENCTCgiUmV2aXNpb246ICclcyciLCB0b21ic3RvbmUucmV2aXNpb24oKS5jX3N0cigpKTsKLSAgQ0JMKCJBQkk6ICclcyciLCBhYmlfc3RyaW5nKHRvbWJzdG9uZSkpOworICBDQkwoIkFCSTogJyVzJyIsIGFiaV9zdHJpbmcodG9tYnN0b25lLmFyY2goKSkpOworICBpZiAodG9tYnN0b25lLmd1ZXN0X2FyY2goKSAhPSBBcmNoaXRlY3R1cmU6Ok5PTkUpIHsKKyAgICBDQkwoIkd1ZXN0IGFyY2hpdGVjdHVyZTogJyVzJyIsIGFiaV9zdHJpbmcodG9tYnN0b25lLmd1ZXN0X2FyY2goKSkpOworICB9CiAgIENCTCgiVGltZXN0YW1wOiAlcyIsIHRvbWJzdG9uZS50aW1lc3RhbXAoKS5jX3N0cigpKTsKICAgQ0JMKCJQcm9jZXNzIHVwdGltZTogJWRzIiwgdG9tYnN0b25lLnByb2Nlc3NfdXB0aW1lKCkpOwogCisgIC8vIG9ubHkgcHJpbnQgdGhpcyBpbmZvIGlmIHRoZSBwYWdlIHNpemUgaXMgbm90IDRrIG9yIGhhcyBiZWVuIGluIDE2ayBtb2RlCisgIGlmICh0b21ic3RvbmUucGFnZV9zaXplKCkgIT0gNDA5NikgeworICAgIENCTCgiUGFnZSBzaXplOiAlZCBieXRlcyIsIHRvbWJzdG9uZS5wYWdlX3NpemUoKSk7CisgIH0gZWxzZSBpZiAodG9tYnN0b25lLmhhc19iZWVuXzE2a2JfbW9kZSgpKSB7CisgICAgQ0JMKCJIYXMgYmVlbiBpbiAxNmtiIG1vZGU6IHllcyIpOworICB9CisKICAgLy8gUHJvY2VzcyBoZWFkZXIKICAgY29uc3QgYXV0byYgdGhyZWFkcyA9IHRvbWJzdG9uZS50aHJlYWRzKCk7CiAgIGF1dG8gbWFpbl90aHJlYWRfaXQgPSB0aHJlYWRzLmZpbmQodG9tYnN0b25lLnRpZCgpKTsKQEAgLTUyOCwxMCArNjI2LDE3IEBACiAKICAgY29uc3QgYXV0byYgbWFpbl90aHJlYWQgPSBtYWluX3RocmVhZF9pdC0+c2Vjb25kOwogCi0gIHByaW50X21haW5fdGhyZWFkKGNhbGxiYWNrLCB0b21ic3RvbmUsIG1haW5fdGhyZWFkKTsKKyAgcHJpbnRfbWFpbl90aHJlYWQoY2FsbGJhY2ssIHN5bWJvbGl6ZSwgdG9tYnN0b25lLCBtYWluX3RocmVhZCk7CiAKICAgcHJpbnRfbG9ncyhjYWxsYmFjaywgdG9tYnN0b25lLCA1MCk7CiAKKyAgY29uc3QgYXV0byYgZ3Vlc3RfdGhyZWFkcyA9IHRvbWJzdG9uZS5ndWVzdF90aHJlYWRzKCk7CisgIGF1dG8gbWFpbl9ndWVzdF90aHJlYWRfaXQgPSBndWVzdF90aHJlYWRzLmZpbmQodG9tYnN0b25lLnRpZCgpKTsKKyAgaWYgKG1haW5fZ3Vlc3RfdGhyZWFkX2l0ICE9IHRocmVhZHMuZW5kKCkpIHsKKyAgICBwcmludF9ndWVzdF90aHJlYWQoY2FsbGJhY2ssIHN5bWJvbGl6ZSwgdG9tYnN0b25lLCBtYWluX2d1ZXN0X3RocmVhZF9pdC0+c2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICB0b21ic3RvbmUudGlkKCksIHRydWUpOworICB9CisKICAgLy8gcHJvdG9idWYncyBtYXAgaXMgdW5vcmRlcmVkLCBzbyBzb3J0IHRoZSBrZXlzIGZpcnN0LgogICBzdGQ6OnNldDxpbnQ+IHRocmVhZF9pZHM7CiAgIGZvciAoY29uc3QgYXV0byYgW3RpZCwgX10gOiB0aHJlYWRzKSB7CkBAIC01NDIsNyArNjQ3LDExIEBACiAKICAgZm9yIChjb25zdCBhdXRvJiB0aWQgOiB0aHJlYWRfaWRzKSB7CiAgICAgQ0JTKCItLS0gLS0tIC0tLSAtLS0gLS0tIC0tLSAtLS0gLS0tIC0tLSAtLS0gLS0tIC0tLSAtLS0gLS0tIC0tLSAtLS0iKTsKLSAgICBwcmludF90aHJlYWQoY2FsbGJhY2ssIHRvbWJzdG9uZSwgdGhyZWFkcy5maW5kKHRpZCktPnNlY29uZCk7CisgICAgcHJpbnRfdGhyZWFkKGNhbGxiYWNrLCBzeW1ib2xpemUsIHRvbWJzdG9uZSwgdGhyZWFkcy5maW5kKHRpZCktPnNlY29uZCk7CisgICAgYXV0byBndWVzdF90aHJlYWRfaXQgPSBndWVzdF90aHJlYWRzLmZpbmQodGlkKTsKKyAgICBpZiAoZ3Vlc3RfdGhyZWFkX2l0ICE9IGd1ZXN0X3RocmVhZHMuZW5kKCkpIHsKKyAgICAgIHByaW50X2d1ZXN0X3RocmVhZChjYWxsYmFjaywgc3ltYm9saXplLCB0b21ic3RvbmUsIGd1ZXN0X3RocmVhZF9pdC0+c2Vjb25kLCB0aWQsIGZhbHNlKTsKKyAgICB9CiAgIH0KIAogICBpZiAodG9tYnN0b25lLm9wZW5fZmRzKCkuc2l6ZSgpID4gMCkgewpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL2xpYmRlYnVnZ2VyZC91dGlsaXR5LmNwcCBiL2RlYnVnZ2VyZC9saWJkZWJ1Z2dlcmQvdXRpbGl0eS5jcHAKaW5kZXggZDcxZmM2Yy4uYjVhOTNiNyAxMDA2NDQKLS0tIGEvZGVidWdnZXJkL2xpYmRlYnVnZ2VyZC91dGlsaXR5LmNwcAorKysgYi9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL3V0aWxpdHkuY3BwCkBAIC0xNyw2ICsxNyw3IEBACiAjZGVmaW5lIExPR19UQUcgIkRFQlVHIgogCiAjaW5jbHVkZSAibGliZGVidWdnZXJkL3V0aWxpdHkuaCIKKyNpbmNsdWRlICJsaWJkZWJ1Z2dlcmQvdXRpbGl0eV9ob3N0LmgiCiAKICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHNpZ25hbC5oPgpAQCAtMzgyLDggKzM4MywxMCBAQAogICAgICAgICAgIHJldHVybiAiU0VHVl9NVEVBRVJSIjsKICAgICAgICAgY2FzZSBTRUdWX01URVNFUlI6CiAgICAgICAgICAgcmV0dXJuICJTRUdWX01URVNFUlIiOworICAgICAgICBjYXNlIFNFR1ZfQ1BFUlI6CisgICAgICAgICAgcmV0dXJuICJTRUdWX0NQRVJSIjsKICAgICAgIH0KLSAgICAgIHN0YXRpY19hc3NlcnQoTlNJR1NFR1YgPT0gU0VHVl9NVEVTRVJSLCAibWlzc2luZyBTRUdWXyogc2lfY29kZSIpOworICAgICAgc3RhdGljX2Fzc2VydChOU0lHU0VHViA9PSBTRUdWX0NQRVJSLCAibWlzc2luZyBTRUdWXyogc2lfY29kZSIpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBTSUdTWVM6CiAgICAgICBzd2l0Y2ggKHNpLT5zaV9jb2RlKSB7CkBAIC00NDMsNDIgKzQ0Niw2IEBACiAgIHJldHVybiAiPyI7CiB9CiAKLSNkZWZpbmUgREVTQ1JJQkVfRkxBRyhmbGFnKSBcCi0gIGlmICh2YWx1ZSAmIGZsYWcpIHsgICAgICAgXAotICAgIGRlc2MgKz0gIiwgIjsgICAgICAgICAgIFwKLSAgICBkZXNjICs9ICNmbGFnOyAgICAgICAgICBcCi0gICAgdmFsdWUgJj0gfmZsYWc7ICAgICAgICAgXAotICB9Ci0KLXN0YXRpYyBzdGQ6OnN0cmluZyBkZXNjcmliZV9lbmQobG9uZyB2YWx1ZSwgc3RkOjpzdHJpbmcmIGRlc2MpIHsKLSAgaWYgKHZhbHVlKSB7Ci0gICAgZGVzYyArPSBTdHJpbmdQcmludGYoIiwgdW5rbm93biAweCVseCIsIHZhbHVlKTsKLSAgfQotICByZXR1cm4gZGVzYy5lbXB0eSgpID8gIiIgOiAiICgiICsgZGVzYy5zdWJzdHIoMikgKyAiKSI7Ci19Ci0KLXN0ZDo6c3RyaW5nIGRlc2NyaWJlX3RhZ2dlZF9hZGRyX2N0cmwobG9uZyB2YWx1ZSkgewotICBzdGQ6OnN0cmluZyBkZXNjOwotICBERVNDUklCRV9GTEFHKFBSX1RBR0dFRF9BRERSX0VOQUJMRSk7Ci0gIERFU0NSSUJFX0ZMQUcoUFJfTVRFX1RDRl9TWU5DKTsKLSAgREVTQ1JJQkVfRkxBRyhQUl9NVEVfVENGX0FTWU5DKTsKLSAgaWYgKHZhbHVlICYgUFJfTVRFX1RBR19NQVNLKSB7Ci0gICAgZGVzYyArPSBTdHJpbmdQcmludGYoIiwgbWFzayAweCUwNGx4IiwgKHZhbHVlICYgUFJfTVRFX1RBR19NQVNLKSA+PiBQUl9NVEVfVEFHX1NISUZUKTsKLSAgICB2YWx1ZSAmPSB+UFJfTVRFX1RBR19NQVNLOwotICB9Ci0gIHJldHVybiBkZXNjcmliZV9lbmQodmFsdWUsIGRlc2MpOwotfQotCi1zdGQ6OnN0cmluZyBkZXNjcmliZV9wYWNfZW5hYmxlZF9rZXlzKGxvbmcgdmFsdWUpIHsKLSAgc3RkOjpzdHJpbmcgZGVzYzsKLSAgREVTQ1JJQkVfRkxBRyhQUl9QQUNfQVBJQUtFWSk7Ci0gIERFU0NSSUJFX0ZMQUcoUFJfUEFDX0FQSUJLRVkpOwotICBERVNDUklCRV9GTEFHKFBSX1BBQ19BUERBS0VZKTsKLSAgREVTQ1JJQkVfRkxBRyhQUl9QQUNfQVBEQktFWSk7Ci0gIERFU0NSSUJFX0ZMQUcoUFJfUEFDX0FQR0FLRVkpOwotICByZXR1cm4gZGVzY3JpYmVfZW5kKHZhbHVlLCBkZXNjKTsKLX0KLQogdm9pZCBsb2dfYmFja3RyYWNlKGxvZ190KiBsb2csIHVud2luZHN0YWNrOjpBbmRyb2lkVW53aW5kZXIqIHVud2luZGVyLAogICAgICAgICAgICAgICAgICAgIHVud2luZHN0YWNrOjpBbmRyb2lkVW53aW5kZXJEYXRhJiBkYXRhLCBjb25zdCBjaGFyKiBwcmVmaXgpIHsKICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHVucmVhZGFibGVfZWxmX2ZpbGVzOwpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL2xpYmRlYnVnZ2VyZC91dGlsaXR5X2hvc3QuY3BwIGIvZGVidWdnZXJkL2xpYmRlYnVnZ2VyZC91dGlsaXR5X2hvc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYTU2MGMKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJ1Z2dlcmQvbGliZGVidWdnZXJkL3V0aWxpdHlfaG9zdC5jcHAKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJsaWJkZWJ1Z2dlcmQvdXRpbGl0eV9ob3N0LmgiCisKKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOworCisjaWZuZGVmIFBSX01URV9UQUdfU0hJRlQKKyNkZWZpbmUgUFJfTVRFX1RBR19TSElGVCAzCisjZW5kaWYKKworI2lmbmRlZiBQUl9NVEVfVEFHX01BU0sKKyNkZWZpbmUgUFJfTVRFX1RBR19NQVNLICgweGZmZmZVTCA8PCBQUl9NVEVfVEFHX1NISUZUKQorI2VuZGlmCisKKyNpZm5kZWYgUFJfTVRFX1RDRl9BU1lOQworI2RlZmluZSBQUl9NVEVfVENGX0FTWU5DICgxVUwgPDwgMikKKyNlbmRpZgorCisjaWZuZGVmIFBSX01URV9UQ0ZfU1lOQworI2RlZmluZSBQUl9NVEVfVENGX1NZTkMgKDFVTCA8PCAxKQorI2VuZGlmCisKKyNpZm5kZWYgUFJfUEFDX0FQSUFLRVkKKyNkZWZpbmUgUFJfUEFDX0FQSUFLRVkgKDFVTCA8PCAwKQorI2VuZGlmCisKKyNpZm5kZWYgUFJfUEFDX0FQSUJLRVkKKyNkZWZpbmUgUFJfUEFDX0FQSUJLRVkgKDFVTCA8PCAxKQorI2VuZGlmCisKKyNpZm5kZWYgUFJfUEFDX0FQREFLRVkKKyNkZWZpbmUgUFJfUEFDX0FQREFLRVkgKDFVTCA8PCAyKQorI2VuZGlmCisKKyNpZm5kZWYgUFJfUEFDX0FQREJLRVkKKyNkZWZpbmUgUFJfUEFDX0FQREJLRVkgKDFVTCA8PCAzKQorI2VuZGlmCisKKyNpZm5kZWYgUFJfUEFDX0FQR0FLRVkKKyNkZWZpbmUgUFJfUEFDX0FQR0FLRVkgKDFVTCA8PCA0KQorI2VuZGlmCisKKyNpZm5kZWYgUFJfVEFHR0VEX0FERFJfRU5BQkxFCisjZGVmaW5lIFBSX1RBR0dFRF9BRERSX0VOQUJMRSAoMVVMIDw8IDApCisjZW5kaWYKKworI2RlZmluZSBERVNDUklCRV9GTEFHKGZsYWcpIFwKKyAgaWYgKHZhbHVlICYgZmxhZykgeyAgICAgICBcCisgICAgZGVzYyArPSAiLCAiOyAgICAgICAgICAgXAorICAgIGRlc2MgKz0gI2ZsYWc7ICAgICAgICAgIFwKKyAgICB2YWx1ZSAmPSB+ZmxhZzsgICAgICAgICBcCisgIH0KKworc3RhdGljIHN0ZDo6c3RyaW5nIGRlc2NyaWJlX2VuZChsb25nIHZhbHVlLCBzdGQ6OnN0cmluZyYgZGVzYykgeworICBpZiAodmFsdWUpIHsKKyAgICBkZXNjICs9IFN0cmluZ1ByaW50ZigiLCB1bmtub3duIDB4JWx4IiwgdmFsdWUpOworICB9CisgIHJldHVybiBkZXNjLmVtcHR5KCkgPyAiIiA6ICIgKCIgKyBkZXNjLnN1YnN0cigyKSArICIpIjsKK30KKworc3RkOjpzdHJpbmcgZGVzY3JpYmVfdGFnZ2VkX2FkZHJfY3RybChsb25nIHZhbHVlKSB7CisgIHN0ZDo6c3RyaW5nIGRlc2M7CisgIERFU0NSSUJFX0ZMQUcoUFJfVEFHR0VEX0FERFJfRU5BQkxFKTsKKyAgREVTQ1JJQkVfRkxBRyhQUl9NVEVfVENGX1NZTkMpOworICBERVNDUklCRV9GTEFHKFBSX01URV9UQ0ZfQVNZTkMpOworICBpZiAodmFsdWUgJiBQUl9NVEVfVEFHX01BU0spIHsKKyAgICBkZXNjICs9IFN0cmluZ1ByaW50ZigiLCBtYXNrIDB4JTA0bHgiLCAodmFsdWUgJiBQUl9NVEVfVEFHX01BU0spID4+IFBSX01URV9UQUdfU0hJRlQpOworICAgIHZhbHVlICY9IH5QUl9NVEVfVEFHX01BU0s7CisgIH0KKyAgcmV0dXJuIGRlc2NyaWJlX2VuZCh2YWx1ZSwgZGVzYyk7Cit9CisKK3N0ZDo6c3RyaW5nIGRlc2NyaWJlX3BhY19lbmFibGVkX2tleXMobG9uZyB2YWx1ZSkgeworICBzdGQ6OnN0cmluZyBkZXNjOworICBERVNDUklCRV9GTEFHKFBSX1BBQ19BUElBS0VZKTsKKyAgREVTQ1JJQkVfRkxBRyhQUl9QQUNfQVBJQktFWSk7CisgIERFU0NSSUJFX0ZMQUcoUFJfUEFDX0FQREFLRVkpOworICBERVNDUklCRV9GTEFHKFBSX1BBQ19BUERCS0VZKTsKKyAgREVTQ1JJQkVfRkxBRyhQUl9QQUNfQVBHQUtFWSk7CisgIHJldHVybiBkZXNjcmliZV9lbmQodmFsdWUsIGRlc2MpOworfQpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL3BidG9tYnN0b25lLmNwcCBiL2RlYnVnZ2VyZC9wYnRvbWJzdG9uZS5jcHAKaW5kZXggNzUyN2UzMS4uMDkwMmIzOCAxMDA2NDQKLS0tIGEvZGVidWdnZXJkL3BidG9tYnN0b25lLmNwcAorKysgYi9kZWJ1Z2dlcmQvcGJ0b21ic3RvbmUuY3BwCkBAIC0xNiwzMiArMTYsNTUgQEAKIAogI2luY2x1ZGUgPGVyci5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+Ci0jaW5jbHVkZSA8bGliZGVidWdnZXJkL3RvbWJzdG9uZS5oPgorI2luY2x1ZGUgPGxpYmRlYnVnZ2VyZC90b21ic3RvbmVfcHJvdG9fdG9fdGV4dC5oPgogCiAjaW5jbHVkZSAidG9tYnN0b25lLnBiLmgiCisjaW5jbHVkZSAidG9tYnN0b25lX3N5bWJvbGl6ZS5oIgogCiB1c2luZyBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQ7CiAKIFtbbm9yZXR1cm5dXSB2b2lkIHVzYWdlKGJvb2wgZXJyb3IpIHsKLSAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogcGJ0b21ic3RvbmUgVE9NQlNUT05FLlBCXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogcGJ0b21ic3RvbmUgW09QVElPTl0gVE9NQlNUT05FLlBCXG4iKTsKICAgZnByaW50ZihzdGRlcnIsICJDb252ZXJ0IGEgcHJvdG9idWYgdG9tYnN0b25lIHRvIHRleHQuXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJBcmd1bWVudHM6XG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1oLCAtLWhlbHAgICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC0tZGVidWctZmlsZS1kaXJlY3RvcnkgUEFUSCAgc3BlY2lmeSB0aGUgcGF0aCB0byBhIHN5bWJvbHMgZGlyZWN0b3J5XG4iKTsKICAgZXhpdChlcnJvcik7CiB9CiAKLWludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyKiBhcmd2W10pIHsKLSAgaWYgKGFyZ2MgIT0gMikgeworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZGVidWdfZmlsZV9kaXJlY3RvcmllczsKKyAgc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7CisgICAgICB7ImRlYnVnLWZpbGUtZGlyZWN0b3J5IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIDB9LAorICAgICAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIDAsICdoJ30sCisgICAgICB7fSwKKyAgfTsKKyAgaW50IGM7CisgIHdoaWxlICgoYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJoIiwgbG9uZ19vcHRpb25zLCAwKSkgIT0gLTEpIHsKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgZGVidWdfZmlsZV9kaXJlY3Rvcmllcy5wdXNoX2JhY2sob3B0YXJnKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgJ2gnOgorICAgICAgICB1c2FnZShmYWxzZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChvcHRpbmQgIT0gYXJnYy0xKSB7CiAgICAgdXNhZ2UodHJ1ZSk7CiAgIH0KIAotICBpZiAoc3RyY21wKCItaCIsIGFyZ3ZbMV0pID09IDAgfHwgc3RyY21wKCItLWhlbHAiLCBhcmd2WzFdKSA9PSAwKSB7Ci0gICAgdXNhZ2UoZmFsc2UpOwotICB9Ci0KLSAgdW5pcXVlX2ZkIGZkKG9wZW4oYXJndlsxXSwgT19SRE9OTFkgfCBPX0NMT0VYRUMpKTsKKyAgdW5pcXVlX2ZkIGZkKG9wZW4oYXJndltvcHRpbmRdLCBPX1JET05MWSB8IE9fQ0xPRVhFQykpOwogICBpZiAoZmQgPT0gLTEpIHsKICAgICBlcnIoMSwgImZhaWxlZCB0byBvcGVuIHRvbWJzdG9uZSAnJXMnIiwgYXJndlsxXSk7CiAgIH0KQEAgLTUxLDggKzc0LDExIEBACiAgICAgZXJyKDEsICJmYWlsZWQgdG8gcGFyc2UgdG9tYnN0b25lIik7CiAgIH0KIAorICBTeW1ib2xpemVyIHN5bTsKKyAgc3ltLlN0YXJ0KGRlYnVnX2ZpbGVfZGlyZWN0b3JpZXMpOwogICBib29sIHJlc3VsdCA9IHRvbWJzdG9uZV9wcm90b190b190ZXh0KAotICAgICAgdG9tYnN0b25lLCBbXShjb25zdCBzdGQ6OnN0cmluZyYgbGluZSwgYm9vbCkgeyBwcmludGYoIiVzXG4iLCBsaW5lLmNfc3RyKCkpOyB9KTsKKyAgICAgIHRvbWJzdG9uZSwgW10oY29uc3Qgc3RkOjpzdHJpbmcmIGxpbmUsIGJvb2wpIHsgcHJpbnRmKCIlc1xuIiwgbGluZS5jX3N0cigpKTsgfSwKKyAgICAgIFsmXShjb25zdCBCYWNrdHJhY2VGcmFtZSYgZnJhbWUpIHsgc3ltYm9saXplX2JhY2t0cmFjZV9mcmFtZShmcmFtZSwgc3ltKTsgfSk7CiAKICAgaWYgKCFyZXN1bHQpIHsKICAgICBlcnJ4KDEsICJ0b21ic3RvbmUgd2FzIG1hbGZvcm1lZCIpOwpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL3Byb3RvL0FuZHJvaWQuYnAgYi9kZWJ1Z2dlcmQvcHJvdG8vQW5kcm9pZC5icAppbmRleCA3M2NmNTczLi43MGRlYjNjIDEwMDY0NAotLS0gYS9kZWJ1Z2dlcmQvcHJvdG8vQW5kcm9pZC5icAorKysgYi9kZWJ1Z2dlcmQvcHJvdG8vQW5kcm9pZC5icApAQCAtMzUsNiArMzUsMjEgQEAKICAgICAgICAgImNvbS5hbmRyb2lkLnJ1bnRpbWUiLAogICAgIF0sCiAKKyAgICByYW1kaXNrX2F2YWlsYWJsZTogdHJ1ZSwKICAgICByZWNvdmVyeV9hdmFpbGFibGU6IHRydWUsCiAgICAgdmVuZG9yX3JhbWRpc2tfYXZhaWxhYmxlOiB0cnVlLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorfQorCitqYXZhX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlidG9tYnN0b25lX3Byb3RvX2phdmEiLAorICAgIHByb3RvOiB7CisgICAgICAgIHR5cGU6ICJsaXRlIiwKKyAgICB9LAorICAgIHNyY3M6IFsKKyAgICAgICAgInRvbWJzdG9uZS5wcm90byIsCisgICAgXSwKKyAgICBqYXJqYXJfcnVsZXM6ICJqYXJqYXItcnVsZXMudHh0IiwKKyAgICBzZGtfdmVyc2lvbjogImN1cnJlbnQiLAorICAgIHN0YXRpY19saWJzOiBbImxpYnByb3RvYnVmLWphdmEtbGl0ZSJdLAogfQpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL3Byb3RvL2phcmphci1ydWxlcy50eHQgYi9kZWJ1Z2dlcmQvcHJvdG8vamFyamFyLXJ1bGVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Njg3OGE5Ci0tLSAvZGV2L251bGwKKysrIGIvZGVidWdnZXJkL3Byb3RvL2phcmphci1ydWxlcy50eHQKQEAgLTAsMCArMSBAQAorcnVsZSBjb20uZ29vZ2xlLnByb3RvYnVmLioqIGNvbS5hbmRyb2lkLnNlcnZlci5vcy5wcm90b2J1Zi5AMQpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL3Byb3RvL3RvbWJzdG9uZS5wcm90byBiL2RlYnVnZ2VyZC9wcm90by90b21ic3RvbmUucHJvdG8KaW5kZXggNDk4NjVhMi4uNDQ0Yzk3MyAxMDA2NDQKLS0tIGEvZGVidWdnZXJkL3Byb3RvL3RvbWJzdG9uZS5wcm90bworKysgYi9kZWJ1Z2dlcmQvcHJvdG8vdG9tYnN0b25lLnByb3RvCkBAIC0xNSw4ICsxNSwzMSBAQAogLy8gTk9URSBUTyBPRU1TOgogLy8gSWYgeW91IGFkZCBjdXN0b20gZmllbGRzIHRvIHRoaXMgcHJvdG8sIGRvIG5vdCB1c2UgbnVtYmVycyBpbiB0aGUgcmVzZXJ2ZWQgcmFuZ2UuCiAKK21lc3NhZ2UgQ3Jhc2hEZXRhaWwgeworICBieXRlcyBuYW1lID0gMTsKKyAgYnl0ZXMgZGF0YSA9IDI7CisKKyAgcmVzZXJ2ZWQgMyB0byA5OTk7Cit9CisKK21lc3NhZ2UgU3RhY2tIaXN0b3J5QnVmZmVyRW50cnkgeworICBCYWNrdHJhY2VGcmFtZSBhZGRyID0gMTsKKyAgdWludDY0IGZwID0gMjsKKyAgdWludDY0IHRhZyA9IDM7CisKKyAgcmVzZXJ2ZWQgNCB0byA5OTk7Cit9CisKK21lc3NhZ2UgU3RhY2tIaXN0b3J5QnVmZmVyIHsKKyAgdWludDY0IHRpZCA9IDE7CisgIHJlcGVhdGVkIFN0YWNrSGlzdG9yeUJ1ZmZlckVudHJ5IGVudHJpZXMgPSAyOworCisgIHJlc2VydmVkIDMgdG8gOTk5OworfQorCiBtZXNzYWdlIFRvbWJzdG9uZSB7CiAgIEFyY2hpdGVjdHVyZSBhcmNoID0gMTsKKyAgQXJjaGl0ZWN0dXJlIGd1ZXN0X2FyY2ggPSAyNDsKICAgc3RyaW5nIGJ1aWxkX2ZpbmdlcnByaW50ID0gMjsKICAgc3RyaW5nIHJldmlzaW9uID0gMzsKICAgc3RyaW5nIHRpbWVzdGFtcCA9IDQ7CkBAIC0zMywxNCArNTYsMjEgQEAKIAogICBTaWduYWwgc2lnbmFsX2luZm8gPSAxMDsKICAgc3RyaW5nIGFib3J0X21lc3NhZ2UgPSAxNDsKKyAgcmVwZWF0ZWQgQ3Jhc2hEZXRhaWwgY3Jhc2hfZGV0YWlscyA9IDIxOwogICByZXBlYXRlZCBDYXVzZSBjYXVzZXMgPSAxNTsKIAogICBtYXA8dWludDMyLCBUaHJlYWQ+IHRocmVhZHMgPSAxNjsKKyAgbWFwPHVpbnQzMiwgVGhyZWFkPiBndWVzdF90aHJlYWRzID0gMjU7CiAgIHJlcGVhdGVkIE1lbW9yeU1hcHBpbmcgbWVtb3J5X21hcHBpbmdzID0gMTc7CiAgIHJlcGVhdGVkIExvZ0J1ZmZlciBsb2dfYnVmZmVycyA9IDE4OwogICByZXBlYXRlZCBGRCBvcGVuX2ZkcyA9IDE5OwogCi0gIHJlc2VydmVkIDIxIHRvIDk5OTsKKyAgdWludDMyIHBhZ2Vfc2l6ZSA9IDIyOworICBib29sIGhhc19iZWVuXzE2a2JfbW9kZSA9IDIzOworCisgIFN0YWNrSGlzdG9yeUJ1ZmZlciBzdGFja19oaXN0b3J5X2J1ZmZlciA9IDI2OworCisgIHJlc2VydmVkIDI3IHRvIDk5OTsKIH0KIAogZW51bSBBcmNoaXRlY3R1cmUgewpAQCAtNDksOCArNzksOSBAQAogICBYODYgPSAyOwogICBYODZfNjQgPSAzOwogICBSSVNDVjY0ID0gNDsKKyAgTk9ORSA9IDU7CiAKLSAgcmVzZXJ2ZWQgNSB0byA5OTk7CisgIHJlc2VydmVkIDYgdG8gOTk5OwogfQogCiBtZXNzYWdlIFNpZ25hbCB7CmRpZmYgLS1naXQgYS9kZWJ1Z2dlcmQvcHJvdG9jb2wuaCBiL2RlYnVnZ2VyZC9wcm90b2NvbC5oCmluZGV4IGI2MGNmNWIuLjlhZjczNzcgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC9wcm90b2NvbC5oCisrKyBiL2RlYnVnZ2VyZC9wcm90b2NvbC5oCkBAIC02NSw3ICs2NSw3IEBACiB9OwogCiBlbnVtIGNsYXNzIEludGVyY2VwdFN0YXR1cyA6IHVpbnQ4X3QgewotICAvLyBSZXR1cm5lZCB3aGVuIGFuIGludGVyY2VwdCBvZiBhIGRpZmZlcmVudCB0eXBlIGhhcyBhbHJlYWR5IGJlZW4KKyAgLy8gUmV0dXJuZWQgd2hlbiBhbiBpbnRlcmNlcHQgb2YgdGhlIHNhbWUgdHlwZSBoYXMgYWxyZWFkeSBiZWVuCiAgIC8vIHJlZ2lzdGVyZWQgKGFuZCBpcyBhY3RpdmUpIGZvciBhIGdpdmVuIFBJRC4KICAga0ZhaWxlZEFscmVhZHlSZWdpc3RlcmVkLAogICAvLyBSZXR1cm5lZCBpbiBhbGwgb3RoZXIgZmFpbHVyZSBjYXNlcy4KQEAgLTk5LDcgKzk5LDkgQEAKICAgdWludHB0cl90IHNjdWRvX3JlZ2lvbl9pbmZvOwogICB1aW50cHRyX3Qgc2N1ZG9fcmluZ19idWZmZXI7CiAgIHNpemVfdCBzY3Vkb19yaW5nX2J1ZmZlcl9zaXplOwotICBib29sIHJlY292ZXJhYmxlX2d3cF9hc2FuX2NyYXNoOworICBzaXplX3Qgc2N1ZG9fc3RhY2tfZGVwb3Rfc2l6ZTsKKyAgYm9vbCByZWNvdmVyYWJsZV9jcmFzaDsKKyAgdWludHB0cl90IGNyYXNoX2RldGFpbF9wYWdlOwogfTsKIAogc3RydWN0IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKSBDcmFzaEluZm8gewpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL3J1c3QvdG9tYnN0b25lZF9jbGllbnQvQW5kcm9pZC5icCBiL2RlYnVnZ2VyZC9ydXN0L3RvbWJzdG9uZWRfY2xpZW50L0FuZHJvaWQuYnAKaW5kZXggMjAwN2YzOS4uYmYxOWJiNyAxMDA2NDQKLS0tIGEvZGVidWdnZXJkL3J1c3QvdG9tYnN0b25lZF9jbGllbnQvQW5kcm9pZC5icAorKysgYi9kZWJ1Z2dlcmQvcnVzdC90b21ic3RvbmVkX2NsaWVudC9BbmRyb2lkLmJwCkBAIC04LDcgKzgsNyBAQAogICAgICAgICAid3JhcHBlci5jcHAiLAogICAgIF0sCiAgICAgZ2VuZXJhdGVkX3NvdXJjZXM6IFsKLSAgICAgICAgImxpYnRvbWJzdG9uZWRfY2xpZW50X3J1c3RfYnJpZGdlX2NvZGUiCisgICAgICAgICJsaWJ0b21ic3RvbmVkX2NsaWVudF9ydXN0X2JyaWRnZV9jb2RlIiwKICAgICBdLAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLApkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL3J1c3QvdG9tYnN0b25lZF9jbGllbnQvc3JjL2xpYi5ycyBiL2RlYnVnZ2VyZC9ydXN0L3RvbWJzdG9uZWRfY2xpZW50L3NyYy9saWIucnMKaW5kZXggNWM4YWJlZi4uZDFiNWU2OSAxMDA2NDQKLS0tIGEvZGVidWdnZXJkL3J1c3QvdG9tYnN0b25lZF9jbGllbnQvc3JjL2xpYi5ycworKysgYi9kZWJ1Z2dlcmQvcnVzdC90b21ic3RvbmVkX2NsaWVudC9zcmMvbGliLnJzCkBAIC0zOSwyMCArMzksMjYgQEAKIH0KIAogaW1wbCBUb21ic3RvbmVkQ29ubmVjdGlvbiB7CisgICAgLy8vICMgU2FmZXR5CisgICAgLy8vCisgICAgLy8vIFRoZSBmaWxlIGRlc2NyaXB0b3JzIG11c3QgYmUgdmFsaWQgYW5kIG9wZW4uCiAgICAgdW5zYWZlIGZuIGZyb21fcmF3X2ZkcygKICAgICAgICAgdG9tYnN0b25lZF9zb2NrZXQ6IFJhd0ZkLAogICAgICAgICB0ZXh0X291dHB1dF9mZDogUmF3RmQsCiAgICAgICAgIHByb3RvX291dHB1dF9mZDogUmF3RmQsCiAgICAgKSAtPiBTZWxmIHsKICAgICAgICAgU2VsZiB7Ci0gICAgICAgICAgICB0b21ic3RvbmVkX3NvY2tldDogRmlsZTo6ZnJvbV9yYXdfZmQodG9tYnN0b25lZF9zb2NrZXQpLAorICAgICAgICAgICAgLy8gU0FGRVRZOiBUaGUgY2FsbGVyIGd1YXJhbnRlZXMgdGhhdCB0aGUgZmlsZSBkZXNjcmlwdG9yIGlzIHZhbGlkIGFuZCBvcGVuLgorICAgICAgICAgICAgdG9tYnN0b25lZF9zb2NrZXQ6IHVuc2FmZSB7IEZpbGU6OmZyb21fcmF3X2ZkKHRvbWJzdG9uZWRfc29ja2V0KSB9LAogICAgICAgICAgICAgdGV4dF9vdXRwdXQ6IGlmIHRleHRfb3V0cHV0X2ZkID49IDAgewotICAgICAgICAgICAgICAgIFNvbWUoRmlsZTo6ZnJvbV9yYXdfZmQodGV4dF9vdXRwdXRfZmQpKQorICAgICAgICAgICAgICAgIC8vIFNBRkVUWTogVGhlIGNhbGxlciBndWFyYW50ZWVzIHRoYXQgdGhlIGZpbGUgZGVzY3JpcHRvciBpcyB2YWxpZCBhbmQgb3Blbi4KKyAgICAgICAgICAgICAgICBTb21lKHVuc2FmZSB7IEZpbGU6OmZyb21fcmF3X2ZkKHRleHRfb3V0cHV0X2ZkKSB9KQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBOb25lCiAgICAgICAgICAgICB9LAogICAgICAgICAgICAgcHJvdG9fb3V0cHV0OiBpZiBwcm90b19vdXRwdXRfZmQgPj0gMCB7Ci0gICAgICAgICAgICAgICAgU29tZShGaWxlOjpmcm9tX3Jhd19mZChwcm90b19vdXRwdXRfZmQpKQorICAgICAgICAgICAgICAgIC8vIFNBRkVUWTogVGhlIGNhbGxlciBndWFyYW50ZWVzIHRoYXQgdGhlIGZpbGUgZGVzY3JpcHRvciBpcyB2YWxpZCBhbmQgb3Blbi4KKyAgICAgICAgICAgICAgICBTb21lKHVuc2FmZSB7IEZpbGU6OmZyb21fcmF3X2ZkKHByb3RvX291dHB1dF9mZCkgfSkKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgTm9uZQogICAgICAgICAgICAgfSwKQEAgLTcxLDYgKzc3LDggQEAKICAgICAgICAgICAgICZtdXQgcHJvdG9fb3V0cHV0X2ZkLAogICAgICAgICAgICAgZHVtcF90eXBlLAogICAgICAgICApIHsKKyAgICAgICAgICAgIC8vIFNBRkVUWTogSWYgdG9tYnN0b25lZF9jb25uZWN0X2ZpbGVzIHJldHVybnMgc3VjY2Vzc2Z1bGx5IHRoZW4gdGhleSBmaWxlIGRlc2NyaXB0b3JzCisgICAgICAgICAgICAvLyBhcmUgdmFsaWQgYW5kIG9wZW4uCiAgICAgICAgICAgICBPayh1bnNhZmUgeyBTZWxmOjpmcm9tX3Jhd19mZHModG9tYnN0b25lZF9zb2NrZXQsIHRleHRfb3V0cHV0X2ZkLCBwcm90b19vdXRwdXRfZmQpIH0pCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBFcnIoRXJyb3IpCkBAIC0xNDYsOCArMTU0LDYgQEAKICAgICAgICAgICAgIC53cml0ZV9hbGwoYiJ0ZXN0IGRhdGEiKQogICAgICAgICAgICAgLmV4cGVjdCgiRmFpbGVkIHRvIHdyaXRlIHRvIHRleHQgb3V0cHV0IEZELiIpOwogCi0gICAgICAgIGNvbm5lY3Rpb24KLSAgICAgICAgICAgIC5ub3RpZnlfY29tcGxldGlvbigpCi0gICAgICAgICAgICAuZXhwZWN0KCJGYWlsZWQgdG8gbm90aWZ5IGNvbXBsZXRpb24uIik7CisgICAgICAgIGNvbm5lY3Rpb24ubm90aWZ5X2NvbXBsZXRpb24oKS5leHBlY3QoIkZhaWxlZCB0byBub3RpZnkgY29tcGxldGlvbi4iKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9kZWJ1Z2dlcmQvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC5hcm0ucG9saWN5IGIvZGVidWdnZXJkL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAuYXJtLnBvbGljeQppbmRleCA4ZmQwM2M0Li5hNzBhYjIwIDEwMDY0NAotLS0gYS9kZWJ1Z2dlcmQvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC5hcm0ucG9saWN5CisrKyBiL2RlYnVnZ2VyZC9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLmFybS5wb2xpY3kKQEAgLTIwLDYgKzIwLDcgQEAKIGZhY2Nlc3NhdDogMQogcmVjdm1zZzogMQogcmVjdmZyb206IDEKK3NldHNvY2tvcHQ6IDEKIHN5c2luZm86IDEKIHByb2Nlc3Nfdm1fcmVhZHY6IDEKIHRna2lsbDogMQpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAuYXJtNjQucG9saWN5IGIvZGVidWdnZXJkL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAuYXJtNjQucG9saWN5CmluZGV4IDgyNDFmMGUuLmM1ZDEwZDYgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLmFybTY0LnBvbGljeQorKysgYi9kZWJ1Z2dlcmQvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC5hcm02NC5wb2xpY3kKQEAgLTE5LDYgKzE5LDcgQEAKIGZhY2Nlc3NhdDogMQogcmVjdm1zZzogMQogcmVjdmZyb206IDEKK3NldHNvY2tvcHQ6IDEKIHN5c2luZm86IDEKIHByb2Nlc3Nfdm1fcmVhZHY6IDEKIHRna2lsbDogMQpAQCAtMjcsMTEgKzI4LDExIEBACiBydF90Z3NpZ3F1ZXVlaW5mbzogMQogcHJjdGw6IGFyZzAgPT0gUFJfR0VUX05PX05FV19QUklWUyB8fCBhcmcwID09IDB4NTM1NjRkNDEgfHwgYXJnMCA9PSBQUl9QQUNfUkVTRVRfS0VZUyB8fCBhcmcwID09IDU2IHx8IGFyZzAgPT0gNjEKIG1hZHZpc2U6IDEKLW1wcm90ZWN0OiBhcmcyIGluIDB4MXwweDIKK21wcm90ZWN0OiBhcmcyIGluIDB4MXwweDJ8MHgyMAogbXVubWFwOiAxCiBnZXR1aWQ6IDEKIGZzdGF0OiAxCi1tbWFwOiBhcmcyIGluIDB4MXwweDIKK21tYXA6IGFyZzIgaW4gMHgxfDB4MnwweDIwCiBnZXRldWlkOiAxCiBnZXRnaWQ6IDEKIGdldGVnaWQ6IDEKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLnBvbGljeS5kZWYgYi9kZWJ1Z2dlcmQvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC5wb2xpY3kuZGVmCmluZGV4IDBjYjhlMDguLmRjNzUxZGEgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLnBvbGljeS5kZWYKKysrIGIvZGVidWdnZXJkL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAucG9saWN5LmRlZgpAQCAtMjUsNiArMjUsNyBAQAogZmFjY2Vzc2F0OiAxCiByZWN2bXNnOiAxCiByZWN2ZnJvbTogMQorc2V0c29ja29wdDogMQogc3lzaW5mbzogMQogCiBwcm9jZXNzX3ZtX3JlYWR2OiAxCkBAIC01MiwyMCArNTMsMjkgQEAKIAogI2lmIDAKIGxpYm1pbmlqYWlsIG9uIHZlbmRvciBwYXJ0aXRpb25zIG9sZGVyIHRoYW4gUCBkb2VzIG5vdCBoYXZlIGNvbnN0YW50cyBmcm9tIDxzeXMvbW1hbi5oPi4KLURlZmluZSB0aGUgdmFsdWVzIG9mIFBST1RfUkVBRCBhbmQgUFJPVF9XUklURSBvdXJzZWx2ZXMgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCitEZWZpbmUgdmFsdWVzIGZvciBQUk9UX1JFQUQsIFBST1RfV1JJVEUgYW5kIFBST1RfTVRFIG91cnNlbHZlcyB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICNlbHNlCiAjZGVmaW5lIFBST1RfUkVBRCAweDEKICNkZWZpbmUgUFJPVF9XUklURSAweDIKKyNkZWZpbmUgUFJPVF9NVEUgMHgyMAogI2VuZGlmCiAKIG1hZHZpc2U6IDEKKyNpZiBkZWZpbmVkKF9fYWFyY2g2NF9fKQorbXByb3RlY3Q6IGFyZzIgaW4gUFJPVF9SRUFEfFBST1RfV1JJVEV8UFJPVF9NVEUKKyNlbHNlCiBtcHJvdGVjdDogYXJnMiBpbiBQUk9UX1JFQUR8UFJPVF9XUklURQorI2VuZGlmCiBtdW5tYXA6IDEKIAogI2lmIGRlZmluZWQoX19MUDY0X18pCiBnZXR1aWQ6IDEKIGZzdGF0OiAxCisjaWYgZGVmaW5lZChfX2FhcmNoNjRfXykKK21tYXA6IGFyZzIgaW4gUFJPVF9SRUFEfFBST1RfV1JJVEV8UFJPVF9NVEUKKyNlbHNlCiBtbWFwOiBhcmcyIGluIFBST1RfUkVBRHxQUk9UX1dSSVRFCisjZW5kaWYKICNlbHNlCiBnZXR1aWQzMjogMQogZnN0YXQ2NDogMQpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAucmlzY3Y2NC5wb2xpY3kgYi9kZWJ1Z2dlcmQvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC5yaXNjdjY0LnBvbGljeQppbmRleCAyMTg4N2FiLi45NGE1Njc3IDEwMDY0NAotLS0gYS9kZWJ1Z2dlcmQvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC5yaXNjdjY0LnBvbGljeQorKysgYi9kZWJ1Z2dlcmQvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC5yaXNjdjY0LnBvbGljeQpAQCAtMTksMTIgKzE5LDE0IEBACiBmYWNjZXNzYXQ6IDEKIHJlY3Ztc2c6IDEKIHJlY3Zmcm9tOiAxCitzZXRzb2Nrb3B0OiAxCitzeXNpbmZvOiAxCiBwcm9jZXNzX3ZtX3JlYWR2OiAxCiB0Z2tpbGw6IDEKIHJ0X3NpZ3Byb2NtYXNrOiAxCiBydF9zaWdhY3Rpb246IDEKIHJ0X3Rnc2lncXVldWVpbmZvOiAxCi1wcmN0bDogYXJnMCA9PSBQUl9HRVRfTk9fTkVXX1BSSVZTIHx8IGFyZzAgPT0gMHg1MzU2NGQ0MSB8fCBhcmcwID09IFBSX1BBQ19SRVNFVF9LRVlTCitwcmN0bDogYXJnMCA9PSBQUl9HRVRfTk9fTkVXX1BSSVZTIHx8IGFyZzAgPT0gMHg1MzU2NGQ0MQogbWFkdmlzZTogMQogbXByb3RlY3Q6IGFyZzIgaW4gMHgxfDB4MgogbXVubWFwOiAxCmRpZmYgLS1naXQgYS9kZWJ1Z2dlcmQvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC54ODYucG9saWN5IGIvZGVidWdnZXJkL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAueDg2LnBvbGljeQppbmRleCA4ZmQwM2M0Li5hNzBhYjIwIDEwMDY0NAotLS0gYS9kZWJ1Z2dlcmQvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC54ODYucG9saWN5CisrKyBiL2RlYnVnZ2VyZC9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLng4Ni5wb2xpY3kKQEAgLTIwLDYgKzIwLDcgQEAKIGZhY2Nlc3NhdDogMQogcmVjdm1zZzogMQogcmVjdmZyb206IDEKK3NldHNvY2tvcHQ6IDEKIHN5c2luZm86IDEKIHByb2Nlc3Nfdm1fcmVhZHY6IDEKIHRna2lsbDogMQpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAueDg2XzY0LnBvbGljeSBiL2RlYnVnZ2VyZC9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLng4Nl82NC5wb2xpY3kKaW5kZXggMjgxZTIzMS4uOTRhNTY3NyAxMDA2NDQKLS0tIGEvZGVidWdnZXJkL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAueDg2XzY0LnBvbGljeQorKysgYi9kZWJ1Z2dlcmQvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC54ODZfNjQucG9saWN5CkBAIC0xOSw2ICsxOSw3IEBACiBmYWNjZXNzYXQ6IDEKIHJlY3Ztc2c6IDEKIHJlY3Zmcm9tOiAxCitzZXRzb2Nrb3B0OiAxCiBzeXNpbmZvOiAxCiBwcm9jZXNzX3ZtX3JlYWR2OiAxCiB0Z2tpbGw6IDEKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC90ZXN0X3Blcm1pc3NpdmVfbXRlL0FuZHJvaWQuYnAgYi9kZWJ1Z2dlcmQvdGVzdF9wZXJtaXNzaXZlX210ZS9BbmRyb2lkLmJwCmluZGV4IGQzZjc1MjAuLmYzMzMyNDIgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC90ZXN0X3Blcm1pc3NpdmVfbXRlL0FuZHJvaWQuYnAKKysrIGIvZGVidWdnZXJkL3Rlc3RfcGVybWlzc2l2ZV9tdGUvQW5kcm9pZC5icApAQCAtMTcsMjMgKzE3LDI5IEBACiB9CiAKIGNjX2JpbmFyeSB7Ci0gIG5hbWU6ICJtdGVfY3Jhc2giLAotICB0aWR5OiBmYWxzZSwKLSAgc3JjczogWyJtdGVfY3Jhc2guY3BwIl0sCi0gIHNhbml0aXplOiB7Ci0gICAgbWVtdGFnX2hlYXA6IHRydWUsCi0gICAgZGlhZzogewotICAgICAgbWVtdGFnX2hlYXA6IHRydWUsCisgICAgbmFtZTogIm10ZV9jcmFzaCIsCisgICAgdGlkeTogZmFsc2UsCisgICAgc3JjczogWyJtdGVfY3Jhc2guY3BwIl0sCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWVtdGFnX2hlYXA6IHRydWUsCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIG1lbXRhZ19oZWFwOiB0cnVlLAorICAgICAgICB9LAogICAgIH0sCi0gIH0sCiB9CiAKIGphdmFfdGVzdF9ob3N0IHsKICAgICBuYW1lOiAicGVybWlzc2l2ZV9tdGVfdGVzdCIsCiAgICAgbGliczogWyJ0cmFkZWZlZCJdLAotICAgIHN0YXRpY19saWJzOiBbImZyYW1ld29ya3MtYmFzZS1ob3N0dXRpbHMiLCAiY3RzLWluc3RhbGwtbGliLWhvc3QiXSwKLSAgICBzcmNzOiAgWyJzcmMvKiovUGVybWlzc2l2ZU10ZVRlc3QuamF2YSIsICI6bGlidG9tYnN0b25lX3Byb3RvLXNyYyJdLAotICAgIGRhdGE6IFsiOm10ZV9jcmFzaCJdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzLWJhc2UtaG9zdHV0aWxzIiwKKyAgICAgICAgImN0cy1pbnN0YWxsLWxpYi1ob3N0IiwKKyAgICBdLAorICAgIHNyY3M6IFsKKyAgICAgICAgInNyYy8qKi9QZXJtaXNzaXZlTXRlVGVzdC5qYXZhIiwKKyAgICAgICAgIjpsaWJ0b21ic3RvbmVfcHJvdG8tc3JjIiwKKyAgICBdLAorICAgIGRldmljZV9maXJzdF9kYXRhOiBbIjptdGVfY3Jhc2giXSwKICAgICB0ZXN0X2NvbmZpZzogIkFuZHJvaWRUZXN0LnhtbCIsCiAgICAgdGVzdF9zdWl0ZXM6IFsiZ2VuZXJhbC10ZXN0cyJdLAogfQpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL3Rlc3RfcGVybWlzc2l2ZV9tdGUvQW5kcm9pZFRlc3QueG1sIGIvZGVidWdnZXJkL3Rlc3RfcGVybWlzc2l2ZV9tdGUvQW5kcm9pZFRlc3QueG1sCmluZGV4IGJkM2QwMTguLmRiNWY1YjggMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC90ZXN0X3Blcm1pc3NpdmVfbXRlL0FuZHJvaWRUZXN0LnhtbAorKysgYi9kZWJ1Z2dlcmQvdGVzdF9wZXJtaXNzaXZlX210ZS9BbmRyb2lkVGVzdC54bWwKQEAgLTE3LDggKzE3LDYgQEAKICAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iaW5pdF90ZXN0X3VwZ3JhZGVfbXRlIiAvPgogICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJhcGN0IiAvPgogCi0gICAgPCEtLSBGb3IgdG9tYnN0b25lIGluc3BlY3Rpb24uIC0tPgotICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUm9vdFRhcmdldFByZXBhcmVyIi8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9InRydWUiIC8+CiAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJtdGVfY3Jhc2gtPi9kYXRhL2xvY2FsL3RtcC9tdGVfY3Jhc2giIC8+CmRpZmYgLS1naXQgYS9kZWJ1Z2dlcmQvdGVzdF9wZXJtaXNzaXZlX210ZS9tdGVfY3Jhc2guY3BwIGIvZGVidWdnZXJkL3Rlc3RfcGVybWlzc2l2ZV9tdGUvbXRlX2NyYXNoLmNwcAppbmRleCA5N2FkNzNmLi43NWI3MGVkIDEwMDY0NAotLS0gYS9kZWJ1Z2dlcmQvdGVzdF9wZXJtaXNzaXZlX210ZS9tdGVfY3Jhc2guY3BwCisrKyBiL2RlYnVnZ2VyZC90ZXN0X3Blcm1pc3NpdmVfbXRlL210ZV9jcmFzaC5jcHAKQEAgLTIwLDUgKzIwLDE0IEBACiBpbnQgbWFpbihpbnQsIGNoYXIqKikgewogICB2b2xhdGlsZSBjaGFyKiBmID0gKGNoYXIqKW1hbGxvYygxKTsKICAgcHJpbnRmKCIlY1xuIiwgZlsxN10pOworI2lmZGVmIF9fYWFyY2g2NF9fCisgIGlmIChnZXRlbnYoIk1URV9QRVJNSVNTSVZFX1JFRU5BQkxFX1RJTUVfQ1BVTVMiKSkgeworICAgIC8vIEJ1cm4gc29tZSBjeWNsZXMgYmVjYXVzZSB0aGUgTVRFX1BFUk1JU1NJVkVfUkVFTkFCTEVfVElNRV9DUFVNUyBpcyBiYXNlZCBvbiBDUFUgY2xvY2suCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwMDAwMDAwOyArK2kpIHsKKyAgICAgIGFzbSgiaXNiIik7CisgICAgfQorICAgIHByaW50ZigiJWNcbiIsIGZbMTddKTsKKyAgfQorI2VuZGlmCiAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL3Rlc3RfcGVybWlzc2l2ZV9tdGUvc3JjL2NvbS9hbmRyb2lkL3Rlc3RzL2RlYnVnZ2VyZC9QZXJtaXNzaXZlTXRlVGVzdC5qYXZhIGIvZGVidWdnZXJkL3Rlc3RfcGVybWlzc2l2ZV9tdGUvc3JjL2NvbS9hbmRyb2lkL3Rlc3RzL2RlYnVnZ2VyZC9QZXJtaXNzaXZlTXRlVGVzdC5qYXZhCmluZGV4IDAyMDNhZGMuLjU0NDI5OWQgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyZC90ZXN0X3Blcm1pc3NpdmVfbXRlL3NyYy9jb20vYW5kcm9pZC90ZXN0cy9kZWJ1Z2dlcmQvUGVybWlzc2l2ZU10ZVRlc3QuamF2YQorKysgYi9kZWJ1Z2dlcmQvdGVzdF9wZXJtaXNzaXZlX210ZS9zcmMvY29tL2FuZHJvaWQvdGVzdHMvZGVidWdnZXJkL1Blcm1pc3NpdmVNdGVUZXN0LmphdmEKQEAgLTk3LDYgKzk3LDM0IEBACiAgICAgfQogICAgIGFzc2VydFRoYXQobnVtYmVyVG9tYnN0b25lcykuaXNFcXVhbFRvKDEpOwogICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFJlZW5hYmxlQ3Jhc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBDb21tYW5kUmVzdWx0IHJlc3VsdCA9CisgICAgICAgIGdldERldmljZSgpLmV4ZWN1dGVTaGVsbFYyQ29tbWFuZCgiTVRFX1BFUk1JU1NJVkU9MSBNVEVfUEVSTUlTU0lWRV9SRUVOQUJMRV9USU1FX0NQVU1TPTEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiL2RhdGEvbG9jYWwvdG1wL210ZV9jcmFzaCB0ZXN0UmVlbmFibGVDcmFzaCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1VVUlEKTsKKyAgICBhc3NlcnRUaGF0KHJlc3VsdC5nZXRFeGl0Q29kZSgpKS5pc0VxdWFsVG8oMCk7CisgICAgaW50IG51bWJlclRvbWJzdG9uZXMgPSAwOworICAgIFN0cmluZ1tdIHRvbWJzdG9uZXMgPSBnZXREZXZpY2UoKS5nZXRDaGlsZHJlbigiL2RhdGEvdG9tYnN0b25lcyIpOworICAgIGZvciAoU3RyaW5nIHRvbWJzdG9uZSA6IHRvbWJzdG9uZXMpIHsKKyAgICAgIGlmICghdG9tYnN0b25lLmVuZHNXaXRoKCIucGIiKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIFN0cmluZyB0b21ic3RvbmVQYXRoID0gIi9kYXRhL3RvbWJzdG9uZXMvIiArIHRvbWJzdG9uZTsKKyAgICAgIFRvbWJzdG9uZSB0b21ic3RvbmVQcm90byA9IHBhcnNlVG9tYnN0b25lKHRvbWJzdG9uZVBhdGgpOworICAgICAgaWYgKCF0b21ic3RvbmVQcm90by5nZXRDb21tYW5kTGluZUxpc3QoKS5zdHJlYW0oKS5hbnlNYXRjaCh4IC0+IHguY29udGFpbnMobVVVSUQpKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmICghdG9tYnN0b25lUHJvdG8uZ2V0Q29tbWFuZExpbmVMaXN0KCkuc3RyZWFtKCkuYW55TWF0Y2goCisgICAgICAgICAgICAgIHggLT4geC5jb250YWlucygidGVzdFJlZW5hYmxlQ3Jhc2giKSkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBudW1iZXJUb21ic3RvbmVzKys7CisgICAgfQorICAgIGFzc2VydFRoYXQobnVtYmVyVG9tYnN0b25lcykuaXNFcXVhbFRvKDIpOworICB9CisKICAgQFRlc3QKICAgcHVibGljIHZvaWQgdGVzdENyYXNoUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICBTdHJpbmcgcHJldlZhbHVlID0gZ2V0RGV2aWNlKCkuZ2V0UHJvcGVydHkoInBlcnNpc3Quc3lzLm10ZS5wZXJtaXNzaXZlIik7CmRpZmYgLS1naXQgYS9kZWJ1Z2dlcmQvdG9tYnN0b25lX3N5bWJvbGl6ZS5jcHAgYi9kZWJ1Z2dlcmQvdG9tYnN0b25lX3N5bWJvbGl6ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc3MzVkMAotLS0gL2Rldi9udWxsCisrKyBiL2RlYnVnZ2VyZC90b21ic3RvbmVfc3ltYm9saXplLmNwcApAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJ0b21ic3RvbmVfc3ltYm9saXplLmgiCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiYW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oIgorI2luY2x1ZGUgImFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaCIKKworI2luY2x1ZGUgInRvbWJzdG9uZS5wYi5oIgorCit1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQ7CisKK2Jvb2wgU3ltYm9saXplcjo6U3RhcnQoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBkZWJ1Z19maWxlX2RpcmVjdG9yaWVzKSB7CisgIHVuaXF1ZV9mZCBwYXJlbnRfaW4sIHBhcmVudF9vdXQsIGNoaWxkX2luLCBjaGlsZF9vdXQ7CisgIGlmICghUGlwZSgmcGFyZW50X2luLCAmY2hpbGRfb3V0KSB8fCAhUGlwZSgmY2hpbGRfaW4sICZwYXJlbnRfb3V0KSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIgKj4gYXJnczsKKyAgYXJncy5wdXNoX2JhY2soImxsdm0tc3ltYm9saXplciIpOworICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nICZkaXIgOiBkZWJ1Z19maWxlX2RpcmVjdG9yaWVzKSB7CisgICAgYXJncy5wdXNoX2JhY2soIi0tZGVidWctZmlsZS1kaXJlY3RvcnkiKTsKKyAgICBhcmdzLnB1c2hfYmFjayhkaXIuY19zdHIoKSk7CisgIH0KKyAgYXJncy5wdXNoX2JhY2soMCk7CisKKyAgaW50IHBpZCA9IGZvcmsoKTsKKyAgaWYgKHBpZCA9PSAtMSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIGlmIChwaWQgPT0gMCkgeworICAgIHBhcmVudF9pbi5yZXNldCgpOworICAgIHBhcmVudF9vdXQucmVzZXQoKTsKKworICAgIGR1cDIoY2hpbGRfaW4uZ2V0KCksIFNURElOX0ZJTEVOTyk7CisgICAgZHVwMihjaGlsZF9vdXQuZ2V0KCksIFNURE9VVF9GSUxFTk8pOworCisgICAgZXhlY3ZwKCJsbHZtLXN5bWJvbGl6ZXIiLCBjb25zdF9jYXN0PGNoYXIgKmNvbnN0ICo+KGFyZ3MuZGF0YSgpKSk7CisKKyAgICBmcHJpbnRmKHN0ZGVyciwgInVuYWJsZSB0byBzdGFydCBsbHZtLXN5bWJvbGl6ZXI6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgIF9leGl0KDEpOworICB9IGVsc2UgeworICAgIGNoaWxkX2luLnJlc2V0KCk7CisgICAgY2hpbGRfb3V0LnJlc2V0KCk7CisKKyAgICAvLyBUT0RPOiBDaGVjayB0aGF0IGxsdm0tc3ltYm9saXplciBzdGFydGVkIHVwIHN1Y2Nlc3NmdWxseS4KKyAgICAvLyBUaGVyZSB1c2VkIHRvIGJlIGFuIGVhc3kgd2F5IHRvIGRvIHRoaXMsIGJ1dCBpdCB3YXMgcmVtb3ZlZCBpbjoKKyAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbGx2bS9sbHZtLXByb2plY3QvY29tbWl0LzE3OTI4NTJmODZkYzc1ZWZhMWY0NGQ0NmIxYTBkYWYzODZkNjRhZmEKKworICAgIGluX2ZkID0gc3RkOjptb3ZlKHBhcmVudF9pbik7CisgICAgb3V0X2ZkID0gc3RkOjptb3ZlKHBhcmVudF9vdXQpOworICAgIHJldHVybiB0cnVlOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIFN5bWJvbGl6ZXI6OnJlYWRfcmVzcG9uc2UoKSB7CisgIHN0ZDo6c3RyaW5nIHJlc3A7CisKKyAgd2hpbGUgKHJlc3Auc2l6ZSgpIDwgMiB8fCByZXNwW3Jlc3Auc2l6ZSgpIC0gMl0gIT0gJ1xuJyB8fCByZXNwW3Jlc3Auc2l6ZSgpIC0gMV0gIT0gJ1xuJykgeworICAgIGNoYXIgYnVmWzQwOTZdOworICAgIHNzaXplX3Qgc2l6ZSA9IHJlYWQoaW5fZmQsIGJ1ZiwgNDA5Nik7CisgICAgaWYgKHNpemUgPD0gMCkgeworICAgICAgcmV0dXJuICIiOworICAgIH0KKyAgICByZXNwLmFwcGVuZChidWYsIHNpemUpOworICB9CisKKyAgcmV0dXJuIHJlc3A7Cit9CisKK3N0ZDo6dmVjdG9yPFN5bWJvbGl6ZXI6OkZyYW1lPiBTeW1ib2xpemVyOjpTeW1ib2xpemVDb2RlKHN0ZDo6c3RyaW5nIHBhdGgsIHVpbnQ2NF90IHJlbF9wYykgeworICBzdGQ6OnN0cmluZyByZXF1ZXN0ID0gU3RyaW5nUHJpbnRmKCJDT0RFICVzIDB4JSIgUFJJeDY0ICJcbiIsIHBhdGguY19zdHIoKSwgcmVsX3BjKTsKKyAgaWYgKHdyaXRlKG91dF9mZCwgcmVxdWVzdC5jX3N0cigpLCByZXF1ZXN0LnNpemUoKSkgIT0gc3RhdGljX2Nhc3Q8c3NpemVfdD4ocmVxdWVzdC5zaXplKCkpKSB7CisgICAgcmV0dXJuIHt9OworICB9CisKKyAgc3RkOjpzdHJpbmcgcmVzcG9uc2UgPSByZWFkX3Jlc3BvbnNlKCk7CisgIGlmIChyZXNwb25zZS5lbXB0eSgpKSB7CisgICAgcmV0dXJuIHt9OworICB9CisKKyAgc3RkOjp2ZWN0b3I8U3ltYm9saXplcjo6RnJhbWU+IGZyYW1lczsKKworICBzaXplX3QgZnJhbWVfc3RhcnQgPSAwOworICB3aGlsZSAoZnJhbWVfc3RhcnQgPCByZXNwb25zZS5zaXplKCkgLSAxKSB7CisgICAgU3ltYm9saXplcjo6RnJhbWUgZnJhbWU7CisKKyAgICBzaXplX3Qgc2Vjb25kX2xpbmVfc3RhcnQgPSByZXNwb25zZS5maW5kKCdcbicsIGZyYW1lX3N0YXJ0KSArIDE7CisgICAgaWYgKHNlY29uZF9saW5lX3N0YXJ0ID09IHN0ZDo6c3RyaW5nOjpucG9zICsgMSkgeworICAgICAgcmV0dXJuIHt9OworICAgIH0KKworICAgIHNpemVfdCB0aGlyZF9saW5lX3N0YXJ0ID0gcmVzcG9uc2UuZmluZCgnXG4nLCBzZWNvbmRfbGluZV9zdGFydCkgKyAxOworICAgIGlmICh0aGlyZF9saW5lX3N0YXJ0ID09IHN0ZDo6c3RyaW5nOjpucG9zICsgMSkgeworICAgICAgcmV0dXJuIHt9OworICAgIH0KKworICAgIGZyYW1lLmZ1bmN0aW9uX25hbWUgPSByZXNwb25zZS5zdWJzdHIoZnJhbWVfc3RhcnQsIHNlY29uZF9saW5lX3N0YXJ0IC0gZnJhbWVfc3RhcnQgLSAxKTsKKworICAgIHNpemVfdCBjb2x1bW5fbnVtYmVyX3N0YXJ0ID0gcmVzcG9uc2UucmZpbmQoJzonLCB0aGlyZF9saW5lX3N0YXJ0KTsKKyAgICBpZiAoY29sdW1uX251bWJlcl9zdGFydCA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgcmV0dXJuIHt9OworICAgIH0KKworICAgIHNpemVfdCBsaW5lX251bWJlcl9zdGFydCA9IHJlc3BvbnNlLnJmaW5kKCc6JywgY29sdW1uX251bWJlcl9zdGFydCAtIDEpOworICAgIGlmIChsaW5lX251bWJlcl9zdGFydCA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgcmV0dXJuIHt9OworICAgIH0KKworICAgIGZyYW1lLmZpbGUgPSByZXNwb25zZS5zdWJzdHIoc2Vjb25kX2xpbmVfc3RhcnQsIGxpbmVfbnVtYmVyX3N0YXJ0IC0gc2Vjb25kX2xpbmVfc3RhcnQpOworCisgICAgZXJybm8gPSAwOworICAgIGZyYW1lLmxpbmUgPSBzdHJ0b3VsbChyZXNwb25zZS5jX3N0cigpICsgbGluZV9udW1iZXJfc3RhcnQgKyAxLCAwLCAxMCk7CisgICAgZnJhbWUuY29sdW1uID0gc3RydG91bGwocmVzcG9uc2UuY19zdHIoKSArIGNvbHVtbl9udW1iZXJfc3RhcnQgKyAxLCAwLCAxMCk7CisgICAgaWYgKGVycm5vICE9IDApIHsKKyAgICAgIHJldHVybiB7fTsKKyAgICB9CisKKyAgICBmcmFtZXMucHVzaF9iYWNrKGZyYW1lKTsKKworICAgIGZyYW1lX3N0YXJ0ID0gdGhpcmRfbGluZV9zdGFydDsKKyAgfQorCisgIGlmIChmcmFtZXMuc2l6ZSgpID09IDEgJiYgZnJhbWVzWzBdLmZpbGUgPT0gIj8/IikgeworICAgIHJldHVybiB7fTsKKyAgfQorCisgIHJldHVybiBmcmFtZXM7Cit9CisKK3ZvaWQgc3ltYm9saXplX2JhY2t0cmFjZV9mcmFtZShjb25zdCBCYWNrdHJhY2VGcmFtZSYgZnJhbWUsIFN5bWJvbGl6ZXImIHN5bSkgeworICBpZiAoZnJhbWUuYnVpbGRfaWQoKS5lbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgZm9yIChTeW1ib2xpemVyOjpGcmFtZSBmIDogc3ltLlN5bWJvbGl6ZUNvZGUoIkJVSUxESUQ6IiArIGZyYW1lLmJ1aWxkX2lkKCksIGZyYW1lLnJlbF9wYygpKSkgeworICAgIHByaW50ZigiICAgICAgICAgICVzOiUiIFBSSWQ2NCAiOiUiIFBSSWQ2NCAiICglcylcbiIsIGYuZmlsZS5jX3N0cigpLCBmLmxpbmUsIGYuY29sdW1uLAorICAgICAgICAgICBmLmZ1bmN0aW9uX25hbWUuY19zdHIoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC90b21ic3RvbmVfc3ltYm9saXplLmggYi9kZWJ1Z2dlcmQvdG9tYnN0b25lX3N5bWJvbGl6ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMmQ2NzcKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJ1Z2dlcmQvdG9tYnN0b25lX3N5bWJvbGl6ZS5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmgiCisKK2NsYXNzIEJhY2t0cmFjZUZyYW1lOworCitjbGFzcyBTeW1ib2xpemVyIHsKKyAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGluX2ZkLCBvdXRfZmQ7CisKKyAgc3RkOjpzdHJpbmcgcmVhZF9yZXNwb25zZSgpOworCisgcHVibGljOgorICBib29sIFN0YXJ0KGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgZGVidWdfZmlsZV9kaXJlY3Rvcmllcyk7CisKKyAgc3RydWN0IEZyYW1lIHsKKyAgICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9uYW1lLCBmaWxlOworICAgIHVpbnQ2NF90IGxpbmUsIGNvbHVtbjsKKyAgfTsKKworICBzdGQ6OnZlY3RvcjxGcmFtZT4gU3ltYm9saXplQ29kZShzdGQ6OnN0cmluZyBwYXRoLCB1aW50NjRfdCByZWxfcGMpOworfTsKKwordm9pZCBzeW1ib2xpemVfYmFja3RyYWNlX2ZyYW1lKGNvbnN0IEJhY2t0cmFjZUZyYW1lJiBmcmFtZSwgU3ltYm9saXplciYgc3ltKTsKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyZC90b21ic3RvbmVkL2ludGVyY2VwdF9tYW5hZ2VyLmNwcCBiL2RlYnVnZ2VyZC90b21ic3RvbmVkL2ludGVyY2VwdF9tYW5hZ2VyLmNwcAppbmRleCA2MTNlNmY1Li5hYzdiNDMxIDEwMDY0NAotLS0gYS9kZWJ1Z2dlcmQvdG9tYnN0b25lZC9pbnRlcmNlcHRfbWFuYWdlci5jcHAKKysrIGIvZGVidWdnZXJkL3RvbWJzdG9uZWQvaW50ZXJjZXB0X21hbmFnZXIuY3BwCkBAIC0xOSw3ICsxOSwxMCBAQAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dXRpbGl0eT4KIAogI2luY2x1ZGUgPGV2ZW50Mi9ldmVudC5oPgogI2luY2x1ZGUgPGV2ZW50Mi9saXN0ZW5lci5oPgpAQCAtMzYsOCArMzksNyBAQAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOwogCiBzdGF0aWMgdm9pZCBpbnRlcmNlcHRfY2xvc2VfY2IoZXZ1dGlsX3NvY2tldF90IHNvY2tmZCwgc2hvcnQgZXZlbnQsIHZvaWQqIGFyZykgewotICBhdXRvIGludGVyY2VwdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8SW50ZXJjZXB0Kj4oYXJnKTsKLSAgSW50ZXJjZXB0TWFuYWdlciogaW50ZXJjZXB0X21hbmFnZXIgPSBpbnRlcmNlcHQtPmludGVyY2VwdF9tYW5hZ2VyOworICBzdGQ6OnVuaXF1ZV9wdHI8SW50ZXJjZXB0PiBpbnRlcmNlcHQocmVpbnRlcnByZXRfY2FzdDxJbnRlcmNlcHQqPihhcmcpKTsKIAogICBDSEVDS19FUShzb2NrZmQsIGludGVyY2VwdC0+c29ja2ZkLmdldCgpKTsKIApAQCAtNDYsMTMxICs0OCwxMDggQEAKIAogICAvLyBPd25lcnNoaXAgb2YgaW50ZXJjZXB0IGRpZmZlcnMgYmFzZWQgb24gd2hldGhlciB3ZSd2ZSByZWdpc3RlcmVkIGl0IHdpdGggSW50ZXJjZXB0TWFuYWdlci4KICAgaWYgKCFpbnRlcmNlcHQtPnJlZ2lzdGVyZWQpIHsKLSAgICBkZWxldGUgaW50ZXJjZXB0OwotICB9IGVsc2UgewotICAgIGF1dG8gaXQgPSBpbnRlcmNlcHRfbWFuYWdlci0+aW50ZXJjZXB0cy5maW5kKGludGVyY2VwdC0+aW50ZXJjZXB0X3BpZCk7Ci0gICAgaWYgKGl0ID09IGludGVyY2VwdF9tYW5hZ2VyLT5pbnRlcmNlcHRzLmVuZCgpKSB7Ci0gICAgICBMT0coRkFUQUwpIDw8ICJpbnRlcmNlcHQgY2xvc2UgY2FsbGJhY2sgY2FsbGVkIGFmdGVyIGludGVyY2VwdCB3YXMgYWxyZWFkeSByZW1vdmVkPyI7Ci0gICAgfQotICAgIGlmIChpdC0+c2Vjb25kLmdldCgpICE9IGludGVyY2VwdCkgewotICAgICAgTE9HKEZBVEFMKSA8PCAiaW50ZXJjZXB0IGNsb3NlIGNhbGxiYWNrIGhhcyBkaWZmZXJlbnQgSW50ZXJjZXB0IGZyb20gSW50ZXJjZXB0TWFuYWdlcj8iOwotICAgIH0KLQotICAgIGNvbnN0IGNoYXIqIHJlYXNvbjsKLSAgICBpZiAoKGV2ZW50ICYgRVZfVElNRU9VVCkgIT0gMCkgewotICAgICAgcmVhc29uID0gImR1ZSB0byB0aW1lb3V0IjsKLSAgICB9IGVsc2UgewotICAgICAgcmVhc29uID0gImR1ZSB0byBpbnB1dCI7Ci0gICAgfQotCi0gICAgTE9HKElORk8pIDw8ICJpbnRlcmNlcHQgZm9yIHBpZCAiIDw8IGludGVyY2VwdC0+aW50ZXJjZXB0X3BpZCA8PCAiIGFuZCB0eXBlICIKLSAgICAgICAgICAgICAgPDwgaW50ZXJjZXB0LT5kdW1wX3R5cGUgPDwgIiB0ZXJtaW5hdGVkOiAiIDw8IHJlYXNvbjsKLSAgICBpbnRlcmNlcHRfbWFuYWdlci0+aW50ZXJjZXB0cy5lcmFzZShpdCk7CisgICAgTE9HKFdBUk5JTkcpIDw8ICJpbnRlcmNlcHQgZm9yIHBpZCAiIDw8IGludGVyY2VwdC0+cGlkIDw8ICIgYW5kIHR5cGUgIiA8PCBpbnRlcmNlcHQtPmR1bXBfdHlwZQorICAgICAgICAgICAgICAgICA8PCAiIGNsb3NlZCBiZWZvcmUgYmVpbmcgcmVnaXN0ZXJlZC4iOworICAgIHJldHVybjsKICAgfQorCisgIGNvbnN0IGNoYXIqIHJlYXNvbiA9IChldmVudCAmIEVWX1RJTUVPVVQpID8gImR1ZSB0byB0aW1lb3V0IiA6ICJkdWUgdG8gaW5wdXQiOworICBMT0coSU5GTykgPDwgImludGVyY2VwdCBmb3IgcGlkICIgPDwgaW50ZXJjZXB0LT5waWQgPDwgIiBhbmQgdHlwZSAiIDw8IGludGVyY2VwdC0+ZHVtcF90eXBlCisgICAgICAgICAgICA8PCAiIHRlcm1pbmF0ZWQ6ICIgPDwgcmVhc29uOwogfQogCi1zdGF0aWMgYm9vbCBpc19pbnRlcmNlcHRfcmVxdWVzdF92YWxpZChjb25zdCBJbnRlcmNlcHRSZXF1ZXN0JiByZXF1ZXN0KSB7Ci0gIGlmIChyZXF1ZXN0LnBpZCA8PSAwIHx8IHJlcXVlc3QucGlkID4gc3RkOjpudW1lcmljX2xpbWl0czxwaWRfdD46Om1heCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwordm9pZCBJbnRlcmNlcHRNYW5hZ2VyOjpVbnJlZ2lzdGVyKEludGVyY2VwdCogaW50ZXJjZXB0KSB7CisgIENIRUNLKGludGVyY2VwdC0+cmVnaXN0ZXJlZCk7CisgIGF1dG8gcGlkX2VudHJ5ID0gaW50ZXJjZXB0cy5maW5kKGludGVyY2VwdC0+cGlkKTsKKyAgaWYgKHBpZF9lbnRyeSA9PSBpbnRlcmNlcHRzLmVuZCgpKSB7CisgICAgTE9HKEZBVEFMKSA8PCAiTm8gaW50ZXJjZXB0cyBmb3VuZCBmb3IgcGlkICIgPDwgaW50ZXJjZXB0LT5waWQ7CisgIH0KKyAgYXV0byYgZHVtcF90eXBlX2hhc2ggPSBwaWRfZW50cnktPnNlY29uZDsKKyAgYXV0byBkdW1wX3R5cGVfZW50cnkgPSBkdW1wX3R5cGVfaGFzaC5maW5kKGludGVyY2VwdC0+ZHVtcF90eXBlKTsKKyAgaWYgKGR1bXBfdHlwZV9lbnRyeSA9PSBkdW1wX3R5cGVfaGFzaC5lbmQoKSkgeworICAgIExPRyhGQVRBTCkgPDwgIlVua25vd24gaW50ZXJjZXB0ICIgPDwgaW50ZXJjZXB0LT5waWQgPDwgIiAiIDw8IGludGVyY2VwdC0+ZHVtcF90eXBlOworICB9CisgIGlmIChpbnRlcmNlcHQgIT0gZHVtcF90eXBlX2VudHJ5LT5zZWNvbmQpIHsKKyAgICBMT0coRkFUQUwpIDw8ICJNaXNtYXRjaCBwb2ludGVyIHRyeWluZyB0byB1bnJlZ2lzdGVyIGludGVyY2VwdCAiIDw8IGludGVyY2VwdC0+cGlkIDw8ICIgIgorICAgICAgICAgICAgICAgPDwgaW50ZXJjZXB0LT5kdW1wX3R5cGU7CiAgIH0KIAotICBpZiAocmVxdWVzdC5kdW1wX3R5cGUgPCAwIHx8IHJlcXVlc3QuZHVtcF90eXBlID4ga0RlYnVnZ2VyZEphdmFCYWNrdHJhY2UpIHsKLSAgICByZXR1cm4gZmFsc2U7CisgIGR1bXBfdHlwZV9oYXNoLmVyYXNlKGR1bXBfdHlwZV9lbnRyeSk7CisgIGlmIChkdW1wX3R5cGVfaGFzaC5lbXB0eSgpKSB7CisgICAgaW50ZXJjZXB0cy5lcmFzZShwaWRfZW50cnkpOwogICB9Ci0KLSAgcmV0dXJuIHRydWU7CiB9CiAKIHN0YXRpYyB2b2lkIGludGVyY2VwdF9yZXF1ZXN0X2NiKGV2dXRpbF9zb2NrZXRfdCBzb2NrZmQsIHNob3J0IGV2LCB2b2lkKiBhcmcpIHsKLSAgYXV0byBpbnRlcmNlcHQgPSByZWludGVycHJldF9jYXN0PEludGVyY2VwdCo+KGFyZyk7CisgIHN0ZDo6dW5pcXVlX3B0cjxJbnRlcmNlcHQ+IGludGVyY2VwdChyZWludGVycHJldF9jYXN0PEludGVyY2VwdCo+KGFyZykpOwogICBJbnRlcmNlcHRNYW5hZ2VyKiBpbnRlcmNlcHRfbWFuYWdlciA9IGludGVyY2VwdC0+aW50ZXJjZXB0X21hbmFnZXI7CiAKICAgQ0hFQ0tfRVEoc29ja2ZkLCBpbnRlcmNlcHQtPnNvY2tmZC5nZXQoKSk7CiAKICAgaWYgKChldiAmIEVWX1RJTUVPVVQpICE9IDApIHsKICAgICBMT0coV0FSTklORykgPDwgInRvbWJzdG9uZWQgZGlkbid0IHJlY2VpdmUgSW50ZXJjZXB0UmVxdWVzdCBiZWZvcmUgdGltZW91dCI7Ci0gICAgZ290byBmYWlsOworICAgIHJldHVybjsKICAgfSBlbHNlIGlmICgoZXYgJiBFVl9SRUFEKSA9PSAwKSB7CiAgICAgTE9HKFdBUk5JTkcpIDw8ICJ0b21ic3RvbmVkIHJlY2VpdmVkIHVuZXhwZWN0ZWQgZXZlbnQgb24gaW50ZXJjZXB0IHNvY2tldCI7Ci0gICAgZ290byBmYWlsOworICAgIHJldHVybjsKICAgfQogCi0gIHsKLSAgICB1bmlxdWVfZmQgcmN2X2ZkOwotICAgIEludGVyY2VwdFJlcXVlc3QgaW50ZXJjZXB0X3JlcXVlc3Q7Ci0gICAgc3NpemVfdCByZXN1bHQgPQotICAgICAgICBSZWNlaXZlRmlsZURlc2NyaXB0b3JzKHNvY2tmZCwgJmludGVyY2VwdF9yZXF1ZXN0LCBzaXplb2YoaW50ZXJjZXB0X3JlcXVlc3QpLCAmcmN2X2ZkKTsKKyAgdW5pcXVlX2ZkIHJjdl9mZDsKKyAgSW50ZXJjZXB0UmVxdWVzdCBpbnRlcmNlcHRfcmVxdWVzdDsKKyAgc3NpemVfdCByZXN1bHQgPQorICAgICAgUmVjZWl2ZUZpbGVEZXNjcmlwdG9ycyhzb2NrZmQsICZpbnRlcmNlcHRfcmVxdWVzdCwgc2l6ZW9mKGludGVyY2VwdF9yZXF1ZXN0KSwgJnJjdl9mZCk7CiAKLSAgICBpZiAocmVzdWx0ID09IC0xKSB7Ci0gICAgICBQTE9HKFdBUk5JTkcpIDw8ICJmYWlsZWQgdG8gcmVhZCBmcm9tIGludGVyY2VwdCBzb2NrZXQiOwotICAgICAgZ290byBmYWlsOwotICAgIH0gZWxzZSBpZiAocmVzdWx0ICE9IHNpemVvZihpbnRlcmNlcHRfcmVxdWVzdCkpIHsKLSAgICAgIExPRyhXQVJOSU5HKSA8PCAiaW50ZXJjZXB0IHNvY2tldCByZWNlaXZlZCBzaG9ydCByZWFkIG9mIGxlbmd0aCAiIDw8IHJlc3VsdCA8PCAiIChleHBlY3RlZCAiCi0gICAgICAgICAgICAgICAgICAgPDwgc2l6ZW9mKGludGVyY2VwdF9yZXF1ZXN0KSA8PCAiKSI7Ci0gICAgICBnb3RvIGZhaWw7Ci0gICAgfQotCi0gICAgLy8gTW92ZSB0aGUgcmVjZWl2ZWQgRkQgdG8gdGhlIHVwcGVyIGhhbGYsIGluIG9yZGVyIHRvIG1vcmUgZWFzaWx5IG5vdGljZSBGRCBsZWFrcy4KLSAgICBpbnQgbW92ZWRfZmQgPSBmY250bChyY3ZfZmQuZ2V0KCksIEZfRFVQRkQsIDUxMik7Ci0gICAgaWYgKG1vdmVkX2ZkID09IC0xKSB7Ci0gICAgICBMT0coV0FSTklORykgPDwgImZhaWxlZCB0byBtb3ZlIHJlY2VpdmVkIGZkICgiIDw8IHJjdl9mZC5nZXQoKSA8PCAiKSI7Ci0gICAgICBnb3RvIGZhaWw7Ci0gICAgfQotICAgIHJjdl9mZC5yZXNldChtb3ZlZF9mZCk7Ci0KLSAgICAvLyBXZSB0cnVzdCB0aGUgb3RoZXIgc2lkZSwgc28gb25seSBkbyBtaW5pbWFsIHZhbGlkaXR5IGNoZWNraW5nLgotICAgIGlmICghaXNfaW50ZXJjZXB0X3JlcXVlc3RfdmFsaWQoaW50ZXJjZXB0X3JlcXVlc3QpKSB7Ci0gICAgICBJbnRlcmNlcHRSZXNwb25zZSByZXNwb25zZSA9IHt9OwotICAgICAgcmVzcG9uc2Uuc3RhdHVzID0gSW50ZXJjZXB0U3RhdHVzOjprRmFpbGVkOwotICAgICAgc25wcmludGYocmVzcG9uc2UuZXJyb3JfbWVzc2FnZSwgc2l6ZW9mKHJlc3BvbnNlLmVycm9yX21lc3NhZ2UpLCAiaW52YWxpZCBpbnRlcmNlcHQgcmVxdWVzdCIpOwotICAgICAgVEVNUF9GQUlMVVJFX1JFVFJZKHdyaXRlKHNvY2tmZCwgJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKSk7Ci0gICAgICBnb3RvIGZhaWw7Ci0gICAgfQotCi0gICAgaW50ZXJjZXB0LT5pbnRlcmNlcHRfcGlkID0gaW50ZXJjZXB0X3JlcXVlc3QucGlkOwotICAgIGludGVyY2VwdC0+ZHVtcF90eXBlID0gaW50ZXJjZXB0X3JlcXVlc3QuZHVtcF90eXBlOwotCi0gICAgLy8gQ2hlY2sgaWYgaXQncyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0gICAgaWYgKGludGVyY2VwdF9tYW5hZ2VyLT5pbnRlcmNlcHRzLmNvdW50KGludGVyY2VwdF9yZXF1ZXN0LnBpZCkgPiAwKSB7Ci0gICAgICBJbnRlcmNlcHRSZXNwb25zZSByZXNwb25zZSA9IHt9OwotICAgICAgcmVzcG9uc2Uuc3RhdHVzID0gSW50ZXJjZXB0U3RhdHVzOjprRmFpbGVkQWxyZWFkeVJlZ2lzdGVyZWQ7Ci0gICAgICBzbnByaW50ZihyZXNwb25zZS5lcnJvcl9tZXNzYWdlLCBzaXplb2YocmVzcG9uc2UuZXJyb3JfbWVzc2FnZSksCi0gICAgICAgICAgICAgICAicGlkICUiIFBSSWQzMiAiIGFscmVhZHkgaW50ZXJjZXB0ZWQsIHR5cGUgJWQiLCBpbnRlcmNlcHRfcmVxdWVzdC5waWQsCi0gICAgICAgICAgICAgICBpbnRlcmNlcHRfcmVxdWVzdC5kdW1wX3R5cGUpOwotICAgICAgVEVNUF9GQUlMVVJFX1JFVFJZKHdyaXRlKHNvY2tmZCwgJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKSk7Ci0gICAgICBMT0coV0FSTklORykgPDwgcmVzcG9uc2UuZXJyb3JfbWVzc2FnZTsKLSAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICAvLyBMZXQgdGhlIG90aGVyIHNpZGUga25vdyB0aGF0IHRoZSBpbnRlcmNlcHQgaGFzIGJlZW4gcmVnaXN0ZXJlZCwgbm93IHRoYXQgd2Uga25vdyB3ZSBjYW4ndAotICAgIC8vIGZhaWwuIHRvbWJzdG9uZWQgaXMgc2luZ2xlIHRocmVhZGVkLCBzbyB0aGlzIGlzbid0IHJhY3kuCi0gICAgSW50ZXJjZXB0UmVzcG9uc2UgcmVzcG9uc2UgPSB7fTsKLSAgICByZXNwb25zZS5zdGF0dXMgPSBJbnRlcmNlcHRTdGF0dXM6OmtSZWdpc3RlcmVkOwotICAgIGlmIChURU1QX0ZBSUxVUkVfUkVUUlkod3JpdGUoc29ja2ZkLCAmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpKSA9PSAtMSkgewotICAgICAgUExPRyhXQVJOSU5HKSA8PCAiZmFpbGVkIHRvIG5vdGlmeSBpbnRlcmNlcHRvciBvZiByZWdpc3RyYXRpb24iOwotICAgICAgZ290byBmYWlsOwotICAgIH0KLQotICAgIGludGVyY2VwdC0+b3V0cHV0X2ZkID0gc3RkOjptb3ZlKHJjdl9mZCk7Ci0gICAgaW50ZXJjZXB0X21hbmFnZXItPmludGVyY2VwdHNbaW50ZXJjZXB0X3JlcXVlc3QucGlkXSA9IHN0ZDo6dW5pcXVlX3B0cjxJbnRlcmNlcHQ+KGludGVyY2VwdCk7Ci0gICAgaW50ZXJjZXB0LT5yZWdpc3RlcmVkID0gdHJ1ZTsKLQotICAgIExPRyhJTkZPKSA8PCAicmVnaXN0ZXJlZCBpbnRlcmNlcHQgZm9yIHBpZCAiIDw8IGludGVyY2VwdF9yZXF1ZXN0LnBpZCA8PCAiIGFuZCB0eXBlICIKLSAgICAgICAgICAgICAgPDwgaW50ZXJjZXB0X3JlcXVlc3QuZHVtcF90eXBlOwotCi0gICAgLy8gUmVnaXN0ZXIgYSBkaWZmZXJlbnQgcmVhZCBldmVudCBvbiB0aGUgc29ja2V0IHNvIHRoYXQgd2UgY2FuIHJlbW92ZSBpbnRlcmNlcHRzIGlmIHRoZSBzb2NrZXQKLSAgICAvLyBjbG9zZXMgKGUuZy4gaWYgYSB1c2VyIENUUkwtQydzIHRoZSBwcm9jZXNzIHRoYXQgcmVxdWVzdGVkIHRoZSBpbnRlcmNlcHQpLgotICAgIGV2ZW50X2Fzc2lnbihpbnRlcmNlcHQtPmludGVyY2VwdF9ldmVudCwgaW50ZXJjZXB0X21hbmFnZXItPmJhc2UsIHNvY2tmZCwgRVZfUkVBRCB8IEVWX1RJTUVPVVQsCi0gICAgICAgICAgICAgICAgIGludGVyY2VwdF9jbG9zZV9jYiwgYXJnKTsKLQotICAgIHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQgPSB7LnR2X3NlYyA9IDEwICogYW5kcm9pZDo6YmFzZTo6SHdUaW1lb3V0TXVsdGlwbGllcigpLCAudHZfdXNlYyA9IDB9OwotICAgIGV2ZW50X2FkZChpbnRlcmNlcHQtPmludGVyY2VwdF9ldmVudCwgJnRpbWVvdXQpOworICBpZiAocmVzdWx0ID09IC0xKSB7CisgICAgUExPRyhXQVJOSU5HKSA8PCAiZmFpbGVkIHRvIHJlYWQgZnJvbSBpbnRlcmNlcHQgc29ja2V0IjsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHJlc3VsdCAhPSBzaXplb2YoaW50ZXJjZXB0X3JlcXVlc3QpKSB7CisgICAgTE9HKFdBUk5JTkcpIDw8ICJpbnRlcmNlcHQgc29ja2V0IHJlY2VpdmVkIHNob3J0IHJlYWQgb2YgbGVuZ3RoICIgPDwgcmVzdWx0IDw8ICIgKGV4cGVjdGVkICIKKyAgICAgICAgICAgICAgICAgPDwgc2l6ZW9mKGludGVyY2VwdF9yZXF1ZXN0KSA8PCAiKSI7CisgICAgcmV0dXJuOwogICB9CiAKLSAgcmV0dXJuOworICAvLyBNb3ZlIHRoZSByZWNlaXZlZCBGRCB0byB0aGUgdXBwZXIgaGFsZiwgaW4gb3JkZXIgdG8gbW9yZSBlYXNpbHkgbm90aWNlIEZEIGxlYWtzLgorICBpbnQgbW92ZWRfZmQgPSBmY250bChyY3ZfZmQuZ2V0KCksIEZfRFVQRkQsIDUxMik7CisgIGlmIChtb3ZlZF9mZCA9PSAtMSkgeworICAgIExPRyhXQVJOSU5HKSA8PCAiZmFpbGVkIHRvIG1vdmUgcmVjZWl2ZWQgZmQgKCIgPDwgcmN2X2ZkLmdldCgpIDw8ICIpIjsKKyAgICByZXR1cm47CisgIH0KKyAgcmN2X2ZkLnJlc2V0KG1vdmVkX2ZkKTsKIAotZmFpbDoKLSAgZGVsZXRlIGludGVyY2VwdDsKKyAgLy8gU2VlIGlmIHdlIGNhbiBwcm9wZXJseSByZWdpc3RlciB0aGUgaW50ZXJjZXB0LgorICBJbnRlcmNlcHRSZXNwb25zZSByZXNwb25zZSA9IHt9OworICBpZiAoIWludGVyY2VwdF9tYW5hZ2VyLT5DYW5SZWdpc3RlcihpbnRlcmNlcHRfcmVxdWVzdCwgcmVzcG9uc2UpKSB7CisgICAgVEVNUF9GQUlMVVJFX1JFVFJZKHdyaXRlKHNvY2tmZCwgJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKSk7CisgICAgTE9HKFdBUk5JTkcpIDw8IHJlc3BvbnNlLmVycm9yX21lc3NhZ2U7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gTGV0IHRoZSBvdGhlciBzaWRlIGtub3cgdGhhdCB0aGUgaW50ZXJjZXB0IGhhcyBiZWVuIHJlZ2lzdGVyZWQsIG5vdyB0aGF0IHdlIGtub3cgd2UgY2FuJ3QKKyAgLy8gZmFpbC4gdG9tYnN0b25lZCBpcyBzaW5nbGUgdGhyZWFkZWQsIHNvIHRoaXMgaXNuJ3QgcmFjeS4KKyAgcmVzcG9uc2Uuc3RhdHVzID0gSW50ZXJjZXB0U3RhdHVzOjprUmVnaXN0ZXJlZDsKKyAgaWYgKFRFTVBfRkFJTFVSRV9SRVRSWSh3cml0ZShzb2NrZmQsICZyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSkpID09IC0xKSB7CisgICAgUExPRyhXQVJOSU5HKSA8PCAiZmFpbGVkIHRvIG5vdGlmeSBpbnRlcmNlcHRvciBvZiByZWdpc3RyYXRpb24iOworICAgIHJldHVybjsKKyAgfQorCisgIGludGVyY2VwdC0+cGlkID0gaW50ZXJjZXB0X3JlcXVlc3QucGlkOworICBpbnRlcmNlcHQtPmR1bXBfdHlwZSA9IGludGVyY2VwdF9yZXF1ZXN0LmR1bXBfdHlwZTsKKyAgaW50ZXJjZXB0LT5vdXRwdXRfZmQgPSBzdGQ6Om1vdmUocmN2X2ZkKTsKKyAgaW50ZXJjZXB0X21hbmFnZXItPlJlZ2lzdGVyKGludGVyY2VwdC5nZXQoKSk7CisKKyAgTE9HKElORk8pIDw8ICJyZWdpc3RlcmVkIGludGVyY2VwdCBmb3IgcGlkICIgPDwgaW50ZXJjZXB0X3JlcXVlc3QucGlkIDw8ICIgYW5kIHR5cGUgIgorICAgICAgICAgICAgPDwgaW50ZXJjZXB0X3JlcXVlc3QuZHVtcF90eXBlOworCisgIC8vIFJlZ2lzdGVyIGEgZGlmZmVyZW50IHJlYWQgZXZlbnQgb24gdGhlIHNvY2tldCBzbyB0aGF0IHdlIGNhbiByZW1vdmUgaW50ZXJjZXB0cyBpZiB0aGUgc29ja2V0CisgIC8vIGNsb3NlcyAoZS5nLiBpZiBhIHVzZXIgQ1RSTC1DJ3MgdGhlIHByb2Nlc3MgdGhhdCByZXF1ZXN0ZWQgdGhlIGludGVyY2VwdCkuCisgIGV2ZW50X2Fzc2lnbihpbnRlcmNlcHQtPmludGVyY2VwdF9ldmVudCwgaW50ZXJjZXB0X21hbmFnZXItPmJhc2UsIHNvY2tmZCwgRVZfUkVBRCB8IEVWX1RJTUVPVVQsCisgICAgICAgICAgICAgICBpbnRlcmNlcHRfY2xvc2VfY2IsIGFyZyk7CisKKyAgLy8gSWYgbm8gcmVxdWVzdCBjb21lcyBpbiwgdGhlbiB0aGlzIHdpbGwgY2xvc2UgdGhlIGludGVyY2VwdCBhbmQgZnJlZSB0aGUgcG9pbnRlci4KKyAgc3RydWN0IHRpbWV2YWwgdGltZW91dCA9IHsudHZfc2VjID0gMTAgKiBhbmRyb2lkOjpiYXNlOjpId1RpbWVvdXRNdWx0aXBsaWVyKCksIC50dl91c2VjID0gMH07CisgIGV2ZW50X2FkZChpbnRlcmNlcHQtPmludGVyY2VwdF9ldmVudCwgJnRpbWVvdXQpOworICBpbnRlcmNlcHQucmVsZWFzZSgpOwogfQogCiBzdGF0aWMgdm9pZCBpbnRlcmNlcHRfYWNjZXB0X2NiKGV2Y29ubmxpc3RlbmVyKiBsaXN0ZW5lciwgZXZ1dGlsX3NvY2tldF90IHNvY2tmZCwgc29ja2FkZHIqLCBpbnQsCkBAIC0xODcsNDEgKzE2Niw5NyBAQAogICBldmVudF9hZGQoaW50ZXJjZXB0X2V2ZW50LCAmdGltZW91dCk7CiB9CiAKK0ludGVyY2VwdDo6fkludGVyY2VwdCgpIHsKKyAgZXZlbnRfZnJlZShpbnRlcmNlcHRfZXZlbnQpOworICBpZiAocmVnaXN0ZXJlZCkgeworICAgIENIRUNLKGludGVyY2VwdF9tYW5hZ2VyICE9IG51bGxwdHIpOworICAgIGludGVyY2VwdF9tYW5hZ2VyLT5VbnJlZ2lzdGVyKHRoaXMpOworICB9Cit9CisKIEludGVyY2VwdE1hbmFnZXI6OkludGVyY2VwdE1hbmFnZXIoZXZlbnRfYmFzZSogYmFzZSwgaW50IGludGVyY2VwdF9zb2NrZXQpIDogYmFzZShiYXNlKSB7CiAgIHRoaXMtPmxpc3RlbmVyID0gZXZjb25ubGlzdGVuZXJfbmV3KGJhc2UsIGludGVyY2VwdF9hY2NlcHRfY2IsIHRoaXMsIExFVl9PUFRfQ0xPU0VfT05fRlJFRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmFja2xvZyAqLyAtMSwgaW50ZXJjZXB0X3NvY2tldCk7CiB9CiAKLWJvb2wgZHVtcF90eXBlc19jb21wYXRpYmxlKERlYnVnZ2VyZER1bXBUeXBlIGludGVyY2VwdG9yLCBEZWJ1Z2dlcmREdW1wVHlwZSBkdW1wKSB7Ci0gIGlmIChpbnRlcmNlcHRvciA9PSBkdW1wKSB7Ci0gICAgcmV0dXJuIHRydWU7CitzdGF0aWMgRGVidWdnZXJkRHVtcFR5cGUgY2Fub25pY2FsX2R1bXBfdHlwZShjb25zdCBEZWJ1Z2dlcmREdW1wVHlwZSBkdW1wX3R5cGUpIHsKKyAgLy8ga0RlYnVnZ2VyZFRvbWJzdG9uZSBhbmQga0RlYnVnZ2VyZFRvbWJzdG9uZVByb3RvIHNob3VsZCBiZSB0cmVhdGVkIGFzCisgIC8vIGEgc2luZ2xlIGR1bXBfdHlwZSBmb3IgaW50ZXJjZXB0cyAoa0RlYnVnZ2VyZFRvbWJzdG9uZSkuCisgIGlmIChkdW1wX3R5cGUgPT0ga0RlYnVnZ2VyZFRvbWJzdG9uZVByb3RvKSB7CisgICAgcmV0dXJuIGtEZWJ1Z2dlcmRUb21ic3RvbmU7CiAgIH0KLQotICBpZiAoaW50ZXJjZXB0b3IgPT0ga0RlYnVnZ2VyZFRvbWJzdG9uZSAmJiBkdW1wID09IGtEZWJ1Z2dlcmRUb21ic3RvbmVQcm90bykgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gZHVtcF90eXBlOwogfQogCi1ib29sIEludGVyY2VwdE1hbmFnZXI6OkdldEludGVyY2VwdChwaWRfdCBwaWQsIERlYnVnZ2VyZER1bXBUeXBlIGR1bXBfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCogb3V0X2ZkKSB7Ci0gIGF1dG8gaXQgPSB0aGlzLT5pbnRlcmNlcHRzLmZpbmQocGlkKTsKLSAgaWYgKGl0ID09IHRoaXMtPmludGVyY2VwdHMuZW5kKCkpIHsKK0ludGVyY2VwdCogSW50ZXJjZXB0TWFuYWdlcjo6R2V0KGNvbnN0IHBpZF90IHBpZCwgY29uc3QgRGVidWdnZXJkRHVtcFR5cGUgZHVtcF90eXBlKSB7CisgIGF1dG8gcGlkX2VudHJ5ID0gaW50ZXJjZXB0cy5maW5kKHBpZCk7CisgIGlmIChwaWRfZW50cnkgPT0gaW50ZXJjZXB0cy5lbmQoKSkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgY29uc3QgYXV0byYgZHVtcF90eXBlX2hhc2ggPSBwaWRfZW50cnktPnNlY29uZDsKKyAgYXV0byBkdW1wX3R5cGVfZW50cnkgPSBkdW1wX3R5cGVfaGFzaC5maW5kKGNhbm9uaWNhbF9kdW1wX3R5cGUoZHVtcF90eXBlKSk7CisgIGlmIChkdW1wX3R5cGVfZW50cnkgPT0gZHVtcF90eXBlX2hhc2guZW5kKCkpIHsKKyAgICBpZiAoZHVtcF90eXBlICE9IGtEZWJ1Z2dlcmRBbnlJbnRlcmNlcHQpIHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICAvLyBJZiBkb2luZyBhIGR1bXAgd2l0aCBhbiBhbnkgaW50ZXJjZXB0LCBvbmx5IGFsbG93IGFuIGFueSB0byBtYXRjaAorICAgIC8vIGEgc2luZ2xlIGludGVyY2VwdC4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGR1bXAgdHlwZXMgd2l0aCBpbnRlcmNlcHRzCisgICAgLy8gdGhlbiB0aGVyZSB3b3VsZCBiZSBubyB3YXkgdG8gZmlndXJlIG91dCB3aGljaCB0byB1c2UuCisgICAgaWYgKGR1bXBfdHlwZV9oYXNoLnNpemUoKSAhPSAxKSB7CisgICAgICBMT0coV0FSTklORykgPDwgIkNhbm5vdCBpbnRlcmNlcHQgdXNpbmcga0RlYnVnZ2VyZEFueUludGVyY2VwdDogdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSAiCisgICAgICAgICAgICAgICAgICAgICAgImludGVyY2VwdCByZWdpc3RlcmVkIGZvciBwaWQgIgorICAgICAgICAgICAgICAgICAgIDw8IHBpZDsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBkdW1wX3R5cGVfZW50cnkgPSBkdW1wX3R5cGVfaGFzaC5iZWdpbigpOworICB9CisgIHJldHVybiBkdW1wX3R5cGVfZW50cnktPnNlY29uZDsKK30KKworYm9vbCBJbnRlcmNlcHRNYW5hZ2VyOjpDYW5SZWdpc3Rlcihjb25zdCBJbnRlcmNlcHRSZXF1ZXN0JiByZXF1ZXN0LCBJbnRlcmNlcHRSZXNwb25zZSYgcmVzcG9uc2UpIHsKKyAgaWYgKHJlcXVlc3QucGlkIDw9IDAgfHwgcmVxdWVzdC5waWQgPiBzdGQ6Om51bWVyaWNfbGltaXRzPHBpZF90Pjo6bWF4KCkpIHsKKyAgICByZXNwb25zZS5zdGF0dXMgPSBJbnRlcmNlcHRTdGF0dXM6OmtGYWlsZWQ7CisgICAgc25wcmludGYocmVzcG9uc2UuZXJyb3JfbWVzc2FnZSwgc2l6ZW9mKHJlc3BvbnNlLmVycm9yX21lc3NhZ2UpLAorICAgICAgICAgICAgICJpbnZhbGlkIGludGVyY2VwdCByZXF1ZXN0OiBiYWQgcGlkICUiIFBSSWQzMiwgcmVxdWVzdC5waWQpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAocmVxdWVzdC5kdW1wX3R5cGUgPCAwIHx8IHJlcXVlc3QuZHVtcF90eXBlID4ga0RlYnVnZ2VyZEphdmFCYWNrdHJhY2UpIHsKKyAgICByZXNwb25zZS5zdGF0dXMgPSBJbnRlcmNlcHRTdGF0dXM6OmtGYWlsZWQ7CisgICAgc25wcmludGYocmVzcG9uc2UuZXJyb3JfbWVzc2FnZSwgc2l6ZW9mKHJlc3BvbnNlLmVycm9yX21lc3NhZ2UpLAorICAgICAgICAgICAgICJpbnZhbGlkIGludGVyY2VwdCByZXF1ZXN0OiBiYWQgZHVtcCB0eXBlICVzIiwgZ2V0X2R1bXBfdHlwZV9uYW1lKHJlcXVlc3QuZHVtcF90eXBlKSk7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgaWYgKGR1bXBfdHlwZSA9PSBrRGVidWdnZXJkQW55SW50ZXJjZXB0KSB7Ci0gICAgTE9HKElORk8pIDw8ICJmb3VuZCByZWdpc3RlcmVkIGludGVyY2VwdCBvZiB0eXBlICIgPDwgaXQtPnNlY29uZC0+ZHVtcF90eXBlCi0gICAgICAgICAgICAgIDw8ICIgZm9yIHJlcXVlc3RlZCB0eXBlIGtEZWJ1Z2dlcmRBbnlJbnRlcmNlcHQiOwotICB9IGVsc2UgaWYgKCFkdW1wX3R5cGVzX2NvbXBhdGlibGUoaXQtPnNlY29uZC0+ZHVtcF90eXBlLCBkdW1wX3R5cGUpKSB7Ci0gICAgTE9HKFdBUk5JTkcpIDw8ICJmb3VuZCBub24tbWF0Y2hpbmcgaW50ZXJjZXB0IG9mIHR5cGUgIiA8PCBpdC0+c2Vjb25kLT5kdW1wX3R5cGUKLSAgICAgICAgICAgICAgICAgPDwgIiBmb3IgcmVxdWVzdGVkIHR5cGU6ICIgPDwgZHVtcF90eXBlOworICBpZiAoR2V0KHJlcXVlc3QucGlkLCByZXF1ZXN0LmR1bXBfdHlwZSkgIT0gbnVsbHB0cikgeworICAgIHJlc3BvbnNlLnN0YXR1cyA9IEludGVyY2VwdFN0YXR1czo6a0ZhaWxlZEFscmVhZHlSZWdpc3RlcmVkOworICAgIHNucHJpbnRmKHJlc3BvbnNlLmVycm9yX21lc3NhZ2UsIHNpemVvZihyZXNwb25zZS5lcnJvcl9tZXNzYWdlKSwKKyAgICAgICAgICAgICAicGlkICUiIFBSSWQzMiAiIGFscmVhZHkgcmVnaXN0ZXJlZCwgdHlwZSAlcyIsIHJlcXVlc3QucGlkLAorICAgICAgICAgICAgIGdldF9kdW1wX3R5cGVfbmFtZShyZXF1ZXN0LmR1bXBfdHlwZSkpOwogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIGF1dG8gaW50ZXJjZXB0ID0gc3RkOjptb3ZlKGl0LT5zZWNvbmQpOwotICB0aGlzLT5pbnRlcmNlcHRzLmVyYXNlKGl0KTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgSW50ZXJjZXB0TWFuYWdlcjo6UmVnaXN0ZXIoSW50ZXJjZXB0KiBpbnRlcmNlcHQpIHsKKyAgQ0hFQ0soIWludGVyY2VwdC0+cmVnaXN0ZXJlZCk7CisgIGF1dG8mIGR1bXBfdHlwZV9oYXNoID0gaW50ZXJjZXB0c1tpbnRlcmNlcHQtPnBpZF07CisgIGR1bXBfdHlwZV9oYXNoW2Nhbm9uaWNhbF9kdW1wX3R5cGUoaW50ZXJjZXB0LT5kdW1wX3R5cGUpXSA9IGludGVyY2VwdDsKKyAgaW50ZXJjZXB0LT5yZWdpc3RlcmVkID0gdHJ1ZTsKK30KKworYm9vbCBJbnRlcmNlcHRNYW5hZ2VyOjpGaW5kSW50ZXJjZXB0KHBpZF90IHBpZCwgRGVidWdnZXJkRHVtcFR5cGUgZHVtcF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCogb3V0X2ZkKSB7CisgIEludGVyY2VwdCogaW50ZXJjZXB0ID0gR2V0KHBpZCwgZHVtcF90eXBlKTsKKyAgaWYgKGludGVyY2VwdCA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKGR1bXBfdHlwZSAhPSBpbnRlcmNlcHQtPmR1bXBfdHlwZSkgeworICAgIExPRyhJTkZPKSA8PCAiZm91bmQgcmVnaXN0ZXJlZCBpbnRlcmNlcHQgb2YgdHlwZSAiIDw8IGludGVyY2VwdC0+ZHVtcF90eXBlCisgICAgICAgICAgICAgIDw8ICIgZm9yIHJlcXVlc3RlZCB0eXBlICIgPDwgZHVtcF90eXBlOworICB9CiAKICAgTE9HKElORk8pIDw8ICJmb3VuZCBpbnRlcmNlcHQgZmQgIiA8PCBpbnRlcmNlcHQtPm91dHB1dF9mZC5nZXQoKSA8PCAiIGZvciBwaWQgIiA8PCBwaWQKICAgICAgICAgICAgIDw8ICIgYW5kIHR5cGUgIiA8PCBpbnRlcmNlcHQtPmR1bXBfdHlwZTsKQEAgLTIzMCw1ICsyNjUsOCBAQAogICBURU1QX0ZBSUxVUkVfUkVUUlkod3JpdGUoaW50ZXJjZXB0LT5zb2NrZmQsICZyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSkpOwogICAqb3V0X2ZkID0gc3RkOjptb3ZlKGludGVyY2VwdC0+b3V0cHV0X2ZkKTsKIAorICAvLyBEZWxldGUgdGhlIGludGVyY2VwdCBkYXRhLCB3aGljaCB3aWxsIHVucmVnaXN0ZXIgdGhlIGludGVyY2VwdCBhbmQgcmVtb3ZlIHRoZSB0aW1lb3V0IGV2ZW50LgorICBkZWxldGUgaW50ZXJjZXB0OworCiAgIHJldHVybiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL3RvbWJzdG9uZWQvaW50ZXJjZXB0X21hbmFnZXIuaCBiL2RlYnVnZ2VyZC90b21ic3RvbmVkL2ludGVyY2VwdF9tYW5hZ2VyLmgKaW5kZXggYTExZDU2NS4uZGMxM2FhOSAxMDA2NDQKLS0tIGEvZGVidWdnZXJkL3RvbWJzdG9uZWQvaW50ZXJjZXB0X21hbmFnZXIuaAorKysgYi9kZWJ1Z2dlcmQvdG9tYnN0b25lZC9pbnRlcmNlcHRfbWFuYWdlci5oCkBAIC0yOCwxNyArMjgsMTcgQEAKICNpbmNsdWRlICJkdW1wX3R5cGUuaCIKIAogc3RydWN0IEludGVyY2VwdE1hbmFnZXI7CitzdHJ1Y3QgSW50ZXJjZXB0UmVxdWVzdDsKK3N0cnVjdCBJbnRlcmNlcHRSZXNwb25zZTsKIAogc3RydWN0IEludGVyY2VwdCB7Ci0gIH5JbnRlcmNlcHQoKSB7Ci0gICAgZXZlbnRfZnJlZShpbnRlcmNlcHRfZXZlbnQpOwotICB9CisgIH5JbnRlcmNlcHQoKTsKIAogICBJbnRlcmNlcHRNYW5hZ2VyKiBpbnRlcmNlcHRfbWFuYWdlciA9IG51bGxwdHI7CiAgIGV2ZW50KiBpbnRlcmNlcHRfZXZlbnQgPSBudWxscHRyOwogICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgc29ja2ZkOwogCi0gIHBpZF90IGludGVyY2VwdF9waWQgPSAtMTsKKyAgcGlkX3QgcGlkID0gLTE7CiAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBvdXRwdXRfZmQ7CiAgIGJvb2wgcmVnaXN0ZXJlZCA9IGZhbHNlOwogICBEZWJ1Z2dlcmREdW1wVHlwZSBkdW1wX3R5cGUgPSBrRGVidWdnZXJkTmF0aXZlQmFja3RyYWNlOwpAQCAtNDYsMTIgKzQ2LDE3IEBACiAKIHN0cnVjdCBJbnRlcmNlcHRNYW5hZ2VyIHsKICAgZXZlbnRfYmFzZSogYmFzZTsKLSAgc3RkOjp1bm9yZGVyZWRfbWFwPHBpZF90LCBzdGQ6OnVuaXF1ZV9wdHI8SW50ZXJjZXB0Pj4gaW50ZXJjZXB0czsKKyAgc3RkOjp1bm9yZGVyZWRfbWFwPHBpZF90LCBzdGQ6OnVub3JkZXJlZF9tYXA8RGVidWdnZXJkRHVtcFR5cGUsIEludGVyY2VwdCo+PiBpbnRlcmNlcHRzOwogICBldmNvbm5saXN0ZW5lciogbGlzdGVuZXIgPSBudWxscHRyOwogCiAgIEludGVyY2VwdE1hbmFnZXIoZXZlbnRfYmFzZSogX05vbm51bGwgYmFzZSwgaW50IGludGVyY2VwdF9zb2NrZXQpOwogICBJbnRlcmNlcHRNYW5hZ2VyKEludGVyY2VwdE1hbmFnZXImIGNvcHkpID0gZGVsZXRlOwogICBJbnRlcmNlcHRNYW5hZ2VyKEludGVyY2VwdE1hbmFnZXImJiBtb3ZlKSA9IGRlbGV0ZTsKIAotICBib29sIEdldEludGVyY2VwdChwaWRfdCBwaWQsIERlYnVnZ2VyZER1bXBUeXBlIGR1bXBfdHlwZSwgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkKiBvdXRfZmQpOworICBib29sIENhblJlZ2lzdGVyKGNvbnN0IEludGVyY2VwdFJlcXVlc3QmIHJlcXVlc3QsIEludGVyY2VwdFJlc3BvbnNlJiByZXNwb25zZSk7CisgIEludGVyY2VwdCogR2V0KGNvbnN0IHBpZF90IHBpZCwgY29uc3QgRGVidWdnZXJkRHVtcFR5cGUgZHVtcF90eXBlKTsKKyAgdm9pZCBSZWdpc3RlcihJbnRlcmNlcHQqIGludGVyY2VwdCk7CisgIHZvaWQgVW5yZWdpc3RlcihJbnRlcmNlcHQqIGludGVyY2VwdCk7CisKKyAgYm9vbCBGaW5kSW50ZXJjZXB0KHBpZF90IHBpZCwgRGVidWdnZXJkRHVtcFR5cGUgZHVtcF90eXBlLCBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQqIG91dF9mZCk7CiB9OwpkaWZmIC0tZ2l0IGEvZGVidWdnZXJkL3RvbWJzdG9uZWQvdG9tYnN0b25lZC5jcHAgYi9kZWJ1Z2dlcmQvdG9tYnN0b25lZC90b21ic3RvbmVkLmNwcAppbmRleCA1MDU1OGY3Li4yYzcyMzc5IDEwMDY0NAotLS0gYS9kZWJ1Z2dlcmQvdG9tYnN0b25lZC90b21ic3RvbmVkLmNwcAorKysgYi9kZWJ1Z2dlcmQvdG9tYnN0b25lZC90b21ic3RvbmVkLmNwcApAQCAtNjEsNyArNjEsNiBAQAogCiBzdHJ1Y3QgQ3Jhc2hBcnRpZmFjdCB7CiAgIHVuaXF1ZV9mZCBmZDsKLSAgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gdGVtcG9yYXJ5X3BhdGg7CiAKICAgc3RhdGljIENyYXNoQXJ0aWZhY3QgZGV2bnVsbCgpIHsKICAgICBDcmFzaEFydGlmYWN0IHJlc3VsdDsKQEAgLTk3LDcgKzk2LDcgQEAKIGNsYXNzIENyYXNoUXVldWUgewogIHB1YmxpYzoKICAgQ3Jhc2hRdWV1ZShjb25zdCBzdGQ6OnN0cmluZyYgZGlyX3BhdGgsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlX25hbWVfcHJlZml4LCBzaXplX3QgbWF4X2FydGlmYWN0cywKLSAgICAgICAgICAgICBzaXplX3QgbWF4X2NvbmN1cnJlbnRfZHVtcHMsIGJvb2wgc3VwcG9ydHNfcHJvdG8pCisgICAgICAgICAgICAgc2l6ZV90IG1heF9jb25jdXJyZW50X2R1bXBzLCBib29sIHN1cHBvcnRzX3Byb3RvLCBib29sIHdvcmxkX3JlYWRhYmxlKQogICAgICAgOiBmaWxlX25hbWVfcHJlZml4XyhmaWxlX25hbWVfcHJlZml4KSwKICAgICAgICAgZGlyX3BhdGhfKGRpcl9wYXRoKSwKICAgICAgICAgZGlyX2ZkXyhvcGVuKGRpcl9wYXRoLmNfc3RyKCksIE9fRElSRUNUT1JZIHwgT19SRE9OTFkgfCBPX0NMT0VYRUMpKSwKQEAgLTEwNSw3ICsxMDQsOCBAQAogICAgICAgICBuZXh0X2FydGlmYWN0XygwKSwKICAgICAgICAgbWF4X2NvbmN1cnJlbnRfZHVtcHNfKG1heF9jb25jdXJyZW50X2R1bXBzKSwKICAgICAgICAgbnVtX2NvbmN1cnJlbnRfZHVtcHNfKDApLAotICAgICAgICBzdXBwb3J0c19wcm90b18oc3VwcG9ydHNfcHJvdG8pIHsKKyAgICAgICAgc3VwcG9ydHNfcHJvdG9fKHN1cHBvcnRzX3Byb3RvKSwKKyAgICAgICAgd29ybGRfcmVhZGFibGVfKHdvcmxkX3JlYWRhYmxlKSB7CiAgICAgaWYgKGRpcl9mZF8gPT0gLTEpIHsKICAgICAgIFBMT0coRkFUQUwpIDw8ICJmYWlsZWQgdG8gb3BlbiBkaXJlY3Rvcnk6ICIgPDwgZGlyX3BhdGg7CiAgICAgfQpAQCAtMTI4LDE0ICsxMjgsMTYgQEAKICAgc3RhdGljIENyYXNoUXVldWUqIGZvcl90b21ic3RvbmVzKCkgewogICAgIHN0YXRpYyBDcmFzaFF1ZXVlIHF1ZXVlKCIvZGF0YS90b21ic3RvbmVzIiwgInRvbWJzdG9uZV8iIC8qIGZpbGVfbmFtZV9wcmVmaXggKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0SW50UHJvcGVydHkoInRvbWJzdG9uZWQubWF4X3RvbWJzdG9uZV9jb3VudCIsIDMyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC8qIG1heF9jb25jdXJyZW50X2R1bXBzICovLCB0cnVlIC8qIHN1cHBvcnRzX3Byb3RvICovKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC8qIG1heF9jb25jdXJyZW50X2R1bXBzICovLCB0cnVlIC8qIHN1cHBvcnRzX3Byb3RvICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogd29ybGRfcmVhZGFibGUgKi8pOwogICAgIHJldHVybiAmcXVldWU7CiAgIH0KIAogICBzdGF0aWMgQ3Jhc2hRdWV1ZSogZm9yX2FucnMoKSB7CiAgICAgc3RhdGljIENyYXNoUXVldWUgcXVldWUoIi9kYXRhL2FuciIsICJ0cmFjZV8iIC8qIGZpbGVfbmFtZV9wcmVmaXggKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0SW50UHJvcGVydHkoInRvbWJzdG9uZWQubWF4X2Fucl9jb3VudCIsIDY0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA0IC8qIG1heF9jb25jdXJyZW50X2R1bXBzICovLCBmYWxzZSAvKiBzdXBwb3J0c19wcm90byAqLyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAvKiBtYXhfY29uY3VycmVudF9kdW1wcyAqLywgZmFsc2UgLyogc3VwcG9ydHNfcHJvdG8gKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogd29ybGRfcmVhZGFibGUgKi8pOwogICAgIHJldHVybiAmcXVldWU7CiAgIH0KIApAQCAtMTQ1LDE5ICsxNDcsMTggQEAKICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBwYXRoOwogICAgIHJlc3VsdC5mZC5yZXNldChvcGVuYXQoZGlyX2ZkXywgIi4iLCBPX1dST05MWSB8IE9fQVBQRU5EIHwgT19UTVBGSUxFIHwgT19DTE9FWEVDLCAwNjYwKSk7CiAgICAgaWYgKHJlc3VsdC5mZCA9PSAtMSkgewotICAgICAgLy8gV2UgbWlnaHQgbm90IGhhdmUgT19UTVBGSUxFLiBUcnkgY3JlYXRpbmcgd2l0aCBhbiBhcmJpdHJhcnkgZmlsZW5hbWUgaW5zdGVhZC4KLSAgICAgIHN0YXRpYyBzaXplX3QgY291bnRlciA9IDA7Ci0gICAgICBzdGQ6OnN0cmluZyB0bXBfZmlsZW5hbWUgPSBTdHJpbmdQcmludGYoIi50ZW1wb3JhcnklenUiLCBjb3VudGVyKyspOwotICAgICAgcmVzdWx0LmZkLnJlc2V0KG9wZW5hdChkaXJfZmRfLCB0bXBfZmlsZW5hbWUuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT19XUk9OTFkgfCBPX0FQUEVORCB8IE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19DTE9FWEVDLCAwNjYwKSk7Ci0gICAgICBpZiAocmVzdWx0LmZkID09IC0xKSB7Ci0gICAgICAgIFBMT0coRkFUQUwpIDw8ICJmYWlsZWQgdG8gY3JlYXRlIHRlbXBvcmFyeSB0b21ic3RvbmUgaW4gIiA8PCBkaXJfcGF0aF87Ci0gICAgICB9Ci0KLSAgICAgIHJlc3VsdC50ZW1wb3JhcnlfcGF0aCA9IHN0ZDo6bW92ZSh0bXBfZmlsZW5hbWUpOworICAgICAgUExPRyhGQVRBTCkgPDwgImZhaWxlZCB0byBjcmVhdGUgdGVtcG9yYXJ5IHRvbWJzdG9uZSBpbiAiIDw8IGRpcl9wYXRoXzsKICAgICB9CiAKLSAgICByZXR1cm4gc3RkOjptb3ZlKHJlc3VsdCk7CisgICAgaWYgKHdvcmxkX3JlYWRhYmxlXykgeworICAgICAgLy8gV2UgbmVlZCB0byBmY2htb2RhdCBhZnRlciBjcmVhdGluZyB0byBhdm9pZCBnZXR0aW5nIHRoZSB1bWFzayBhcHBsaWVkLgorICAgICAgc3RkOjpzdHJpbmcgZmRfcGF0aCA9IFN0cmluZ1ByaW50ZigiL3Byb2Mvc2VsZi9mZC8lZCIsIHJlc3VsdC5mZC5nZXQoKSk7CisgICAgICBpZiAoZmNobW9kYXQoZGlyX2ZkXywgZmRfcGF0aC5jX3N0cigpLCAwNjY0LCAwKSAhPSAwKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gbWFrZSB0b21ic3RvbmUgd29ybGQtcmVhZGFibGUiOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CiAgIH0KIAogICBzdGQ6Om9wdGlvbmFsPENyYXNoT3V0cHV0PiBnZXRfb3V0cHV0KERlYnVnZ2VyZER1bXBUeXBlIGR1bXBfdHlwZSkgewpAQCAtMjY2LDYgKzI2Nyw3IEBACiAgIHNpemVfdCBudW1fY29uY3VycmVudF9kdW1wc187CiAKICAgYm9vbCBzdXBwb3J0c19wcm90b187CisgIGJvb2wgd29ybGRfcmVhZGFibGVfOwogCiAgIHN0ZDo6ZGVxdWU8c3RkOjp1bmlxdWVfcHRyPENyYXNoPj4gcXVldWVkX3JlcXVlc3RzXzsKIApAQCAtMjgzLDkgKzI4NSw3IEBACiAKIHN0YXRpYyB2b2lkIHBlcmZvcm1fcmVxdWVzdChzdGQ6OnVuaXF1ZV9wdHI8Q3Jhc2g+IGNyYXNoKSB7CiAgIHVuaXF1ZV9mZCBvdXRwdXRfZmQ7Ci0gIGJvb2wgaW50ZXJjZXB0ZWQgPQotICAgICAgaW50ZXJjZXB0X21hbmFnZXItPkdldEludGVyY2VwdChjcmFzaC0+Y3Jhc2hfcGlkLCBjcmFzaC0+Y3Jhc2hfdHlwZSwgJm91dHB1dF9mZCk7Ci0gIGlmIChpbnRlcmNlcHRlZCkgeworICBpZiAoaW50ZXJjZXB0X21hbmFnZXItPkZpbmRJbnRlcmNlcHQoY3Jhc2gtPmNyYXNoX3BpZCwgY3Jhc2gtPmNyYXNoX3R5cGUsICZvdXRwdXRfZmQpKSB7CiAgICAgaWYgKGNyYXNoLT5jcmFzaF90eXBlID09IGtEZWJ1Z2dlcmRUb21ic3RvbmVQcm90bykgewogICAgICAgY3Jhc2gtPm91dHB1dC5wcm90byA9IENyYXNoQXJ0aWZhY3Q6OmRldm51bGwoKTsKICAgICB9CkBAIC00MTksNiArNDE5LDcgQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAorICAvLyBUaGlzIGZkIGlzIGNyZWF0ZWQgaW5zaWRlIG9mIGRpcmZkIGluIENyYXNoUXVldWU6OmNyZWF0ZV90ZW1wb3JhcnlfZmlsZS4KICAgc3RkOjpzdHJpbmcgZmRfcGF0aCA9IFN0cmluZ1ByaW50ZigiL3Byb2Mvc2VsZi9mZC8lZCIsIGZkLmdldCgpKTsKICAgcmMgPSBsaW5rYXQoQVRfRkRDV0QsIGZkX3BhdGguY19zdHIoKSwgZGlyZmQuZ2V0KCksIHBhdGguY19zdHIoKSwgQVRfU1lNTElOS19GT0xMT1cpOwogICBpZiAocmMgIT0gMCkgewpAQCAtNDU1LDE3ICs0NTYsNiBAQAogCiAgIENyYXNoQXJ0aWZhY3RQYXRocyBwYXRocyA9IHF1ZXVlLT5nZXRfbmV4dF9hcnRpZmFjdF9wYXRocygpOwogCi0gIGlmIChyZW5hbWVfdG9tYnN0b25lX2ZkKGNyYXNoLT5vdXRwdXQudGV4dC5mZCwgcXVldWUtPmRpcl9mZCgpLCBwYXRocy50ZXh0KSkgewotICAgIGlmIChjcmFzaC0+Y3Jhc2hfdHlwZSA9PSBrRGVidWdnZXJkSmF2YUJhY2t0cmFjZSkgewotICAgICAgTE9HKEVSUk9SKSA8PCAiVHJhY2VzIGZvciBwaWQgIiA8PCBjcmFzaC0+Y3Jhc2hfcGlkIDw8ICIgd3JpdHRlbiB0bzogIiA8PCBwYXRocy50ZXh0OwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBOT1RFOiBTZXZlcmFsIHRvb2xzIHBhcnNlIHRoaXMgbG9nIG1lc3NhZ2UgdG8gZmlndXJlIG91dCB3aGVyZSB0aGUKLSAgICAgIC8vIHRvbWJzdG9uZSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBuYXRpdmUgY3Jhc2ggd2FzIHdyaXR0ZW4uIEFueSBjaGFuZ2VzCi0gICAgICAvLyB0byB0aGlzIG1lc3NhZ2UgbXVzdCBiZSBjYXJlZnVsbHkgY29uc2lkZXJlZC4KLSAgICAgIExPRyhFUlJPUikgPDwgIlRvbWJzdG9uZSB3cml0dGVuIHRvOiAiIDw8IHBhdGhzLnRleHQ7Ci0gICAgfQotICB9Ci0KICAgaWYgKGNyYXNoLT5vdXRwdXQucHJvdG8gJiYgY3Jhc2gtPm91dHB1dC5wcm90by0+ZmQgIT0gLTEpIHsKICAgICBpZiAoIXBhdGhzLnByb3RvKSB7CiAgICAgICBMT0coRVJST1IpIDw8ICJtaXNzaW5nIHBhdGggZm9yIHByb3RvIHRvbWJzdG9uZSI7CkBAIC00NzQsMTcgKzQ2NCwxNCBAQAogICAgIH0KICAgfQogCi0gIC8vIElmIHdlIGRvbid0IGhhdmUgT19UTVBGSUxFLCB3ZSBuZWVkIHRvIGNsZWFuIHVwIGFmdGVyIG91cnNlbHZlcy4KLSAgaWYgKGNyYXNoLT5vdXRwdXQudGV4dC50ZW1wb3JhcnlfcGF0aCkgewotICAgIHJjID0gdW5saW5rYXQocXVldWUtPmRpcl9mZCgpLmdldCgpLCBjcmFzaC0+b3V0cHV0LnRleHQudGVtcG9yYXJ5X3BhdGgtPmNfc3RyKCksIDApOwotICAgIGlmIChyYyAhPSAwKSB7Ci0gICAgICBQTE9HKEVSUk9SKSA8PCAiZmFpbGVkIHRvIHVubGluayB0ZW1wb3JhcnkgdG9tYnN0b25lIGF0ICIgPDwgcGF0aHMudGV4dDsKLSAgICB9Ci0gIH0KLSAgaWYgKGNyYXNoLT5vdXRwdXQucHJvdG8gJiYgY3Jhc2gtPm91dHB1dC5wcm90by0+dGVtcG9yYXJ5X3BhdGgpIHsKLSAgICByYyA9IHVubGlua2F0KHF1ZXVlLT5kaXJfZmQoKS5nZXQoKSwgY3Jhc2gtPm91dHB1dC5wcm90by0+dGVtcG9yYXJ5X3BhdGgtPmNfc3RyKCksIDApOwotICAgIGlmIChyYyAhPSAwKSB7Ci0gICAgICBQTE9HKEVSUk9SKSA8PCAiZmFpbGVkIHRvIHVubGluayB0ZW1wb3JhcnkgcHJvdG8gdG9tYnN0b25lIjsKKyAgaWYgKHJlbmFtZV90b21ic3RvbmVfZmQoY3Jhc2gtPm91dHB1dC50ZXh0LmZkLCBxdWV1ZS0+ZGlyX2ZkKCksIHBhdGhzLnRleHQpKSB7CisgICAgaWYgKGNyYXNoLT5jcmFzaF90eXBlID09IGtEZWJ1Z2dlcmRKYXZhQmFja3RyYWNlKSB7CisgICAgICBMT0coRVJST1IpIDw8ICJUcmFjZXMgZm9yIHBpZCAiIDw8IGNyYXNoLT5jcmFzaF9waWQgPDwgIiB3cml0dGVuIHRvOiAiIDw8IHBhdGhzLnRleHQ7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5PVEU6IFNldmVyYWwgdG9vbHMgcGFyc2UgdGhpcyBsb2cgbWVzc2FnZSB0byBmaWd1cmUgb3V0IHdoZXJlIHRoZQorICAgICAgLy8gdG9tYnN0b25lIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIG5hdGl2ZSBjcmFzaCB3YXMgd3JpdHRlbi4gQW55IGNoYW5nZXMKKyAgICAgIC8vIHRvIHRoaXMgbWVzc2FnZSBtdXN0IGJlIGNhcmVmdWxseSBjb25zaWRlcmVkLgorICAgICAgTE9HKEVSUk9SKSA8PCAiVG9tYnN0b25lIHdyaXR0ZW4gdG86ICIgPDwgcGF0aHMudGV4dDsKICAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2Zhc3Rib290L0FuZHJvaWQuYnAgYi9mYXN0Ym9vdC9BbmRyb2lkLmJwCmluZGV4IDc3OTRjNGIuLmQzZTA1ODEgMTAwNjQ0Ci0tLSBhL2Zhc3Rib290L0FuZHJvaWQuYnAKKysrIGIvZmFzdGJvb3QvQW5kcm9pZC5icApAQCAtMTcwLDcgKzE3MCw3IEBACiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmZhc3Rib290QDEuMSIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmZhc3Rib290LVYxLW5kayIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmhlYWx0aEAyLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5oZWFsdGgtVjItbmRrIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuaGVhbHRoLVYzLW5kayIsCiAgICAgICAgICJsaWJhc3luY2lvIiwKICAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliYmluZGVyX25kayIsCkBAIC0xODYsMjEgKzE4NiwyMSBAQAogICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAogICAgICAgICAibGlic3BhcnNlIiwKICAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnNlbGludXgiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5oZWFsdGgtdHJhbnNsYXRlLW5kayIsCi0gICAgICAgICJsaWJjKytmcyIsCiAgICAgICAgICJsaWJoZWFsdGhoYWx1dGlscyIsCiAgICAgICAgICJsaWJoZWFsdGhzaGltIiwKICAgICAgICAgImxpYmZhc3Rib290c2hpbSIsCiAgICAgICAgICJsaWJzbmFwc2hvdF9jb3ciLAogICAgICAgICAibGlibHo0IiwKKyAgICAgICAgImxpYnpzdGQiLAogICAgICAgICAibGlic25hcHNob3Rfbm9iaW5kZXIiLAogICAgICAgICAidXBkYXRlX21ldGFkYXRhLXByb3RvcyIsCiAgICAgICAgICJsaWJ1cmluZyIsCiAgICAgXSwKLSAgICBpbmNsdWRlX2RpcnM6IFsiYmlvbmljL2xpYmMva2VybmVsIl0sCiAKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAiYXZiX2hlYWRlcnMiLApAQCAtNDE1LDcgKzQxNSw2IEBACiAgICAgc3JjczogWyJ2ZW5kb3JfYm9vdF9pbWdfdXRpbHNfdGVzdC5jcHAiXSwKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGliYmFzZSIsCi0gICAgICAgICJsaWJjKytmcyIsCiAgICAgICAgICJsaWJmYXN0Ym9vdCIsCiAgICAgICAgICJsaWJnbW9jayIsCiAgICAgICAgICJsaWJsb2ciLApAQCAtNDMwLDYgKzQyOSw3IEBACiAgICAgXSwKICAgICBkYXRhOiBbCiAgICAgICAgICI6ZmFzdGJvb3RfdGVzdF9kdGIiLAorICAgICAgICAiOmZhc3Rib290X3Rlc3RfZHRiX3JlcGxhY2UiLAogICAgICAgICAiOmZhc3Rib290X3Rlc3RfYm9vdGNvbmZpZyIsCiAgICAgICAgICI6ZmFzdGJvb3RfdGVzdF92ZW5kb3JfcmFtZGlza19ub25lIiwKICAgICAgICAgIjpmYXN0Ym9vdF90ZXN0X3ZlbmRvcl9yYW1kaXNrX3BsYXRmb3JtIiwKQEAgLTQ0NSwzICs0NDUsMTQgQEAKICAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKIH0KKworcHl0aG9uX3Rlc3RfaG9zdCB7CisgICAgbmFtZTogImZhc3Rib290X2ludGVncmF0aW9uX3Rlc3QiLAorICAgIG1haW46ICJ0ZXN0X2Zhc3Rib290LnB5IiwKKyAgICBzcmNzOiBbInRlc3RfZmFzdGJvb3QucHkiXSwKKyAgICBkYXRhOiBbIjpmYXN0Ym9vdCJdLAorICAgIHRlc3RfY29uZmlnOiAiZmFzdGJvb3RfaW50ZWdyYXRpb25fdGVzdC54bWwiLAorICAgIHRlc3Rfb3B0aW9uczogeworICAgICAgICB1bml0X3Rlc3Q6IGZhbHNlLAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9mYXN0Ym9vdC9SRUFETUUubWQgYi9mYXN0Ym9vdC9SRUFETUUubWQKaW5kZXggNjNkYjVjMy4uNjk5NmQ0YSAxMDA2NDQKLS0tIGEvZmFzdGJvb3QvUkVBRE1FLm1kCisrKyBiL2Zhc3Rib290L1JFQURNRS5tZApAQCAtMjUsNyArMjUsNyBAQAogIyMgVHJhbnNwb3J0IGFuZCBGcmFtaW5nCiAKIDEuIEhvc3Qgc2VuZHMgYSBjb21tYW5kLCB3aGljaCBpcyBhbiBhc2NpaSBzdHJpbmcgaW4gYSBzaW5nbGUKLSAgIHBhY2tldCBubyBncmVhdGVyIHRoYW4gNjQgYnl0ZXMuCisgICBwYWNrZXQgbm8gZ3JlYXRlciB0aGFuIDQwOTYgYnl0ZXMuCiAKIDIuIENsaWVudCByZXNwb25zZSB3aXRoIGEgc2luZ2xlIHBhY2tldCBubyBncmVhdGVyIHRoYW4gMjU2IGJ5dGVzLgogICAgVGhlIGZpcnN0IGZvdXIgYnl0ZXMgb2YgdGhlIHJlc3BvbnNlIGFyZSAiT0tBWSIsICJGQUlMIiwgIkRBVEEiLApAQCAtMTY1LDYgKzE2NSw0MyBAQAogICAgICAgICAgICAgICAgICAgICAgICB1c2luZyB0aGUgbmV3IGJvb3Rsb2FkZXIuCiAKIAorIyMgRmxhc2hpbmcgTG9naWMKKworRmFzdGJvb3QgYmluYXJ5IHdpbGwgZm9sbG93IGRpcmVjdGlvbnMgbGlzdGVkIG91dCBmYXN0Ym9vdC1pbmZvLnR4dAorYnVpbGQgYXJ0aWZhY3QgZm9yIGZhc3Rib290IGZsYXNoYWxsICYmIGZhc3Rib290IHVwZGF0ZSBjb21hbW5kcy4KK1RoaXMgYnVpbGQgYXJ0aWZhY3Qgd2lsbCBsaXZlIGluc2lkZSBvZiBBTkRST0lEX1BST0RVQ1RfT1VUICYmCit0YXJnZXRfZmlsZXNfcGFja2FnZSAmJiB1cGRhdGVwYWNrYWdlLgorCisKK1RoZSBjdXJyZW50bHkgZGVmaW5lZCBjb21tYW5kcyBhcmU6CisKKyAgICBmbGFzaCAlcyAgICAgICAgICAgRmxhc2ggYSBnaXZlbiBwYXJ0aXRpb24uIE9wdGlvbmFsIGFyZ3VtZW50cyBpbmNsdWRlCisgICAgICAgICAgICAgICAgICAgICAgIC0tc2xvdC1vdGhlciwge2ZpbGVuYW1lX3BhdGh9LCAtLWFwcGx5LXZibWV0YQorCisgICAgcmVib290ICVzICAgICAgICAgIFJlYm9vdCB0byBlaXRoZXIgYm9vdGxvYWRlciBvciBmYXN0Ym9vdGQKKworICAgIHVwZGF0ZS1zdXBlciAgICAgICBVcGRhdGVzIHRoZSBzdXBlciBwYXJ0aXRpb24KKworICAgIGlmLXdpcGUgICAgICAgICAgICBDb25kaXRpb25hbGx5IHJ1biBzb21lIG90aGVyIGZ1bmN0aW9uYWxpdHkgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgd2lwZSBpcyBzcGVjaWZpZWQKKworICAgIGVyYXNlICVzICAgICAgICAgICBFcmFzZSBhIGdpdmVuIHBhcnRpdGlvbiAoY2FuIG9ubHkgYmUgdXNlZCBpbiBjb25qdW5jdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBpZi13aXBlIC0+IGVnLiBpZi13aXBlIGVyYXNlIGNhY2hlCisKK0ZsYXNoaW5nIE9wdGltaXphdGlvbjoKKworICAgIEFmdGVyIGdlbmVyYXRpbmcgdGhlIGxpc3Qgb2YgdGFza3MgdG8gZXhlY3V0ZSwgRmFzdGJvb3Qgd2lsbCB0cnkgYW5kCisgICAgb3B0aW1pemUgdGhlIGZsYXNoaW5nIG9mIHRoZSBkeW5hbWljIHBhcnRpdGlvbnMgYnkgY29uc3RydWN0aW5nIGFuCisgICAgb3B0aW1pemVkIGZsYXNoIHN1cGVyIHRhc2suIEZhc3Rib290IHdpbGwgZXhwbGljaXRseSBwYXR0ZXJuIG1hdGNoIHRoZQorICAgIGZvbGxvd2luZyBjb21tYW5kcyBhbmQgdHJ5IGFuZCBjb25jYXRlbmF0ZSBpdCBpbnRvIHRoaXMgdGFzay4gKGRvaW5nIHNvCisgICAgd2lsbCBhbGxvdyB1cyB0byBhdm9pZCB0aGUgcmVib290IGludG8gdXNlcnNwYWNlIGZhc3Rib290ZCB3aGljaCB0YWtlcworICAgIHNpZ25pZmljYW50IHRpbWUpCisKKyAgICAvL09wdGltaXphYmxlIEJsb2NrCisgICAgcmVib290IGZhc3Rib290CisgICAgdXBkYXRlLXN1cGVyICAgICAgICAgICAgICAgICAgICAgICAgLS0tPiBnZW5lcmF0ZSBvcHRpbWl6ZWQgZmxhc2ggc3VwZXIgdGFzaworICAgICRGT1IgRUFDSCB7ZHluYW1pYyBwYXJ0aXRpb259CisgICAgICAgIGZsYXNoIHtkeW5hbWljIHBhcnRpdGlvbn0KIAogIyMgQ2xpZW50IFZhcmlhYmxlcwogCmRpZmYgLS1naXQgYS9mYXN0Ym9vdC9jb25zdGFudHMuaCBiL2Zhc3Rib290L2NvbnN0YW50cy5oCmluZGV4IGFkMTY5ZDEuLmFmNGQxZWIgMTAwNjQ0Ci0tLSBhL2Zhc3Rib290L2NvbnN0YW50cy5oCisrKyBiL2Zhc3Rib290L2NvbnN0YW50cy5oCkBAIC02OSw2ICs2OSw3IEBACiAjZGVmaW5lIEZCX1ZBUl9WQVJJQU5UICJ2YXJpYW50IgogI2RlZmluZSBGQl9WQVJfT0ZGX01PREVfQ0hBUkdFX1NUQVRFICJvZmYtbW9kZS1jaGFyZ2UiCiAjZGVmaW5lIEZCX1ZBUl9CQVRURVJZX1ZPTFRBR0UgImJhdHRlcnktdm9sdGFnZSIKKyNkZWZpbmUgRkJfVkFSX0JBVFRFUllfU09DICJiYXR0ZXJ5LXNvYyIKICNkZWZpbmUgRkJfVkFSX0JBVFRFUllfU09DX09LICJiYXR0ZXJ5LXNvYy1vayIKICNkZWZpbmUgRkJfVkFSX1NVUEVSX1BBUlRJVElPTl9OQU1FICJzdXBlci1wYXJ0aXRpb24tbmFtZSIKICNkZWZpbmUgRkJfVkFSX1NOQVBTSE9UX1VQREFURV9TVEFUVVMgInNuYXBzaG90LXVwZGF0ZS1zdGF0dXMiCkBAIC04MSwzICs4Miw1IEBACiAjZGVmaW5lIEZCX1ZBUl9UUkVCTEVfRU5BQkxFRCAidHJlYmxlLWVuYWJsZWQiCiAjZGVmaW5lIEZCX1ZBUl9NQVhfRkVUQ0hfU0laRSAibWF4LWZldGNoLXNpemUiCiAjZGVmaW5lIEZCX1ZBUl9ETUVTRyAiZG1lc2ciCisjZGVmaW5lIEZCX1ZBUl9CQVRURVJZX1NFUklBTF9OVU1CRVIgImJhdHRlcnktc2VyaWFsLW51bWJlciIKKyNkZWZpbmUgRkJfVkFSX0JBVFRFUllfUEFSVF9TVEFUVVMgImJhdHRlcnktcGFydC1zdGF0dXMiCmRpZmYgLS1naXQgYS9mYXN0Ym9vdC9kZXZpY2UvY29tbWFuZHMuY3BwIGIvZmFzdGJvb3QvZGV2aWNlL2NvbW1hbmRzLmNwcAppbmRleCBlOTI5ZjQyLi5lNTIyZjRkIDEwMDY0NAotLS0gYS9mYXN0Ym9vdC9kZXZpY2UvY29tbWFuZHMuY3BwCisrKyBiL2Zhc3Rib290L2RldmljZS9jb21tYW5kcy5jcHAKQEAgLTEzNCw2ICsxMzQsNyBAQAogICAgICAgICB7RkJfVkFSX0lTX0ZPUkNFX0RFQlVHR0FCTEUsIHtHZXRJc0ZvcmNlRGVidWdnYWJsZSwgbnVsbHB0cn19LAogICAgICAgICB7RkJfVkFSX09GRl9NT0RFX0NIQVJHRV9TVEFURSwge0dldE9mZk1vZGVDaGFyZ2VTdGF0ZSwgbnVsbHB0cn19LAogICAgICAgICB7RkJfVkFSX0JBVFRFUllfVk9MVEFHRSwge0dldEJhdHRlcnlWb2x0YWdlLCBudWxscHRyfX0sCisgICAgICAgIHtGQl9WQVJfQkFUVEVSWV9TT0MsIHtHZXRCYXR0ZXJ5U29DLCBudWxscHRyfX0sCiAgICAgICAgIHtGQl9WQVJfQkFUVEVSWV9TT0NfT0ssIHtHZXRCYXR0ZXJ5U29DT2ssIG51bGxwdHJ9fSwKICAgICAgICAge0ZCX1ZBUl9IV19SRVZJU0lPTiwge0dldEhhcmR3YXJlUmV2aXNpb24sIG51bGxwdHJ9fSwKICAgICAgICAge0ZCX1ZBUl9TVVBFUl9QQVJUSVRJT05fTkFNRSwge0dldFN1cGVyUGFydGl0aW9uTmFtZSwgbnVsbHB0cn19LApAQCAtMTQ2LDYgKzE0Nyw4IEBACiAgICAgICAgIHtGQl9WQVJfU0VDVVJJVFlfUEFUQ0hfTEVWRUwsIHtHZXRTZWN1cml0eVBhdGNoTGV2ZWwsIG51bGxwdHJ9fSwKICAgICAgICAge0ZCX1ZBUl9UUkVCTEVfRU5BQkxFRCwge0dldFRyZWJsZUVuYWJsZWQsIG51bGxwdHJ9fSwKICAgICAgICAge0ZCX1ZBUl9NQVhfRkVUQ0hfU0laRSwge0dldE1heEZldGNoU2l6ZSwgbnVsbHB0cn19LAorICAgICAgICB7RkJfVkFSX0JBVFRFUllfU0VSSUFMX05VTUJFUiwge0dldEJhdHRlcnlTZXJpYWxOdW1iZXIsIG51bGxwdHJ9fSwKKyAgICAgICAge0ZCX1ZBUl9CQVRURVJZX1BBUlRfU1RBVFVTLCB7R2V0QmF0dGVyeVBhcnRTdGF0dXMsIG51bGxwdHJ9fSwKIH07CiAKIHN0YXRpYyBib29sIEdldFZhckFsbChGYXN0Ym9vdERldmljZSogZGV2aWNlKSB7CkBAIC02MzksNiArNjQyLDEyIEBACiAgICAgcmV0dXJuIFVwZGF0ZVN1cGVyKGRldmljZSwgYXJnc1sxXSwgd2lwZSk7CiB9CiAKK3N0YXRpYyBib29sIElzTG9ja2VkRHN1KCkgeworICAgIHN0ZDo6c3RyaW5nIGFjdGl2ZV9kc3U7CisgICAgYW5kcm9pZDo6Z3NpOjpHZXRBY3RpdmVEc3UoJmFjdGl2ZV9kc3UpOworICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpFbmRzV2l0aChhY3RpdmVfZHN1LCAiLmxvY2siKTsKK30KKwogYm9vbCBHc2lIYW5kbGVyKEZhc3Rib290RGV2aWNlKiBkZXZpY2UsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncykgewogICAgIGlmIChhcmdzLnNpemUoKSAhPSAyKSB7CiAgICAgICAgIHJldHVybiBkZXZpY2UtPldyaXRlRmFpbCgiSW52YWxpZCBhcmd1bWVudHMiKTsKQEAgLTY1Myw2ICs2NjIsMTEgQEAKICAgICAgICAgcmV0dXJuIGRldmljZS0+V3JpdGVTdGF0dXMoRmFzdGJvb3RSZXN1bHQ6OkZBSUwsICJObyBHU0kgaXMgaW5zdGFsbGVkIik7CiAgICAgfQogCisgICAgaWYgKChhcmdzWzFdID09ICJ3aXBlIiB8fCBhcmdzWzFdID09ICJkaXNhYmxlIikgJiYgR2V0RGV2aWNlTG9ja1N0YXR1cygpICYmIElzTG9ja2VkRHN1KCkpIHsKKyAgICAgICAgLy8gQmxvY2sgY29tbWFuZHMgdGhhdCBtb2RpZnkgdGhlIHN0YXRlcyBvZiBsb2NrZWQgRFNVCisgICAgICAgIHJldHVybiBkZXZpY2UtPldyaXRlRmFpbCgiQ29tbWFuZCBub3QgYXZhaWxhYmxlIG9uIGxvY2tlZCBEU1UvZGV2aWNlcyIpOworICAgIH0KKwogICAgIGlmIChhcmdzWzFdID09ICJ3aXBlIikgewogICAgICAgICBpZiAoIWFuZHJvaWQ6OmdzaTo6VW5pbnN0YWxsR3NpKCkpIHsKICAgICAgICAgICAgIHJldHVybiBkZXZpY2UtPldyaXRlU3RhdHVzKEZhc3Rib290UmVzdWx0OjpGQUlMLCBzdHJlcnJvcihlcnJubykpOwpAQCAtNjYxLDYgKzY3NSwxNyBAQAogICAgICAgICBpZiAoIWFuZHJvaWQ6OmdzaTo6RGlzYWJsZUdzaSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gZGV2aWNlLT5Xcml0ZVN0YXR1cyhGYXN0Ym9vdFJlc3VsdDo6RkFJTCwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYXJnc1sxXSA9PSAic3RhdHVzIikgeworICAgICAgICBzdGQ6OnN0cmluZyBhY3RpdmVfZHN1OworICAgICAgICBpZiAoIWFuZHJvaWQ6OmdzaTo6SXNHc2lSdW5uaW5nKCkpIHsKKyAgICAgICAgICAgIGRldmljZS0+V3JpdGVJbmZvKCJOb3QgcnVubmluZyIpOworICAgICAgICB9IGVsc2UgaWYgKCFhbmRyb2lkOjpnc2k6OkdldEFjdGl2ZURzdSgmYWN0aXZlX2RzdSkpIHsKKyAgICAgICAgICAgIHJldHVybiBkZXZpY2UtPldyaXRlRmFpbChzdHJlcnJvcihlcnJubykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGV2aWNlLT5Xcml0ZUluZm8oIlJ1bm5pbmcgYWN0aXZlIERTVTogIiArIGFjdGl2ZV9kc3UpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGRldmljZS0+V3JpdGVGYWlsKCJJbnZhbGlkIGFyZ3VtZW50cyIpOwogICAgIH0KICAgICByZXR1cm4gZGV2aWNlLT5Xcml0ZVN0YXR1cyhGYXN0Ym9vdFJlc3VsdDo6T0tBWSwgIlN1Y2Nlc3MiKTsKIH0KZGlmZiAtLWdpdCBhL2Zhc3Rib290L2RldmljZS9mYXN0Ym9vdF9kZXZpY2UuY3BwIGIvZmFzdGJvb3QvZGV2aWNlL2Zhc3Rib290X2RldmljZS5jcHAKaW5kZXggNmI2YTk4Mi4uMGRjNGU5NyAxMDA2NDQKLS0tIGEvZmFzdGJvb3QvZGV2aWNlL2Zhc3Rib290X2RldmljZS5jcHAKKysrIGIvZmFzdGJvb3QvZGV2aWNlL2Zhc3Rib290X2RldmljZS5jcHAKQEAgLTE1MSw3ICsxNTEsOCBAQAogfQogCiBCb290Q29udHJvbENsaWVudCogRmFzdGJvb3REZXZpY2U6OmJvb3QxXzEoKSBjb25zdCB7Ci0gICAgaWYgKGJvb3RfY29udHJvbF9oYWxfLT5HZXRWZXJzaW9uKCkgPj0gYW5kcm9pZDo6aGFsOjpCb290Q29udHJvbFZlcnNpb246OkJPT1RDVExfVjFfMSkgeworICAgIGlmIChib290X2NvbnRyb2xfaGFsXyAmJgorICAgICAgICBib290X2NvbnRyb2xfaGFsXy0+R2V0VmVyc2lvbigpID49IGFuZHJvaWQ6OmhhbDo6Qm9vdENvbnRyb2xWZXJzaW9uOjpCT09UQ1RMX1YxXzEpIHsKICAgICAgICAgcmV0dXJuIGJvb3RfY29udHJvbF9oYWxfLmdldCgpOwogICAgIH0KICAgICByZXR1cm4gbnVsbHB0cjsKZGlmZiAtLWdpdCBhL2Zhc3Rib290L2RldmljZS92YXJpYWJsZXMuY3BwIGIvZmFzdGJvb3QvZGV2aWNlL3ZhcmlhYmxlcy5jcHAKaW5kZXggZDJhNzk0Ny4uNzcyMTBhYiAxMDA2NDQKLS0tIGEvZmFzdGJvb3QvZGV2aWNlL3ZhcmlhYmxlcy5jcHAKKysrIGIvZmFzdGJvb3QvZGV2aWNlL3ZhcmlhYmxlcy5jcHAKQEAgLTEzMCw2ICsxMzAsMjEgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorYm9vbCBHZXRCYXR0ZXJ5U29DSGVscGVyKEZhc3Rib290RGV2aWNlKiBkZXZpY2UsIGludDMyX3QqIGJhdHRlcnlfc29jKSB7CisgICAgdXNpbmcgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhlYWx0aDo6SGVhbHRoSW5mbzsKKworICAgIGF1dG8gaGVhbHRoX2hhbCA9IGRldmljZS0+aGVhbHRoX2hhbCgpOworICAgIGlmICghaGVhbHRoX2hhbCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgSGVhbHRoSW5mbyBoZWFsdGhfaW5mbzsKKyAgICBhdXRvIHJlcyA9IGhlYWx0aF9oYWwtPmdldEhlYWx0aEluZm8oJmhlYWx0aF9pbmZvKTsKKyAgICBpZiAoIXJlcy5pc09rKCkpIHJldHVybiBmYWxzZTsKKyAgICAqYmF0dGVyeV9zb2MgPSBoZWFsdGhfaW5mby5iYXR0ZXJ5TGV2ZWw7CisgICAgcmV0dXJuIHRydWU7Cit9CisKIGJvb2wgR2V0QmF0dGVyeVNvQ09rKEZhc3Rib290RGV2aWNlKiBkZXZpY2UsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgLyogYXJncyAqLywKICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBtZXNzYWdlKSB7CiAgICAgaW50MzJfdCBiYXR0ZXJ5X3ZvbHRhZ2UgPSAwOwpAQCAtMTg1LDYgKzIwMCwxNyBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAorYm9vbCBHZXRCYXR0ZXJ5U29DKEZhc3Rib290RGV2aWNlKiBkZXZpY2UsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgLyogYXJncyAqLywKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogbWVzc2FnZSkgeworICAgIGludDMyX3QgYmF0dGVyeV9zb2MgPSAwOworICAgIGlmIChHZXRCYXR0ZXJ5U29DSGVscGVyKGRldmljZSwgJmJhdHRlcnlfc29jKSkgeworICAgICAgICAqbWVzc2FnZSA9IHN0ZDo6dG9fc3RyaW5nKGJhdHRlcnlfc29jKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgICptZXNzYWdlID0gIlVuYWJsZSB0byBnZXQgYmF0dGVyeSBzb2MiOworICAgIHJldHVybiBmYWxzZTsKK30KKwogYm9vbCBHZXRDdXJyZW50U2xvdChGYXN0Ym9vdERldmljZSogZGV2aWNlLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIC8qIGFyZ3MgKi8sCiAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBtZXNzYWdlKSB7CiAgICAgc3RkOjpzdHJpbmcgc3VmZml4ID0gZGV2aWNlLT5HZXRDdXJyZW50U2xvdCgpOwpAQCAtNTQ0LDMgKzU3MCw3OSBAQAogCiAgICAgcmV0dXJuIHRydWU7CiB9CisKK2Jvb2wgR2V0QmF0dGVyeVNlcmlhbE51bWJlcihGYXN0Ym9vdERldmljZSogZGV2aWNlLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBtZXNzYWdlKSB7CisgICAgYXV0byBoZWFsdGhfaGFsID0gZGV2aWNlLT5oZWFsdGhfaGFsKCk7CisgICAgaWYgKCFoZWFsdGhfaGFsKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoR2V0RGV2aWNlTG9ja1N0YXR1cygpKSB7CisgICAgICAgIHJldHVybiBkZXZpY2UtPldyaXRlRmFpbCgiRGV2aWNlIGlzIGxvY2tlZCIpOworICAgIH0KKworICAgICptZXNzYWdlID0gInVuc3VwcG9ydGVkIjsKKworICAgIGludDMyX3QgdmVyc2lvbiA9IDA7CisgICAgYXV0byByZXMgPSBoZWFsdGhfaGFsLT5nZXRJbnRlcmZhY2VWZXJzaW9uKCZ2ZXJzaW9uKTsKKyAgICBpZiAoIXJlcy5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIGRldmljZS0+V3JpdGVGYWlsKCJVbmFibGUgdG8gcXVlcnkgYmF0dGVyeSBkYXRhIik7CisgICAgfQorICAgIGlmICh2ZXJzaW9uID49IDMpIHsKKyAgICAgICAgdXNpbmcgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhlYWx0aDo6QmF0dGVyeUhlYWx0aERhdGE7CisKKyAgICAgICAgQmF0dGVyeUhlYWx0aERhdGEgZGF0YTsKKyAgICAgICAgYXV0byByZXMgPSBoZWFsdGhfaGFsLT5nZXRCYXR0ZXJ5SGVhbHRoRGF0YSgmZGF0YSk7CisgICAgICAgIGlmICghcmVzLmlzT2soKSkgeworICAgICAgICAgICAgcmV0dXJuIGRldmljZS0+V3JpdGVGYWlsKCJVbmFibGUgdG8gcXVlcnkgYmF0dGVyeSBkYXRhIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRhdGEuYmF0dGVyeVNlcmlhbE51bWJlcikgeworICAgICAgICAgICAgKm1lc3NhZ2UgPSAqZGF0YS5iYXR0ZXJ5U2VyaWFsTnVtYmVyOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEdldEJhdHRlcnlQYXJ0U3RhdHVzKEZhc3Rib290RGV2aWNlKiBkZXZpY2UsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBtZXNzYWdlKSB7CisgICAgYXV0byBoZWFsdGhfaGFsID0gZGV2aWNlLT5oZWFsdGhfaGFsKCk7CisgICAgaWYgKCFoZWFsdGhfaGFsKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1c2luZyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6aGVhbHRoOjpCYXR0ZXJ5UGFydFN0YXR1czsKKworICAgIEJhdHRlcnlQYXJ0U3RhdHVzIHN0YXR1cyA9IEJhdHRlcnlQYXJ0U3RhdHVzOjpVTlNVUFBPUlRFRDsKKworICAgIGludDMyX3QgdmVyc2lvbiA9IDA7CisgICAgYXV0byByZXMgPSBoZWFsdGhfaGFsLT5nZXRJbnRlcmZhY2VWZXJzaW9uKCZ2ZXJzaW9uKTsKKyAgICBpZiAoIXJlcy5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIGRldmljZS0+V3JpdGVGYWlsKCJVbmFibGUgdG8gcXVlcnkgYmF0dGVyeSBkYXRhIik7CisgICAgfQorICAgIGlmICh2ZXJzaW9uID49IDMpIHsKKyAgICAgICAgdXNpbmcgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhlYWx0aDo6QmF0dGVyeUhlYWx0aERhdGE7CisKKyAgICAgICAgQmF0dGVyeUhlYWx0aERhdGEgZGF0YTsKKyAgICAgICAgYXV0byByZXMgPSBoZWFsdGhfaGFsLT5nZXRCYXR0ZXJ5SGVhbHRoRGF0YSgmZGF0YSk7CisgICAgICAgIGlmICghcmVzLmlzT2soKSkgeworICAgICAgICAgICAgcmV0dXJuIGRldmljZS0+V3JpdGVGYWlsKCJVbmFibGUgdG8gcXVlcnkgYmF0dGVyeSBkYXRhIik7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gZGF0YS5iYXR0ZXJ5UGFydFN0YXR1czsKKyAgICB9CisgICAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICAgICAgY2FzZSBCYXR0ZXJ5UGFydFN0YXR1czo6VU5TVVBQT1JURUQ6CisgICAgICAgICAgICAqbWVzc2FnZSA9ICJ1bnN1cHBvcnRlZCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCYXR0ZXJ5UGFydFN0YXR1czo6T1JJR0lOQUw6CisgICAgICAgICAgICAqbWVzc2FnZSA9ICJvcmlnaW5hbCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCYXR0ZXJ5UGFydFN0YXR1czo6UkVQTEFDRUQ6CisgICAgICAgICAgICAqbWVzc2FnZSA9ICJyZXBsYWNlZCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICptZXNzYWdlID0gInVua25vd24iOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvZmFzdGJvb3QvZGV2aWNlL3ZhcmlhYmxlcy5oIGIvZmFzdGJvb3QvZGV2aWNlL3ZhcmlhYmxlcy5oCmluZGV4IDNiMmQ0ODQuLjk5ZDEzNTUgMTAwNjQ0Ci0tLSBhL2Zhc3Rib290L2RldmljZS92YXJpYWJsZXMuaAorKysgYi9mYXN0Ym9vdC9kZXZpY2UvdmFyaWFibGVzLmgKQEAgLTYzLDggKzYzLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogbWVzc2FnZSk7CiBib29sIEdldEJhdHRlcnlWb2x0YWdlKEZhc3Rib290RGV2aWNlKiBkZXZpY2UsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncywKICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG1lc3NhZ2UpOworYm9vbCBHZXRCYXR0ZXJ5U29DKEZhc3Rib290RGV2aWNlKiBkZXZpY2UsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncywKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogbWVzc2FnZSk7CiBib29sIEdldEJhdHRlcnlTb0NPayhGYXN0Ym9vdERldmljZSogZGV2aWNlLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogbWVzc2FnZSk7Citib29sIEdldEJhdHRlcnlTZXJpYWxOdW1iZXIoRmFzdGJvb3REZXZpY2UqIGRldmljZSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBtZXNzYWdlKTsKK2Jvb2wgR2V0QmF0dGVyeVBhcnRTdGF0dXMoRmFzdGJvb3REZXZpY2UqIGRldmljZSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogbWVzc2FnZSk7CiBib29sIEdldFN1cGVyUGFydGl0aW9uTmFtZShGYXN0Ym9vdERldmljZSogZGV2aWNlLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogbWVzc2FnZSk7CiBib29sIEdldFNuYXBzaG90VXBkYXRlU3RhdHVzKEZhc3Rib290RGV2aWNlKiBkZXZpY2UsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncywKZGlmZiAtLWdpdCBhL2Zhc3Rib290L2Zhc3Rib290LmNwcCBiL2Zhc3Rib290L2Zhc3Rib290LmNwcAppbmRleCBjZGNkMDM2Li4xNTZkYzNiIDEwMDY0NAotLS0gYS9mYXN0Ym9vdC9mYXN0Ym9vdC5jcHAKKysrIGIvZmFzdGJvb3QvZmFzdGJvb3QuY3BwCkBAIC0yOCw3ICsyOCw2IEBACiAKICNpbmNsdWRlICJmYXN0Ym9vdC5oIgogCi0jaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8Z2V0b3B0Lmg+CkBAIC00NCwxMiArNDMsMTAgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPGNocm9ubz4KLSNpbmNsdWRlIDxmc3RyZWFtPgogI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHJlZ2V4PgotI2luY2x1ZGUgPHNzdHJlYW0+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHRocmVhZD4KICNpbmNsdWRlIDx1dGlsaXR5PgpAQCAtNzYsOSArNzMsOSBAQAogI2luY2x1ZGUgImNvbnN0YW50cy5oIgogI2luY2x1ZGUgImRpYWdub3NlX3VzYi5oIgogI2luY2x1ZGUgImZhc3Rib290X2RyaXZlci5oIgorI2luY2x1ZGUgImZhc3Rib290X2RyaXZlcl9pbnRlcmZhY2UuaCIKICNpbmNsdWRlICJmcy5oIgogI2luY2x1ZGUgInN0b3JhZ2UuaCIKLSNpbmNsdWRlICJzdXBlcl9mbGFzaF9oZWxwZXIuaCIKICNpbmNsdWRlICJ0YXNrLmgiCiAjaW5jbHVkZSAidGNwLmgiCiAjaW5jbHVkZSAidHJhbnNwb3J0LmgiCkBAIC05Miw5ICs4OSwxMCBAQAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6U3BsaXQ7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjpUcmltOwogdXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOwotdXNpbmcgbmFtZXNwYWNlIHN0ZDo6c3RyaW5nX2xpdGVyYWxzOwogdXNpbmcgbmFtZXNwYWNlIHN0ZDo6cGxhY2Vob2xkZXJzOwogCisjZGVmaW5lIEZBU1RCT09UX0lORk9fVkVSU0lPTiAxCisKIHN0YXRpYyBjb25zdCBjaGFyKiBzZXJpYWwgPSBudWxscHRyOwogCiBzdGF0aWMgYm9vbCBnX2xvbmdfbGlzdGluZyA9IGZhbHNlOwpAQCAtMTAyLDcgKzEwMCw2IEBACiAvLyBsaWJzcGFyc2Ugd2lsbCBzdXBwb3J0IElOVF9NQVgsIGJ1dCB0aGlzIHJlc3VsdHMgaW4gbGFyZ2UgYWxsb2NhdGlvbnMsIHNvCiAvLyBsZXQncyBrZWVwIGl0IGF0IDFHQiB0byBhdm9pZCBtZW1vcnkgcHJlc3N1cmUgb24gdGhlIGhvc3QuCiBzdGF0aWMgY29uc3RleHByIGludDY0X3QgUkVTUEFSU0VfTElNSVQgPSAxICogMTAyNCAqIDEwMjQgKiAxMDI0Owotc3RhdGljIHVpbnQ2NF90IHNwYXJzZV9saW1pdCA9IDA7CiBzdGF0aWMgaW50NjRfdCB0YXJnZXRfc3BhcnNlX2xpbWl0ID0gLTE7CiAKIHN0YXRpYyB1bnNpZ25lZCBnX2Jhc2VfYWRkciA9IDB4MTAwMDAwMDA7CkBAIC0xMTgsNiArMTE1LDkgQEAKIHN0YXRpYyBzdGQ6OnZlY3RvcjxJbWFnZT4gaW1hZ2VzID0gewogICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb2ZmCiAgICAgeyAiYm9vdCIsICAgICAiYm9vdC5pbWciLCAgICAgICAgICJib290LnNpZyIsICAgICAiYm9vdCIsICAgICBmYWxzZSwgSW1hZ2VUeXBlOjpCb290Q3JpdGljYWwgfSwKKyAgICB7ICJib290bG9hZGVyIiwKKyAgICAgICAgICAgICAgICAgICJib290bG9hZGVyLmltZyIsICAgIiIsICAgICAgICAgICAgICJib290bG9hZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsICBJbWFnZVR5cGU6OkV4dHJhIH0sCiAgICAgeyAiaW5pdF9ib290IiwKICAgICAgICAgICAgICAgICAgICJpbml0X2Jvb3QuaW1nIiwgICAgImluaXRfYm9vdC5zaWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluaXRfYm9vdCIsCkBAIC0xMzAsNiArMTMwLDcgQEAKICAgICB7ICJvZG1fZGxrbSIsICJvZG1fZGxrbS5pbWciLCAgICAgIm9kbV9kbGttLnNpZyIsICJvZG1fZGxrbSIsIHRydWUsICBJbWFnZVR5cGU6Ok5vcm1hbCB9LAogICAgIHsgInByb2R1Y3QiLCAgInByb2R1Y3QuaW1nIiwgICAgICAicHJvZHVjdC5zaWciLCAgInByb2R1Y3QiLCAgdHJ1ZSwgIEltYWdlVHlwZTo6Tm9ybWFsIH0sCiAgICAgeyAicHZtZnciLCAgICAicHZtZncuaW1nIiwgICAgICAgICJwdm1mdy5zaWciLCAgICAicHZtZnciLCAgICB0cnVlLCAgSW1hZ2VUeXBlOjpCb290Q3JpdGljYWwgfSwKKyAgICB7ICJyYWRpbyIsICAgICJyYWRpby5pbWciLCAgICAgICAgIiIsICAgICAgICAgICAgICJyYWRpbyIsICAgIHRydWUsICBJbWFnZVR5cGU6OkV4dHJhIH0sCiAgICAgeyAicmVjb3ZlcnkiLCAicmVjb3ZlcnkuaW1nIiwgICAgICJyZWNvdmVyeS5zaWciLCAicmVjb3ZlcnkiLCB0cnVlLCAgSW1hZ2VUeXBlOjpCb290Q3JpdGljYWwgfSwKICAgICB7ICJzdXBlciIsICAgICJzdXBlci5pbWciLCAgICAgICAgInN1cGVyLnNpZyIsICAgICJzdXBlciIsICAgIHRydWUsICBJbWFnZVR5cGU6OkV4dHJhIH0sCiAgICAgeyAic3lzdGVtIiwgICAic3lzdGVtLmltZyIsICAgICAgICJzeXN0ZW0uc2lnIiwgICAic3lzdGVtIiwgICBmYWxzZSwgSW1hZ2VUeXBlOjpOb3JtYWwgfSwKQEAgLTE3Miw3ICsxNzMsNyBAQAogICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb24KIH07CiAKLXN0YXRpYyBjaGFyKiBnZXRfYW5kcm9pZF9wcm9kdWN0X291dCgpIHsKK2NoYXIqIGdldF9hbmRyb2lkX3Byb2R1Y3Rfb3V0KCkgewogICAgIGNoYXIqIGRpciA9IGdldGVudigiQU5EUk9JRF9QUk9EVUNUX09VVCIpOwogICAgIGlmIChkaXIgPT0gbnVsbHB0ciB8fCBkaXJbMF0gPT0gJ1wwJykgewogICAgICAgICByZXR1cm4gbnVsbHB0cjsKQEAgLTM0NCwyMyArMzQ1LDIxIEBACiAvLwogLy8gVGhlIHJldHVybmVkIFRyYW5zcG9ydCBpcyBhIHNpbmdsZXRvbiwgc28gbXVsdGlwbGUgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgc2FtZQogLy8gb2JqZWN0LCBhbmQgdGhlIGNhbGxlciBzaG91bGQgbm90IGF0dGVtcHQgdG8gZGVsZXRlIHRoZSByZXR1cm5lZCBUcmFuc3BvcnQuCi1zdGF0aWMgVHJhbnNwb3J0KiBvcGVuX2RldmljZShjb25zdCBjaGFyKiBsb2NhbF9zZXJpYWwsIGJvb2wgd2FpdF9mb3JfZGV2aWNlID0gdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYW5ub3VuY2UgPSB0cnVlKSB7CitzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFRyYW5zcG9ydD4gb3Blbl9kZXZpY2UoY29uc3QgY2hhciogbG9jYWxfc2VyaWFsLCBib29sIHdhaXRfZm9yX2RldmljZSA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbm5vdW5jZSA9IHRydWUpIHsKICAgICBjb25zdCBSZXN1bHQ8TmV0d29ya1NlcmlhbCwgRmFzdGJvb3RFcnJvcj4gbmV0d29ya19zZXJpYWwgPSBQYXJzZU5ldHdvcmtTZXJpYWwobG9jYWxfc2VyaWFsKTsKIAotICAgIFRyYW5zcG9ydCogdHJhbnNwb3J0ID0gbnVsbHB0cjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNwb3J0PiB0cmFuc3BvcnQ7CiAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgaWYgKG5ldHdvcmtfc2VyaWFsLm9rKCkpIHsKICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGVycm9yOwogICAgICAgICAgICAgaWYgKG5ldHdvcmtfc2VyaWFsLT5wcm90b2NvbCA9PSBTb2NrZXQ6OlByb3RvY29sOjprVGNwKSB7Ci0gICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gdGNwOjpDb25uZWN0KG5ldHdvcmtfc2VyaWFsLT5hZGRyZXNzLCBuZXR3b3JrX3NlcmlhbC0+cG9ydCwgJmVycm9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQgPSB0Y3A6OkNvbm5lY3QobmV0d29ya19zZXJpYWwtPmFkZHJlc3MsIG5ldHdvcmtfc2VyaWFsLT5wb3J0LCAmZXJyb3IpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChuZXR3b3JrX3NlcmlhbC0+cHJvdG9jb2wgPT0gU29ja2V0OjpQcm90b2NvbDo6a1VkcCkgewotICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA9IHVkcDo6Q29ubmVjdChuZXR3b3JrX3NlcmlhbC0+YWRkcmVzcywgbmV0d29ya19zZXJpYWwtPnBvcnQsICZlcnJvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gdWRwOjpDb25uZWN0KG5ldHdvcmtfc2VyaWFsLT5hZGRyZXNzLCBuZXR3b3JrX3NlcmlhbC0+cG9ydCwgJmVycm9yKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHRyYW5zcG9ydCA9PSBudWxscHRyICYmIGFubm91bmNlKSB7CisgICAgICAgICAgICBpZiAoIXRyYW5zcG9ydCAmJiBhbm5vdW5jZSkgewogICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgImVycm9yOiAiIDw8IGVycm9yOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKG5ldHdvcmtfc2VyaWFsLmVycm9yKCkuY29kZSgpID09CkBAIC0zNzIsMTIgKzM3MSwxMiBAQAogICAgICAgICAgICAgRXhwZWN0KG5ldHdvcmtfc2VyaWFsKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICh0cmFuc3BvcnQgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAodHJhbnNwb3J0KSB7CiAgICAgICAgICAgICByZXR1cm4gdHJhbnNwb3J0OwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCF3YWl0X2Zvcl9kZXZpY2UpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgcmV0dXJuIHRyYW5zcG9ydDsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChhbm5vdW5jZSkgewpAQCAtMzg4LDEzICszODcsMTMgQEAKICAgICB9CiB9CiAKLXN0YXRpYyBUcmFuc3BvcnQqIE5ldHdvcmtEZXZpY2VDb25uZWN0ZWQoYm9vbCBwcmludCA9IGZhbHNlKSB7Ci0gICAgVHJhbnNwb3J0KiB0cmFuc3BvcnQgPSBudWxscHRyOwotICAgIFRyYW5zcG9ydCogcmVzdWx0ID0gbnVsbHB0cjsKK3N0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNwb3J0PiBOZXR3b3JrRGV2aWNlQ29ubmVjdGVkKGJvb2wgcHJpbnQgPSBmYWxzZSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxUcmFuc3BvcnQ+IHRyYW5zcG9ydDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNwb3J0PiByZXN1bHQ7CiAKICAgICBDb25uZWN0ZWREZXZpY2VzU3RvcmFnZSBzdG9yYWdlOwogICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBkZXZpY2VzOwotICAgIHsKKyAgICBpZiAoc3RvcmFnZS5FeGlzdHMoKSkgewogICAgICAgICBGaWxlTG9jayBsb2NrID0gc3RvcmFnZS5Mb2NrKCk7CiAgICAgICAgIGRldmljZXMgPSBzdG9yYWdlLlJlYWREZXZpY2VzKGxvY2spOwogICAgIH0KQEAgLTQwMywxMSArNDAyLDExIEBACiAgICAgICAgIHRyYW5zcG9ydCA9IG9wZW5fZGV2aWNlKGRldmljZS5jX3N0cigpLCBmYWxzZSwgZmFsc2UpOwogCiAgICAgICAgIGlmIChwcmludCkgewotICAgICAgICAgICAgUHJpbnREZXZpY2UoZGV2aWNlLmNfc3RyKCksIHRyYW5zcG9ydCA9PSBudWxscHRyID8gIm9mZmxpbmUiIDogImZhc3Rib290Iik7CisgICAgICAgICAgICBQcmludERldmljZShkZXZpY2UuY19zdHIoKSwgdHJhbnNwb3J0ID8gImZhc3Rib290IiA6ICJvZmZsaW5lIik7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAodHJhbnNwb3J0ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHRyYW5zcG9ydDsKKyAgICAgICAgaWYgKHRyYW5zcG9ydCkgeworICAgICAgICAgICAgcmVzdWx0ID0gc3RkOjptb3ZlKHRyYW5zcG9ydCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQyNSwyMSArNDI0LDIxIEBACiAvLwogLy8gVGhlIHJldHVybmVkIFRyYW5zcG9ydCBpcyBhIHNpbmdsZXRvbiwgc28gbXVsdGlwbGUgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgc2FtZQogLy8gb2JqZWN0LCBhbmQgdGhlIGNhbGxlciBzaG91bGQgbm90IGF0dGVtcHQgdG8gZGVsZXRlIHRoZSByZXR1cm5lZCBUcmFuc3BvcnQuCi1zdGF0aWMgVHJhbnNwb3J0KiBvcGVuX2RldmljZSgpIHsKK3N0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNwb3J0PiBvcGVuX2RldmljZSgpIHsKICAgICBpZiAoc2VyaWFsICE9IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIG9wZW5fZGV2aWNlKHNlcmlhbCk7CiAgICAgfQogCiAgICAgYm9vbCBhbm5vdW5jZSA9IHRydWU7Ci0gICAgVHJhbnNwb3J0KiB0cmFuc3BvcnQgPSBudWxscHRyOworICAgIHN0ZDo6dW5pcXVlX3B0cjxUcmFuc3BvcnQ+IHRyYW5zcG9ydDsKICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICB0cmFuc3BvcnQgPSB1c2Jfb3BlbihtYXRjaF9mYXN0Ym9vdChudWxscHRyKSk7Ci0gICAgICAgIGlmICh0cmFuc3BvcnQgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAodHJhbnNwb3J0KSB7CiAgICAgICAgICAgICByZXR1cm4gdHJhbnNwb3J0OwogICAgICAgICB9CiAKICAgICAgICAgdHJhbnNwb3J0ID0gTmV0d29ya0RldmljZUNvbm5lY3RlZCgpOwotICAgICAgICBpZiAodHJhbnNwb3J0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKHRyYW5zcG9ydCkgewogICAgICAgICAgICAgcmV0dXJuIHRyYW5zcG9ydDsKICAgICAgICAgfQogCkBAIC00NDksNiArNDQ4LDggQEAKICAgICAgICAgfQogICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86OnNlY29uZHMoMSkpOwogICAgIH0KKworICAgIHJldHVybiB0cmFuc3BvcnQ7CiB9CiAKIHN0YXRpYyBpbnQgQ29ubmVjdChpbnQgYXJnYywgY2hhciogYXJndltdKSB7CkBAIC00NjAsOCArNDYxLDcgQEAKICAgICBjb25zdCBjaGFyKiBsb2NhbF9zZXJpYWwgPSAqYXJndjsKICAgICBFeHBlY3QoUGFyc2VOZXR3b3JrU2VyaWFsKGxvY2FsX3NlcmlhbCkpOwogCi0gICAgY29uc3QgVHJhbnNwb3J0KiB0cmFuc3BvcnQgPSBvcGVuX2RldmljZShsb2NhbF9zZXJpYWwsIGZhbHNlKTsKLSAgICBpZiAodHJhbnNwb3J0ID09IG51bGxwdHIpIHsKKyAgICBpZiAoIW9wZW5fZGV2aWNlKGxvY2FsX3NlcmlhbCwgZmFsc2UpKSB7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KIApAQCAtNTI1LDYgKzUyNSw3IEBACiAgICAgdXNiX29wZW4obGlzdF9kZXZpY2VzX2NhbGxiYWNrKTsKICAgICBOZXR3b3JrRGV2aWNlQ29ubmVjdGVkKC8qIHByaW50ICovIHRydWUpOwogfQorCiB2b2lkIHN5bnRheF9lcnJvcihjb25zdCBjaGFyKiBmbXQsIC4uLikgewogICAgIGZwcmludGYoc3RkZXJyLCAiZmFzdGJvb3Q6IHVzYWdlOiAiKTsKIApAQCAtNTUxLDYgKzU1MiwxMiBAQAogICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWNvbmRhcnkgaW1hZ2VzIG1heSBiZSBmbGFzaGVkIHRvIGluYWN0aXZlIHNsb3QuXG4iCiAgICAgICAgICAgICAiIGZsYXNoIFBBUlRJVElPTiBbRklMRU5BTUVdIEZsYXNoIGdpdmVuIHBhcnRpdGlvbiwgdXNpbmcgdGhlIGltYWdlIGZyb21cbiIKICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEFORFJPSURfUFJPRFVDVF9PVVQgaWYgbm8gZmlsZW5hbWUgaXMgZ2l2ZW4uXG4iCisgICAgICAgICAgICAiIGZsYXNoIHZlbmRvcl9ib290OlJBTURJU0sgW0ZJTEVOQU1FXVxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbGFzaCB2ZW5kb3JfYm9vdCByYW1kaXNrLCBmZXRjaGluZyB0aGUgZXhpc3RpbmdcbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yX2Jvb3QgaW1hZ2UgYW5kIHJlcGFja2FnaW5nIGl0IHdpdGggdGhlIG5ld1xuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW1kaXNrLlxuIgorICAgICAgICAgICAgIiAtLWR0YiBEVEIgICAgICAgICAgICAgICAgICBJZiBzZXQgd2l0aCBmbGFzaCB2ZW5kb3JfYm9vdDpSQU1ESVNLLCB0aGVuXG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSB0aGUgdmVuZG9yX2Jvb3QgaW1hZ2Ugd2l0aCBwcm92aWRlZCBEVEIuXG4iCiAgICAgICAgICAgICAiXG4iCiAgICAgICAgICAgICAiYmFzaWNzOlxuIgogICAgICAgICAgICAgIiBkZXZpY2VzIFstbF0gICAgICAgICAgICAgICBMaXN0IGRldmljZXMgaW4gYm9vdGxvYWRlciAoLWw6IHdpdGggZGV2aWNlIHBhdGhzKS5cbiIKQEAgLTU3MCw3ICs1NzcsOCBAQAogICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQgYSBmbGFzaCBwYXJ0aXRpb24uXG4iCiAgICAgICAgICAgICAiIHNldF9hY3RpdmUgU0xPVCAgICAgICAgICAgIFNldCB0aGUgYWN0aXZlIHNsb3QuXG4iCiAgICAgICAgICAgICAiIG9lbSBbQ09NTUFORC4uLl0gICAgICAgICAgIEV4ZWN1dGUgT0VNLXNwZWNpZmljIGNvbW1hbmQuXG4iCi0gICAgICAgICAgICAiIGdzaSB3aXBlfGRpc2FibGUgICAgICAgICAgIFdpcGUgb3IgZGlzYWJsZSBhIEdTSSBpbnN0YWxsYXRpb24gKGZhc3Rib290ZCBvbmx5KS5cbiIKKyAgICAgICAgICAgICIgZ3NpIHdpcGV8ZGlzYWJsZXxzdGF0dXMgICAgV2lwZSwgZGlzYWJsZSBvciBzaG93IHN0YXR1cyBvZiBhIEdTSSBpbnN0YWxsYXRpb25cbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZhc3Rib290ZCBvbmx5KS5cbiIKICAgICAgICAgICAgICIgd2lwZS1zdXBlciBbU1VQRVJfRU1QVFldICAgV2lwZSB0aGUgc3VwZXIgcGFydGl0aW9uLiBUaGlzIHdpbGwgcmVzZXQgaXQgdG9cbiIKICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbiBhbiBlbXB0eSBzZXQgb2YgZGVmYXVsdCBkeW5hbWljIHBhcnRpdGlvbnMuXG4iCiAgICAgICAgICAgICAiIGNyZWF0ZS1sb2dpY2FsLXBhcnRpdGlvbiBOQU1FIFNJWkVcbiIKQEAgLTYyOCw2ICs2MzYsOSBAQAogICAgICAgICAgICAgIiAtLXNraXAtcmVib290ICAgICAgICAgICAgICBEb24ndCByZWJvb3QgZGV2aWNlIGFmdGVyIGZsYXNoaW5nLlxuIgogICAgICAgICAgICAgIiAtLWRpc2FibGUtdmVyaXR5ICAgICAgICAgICBTZXRzIGRpc2FibGUtdmVyaXR5IHdoZW4gZmxhc2hpbmcgdmJtZXRhLlxuIgogICAgICAgICAgICAgIiAtLWRpc2FibGUtdmVyaWZpY2F0aW9uICAgICBTZXRzIGRpc2FibGUtdmVyaWZpY2F0aW9uIHdoZW4gZmxhc2hpbmcgdmJtZXRhLlxuIgorICAgICAgICAgICAgIiAtLWRpc2FibGUtc3VwZXItb3B0aW1pemF0aW9uXG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2FibGVzIG9wdGltaXphdGlvbnMgb24gZmxhc2hpbmcgc3VwZXIgcGFydGl0aW9uLlxuIgorICAgICAgICAgICAgIiAtLWRpc2FibGUtZmFzdGJvb3QtaW5mbyAgICBXaWxsIGNvbGxlY3RzIHRhc2tzIGZyb20gaW1hZ2UgbGlzdCByYXRoZXIgdGhhbiAkT1VUL2Zhc3Rib290LWluZm8udHh0LlxuIgogICAgICAgICAgICAgIiAtLWZzLW9wdGlvbnM9T1BUSU9OWyxPUFRJT05dXG4iCiAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuYWJsZSBmaWxlc3lzdGVtIGZlYXR1cmVzLiBPUFRJT04gc3VwcG9ydHMgY2FzZWZvbGQsIHByb2ppZCwgY29tcHJlc3NcbiIKICAgICAgICAgICAgIC8vIFRPRE86IHJlbW92ZSAtLXVuYnVmZmVyZWQ/CkBAIC03NzMsNyArNzg0LDcgQEAKIAogI2VuZGlmCiAKLXN0YXRpYyB1bmlxdWVfZmQgdW56aXBfdG9fZmlsZShaaXBBcmNoaXZlSGFuZGxlIHppcCwgY29uc3QgY2hhciogZW50cnlfbmFtZSkgeworc3RhdGljIHVuaXF1ZV9mZCBVbnppcFRvRmlsZShaaXBBcmNoaXZlSGFuZGxlIHppcCwgY29uc3QgY2hhciogZW50cnlfbmFtZSkgewogICAgIHVuaXF1ZV9mZCBmZChtYWtlX3RlbXBvcmFyeV9mZChlbnRyeV9uYW1lKSk7CiAKICAgICBaaXBFbnRyeTY0IHppcF9lbnRyeTsKQEAgLTk5NSw3ICsxMDA2LDcgQEAKICAgICByZXR1cm4gcmVzcGFyc2VfZmlsZShzLmdldCgpLCBtYXhfc2l6ZSk7CiB9CiAKLXN0YXRpYyB1aW50NjRfdCBnZXRfdWludF92YXIoY29uc3QgY2hhciogdmFyX25hbWUpIHsKK3N0YXRpYyB1aW50NjRfdCBnZXRfdWludF92YXIoY29uc3QgY2hhciogdmFyX25hbWUsIGZhc3Rib290OjpJRmFzdEJvb3REcml2ZXIqIGZiKSB7CiAgICAgc3RkOjpzdHJpbmcgdmFsdWVfc3RyOwogICAgIGlmIChmYi0+R2V0VmFyKHZhcl9uYW1lLCAmdmFsdWVfc3RyKSAhPSBmYXN0Ym9vdDo6U1VDQ0VTUyB8fCB2YWx1ZV9zdHIuZW1wdHkoKSkgewogICAgICAgICB2ZXJib3NlKCJ0YXJnZXQgZGlkbid0IHJlcG9ydCAlcyIsIHZhcl9uYW1lKTsKQEAgLTEwMTQsMTMgKzEwMjUsMTUgQEAKICAgICByZXR1cm4gdmFsdWU7CiB9CiAKLWludDY0X3QgZ2V0X3NwYXJzZV9saW1pdChpbnQ2NF90IHNpemUpIHsKLSAgICBpbnQ2NF90IGxpbWl0ID0gc3BhcnNlX2xpbWl0OworaW50NjRfdCBnZXRfc3BhcnNlX2xpbWl0KGludDY0X3Qgc2l6ZSwgY29uc3QgRmxhc2hpbmdQbGFuKiBmcCkgeworICAgIGlmICghZnApIHJldHVybiAwOworCisgICAgaW50NjRfdCBsaW1pdCA9IGludDY0X3QoZnAtPnNwYXJzZV9saW1pdCk7CiAgICAgaWYgKGxpbWl0ID09IDApIHsKICAgICAgICAgLy8gVW5saW1pdGVkLCBzbyBzZWUgd2hhdCB0aGUgdGFyZ2V0IGRldmljZSdzIGxpbWl0IGlzLgogICAgICAgICAvLyBUT0RPOiBzaG91bGRuJ3Qgd2UgYXBwbHkgdGhpcyBsaW1pdCBldmVuIGlmIHlvdSd2ZSB1c2VkIC1TPwogICAgICAgICBpZiAodGFyZ2V0X3NwYXJzZV9saW1pdCA9PSAtMSkgewotICAgICAgICAgICAgdGFyZ2V0X3NwYXJzZV9saW1pdCA9IHN0YXRpY19jYXN0PGludDY0X3Q+KGdldF91aW50X3ZhcigibWF4LWRvd25sb2FkLXNpemUiKSk7CisgICAgICAgICAgICB0YXJnZXRfc3BhcnNlX2xpbWl0ID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oZ2V0X3VpbnRfdmFyKCJtYXgtZG93bmxvYWQtc2l6ZSIsIGZwLT5mYikpOwogICAgICAgICB9CiAgICAgICAgIGlmICh0YXJnZXRfc3BhcnNlX2xpbWl0ID4gMCkgewogICAgICAgICAgICAgbGltaXQgPSB0YXJnZXRfc3BhcnNlX2xpbWl0OwpAQCAtMTAzNiw3ICsxMDQ5LDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGJvb2wgbG9hZF9idWZfZmQodW5pcXVlX2ZkIGZkLCBzdHJ1Y3QgZmFzdGJvb3RfYnVmZmVyKiBidWYpIHsKK3N0YXRpYyBib29sIGxvYWRfYnVmX2ZkKHVuaXF1ZV9mZCBmZCwgc3RydWN0IGZhc3Rib290X2J1ZmZlciogYnVmLCBjb25zdCBGbGFzaGluZ1BsYW4qIGZwKSB7CiAgICAgaW50NjRfdCBzeiA9IGdldF9maWxlX3NpemUoZmQpOwogICAgIGlmIChzeiA9PSAtMSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xMDQ5LDEyICsxMDYyLDE0IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgc3BhcnNlX2ZpbGVfZGVzdHJveShzKTsKKyAgICAgICAgYnVmLT5maWxlX3R5cGUgPSBGQl9CVUZGRVJfU1BBUlNFOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGJ1Zi0+aW1hZ2Vfc2l6ZSA9IHN6OworICAgICAgICBidWYtPmZpbGVfdHlwZSA9IEZCX0JVRkZFUl9GRDsKICAgICB9CiAKICAgICBsc2VlayhmZC5nZXQoKSwgMCwgU0VFS19TRVQpOwotICAgIGludDY0X3QgbGltaXQgPSBnZXRfc3BhcnNlX2xpbWl0KHN6KTsKKyAgICBpbnQ2NF90IGxpbWl0ID0gZ2V0X3NwYXJzZV9saW1pdChzeiwgZnApOwogICAgIGJ1Zi0+ZmQgPSBzdGQ6Om1vdmUoZmQpOwogICAgIGlmIChsaW1pdCkgewogICAgICAgICBidWYtPmZpbGVzID0gbG9hZF9zcGFyc2VfZmlsZXMoYnVmLT5mZC5nZXQoKSwgbGltaXQpOwpAQCAtMTA3MCwxMyArMTA4NSwxMSBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgYm9vbCBsb2FkX2J1Zihjb25zdCBjaGFyKiBmbmFtZSwgc3RydWN0IGZhc3Rib290X2J1ZmZlciogYnVmKSB7CitzdGF0aWMgYm9vbCBsb2FkX2J1Zihjb25zdCBjaGFyKiBmbmFtZSwgc3RydWN0IGZhc3Rib290X2J1ZmZlciogYnVmLCBjb25zdCBGbGFzaGluZ1BsYW4qIGZwKSB7CiAgICAgdW5pcXVlX2ZkIGZkKFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKGZuYW1lLCBPX1JET05MWSB8IE9fQklOQVJZKSkpOwogCiAgICAgaWYgKGZkID09IC0xKSB7Ci0gICAgICAgIGF1dG8gcGF0aCA9IGZpbmRfaXRlbV9naXZlbl9uYW1lKGZuYW1lKTsKLSAgICAgICAgZmQgPSB1bmlxdWVfZmQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4ocGF0aC5jX3N0cigpLCBPX1JET05MWSB8IE9fQklOQVJZKSkpOwotICAgICAgICBpZiAoZmQgPT0gLTEpIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIHN0cnVjdCBzdGF0IHM7CkBAIC0xMDg4LDcgKzExMDEsNyBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgcmV0dXJuIGxvYWRfYnVmX2ZkKHN0ZDo6bW92ZShmZCksIGJ1Zik7CisgICAgcmV0dXJuIGxvYWRfYnVmX2ZkKHN0ZDo6bW92ZShmZCksIGJ1ZiwgZnApOwogfQogCiBzdGF0aWMgdm9pZCByZXdyaXRlX3ZibWV0YV9idWZmZXIoc3RydWN0IGZhc3Rib290X2J1ZmZlciogYnVmLCBib29sIHZibWV0YV9pbl9ib290KSB7CkBAIC0xMTgzLDExICsxMTk2LDIxIEBACiAgICAgcmV0dXJuIHBhcnRpdGlvbl9zaXplOwogfQogCi1zdGF0aWMgdm9pZCBjb3B5X2F2Yl9mb290ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHBhcnRpdGlvbiwgc3RydWN0IGZhc3Rib290X2J1ZmZlciogYnVmKSB7CitzdGF0aWMgdm9pZCBjb3B5X2F2Yl9mb290ZXIoY29uc3QgSW1hZ2VTb3VyY2UqIHNvdXJjZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHBhcnRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZmFzdGJvb3RfYnVmZmVyKiBidWYpIHsKICAgICBpZiAoYnVmLT5zeiA8IEFWQl9GT09URVJfU0laRSB8fCBpc19sb2dpY2FsKHBhcnRpdGlvbikgfHwKLSAgICAgICAgc2hvdWxkX2ZsYXNoX2luX3VzZXJzcGFjZShwYXJ0aXRpb24pKSB7CisgICAgICAgIHNob3VsZF9mbGFzaF9pbl91c2Vyc3BhY2Uoc291cmNlLCBwYXJ0aXRpb24pKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CisKKyAgICAvLyBJZiB0aGUgaW1hZ2UgaXMgc3BhcnNlLCBtb3ZpbmcgdGhlIGZvb3RlciB3aWxsIHNpbXBseSBjb3JydXB0IHRoZSBzcGFyc2UKKyAgICAvLyBmb3JtYXQsIHNvIGN1cnJlbnRseSB3ZSBkb24ndCBzdXBwb3J0IG1vdmluZyB0aGUgZm9vdGVyIG9uIHNwYXJzZSBmaWxlcy4KKyAgICBpZiAoYnVmLT5maWxlX3R5cGUgPT0gRkJfQlVGRkVSX1NQQVJTRSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJXYXJuaW5nOiBza2lwIGNvcHlpbmcgIiA8PCBwYXJ0aXRpb24gPDwgIiBpbWFnZSBhdmIgZm9vdGVyIGR1ZSB0byBzcGFyc2UgIgorICAgICAgICAgICAgICAgICAgIDw8ICJpbWFnZS4iOworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgLy8gSWYgb3ZlcmZsb3dzIGFuZCBuZWdhdGl2ZSwgaXQgc2hvdWxkIGJlIDwgYnVmLT5zei4KICAgICBpbnQ2NF90IHBhcnRpdGlvbl9zaXplID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oZ2V0X3BhcnRpdGlvbl9zaXplKHBhcnRpdGlvbikpOwogCkBAIC0xMjQyLDkgKzEyNjUsOSBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgZmxhc2hfYnVmKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJ0aXRpb24sIHN0cnVjdCBmYXN0Ym9vdF9idWZmZXIqIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIGFwcGx5X3ZibWV0YSkgewotICAgIGNvcHlfYXZiX2Zvb3RlcihwYXJ0aXRpb24sIGJ1Zik7CitzdGF0aWMgdm9pZCBmbGFzaF9idWYoY29uc3QgSW1hZ2VTb3VyY2UqIHNvdXJjZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHBhcnRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZmFzdGJvb3RfYnVmZmVyKiBidWYsIGNvbnN0IGJvb2wgYXBwbHlfdmJtZXRhKSB7CisgICAgY29weV9hdmJfZm9vdGVyKHNvdXJjZSwgcGFydGl0aW9uLCBidWYpOwogCiAgICAgLy8gUmV3cml0ZSB2Ym1ldGEgaWYgdGhhdCdzIHdoYXQgd2UncmUgZmxhc2hpbmcgYW5kIG1vZGlmaWNhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQuCiAgICAgaWYgKGdfZGlzYWJsZV92ZXJpdHkgfHwgZ19kaXNhYmxlX3ZlcmlmaWNhdGlvbikgewpAQCAtMTI3OCw3ICsxMzAxLDcgQEAKICAgICByZXR1cm4gY3VycmVudF9zbG90OwogfQogCi1zdGF0aWMgaW50IGdldF9zbG90X2NvdW50KCkgeworc3RhdGljIGludCBnZXRfc2xvdF9jb3VudChmYXN0Ym9vdDo6SUZhc3RCb290RHJpdmVyKiBmYikgewogICAgIHN0ZDo6c3RyaW5nIHZhcjsKICAgICBpbnQgY291bnQgPSAwOwogICAgIGlmIChmYi0+R2V0VmFyKCJzbG90LWNvdW50IiwgJnZhcikgIT0gZmFzdGJvb3Q6OlNVQ0NFU1MgfHwKQEAgLTEyODgsOCArMTMxMSw4IEBACiAgICAgcmV0dXJuIGNvdW50OwogfQogCi1ib29sIHN1cHBvcnRzX0FCKCkgewotICAgIHJldHVybiBnZXRfc2xvdF9jb3VudCgpID49IDI7Citib29sIHN1cHBvcnRzX0FCKGZhc3Rib290OjpJRmFzdEJvb3REcml2ZXIqIGZiKSB7CisgICAgcmV0dXJuIGdldF9zbG90X2NvdW50KGZiKSA+PSAyOwogfQogCiAvLyBHaXZlbiBhIGN1cnJlbnQgc2xvdCwgdGhpcyByZXR1cm5zIHdoYXQgdGhlICdvdGhlcicgc2xvdCBpcy4KQEAgLTEzMDEsNyArMTMyNCw3IEBACiB9CiAKIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRfb3RoZXJfc2xvdChjb25zdCBzdGQ6OnN0cmluZyYgY3VycmVudF9zbG90KSB7Ci0gICAgcmV0dXJuIGdldF9vdGhlcl9zbG90KGN1cnJlbnRfc2xvdCwgZ2V0X3Nsb3RfY291bnQoKSk7CisgICAgcmV0dXJuIGdldF9vdGhlcl9zbG90KGN1cnJlbnRfc2xvdCwgZ2V0X3Nsb3RfY291bnQoZmIpKTsKIH0KIAogc3RhdGljIHN0ZDo6c3RyaW5nIGdldF9vdGhlcl9zbG90KGludCBjb3VudCkgewpAQCAtMTMwOSw3ICsxMzMyLDcgQEAKIH0KIAogc3RhdGljIHN0ZDo6c3RyaW5nIGdldF9vdGhlcl9zbG90KCkgewotICAgIHJldHVybiBnZXRfb3RoZXJfc2xvdChnZXRfY3VycmVudF9zbG90KCksIGdldF9zbG90X2NvdW50KCkpOworICAgIHJldHVybiBnZXRfb3RoZXJfc2xvdChnZXRfY3VycmVudF9zbG90KCksIGdldF9zbG90X2NvdW50KGZiKSk7CiB9CiAKIHN0YXRpYyBzdGQ6OnN0cmluZyB2ZXJpZnlfc2xvdChjb25zdCBzdGQ6OnN0cmluZyYgc2xvdF9uYW1lLCBib29sIGFsbG93X2FsbCkgewpAQCAtMTMxOCw3ICsxMzQxLDcgQEAKICAgICAgICAgaWYgKGFsbG93X2FsbCkgewogICAgICAgICAgICAgcmV0dXJuICJhbGwiOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IGNvdW50ID0gZ2V0X3Nsb3RfY291bnQoKTsKKyAgICAgICAgICAgIGludCBjb3VudCA9IGdldF9zbG90X2NvdW50KGZiKTsKICAgICAgICAgICAgIGlmIChjb3VudCA+IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gImEiOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTEzMjcsNyArMTM1MCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpbnQgY291bnQgPSBnZXRfc2xvdF9jb3VudCgpOworICAgIGludCBjb3VudCA9IGdldF9zbG90X2NvdW50KGZiKTsKICAgICBpZiAoY291bnQgPT0gMCkgZGllKCJEZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBzbG90cyIpOwogCiAgICAgaWYgKHNsb3QgPT0gIm90aGVyIikgewpAQCAtMTQwMCw3ICsxNDIzLDcgQEAKICAgICAgICAgICAgICAgICBzbG90LmNfc3RyKCkpOwogICAgICAgICB9CiAgICAgICAgIGlmIChoYXNfc2xvdCA9PSAieWVzIikgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRfc2xvdF9jb3VudCgpOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ2V0X3Nsb3RfY291bnQoZmIpOyBpKyspIHsKICAgICAgICAgICAgICAgICBkb19mb3JfcGFydGl0aW9uKHBhcnQsIHN0ZDo6c3RyaW5nKDEsIChjaGFyKShpICsgJ2EnKSksIGZ1bmMsIGZvcmNlX3Nsb3QpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewpAQCAtMTQxMSwxOCArMTQzNCwxMSBAQAogICAgIH0KIH0KIAotYm9vbCBpc19yZXRyb2ZpdF9kZXZpY2UoKSB7Ci0gICAgc3RkOjpzdHJpbmcgdmFsdWU7Ci0gICAgaWYgKGZiLT5HZXRWYXIoInN1cGVyLXBhcnRpdGlvbi1uYW1lIiwgJnZhbHVlKSAhPSBmYXN0Ym9vdDo6U1VDQ0VTUykgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpTdGFydHNXaXRoKHZhbHVlLCAic3lzdGVtXyIpOwotfQotCiAvLyBGZXRjaCBhIHBhcnRpdGlvbiBmcm9tIHRoZSBkZXZpY2UgdG8gYSBnaXZlbiBmZC4gVGhpcyBpcyBhIHdyYXBwZXIgb3ZlciBGZXRjaFRvRmQgdG8gZmV0Y2gKIC8vIHRoZSBmdWxsIGltYWdlLgotc3RhdGljIHVpbnQ2NF90IGZldGNoX3BhcnRpdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgcGFydGl0aW9uLCBib3Jyb3dlZF9mZCBmZCkgewotICAgIHVpbnQ2NF90IGZldGNoX3NpemUgPSBnZXRfdWludF92YXIoRkJfVkFSX01BWF9GRVRDSF9TSVpFKTsKK3N0YXRpYyB1aW50NjRfdCBmZXRjaF9wYXJ0aXRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIHBhcnRpdGlvbiwgYm9ycm93ZWRfZmQgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhc3Rib290OjpJRmFzdEJvb3REcml2ZXIqIGZiKSB7CisgICAgdWludDY0X3QgZmV0Y2hfc2l6ZSA9IGdldF91aW50X3ZhcihGQl9WQVJfTUFYX0ZFVENIX1NJWkUsIGZiKTsKICAgICBpZiAoZmV0Y2hfc2l6ZSA9PSAwKSB7CiAgICAgICAgIGRpZSgiVW5hYmxlIHRvIGdldCAlcy4gRGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgZmV0Y2ggY29tbWFuZC4iLCBGQl9WQVJfTUFYX0ZFVENIX1NJWkUpOwogICAgIH0KQEAgLTE0NDQsMTggKzE0NjAsMjAgQEAKIH0KIAogc3RhdGljIHZvaWQgZG9fZmV0Y2goY29uc3Qgc3RkOjpzdHJpbmcmIHBhcnRpdGlvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIHNsb3Rfb3ZlcnJpZGUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3V0ZmlsZSkgeworICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG91dGZpbGUsIGZhc3Rib290OjpJRmFzdEJvb3REcml2ZXIqIGZiKSB7CiAgICAgdW5pcXVlX2ZkIGZkKFRFTVBfRkFJTFVSRV9SRVRSWSgKICAgICAgICAgICAgIG9wZW4ob3V0ZmlsZS5jX3N0cigpLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19DTE9FWEVDIHwgT19CSU5BUlksIDA2NDQpKSk7Ci0gICAgYXV0byBmZXRjaCA9IHN0ZDo6YmluZChmZXRjaF9wYXJ0aXRpb24sIF8xLCBib3Jyb3dlZF9mZChmZCkpOworICAgIGF1dG8gZmV0Y2ggPSBzdGQ6OmJpbmQoZmV0Y2hfcGFydGl0aW9uLCBfMSwgYm9ycm93ZWRfZmQoZmQpLCBmYik7CiAgICAgZG9fZm9yX3BhcnRpdGlvbnMocGFydGl0aW9uLCBzbG90X292ZXJyaWRlLCBmZXRjaCwgZmFsc2UgLyogZm9yY2Ugc2xvdCAqLyk7CiB9CiAKIC8vIFJldHVybiBpbW1lZGlhdGVseSBpZiBub3QgZmxhc2hpbmcgYSB2ZW5kb3IgYm9vdCBpbWFnZS4gSWYgZmxhc2hpbmcgYSB2ZW5kb3IgYm9vdCBpbWFnZSwKIC8vIHJlcGFjayB2ZW5kb3JfYm9vdCBpbWFnZSB3aXRoIGFuIHVwZGF0ZWQgcmFtZGlzay4gQWZ0ZXIgZXhlY3V0aW9uLCBidWYgaXMgc2V0CiAvLyB0byB0aGUgbmV3IGltYWdlIHRvIGZsYXNoLCBhbmQgcmV0dXJuIHZhbHVlIGlzIHRoZSByZWFsIHBhcnRpdGlvbiBuYW1lIHRvIGZsYXNoLgotc3RhdGljIHN0ZDo6c3RyaW5nIHJlcGFja19yYW1kaXNrKGNvbnN0IGNoYXIqIHBuYW1lLCBzdHJ1Y3QgZmFzdGJvb3RfYnVmZmVyKiBidWYpIHsKK3N0YXRpYyBzdGQ6OnN0cmluZyByZXBhY2tfcmFtZGlzayhjb25zdCBjaGFyKiBwbmFtZSwgc3RydWN0IGZhc3Rib290X2J1ZmZlciogYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhc3Rib290OjpJRmFzdEJvb3REcml2ZXIqIGZiKSB7CiAgICAgc3RkOjpzdHJpbmdfdmlldyBwbmFtZV9zdntwbmFtZX07CisgICAgc3RydWN0IGZhc3Rib290X2J1ZmZlciBkdGJfYnVmID0gey5zeiA9IDAsIC5mZCA9IHVuaXF1ZV9mZCgtMSl9OwogCiAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpTdGFydHNXaXRoKHBuYW1lX3N2LCAidmVuZG9yX2Jvb3Q6IikgJiYKICAgICAgICAgIWFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGgocG5hbWVfc3YsICJ2ZW5kb3JfYm9vdF9hOiIpICYmCkBAIC0xNDcxLDEwICsxNDg5LDI1IEBACiAgICAgc3RkOjpzdHJpbmcgcGFydGl0aW9uKHBuYW1lX3N2LnN1YnN0cigwLCBwbmFtZV9zdi5maW5kKCc6JykpKTsKICAgICBzdGQ6OnN0cmluZyByYW1kaXNrKHBuYW1lX3N2LnN1YnN0cihwbmFtZV9zdi5maW5kKCc6JykgKyAxKSk7CiAKKyAgICBpZiAoIWdfZHRiX3BhdGguZW1wdHkoKSkgeworICAgICAgICBpZiAoIWxvYWRfYnVmKGdfZHRiX3BhdGguY19zdHIoKSwgJmR0Yl9idWYsIG51bGxwdHIpKSB7CisgICAgICAgICAgICBkaWUoImNhbm5vdCBsb2FkICclcyc6ICVzIiwgZ19kdGJfcGF0aC5jX3N0cigpLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGR0Yl9idWYudHlwZSAhPSBGQl9CVUZGRVJfRkQpIHsKKyAgICAgICAgICAgIGRpZSgiRmxhc2hpbmcgc3BhcnNlIHZlbmRvciByYW1kaXNrIGltYWdlIHdpdGggZHRiIGlzIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGR0Yl9idWYuc3ogPD0gMCkgeworICAgICAgICAgICAgZGllKCJyZXBhY2tfcmFtZGlzaygpIHNlZXMgaW52YWxpZCBkdGIgc2l6ZTogJSIgUFJJZDY0LCBidWYtPnN6KTsKKyAgICAgICAgfQorICAgICAgICB2ZXJib3NlKCJVcGRhdGluZyBEVEIgd2l0aCAlcyIsIHBuYW1lX3N2LmRhdGEoKSk7CisgICAgfQorCiAgICAgdW5pcXVlX2ZkIHZlbmRvcl9ib290KG1ha2VfdGVtcG9yYXJ5X2ZkKCJ2ZW5kb3IgYm9vdCByZXBhY2siKSk7Ci0gICAgdWludDY0X3QgdmVuZG9yX2Jvb3Rfc2l6ZSA9IGZldGNoX3BhcnRpdGlvbihwYXJ0aXRpb24sIHZlbmRvcl9ib290KTsKKyAgICB1aW50NjRfdCB2ZW5kb3JfYm9vdF9zaXplID0gZmV0Y2hfcGFydGl0aW9uKHBhcnRpdGlvbiwgdmVuZG9yX2Jvb3QsIGZiKTsKICAgICBhdXRvIHJlcGFja19yZXMgPSByZXBsYWNlX3ZlbmRvcl9yYW1kaXNrKHZlbmRvcl9ib290LCB2ZW5kb3JfYm9vdF9zaXplLCByYW1kaXNrLCBidWYtPmZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGJ1Zi0+c3opKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ2NF90PihidWYtPnN6KSwgZHRiX2J1Zi5mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ2NF90PihkdGJfYnVmLnN6KSk7CiAgICAgaWYgKCFyZXBhY2tfcmVzLm9rKCkpIHsKICAgICAgICAgZGllKCIlcyIsIHJlcGFja19yZXMuZXJyb3IoKS5tZXNzYWdlKCkuY19zdHIoKSk7CiAgICAgfQpAQCAtMTQ4NSwyNCArMTUxOCw0MSBAQAogICAgIHJldHVybiBwYXJ0aXRpb247CiB9CiAKLXZvaWQgZG9fZmxhc2goY29uc3QgY2hhciogcG5hbWUsIGNvbnN0IGNoYXIqIGZuYW1lLCBjb25zdCBib29sIGFwcGx5X3ZibWV0YSkgewordm9pZCBkb19mbGFzaChjb25zdCBjaGFyKiBwbmFtZSwgY29uc3QgY2hhciogZm5hbWUsIGNvbnN0IGJvb2wgYXBwbHlfdmJtZXRhLAorICAgICAgICAgICAgICBjb25zdCBGbGFzaGluZ1BsYW4qIGZwKSB7CisgICAgaWYgKCFmcCkgeworICAgICAgICBkaWUoImRvIGZsYXNoIHdhcyBjYWxsZWQgd2l0aG91dCBhIHZhbGlkIGZsYXNoaW5nIHBsYW4iKTsKKyAgICB9CiAgICAgdmVyYm9zZSgiRG8gZmxhc2ggJXMgJXMiLCBwbmFtZSwgZm5hbWUpOwogICAgIHN0cnVjdCBmYXN0Ym9vdF9idWZmZXIgYnVmOwogCi0gICAgaWYgKCFsb2FkX2J1ZihmbmFtZSwgJmJ1ZikpIHsKKyAgICBpZiAoZnAtPnNvdXJjZSkgeworICAgICAgICB1bmlxdWVfZmQgZmQgPSBmcC0+c291cmNlLT5PcGVuRmlsZShmbmFtZSk7CisgICAgICAgIGlmIChmZCA8IDAgfHwgIWxvYWRfYnVmX2ZkKHN0ZDo6bW92ZShmZCksICZidWYsIGZwKSkgeworICAgICAgICAgICAgZGllKCJjb3VsZCBub3QgbG9hZCAnJXMnOiAlcyIsIGZuYW1lLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPGNoYXI+IHNpZ25hdHVyZV9kYXRhOworICAgICAgICBzdGQ6OnN0cmluZyBmaWxlX3N0cmluZyhmbmFtZSk7CisgICAgICAgIGlmIChmcC0+c291cmNlLT5SZWFkRmlsZShmaWxlX3N0cmluZy5zdWJzdHIoMCwgZmlsZV9zdHJpbmcuZmluZCgnLicpKSArICIuc2lnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaWduYXR1cmVfZGF0YSkpIHsKKyAgICAgICAgICAgIGZiLT5Eb3dubG9hZCgic2lnbmF0dXJlIiwgc2lnbmF0dXJlX2RhdGEpOworICAgICAgICAgICAgZmItPlJhd0NvbW1hbmQoInNpZ25hdHVyZSIsICJpbnN0YWxsaW5nIHNpZ25hdHVyZSIpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghbG9hZF9idWYoZm5hbWUsICZidWYsIGZwKSkgewogICAgICAgICBkaWUoImNhbm5vdCBsb2FkICclcyc6ICVzIiwgZm5hbWUsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgfQorCiAgICAgaWYgKGlzX2xvZ2ljYWwocG5hbWUpKSB7CiAgICAgICAgIGZiLT5SZXNpemVQYXJ0aXRpb24ocG5hbWUsIHN0ZDo6dG9fc3RyaW5nKGJ1Zi5pbWFnZV9zaXplKSk7CiAgICAgfQotICAgIHN0ZDo6c3RyaW5nIGZsYXNoX3BuYW1lID0gcmVwYWNrX3JhbWRpc2socG5hbWUsICZidWYpOwotICAgIGZsYXNoX2J1ZihmbGFzaF9wbmFtZSwgJmJ1ZiwgYXBwbHlfdmJtZXRhKTsKKyAgICBzdGQ6OnN0cmluZyBmbGFzaF9wbmFtZSA9IHJlcGFja19yYW1kaXNrKHBuYW1lLCAmYnVmLCBmcC0+ZmIpOworICAgIGZsYXNoX2J1ZihmcC0+c291cmNlLmdldCgpLCBmbGFzaF9wbmFtZSwgJmJ1ZiwgYXBwbHlfdmJtZXRhKTsKIH0KIAogLy8gU2V0cyBzbG90X292ZXJyaWRlIGFzIHRoZSBhY3RpdmUgc2xvdC4gSWYgc2xvdF9vdmVycmlkZSBpcyBibGFuaywKIC8vIHNldCBjdXJyZW50IHNsb3QgYXMgYWN0aXZlIGluc3RlYWQuIFRoaXMgY2xlYXJzIHNsb3QtdW5ib290YWJsZS4KIHN0YXRpYyB2b2lkIHNldF9hY3RpdmUoY29uc3Qgc3RkOjpzdHJpbmcmIHNsb3Rfb3ZlcnJpZGUpIHsKLSAgICBpZiAoIXN1cHBvcnRzX0FCKCkpIHJldHVybjsKKyAgICBpZiAoIXN1cHBvcnRzX0FCKGZiKSkgcmV0dXJuOwogCiAgICAgaWYgKHNsb3Rfb3ZlcnJpZGUgIT0gIiIpIHsKICAgICAgICAgZmItPlNldEFjdGl2ZShzbG90X292ZXJyaWRlKTsKQEAgLTE1MjEsMTEgKzE1NzEsMTQgQEAKIAogdm9pZCByZWJvb3RfdG9fdXNlcnNwYWNlX2Zhc3Rib290KCkgewogICAgIGZiLT5SZWJvb3RUbygiZmFzdGJvb3QiKTsKKyAgICBpZiAoZmItPldhaXRGb3JEaXNjb25uZWN0KCkgIT0gZmFzdGJvb3Q6OlNVQ0NFU1MpIHsKKyAgICAgICAgZGllKCJFcnJvciB3YWl0aW5nIGZvciBVU0IgZGlzY29ubmVjdC4iKTsKKyAgICB9CisgICAgZmItPnNldF90cmFuc3BvcnQobnVsbHB0cik7CiAKLSAgICBhdXRvKiBvbGRfdHJhbnNwb3J0ID0gZmItPnNldF90cmFuc3BvcnQobnVsbHB0cik7Ci0gICAgZGVsZXRlIG9sZF90cmFuc3BvcnQ7Ci0KLSAgICAvLyBHaXZlIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gdGltZSB0byBjbG9zZS4KKyAgICAvLyBOb3QgYWxsIHBsYXRmb3JtcyBzdXBwb3J0IFdhaXRGb3JEaXNjb25uZWN0LiBUaGVyZSBhbHNvIGlzbid0IGEgZ3JlYXQgd2F5IHRvIHRlbGwgd2hldGhlcgorICAgIC8vIG9yIG5vdCBXYWl0Rm9yRGlzY29ubmVjdCBpcyBzdXBwb3J0ZWQuIFNvLCBqdXN0IHdhaXQgYSBiaXQgZXh0cmEgZm9yIGV2ZXJ5b25lLCBpbiBvcmRlciB0bworICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBkZXZpY2UgaGFzIGhhZCB0aW1lIHRvIGluaXRpYXRlIGl0cyByZWJvb3QgYW5kIGRpc2Nvbm5lY3QgaXRzZWxmLgogICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6c2Vjb25kcygxKSk7CiAKICAgICBmYi0+c2V0X3RyYW5zcG9ydChvcGVuX2RldmljZSgpKTsKQEAgLTE1OTAsNyArMTY0Myw3IEBACiAgICAgaWYgKGltZ19uYW1lLmVtcHR5KCkpIHsKICAgICAgICAgaW1nX25hbWUgPSBwYXJ0aXRpb24gKyAiLmltZyI7CiAgICAgfQotICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEZsYXNoVGFzaz4oc2xvdCwgcGFydGl0aW9uLCBpbWdfbmFtZSwgYXBwbHlfdmJtZXRhKTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxGbGFzaFRhc2s+KHNsb3QsIHBhcnRpdGlvbiwgaW1nX25hbWUsIGFwcGx5X3ZibWV0YSwgZnApOwogfQogCiBzdGQ6OnVuaXF1ZV9wdHI8UmVib290VGFzaz4gUGFyc2VSZWJvb3RDb21tYW5kKGNvbnN0IEZsYXNoaW5nUGxhbiogZnAsCkBAIC0xNjM3LDE0ICsxNjkwLDIyIEBACiAgICAgcmV0dXJuIHRhc2s7CiB9CiAKLXZvaWQgQWRkUmVzaXplVGFza3MoY29uc3QgRmxhc2hpbmdQbGFuKiBmcCwgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFRhc2s+PiogdGFza3MpIHsKK2Jvb2wgQWRkUmVzaXplVGFza3MoY29uc3QgRmxhc2hpbmdQbGFuKiBmcCwgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFRhc2s+PiogdGFza3MpIHsKICAgICAvLyBleHBhbmRzICJyZXNpemUtcGFydGl0aW9ucyIgaW50byBpbmRpdmlkdWFsIGNvbW1hbmRzIDogcmVzaXplIHtvc19wYXJ0aXRpb25fMX0sIHJlc2l6ZQogICAgIC8vIHtvc19wYXJ0aXRpb25fMn0sIGV0Yy4KICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VGFzaz4+IHJlc2l6ZV90YXNrczsKICAgICBzdGQ6Om9wdGlvbmFsPHNpemVfdD4gbG9jOworICAgIHN0ZDo6dmVjdG9yPGNoYXI+IGNvbnRlbnRzOworICAgIGlmICghZnAtPnNvdXJjZS0+UmVhZEZpbGUoInN1cGVyX2VtcHR5LmltZyIsICZjb250ZW50cykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBhdXRvIG1ldGFkYXRhID0gYW5kcm9pZDo6ZnNfbWdyOjpSZWFkRnJvbUltYWdlQmxvYihjb250ZW50cy5kYXRhKCksIGNvbnRlbnRzLnNpemUoKSk7CisgICAgaWYgKCFtZXRhZGF0YSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGFza3MtPnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGlmIChhdXRvIGZsYXNoX3Rhc2sgPSB0YXNrcy0+YXQoaSktPkFzRmxhc2hUYXNrKCkpIHsKLSAgICAgICAgICAgIGlmIChzaG91bGRfZmxhc2hfaW5fdXNlcnNwYWNlKGZsYXNoX3Rhc2stPkdldFBhcnRpdGlvbkFuZFNsb3QoKSkpIHsKKyAgICAgICAgICAgIGlmIChGbGFzaFRhc2s6OklzRHluYW1pY1BhcnRpdGlvbihmcC0+c291cmNlLmdldCgpLCBmbGFzaF90YXNrKSkgewogICAgICAgICAgICAgICAgIGlmICghbG9jKSB7CiAgICAgICAgICAgICAgICAgICAgIGxvYyA9IGk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTY1NiwzNSArMTcxNywyMiBAQAogICAgIC8vIGlmIG5vIGxvZ2ljYWwgcGFydGl0aW9ucyAoYWx0aG91Z2ggc2hvdWxkIG5ldmVyIGhhcHBlbiBzaW5jZSBzeXN0ZW0gd2lsbCBhbHdheXMgbmVlZCB0byBiZQogICAgIC8vIGZsYXNoZWQpCiAgICAgaWYgKCFsb2MpIHsKLSAgICAgICAgcmV0dXJuOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHRhc2tzLT5pbnNlcnQodGFza3MtPmJlZ2luKCkgKyBsb2MudmFsdWUoKSwgc3RkOjptYWtlX21vdmVfaXRlcmF0b3IocmVzaXplX3Rhc2tzLmJlZ2luKCkpLAogICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX21vdmVfaXRlcmF0b3IocmVzaXplX3Rhc2tzLmVuZCgpKSk7Ci0gICAgcmV0dXJuOwotfQotCi1zdGF0aWMgYm9vbCBJc051bWJlcihjb25zdCBzdGQ6OnN0cmluZyYgcykgewotICAgIGJvb2wgcGVyaW9kID0gZmFsc2U7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgaWYgKCFpc2RpZ2l0KHNbaV0pKSB7Ci0gICAgICAgICAgICBpZiAoIXBlcmlvZCAmJiBzW2ldID09ICcuJyAmJiBpICE9IDAgJiYgaSAhPSBzLmxlbmd0aCgpIC0gMSkgewotICAgICAgICAgICAgICAgIHBlcmlvZCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKIH0KIAogc3RhdGljIGJvb2wgSXNJZ25vcmUoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjb21tYW5kKSB7Ci0gICAgaWYgKGNvbW1hbmRbMF1bMF0gPT0gJyMnKSB7CisgICAgaWYgKGNvbW1hbmQuc2l6ZSgpID09IDAgfHwgY29tbWFuZFswXVswXSA9PSAnIycpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKIH0KIAotYm9vbCBDaGVja0Zhc3Rib290SW5mb1JlcXVpcmVtZW50cyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGNvbW1hbmQpIHsKK2Jvb2wgQ2hlY2tGYXN0Ym9vdEluZm9SZXF1aXJlbWVudHMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBob3N0X3Rvb2xfdmVyc2lvbikgewogICAgIGlmIChjb21tYW5kLnNpemUoKSAhPSAyKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgInVua25vd24gY2hhcmFjdGVycyBpbiB2ZXJzaW9uIGluZm8gaW4gZmFzdGJvb3QtaW5mby50eHQgLT4gIgogICAgICAgICAgICAgICAgICAgIDw8IGFuZHJvaWQ6OmJhc2U6OkpvaW4oY29tbWFuZCwgIiAiKTsKQEAgLTE2OTYsMTggKzE3NDQsMjAgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmICghSXNOdW1iZXIoY29tbWFuZFsxXSkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAidmVyc2lvbiBudW1iZXIgY29udGFpbnMgbm9uLW51bWVyaWMgdmFsdWVzIGluIGZhc3Rib290LWluZm8udHh0IC0+ICIKKyAgICB1aW50MzJfdCBmYXN0Ym9vdF9pbmZvX3ZlcnNpb247CisgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpQYXJzZVVpbnQoY29tbWFuZFsxXSwgJmZhc3Rib290X2luZm9fdmVyc2lvbikpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAidmVyc2lvbiBudW1iZXIgY29udGFpbnMgbm9uLW51bWVyaWMgY2hhcmFjdGVycyBpbiBmYXN0Ym9vdC1pbmZvLnR4dCAtPiAiCiAgICAgICAgICAgICAgICAgICAgPDwgYW5kcm9pZDo6YmFzZTo6Sm9pbihjb21tYW5kLCAiICIpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgTE9HKFZFUkJPU0UpIDw8ICJDaGVja2luZyAnZmFzdGJvb3QtaW5mby50eHQgdmVyc2lvbiciOwotICAgIGlmIChjb21tYW5kWzFdIDwgUExBVEZPUk1fVE9PTFNfVkVSU0lPTikgeworICAgIGlmIChmYXN0Ym9vdF9pbmZvX3ZlcnNpb24gPD0gaG9zdF90b29sX3ZlcnNpb24pIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQorCiAgICAgTE9HKEVSUk9SKSA8PCAiZmFzYm9vdC1pbmZvLnR4dCB2ZXJzaW9uOiAiIDw8IGNvbW1hbmRbMV0KLSAgICAgICAgICAgICAgIDw8ICIgbm90IGNvbXBhdGlibGUgd2l0aCBob3N0IHRvb2wgdmVyc2lvbiAtLT4gIiA8PCBQTEFURk9STV9UT09MU19WRVJTSU9OOworICAgICAgICAgICAgICAgPDwgIiBub3QgY29tcGF0aWJsZSB3aXRoIGhvc3QgdG9vbCB2ZXJzaW9uIC0tPiAiIDw8IGhvc3RfdG9vbF92ZXJzaW9uOwogICAgIHJldHVybiBmYWxzZTsKIH0KIApAQCAtMTcyMSw3ICsxNzcxLDcgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIGlmIChjb21tYW5kLnNpemUoKSA+IDEgJiYgY29tbWFuZFswXSA9PSAidmVyc2lvbiIpIHsKLSAgICAgICAgICAgIGlmICghQ2hlY2tGYXN0Ym9vdEluZm9SZXF1aXJlbWVudHMoY29tbWFuZCkpIHsKKyAgICAgICAgICAgIGlmICghQ2hlY2tGYXN0Ym9vdEluZm9SZXF1aXJlbWVudHMoY29tbWFuZCwgRkFTVEJPT1RfSU5GT19WRVJTSU9OKSkgewogICAgICAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMTczMyw0NCArMTc4MywyMiBAQAogICAgICAgICB9CiAgICAgICAgIGF1dG8gdGFzayA9IFBhcnNlRmFzdGJvb3RJbmZvTGluZShmcCwgY29tbWFuZCk7CiAgICAgICAgIGlmICghdGFzaykgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRXJyb3Igd2hlbiBwYXJzaW5nIGZhc3Rib290LWluZm8udHh0LCBmYWxsaW5nIGJhY2sgb24gSGFyZGNvZGVkIGxpc3Q6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgdGV4dDsKICAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICAgfQogICAgICAgICB0YXNrcy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKHRhc2spKTsKICAgICB9Ci0gICAgaWYgKGF1dG8gZmxhc2hfc3VwZXJfdGFzayA9IEZsYXNoU3VwZXJMYXlvdXRUYXNrOjpJbml0aWFsaXplRnJvbVRhc2tzKGZwLCB0YXNrcykpIHsKLSAgICAgICAgYXV0byBpdCA9IHRhc2tzLmJlZ2luKCk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGFza3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChhdXRvIGZsYXNoX3Rhc2sgPSB0YXNrc1tpXS0+QXNGbGFzaFRhc2soKSkgewotICAgICAgICAgICAgICAgIGlmIChzaG91bGRfZmxhc2hfaW5fdXNlcnNwYWNlKGZsYXNoX3Rhc2stPkdldFBhcnRpdGlvbkFuZFNsb3QoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGF1dG8gd2lwZV90YXNrID0gdGFza3NbaV0tPkFzV2lwZVRhc2soKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaXQrKzsKLSAgICAgICAgfQotICAgICAgICB0YXNrcy5pbnNlcnQoaXQsIHN0ZDo6bW92ZShmbGFzaF9zdXBlcl90YXNrKSk7CisKKyAgICBpZiAoYXV0byBmbGFzaF9zdXBlcl90YXNrID0gT3B0aW1pemVkRmxhc2hTdXBlclRhc2s6OkluaXRpYWxpemUoZnAsIHRhc2tzKSkgeworICAgICAgICB0YXNrcy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKGZsYXNoX3N1cGVyX3Rhc2spKTsKICAgICB9IGVsc2UgewotICAgICAgICBBZGRSZXNpemVUYXNrcyhmcCwgJnRhc2tzKTsKKyAgICAgICAgaWYgKCFBZGRSZXNpemVUYXNrcyhmcCwgJnRhc2tzKSkgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJGYWlsZWQgdG8gYWRkIHJlc2l6ZSB0YXNrcyI7CisgICAgICAgIH0KICAgICB9CisKICAgICByZXR1cm4gdGFza3M7CiB9CiAKLXN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxUYXNrPj4gUGFyc2VGYXN0Ym9vdEluZm8oY29uc3QgRmxhc2hpbmdQbGFuKiBmcCwgc3RkOjppZnN0cmVhbSYgZnMpIHsKLSAgICBpZiAoIWZzIHx8IGZzLmVvZigpKSByZXR1cm4ge307Ci0KLSAgICBzdGQ6OnN0cmluZyB0ZXh0OwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBmaWxlOwotICAgIC8vIEdldCBvc19wYXJ0aXRpb25zIHRoYXQgbmVlZCB0byBiZSByZXNpemVkCi0gICAgd2hpbGUgKHN0ZDo6Z2V0bGluZShmcywgdGV4dCkpIHsKLSAgICAgICAgZmlsZS5lbXBsYWNlX2JhY2sodGV4dCk7Ci0gICAgfQotICAgIHJldHVybiBQYXJzZUZhc3Rib290SW5mbyhmcCwgZmlsZSk7Ci19Ci0KIEZsYXNoQWxsVG9vbDo6Rmxhc2hBbGxUb29sKEZsYXNoaW5nUGxhbiogZnApIDogZnBfKGZwKSB7fQogCiB2b2lkIEZsYXNoQWxsVG9vbDo6Rmxhc2goKSB7CkBAIC0xNzg2LDI3ICsxODE0LDM5IEBACiAgICAgfQogCiAgICAgRGV0ZXJtaW5lU2xvdCgpOwotICAgIENvbGxlY3RJbWFnZXMoKTsKIAogICAgIENhbmNlbFNuYXBzaG90SWZOZWVkZWQoKTsKIAotICAgIHN0ZDo6c3RyaW5nIHBhdGggPSBmaW5kX2l0ZW1fZ2l2ZW5fbmFtZSgiZmFzdGJvb3QtaW5mby50eHQiKTsKLSAgICBzdGQ6Omlmc3RyZWFtIHN0cmVhbShwYXRoKTsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VGFzaz4+IHRhc2tzID0gUGFyc2VGYXN0Ym9vdEluZm8oZnBfLCBzdHJlYW0pOwotICAgIGlmICh0YXNrcy5lbXB0eSgpKSB7Ci0gICAgICAgIExPRyhWRVJCT1NFKSA8PCAiRmxhc2hpbmcgZnJvbSBoYXJkY29kZWQgaW1hZ2VzLiBmYXN0Ym9vdC1pbmZvLnR4dCBpcyBlbXB0eSBvciBkb2VzIG5vdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiZXhpc3QiOwotICAgICAgICBIYXJkY29kZWRGbGFzaCgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIExPRyhWRVJCT1NFKSA8PCAiRmxhc2hpbmcgZnJvbSBmYXN0Ym9vdC1pbmZvLnR4dCI7Ci0gICAgZm9yIChhdXRvJiB0YXNrIDogdGFza3MpIHsKKyAgICB0YXNrc18gPSBDb2xsZWN0VGFza3MoKTsKKworICAgIGZvciAoYXV0byYgdGFzayA6IHRhc2tzXykgewogICAgICAgICB0YXNrLT5SdW4oKTsKICAgICB9Ci0gICAgaWYgKGZwXy0+d2FudHNfd2lwZSkgewotICAgICAgICAvLyBhdm9pZCBhZGRpbmcgZHVwbGljYXRlIHdpcGUgdGFza3MgaW4gZmFzdGJvb3QgbWFpbiBjb2RlLgotICAgICAgICBmcF8tPndhbnRzX3dpcGUgPSBmYWxzZTsKKyAgICByZXR1cm47Cit9CisKK3N0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxUYXNrPj4gRmxhc2hBbGxUb29sOjpDb2xsZWN0VGFza3MoKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFRhc2s+PiB0YXNrczsKKyAgICBpZiAoZnBfLT5zaG91bGRfdXNlX2Zhc3Rib290X2luZm8pIHsKKyAgICAgICAgdGFza3MgPSBDb2xsZWN0VGFza3NGcm9tRmFzdGJvb3RJbmZvKCk7CisKKyAgICB9IGVsc2UgeworICAgICAgICB0YXNrcyA9IENvbGxlY3RUYXNrc0Zyb21JbWFnZUxpc3QoKTsKICAgICB9CisgICAgaWYgKGZwXy0+ZXhjbHVkZV9keW5hbWljX3BhcnRpdGlvbnMpIHsKKyAgICAgICAgYXV0byBpc19ub25fc3RhdGljX2ZsYXNoX3Rhc2sgPSBbJl0oY29uc3QgYXV0byYgdGFzaykgLT4gYm9vbCB7CisgICAgICAgICAgICBpZiAoYXV0byBmbGFzaF90YXNrID0gdGFzay0+QXNGbGFzaFRhc2soKSkgeworICAgICAgICAgICAgICAgIGlmICghc2hvdWxkX2ZsYXNoX2luX3VzZXJzcGFjZShmcF8tPnNvdXJjZS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhc2hfdGFzay0+R2V0UGFydGl0aW9uQW5kU2xvdCgpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH07CisgICAgICAgIHRhc2tzLmVyYXNlKHN0ZDo6cmVtb3ZlX2lmKHRhc2tzLmJlZ2luKCksIHRhc2tzLmVuZCgpLCBpc19ub25fc3RhdGljX2ZsYXNoX3Rhc2spLAorICAgICAgICAgICAgICAgICAgICB0YXNrcy5lbmQoKSk7CisgICAgfQorICAgIHJldHVybiB0YXNrczsKIH0KIAogdm9pZCBGbGFzaEFsbFRvb2w6OkNoZWNrUmVxdWlyZW1lbnRzKCkgewpAQCAtMTgzMyw3ICsxODczLDcgQEAKICAgICAgICAgZnBfLT5zZWNvbmRhcnlfc2xvdCA9IGdldF9vdGhlcl9zbG90KCk7CiAgICAgfQogICAgIGlmIChmcF8tPnNlY29uZGFyeV9zbG90ID09ICIiKSB7Ci0gICAgICAgIGlmIChzdXBwb3J0c19BQigpKSB7CisgICAgICAgIGlmIChzdXBwb3J0c19BQihmYikpIHsKICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogQ291bGQgbm90IGRldGVybWluZSBzbG90IGZvciBzZWNvbmRhcnkgaW1hZ2VzLiBJZ25vcmluZy5cbiIpOwogICAgICAgICB9CiAgICAgICAgIGZwXy0+c2tpcF9zZWNvbmRhcnkgPSB0cnVlOwpAQCAtMTg1Nyw4OSArMTg5Nyw2NSBAQAogICAgIH0KIH0KIAotdm9pZCBGbGFzaEFsbFRvb2w6OkhhcmRjb2RlZEZsYXNoKCkgeworc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFRhc2s+PiBGbGFzaEFsbFRvb2w6OkNvbGxlY3RUYXNrc0Zyb21JbWFnZUxpc3QoKSB7CiAgICAgQ29sbGVjdEltYWdlcygpOwogICAgIC8vIEZpcnN0IGZsYXNoIGJvb3QgcGFydGl0aW9ucy4gV2UgYWxsb3cgdGhpcyB0byBoYXBwZW4gZWl0aGVyIGluIHVzZXJzcGFjZQogICAgIC8vIG9yIGluIGJvb3Rsb2FkZXIgZmFzdGJvb3QuCi0gICAgRmxhc2hJbWFnZXMoYm9vdF9pbWFnZXNfKTsKLQogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxUYXNrPj4gdGFza3M7CisgICAgQWRkRmxhc2hUYXNrcyhib290X2ltYWdlc18sIHRhc2tzKTsKIAotICAgIGlmIChhdXRvIGZsYXNoX3N1cGVyX3Rhc2sgPSBGbGFzaFN1cGVyTGF5b3V0VGFzazo6SW5pdGlhbGl6ZShmcF8sIG9zX2ltYWdlc18pKSB7CisgICAgLy8gU3luYyB0aGUgc3VwZXIgcGFydGl0aW9uLiBUaGlzIHdpbGwgcmVib290IHRvIHVzZXJzcGFjZSBmYXN0Ym9vdCBpZiBuZWVkZWQuCisgICAgdGFza3MuZW1wbGFjZV9iYWNrKHN0ZDo6bWFrZV91bmlxdWU8VXBkYXRlU3VwZXJUYXNrPihmcF8pKTsKKworICAgIEFkZEZsYXNoVGFza3Mob3NfaW1hZ2VzXywgdGFza3MpOworCisgICAgaWYgKGF1dG8gZmxhc2hfc3VwZXJfdGFzayA9IE9wdGltaXplZEZsYXNoU3VwZXJUYXNrOjpJbml0aWFsaXplKGZwXywgdGFza3MpKSB7CiAgICAgICAgIHRhc2tzLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoZmxhc2hfc3VwZXJfdGFzaykpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFN5bmMgdGhlIHN1cGVyIHBhcnRpdGlvbi4gVGhpcyB3aWxsIHJlYm9vdCB0byB1c2Vyc3BhY2UgZmFzdGJvb3QgaWYgbmVlZGVkLgotICAgICAgICB0YXNrcy5lbXBsYWNlX2JhY2soc3RkOjptYWtlX3VuaXF1ZTxVcGRhdGVTdXBlclRhc2s+KGZwXykpOwogICAgICAgICAvLyBSZXNpemUgYW55IGxvZ2ljYWwgcGFydGl0aW9uIHRvIDAsIHNvIGVhY2ggcGFydGl0aW9uIGlzIHJlc2V0IHRvIDAKICAgICAgICAgLy8gZXh0ZW50cywgYW5kIHdpbGwgYWNoaWV2ZSBtb3JlIG9wdGltYWwgYWxsb2NhdGlvbi4KLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBbaW1hZ2UsIHNsb3RdIDogb3NfaW1hZ2VzXykgewotICAgICAgICAgICAgLy8gUmV0cm9maXQgZGV2aWNlcyBoYXZlIHR3byBzdXBlciBwYXJ0aXRpb25zLCBuYW1lZCBzdXBlcl9hIGFuZCBzdXBlcl9iLgotICAgICAgICAgICAgLy8gT24gdGhlc2UgZGV2aWNlcywgc2Vjb25kYXJ5IHNsb3RzIG11c3QgYmUgZmxhc2hlZCBhcyBwaHlzaWNhbAotICAgICAgICAgICAgLy8gcGFydGl0aW9ucyAob3RoZXJ3aXNlIHRoZXkgd291bGQgbm90IG1vdW50IG9uIGZpcnN0IGJvb3QpLiBUbyBlbmZvcmNlCi0gICAgICAgICAgICAvLyB0aGlzLCB3ZSBkZWxldGUgYW55IGxvZ2ljYWwgcGFydGl0aW9ucyBmb3IgdGhlICJvdGhlciIgc2xvdC4KLSAgICAgICAgICAgIGlmIChpc19yZXRyb2ZpdF9kZXZpY2UoKSkgewotICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHBhcnRpdGlvbl9uYW1lID0gaW1hZ2UtPnBhcnRfbmFtZSArICJfInMgKyBzbG90OwotICAgICAgICAgICAgICAgIGlmIChpbWFnZS0+SXNTZWNvbmRhcnkoKSAmJiBzaG91bGRfZmxhc2hfaW5fdXNlcnNwYWNlKHBhcnRpdGlvbl9uYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBmcF8tPmZiLT5EZWxldGVQYXJ0aXRpb24ocGFydGl0aW9uX25hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0YXNrcy5lbXBsYWNlX2JhY2soc3RkOjptYWtlX3VuaXF1ZTxEZWxldGVUYXNrPihmcF8sIHBhcnRpdGlvbl9uYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0YXNrcy5lbXBsYWNlX2JhY2soc3RkOjptYWtlX3VuaXF1ZTxSZXNpemVUYXNrPihmcF8sIGltYWdlLT5wYXJ0X25hbWUsICIwIiwgc2xvdCkpOworICAgICAgICBpZiAoIUFkZFJlc2l6ZVRhc2tzKGZwXywgJnRhc2tzKSkgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJGYWlsZWQgdG8gYWRkIHJlc2l6ZSB0YXNrcyI7CiAgICAgICAgIH0KICAgICB9Ci0gICAgZm9yIChhdXRvJiBpIDogdGFza3MpIHsKLSAgICAgICAgaS0+UnVuKCk7Ci0gICAgfQotICAgIEZsYXNoSW1hZ2VzKG9zX2ltYWdlc18pOworCisgICAgcmV0dXJuIHRhc2tzOwogfQogCi12b2lkIEZsYXNoQWxsVG9vbDo6Rmxhc2hJbWFnZXMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGNvbnN0IEltYWdlKiwgc3RkOjpzdHJpbmc+PiYgaW1hZ2VzKSB7CitzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VGFzaz4+IEZsYXNoQWxsVG9vbDo6Q29sbGVjdFRhc2tzRnJvbUZhc3Rib290SW5mbygpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VGFzaz4+IHRhc2tzOworICAgIHN0ZDo6dmVjdG9yPGNoYXI+IGNvbnRlbnRzOworICAgIGlmICghZnBfLT5zb3VyY2UtPlJlYWRGaWxlKCJmYXN0Ym9vdC1pbmZvLnR4dCIsICZjb250ZW50cykpIHsKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJGbGFzaGluZyBmcm9tIGhhcmRjb2RlZCBpbWFnZXMuIGZhc3Rib290LWluZm8udHh0IGlzIGVtcHR5IG9yIGRvZXMgbm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJleGlzdCI7CisgICAgICAgIHJldHVybiBDb2xsZWN0VGFza3NGcm9tSW1hZ2VMaXN0KCk7CisgICAgfQorICAgIHRhc2tzID0gUGFyc2VGYXN0Ym9vdEluZm8oZnBfLCBTcGxpdCh7Y29udGVudHMuZGF0YSgpLCBjb250ZW50cy5zaXplKCl9LCAiXG4iKSk7CisgICAgcmV0dXJuIHRhc2tzOworfQorCit2b2lkIEZsYXNoQWxsVG9vbDo6QWRkRmxhc2hUYXNrcyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgSW1hZ2UqLCBzdGQ6OnN0cmluZz4+JiBpbWFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VGFzaz4+JiB0YXNrcykgewogICAgIGZvciAoY29uc3QgYXV0byYgW2ltYWdlLCBzbG90XSA6IGltYWdlcykgewogICAgICAgICBmYXN0Ym9vdF9idWZmZXIgYnVmOwogICAgICAgICB1bmlxdWVfZmQgZmQgPSBmcF8tPnNvdXJjZS0+T3BlbkZpbGUoaW1hZ2UtPmltZ19uYW1lKTsKLSAgICAgICAgaWYgKGZkIDwgMCB8fCAhbG9hZF9idWZfZmQoc3RkOjptb3ZlKGZkKSwgJmJ1ZikpIHsKKyAgICAgICAgaWYgKGZkIDwgMCB8fCAhbG9hZF9idWZfZmQoc3RkOjptb3ZlKGZkKSwgJmJ1ZiwgZnBfKSkgewogICAgICAgICAgICAgaWYgKGltYWdlLT5vcHRpb25hbF9pZl9ub19pbWFnZSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZGllKCJjb3VsZCBub3QgbG9hZCAnJXMnOiAlcyIsIGltYWdlLT5pbWdfbmFtZS5jX3N0cigpLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICB9Ci0gICAgICAgIEZsYXNoSW1hZ2UoKmltYWdlLCBzbG90LCAmYnVmKTsKKyAgICAgICAgdGFza3MuZW1wbGFjZV9iYWNrKHN0ZDo6bWFrZV91bmlxdWU8Rmxhc2hUYXNrPihzbG90LCBpbWFnZS0+cGFydF9uYW1lLCBpbWFnZS0+aW1nX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfdmJtZXRhX3BhcnRpdGlvbihpbWFnZS0+cGFydF9uYW1lKSwgZnBfKSk7CiAgICAgfQogfQogCi12b2lkIEZsYXNoQWxsVG9vbDo6Rmxhc2hJbWFnZShjb25zdCBJbWFnZSYgaW1hZ2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzbG90LCBmYXN0Ym9vdF9idWZmZXIqIGJ1ZikgewotICAgIGF1dG8gZmxhc2ggPSBbJiwgdGhpc10oY29uc3Qgc3RkOjpzdHJpbmcmIHBhcnRpdGlvbl9uYW1lKSB7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPGNoYXI+IHNpZ25hdHVyZV9kYXRhOwotICAgICAgICBpZiAoZnBfLT5zb3VyY2UtPlJlYWRGaWxlKGltYWdlLnNpZ19uYW1lLCAmc2lnbmF0dXJlX2RhdGEpKSB7Ci0gICAgICAgICAgICBmYi0+RG93bmxvYWQoInNpZ25hdHVyZSIsIHNpZ25hdHVyZV9kYXRhKTsKLSAgICAgICAgICAgIGZiLT5SYXdDb21tYW5kKCJzaWduYXR1cmUiLCAiaW5zdGFsbGluZyBzaWduYXR1cmUiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc19sb2dpY2FsKHBhcnRpdGlvbl9uYW1lKSkgewotICAgICAgICAgICAgZmItPlJlc2l6ZVBhcnRpdGlvbihwYXJ0aXRpb25fbmFtZSwgc3RkOjp0b19zdHJpbmcoYnVmLT5pbWFnZV9zaXplKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmbGFzaF9idWYocGFydGl0aW9uX25hbWUuY19zdHIoKSwgYnVmLCBpc192Ym1ldGFfcGFydGl0aW9uKHBhcnRpdGlvbl9uYW1lKSk7Ci0gICAgfTsKLSAgICBkb19mb3JfcGFydGl0aW9ucyhpbWFnZS5wYXJ0X25hbWUsIHNsb3QsIGZsYXNoLCBmYWxzZSk7Ci19Ci0KLWNsYXNzIFppcEltYWdlU291cmNlIGZpbmFsIDogcHVibGljIEltYWdlU291cmNlIHsKLSAgcHVibGljOgotICAgIGV4cGxpY2l0IFppcEltYWdlU291cmNlKFppcEFyY2hpdmVIYW5kbGUgemlwKSA6IHppcF8oemlwKSB7fQotICAgIGJvb2wgUmVhZEZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHN0ZDo6dmVjdG9yPGNoYXI+KiBvdXQpIGNvbnN0IG92ZXJyaWRlOwotICAgIHVuaXF1ZV9mZCBPcGVuRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgcHJpdmF0ZToKLSAgICBaaXBBcmNoaXZlSGFuZGxlIHppcF87Ci19OwotCiBib29sIFppcEltYWdlU291cmNlOjpSZWFkRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgc3RkOjp2ZWN0b3I8Y2hhcj4qIG91dCkgY29uc3QgewogICAgIHJldHVybiBVbnppcFRvTWVtb3J5KHppcF8sIG5hbWUsIG91dCk7CiB9CiAKIHVuaXF1ZV9mZCBaaXBJbWFnZVNvdXJjZTo6T3BlbkZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIGNvbnN0IHsKLSAgICByZXR1cm4gdW56aXBfdG9fZmlsZSh6aXBfLCBuYW1lLmNfc3RyKCkpOworICAgIHJldHVybiBVbnppcFRvRmlsZSh6aXBfLCBuYW1lLmNfc3RyKCkpOwogfQogCiBzdGF0aWMgdm9pZCBkb191cGRhdGUoY29uc3QgY2hhciogZmlsZW5hbWUsIEZsYXNoaW5nUGxhbiogZnApIHsKQEAgLTE5NDgsMjEgKzE5NjQsMTMgQEAKICAgICBpZiAoZXJyb3IgIT0gMCkgewogICAgICAgICBkaWUoImZhaWxlZCB0byBvcGVuIHppcCBmaWxlICclcyc6ICVzIiwgZmlsZW5hbWUsIEVycm9yQ29kZVN0cmluZyhlcnJvcikpOwogICAgIH0KLSAgICBaaXBJbWFnZVNvdXJjZSB6cCA9IFppcEltYWdlU291cmNlKHppcCk7Ci0gICAgZnAtPnNvdXJjZSA9ICZ6cDsKLSAgICBmcC0+d2FudHNfd2lwZSA9IGZhbHNlOworICAgIGZwLT5zb3VyY2UucmVzZXQobmV3IFppcEltYWdlU291cmNlKHppcCkpOwogICAgIEZsYXNoQWxsVG9vbCB0b29sKGZwKTsKICAgICB0b29sLkZsYXNoKCk7CiAKICAgICBDbG9zZUFyY2hpdmUoemlwKTsKIH0KIAotY2xhc3MgTG9jYWxJbWFnZVNvdXJjZSBmaW5hbCA6IHB1YmxpYyBJbWFnZVNvdXJjZSB7Ci0gIHB1YmxpYzoKLSAgICBib29sIFJlYWRGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBzdGQ6OnZlY3RvcjxjaGFyPiogb3V0KSBjb25zdCBvdmVycmlkZTsKLSAgICB1bmlxdWVfZmQgT3BlbkZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIGNvbnN0IG92ZXJyaWRlOwotfTsKLQogYm9vbCBMb2NhbEltYWdlU291cmNlOjpSZWFkRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgc3RkOjp2ZWN0b3I8Y2hhcj4qIG91dCkgY29uc3QgewogICAgIGF1dG8gcGF0aCA9IGZpbmRfaXRlbV9naXZlbl9uYW1lKG5hbWUpOwogICAgIGlmIChwYXRoLmVtcHR5KCkpIHsKQEAgLTE5NzcsOCArMTk4NSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGRvX2ZsYXNoYWxsKEZsYXNoaW5nUGxhbiogZnApIHsKLSAgICBMb2NhbEltYWdlU291cmNlIHMgPSBMb2NhbEltYWdlU291cmNlKCk7Ci0gICAgZnAtPnNvdXJjZSA9ICZzOworICAgIGZwLT5zb3VyY2UucmVzZXQobmV3IExvY2FsSW1hZ2VTb3VyY2UoKSk7CiAgICAgRmxhc2hBbGxUb29sIHRvb2woZnApOwogICAgIHRvb2wuRmxhc2goKTsKIH0KQEAgLTIwMjIsNyArMjAyOSw3IEBACiAKIHZvaWQgZmJfcGVyZm9ybV9mb3JtYXQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhcnRpdGlvbiwgaW50IHNraXBfaWZfbm90X3N1cHBvcnRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGVfb3ZlcnJpZGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzaXplX292ZXJyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBmc19vcHRpb25zKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGZzX29wdGlvbnMsIGNvbnN0IEZsYXNoaW5nUGxhbiogZnApIHsKICAgICBzdGQ6OnN0cmluZyBwYXJ0aXRpb25fdHlwZSwgcGFydGl0aW9uX3NpemU7CiAKICAgICBzdHJ1Y3QgZmFzdGJvb3RfYnVmZmVyIGJ1ZjsKQEAgLTIwMzUsOCArMjA0Miw4IEBACiAgICAgaWYgKHRhcmdldF9zcGFyc2VfbGltaXQgPiAwICYmIHRhcmdldF9zcGFyc2VfbGltaXQgPCBsaW1pdCkgewogICAgICAgICBsaW1pdCA9IHRhcmdldF9zcGFyc2VfbGltaXQ7CiAgICAgfQotICAgIGlmIChzcGFyc2VfbGltaXQgPiAwICYmIHNwYXJzZV9saW1pdCA8IGxpbWl0KSB7Ci0gICAgICAgIGxpbWl0ID0gc3BhcnNlX2xpbWl0OworICAgIGlmIChmcC0+c3BhcnNlX2xpbWl0ID4gMCAmJiBmcC0+c3BhcnNlX2xpbWl0IDwgbGltaXQpIHsKKyAgICAgICAgbGltaXQgPSBmcC0+c3BhcnNlX2xpbWl0OwogICAgIH0KIAogICAgIGlmIChmYi0+R2V0VmFyKCJwYXJ0aXRpb24tdHlwZToiICsgcGFydGl0aW9uLCAmcGFydGl0aW9uX3R5cGUpICE9IGZhc3Rib290OjpTVUNDRVNTKSB7CkBAIC0yMDkxLDEwICsyMDk4LDExIEBACiAgICAgaWYgKGZkID09IC0xKSB7CiAgICAgICAgIGRpZSgiQ2Fubm90IG9wZW4gZ2VuZXJhdGVkIGltYWdlOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgfQotICAgIGlmICghbG9hZF9idWZfZmQoc3RkOjptb3ZlKGZkKSwgJmJ1ZikpIHsKKyAgICBpZiAoIWxvYWRfYnVmX2ZkKHN0ZDo6bW92ZShmZCksICZidWYsIGZwKSkgewogICAgICAgICBkaWUoIkNhbm5vdCByZWFkIGltYWdlOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgfQotICAgIGZsYXNoX2J1ZihwYXJ0aXRpb24sICZidWYsIGlzX3ZibWV0YV9wYXJ0aXRpb24ocGFydGl0aW9uKSk7CisKKyAgICBmbGFzaF9idWYoZnAtPnNvdXJjZS5nZXQoKSwgcGFydGl0aW9uLCAmYnVmLCBpc192Ym1ldGFfcGFydGl0aW9uKHBhcnRpdGlvbikpOwogICAgIHJldHVybjsKIAogZmFpbGVkOgpAQCAtMjEwOCwyMyArMjExNiwzMSBAQAogICAgIH0KIH0KIAotYm9vbCBzaG91bGRfZmxhc2hfaW5fdXNlcnNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJ0aXRpb25fbmFtZSkgewotICAgIGlmICghZ2V0X2FuZHJvaWRfcHJvZHVjdF9vdXQoKSkgeworYm9vbCBzaG91bGRfZmxhc2hfaW5fdXNlcnNwYWNlKGNvbnN0IEltYWdlU291cmNlKiBzb3VyY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJ0aXRpb25fbmFtZSkgeworICAgIGlmICghc291cmNlKSB7CisgICAgICAgIGlmICghZ2V0X2FuZHJvaWRfcHJvZHVjdF9vdXQoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGF1dG8gcGF0aCA9IGZpbmRfaXRlbV9naXZlbl9uYW1lKCJzdXBlcl9lbXB0eS5pbWciKTsKKyAgICAgICAgaWYgKHBhdGguZW1wdHkoKSB8fCBhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGF1dG8gbWV0YWRhdGEgPSBhbmRyb2lkOjpmc19tZ3I6OlJlYWRGcm9tSW1hZ2VGaWxlKHBhdGgpOworICAgICAgICBpZiAoIW1ldGFkYXRhKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNob3VsZF9mbGFzaF9pbl91c2Vyc3BhY2UoKm1ldGFkYXRhLmdldCgpLCBwYXJ0aXRpb25fbmFtZSk7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPGNoYXI+IGNvbnRlbnRzOworICAgIGlmICghc291cmNlLT5SZWFkRmlsZSgic3VwZXJfZW1wdHkuaW1nIiwgJmNvbnRlbnRzKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIGF1dG8gcGF0aCA9IGZpbmRfaXRlbV9naXZlbl9uYW1lKCJzdXBlcl9lbXB0eS5pbWciKTsKLSAgICBpZiAocGF0aC5lbXB0eSgpIHx8IGFjY2VzcyhwYXRoLmNfc3RyKCksIFJfT0spKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgYXV0byBtZXRhZGF0YSA9IGFuZHJvaWQ6OmZzX21ncjo6UmVhZEZyb21JbWFnZUZpbGUocGF0aCk7Ci0gICAgaWYgKCFtZXRhZGF0YSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQorICAgIGF1dG8gbWV0YWRhdGEgPSBhbmRyb2lkOjpmc19tZ3I6OlJlYWRGcm9tSW1hZ2VCbG9iKGNvbnRlbnRzLmRhdGEoKSwgY29udGVudHMuc2l6ZSgpKTsKICAgICByZXR1cm4gc2hvdWxkX2ZsYXNoX2luX3VzZXJzcGFjZSgqbWV0YWRhdGEuZ2V0KCksIHBhcnRpdGlvbl9uYW1lKTsKIH0KIAogc3RhdGljIGJvb2wgd2lwZV9zdXBlcihjb25zdCBhbmRyb2lkOjpmc19tZ3I6OkxwTWV0YWRhdGEmIG1ldGFkYXRhLCBjb25zdCBzdGQ6OnN0cmluZyYgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG1lc3NhZ2UsIGNvbnN0IEZsYXNoaW5nUGxhbiogZnApIHsKICAgICBhdXRvIHN1cGVyX2RldmljZSA9IEdldE1ldGFkYXRhU3VwZXJCbG9ja0RldmljZShtZXRhZGF0YSk7CiAgICAgYXV0byBibG9ja19zaXplID0gbWV0YWRhdGEuZ2VvbWV0cnkubG9naWNhbF9ibG9ja19zaXplOwogICAgIGF1dG8gc3VwZXJfYmRldl9uYW1lID0gYW5kcm9pZDo6ZnNfbWdyOjpHZXRCbG9ja0RldmljZVBhcnRpdGlvbk5hbWUoKnN1cGVyX2RldmljZSk7CkBAIC0yMTQzLDcgKzIxNTksNyBAQAogICAgIGlmIChtZXRhZGF0YS5ibG9ja19kZXZpY2VzLnNpemUoKSA+IDEpIHsKICAgICAgICAgb2sgPSBXcml0ZVNwbGl0SW1hZ2VGaWxlcyh0ZW1wX2Rpci5wYXRoLCBtZXRhZGF0YSwgYmxvY2tfc2l6ZSwge30sIHRydWUpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGF1dG8gaW1hZ2VfcGF0aCA9IHRlbXBfZGlyLnBhdGggKyAiLyJzICsgc3VwZXJfYmRldl9uYW1lICsgIi5pbWciOworICAgICAgICBhdXRvIGltYWdlX3BhdGggPSBzdGQ6OnN0cmluZyh0ZW1wX2Rpci5wYXRoKSArICIvIiArIHN0ZDo6c3RyaW5nKHN1cGVyX2JkZXZfbmFtZSkgKyAiLmltZyI7CiAgICAgICAgIG9rID0gV3JpdGVUb0ltYWdlRmlsZShpbWFnZV9wYXRoLCBtZXRhZGF0YSwgYmxvY2tfc2l6ZSwge30sIHRydWUpOwogICAgIH0KICAgICBpZiAoIW9rKSB7CkBAIC0yMTYyLDkgKzIxNzgsOSBAQAogICAgICAgICAgICAgaW1hZ2VfbmFtZSA9IHBhcnRpdGlvbiArICIuaW1nIjsKICAgICAgICAgfQogCi0gICAgICAgIGF1dG8gaW1hZ2VfcGF0aCA9IHRlbXBfZGlyLnBhdGggKyAiLyJzICsgaW1hZ2VfbmFtZTsKKyAgICAgICAgYXV0byBpbWFnZV9wYXRoID0gc3RkOjpzdHJpbmcodGVtcF9kaXIucGF0aCkgKyAiLyIgKyBpbWFnZV9uYW1lOwogICAgICAgICBhdXRvIGZsYXNoID0gWyZdKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJ0aXRpb25fbmFtZSkgewotICAgICAgICAgICAgZG9fZmxhc2gocGFydGl0aW9uX25hbWUuY19zdHIoKSwgaW1hZ2VfcGF0aC5jX3N0cigpLCBmYWxzZSk7CisgICAgICAgICAgICBkb19mbGFzaChwYXJ0aXRpb25fbmFtZS5jX3N0cigpLCBpbWFnZV9wYXRoLmNfc3RyKCksIGZhbHNlLCBmcCk7CiAgICAgICAgIH07CiAgICAgICAgIGRvX2Zvcl9wYXJ0aXRpb25zKHBhcnRpdGlvbiwgc2xvdCwgZmxhc2gsIGZvcmNlX3Nsb3QpOwogCkBAIC0yMTczLDcgKzIxODksOCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgdm9pZCBkb193aXBlX3N1cGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbWFnZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHNsb3Rfb3ZlcnJpZGUpIHsKK3N0YXRpYyB2b2lkIGRvX3dpcGVfc3VwZXIoY29uc3Qgc3RkOjpzdHJpbmcmIGltYWdlLCBjb25zdCBzdGQ6OnN0cmluZyYgc2xvdF9vdmVycmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxhc2hpbmdQbGFuKiBmcCkgewogICAgIGlmIChhY2Nlc3MoaW1hZ2UuY19zdHIoKSwgUl9PSykgIT0gMCkgewogICAgICAgICBkaWUoIkNvdWxkIG5vdCByZWFkIGltYWdlOiAlcyIsIGltYWdlLmNfc3RyKCkpOwogICAgIH0KQEAgLTIxODgsNyArMjIwNSw3IEBACiAgICAgfQogCiAgICAgc3RkOjpzdHJpbmcgbWVzc2FnZTsKLSAgICBpZiAoIXdpcGVfc3VwZXIoKm1ldGFkYXRhLmdldCgpLCBzbG90LCAmbWVzc2FnZSkpIHsKKyAgICBpZiAoIXdpcGVfc3VwZXIoKm1ldGFkYXRhLmdldCgpLCBzbG90LCAmbWVzc2FnZSwgZnApKSB7CiAgICAgICAgIGRpZShtZXNzYWdlKTsKICAgICB9CiB9CkBAIC0yMjMwLDYgKzIyNDcsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ImNtZGxpbmUiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgMH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiZGlzYWJsZS12ZXJpZmljYXRpb24iLCBub19hcmd1bWVudCwgMCwgMH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiZGlzYWJsZS12ZXJpdHkiLCBub19hcmd1bWVudCwgMCwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiZGlzYWJsZS1zdXBlci1vcHRpbWl6YXRpb24iLCBub19hcmd1bWVudCwgMCwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiZXhjbHVkZS1keW5hbWljLXBhcnRpdGlvbnMiLCBub19hcmd1bWVudCwgMCwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiZGlzYWJsZS1mYXN0Ym9vdC1pbmZvIiwgbm9fYXJndW1lbnQsIDAsIDB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ImZvcmNlIiwgbm9fYXJndW1lbnQsIDAsIDB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ImZzLW9wdGlvbnMiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgMH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiaGVhZGVyLXZlcnNpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgMH0sCkBAIC0yMjUxLDcgKzIyNzEsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIDAsIDB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMCwgMCwgMH19OwogCi0gICAgc2VyaWFsID0gZ2V0ZW52KCJBTkRST0lEX1NFUklBTCIpOworICAgIHNlcmlhbCA9IGdldGVudigiRkFTVEJPT1RfREVWSUNFIik7CisgICAgaWYgKCFzZXJpYWwpIHsKKyAgICAgICAgc2VyaWFsID0gZ2V0ZW52KCJBTkRST0lEX1NFUklBTCIpOworICAgIH0KIAogICAgIGludCBjOwogICAgIHdoaWxlICgoYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJhOjpobHM6Uzp2dyIsIGxvbmdvcHRzLCAmbG9uZ2luZGV4KSkgIT0gLTEpIHsKQEAgLTIyNjUsNiArMjI4OCwxMyBAQAogICAgICAgICAgICAgICAgIGdfZGlzYWJsZV92ZXJpZmljYXRpb24gPSB0cnVlOwogICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lID09ICJkaXNhYmxlLXZlcml0eSIpIHsKICAgICAgICAgICAgICAgICBnX2Rpc2FibGVfdmVyaXR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSAiZGlzYWJsZS1zdXBlci1vcHRpbWl6YXRpb24iKSB7CisgICAgICAgICAgICAgICAgZnAtPnNob3VsZF9vcHRpbWl6ZV9mbGFzaF9zdXBlciA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lID09ICJleGNsdWRlLWR5bmFtaWMtcGFydGl0aW9ucyIpIHsKKyAgICAgICAgICAgICAgICBmcC0+ZXhjbHVkZV9keW5hbWljX3BhcnRpdGlvbnMgPSB0cnVlOworICAgICAgICAgICAgICAgIGZwLT5zaG91bGRfb3B0aW1pemVfZmxhc2hfc3VwZXIgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSAiZGlzYWJsZS1mYXN0Ym9vdC1pbmZvIikgeworICAgICAgICAgICAgICAgIGZwLT5zaG91bGRfdXNlX2Zhc3Rib290X2luZm8gPSBmYWxzZTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSAiZm9yY2UiKSB7CiAgICAgICAgICAgICAgICAgZnAtPmZvcmNlX2ZsYXNoID0gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSAiZnMtb3B0aW9ucyIpIHsKQEAgLTIzMjAsNyArMjM1MCw3IEBACiAgICAgICAgICAgICAgICAgICAgIHNlcmlhbCA9IG9wdGFyZzsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAnUyc6Ci0gICAgICAgICAgICAgICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UGFyc2VCeXRlQ291bnQob3B0YXJnLCAmc3BhcnNlX2xpbWl0KSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlBhcnNlQnl0ZUNvdW50KG9wdGFyZywgJmZwLT5zcGFyc2VfbGltaXQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBkaWUoImludmFsaWQgc3BhcnNlIGxpbWl0ICVzIiwgb3B0YXJnKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTIzNjQsOCArMjM5NCw4IEBACiAgICAgICAgIHJldHVybiBzaG93X2hlbHAoKTsKICAgICB9CiAKLSAgICBUcmFuc3BvcnQqIHRyYW5zcG9ydCA9IG9wZW5fZGV2aWNlKCk7Ci0gICAgaWYgKHRyYW5zcG9ydCA9PSBudWxscHRyKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPFRyYW5zcG9ydD4gdHJhbnNwb3J0ID0gb3Blbl9kZXZpY2UoKTsKKyAgICBpZiAoIXRyYW5zcG9ydCkgewogICAgICAgICByZXR1cm4gMTsKICAgICB9CiAgICAgZmFzdGJvb3Q6OkRyaXZlckNhbGxiYWNrcyBkcml2ZXJfY2FsbGJhY2tzID0gewpAQCAtMjM3NSw3ICsyNDA1LDcgQEAKICAgICAgICAgICAgIC50ZXh0ID0gVGV4dE1lc3NhZ2UsCiAgICAgfTsKIAotICAgIGZhc3Rib290OjpGYXN0Qm9vdERyaXZlciBmYXN0Ym9vdF9kcml2ZXIodHJhbnNwb3J0LCBkcml2ZXJfY2FsbGJhY2tzLCBmYWxzZSk7CisgICAgZmFzdGJvb3Q6OkZhc3RCb290RHJpdmVyIGZhc3Rib290X2RyaXZlcihzdGQ6Om1vdmUodHJhbnNwb3J0KSwgZHJpdmVyX2NhbGxiYWNrcywgZmFsc2UpOwogICAgIGZiID0gJmZhc3Rib290X2RyaXZlcjsKICAgICBmcC0+ZmIgPSAmZmFzdGJvb3RfZHJpdmVyOwogCkBAIC0yNDM4LDcgKzI0NjgsOCBAQAogICAgICAgICAgICAgc3RkOjpzdHJpbmcgcGFydGl0aW9uID0gbmV4dF9hcmcoJmFyZ3MpOwogCiAgICAgICAgICAgICBhdXRvIGZvcm1hdCA9IFsmXShjb25zdCBzdGQ6OnN0cmluZyYgcGFydGl0aW9uKSB7Ci0gICAgICAgICAgICAgICAgZmJfcGVyZm9ybV9mb3JtYXQocGFydGl0aW9uLCAwLCB0eXBlX292ZXJyaWRlLCBzaXplX292ZXJyaWRlLCBmcC0+ZnNfb3B0aW9ucyk7CisgICAgICAgICAgICAgICAgZmJfcGVyZm9ybV9mb3JtYXQocGFydGl0aW9uLCAwLCB0eXBlX292ZXJyaWRlLCBzaXplX292ZXJyaWRlLCBmcC0+ZnNfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcC5nZXQoKSk7CiAgICAgICAgICAgICB9OwogICAgICAgICAgICAgZG9fZm9yX3BhcnRpdGlvbnMocGFydGl0aW9uLCBmcC0+c2xvdF9vdmVycmlkZSwgZm9ybWF0LCB0cnVlKTsKICAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kID09ICJzaWduYXR1cmUiKSB7CkBAIC0yNDg1LDcgKzI1MTYsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGZuYW1lLmVtcHR5KCkpIGRpZSgiY2Fubm90IGRldGVybWluZSBpbWFnZSBmaWxlbmFtZSBmb3IgJyVzJyIsIHBuYW1lLmNfc3RyKCkpOwogCi0gICAgICAgICAgICBGbGFzaFRhc2sgdGFzayhmcC0+c2xvdF9vdmVycmlkZSwgcG5hbWUsIGZuYW1lLCBpc192Ym1ldGFfcGFydGl0aW9uKHBuYW1lKSk7CisgICAgICAgICAgICBGbGFzaFRhc2sgdGFzayhmcC0+c2xvdF9vdmVycmlkZSwgcG5hbWUsIGZuYW1lLCBpc192Ym1ldGFfcGFydGl0aW9uKHBuYW1lKSwgZnAuZ2V0KCkpOwogICAgICAgICAgICAgdGFzay5SdW4oKTsKICAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kID09ICJmbGFzaDpyYXciKSB7CiAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwYXJ0aXRpb24gPSBuZXh0X2FyZygmYXJncyk7CkBAIC0yNTMyLDcgKzI1NjMsNyBAQAogICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmlsZW5hbWUgPSBuZXh0X2FyZygmYXJncyk7CiAKICAgICAgICAgICAgIHN0cnVjdCBmYXN0Ym9vdF9idWZmZXIgYnVmOwotICAgICAgICAgICAgaWYgKCFsb2FkX2J1ZihmaWxlbmFtZS5jX3N0cigpLCAmYnVmKSB8fCBidWYudHlwZSAhPSBGQl9CVUZGRVJfRkQpIHsKKyAgICAgICAgICAgIGlmICghbG9hZF9idWYoZmlsZW5hbWUuY19zdHIoKSwgJmJ1ZiwgZnAuZ2V0KCkpIHx8IGJ1Zi50eXBlICE9IEZCX0JVRkZFUl9GRCkgewogICAgICAgICAgICAgICAgIGRpZSgiY2Fubm90IGxvYWQgJyVzJyIsIGZpbGVuYW1lLmNfc3RyKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZmItPkRvd25sb2FkKGZpbGVuYW1lLCBidWYuZmQuZ2V0KCksIGJ1Zi5zeik7CkBAIC0yNTY1LDE0ICsyNTk2LDEyIEBACiAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8UmVzaXplVGFzaz4oZnAuZ2V0KCksIHBhcnRpdGlvbiwgc2l6ZSwgZnAtPnNsb3Rfb3ZlcnJpZGUpOwogICAgICAgICAgICAgcmVzaXplX3Rhc2stPlJ1bigpOwogICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gImdzaSIpIHsKLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGFyZyA9IG5leHRfYXJnKCZhcmdzKTsKLSAgICAgICAgICAgIGlmIChhcmcgPT0gIndpcGUiKSB7Ci0gICAgICAgICAgICAgICAgZmItPlJhd0NvbW1hbmQoImdzaTp3aXBlIiwgIndpcGluZyBHU0kiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnID09ICJkaXNhYmxlIikgewotICAgICAgICAgICAgICAgIGZiLT5SYXdDb21tYW5kKCJnc2k6ZGlzYWJsZSIsICJkaXNhYmxpbmcgR1NJIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN5bnRheF9lcnJvcigiZXhwZWN0ZWQgJ3dpcGUnIG9yICdkaXNhYmxlJyIpOworICAgICAgICAgICAgaWYgKGFyZ3MuZW1wdHkoKSkgc3ludGF4X2Vycm9yKCJpbnZhbGlkIGdzaSBjb21tYW5kIik7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbWQoImdzaSIpOworICAgICAgICAgICAgd2hpbGUgKCFhcmdzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBjbWQgKz0gIjoiICsgbmV4dF9hcmcoJmFyZ3MpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgZmItPlJhd0NvbW1hbmQoY21kLCAiIik7CiAgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSAid2lwZS1zdXBlciIpIHsKICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGltYWdlOwogICAgICAgICAgICAgaWYgKGFyZ3MuZW1wdHkoKSkgewpAQCAtMjU4MCw3ICsyNjA5LDcgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaW1hZ2UgPSBuZXh0X2FyZygmYXJncyk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBkb193aXBlX3N1cGVyKGltYWdlLCBmcC0+c2xvdF9vdmVycmlkZSk7CisgICAgICAgICAgICBkb193aXBlX3N1cGVyKGltYWdlLCBmcC0+c2xvdF9vdmVycmlkZSwgZnAuZ2V0KCkpOwogICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gInNuYXBzaG90LXVwZGF0ZSIpIHsKICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGFyZzsKICAgICAgICAgICAgIGlmICghYXJncy5lbXB0eSgpKSB7CkBAIC0yNTkzLDcgKzI2MjIsNyBAQAogICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gRkJfQ01EX0ZFVENIKSB7CiAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwYXJ0aXRpb24gPSBuZXh0X2FyZygmYXJncyk7CiAgICAgICAgICAgICBzdGQ6OnN0cmluZyBvdXRmaWxlID0gbmV4dF9hcmcoJmFyZ3MpOwotICAgICAgICAgICAgZG9fZmV0Y2gocGFydGl0aW9uLCBmcC0+c2xvdF9vdmVycmlkZSwgb3V0ZmlsZSk7CisgICAgICAgICAgICBkb19mZXRjaChwYXJ0aXRpb24sIGZwLT5zbG90X292ZXJyaWRlLCBvdXRmaWxlLCBmcC0+ZmIpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc3ludGF4X2Vycm9yKCJ1bmtub3duIGNvbW1hbmQgJXMiLCBjb21tYW5kLmNfc3RyKCkpOwogICAgICAgICB9CkBAIC0yNjAzLDEwICsyNjMyLDEzIEBACiAgICAgICAgIGlmIChmcC0+Zm9yY2VfZmxhc2gpIHsKICAgICAgICAgICAgIENhbmNlbFNuYXBzaG90SWZOZWVkZWQoKTsKICAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VGFzaz4+IHdpcGVfdGFza3M7CiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwYXJ0aXRpb25zID0geyJ1c2VyZGF0YSIsICJjYWNoZSIsICJtZXRhZGF0YSJ9OwogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHBhcnRpdGlvbiA6IHBhcnRpdGlvbnMpIHsKLSAgICAgICAgICAgIHRhc2tzLmVtcGxhY2VfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPFdpcGVUYXNrPihmcC5nZXQoKSwgcGFydGl0aW9uKSk7CisgICAgICAgICAgICB3aXBlX3Rhc2tzLmVtcGxhY2VfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPFdpcGVUYXNrPihmcC5nZXQoKSwgcGFydGl0aW9uKSk7CiAgICAgICAgIH0KKyAgICAgICAgdGFza3MuaW5zZXJ0KHRhc2tzLmJlZ2luKCksIHN0ZDo6bWFrZV9tb3ZlX2l0ZXJhdG9yKHdpcGVfdGFza3MuYmVnaW4oKSksCisgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcih3aXBlX3Rhc2tzLmVuZCgpKSk7CiAgICAgfQogICAgIGlmIChmcC0+d2FudHNfc2V0X2FjdGl2ZSkgewogICAgICAgICBmYi0+U2V0QWN0aXZlKG5leHRfYWN0aXZlKTsKQEAgLTI2MTYsOSArMjY0OCw2IEBACiAgICAgfQogICAgIGZwcmludGYoc3RkZXJyLCAiRmluaXNoZWQuIFRvdGFsIHRpbWU6ICUuM2ZzXG4iLCAobm93KCkgLSBzdGFydCkpOwogCi0gICAgYXV0byogb2xkX3RyYW5zcG9ydCA9IGZiLT5zZXRfdHJhbnNwb3J0KG51bGxwdHIpOwotICAgIGRlbGV0ZSBvbGRfdHJhbnNwb3J0OwotCiAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2Zhc3Rib290L2Zhc3Rib290LmggYi9mYXN0Ym9vdC9mYXN0Ym9vdC5oCmluZGV4IGQ2YWZiOWUuLjZhNDk5NzAgMTAwNjQ0Ci0tLSBhL2Zhc3Rib290L2Zhc3Rib290LmgKKysrIGIvZmFzdGJvb3QvZmFzdGJvb3QuaApAQCAtMjcsMTEgKzI3LDExIEBACiAgKi8KICNwcmFnbWEgb25jZQogCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgImZhc3Rib290X2RyaXZlci5oIgogI2luY2x1ZGUgImZhc3Rib290X2RyaXZlcl9pbnRlcmZhY2UuaCIKICNpbmNsdWRlICJmaWxlc3lzdGVtLmgiCi0jaW5jbHVkZSAic3VwZXJfZmxhc2hfaGVscGVyLmgiCiAjaW5jbHVkZSAidGFzay5oIgogI2luY2x1ZGUgInV0aWwuaCIKIApAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgInJlc3VsdC5oIgogI2luY2x1ZGUgInNvY2tldC5oIgogI2luY2x1ZGUgInV0aWwuaCIKKyNpbmNsdWRlICJ6aXBhcmNoaXZlL3ppcF9hcmNoaXZlLmgiCiAKIGNsYXNzIEZhc3RCb290VG9vbCB7CiAgIHB1YmxpYzoKQEAgLTU2LDcgKzU3LDggQEAKIH07CiAKIHN0cnVjdCBmYXN0Ym9vdF9idWZmZXIgewotICAgIGVudW0gZmJfYnVmZmVyX3R5cGUgdHlwZTsKKyAgICBmYl9idWZmZXJfdHlwZSB0eXBlOworICAgIGZiX2J1ZmZlcl90eXBlIGZpbGVfdHlwZTsKICAgICBzdGQ6OnZlY3RvcjxTcGFyc2VQdHI+IGZpbGVzOwogICAgIGludDY0X3Qgc3o7CiAgICAgdW5pcXVlX2ZkIGZkOwpAQCAtODksMTIgKzkxLDE2IEBACiAgICAgLy8gSWYgdGhlIGltYWdlIHVzZXMgdGhlIGRlZmF1bHQgc2xvdCwgb3IgdGhlIHVzZXIgc3BlY2lmaWVkICJhbGwiLCB0aGVuCiAgICAgLy8gdGhlIHBhaXJlZCBzdHJpbmcgd2lsbCBiZSBlbXB0eS4gSWYgdGhlIGltYWdlIHJlcXVlc3RzIGEgc3BlY2lmaWMgc2xvdAogICAgIC8vIChmb3IgZXhhbXBsZSwgc3lzdGVtX290aGVyKSBpdCBpcyBzcGVjaWZpZWQgaW5zdGVhZC4KLSAgICBJbWFnZVNvdXJjZSogc291cmNlOworICAgIHN0ZDo6dW5pcXVlX3B0cjxJbWFnZVNvdXJjZT4gc291cmNlOwogICAgIGJvb2wgd2FudHNfd2lwZSA9IGZhbHNlOwogICAgIGJvb2wgc2tpcF9yZWJvb3QgPSBmYWxzZTsKICAgICBib29sIHdhbnRzX3NldF9hY3RpdmUgPSBmYWxzZTsKICAgICBib29sIHNraXBfc2Vjb25kYXJ5ID0gZmFsc2U7CiAgICAgYm9vbCBmb3JjZV9mbGFzaCA9IGZhbHNlOworICAgIGJvb2wgc2hvdWxkX29wdGltaXplX2ZsYXNoX3N1cGVyID0gdHJ1ZTsKKyAgICBib29sIHNob3VsZF91c2VfZmFzdGJvb3RfaW5mbyA9IHRydWU7CisgICAgYm9vbCBleGNsdWRlX2R5bmFtaWNfcGFydGl0aW9ucyA9IGZhbHNlOworICAgIHVpbnQ2NF90IHNwYXJzZV9saW1pdCA9IDA7CiAKICAgICBzdGQ6OnN0cmluZyBzbG90X292ZXJyaWRlOwogICAgIHN0ZDo6c3RyaW5nIGN1cnJlbnRfc2xvdDsKQEAgLTEwOCwyMyArMTE0LDQ2IEBACiAgICAgRmxhc2hBbGxUb29sKEZsYXNoaW5nUGxhbiogZnApOwogCiAgICAgdm9pZCBGbGFzaCgpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxUYXNrPj4gQ29sbGVjdFRhc2tzKCk7CiAKICAgcHJpdmF0ZToKICAgICB2b2lkIENoZWNrUmVxdWlyZW1lbnRzKCk7CiAgICAgdm9pZCBEZXRlcm1pbmVTbG90KCk7CiAgICAgdm9pZCBDb2xsZWN0SW1hZ2VzKCk7Ci0gICAgdm9pZCBGbGFzaEltYWdlcyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgSW1hZ2UqLCBzdGQ6OnN0cmluZz4+JiBpbWFnZXMpOwotICAgIHZvaWQgRmxhc2hJbWFnZShjb25zdCBJbWFnZSYgaW1hZ2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzbG90LCBmYXN0Ym9vdF9idWZmZXIqIGJ1Zik7Ci0gICAgdm9pZCBIYXJkY29kZWRGbGFzaCgpOworICAgIHZvaWQgQWRkRmxhc2hUYXNrcyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgSW1hZ2UqLCBzdGQ6OnN0cmluZz4+JiBpbWFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxUYXNrPj4mIHRhc2tzKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxUYXNrPj4gQ29sbGVjdFRhc2tzRnJvbUZhc3Rib290SW5mbygpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxUYXNrPj4gQ29sbGVjdFRhc2tzRnJvbUltYWdlTGlzdCgpOwogCiAgICAgc3RkOjp2ZWN0b3I8SW1hZ2VFbnRyeT4gYm9vdF9pbWFnZXNfOwogICAgIHN0ZDo6dmVjdG9yPEltYWdlRW50cnk+IG9zX2ltYWdlc187CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFRhc2s+PiB0YXNrc187CisKICAgICBGbGFzaGluZ1BsYW4qIGZwXzsKIH07CiAKLWJvb2wgc2hvdWxkX2ZsYXNoX2luX3VzZXJzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgcGFydGl0aW9uX25hbWUpOworY2xhc3MgWmlwSW1hZ2VTb3VyY2UgZmluYWwgOiBwdWJsaWMgSW1hZ2VTb3VyY2UgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgWmlwSW1hZ2VTb3VyY2UoWmlwQXJjaGl2ZUhhbmRsZSB6aXApIDogemlwXyh6aXApIHt9CisgICAgYm9vbCBSZWFkRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgc3RkOjp2ZWN0b3I8Y2hhcj4qIG91dCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdW5pcXVlX2ZkIE9wZW5GaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSBjb25zdCBvdmVycmlkZTsKKworICBwcml2YXRlOgorICAgIFppcEFyY2hpdmVIYW5kbGUgemlwXzsKK307CisKK2NsYXNzIExvY2FsSW1hZ2VTb3VyY2UgZmluYWwgOiBwdWJsaWMgSW1hZ2VTb3VyY2UgeworICBwdWJsaWM6CisgICAgYm9vbCBSZWFkRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgc3RkOjp2ZWN0b3I8Y2hhcj4qIG91dCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdW5pcXVlX2ZkIE9wZW5GaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSBjb25zdCBvdmVycmlkZTsKK307CisKK2NoYXIqIGdldF9hbmRyb2lkX3Byb2R1Y3Rfb3V0KCk7Citib29sIHNob3VsZF9mbGFzaF9pbl91c2Vyc3BhY2UoY29uc3QgSW1hZ2VTb3VyY2UqIHNvdXJjZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHBhcnRpdGlvbl9uYW1lKTsKIGJvb2wgaXNfdXNlcnNwYWNlX2Zhc3Rib290KCk7Ci12b2lkIGRvX2ZsYXNoKGNvbnN0IGNoYXIqIHBuYW1lLCBjb25zdCBjaGFyKiBmbmFtZSwgY29uc3QgYm9vbCBhcHBseV92Ym1ldGEpOwordm9pZCBkb19mbGFzaChjb25zdCBjaGFyKiBwbmFtZSwgY29uc3QgY2hhciogZm5hbWUsIGNvbnN0IGJvb2wgYXBwbHlfdmJtZXRhLAorICAgICAgICAgICAgICBjb25zdCBGbGFzaGluZ1BsYW4qIGZwKTsKIHZvaWQgZG9fZm9yX3BhcnRpdGlvbnMoY29uc3Qgc3RkOjpzdHJpbmcmIHBhcnQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzbG90LAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjpzdHJpbmcmKT4mIGZ1bmMsIGJvb2wgZm9yY2Vfc2xvdCk7CiBzdGQ6OnN0cmluZyBmaW5kX2l0ZW0oY29uc3Qgc3RkOjpzdHJpbmcmIGl0ZW0pOwpAQCAtMTMzLDcgKzE2Miw4IEBACiBzdGQ6OnN0cmluZyBnZXRfY3VycmVudF9zbG90KCk7CiAKIC8vIENvZGUgZm9yIFBhcnNpbmcgZmFzdGJvb3QtaW5mby50eHQKLWJvb2wgQ2hlY2tGYXN0Ym9vdEluZm9SZXF1aXJlbWVudHMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjb21tYW5kKTsKK2Jvb2wgQ2hlY2tGYXN0Ym9vdEluZm9SZXF1aXJlbWVudHMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBob3N0X3Rvb2xfdmVyc2lvbik7CiBzdGQ6OnVuaXF1ZV9wdHI8Rmxhc2hUYXNrPiBQYXJzZUZsYXNoQ29tbWFuZChjb25zdCBGbGFzaGluZ1BsYW4qIGZwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwYXJ0cyk7CiBzdGQ6OnVuaXF1ZV9wdHI8UmVib290VGFzaz4gUGFyc2VSZWJvb3RDb21tYW5kKGNvbnN0IEZsYXNoaW5nUGxhbiogZnAsCkBAIC0xNDIsNyArMTcyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHBhcnRzKTsKIHN0ZDo6dW5pcXVlX3B0cjxUYXNrPiBQYXJzZUZhc3Rib290SW5mb0xpbmUoY29uc3QgRmxhc2hpbmdQbGFuKiBmcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjb21tYW5kKTsKLXZvaWQgQWRkUmVzaXplVGFza3MoY29uc3QgRmxhc2hpbmdQbGFuKiBmcCwgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFRhc2s+PiYgdGFza3MpOworYm9vbCBBZGRSZXNpemVUYXNrcyhjb25zdCBGbGFzaGluZ1BsYW4qIGZwLCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VGFzaz4+JiB0YXNrcyk7CiBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VGFzaz4+IFBhcnNlRmFzdGJvb3RJbmZvKGNvbnN0IEZsYXNoaW5nUGxhbiogZnAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgZmlsZSk7CiAKQEAgLTE1MywxNCArMTgzLDEzIEBACiB9OwogCiBSZXN1bHQ8TmV0d29ya1NlcmlhbCwgRmFzdGJvb3RFcnJvcj4gUGFyc2VOZXR3b3JrU2VyaWFsKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJpYWwpOwotYm9vbCBzdXBwb3J0c19BQigpOwogc3RkOjpzdHJpbmcgR2V0UGFydGl0aW9uTmFtZShjb25zdCBJbWFnZUVudHJ5JiBlbnRyeSwgY29uc3Qgc3RkOjpzdHJpbmcmIGN1cnJlbnRfc2xvdF8pOwogdm9pZCBmbGFzaF9wYXJ0aXRpb25fZmlsZXMoY29uc3Qgc3RkOjpzdHJpbmcmIHBhcnRpdGlvbiwgY29uc3Qgc3RkOjp2ZWN0b3I8U3BhcnNlUHRyPiYgZmlsZXMpOwotaW50NjRfdCBnZXRfc3BhcnNlX2xpbWl0KGludDY0X3Qgc2l6ZSk7CitpbnQ2NF90IGdldF9zcGFyc2VfbGltaXQoaW50NjRfdCBzaXplLCBjb25zdCBGbGFzaGluZ1BsYW4qIGZwKTsKIHN0ZDo6dmVjdG9yPFNwYXJzZVB0cj4gcmVzcGFyc2VfZmlsZShzcGFyc2VfZmlsZSogcywgaW50NjRfdCBtYXhfc2l6ZSk7CiAKLWJvb2wgaXNfcmV0cm9maXRfZGV2aWNlKCk7Citib29sIHN1cHBvcnRzX0FCKGZhc3Rib290OjpJRmFzdEJvb3REcml2ZXIqIGZiKTsKIGJvb2wgaXNfbG9naWNhbChjb25zdCBzdGQ6OnN0cmluZyYgcGFydGl0aW9uKTsKIHZvaWQgZmJfcGVyZm9ybV9mb3JtYXQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhcnRpdGlvbiwgaW50IHNraXBfaWZfbm90X3N1cHBvcnRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGVfb3ZlcnJpZGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzaXplX292ZXJyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBmc19vcHRpb25zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgZnNfb3B0aW9ucywgY29uc3QgRmxhc2hpbmdQbGFuKiBmcCk7CmRpZmYgLS1naXQgYS9mYXN0Ym9vdC9mYXN0Ym9vdF9kcml2ZXIuY3BwIGIvZmFzdGJvb3QvZmFzdGJvb3RfZHJpdmVyLmNwcAppbmRleCA5NzcwYWIyLi5lNWVmNjZiIDEwMDY0NAotLS0gYS9mYXN0Ym9vdC9mYXN0Ym9vdF9kcml2ZXIuY3BwCisrKyBiL2Zhc3Rib290L2Zhc3Rib290X2RyaXZlci5jcHAKQEAgLTU4LDkgKzU4LDEwIEBACiBuYW1lc3BhY2UgZmFzdGJvb3QgewogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBVQkxJQyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotRmFzdEJvb3REcml2ZXI6OkZhc3RCb290RHJpdmVyKFRyYW5zcG9ydCogdHJhbnNwb3J0LCBEcml2ZXJDYWxsYmFja3MgZHJpdmVyX2NhbGxiYWNrcywKK0Zhc3RCb290RHJpdmVyOjpGYXN0Qm9vdERyaXZlcihzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNwb3J0PiB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJpdmVyQ2FsbGJhY2tzIGRyaXZlcl9jYWxsYmFja3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBub19jaGVja3MpCi0gICAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCksCisgICAgOiB0cmFuc3BvcnRfKHN0ZDo6bW92ZSh0cmFuc3BvcnQpKSwKICAgICAgIHByb2xvZ18oc3RkOjptb3ZlKGRyaXZlcl9jYWxsYmFja3MucHJvbG9nKSksCiAgICAgICBlcGlsb2dfKHN0ZDo6bW92ZShkcml2ZXJfY2FsbGJhY2tzLmVwaWxvZykpLAogICAgICAgaW5mb18oc3RkOjptb3ZlKGRyaXZlcl9jYWxsYmFja3MuaW5mbykpLApAQCAtNjI3LDkgKzYyOCw4IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLVRyYW5zcG9ydCogRmFzdEJvb3REcml2ZXI6OnNldF90cmFuc3BvcnQoVHJhbnNwb3J0KiB0cmFuc3BvcnQpIHsKLSAgICBzdGQ6OnN3YXAodHJhbnNwb3J0XywgdHJhbnNwb3J0KTsKLSAgICByZXR1cm4gdHJhbnNwb3J0Owordm9pZCBGYXN0Qm9vdERyaXZlcjo6c2V0X3RyYW5zcG9ydChzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNwb3J0PiB0cmFuc3BvcnQpIHsKKyAgICB0cmFuc3BvcnRfID0gc3RkOjptb3ZlKHRyYW5zcG9ydCk7CiB9CiAKIH0gIC8vIEVuZCBuYW1lc3BhY2UgZmFzdGJvb3QKZGlmZiAtLWdpdCBhL2Zhc3Rib290L2Zhc3Rib290X2RyaXZlci5oIGIvZmFzdGJvb3QvZmFzdGJvb3RfZHJpdmVyLmgKaW5kZXggM2Q2YzdiMC4uNDljZWJkOSAxMDA2NDQKLS0tIGEvZmFzdGJvb3QvZmFzdGJvb3RfZHJpdmVyLmgKKysrIGIvZmFzdGJvb3QvZmFzdGJvb3RfZHJpdmVyLmgKQEAgLTI3LDggKzI3LDkgQEAKICAqLwogI3ByYWdtYSBvbmNlCiAjaW5jbHVkZSA8Y3N0ZGxpYj4KLSNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgogI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KIApAQCAtMzYsMTAgKzM3LDggQEAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgogI2luY2x1ZGUgPGJvb3RpbWcuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHNwYXJzZS9zcGFyc2UuaD4KIAotI2luY2x1ZGUgImNvbnN0YW50cy5oIgogI2luY2x1ZGUgImZhc3Rib290X2RyaXZlcl9pbnRlcmZhY2UuaCIKICNpbmNsdWRlICJ0cmFuc3BvcnQuaCIKIApAQCAtNjIsNyArNjEsNyBAQAogICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgTUFYX0RPV05MT0FEX1NJWkUgPSBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCk7CiAgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgVFJBTlNQT1JUX0NIVU5LX1NJWkUgPSAxMDI0OwogCi0gICAgRmFzdEJvb3REcml2ZXIoVHJhbnNwb3J0KiB0cmFuc3BvcnQsIERyaXZlckNhbGxiYWNrcyBkcml2ZXJfY2FsbGJhY2tzID0ge30sCisgICAgRmFzdEJvb3REcml2ZXIoc3RkOjp1bmlxdWVfcHRyPFRyYW5zcG9ydD4gdHJhbnNwb3J0LCBEcml2ZXJDYWxsYmFja3MgZHJpdmVyX2NhbGxiYWNrcyA9IHt9LAogICAgICAgICAgICAgICAgICAgIGJvb2wgbm9fY2hlY2tzID0gZmFsc2UpOwogICAgIH5GYXN0Qm9vdERyaXZlcigpOwogCkBAIC0xMDQsNyArMTAzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGluZm8gPSBudWxscHRyKTsKICAgICBSZXRDb2RlIEZldGNoVG9GZChjb25zdCBzdGQ6OnN0cmluZyYgcGFydGl0aW9uLCBhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBmZCwKICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG9mZnNldCA9IC0xLCBpbnQ2NF90IHNpemUgPSAtMSwgc3RkOjpzdHJpbmcqIHJlc3BvbnNlID0gbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGluZm8gPSBudWxscHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGluZm8gPSBudWxscHRyKSBvdmVycmlkZTsKIAogICAgIC8qIEhJR0hFUiBMRVZFTCBDT01NQU5EUyAtLSBDb21wb3NlZCBvZiB0aGUgY29tbWFuZHMgYWJvdmUgKi8KICAgICBSZXRDb2RlIEZsYXNoUGFydGl0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJ0aXRpb24sIGNvbnN0IHN0ZDo6dmVjdG9yPGNoYXI+JiBkYXRhKTsKQEAgLTEyMyw5ICsxMjIsNyBAQAogICAgIHN0ZDo6c3RyaW5nIEVycm9yKCk7CiAgICAgUmV0Q29kZSBXYWl0Rm9yRGlzY29ubmVjdCgpIG92ZXJyaWRlOwogCi0gICAgLy8gTm90ZTogc2V0X3RyYW5zcG9ydCB3aWxsIHJldHVybiB0aGUgcHJldmlvdXMgdHJhbnNwb3J0LgotICAgIFRyYW5zcG9ydCogc2V0X3RyYW5zcG9ydChUcmFuc3BvcnQqIHRyYW5zcG9ydCk7Ci0gICAgVHJhbnNwb3J0KiB0cmFuc3BvcnQoKSBjb25zdCB7IHJldHVybiB0cmFuc3BvcnRfOyB9CisgICAgdm9pZCBzZXRfdHJhbnNwb3J0KHN0ZDo6dW5pcXVlX3B0cjxUcmFuc3BvcnQ+IHRyYW5zcG9ydCk7CiAKICAgICBSZXRDb2RlIFJhd0NvbW1hbmQoY29uc3Qgc3RkOjpzdHJpbmcmIGNtZCwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiByZXNwb25zZSA9IG51bGxwdHIsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogaW5mbyA9IG51bGxwdHIsCkBAIC0xNDIsNyArMTM5LDcgQEAKIAogICAgIHN0ZDo6c3RyaW5nIEVycm5vU3RyKGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpOwogCi0gICAgVHJhbnNwb3J0KiB0cmFuc3BvcnRfOworICAgIHN0ZDo6dW5pcXVlX3B0cjxUcmFuc3BvcnQ+IHRyYW5zcG9ydF87CiAKICAgcHJpdmF0ZToKICAgICBSZXRDb2RlIFNlbmRCdWZmZXIoYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgZmQsIHNpemVfdCBzaXplKTsKZGlmZiAtLWdpdCBhL2Zhc3Rib290L2Zhc3Rib290X2RyaXZlcl9pbnRlcmZhY2UuaCBiL2Zhc3Rib290L2Zhc3Rib290X2RyaXZlcl9pbnRlcmZhY2UuaAppbmRleCA3OTU5MzhmLi43Y2I4YTZiIDEwMDY0NAotLS0gYS9mYXN0Ym9vdC9mYXN0Ym9vdF9kcml2ZXJfaW50ZXJmYWNlLmgKKysrIGIvZmFzdGJvb3QvZmFzdGJvb3RfZHJpdmVyX2ludGVyZmFjZS5oCkBAIC00NSw2ICs0NSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGluZm8gPSBudWxscHRyKSA9IDA7CiAgICAgUmV0Q29kZSB2aXJ0dWFsIEdldFZhcihjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBzdGQ6OnN0cmluZyogdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBpbmZvID0gbnVsbHB0cikgPSAwOworICAgIFJldENvZGUgdmlydHVhbCBGZXRjaFRvRmQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhcnRpdGlvbiwgYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG9mZnNldCA9IC0xLCBpbnQ2NF90IHNpemUgPSAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiByZXNwb25zZSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGluZm8gPSBudWxscHRyKSA9IDA7CiAgICAgUmV0Q29kZSB2aXJ0dWFsIERvd25sb2FkKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBmZCwgc2l6ZV90IHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiByZXNwb25zZSA9IG51bGxwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogaW5mbyA9IG51bGxwdHIpID0gMDsKZGlmZiAtLWdpdCBhL2Zhc3Rib290L2Zhc3Rib290X2RyaXZlcl9tb2NrLmggYi9mYXN0Ym9vdC9mYXN0Ym9vdF9kcml2ZXJfbW9jay5oCmluZGV4IDYyYTU3MDguLjdjNDFkNzggMTAwNjQ0Ci0tLSBhL2Zhc3Rib290L2Zhc3Rib290X2RyaXZlcl9tb2NrLmgKKysrIGIvZmFzdGJvb3QvZmFzdGJvb3RfZHJpdmVyX21vY2suaApAQCAtMjIsMjIgKzIyLDIyIEBACiAKIGNsYXNzIE1vY2tGYXN0Ym9vdERyaXZlciA6IHB1YmxpYyBJRmFzdEJvb3REcml2ZXIgewogICBwdWJsaWM6Ci0gICAgTU9DS19NRVRIT0QoUmV0Q29kZSwgRmxhc2hQYXJ0aXRpb24sCi0gICAgICAgICAgICAgICAgKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJ0aXRpb24sIGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIGZkLCB1aW50MzJfdCBzeiksCisgICAgTU9DS19NRVRIT0QoUmV0Q29kZSwgRmxhc2hQYXJ0aXRpb24sIChjb25zdCBzdGQ6OnN0cmluZyYsIGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkLCB1aW50MzJfdCksCiAgICAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7CiAgICAgTU9DS19NRVRIT0QoUmV0Q29kZSwgRGVsZXRlUGFydGl0aW9uLCAoY29uc3Qgc3RkOjpzdHJpbmcmKSwgKG92ZXJyaWRlKSk7CiAgICAgTU9DS19NRVRIT0QoUmV0Q29kZSwgUmVib290LCAoc3RkOjpzdHJpbmcqLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qKSwgKG92ZXJyaWRlKSk7CiAgICAgTU9DS19NRVRIT0QoUmV0Q29kZSwgUmVib290VG8sIChzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcqLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qKSwKICAgICAgICAgICAgICAgICAob3ZlcnJpZGUpKTsKLQogICAgIE1PQ0tfTUVUSE9EKFJldENvZGUsIEdldFZhciwgKGNvbnN0IHN0ZDo6c3RyaW5nJiwgc3RkOjpzdHJpbmcqLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qKSwKICAgICAgICAgICAgICAgICAob3ZlcnJpZGUpKTsKLQorICAgIE1PQ0tfTUVUSE9EKFJldENvZGUsIEZldGNoVG9GZCwKKyAgICAgICAgICAgICAgICAoY29uc3Qgc3RkOjpzdHJpbmcmLCBhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qKSwKKyAgICAgICAgICAgICAgICAob3ZlcnJpZGUpKTsKICAgICBNT0NLX01FVEhPRChSZXRDb2RlLCBEb3dubG9hZCwKICAgICAgICAgICAgICAgICAoY29uc3Qgc3RkOjpzdHJpbmcmLCBhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCwgc2l6ZV90LCBzdGQ6OnN0cmluZyosCiAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiopLAogICAgICAgICAgICAgICAgIChvdmVycmlkZSkpOwotCiAgICAgTU9DS19NRVRIT0QoUmV0Q29kZSwgUmF3Q29tbWFuZCwKICAgICAgICAgICAgICAgICAoY29uc3Qgc3RkOjpzdHJpbmcmLCBjb25zdCBzdGQ6OnN0cmluZyYsIHN0ZDo6c3RyaW5nKiwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiwKICAgICAgICAgICAgICAgICAgaW50KiksCmRpZmYgLS1naXQgYS9mYXN0Ym9vdC9mYXN0Ym9vdF9kcml2ZXJfdGVzdC5jcHAgYi9mYXN0Ym9vdC9mYXN0Ym9vdF9kcml2ZXJfdGVzdC5jcHAKaW5kZXggNmY2Y2Y4Yy4uZDIwMzNiMCAxMDA2NDQKLS0tIGEvZmFzdGJvb3QvZmFzdGJvb3RfZHJpdmVyX3Rlc3QuY3BwCisrKyBiL2Zhc3Rib290L2Zhc3Rib290X2RyaXZlcl90ZXN0LmNwcApAQCAtMTYsNiArMTYsNyBAQAogCiAjaW5jbHVkZSAiZmFzdGJvb3RfZHJpdmVyLmgiCiAKKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8b3B0aW9uYWw+CiAKICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgpAQCAtMzAsMTMgKzMxLDE0IEBACiB9OwogCiBURVNUX0YoRHJpdmVyVGVzdCwgR2V0VmFyKSB7Ci0gICAgTW9ja1RyYW5zcG9ydCB0cmFuc3BvcnQ7Ci0gICAgRmFzdEJvb3REcml2ZXIgZHJpdmVyKCZ0cmFuc3BvcnQpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxNb2NrVHJhbnNwb3J0PiB0cmFuc3BvcnRfcG9pbnRlciA9IHN0ZDo6bWFrZV91bmlxdWU8TW9ja1RyYW5zcG9ydD4oKTsKKyAgICBNb2NrVHJhbnNwb3J0KiB0cmFuc3BvcnQgPSB0cmFuc3BvcnRfcG9pbnRlci5nZXQoKTsKKyAgICBGYXN0Qm9vdERyaXZlciBkcml2ZXIoc3RkOjptb3ZlKHRyYW5zcG9ydF9wb2ludGVyKSk7CiAKLSAgICBFWFBFQ1RfQ0FMTCh0cmFuc3BvcnQsIFdyaXRlKF8sIF8pKQorICAgIEVYUEVDVF9DQUxMKCp0cmFuc3BvcnQsIFdyaXRlKF8sIF8pKQogICAgICAgICAgICAgLldpdGgoQWxsQXJncyhSYXdEYXRhKCJnZXR2YXI6dmVyc2lvbiIpKSkKICAgICAgICAgICAgIC5XaWxsT25jZShSZXR1cm5Bcmc8MT4oKSk7Ci0gICAgRVhQRUNUX0NBTEwodHJhbnNwb3J0LCBSZWFkKF8sIF8pKS5XaWxsT25jZShJbnZva2UoQ29weURhdGEoIk9LQVkwLjQiKSkpOworICAgIEVYUEVDVF9DQUxMKCp0cmFuc3BvcnQsIFJlYWQoXywgXykpLldpbGxPbmNlKEludm9rZShDb3B5RGF0YSgiT0tBWTAuNCIpKSk7CiAKICAgICBzdGQ6OnN0cmluZyBvdXRwdXQ7CiAgICAgQVNTRVJUX0VRKGRyaXZlci5HZXRWYXIoInZlcnNpb24iLCAmb3V0cHV0KSwgU1VDQ0VTUykgPDwgZHJpdmVyLkVycm9yKCk7CkBAIC00NCwxNCArNDYsMTUgQEAKIH0KIAogVEVTVF9GKERyaXZlclRlc3QsIEluZm9NZXNzYWdlKSB7Ci0gICAgTW9ja1RyYW5zcG9ydCB0cmFuc3BvcnQ7Ci0gICAgRmFzdEJvb3REcml2ZXIgZHJpdmVyKCZ0cmFuc3BvcnQpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxNb2NrVHJhbnNwb3J0PiB0cmFuc3BvcnRfcG9pbnRlciA9IHN0ZDo6bWFrZV91bmlxdWU8TW9ja1RyYW5zcG9ydD4oKTsKKyAgICBNb2NrVHJhbnNwb3J0KiB0cmFuc3BvcnQgPSB0cmFuc3BvcnRfcG9pbnRlci5nZXQoKTsKKyAgICBGYXN0Qm9vdERyaXZlciBkcml2ZXIoc3RkOjptb3ZlKHRyYW5zcG9ydF9wb2ludGVyKSk7CiAKLSAgICBFWFBFQ1RfQ0FMTCh0cmFuc3BvcnQsIFdyaXRlKF8sIF8pKQorICAgIEVYUEVDVF9DQUxMKCp0cmFuc3BvcnQsIFdyaXRlKF8sIF8pKQogICAgICAgICAgICAgLldpdGgoQWxsQXJncyhSYXdEYXRhKCJvZW0gZG1lc2ciKSkpCiAgICAgICAgICAgICAuV2lsbE9uY2UoUmV0dXJuQXJnPDE+KCkpOwotICAgIEVYUEVDVF9DQUxMKHRyYW5zcG9ydCwgUmVhZChfLCBfKSkuV2lsbE9uY2UoSW52b2tlKENvcHlEYXRhKCJJTkZPdGhpcyBpcyBhbiBpbmZvIGxpbmUiKSkpOwotICAgIEVYUEVDVF9DQUxMKHRyYW5zcG9ydCwgUmVhZChfLCBfKSkuV2lsbE9uY2UoSW52b2tlKENvcHlEYXRhKCJPS0FZIikpKTsKKyAgICBFWFBFQ1RfQ0FMTCgqdHJhbnNwb3J0LCBSZWFkKF8sIF8pKS5XaWxsT25jZShJbnZva2UoQ29weURhdGEoIklORk90aGlzIGlzIGFuIGluZm8gbGluZSIpKSk7CisgICAgRVhQRUNUX0NBTEwoKnRyYW5zcG9ydCwgUmVhZChfLCBfKSkuV2lsbE9uY2UoSW52b2tlKENvcHlEYXRhKCJPS0FZIikpKTsKIAogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpbmZvOwogICAgIEFTU0VSVF9FUShkcml2ZXIuUmF3Q29tbWFuZCgib2VtIGRtZXNnIiwgIiIsIG51bGxwdHIsICZpbmZvKSwgU1VDQ0VTUykgPDwgZHJpdmVyLkVycm9yKCk7CkBAIC02MCwyOCArNjMsMjkgQEAKIH0KIAogVEVTVF9GKERyaXZlclRlc3QsIFRleHRNZXNzYWdlKSB7Ci0gICAgTW9ja1RyYW5zcG9ydCB0cmFuc3BvcnQ7CiAgICAgc3RkOjpzdHJpbmcgdGV4dDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TW9ja1RyYW5zcG9ydD4gdHJhbnNwb3J0X3BvaW50ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPE1vY2tUcmFuc3BvcnQ+KCk7CisgICAgTW9ja1RyYW5zcG9ydCogdHJhbnNwb3J0ID0gdHJhbnNwb3J0X3BvaW50ZXIuZ2V0KCk7CiAKICAgICBEcml2ZXJDYWxsYmFja3MgY2FsbGJhY2tze1tdKGNvbnN0IHN0ZDo6c3RyaW5nJikge30sIFtdKGludCkge30sIFtdKGNvbnN0IHN0ZDo6c3RyaW5nJikge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJnRleHRdKGNvbnN0IHN0ZDo6c3RyaW5nJiBleHRyYV90ZXh0KSB7IHRleHQgKz0gZXh0cmFfdGV4dDsgfX07CiAKLSAgICBGYXN0Qm9vdERyaXZlciBkcml2ZXIoJnRyYW5zcG9ydCwgY2FsbGJhY2tzKTsKKyAgICBGYXN0Qm9vdERyaXZlciBkcml2ZXIoc3RkOjptb3ZlKHRyYW5zcG9ydF9wb2ludGVyKSwgY2FsbGJhY2tzKTsKIAotICAgIEVYUEVDVF9DQUxMKHRyYW5zcG9ydCwgV3JpdGUoXywgXykpCisgICAgRVhQRUNUX0NBTEwoKnRyYW5zcG9ydCwgV3JpdGUoXywgXykpCiAgICAgICAgICAgICAuV2l0aChBbGxBcmdzKFJhd0RhdGEoIm9lbSB0cnVzdHkgcnVudGVzdCB0cnVzdHkuaHdhZXMuYmVuY2giKSkpCiAgICAgICAgICAgICAuV2lsbE9uY2UoUmV0dXJuQXJnPDE+KCkpOwotICAgIEVYUEVDVF9DQUxMKHRyYW5zcG9ydCwgUmVhZChfLCBfKSkuV2lsbE9uY2UoSW52b2tlKENvcHlEYXRhKCJURVhUdGhpcyBpcyBhIHRleHQgbGluZSIpKSk7Ci0gICAgRVhQRUNUX0NBTEwodHJhbnNwb3J0LCBSZWFkKF8sIF8pKQorICAgIEVYUEVDVF9DQUxMKCp0cmFuc3BvcnQsIFJlYWQoXywgXykpLldpbGxPbmNlKEludm9rZShDb3B5RGF0YSgiVEVYVHRoaXMgaXMgYSB0ZXh0IGxpbmUiKSkpOworICAgIEVYUEVDVF9DQUxMKCp0cmFuc3BvcnQsIFJlYWQoXywgXykpCiAgICAgICAgICAgICAuV2lsbE9uY2UoSW52b2tlKAogICAgICAgICAgICAgICAgICAgICBDb3B5RGF0YSgiVEVYVCwgYWxiZWl0IHZlcnkgbG9uZyBhbmQgc3BsaXQgb3ZlciBtdWx0aXBsZSBURVhUIG1lc3NhZ2VzLiIpKSk7Ci0gICAgRVhQRUNUX0NBTEwodHJhbnNwb3J0LCBSZWFkKF8sIF8pKQorICAgIEVYUEVDVF9DQUxMKCp0cmFuc3BvcnQsIFJlYWQoXywgXykpCiAgICAgICAgICAgICAuV2lsbE9uY2UoSW52b2tlKENvcHlEYXRhKCJURVhUIEluZGVlZCB3ZSBjYW4gZG8gdGhhdCBub3cgd2l0aCBhIFRFWFQgbWVzc2FnZSB3aGVuZXZlciAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZSBmZWVsIGxpa2UgaXQuIikpKTsKLSAgICBFWFBFQ1RfQ0FMTCh0cmFuc3BvcnQsIFJlYWQoXywgXykpCisgICAgRVhQRUNUX0NBTEwoKnRyYW5zcG9ydCwgUmVhZChfLCBfKSkKICAgICAgICAgICAgIC5XaWxsT25jZShJbnZva2UoQ29weURhdGEoIlRFWFQgSXNuJ3QgdGhhdCB0cnVseSBzdXBlciBjb29sPyIpKSk7CiAKLSAgICBFWFBFQ1RfQ0FMTCh0cmFuc3BvcnQsIFJlYWQoXywgXykpLldpbGxPbmNlKEludm9rZShDb3B5RGF0YSgiT0tBWSIpKSk7CisgICAgRVhQRUNUX0NBTEwoKnRyYW5zcG9ydCwgUmVhZChfLCBfKSkuV2lsbE9uY2UoSW52b2tlKENvcHlEYXRhKCJPS0FZIikpKTsKIAogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpbmZvOwogICAgIEFTU0VSVF9FUShkcml2ZXIuUmF3Q29tbWFuZCgib2VtIHRydXN0eSBydW50ZXN0IHRydXN0eS5od2Flcy5iZW5jaCIsICIiLCBudWxscHRyLCAmaW5mbyksCmRpZmYgLS1naXQgYS9mYXN0Ym9vdC9mYXN0Ym9vdF9pbnRlZ3JhdGlvbl90ZXN0LnhtbCBiL2Zhc3Rib290L2Zhc3Rib290X2ludGVncmF0aW9uX3Rlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMTRjYWIKLS0tIC9kZXYvbnVsbAorKysgYi9mYXN0Ym9vdC9mYXN0Ym9vdF9pbnRlZ3JhdGlvbl90ZXN0LnhtbApAQCAtMCwwICsxLDE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyB0byBydW4gZmFzdGJvb3QgaW50ZWdyYXRpb24gdGVzdHMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJmYXN0Ym9vdF91bml0dGVzdHMiIC8+CisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLnB5dGhvbi5QeXRob25CaW5hcnlIb3N0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9InBhci1maWxlLW5hbWUiIHZhbHVlPSJmYXN0Ym9vdF9pbnRlZ3JhdGlvbl90ZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtdGltZW91dCIgdmFsdWU9IjFtIiAvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mYXN0Ym9vdC9maWxlc3lzdGVtLmggYi9mYXN0Ym9vdC9maWxlc3lzdGVtLmgKaW5kZXggNWY0MWZiYy4uYzVmOWM5NCAxMDA2NDQKLS0tIGEvZmFzdGJvb3QvZmlsZXN5c3RlbS5oCisrKyBiL2Zhc3Rib290L2ZpbGVzeXN0ZW0uaApAQCAtMzEsNiArMzEsNyBAQAogI2VuZGlmCiAKIHN0ZDo6c3RyaW5nIEdldEhvbWVEaXJQYXRoKCk7Citib29sIEZpbGVFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpOwogYm9vbCBFbnN1cmVEaXJlY3RvcnlFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIGRpcmVjdG9yeV9wYXRoKTsKIAogY2xhc3MgRmlsZUxvY2sgewpkaWZmIC0tZ2l0IGEvZmFzdGJvb3QvZnV6emVyL0FuZHJvaWQuYnAgYi9mYXN0Ym9vdC9mdXp6ZXIvQW5kcm9pZC5icAppbmRleCBhODk4MDcwLi41OTUzM2ZhIDEwMDY0NAotLS0gYS9mYXN0Ym9vdC9mdXp6ZXIvQW5kcm9pZC5icAorKysgYi9mYXN0Ym9vdC9mdXp6ZXIvQW5kcm9pZC5icApAQCAtNTUsNyArNTUsMTAgQEAKICAgICBdLAogICAgIGZ1enpfY29uZmlnOiB7CiAgICAgICAgIGNjOiBbCi0gICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgICAgICAiZHZhbmRlckBnb29nbGUuY29tIiwKKyAgICAgICAgICAgICJlbHNrQGdvb2dsZS5jb20iLAorICAgICAgICAgICAgImVuaEBnb29nbGUuY29tIiwKKyAgICAgICAgICAgICJ6aGFuZ2tlbHZpbkBnb29nbGUuY29tIiwKICAgICAgICAgXSwKICAgICAgICAgY29tcG9uZW50aWQ6IDUzMzc2NCwKICAgICAgICAgaG90bGlzdHM6IFsKZGlmZiAtLWdpdCBhL2Zhc3Rib290L2Z1enplci9mYXN0Ym9vdF9mdXp6ZXIuY3BwIGIvZmFzdGJvb3QvZnV6emVyL2Zhc3Rib290X2Z1enplci5jcHAKaW5kZXggNjA5NDBmZS4uNDU5NGE4YSAxMDA2NDQKLS0tIGEvZmFzdGJvb3QvZnV6emVyL2Zhc3Rib290X2Z1enplci5jcHAKKysrIGIvZmFzdGJvb3QvZnV6emVyL2Zhc3Rib290X2Z1enplci5jcHAKQEAgLTE1LDYgKzE1LDcgQEAKICAqCiAgKi8KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KICNpbmNsdWRlICJmYXN0Ym9vdC5oIgogI2luY2x1ZGUgInNvY2tldC5oIgogI2luY2x1ZGUgInNvY2tldF9tb2NrX2Z1enouaCIKQEAgLTI1LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQ7CiAKIGNvbnN0IHNpemVfdCBrWWVhck1pbiA9IDIwMDA7CiBjb25zdCBzaXplX3Qga1llYXJNYXggPSAyMTI3OwpAQCAtMjU1LDcgKzI1Nyw3IEBACiAgICAgdWludDY0X3QgcmFtZGlza19zaXplID0KICAgICAgICAgICAgIGZkcF8tPkNvbnN1bWVCb29sKCkgPyBjb250ZW50X3JhbWRpc2tfZmQuc2l6ZSgpIDogZmRwXy0+Q29uc3VtZUludGVncmFsPHVpbnQ2NF90PigpOwogICAgICh2b2lkKXJlcGxhY2VfdmVuZG9yX3JhbWRpc2sodmVuZG9yX2Jvb3RfZmQsIHZlbmRvcl9ib290X3NpemUsIHJhbWRpc2tfbmFtZSwgcmFtZGlza19mZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbWRpc2tfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW1kaXNrX3NpemUsIHVuaXF1ZV9mZCgtMSksIDApOwogICAgIGNsb3NlKHZlbmRvcl9ib290X2ZkKTsKICAgICBjbG9zZShyYW1kaXNrX2ZkKTsKIH0KZGlmZiAtLWdpdCBhL2Zhc3Rib290L2Z1enp5X2Zhc3Rib290L2ZpeHR1cmVzLmNwcCBiL2Zhc3Rib290L2Z1enp5X2Zhc3Rib290L2ZpeHR1cmVzLmNwcAppbmRleCA5YjVlNWY3Li45NGE1M2VkIDEwMDY0NAotLS0gYS9mYXN0Ym9vdC9mdXp6eV9mYXN0Ym9vdC9maXh0dXJlcy5jcHAKKysrIGIvZmFzdGJvb3QvZnV6enlfZmFzdGJvb3QvZml4dHVyZXMuY3BwCkBAIC0xMjgsNyArMTI4LDcgQEAKICAgICAgICAgICAgIHJldHVybiBNYXRjaEZhc3Rib290KGluZm8sIGRldmljZV9zZXJpYWwpOwogICAgICAgICB9OwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9VU0JfVFJJRVMgJiYgIXRyYW5zcG9ydDsgaSsrKSB7Ci0gICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8VXNiVHJhbnNwb3J0PiB1c2IodXNiX29wZW4obWF0Y2hlciwgVVNCX1RJTUVPVVQpKTsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxVc2JUcmFuc3BvcnQ+IHVzYiA9IHVzYl9vcGVuKG1hdGNoZXIsIFVTQl9USU1FT1VUKTsKICAgICAgICAgICAgIGlmICh1c2IpCiAgICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gc3RkOjp1bmlxdWVfcHRyPFRyYW5zcG9ydFNuaWZmZXI+KAogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRyYW5zcG9ydFNuaWZmZXIoc3RkOjptb3ZlKHVzYiksIHNlcmlhbF9wb3J0KSk7CkBAIC0xNDMsNyArMTQzLDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBBU1NFUlRfRVEoZGV2aWNlX3BhdGgsIGNiX3NjcmF0Y2gpOyAgLy8gVGhlIHBhdGggY2FuIG5vdCBjaGFuZ2UKICAgICB9Ci0gICAgZmIgPSBzdGQ6OnVuaXF1ZV9wdHI8RmFzdEJvb3REcml2ZXI+KG5ldyBGYXN0Qm9vdERyaXZlcih0cmFuc3BvcnQuZ2V0KCksIHt9LCB0cnVlKSk7CisgICAgZmIgPSBzdGQ6OnVuaXF1ZV9wdHI8RmFzdEJvb3REcml2ZXI+KG5ldyBGYXN0Qm9vdERyaXZlcihzdGQ6Om1vdmUodHJhbnNwb3J0KSwge30sIHRydWUpKTsKICAgICAvLyBObyBlcnJvciBjaGVja2luZyBzaW5jZSBub24tQS9CIGRldmljZXMgbWF5IG5vdCBzdXBwb3J0IHRoZSBjb21tYW5kCiAgICAgZmItPkdldFZhcigiY3VycmVudC1zbG90IiwgJmluaXRpYWxfc2xvdCk7CiB9CkBAIC0yMDAsNyArMjAwLDcgQEAKICAgICBpZiAoSXNGYXN0Ym9vdE92ZXJUY3AoKSkgewogICAgICAgICBDb25uZWN0VGNwRmFzdGJvb3REZXZpY2UoKTsKICAgICAgICAgZGV2aWNlX3BhdGggPSBjYl9zY3JhdGNoOwotICAgICAgICBmYiA9IHN0ZDo6dW5pcXVlX3B0cjxGYXN0Qm9vdERyaXZlcj4obmV3IEZhc3RCb290RHJpdmVyKHRyYW5zcG9ydC5nZXQoKSwge30sIHRydWUpKTsKKyAgICAgICAgZmIgPSBzdGQ6OnVuaXF1ZV9wdHI8RmFzdEJvb3REcml2ZXI+KG5ldyBGYXN0Qm9vdERyaXZlcihzdGQ6Om1vdmUodHJhbnNwb3J0KSwge30sIHRydWUpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMjEyLDcgKzIxMiw3IEBACiAgICAgICAgIHJldHVybiBNYXRjaEZhc3Rib290KGluZm8sIGRldmljZV9zZXJpYWwpOwogICAgIH07CiAgICAgd2hpbGUgKCF0cmFuc3BvcnQpIHsKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFVzYlRyYW5zcG9ydD4gdXNiKHVzYl9vcGVuKG1hdGNoZXIsIFVTQl9USU1FT1VUKSk7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxVc2JUcmFuc3BvcnQ+IHVzYiA9IHVzYl9vcGVuKG1hdGNoZXIsIFVTQl9USU1FT1VUKTsKICAgICAgICAgaWYgKHVzYikgewogICAgICAgICAgICAgdHJhbnNwb3J0ID0gc3RkOjp1bmlxdWVfcHRyPFRyYW5zcG9ydFNuaWZmZXI+KAogICAgICAgICAgICAgICAgICAgICBuZXcgVHJhbnNwb3J0U25pZmZlcihzdGQ6Om1vdmUodXNiKSwgc2VyaWFsX3BvcnQpKTsKQEAgLTIyMCw3ICsyMjAsNyBAQAogICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoMXMpOwogICAgIH0KICAgICBkZXZpY2VfcGF0aCA9IGNiX3NjcmF0Y2g7Ci0gICAgZmIgPSBzdGQ6OnVuaXF1ZV9wdHI8RmFzdEJvb3REcml2ZXI+KG5ldyBGYXN0Qm9vdERyaXZlcih0cmFuc3BvcnQuZ2V0KCksIHt9LCB0cnVlKSk7CisgICAgZmIgPSBzdGQ6OnVuaXF1ZV9wdHI8RmFzdEJvb3REcml2ZXI+KG5ldyBGYXN0Qm9vdERyaXZlcihzdGQ6Om1vdmUodHJhbnNwb3J0KSwge30sIHRydWUpKTsKIH0KIAogdm9pZCBGYXN0Qm9vdFRlc3Q6OlNldExvY2tTdGF0ZShib29sIHVubG9jaywgYm9vbCBhc3NlcnRfY2hhbmdlKSB7CmRpZmYgLS1naXQgYS9mYXN0Ym9vdC9mdXp6eV9mYXN0Ym9vdC9tYWluLmNwcCBiL2Zhc3Rib290L2Z1enp5X2Zhc3Rib290L21haW4uY3BwCmluZGV4IGU2MzU5MzcuLjc5ZjM5MzkgMTAwNjQ0Ci0tLSBhL2Zhc3Rib290L2Z1enp5X2Zhc3Rib290L21haW4uY3BwCisrKyBiL2Zhc3Rib290L2Z1enp5X2Zhc3Rib290L21haW4uY3BwCkBAIC01MCw2ICs1MCw3IEBACiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KICNpbmNsdWRlIDxzcGFyc2Uvc3BhcnNlLmg+CiAKKyNpbmNsdWRlICJjb25zdGFudHMuaCIKICNpbmNsdWRlICJmYXN0Ym9vdF9kcml2ZXIuaCIKICNpbmNsdWRlICJ1c2IuaCIKIApAQCAtMTY2LDE2ICsxNjcsMTUgQEAKICAgICBjb25zdCBhdXRvIG1hdGNoZXIgPSBbXSh1c2JfaWZjX2luZm8qIGluZm8pIC0+IGludCB7CiAgICAgICAgIHJldHVybiBGYXN0Qm9vdFRlc3Q6Ok1hdGNoRmFzdGJvb3QoaW5mbywgZmFzdGJvb3Q6OkZhc3RCb290VGVzdDo6ZGV2aWNlX3NlcmlhbCk7CiAgICAgfTsKLSAgICBUcmFuc3BvcnQqIHRyYW5zcG9ydCA9IG51bGxwdHI7CisgICAgc3RkOjp1bmlxdWVfcHRyPFRyYW5zcG9ydD4gdHJhbnNwb3J0OwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRmFzdEJvb3RUZXN0OjpNQVhfVVNCX1RSSUVTICYmICF0cmFuc3BvcnQ7IGkrKykgewogICAgICAgICB0cmFuc3BvcnQgPSB1c2Jfb3BlbihtYXRjaGVyKTsKICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMTApKTsKICAgICB9Ci0gICAgQVNTRVJUX05FKHRyYW5zcG9ydCwgbnVsbHB0cikgPDwgIkNvdWxkIG5vdCBmaW5kIHRoZSBmYXN0Ym9vdCBkZXZpY2UgYWZ0ZXI6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAxMCAqIEZhc3RCb290VGVzdDo6TUFYX1VTQl9UUklFUyA8PCAibXMiOworICAgIEFTU0VSVF9ORSh0cmFuc3BvcnQuZ2V0KCksIG51bGxwdHIpIDw8ICJDb3VsZCBub3QgZmluZCB0aGUgZmFzdGJvb3QgZGV2aWNlIGFmdGVyOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgMTAgKiBGYXN0Qm9vdFRlc3Q6Ok1BWF9VU0JfVFJJRVMgPDwgIm1zIjsKICAgICBpZiAodHJhbnNwb3J0KSB7CiAgICAgICAgIHRyYW5zcG9ydC0+Q2xvc2UoKTsKLSAgICAgICAgZGVsZXRlIHRyYW5zcG9ydDsKICAgICB9CiB9CiAKQEAgLTkyOSw4ICs5MjksNyBAQAogCiAgICAgQVNTRVJUX1RSVUUoVXNiU3RpbGxBdmFpbGlibGUoKSkgPDwgVVNCX1BPUlRfR09ORTsKICAgICBzdGQ6OnN0cmluZyByZXNwOwotICAgIEVYUEVDVF9FUShmYi0+R2V0VmFyKCJwcm9kdWN0IiwgJnJlc3ApLCBTVUNDRVNTKQotICAgICAgICAgICAgICAgIDw8ICJEZXZpY2UgaXMgdW5yZXNwb25zaXZlIHRvIGdldHZhciBjb21tYW5kIjsKKyAgICBFWFBFQ1RfRVEoZmItPkdldFZhcigicHJvZHVjdCIsICZyZXNwKSwgU1VDQ0VTUykgPDwgIkRldmljZSBpcyB1bnJlc3BvbnNpdmUgdG8gZ2V0dmFyIGNvbW1hbmQiOwogfQogCiBURVNUX0YoRnV6eiwgQ29tbWFuZFRvb0xhcmdlKSB7CkBAIC05ODYsMTEgKzk4NSwxMCBAQAogVEVTVF9GKEZ1enosIFNwYXJzZVplcm9CbGtTaXplKSB7CiAgICAgLy8gaGFuZGNyYWZ0ZWQgbWFsZm9ybSBzcGFyc2UgZmlsZSB3aXRoIHplcm8gYXMgYmxvY2sgc2l6ZQogICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNoYXI+IGJ1ZiA9IHsKLSAgICAgICAgJ1x4M2EnLCAnXHhmZicsICdceDI2JywgJ1x4ZWQnLCAnXHgwMScsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDFjJywgJ1x4MDAnLCAnXHgwYycsICdceDAwJywKLSAgICAgICAgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgwMScsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDAxJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywKLSAgICAgICAgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHhjMicsICdceGNhJywgJ1x4MDAnLCAnXHgwMCcsICdceDAxJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywKLSAgICAgICAgJ1x4MTAnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgxMScsICdceDIyJywgJ1x4MzMnLCAnXHg0NCcKLSAgICB9OworICAgICAgICAgICAgJ1x4M2EnLCAnXHhmZicsICdceDI2JywgJ1x4ZWQnLCAnXHgwMScsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDFjJywgJ1x4MDAnLCAnXHgwYycsCisgICAgICAgICAgICAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MDEnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgwMScsICdceDAwJywKKyAgICAgICAgICAgICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceGMyJywgJ1x4Y2EnLCAnXHgwMCcsICdceDAwJywgJ1x4MDEnLAorICAgICAgICAgICAgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MTAnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgxMScsICdceDIyJywgJ1x4MzMnLCAnXHg0NCd9OwogCiAgICAgQVNTRVJUX0VRKERvd25sb2FkQ29tbWFuZChidWYuc2l6ZSgpKSwgU1VDQ0VTUykgPDwgIkRldmljZSByZWplY3RlZCBkb3dubG9hZCBjb21tYW5kIjsKICAgICBBU1NFUlRfRVEoU2VuZEJ1ZmZlcihidWYpLCBTVUNDRVNTKSA8PCAiRG93bmxvYWRpbmcgcGF5bG9hZCBmYWlsZWQiOwpAQCAtMTAwNSwxMyArMTAwMywxMCBAQAogVEVTVF9GKEZ1enosIFNwYXJzZVZlcnlMYXJnZUJsa1NpemUpIHsKICAgICAvLyBoYW5kY3JhZnRlZCBzcGFyc2UgZmlsZSB3aXRoIGJsb2NrIHNpemUgb2YgfjRHQiBhbmQgZGl2aXNpYmxlIDQKICAgICBjb25zdCBzdGQ6OnZlY3RvcjxjaGFyPiBidWYgPSB7Ci0gICAgICAgICdceDNhJywgJ1x4ZmYnLCAnXHgyNicsICdceGVkJywgJ1x4MDEnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLAotICAgICAgICAnXHgxYycsICdceDAwJywgJ1x4MGMnLCAnXHgwMCcsICdceEYwJywgJ1x4RkYnLCAnXHhGRicsICdceEZGJywKLSAgICAgICAgJ1x4MDEnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgwMScsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsCi0gICAgICAgICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4YzMnLCAnXHhjYScsICdceDAwJywgJ1x4MDAnLAotICAgICAgICAnXHgwMScsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDBjJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywKLSAgICAgICAgJ1x4MTEnLCAnXHgyMicsICdceDMzJywgJ1x4NDQnCi0gICAgfTsKKyAgICAgICAgICAgICdceDNhJywgJ1x4ZmYnLCAnXHgyNicsICdceGVkJywgJ1x4MDEnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgxYycsICdceDAwJywgJ1x4MGMnLAorICAgICAgICAgICAgJ1x4MDAnLCAnXHhGMCcsICdceEZGJywgJ1x4RkYnLCAnXHhGRicsICdceDAxJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MDEnLCAnXHgwMCcsCisgICAgICAgICAgICAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHhjMycsICdceGNhJywgJ1x4MDAnLCAnXHgwMCcsICdceDAxJywKKyAgICAgICAgICAgICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDBjJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MTEnLCAnXHgyMicsICdceDMzJywgJ1x4NDQnfTsKIAogICAgIEFTU0VSVF9FUShEb3dubG9hZENvbW1hbmQoYnVmLnNpemUoKSksIFNVQ0NFU1MpIDw8ICJEZXZpY2UgcmVqZWN0ZWQgZG93bmxvYWQgY29tbWFuZCI7CiAgICAgQVNTRVJUX0VRKFNlbmRCdWZmZXIoYnVmKSwgU1VDQ0VTUykgPDwgIkRvd25sb2FkaW5nIHBheWxvYWQgZmFpbGVkIjsKQEAgLTEwMjIsMTEgKzEwMTcsMTAgQEAKIFRFU1RfRihGdXp6LCBTcGFyc2VUcmltbWVkKSB7CiAgICAgLy8gaGFuZGNyYWZ0ZWQgbWFsZm9ybSBzcGFyc2UgZmlsZSB3aGljaCBpcyB0cmltbWVkCiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y2hhcj4gYnVmID0gewotICAgICAgICAnXHgzYScsICdceGZmJywgJ1x4MjYnLCAnXHhlZCcsICdceDAxJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MWMnLCAnXHgwMCcsICdceDBjJywgJ1x4MDAnLAotICAgICAgICAnXHgwMCcsICdceDEwJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgwOCcsICdceDAwJywgJ1x4MDEnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLAotICAgICAgICAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceGMxJywgJ1x4Y2EnLCAnXHgwMCcsICdceDAwJywgJ1x4MDEnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLAotICAgICAgICAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHg4MCcsICdceDExJywgJ1x4MjInLCAnXHgzMycsICdceDQ0JwotICAgIH07CisgICAgICAgICAgICAnXHgzYScsICdceGZmJywgJ1x4MjYnLCAnXHhlZCcsICdceDAxJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MWMnLCAnXHgwMCcsICdceDBjJywKKyAgICAgICAgICAgICdceDAwJywgJ1x4MDAnLCAnXHgxMCcsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MDgnLCAnXHgwMCcsICdceDAxJywgJ1x4MDAnLAorICAgICAgICAgICAgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4YzEnLCAnXHhjYScsICdceDAwJywgJ1x4MDAnLCAnXHgwMScsCisgICAgICAgICAgICAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHg4MCcsICdceDExJywgJ1x4MjInLCAnXHgzMycsICdceDQ0J307CiAKICAgICBBU1NFUlRfRVEoRG93bmxvYWRDb21tYW5kKGJ1Zi5zaXplKCkpLCBTVUNDRVNTKSA8PCAiRGV2aWNlIHJlamVjdGVkIGRvd25sb2FkIGNvbW1hbmQiOwogICAgIEFTU0VSVF9FUShTZW5kQnVmZmVyKGJ1ZiksIFNVQ0NFU1MpIDw8ICJEb3dubG9hZGluZyBwYXlsb2FkIGZhaWxlZCI7CkBAIC0xMDQxLDExICsxMDM1LDEwIEBACiBURVNUX0YoRnV6eiwgU3BhcnNlSW52YWxpZENodXJrKSB7CiAgICAgLy8gaGFuZGNyYWZ0ZWQgbWFsZm9ybSBzcGFyc2UgZmlsZSB3aXRoIGludmFsaWQgY2h1cmsKICAgICBjb25zdCBzdGQ6OnZlY3RvcjxjaGFyPiBidWYgPSB7Ci0gICAgICAgICdceDNhJywgJ1x4ZmYnLCAnXHgyNicsICdceGVkJywgJ1x4MDEnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgxYycsICdceDAwJywgJ1x4MGMnLCAnXHgwMCcsCi0gICAgICAgICdceDAwJywgJ1x4MTAnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDA4JywgJ1x4MDAnLCAnXHgwMScsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsCi0gICAgICAgICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4YzEnLCAnXHhjYScsICdceDAwJywgJ1x4MDAnLCAnXHgwMScsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsCi0gICAgICAgICdceDEwJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MTEnLCAnXHgyMicsICdceDMzJywgJ1x4NDQnCi0gICAgfTsKKyAgICAgICAgICAgICdceDNhJywgJ1x4ZmYnLCAnXHgyNicsICdceGVkJywgJ1x4MDEnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgxYycsICdceDAwJywgJ1x4MGMnLAorICAgICAgICAgICAgJ1x4MDAnLCAnXHgwMCcsICdceDEwJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgwOCcsICdceDAwJywgJ1x4MDEnLCAnXHgwMCcsCisgICAgICAgICAgICAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHhjMScsICdceGNhJywgJ1x4MDAnLCAnXHgwMCcsICdceDAxJywKKyAgICAgICAgICAgICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsICdceDEwJywgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MTEnLCAnXHgyMicsICdceDMzJywgJ1x4NDQnfTsKIAogICAgIEFTU0VSVF9FUShEb3dubG9hZENvbW1hbmQoYnVmLnNpemUoKSksIFNVQ0NFU1MpIDw8ICJEZXZpY2UgcmVqZWN0ZWQgZG93bmxvYWQgY29tbWFuZCI7CiAgICAgQVNTRVJUX0VRKFNlbmRCdWZmZXIoYnVmKSwgU1VDQ0VTUykgPDwgIkRvd25sb2FkaW5nIHBheWxvYWQgZmFpbGVkIjsKQEAgLTE4OTUsOSArMTg4OCwxMCBAQAogICAgIGlmICghZmFzdGJvb3Q6OkZhc3RCb290VGVzdDo6SXNGYXN0Ym9vdE92ZXJUY3AoKSkgewogICAgICAgICBwcmludGYoIjxXYWl0aW5nIGZvciBEZXZpY2U+XG4iKTsKICAgICAgICAgY29uc3QgYXV0byBtYXRjaGVyID0gW10odXNiX2lmY19pbmZvKiBpbmZvKSAtPiBpbnQgewotICAgICAgICAgICAgcmV0dXJuIGZhc3Rib290OjpGYXN0Qm9vdFRlc3Q6Ok1hdGNoRmFzdGJvb3QoaW5mbywgZmFzdGJvb3Q6OkZhc3RCb290VGVzdDo6ZGV2aWNlX3NlcmlhbCk7CisgICAgICAgICAgICByZXR1cm4gZmFzdGJvb3Q6OkZhc3RCb290VGVzdDo6TWF0Y2hGYXN0Ym9vdChpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFzdGJvb3Q6OkZhc3RCb290VGVzdDo6ZGV2aWNlX3NlcmlhbCk7CiAgICAgICAgIH07Ci0gICAgICAgIFRyYW5zcG9ydCogdHJhbnNwb3J0ID0gbnVsbHB0cjsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFRyYW5zcG9ydD4gdHJhbnNwb3J0OwogICAgICAgICB3aGlsZSAoIXRyYW5zcG9ydCkgewogICAgICAgICAgICAgdHJhbnNwb3J0ID0gdXNiX29wZW4obWF0Y2hlcik7CiAgICAgICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMCkpOwpkaWZmIC0tZ2l0IGEvZmFzdGJvb3QvZnV6enlfZmFzdGJvb3QvdHJhbnNwb3J0X3NuaWZmZXIuY3BwIGIvZmFzdGJvb3QvZnV6enlfZmFzdGJvb3QvdHJhbnNwb3J0X3NuaWZmZXIuY3BwCmluZGV4IGI1NWZmZDMuLjBhZWYzNTAgMTAwNjQ0Ci0tLSBhL2Zhc3Rib290L2Z1enp5X2Zhc3Rib290L3RyYW5zcG9ydF9zbmlmZmVyLmNwcAorKysgYi9mYXN0Ym9vdC9mdXp6eV9mYXN0Ym9vdC90cmFuc3BvcnRfc25pZmZlci5jcHAKQEAgLTkwLDcgKzkwLDcgQEAKICAgICAvLyBhbmQgYmUgcHJpbnRlZCBhcyBhIHN0cmluZywgb3IganVzdCBhIHJhdyBieXRlLWJ1ZmZlcgogICAgIGNvbnN0IGF1dG8gbXNnID0gWyZyZXQsIG5vX3ByaW50XShjb25zdCBzdGQ6OnZlY3RvcjxjaGFyPiYgYnVmKSB7CiAgICAgICAgIHJldCArPSBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoIiglbHUgYnl0ZXMpOiAiLCBidWYuc2l6ZSgpKTsKLSAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcj46Oml0ZXJhdG9yIGl0ZXIgPSBidWYuZW5kKCk7CisgICAgICAgIHN0ZDo6dmVjdG9yPGNoYXI+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gYnVmLmVuZCgpOwogICAgICAgICBjb25zdCB1bnNpZ25lZCBtYXhfY2hhcnMgPSA1MDsKICAgICAgICAgaWYgKGJ1Zi5zaXplKCkgPiBtYXhfY2hhcnMpIHsKICAgICAgICAgICAgIGl0ZXIgPSBidWYuYmVnaW4oKSArIG1heF9jaGFyczsKZGlmZiAtLWdpdCBhL2Zhc3Rib290L3N0b3JhZ2UuY3BwIGIvZmFzdGJvb3Qvc3RvcmFnZS5jcHAKaW5kZXggZDZlMDBjZi4uNjI5ZWJjOCAxMDA2NDQKLS0tIGEvZmFzdGJvb3Qvc3RvcmFnZS5jcHAKKysrIGIvZmFzdGJvb3Qvc3RvcmFnZS5jcHAKQEAgLTE4LDI5ICsxOCwyNSBAQAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAKICNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgogCiAjaW5jbHVkZSAic3RvcmFnZS5oIgogI2luY2x1ZGUgInV0aWwuaCIKIAogQ29ubmVjdGVkRGV2aWNlc1N0b3JhZ2U6OkNvbm5lY3RlZERldmljZXNTdG9yYWdlKCkgewotICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGhvbWVfcGF0aCA9IEdldEhvbWVEaXJQYXRoKCk7Ci0gICAgaWYgKGhvbWVfcGF0aC5lbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjb25zdCBzdGQ6OnN0cmluZyBob21lX2Zhc3Rib290X3BhdGggPSBob21lX3BhdGggKyBrUGF0aFNlcGFyYXRvciArICIuZmFzdGJvb3QiOwotCi0gICAgaWYgKCFFbnN1cmVEaXJlY3RvcnlFeGlzdHMoaG9tZV9mYXN0Ym9vdF9wYXRoKSkgewotICAgICAgICBMT0coRkFUQUwpIDw8ICJDYW5ub3QgY3JlYXRlIGRpcmVjdG9yeTogIiA8PCBob21lX2Zhc3Rib290X3BhdGg7Ci0gICAgfQorICAgIGhvbWVfZmFzdGJvb3RfcGF0aF8gPSBHZXRIb21lRGlyUGF0aCgpICsga1BhdGhTZXBhcmF0b3IgKyAiLmZhc3Rib290IjsKKyAgICBkZXZpY2VzX3BhdGhfID0gaG9tZV9mYXN0Ym9vdF9wYXRoXyArIGtQYXRoU2VwYXJhdG9yICsgImRldmljZXMiOwogCiAgICAgLy8gV2UncmUgdXNpbmcgYSBzZXBhcmF0ZSBmaWxlIGZvciBsb2NraW5nIGJlY2F1c2UgdGhlIFdpbmRvd3MgTG9ja0ZpbGVFeCBkb2VzIG5vdAogICAgIC8vIHBlcm1pdCBvcGVuaW5nIGEgZmlsZSBzdHJlYW0gZm9yIHRoZSBsb2NrZWQgZmlsZSwgZXZlbiB3aXRoaW4gdGhlIHNhbWUgcHJvY2Vzcy4gU28sCiAgICAgLy8gd2UgaGF2ZSB0byB1c2UgZmQgb3IgaGFuZGxlIEFQSSB0byBtYW5pcHVsYXRlIHRoZSBzdG9yYWdlIGZpbGVzLCB3aGljaCBtYWtlcyBpdAogICAgIC8vIG5lYXJseSBpbXBvc3NpYmxlIHRvIGZ1bGx5IHJld3JpdGUgYSBmaWxlIGNvbnRlbnQgd2l0aG91dCBoYXZpbmcgdG8gcmVjcmVhdGUgaXQuCiAgICAgLy8gVW5mb3J0dW5hdGVseSwgdGhpcyBpcyBub3QgYW4gb3B0aW9uIGR1cmluZyBob2xkaW5nIGEgbG9jay4KLSAgICBkZXZpY2VzX3BhdGhfID0gaG9tZV9mYXN0Ym9vdF9wYXRoICsga1BhdGhTZXBhcmF0b3IgKyAiZGV2aWNlcyI7Ci0gICAgZGV2aWNlc19sb2NrX3BhdGhfID0gaG9tZV9mYXN0Ym9vdF9wYXRoICsga1BhdGhTZXBhcmF0b3IgKyAiZGV2aWNlcy5sb2NrIjsKKyAgICBkZXZpY2VzX2xvY2tfcGF0aF8gPSBob21lX2Zhc3Rib290X3BhdGhfICsga1BhdGhTZXBhcmF0b3IgKyAiZGV2aWNlcy5sb2NrIjsKK30KKworYm9vbCBDb25uZWN0ZWREZXZpY2VzU3RvcmFnZTo6RXhpc3RzKCkgY29uc3QgeworICAgIHJldHVybiBGaWxlRXhpc3RzKGRldmljZXNfcGF0aF8pOwogfQogCiB2b2lkIENvbm5lY3RlZERldmljZXNTdG9yYWdlOjpXcml0ZURldmljZXMoY29uc3QgRmlsZUxvY2smLCBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mIGRldmljZXMpIHsKQEAgLTYzLDUgKzU5LDggQEAKIH0KIAogRmlsZUxvY2sgQ29ubmVjdGVkRGV2aWNlc1N0b3JhZ2U6OkxvY2soKSBjb25zdCB7CisgICAgaWYgKCFFbnN1cmVEaXJlY3RvcnlFeGlzdHMoaG9tZV9mYXN0Ym9vdF9wYXRoXykpIHsKKyAgICAgICAgTE9HKEZBVEFMKSA8PCAiQ2Fubm90IGNyZWF0ZSBkaXJlY3Rvcnk6ICIgPDwgaG9tZV9mYXN0Ym9vdF9wYXRoXzsKKyAgICB9CiAgICAgcmV0dXJuIEZpbGVMb2NrKGRldmljZXNfbG9ja19wYXRoXyk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvZmFzdGJvb3Qvc3RvcmFnZS5oIGIvZmFzdGJvb3Qvc3RvcmFnZS5oCmluZGV4IDBjYzNkODYuLmFlOWQ4NDYgMTAwNjQ0Ci0tLSBhL2Zhc3Rib290L3N0b3JhZ2UuaAorKysgYi9mYXN0Ym9vdC9zdG9yYWdlLmgKQEAgLTI0LDEzICsyNCwxNSBAQAogY2xhc3MgQ29ubmVjdGVkRGV2aWNlc1N0b3JhZ2UgewogICBwdWJsaWM6CiAgICAgQ29ubmVjdGVkRGV2aWNlc1N0b3JhZ2UoKTsKKworICAgIGJvb2wgRXhpc3RzKCkgY29uc3Q7CiAgICAgdm9pZCBXcml0ZURldmljZXMoY29uc3QgRmlsZUxvY2smLCBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mIGRldmljZXMpOwogICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBSZWFkRGV2aWNlcyhjb25zdCBGaWxlTG9jayYpOwogICAgIHZvaWQgQ2xlYXIoY29uc3QgRmlsZUxvY2smKTsKLQogICAgIEZpbGVMb2NrIExvY2soKSBjb25zdDsKIAogICBwcml2YXRlOgorICAgIHN0ZDo6c3RyaW5nIGhvbWVfZmFzdGJvb3RfcGF0aF87CiAgICAgc3RkOjpzdHJpbmcgZGV2aWNlc19wYXRoXzsKICAgICBzdGQ6OnN0cmluZyBkZXZpY2VzX2xvY2tfcGF0aF87CiB9OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Zhc3Rib290L3Rhc2suY3BwIGIvZmFzdGJvb3QvdGFzay5jcHAKaW5kZXggMDU0YzFlZC4uZWE3OGEwMSAxMDA2NDQKLS0tIGEvZmFzdGJvb3QvdGFzay5jcHAKKysrIGIvZmFzdGJvb3QvdGFzay5jcHAKQEAgLTE1LDcgKzE1LDcgQEAKIC8vCiAjaW5jbHVkZSAidGFzay5oIgogCi0jaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSAiZmFzdGJvb3RfZHJpdmVyLmgiCiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wYXJzZWludC5oPgpAQCAtMjYsMTMgKzI2LDIzIEBACiAjaW5jbHVkZSAidXRpbC5oIgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOjpzdHJpbmdfbGl0ZXJhbHM7Ci1GbGFzaFRhc2s6OkZsYXNoVGFzayhjb25zdCBzdGQ6OnN0cmluZyYgX3Nsb3QsIGNvbnN0IHN0ZDo6c3RyaW5nJiBfcG5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBfZm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIGFwcGx5X3ZibWV0YSkKLSAgICA6IHBuYW1lXyhfcG5hbWUpLCBmbmFtZV8oX2ZuYW1lKSwgc2xvdF8oX3Nsb3QpLCBhcHBseV92Ym1ldGFfKGFwcGx5X3ZibWV0YSkge30KK0ZsYXNoVGFzazo6Rmxhc2hUYXNrKGNvbnN0IHN0ZDo6c3RyaW5nJiBzbG90LCBjb25zdCBzdGQ6OnN0cmluZyYgcG5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgYXBwbHlfdmJtZXRhLCBjb25zdCBGbGFzaGluZ1BsYW4qIGZwKQorICAgIDogcG5hbWVfKHBuYW1lKSwgZm5hbWVfKGZuYW1lKSwgc2xvdF8oc2xvdCksIGFwcGx5X3ZibWV0YV8oYXBwbHlfdmJtZXRhKSwgZnBfKGZwKSB7fQorCitib29sIEZsYXNoVGFzazo6SXNEeW5hbWljUGFydGl0aW9uKGNvbnN0IEltYWdlU291cmNlKiBzb3VyY2UsIGNvbnN0IEZsYXNoVGFzayogdGFzaykgeworICAgIHN0ZDo6dmVjdG9yPGNoYXI+IGNvbnRlbnRzOworICAgIGlmICghc291cmNlLT5SZWFkRmlsZSgic3VwZXJfZW1wdHkuaW1nIiwgJmNvbnRlbnRzKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGF1dG8gbWV0YWRhdGEgPSBhbmRyb2lkOjpmc19tZ3I6OlJlYWRGcm9tSW1hZ2VCbG9iKGNvbnRlbnRzLmRhdGEoKSwgY29udGVudHMuc2l6ZSgpKTsKKyAgICByZXR1cm4gc2hvdWxkX2ZsYXNoX2luX3VzZXJzcGFjZSgqbWV0YWRhdGEuZ2V0KCksIHRhc2stPkdldFBhcnRpdGlvbkFuZFNsb3QoKSk7Cit9CiAKIHZvaWQgRmxhc2hUYXNrOjpSdW4oKSB7CiAgICAgYXV0byBmbGFzaCA9IFsmXShjb25zdCBzdGQ6OnN0cmluZyYgcGFydGl0aW9uKSB7Ci0gICAgICAgIGlmIChzaG91bGRfZmxhc2hfaW5fdXNlcnNwYWNlKHBhcnRpdGlvbikgJiYgIWlzX3VzZXJzcGFjZV9mYXN0Ym9vdCgpKSB7CisgICAgICAgIGlmIChzaG91bGRfZmxhc2hfaW5fdXNlcnNwYWNlKGZwXy0+c291cmNlLmdldCgpLCBwYXJ0aXRpb24pICYmICFpc191c2Vyc3BhY2VfZmFzdGJvb3QoKSAmJgorICAgICAgICAgICAgIWZwXy0+Zm9yY2VfZmxhc2gpIHsKICAgICAgICAgICAgIGRpZSgiVGhlIHBhcnRpdGlvbiB5b3UgYXJlIHRyeWluZyB0byBmbGFzaCBpcyBkeW5hbWljLCBhbmQgIgogICAgICAgICAgICAgICAgICJzaG91bGQgYmUgZmxhc2hlZCB2aWEgZmFzdGJvb3RkLiBQbGVhc2UgcnVuOlxuIgogICAgICAgICAgICAgICAgICJcbiIKQEAgLTQxLDEyICs1MSwyMCBAQAogICAgICAgICAgICAgICAgICJBbmQgdHJ5IGFnYWluLiBJZiB5b3UgYXJlIGludGVudGlvbmFsbHkgdHJ5aW5nIHRvICIKICAgICAgICAgICAgICAgICAib3ZlcndyaXRlIGEgZml4ZWQgcGFydGl0aW9uLCB1c2UgLS1mb3JjZS4iKTsKICAgICAgICAgfQotICAgICAgICBkb19mbGFzaChwYXJ0aXRpb24uY19zdHIoKSwgZm5hbWVfLmNfc3RyKCksIGFwcGx5X3ZibWV0YV8pOworICAgICAgICBkb19mbGFzaChwYXJ0aXRpb24uY19zdHIoKSwgZm5hbWVfLmNfc3RyKCksIGFwcGx5X3ZibWV0YV8sIGZwXyk7CiAgICAgfTsKICAgICBkb19mb3JfcGFydGl0aW9ucyhwbmFtZV8sIHNsb3RfLCBmbGFzaCwgdHJ1ZSk7CiB9CiAKLXN0ZDo6c3RyaW5nIEZsYXNoVGFzazo6R2V0UGFydGl0aW9uQW5kU2xvdCgpIHsKK3N0ZDo6c3RyaW5nIEZsYXNoVGFzazo6VG9TdHJpbmcoKSBjb25zdCB7CisgICAgc3RkOjpzdHJpbmcgYXBwbHlfdmJtZXRhX3N0cmluZyA9ICIiOworICAgIGlmIChhcHBseV92Ym1ldGFfKSB7CisgICAgICAgIGFwcGx5X3ZibWV0YV9zdHJpbmcgPSAiIC0tYXBwbHlfdmJtZXRhIjsKKyAgICB9CisgICAgcmV0dXJuICJmbGFzaCIgKyBhcHBseV92Ym1ldGFfc3RyaW5nICsgIiAiICsgcG5hbWVfICsgIiAiICsgZm5hbWVfOworfQorCitzdGQ6OnN0cmluZyBGbGFzaFRhc2s6OkdldFBhcnRpdGlvbkFuZFNsb3QoKSBjb25zdCB7CiAgICAgYXV0byBzbG90ID0gc2xvdF87CiAgICAgaWYgKHNsb3QuZW1wdHkoKSkgewogICAgICAgICBzbG90ID0gZ2V0X2N1cnJlbnRfc2xvdCgpOwpAQCAtNjUsNyArODMsNyBAQAogICAgIDogcmVib290X3RhcmdldF8ocmVib290X3RhcmdldCksIGZwXyhmcCl7fTsKIAogdm9pZCBSZWJvb3RUYXNrOjpSdW4oKSB7Ci0gICAgaWYgKChyZWJvb3RfdGFyZ2V0XyA9PSAidXNlcnNwYWNlIiB8fCByZWJvb3RfdGFyZ2V0XyA9PSAiZmFzdGJvb3QiKSkgeworICAgIGlmIChyZWJvb3RfdGFyZ2V0XyA9PSAiZmFzdGJvb3QiKSB7CiAgICAgICAgIGlmICghaXNfdXNlcnNwYWNlX2Zhc3Rib290KCkpIHsKICAgICAgICAgICAgIHJlYm9vdF90b191c2Vyc3BhY2VfZmFzdGJvb3QoKTsKICAgICAgICAgICAgIGZwXy0+ZmItPldhaXRGb3JEaXNjb25uZWN0KCk7CkBAIC04NCwyMCArMTAyLDI2IEBACiAgICAgfQogfQogCi1GbGFzaFN1cGVyTGF5b3V0VGFzazo6Rmxhc2hTdXBlckxheW91dFRhc2soY29uc3Qgc3RkOjpzdHJpbmcmIHN1cGVyX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFN1cGVyRmxhc2hIZWxwZXI+IGhlbHBlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGFyc2VQdHIgc3BhcnNlX2xheW91dCwgdWludDY0X3Qgc3VwZXJfc2l6ZSkKK3N0ZDo6c3RyaW5nIFJlYm9vdFRhc2s6OlRvU3RyaW5nKCkgY29uc3QgeworICAgIHJldHVybiAicmVib290ICIgKyByZWJvb3RfdGFyZ2V0XzsKK30KKworT3B0aW1pemVkRmxhc2hTdXBlclRhc2s6Ok9wdGltaXplZEZsYXNoU3VwZXJUYXNrKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdXBlcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxTdXBlckZsYXNoSGVscGVyPiBoZWxwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BhcnNlUHRyIHNwYXJzZV9sYXlvdXQsIHVpbnQ2NF90IHN1cGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxhc2hpbmdQbGFuKiBmcCkKICAgICA6IHN1cGVyX25hbWVfKHN1cGVyX25hbWUpLAogICAgICAgaGVscGVyXyhzdGQ6Om1vdmUoaGVscGVyKSksCiAgICAgICBzcGFyc2VfbGF5b3V0XyhzdGQ6Om1vdmUoc3BhcnNlX2xheW91dCkpLAotICAgICAgc3VwZXJfc2l6ZV8oc3VwZXJfc2l6ZSkge30KKyAgICAgIHN1cGVyX3NpemVfKHN1cGVyX3NpemUpLAorICAgICAgZnBfKGZwKSB7fQogCi12b2lkIEZsYXNoU3VwZXJMYXlvdXRUYXNrOjpSdW4oKSB7Cit2b2lkIE9wdGltaXplZEZsYXNoU3VwZXJUYXNrOjpSdW4oKSB7CiAgICAgLy8gVXNlIHRoZSByZXBvcnRlZCBzdXBlciBwYXJ0aXRpb24gc2l6ZSBhcyB0aGUgdXBwZXIgbGltaXQsIHJhdGhlciB0aGFuCiAgICAgLy8gc3BhcnNlX2ZpbGVfbGVuLCB3aGljaCAoMSkgY2FuIGZhaWwgYW5kICgyKSBpcyBraW5kIG9mIGV4cGVuc2l2ZSwgc2luY2UKICAgICAvLyBpdCB3aWxsIG1hcCBpbiBhbGwgb2YgdGhlIGVtYmVkZGVkIGZkcy4KICAgICBzdGQ6OnZlY3RvcjxTcGFyc2VQdHI+IGZpbGVzOwotICAgIGlmIChpbnQgbGltaXQgPSBnZXRfc3BhcnNlX2xpbWl0KHN1cGVyX3NpemVfKSkgeworICAgIGlmIChpbnQgbGltaXQgPSBnZXRfc3BhcnNlX2xpbWl0KHN1cGVyX3NpemVfLCBmcF8pKSB7CiAgICAgICAgIGZpbGVzID0gcmVzcGFyc2VfZmlsZShzcGFyc2VfbGF5b3V0Xy5nZXQoKSwgbGltaXQpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGZpbGVzLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoc3BhcnNlX2xheW91dF8pKTsKQEAgLTEwNyw3MyArMTMxLDQyIEBACiAgICAgZmxhc2hfcGFydGl0aW9uX2ZpbGVzKHN1cGVyX25hbWVfLCBmaWxlcyk7CiB9CiAKLXN0ZDo6dW5pcXVlX3B0cjxGbGFzaFN1cGVyTGF5b3V0VGFzaz4gRmxhc2hTdXBlckxheW91dFRhc2s6OkluaXRpYWxpemUoCi0gICAgICAgIGNvbnN0IEZsYXNoaW5nUGxhbiogZnAsIHN0ZDo6dmVjdG9yPEltYWdlRW50cnk+JiBvc19pbWFnZXMpIHsKLSAgICBpZiAoIXN1cHBvcnRzX0FCKCkpIHsKLSAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJDYW5ub3Qgb3B0aW1pemUgZmxhc2hpbmcgc3VwZXIgb24gbm9uLUFCIGRldmljZSI7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLSAgICBpZiAoZnAtPnNsb3Rfb3ZlcnJpZGUgPT0gImFsbCIpIHsKLSAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJDYW5ub3Qgb3B0aW1pemUgZmxhc2hpbmcgc3VwZXIgZm9yIGFsbCBzbG90cyI7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLQotICAgIC8vIERvZXMgdGhpcyBkZXZpY2UgdXNlIGR5bmFtaWMgcGFydGl0aW9ucyBhdCBhbGw/Ci0gICAgdW5pcXVlX2ZkIGZkID0gZnAtPnNvdXJjZS0+T3BlbkZpbGUoInN1cGVyX2VtcHR5LmltZyIpOwotCi0gICAgaWYgKGZkIDwgMCkgewotICAgICAgICBMT0coVkVSQk9TRSkgPDwgImNvdWxkIG5vdCBvcGVuIHN1cGVyX2VtcHR5LmltZyI7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLQotICAgIHN0ZDo6c3RyaW5nIHN1cGVyX25hbWU7Ci0gICAgLy8gVHJ5IHRvIGZpbmQgd2hldGhlciB0aGVyZSBpcyBhIHN1cGVyIHBhcnRpdGlvbi4KLSAgICBpZiAoZnAtPmZiLT5HZXRWYXIoInN1cGVyLXBhcnRpdGlvbi1uYW1lIiwgJnN1cGVyX25hbWUpICE9IGZhc3Rib290OjpTVUNDRVNTKSB7Ci0gICAgICAgIHN1cGVyX25hbWUgPSAic3VwZXIiOwotICAgIH0KLQotICAgIHVpbnQ2NF90IHBhcnRpdGlvbl9zaXplOwotICAgIHN0ZDo6c3RyaW5nIHBhcnRpdGlvbl9zaXplX3N0cjsKLSAgICBpZiAoZnAtPmZiLT5HZXRWYXIoInBhcnRpdGlvbi1zaXplOiIgKyBzdXBlcl9uYW1lLCAmcGFydGl0aW9uX3NpemVfc3RyKSAhPSBmYXN0Ym9vdDo6U1VDQ0VTUykgewotICAgICAgICBMT0coVkVSQk9TRSkgPDwgIkNhbm5vdCBvcHRpbWl6ZSBzdXBlciBmbGFzaGluZzogY291bGQgbm90IGRldGVybWluZSBzdXBlciBwYXJ0aXRpb24iOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gICAgcGFydGl0aW9uX3NpemVfc3RyID0gZmJfZml4X251bWVyaWNfdmFyKHBhcnRpdGlvbl9zaXplX3N0cik7Ci0gICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpQYXJzZVVpbnQocGFydGl0aW9uX3NpemVfc3RyLCAmcGFydGl0aW9uX3NpemUpKSB7Ci0gICAgICAgIExPRyhWRVJCT1NFKSA8PCAiQ291bGQgbm90IHBhcnNlICIgPDwgc3VwZXJfbmFtZSA8PCAiIHNpemU6ICIgPDwgcGFydGl0aW9uX3NpemVfc3RyOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3VwZXJGbGFzaEhlbHBlcj4gaGVscGVyID0gc3RkOjptYWtlX3VuaXF1ZTxTdXBlckZsYXNoSGVscGVyPigqZnAtPnNvdXJjZSk7Ci0gICAgaWYgKCFoZWxwZXItPk9wZW4oZmQpKSB7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLQotICAgIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBvc19pbWFnZXMpIHsKLSAgICAgICAgYXV0byBwYXJ0aXRpb24gPSBHZXRQYXJ0aXRpb25OYW1lKGVudHJ5LCBmcC0+Y3VycmVudF9zbG90KTsKLSAgICAgICAgYXV0byBpbWFnZSA9IGVudHJ5LmZpcnN0OwotCi0gICAgICAgIGlmICghaGVscGVyLT5BZGRQYXJ0aXRpb24ocGFydGl0aW9uLCBpbWFnZS0+aW1nX25hbWUsIGltYWdlLT5vcHRpb25hbF9pZl9ub19pbWFnZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYXV0byBzID0gaGVscGVyLT5HZXRTcGFyc2VMYXlvdXQoKTsKLSAgICBpZiAoIXMpIHJldHVybiBudWxscHRyOwotCi0gICAgLy8gUmVtb3ZlIGltYWdlcyB0aGF0IHdlIGFscmVhZHkgZmxhc2hlZCwganVzdCBpbiBjYXNlIHdlIGhhdmUgbm9uLWR5bmFtaWMgT1MgaW1hZ2VzLgotICAgIGF1dG8gcmVtb3ZlX2lmX2NhbGxiYWNrID0gWyZdKGNvbnN0IEltYWdlRW50cnkmIGVudHJ5KSAtPiBib29sIHsKLSAgICAgICAgcmV0dXJuIGhlbHBlci0+V2lsbEZsYXNoKEdldFBhcnRpdGlvbk5hbWUoZW50cnksIGZwLT5jdXJyZW50X3Nsb3QpKTsKLSAgICB9OwotICAgIG9zX2ltYWdlcy5lcmFzZShzdGQ6OnJlbW92ZV9pZihvc19pbWFnZXMuYmVnaW4oKSwgb3NfaW1hZ2VzLmVuZCgpLCByZW1vdmVfaWZfY2FsbGJhY2spLAotICAgICAgICAgICAgICAgICAgICBvc19pbWFnZXMuZW5kKCkpOwotICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEZsYXNoU3VwZXJMYXlvdXRUYXNrPihzdXBlcl9uYW1lLCBzdGQ6Om1vdmUoaGVscGVyKSwgc3RkOjptb3ZlKHMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25fc2l6ZSk7CitzdGQ6OnN0cmluZyBPcHRpbWl6ZWRGbGFzaFN1cGVyVGFzazo6VG9TdHJpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuICJvcHRpbWl6ZWQtZmxhc2gtc3VwZXIiOwogfQogCi1zdGQ6OnVuaXF1ZV9wdHI8Rmxhc2hTdXBlckxheW91dFRhc2s+IEZsYXNoU3VwZXJMYXlvdXRUYXNrOjpJbml0aWFsaXplRnJvbVRhc2tzKAorLy8gVGhpcyBsb29rcyBmb3IgYSBibG9jayB3aXRoaW4gdGFza3MgdGhhdCBoYXMgdGhlIGZvbGxvd2luZyBwYXR0ZXJuIFtyZWJvb3QgZmFzdGJvb3QsCisvLyB1cGRhdGUtc3VwZXIsICRMSVNUX09GX0RZTkFNSUNfRkxBU0hfVEFTS1NdIGFuZCByZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBmb3VuZC5UaGVvcmV0aWNhbGx5CisvLyB0aGlzIGNoZWNrIGlzIGp1c3QgYSBwYXR0ZXJuIG1hdGNoIGFuZCBjb3VsZCBicmVhayBpZiBmYXN0Ym9vdC1pbmZvIGhhcyBhIGJ1bmNoIG9mIGp1bmsgY29tbWFuZHMKKy8vIGJ1dCBhbGwgZGV2aWNlcyBzaG91bGQgcHJldHR5IG11Y2ggZm9sbG93IHRoaXMgcGF0dGVybgorYm9vbCBPcHRpbWl6ZWRGbGFzaFN1cGVyVGFzazo6Q2FuT3B0aW1pemUoY29uc3QgSW1hZ2VTb3VyY2UqIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxUYXNrPj4mIHRhc2tzKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0YXNrcy5zaXplKCk7IGkrKykgeworICAgICAgICBhdXRvIHJlYm9vdF90YXNrID0gdGFza3NbaV0tPkFzUmVib290VGFzaygpOworICAgICAgICBpZiAoIXJlYm9vdF90YXNrIHx8IHJlYm9vdF90YXNrLT5HZXRUYXJnZXQoKSAhPSAiZmFzdGJvb3QiKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBUaGUgY2hlY2sgZm9yIGkgPj0gdGFza3Muc2l6ZSgpIC0gMiBpcyBiZWNhdXNlIHdlIGFyZSBwZWVraW5nIHR3byB0YXNrcyBhaGVhZC4gV2UgbmVlZCB0bworICAgICAgICAvLyBjaGVjayBmb3IgYW4gdXBkYXRlLXN1cGVyICYmIGZsYXNoIHtkeW5hbWljX3BhcnRpdGlvbn0KKyAgICAgICAgaWYgKGkgPj0gdGFza3Muc2l6ZSgpIC0gMiB8fCAhdGFza3NbaSArIDFdLT5Bc1VwZGF0ZVN1cGVyVGFzaygpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBhdXRvIGZsYXNoX3Rhc2sgPSB0YXNrc1tpICsgMl0tPkFzRmxhc2hUYXNrKCk7CisgICAgICAgIGlmICghRmxhc2hUYXNrOjpJc0R5bmFtaWNQYXJ0aXRpb24oc291cmNlLCBmbGFzaF90YXNrKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RkOjp1bmlxdWVfcHRyPE9wdGltaXplZEZsYXNoU3VwZXJUYXNrPiBPcHRpbWl6ZWRGbGFzaFN1cGVyVGFzazo6SW5pdGlhbGl6ZSgKICAgICAgICAgY29uc3QgRmxhc2hpbmdQbGFuKiBmcCwgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFRhc2s+PiYgdGFza3MpIHsKLSAgICBpZiAoIXN1cHBvcnRzX0FCKCkpIHsKKyAgICBpZiAoIWZwLT5zaG91bGRfb3B0aW1pemVfZmxhc2hfc3VwZXIpIHsKKyAgICAgICAgTE9HKElORk8pIDw8ICJzdXBlciBvcHRpbWl6YXRpb24gaXMgZGlzYWJsZWQiOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKCFzdXBwb3J0c19BQihmcC0+ZmIpKSB7CiAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiQ2Fubm90IG9wdGltaXplIGZsYXNoaW5nIHN1cGVyIG9uIG5vbi1BQiBkZXZpY2UiOwogICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CkBAIC0xODEsNiArMTc0LDkgQEAKICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJDYW5ub3Qgb3B0aW1pemUgZmxhc2hpbmcgc3VwZXIgZm9yIGFsbCBzbG90cyI7CiAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KKyAgICBpZiAoIUNhbk9wdGltaXplKGZwLT5zb3VyY2UuZ2V0KCksIHRhc2tzKSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CiAKICAgICAvLyBEb2VzIHRoaXMgZGV2aWNlIHVzZSBkeW5hbWljIHBhcnRpdGlvbnMgYXQgYWxsPwogICAgIHVuaXF1ZV9mZCBmZCA9IGZwLT5zb3VyY2UtPk9wZW5GaWxlKCJzdXBlcl9lbXB0eS5pbWciKTsKQEAgLTIxNCwzMiArMjEwLDM0IEBACiAKICAgICBmb3IgKGNvbnN0IGF1dG8mIHRhc2sgOiB0YXNrcykgewogICAgICAgICBpZiAoYXV0byBmbGFzaF90YXNrID0gdGFzay0+QXNGbGFzaFRhc2soKSkgewotICAgICAgICAgICAgaWYgKHNob3VsZF9mbGFzaF9pbl91c2Vyc3BhY2UoZmxhc2hfdGFzay0+R2V0UGFydGl0aW9uQW5kU2xvdCgpKSkgewotICAgICAgICAgICAgICAgIGF1dG8gcGFydGl0aW9uID0gZmxhc2hfdGFzay0+R2V0UGFydGl0aW9uQW5kU2xvdCgpOwotICAgICAgICAgICAgICAgIGlmICghaGVscGVyLT5BZGRQYXJ0aXRpb24ocGFydGl0aW9uLCBmbGFzaF90YXNrLT5HZXRJbWFnZU5hbWUoKSwgZmFsc2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gcGFydGl0aW9uID0gZmxhc2hfdGFzay0+R2V0UGFydGl0aW9uQW5kU2xvdCgpOworICAgICAgICAgICAgaWYgKCFoZWxwZXItPkFkZFBhcnRpdGlvbihwYXJ0aXRpb24sIGZsYXNoX3Rhc2stPkdldEltYWdlTmFtZSgpLCBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAogICAgIGF1dG8gcyA9IGhlbHBlci0+R2V0U3BhcnNlTGF5b3V0KCk7CiAgICAgaWYgKCFzKSByZXR1cm4gbnVsbHB0cjsKLSAgICAvLyBSZW1vdmUgaW1hZ2VzIHRoYXQgd2UgYWxyZWFkeSBmbGFzaGVkLCBqdXN0IGluIGNhc2Ugd2UgaGF2ZSBub24tZHluYW1pYyBPUyBpbWFnZXMuCisKKyAgICAvLyBSZW1vdmUgdGFza3MgdGhhdCBhcmUgY29uY2F0ZW5hdGVkIGludG8gdGhpcyBvcHRpbWl6ZWQgdGFzawogICAgIGF1dG8gcmVtb3ZlX2lmX2NhbGxiYWNrID0gWyZdKGNvbnN0IGF1dG8mIHRhc2spIC0+IGJvb2wgewogICAgICAgICBpZiAoYXV0byBmbGFzaF90YXNrID0gdGFzay0+QXNGbGFzaFRhc2soKSkgewogICAgICAgICAgICAgcmV0dXJuIGhlbHBlci0+V2lsbEZsYXNoKGZsYXNoX3Rhc2stPkdldFBhcnRpdGlvbkFuZFNsb3QoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYXV0byB1cGRhdGVfc3VwZXJfdGFzayA9IHRhc2stPkFzVXBkYXRlU3VwZXJUYXNrKCkpIHsKKyAgICAgICAgfSBlbHNlIGlmICh0YXNrLT5Bc1VwZGF0ZVN1cGVyVGFzaygpKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfSBlbHNlIGlmIChhdXRvIHJlYm9vdF90YXNrID0gdGFzay0+QXNSZWJvb3RUYXNrKCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYgKHJlYm9vdF90YXNrLT5HZXRUYXJnZXQoKSA9PSAiZmFzdGJvb3QiKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH07CisKICAgICB0YXNrcy5lcmFzZShzdGQ6OnJlbW92ZV9pZih0YXNrcy5iZWdpbigpLCB0YXNrcy5lbmQoKSwgcmVtb3ZlX2lmX2NhbGxiYWNrKSwgdGFza3MuZW5kKCkpOwogCi0gICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8Rmxhc2hTdXBlckxheW91dFRhc2s+KHN1cGVyX25hbWUsIHN0ZDo6bW92ZShoZWxwZXIpLCBzdGQ6Om1vdmUocyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbl9zaXplKTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxPcHRpbWl6ZWRGbGFzaFN1cGVyVGFzaz4oc3VwZXJfbmFtZSwgc3RkOjptb3ZlKGhlbHBlciksIHN0ZDo6bW92ZShzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uX3NpemUsIGZwKTsKIH0KIAogVXBkYXRlU3VwZXJUYXNrOjpVcGRhdGVTdXBlclRhc2soY29uc3QgRmxhc2hpbmdQbGFuKiBmcCkgOiBmcF8oZnApIHt9CkBAIC0yNjUsNiArMjYzLDkgQEAKICAgICB9CiAgICAgZnBfLT5mYi0+UmF3Q29tbWFuZChjb21tYW5kLCAiVXBkYXRpbmcgc3VwZXIgcGFydGl0aW9uIik7CiB9CitzdGQ6OnN0cmluZyBVcGRhdGVTdXBlclRhc2s6OlRvU3RyaW5nKCkgY29uc3QgeworICAgIHJldHVybiAidXBkYXRlLXN1cGVyIjsKK30KIAogUmVzaXplVGFzazo6UmVzaXplVGFzayhjb25zdCBGbGFzaGluZ1BsYW4qIGZwLCBjb25zdCBzdGQ6OnN0cmluZyYgcG5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2xvdCkKQEAgLTI3OSwxMiArMjgwLDIwIEBACiAgICAgZG9fZm9yX3BhcnRpdGlvbnMocG5hbWVfLCBzbG90XywgcmVzaXplX3BhcnRpdGlvbiwgZmFsc2UpOwogfQogCitzdGQ6OnN0cmluZyBSZXNpemVUYXNrOjpUb1N0cmluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gInJlc2l6ZSAiICsgcG5hbWVfOworfQorCiBEZWxldGVUYXNrOjpEZWxldGVUYXNrKGNvbnN0IEZsYXNoaW5nUGxhbiogZnAsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwbmFtZSkgOiBmcF8oZnApLCBwbmFtZV8ocG5hbWUpe307CiAKIHZvaWQgRGVsZXRlVGFzazo6UnVuKCkgewogICAgIGZwXy0+ZmItPkRlbGV0ZVBhcnRpdGlvbihwbmFtZV8pOwogfQogCitzdGQ6OnN0cmluZyBEZWxldGVUYXNrOjpUb1N0cmluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gImRlbGV0ZSAiICsgcG5hbWVfOworfQorCiBXaXBlVGFzazo6V2lwZVRhc2soY29uc3QgRmxhc2hpbmdQbGFuKiBmcCwgY29uc3Qgc3RkOjpzdHJpbmcmIHBuYW1lKSA6IGZwXyhmcCksIHBuYW1lXyhwbmFtZSl7fTsKIAogdm9pZCBXaXBlVGFzazo6UnVuKCkgewpAQCAtMjk4LDUgKzMwNyw5IEBACiAgICAgICAgIExPRyhFUlJPUikgPDwgIndpcGUgdGFzayBlcmFzZSBmYWlsZWQgd2l0aCBwYXJ0aXRpb246ICIgPDwgcG5hbWVfOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGZiX3BlcmZvcm1fZm9ybWF0KHBuYW1lXywgMSwgcGFydGl0aW9uX3R5cGUsICIiLCBmcF8tPmZzX29wdGlvbnMpOworICAgIGZiX3BlcmZvcm1fZm9ybWF0KHBuYW1lXywgMSwgcGFydGl0aW9uX3R5cGUsICIiLCBmcF8tPmZzX29wdGlvbnMsIGZwXyk7Cit9CisKK3N0ZDo6c3RyaW5nIFdpcGVUYXNrOjpUb1N0cmluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gImVyYXNlICIgKyBwbmFtZV87CiB9CmRpZmYgLS1naXQgYS9mYXN0Ym9vdC90YXNrLmggYi9mYXN0Ym9vdC90YXNrLmgKaW5kZXggMzRlM2U5Mi4uN2E3MTNjZiAxMDA2NDQKLS0tIGEvZmFzdGJvb3QvdGFzay5oCisrKyBiL2Zhc3Rib290L3Rhc2suaApAQCAtMTUsMTAgKzE1LDggQEAKIC8vCiAjcHJhZ21hIG9uY2UKIAotI2luY2x1ZGUgPHNzdHJlYW0+CiAjaW5jbHVkZSA8c3RyaW5nPgogCi0jaW5jbHVkZSAiZmFzdGJvb3RfZHJpdmVyLmgiCiAjaW5jbHVkZSAic3VwZXJfZmxhc2hfaGVscGVyLmgiCiAjaW5jbHVkZSAidXRpbC5oIgogCkBAIC0yOSwxNiArMjcsMjEgQEAKIGNsYXNzIEZsYXNoVGFzazsKIGNsYXNzIFJlYm9vdFRhc2s7CiBjbGFzcyBVcGRhdGVTdXBlclRhc2s7CitjbGFzcyBPcHRpbWl6ZWRGbGFzaFN1cGVyVGFzazsKIGNsYXNzIFdpcGVUYXNrOwotCitjbGFzcyBSZXNpemVUYXNrOwogY2xhc3MgVGFzayB7CiAgIHB1YmxpYzoKICAgICBUYXNrKCkgPSBkZWZhdWx0OwogICAgIHZpcnR1YWwgdm9pZCBSdW4oKSA9IDA7CisgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0ID0gMDsKKwogICAgIHZpcnR1YWwgRmxhc2hUYXNrKiBBc0ZsYXNoVGFzaygpIHsgcmV0dXJuIG51bGxwdHI7IH0KICAgICB2aXJ0dWFsIFJlYm9vdFRhc2sqIEFzUmVib290VGFzaygpIHsgcmV0dXJuIG51bGxwdHI7IH0KICAgICB2aXJ0dWFsIFVwZGF0ZVN1cGVyVGFzayogQXNVcGRhdGVTdXBlclRhc2soKSB7IHJldHVybiBudWxscHRyOyB9CisgICAgdmlydHVhbCBPcHRpbWl6ZWRGbGFzaFN1cGVyVGFzayogQXNPcHRpbWl6ZWRGbGFzaFN1cGVyVGFzaygpIHsgcmV0dXJuIG51bGxwdHI7IH0KICAgICB2aXJ0dWFsIFdpcGVUYXNrKiBBc1dpcGVUYXNrKCkgeyByZXR1cm4gbnVsbHB0cjsgfQorICAgIHZpcnR1YWwgUmVzaXplVGFzayogQXNSZXNpemVUYXNrKCkgeyByZXR1cm4gbnVsbHB0cjsgfQogCiAgICAgdmlydHVhbCB+VGFzaygpID0gZGVmYXVsdDsKIH07CkBAIC00NiwyMCArNDksMjMgQEAKIGNsYXNzIEZsYXNoVGFzayA6IHB1YmxpYyBUYXNrIHsKICAgcHVibGljOgogICAgIEZsYXNoVGFzayhjb25zdCBzdGQ6OnN0cmluZyYgc2xvdCwgY29uc3Qgc3RkOjpzdHJpbmcmIHBuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsCi0gICAgICAgICAgICAgIGNvbnN0IGJvb2wgYXBwbHlfdmJtZXRhKTsKKyAgICAgICAgICAgICAgY29uc3QgYm9vbCBhcHBseV92Ym1ldGEsIGNvbnN0IEZsYXNoaW5nUGxhbiogZnApOwogICAgIHZpcnR1YWwgRmxhc2hUYXNrKiBBc0ZsYXNoVGFzaygpIG92ZXJyaWRlIHsgcmV0dXJuIHRoaXM7IH0KIAotICAgIHN0ZDo6c3RyaW5nIEdldFBhcnRpdGlvbigpIHsgcmV0dXJuIHBuYW1lXzsgfQotICAgIHN0ZDo6c3RyaW5nIEdldEltYWdlTmFtZSgpIHsgcmV0dXJuIGZuYW1lXzsgfQotICAgIHN0ZDo6c3RyaW5nIEdldFBhcnRpdGlvbkFuZFNsb3QoKTsKLSAgICBzdGQ6OnN0cmluZyBHZXRTbG90KCkgeyByZXR1cm4gc2xvdF87IH0KKyAgICBzdGF0aWMgYm9vbCBJc0R5bmFtaWNQYXJ0aXRpb24oY29uc3QgSW1hZ2VTb3VyY2UqIHNvdXJjZSwgY29uc3QgRmxhc2hUYXNrKiB0YXNrKTsKICAgICB2b2lkIFJ1bigpIG92ZXJyaWRlOworICAgIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgc3RkOjpzdHJpbmcgR2V0UGFydGl0aW9uKCkgY29uc3QgeyByZXR1cm4gcG5hbWVfOyB9CisgICAgc3RkOjpzdHJpbmcgR2V0SW1hZ2VOYW1lKCkgY29uc3QgeyByZXR1cm4gZm5hbWVfOyB9CisgICAgc3RkOjpzdHJpbmcgR2V0U2xvdCgpIGNvbnN0IHsgcmV0dXJuIHNsb3RfOyB9CisgICAgc3RkOjpzdHJpbmcgR2V0UGFydGl0aW9uQW5kU2xvdCgpIGNvbnN0OwogCiAgIHByaXZhdGU6CiAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcG5hbWVfOwogICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGZuYW1lXzsKICAgICBjb25zdCBzdGQ6OnN0cmluZyBzbG90XzsKICAgICBjb25zdCBib29sIGFwcGx5X3ZibWV0YV87CisgICAgY29uc3QgRmxhc2hpbmdQbGFuKiBmcF87CiB9OwogCiBjbGFzcyBSZWJvb3RUYXNrIDogcHVibGljIFRhc2sgewpAQCAtNjgsMjggKzc0LDM0IEBACiAgICAgUmVib290VGFzayhjb25zdCBGbGFzaGluZ1BsYW4qIGZwLCBjb25zdCBzdGQ6OnN0cmluZyYgcmVib290X3RhcmdldCk7CiAgICAgdmlydHVhbCBSZWJvb3RUYXNrKiBBc1JlYm9vdFRhc2soKSBvdmVycmlkZSB7IHJldHVybiB0aGlzOyB9CiAgICAgdm9pZCBSdW4oKSBvdmVycmlkZTsKKyAgICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICAgIHN0ZDo6c3RyaW5nIEdldFRhcmdldCgpIGNvbnN0IHsgcmV0dXJuIHJlYm9vdF90YXJnZXRfOyB9OwogCiAgIHByaXZhdGU6CiAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcmVib290X3RhcmdldF8gPSAiIjsKICAgICBjb25zdCBGbGFzaGluZ1BsYW4qIGZwXzsKIH07CiAKLWNsYXNzIEZsYXNoU3VwZXJMYXlvdXRUYXNrIDogcHVibGljIFRhc2sgeworY2xhc3MgT3B0aW1pemVkRmxhc2hTdXBlclRhc2sgOiBwdWJsaWMgVGFzayB7CiAgIHB1YmxpYzoKLSAgICBGbGFzaFN1cGVyTGF5b3V0VGFzayhjb25zdCBzdGQ6OnN0cmluZyYgc3VwZXJfbmFtZSwgc3RkOjp1bmlxdWVfcHRyPFN1cGVyRmxhc2hIZWxwZXI+IGhlbHBlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBTcGFyc2VQdHIgc3BhcnNlX2xheW91dCwgdWludDY0X3Qgc3VwZXJfc2l6ZSk7Ci0gICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxGbGFzaFN1cGVyTGF5b3V0VGFzaz4gSW5pdGlhbGl6ZShjb25zdCBGbGFzaGluZ1BsYW4qIGZwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8SW1hZ2VFbnRyeT4mIG9zX2ltYWdlcyk7Ci0gICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxGbGFzaFN1cGVyTGF5b3V0VGFzaz4gSW5pdGlhbGl6ZUZyb21UYXNrcygKKyAgICBPcHRpbWl6ZWRGbGFzaFN1cGVyVGFzayhjb25zdCBzdGQ6OnN0cmluZyYgc3VwZXJfbmFtZSwgc3RkOjp1bmlxdWVfcHRyPFN1cGVyRmxhc2hIZWxwZXI+IGhlbHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGFyc2VQdHIgc3BhcnNlX2xheW91dCwgdWludDY0X3Qgc3VwZXJfc2l6ZSwgY29uc3QgRmxhc2hpbmdQbGFuKiBmcCk7CisgICAgdmlydHVhbCBPcHRpbWl6ZWRGbGFzaFN1cGVyVGFzayogQXNPcHRpbWl6ZWRGbGFzaFN1cGVyVGFzaygpIG92ZXJyaWRlIHsgcmV0dXJuIHRoaXM7IH0KKworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8T3B0aW1pemVkRmxhc2hTdXBlclRhc2s+IEluaXRpYWxpemUoCiAgICAgICAgICAgICBjb25zdCBGbGFzaGluZ1BsYW4qIGZwLCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VGFzaz4+JiB0YXNrcyk7Ci0gICAgdXNpbmcgSW1hZ2VFbnRyeSA9IHN0ZDo6cGFpcjxjb25zdCBJbWFnZSosIHN0ZDo6c3RyaW5nPjsKKyAgICBzdGF0aWMgYm9vbCBDYW5PcHRpbWl6ZShjb25zdCBJbWFnZVNvdXJjZSogc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxUYXNrPj4mIHRhc2tzKTsKKwogICAgIHZvaWQgUnVuKCkgb3ZlcnJpZGU7CisgICAgc3RkOjpzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKIAogICBwcml2YXRlOgogICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN1cGVyX25hbWVfOwogICAgIHN0ZDo6dW5pcXVlX3B0cjxTdXBlckZsYXNoSGVscGVyPiBoZWxwZXJfOwogICAgIFNwYXJzZVB0ciBzcGFyc2VfbGF5b3V0XzsKICAgICB1aW50NjRfdCBzdXBlcl9zaXplXzsKKyAgICBjb25zdCBGbGFzaGluZ1BsYW4qIGZwXzsKIH07CiAKIGNsYXNzIFVwZGF0ZVN1cGVyVGFzayA6IHB1YmxpYyBUYXNrIHsKQEAgLTk4LDYgKzExMCw3IEBACiAgICAgdmlydHVhbCBVcGRhdGVTdXBlclRhc2sqIEFzVXBkYXRlU3VwZXJUYXNrKCkgb3ZlcnJpZGUgeyByZXR1cm4gdGhpczsgfQogCiAgICAgdm9pZCBSdW4oKSBvdmVycmlkZTsKKyAgICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOwogCiAgIHByaXZhdGU6CiAgICAgY29uc3QgRmxhc2hpbmdQbGFuKiBmcF87CkBAIC0xMDgsNiArMTIxLDggQEAKICAgICBSZXNpemVUYXNrKGNvbnN0IEZsYXNoaW5nUGxhbiogZnAsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHNpemUsCiAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2xvdCk7CiAgICAgdm9pZCBSdW4oKSBvdmVycmlkZTsKKyAgICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmVzaXplVGFzayogQXNSZXNpemVUYXNrKCkgb3ZlcnJpZGUgeyByZXR1cm4gdGhpczsgfQogCiAgIHByaXZhdGU6CiAgICAgY29uc3QgRmxhc2hpbmdQbGFuKiBmcF87CkBAIC0xMTgsOCArMTMzLDkgQEAKIAogY2xhc3MgRGVsZXRlVGFzayA6IHB1YmxpYyBUYXNrIHsKICAgcHVibGljOgotICAgIERlbGV0ZVRhc2soY29uc3QgRmxhc2hpbmdQbGFuKiBfZnAsIGNvbnN0IHN0ZDo6c3RyaW5nJiBfcG5hbWUpOworICAgIERlbGV0ZVRhc2soY29uc3QgRmxhc2hpbmdQbGFuKiBmcCwgY29uc3Qgc3RkOjpzdHJpbmcmIHBuYW1lKTsKICAgICB2b2lkIFJ1bigpIG92ZXJyaWRlOworICAgIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgcHJpdmF0ZToKICAgICBjb25zdCBGbGFzaGluZ1BsYW4qIGZwXzsKQEAgLTEzMCw4ICsxNDYsOCBAQAogICBwdWJsaWM6CiAgICAgV2lwZVRhc2soY29uc3QgRmxhc2hpbmdQbGFuKiBmcCwgY29uc3Qgc3RkOjpzdHJpbmcmIHBuYW1lKTsKICAgICB2aXJ0dWFsIFdpcGVUYXNrKiBBc1dpcGVUYXNrKCkgb3ZlcnJpZGUgeyByZXR1cm4gdGhpczsgfQotCiAgICAgdm9pZCBSdW4oKSBvdmVycmlkZTsKKyAgICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOwogCiAgIHByaXZhdGU6CiAgICAgY29uc3QgRmxhc2hpbmdQbGFuKiBmcF87CmRpZmYgLS1naXQgYS9mYXN0Ym9vdC90YXNrX3Rlc3QuY3BwIGIvZmFzdGJvb3QvdGFza190ZXN0LmNwcAppbmRleCAxNDViNGQ3Li41MTlkNGVkIDEwMDY0NAotLS0gYS9mYXN0Ym9vdC90YXNrX3Rlc3QuY3BwCisrKyBiL2Zhc3Rib290L3Rhc2tfdGVzdC5jcHAKQEAgLTE2LDE0ICsxNiwxNiBAQAogCiAjaW5jbHVkZSAidGFzay5oIgogI2luY2x1ZGUgImZhc3Rib290LmgiCisjaW5jbHVkZSAiZmFzdGJvb3RfZHJpdmVyX21vY2suaCIKIAogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KICNpbmNsdWRlICJhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oIgorI2luY2x1ZGUgImdtb2NrL2dtb2NrLmgiCisKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlNwbGl0OwordXNpbmcgdGVzdGluZzo6XzsKIAogY2xhc3MgUGFyc2VUZXN0IDogcHVibGljIDo6dGVzdGluZyA6OlRlc3QgewogICBwcm90ZWN0ZWQ6CkBAIC01OCw3ICs2MCwzNCBAQAogICAgIHJldHVybiBQYXJzZUZhc3Rib290SW5mb0xpbmUoZnAsIHZlY19jb21tYW5kKTsKIH0KIAotVEVTVF9GKFBhcnNlVGVzdCwgQ09SUkVDVF9GbEFTSF9UQVNLX0ZPUk1FRCkgeworLy8gdGVzdHMgaWYgdGFza3NfYSBpcyBhIHN1cGVyc2V0IG9mIHRhc2tzX2IuIFVzZWQgZm9yIGNoZWNraW5nIHRvIGVuc3VyZSBhbGwgcGFydGl0aW9ucyBmbGFzaGVkCisvLyBmcm9tIGhhcmRjb2RlZCBpbWFnZSBsaXN0IGlzIGFsc28gZmxhc2hlZCBpbiBuZXcgZmFzdGJvb3QtaW5mby50eHQKK3N0YXRpYyBib29sIGNvbXBhcmVUYXNrTGlzdChzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VGFzaz4+JiB0YXNrc19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxUYXNrPj4mIHRhc2tzX2IpIHsKKyAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gbGlzdDsKKyAgICBmb3IgKGF1dG8mIHRhc2sgOiB0YXNrc19hKSB7CisgICAgICAgIGxpc3QuaW5zZXJ0KHRhc2stPlRvU3RyaW5nKCkpOworICAgIH0KKyAgICBmb3IgKGF1dG8mIHRhc2sgOiB0YXNrc19iKSB7CisgICAgICAgIGlmIChsaXN0LmZpbmQodGFzay0+VG9TdHJpbmcoKSkgPT0gbGlzdC5lbmQoKSkgeworICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJFUlJPUjogIiA8PCB0YXNrLT5Ub1N0cmluZygpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiBub3QgZm91bmQgaW4gdGFzayBsaXN0IGNyZWF0ZWQgYnkgZmFzdGJvb3QtaW5mby50eHQiOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgdGFza3NUb1N0cmluZyhzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VGFzaz4+JiB0YXNrcykgeworICAgIHN0ZDo6c3RyaW5nIG91dHB1dDsKKyAgICBmb3IgKGF1dG8mIHRhc2sgOiB0YXNrcykgeworICAgICAgICBvdXRwdXQuYXBwZW5kKHRhc2stPlRvU3RyaW5nKCkpOworICAgICAgICBvdXRwdXQuYXBwZW5kKCJcbiIpOworICAgIH0KKyAgICByZXR1cm4gb3V0cHV0OworfQorCitURVNUX0YoUGFyc2VUZXN0LCBDb3JyZWN0Rmxhc2hUYXNrRm9ybWVkKSB7CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbW1hbmRzID0geyJmbGFzaCBkdGJvIiwgImZsYXNoIC0tc2xvdC1vdGhlciBzeXN0ZW0gc3lzdGVtX290aGVyLmltZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmbGFzaCBzeXN0ZW0iLCAiZmxhc2ggLS1hcHBseS12Ym1ldGEgdmJtZXRhIn07CiAKQEAgLTg2LDI1ICsxMTUsMzIgQEAKICAgICB9CiB9CiAKLVRFU1RfRihQYXJzZVRlc3QsIFZFUlNJT05fQ0hFQ0tfQ09SUlJFQ1QpIHsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29ycmVjdF92ZXJzaW9ucyA9IHsKLSAgICAgICAgICAgICJ2ZXJzaW9uIDEuMCIsCi0gICAgICAgICAgICAidmVyc2lvbiAyMi4wMCIsCi0gICAgfTsKK1RFU1RfRihQYXJzZVRlc3QsIFZlcnNpb25DaGVja0NvcnJlY3QpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29ycmVjdF92ZXJzaW9ucyA9IHsidmVyc2lvbiAxIiwgInZlcnNpb24gMjIiLCAidmVyc2lvbiA1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmVyc2lvbiAxNyJ9OwogCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGJhZF92ZXJzaW9ucyA9IHsidmVyc2lvbiIsICAgICAgICAidmVyc2lvbiAuMDEiLCAidmVyc2lvbiB4MSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmVyc2lvbiAxLjAuMSIsICAidmVyc2lvbiAxLiIsICAicyAxLjAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcnNpb24gMS4wIDIuMCJ9OworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBiYWRfdmVyc2lvbnMgPSB7InZlcnNpb24iLCAgICAgICAgICJ2ZXJzaW9uIC4wMSIsICAgICJ2ZXJzaW9uIHgxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJzaW9uIDEuMC4xIiwgICAidmVyc2lvbiAxLiIsICAgICAicyAxLjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcnNpb24gMS4wIDIuMCIsICJ2ZXJzaW9uIDEwMC4wMCIsICJ2ZXJzaW9uIDEgMiJ9OwogCiAgICAgZm9yIChhdXRvJiB2ZXJzaW9uIDogY29ycmVjdF92ZXJzaW9ucykgewotICAgICAgICBBU1NFUlRfVFJVRShDaGVja0Zhc3Rib290SW5mb1JlcXVpcmVtZW50cyhhbmRyb2lkOjpiYXNlOjpTcGxpdCh2ZXJzaW9uLCAiICIpKSkgPDwgdmVyc2lvbjsKKyAgICAgICAgQVNTRVJUX1RSVUUoQ2hlY2tGYXN0Ym9vdEluZm9SZXF1aXJlbWVudHMoYW5kcm9pZDo6YmFzZTo6U3BsaXQodmVyc2lvbiwgIiAiKSwgMjYpKQorICAgICAgICAgICAgICAgIDw8IHZlcnNpb247CiAgICAgfQorCisgICAgLy8gcmV0dXJuaW5nIEZhbHNlIGZvciBmYWlsaW5nIHZlcnNpb24gY2hlY2sKKyAgICBmb3IgKGF1dG8mIHZlcnNpb24gOiBjb3JyZWN0X3ZlcnNpb25zKSB7CisgICAgICAgIEFTU0VSVF9GQUxTRShDaGVja0Zhc3Rib290SW5mb1JlcXVpcmVtZW50cyhhbmRyb2lkOjpiYXNlOjpTcGxpdCh2ZXJzaW9uLCAiICIpLCAwKSkKKyAgICAgICAgICAgICAgICA8PCB2ZXJzaW9uOworICAgIH0KKyAgICAvLyByZXR1cm5pbmcgRmFsc2UgZm9yIGJhZCBmb3JtYXQKICAgICBmb3IgKGF1dG8mIHZlcnNpb24gOiBiYWRfdmVyc2lvbnMpIHsKLSAgICAgICAgQVNTRVJUX0ZBTFNFKENoZWNrRmFzdGJvb3RJbmZvUmVxdWlyZW1lbnRzKGFuZHJvaWQ6OmJhc2U6OlNwbGl0KHZlcnNpb24sICIgIikpKSA8PCB2ZXJzaW9uOworICAgICAgICBBU1NFUlRfRkFMU0UoQ2hlY2tGYXN0Ym9vdEluZm9SZXF1aXJlbWVudHMoYW5kcm9pZDo6YmFzZTo6U3BsaXQodmVyc2lvbiwgIiAiKSwgMTAwKSkKKyAgICAgICAgICAgICAgICA8PCB2ZXJzaW9uOwogICAgIH0KIH0KIAotVEVTVF9GKFBhcnNlVGVzdCwgQkFEX0ZBU1RCT09UX0lORk9fSU5QVVQpIHsKK1RFU1RfRihQYXJzZVRlc3QsIEJhZEZhc3Rib290SW5wdXQpIHsKICAgICBBU1NFUlRfRVEoUGFyc2VDb21tYW5kKGZwLmdldCgpLCAiZmxhc2giKSwgbnVsbHB0cik7CiAgICAgQVNTRVJUX0VRKFBhcnNlQ29tbWFuZChmcC5nZXQoKSwgImZsYXNoIC0tc2xvdC1vdGhlciAtLWFwcGx5LXZibWV0YSIpLCBudWxscHRyKTsKICAgICBBU1NFUlRfRVEoUGFyc2VDb21tYW5kKGZwLmdldCgpLCAiZmxhc2ggLS1hcHBseS12Ym1ldGEiKSwgbnVsbHB0cik7CkBAIC0xMjEsMyArMTU3LDIxNCBAQAogICAgIEFTU0VSVF9FUShQYXJzZUNvbW1hbmQoZnAuZ2V0KCksICJlcmFzZSBkdGJvIGR0Ym8iKSwgbnVsbHB0cik7CiAgICAgQVNTRVJUX0VRKFBhcnNlQ29tbWFuZChmcC5nZXQoKSwgIndpcGUgdGhpcyIpLCBudWxscHRyKTsKIH0KKworVEVTVF9GKFBhcnNlVGVzdCwgQ29ycmVjdFRhc2tGb3JtZWQpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29tbWFuZHMgPSB7ImZsYXNoIGR0Ym8iLCAiZmxhc2ggLS1zbG90LW90aGVyIHN5c3RlbSBzeXN0ZW1fb3RoZXIuaW1nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYm9vdCBib290bG9hZGVyIiwgInVwZGF0ZS1zdXBlciIsICJlcmFzZSBjYWNoZSJ9OworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxUYXNrPj4gdGFza3MgPSBjb2xsZWN0VGFza3MoZnAuZ2V0KCksIGNvbW1hbmRzKTsKKworICAgIEFTU0VSVF9UUlVFKHRhc2tzWzBdLT5Bc0ZsYXNoVGFzaygpKTsKKyAgICBBU1NFUlRfVFJVRSh0YXNrc1swXS0+QXNGbGFzaFRhc2soKSk7CisgICAgQVNTRVJUX1RSVUUodGFza3NbMV0tPkFzRmxhc2hUYXNrKCkpOworICAgIEFTU0VSVF9UUlVFKHRhc2tzWzJdLT5Bc1JlYm9vdFRhc2soKSk7CisgICAgQVNTRVJUX1RSVUUodGFza3NbM10tPkFzVXBkYXRlU3VwZXJUYXNrKCkpOworICAgIEFTU0VSVF9UUlVFKHRhc2tzWzRdLT5Bc1dpcGVUYXNrKCkpOworfQorCitURVNUX0YoUGFyc2VUZXN0LCBDb3JyZWN0RHJpdmVyQ2FsbHMpIHsKKyAgICBmYXN0Ym9vdDo6TW9ja0Zhc3Rib290RHJpdmVyIGZiOworICAgIGZwLT5mYiA9ICZmYjsKKworICAgIEVYUEVDVF9DQUxMKGZiLCBSZWJvb3RUbyhfLCBfLCBfKSkuVGltZXMoMSk7CisgICAgRVhQRUNUX0NBTEwoZmIsIFJlYm9vdChfLCBfKSkuVGltZXMoMSk7CisgICAgRVhQRUNUX0NBTEwoZmIsIFdhaXRGb3JEaXNjb25uZWN0KCkpLlRpbWVzKDIpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbW1hbmRzID0geyJyZWJvb3QgYm9vdGxvYWRlciIsICJyZWJvb3QifTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VGFzaz4+IHRhc2tzID0gY29sbGVjdFRhc2tzKGZwLmdldCgpLCBjb21tYW5kcyk7CisKKyAgICBmb3IgKGF1dG8mIHRhc2sgOiB0YXNrcykgeworICAgICAgICB0YXNrLT5SdW4oKTsKKyAgICB9Cit9CisKK1RFU1RfRihQYXJzZVRlc3QsIENvcnJlY3RUYXNrTGlzdHMpIHsKKyAgICBpZiAoIWdldF9hbmRyb2lkX3Byb2R1Y3Rfb3V0KCkpIHsKKyAgICAgICAgR1RFU1RfU0tJUCgpOworICAgIH0KKworICAgIGZwLT5zb3VyY2UucmVzZXQobmV3IExvY2FsSW1hZ2VTb3VyY2UpOworICAgIGZwLT5zcGFyc2VfbGltaXQgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptYXgoKTsKKworICAgIGZhc3Rib290OjpNb2NrRmFzdGJvb3REcml2ZXIgZmI7CisgICAgZnAtPmZiID0gJmZiOworICAgIGZwLT5zaG91bGRfb3B0aW1pemVfZmxhc2hfc3VwZXIgPSBmYWxzZTsKKworICAgIE9OX0NBTEwoZmIsIEdldFZhcigic3VwZXItcGFydGl0aW9uLW5hbWUiLCBfLCBfKSkKKyAgICAgICAgICAgIC5XaWxsQnlEZWZhdWx0KHRlc3Rpbmc6OlJldHVybihmYXN0Ym9vdDo6QkFEX0FSRykpOworCisgICAgRmxhc2hBbGxUb29sIHRvb2woZnAuZ2V0KCkpOworCisgICAgZnAtPnNob3VsZF91c2VfZmFzdGJvb3RfaW5mbyA9IGZhbHNlOworICAgIGF1dG8gaGFyZGNvZGVkX3Rhc2tzID0gdG9vbC5Db2xsZWN0VGFza3MoKTsKKyAgICBmcC0+c2hvdWxkX3VzZV9mYXN0Ym9vdF9pbmZvID0gdHJ1ZTsKKyAgICBhdXRvIGZhc3Rib290X2luZm9fdGFza3MgPSB0b29sLkNvbGxlY3RUYXNrcygpOworCisgICAgYXV0byBpc19ub25fZmxhc2hfdGFzayA9IFtdKGNvbnN0IGF1dG8mIHRhc2spIC0+IGJvb2wgeworICAgICAgICByZXR1cm4gdGFzay0+QXNGbGFzaFRhc2soKSA9PSBudWxscHRyOworICAgIH07CisKKyAgICAvLyByZW1vdmUgbm9uIGZsYXNoIHRhc2tzIGZvciB0ZXN0aW5nIHB1cnBvc2VzCisgICAgaGFyZGNvZGVkX3Rhc2tzLmVyYXNlKAorICAgICAgICAgICAgc3RkOjpyZW1vdmVfaWYoaGFyZGNvZGVkX3Rhc2tzLmJlZ2luKCksIGhhcmRjb2RlZF90YXNrcy5lbmQoKSwgaXNfbm9uX2ZsYXNoX3Rhc2spLAorICAgICAgICAgICAgaGFyZGNvZGVkX3Rhc2tzLmVuZCgpKTsKKyAgICBmYXN0Ym9vdF9pbmZvX3Rhc2tzLmVyYXNlKHN0ZDo6cmVtb3ZlX2lmKGZhc3Rib290X2luZm9fdGFza3MuYmVnaW4oKSwgZmFzdGJvb3RfaW5mb190YXNrcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX25vbl9mbGFzaF90YXNrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhc3Rib290X2luZm9fdGFza3MuZW5kKCkpOworCisgICAgaWYgKCFjb21wYXJlVGFza0xpc3QoZmFzdGJvb3RfaW5mb190YXNrcywgaGFyZGNvZGVkX3Rhc2tzKSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlxuXG4tLS1IYXJkY29kZWQgVGFzayBMaXN0LS0tXG4iCisgICAgICAgICAgICAgICAgICA8PCB0YXNrc1RvU3RyaW5nKGhhcmRjb2RlZF90YXNrcykgPDwgIlxuLS0tRmFzdGJvb3QtSW5mbyBUYXNrIExpc3QtLS1cbiIKKyAgICAgICAgICAgICAgICAgIDw8IHRhc2tzVG9TdHJpbmcoZmFzdGJvb3RfaW5mb190YXNrcyk7CisgICAgfQorCisgICAgQVNTRVJUX1RSVUUoY29tcGFyZVRhc2tMaXN0KGZhc3Rib290X2luZm9fdGFza3MsIGhhcmRjb2RlZF90YXNrcykpOworCisgICAgQVNTRVJUX1RSVUUoZmFzdGJvb3RfaW5mb190YXNrcy5zaXplKCkgPj0gaGFyZGNvZGVkX3Rhc2tzLnNpemUoKSkKKyAgICAgICAgICAgIDw8ICJzaXplIG9mIGZhc3Rib290LWluZm8gdGFzayBsaXN0OiAiIDw8IGZhc3Rib290X2luZm9fdGFza3Muc2l6ZSgpCisgICAgICAgICAgICA8PCAiIHNpemUgb2YgaGFyZGNvZGVkIHRhc2sgbGlzdDogIiA8PCBoYXJkY29kZWRfdGFza3Muc2l6ZSgpOworfQorVEVTVF9GKFBhcnNlVGVzdCwgSXNEeW5hbWljUGFydGl0aW9udGVzdCkgeworICAgIGlmICghZ2V0X2FuZHJvaWRfcHJvZHVjdF9vdXQoKSkgeworICAgICAgICBHVEVTVF9TS0lQKCk7CisgICAgfQorCisgICAgZnAtPnNvdXJjZS5yZXNldChuZXcgTG9jYWxJbWFnZVNvdXJjZSk7CisKKyAgICBmYXN0Ym9vdDo6TW9ja0Zhc3Rib290RHJpdmVyIGZiOworICAgIGZwLT5mYiA9ICZmYjsKKyAgICBmcC0+c2hvdWxkX29wdGltaXplX2ZsYXNoX3N1cGVyID0gdHJ1ZTsKKyAgICBmcC0+c2hvdWxkX3VzZV9mYXN0Ym9vdF9pbmZvID0gdHJ1ZTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgYm9vbD4+IHRlc3RfY2FzZXMgPSB7CisgICAgICAgICAgICB7ImZsYXNoIGJvb3QiLCBmYWxzZX0sCisgICAgICAgICAgICB7ImZsYXNoIGluaXRfYm9vdCIsIGZhbHNlfSwKKyAgICAgICAgICAgIHsiZmxhc2ggLS1hcHBseS12Ym1ldGEgdmJtZXRhIiwgZmFsc2V9LAorICAgICAgICAgICAgeyJmbGFzaCBwcm9kdWN0IiwgdHJ1ZX0sCisgICAgICAgICAgICB7ImZsYXNoIHN5c3RlbSIsIHRydWV9LAorICAgICAgICAgICAgeyJmbGFzaCAtLXNsb3Qtb3RoZXIgc3lzdGVtIHN5c3RlbV9vdGhlci5pbWciLCB0cnVlfSwKKyAgICB9OworICAgIGZvciAoYXV0byYgdGVzdCA6IHRlc3RfY2FzZXMpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFRhc2s+IHRhc2sgPQorICAgICAgICAgICAgICAgIFBhcnNlRmFzdGJvb3RJbmZvTGluZShmcC5nZXQoKSwgYW5kcm9pZDo6YmFzZTo6VG9rZW5pemUodGVzdC5maXJzdCwgIiAiKSk7CisgICAgICAgIGF1dG8gZmxhc2hfdGFzayA9IHRhc2stPkFzRmxhc2hUYXNrKCk7CisgICAgICAgIEFTU0VSVF9GQUxTRShmbGFzaF90YXNrID09IG51bGxwdHIpOworICAgICAgICBBU1NFUlRfRVEoRmxhc2hUYXNrOjpJc0R5bmFtaWNQYXJ0aXRpb24oZnAtPnNvdXJjZS5nZXQoKSwgZmxhc2hfdGFzayksIHRlc3Quc2Vjb25kKTsKKyAgICB9Cit9CisKK1RFU1RfRihQYXJzZVRlc3QsIENhbk9wdGltaXplVGVzdCkgeworICAgIGlmICghZ2V0X2FuZHJvaWRfcHJvZHVjdF9vdXQoKSkgeworICAgICAgICBHVEVTVF9TS0lQKCk7CisgICAgfQorCisgICAgZnAtPnNvdXJjZS5yZXNldChuZXcgTG9jYWxJbWFnZVNvdXJjZSk7CisgICAgZnAtPnNwYXJzZV9saW1pdCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCgpOworCisgICAgZmFzdGJvb3Q6Ok1vY2tGYXN0Ym9vdERyaXZlciBmYjsKKyAgICBmcC0+ZmIgPSAmZmI7CisgICAgZnAtPnNob3VsZF9vcHRpbWl6ZV9mbGFzaF9zdXBlciA9IGZhbHNlOworICAgIGZwLT5zaG91bGRfdXNlX2Zhc3Rib290X2luZm8gPSB0cnVlOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiwgYm9vbD4+IHBhdHRlcm5tYXRjaHRlc3QgPSB7CisgICAgICAgICAgICB7eyJmbGFzaCBib290IiwgImZsYXNoIGluaXRfYm9vdCIsICJmbGFzaCB2ZW5kb3JfYm9vdCIsICJyZWJvb3QgZmFzdGJvb3QiLAorICAgICAgICAgICAgICAidXBkYXRlLXN1cGVyIiwgImZsYXNoIHByb2R1Y3QiLCAiZmxhc2ggc3lzdGVtIiwgImZsYXNoIHN5c3RlbV9leHQiLCAiZmxhc2ggb2RtIiwKKyAgICAgICAgICAgICAgImlmLXdpcGUgZXJhc2UgdXNlcmRhdGEifSwKKyAgICAgICAgICAgICB0cnVlfSwKKyAgICAgICAgICAgIHt7ImZsYXNoIGJvb3QiLCAiZmxhc2ggaW5pdF9ib290IiwgImZsYXNoIHZlbmRvcl9ib290IiwgInJlYm9vdCBmYXN0Ym9vdCIsCisgICAgICAgICAgICAgICJ1cGRhdGUtc3VwZXIiLCAiZmxhc2ggcHJvZHVjdCIsICJmbGFzaCBzeXN0ZW0iLCAiZmxhc2ggc3lzdGVtX2V4dCIsICJmbGFzaCBvZG0iLAorICAgICAgICAgICAgICAiaWYtd2lwZSBlcmFzZSB1c2VyZGF0YSJ9LAorICAgICAgICAgICAgIHRydWV9LAorICAgICAgICAgICAge3siZmxhc2ggYm9vdCIsICJmbGFzaCBpbml0X2Jvb3QiLCAiZmxhc2ggdmVuZG9yX2Jvb3QiLCAicmVib290IGZhc3Rib290IiwKKyAgICAgICAgICAgICAgImZsYXNoIHByb2R1Y3QiLCAiZmxhc2ggc3lzdGVtIiwgImZsYXNoIHN5c3RlbV9leHQiLCAiZmxhc2ggb2RtIiwKKyAgICAgICAgICAgICAgImlmLXdpcGUgZXJhc2UgdXNlcmRhdGEifSwKKyAgICAgICAgICAgICBmYWxzZX0sCisgICAgICAgICAgICB7eyJmbGFzaCBib290IiwgImZsYXNoIGluaXRfYm9vdCIsICJmbGFzaCB2ZW5kb3JfYm9vdCIsICJ1cGRhdGUtc3VwZXIiLCAiZmxhc2ggcHJvZHVjdCIsCisgICAgICAgICAgICAgICJmbGFzaCBzeXN0ZW0iLCAiZmxhc2ggc3lzdGVtX2V4dCIsICJmbGFzaCBvZG0iLCAiaWYtd2lwZSBlcmFzZSB1c2VyZGF0YSJ9LAorICAgICAgICAgICAgIGZhbHNlfSwKKyAgICB9OworCisgICAgYXV0byByZW1vdmVfaWZfY2FsbGJhY2sgPSBbJl0oY29uc3QgYXV0byYgdGFzaykgLT4gYm9vbCB7IHJldHVybiAhIXRhc2stPkFzUmVzaXplVGFzaygpOyB9OworCisgICAgZm9yIChhdXRvJiB0ZXN0IDogcGF0dGVybm1hdGNodGVzdCkgeworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VGFzaz4+IHRhc2tzID0gUGFyc2VGYXN0Ym9vdEluZm8oZnAuZ2V0KCksIHRlc3QuZmlyc3QpOworICAgICAgICB0YXNrcy5lcmFzZShzdGQ6OnJlbW92ZV9pZih0YXNrcy5iZWdpbigpLCB0YXNrcy5lbmQoKSwgcmVtb3ZlX2lmX2NhbGxiYWNrKSwgdGFza3MuZW5kKCkpOworICAgICAgICBBU1NFUlRfRVEoT3B0aW1pemVkRmxhc2hTdXBlclRhc2s6OkNhbk9wdGltaXplKGZwLT5zb3VyY2UuZ2V0KCksIHRhc2tzKSwgdGVzdC5zZWNvbmQpOworICAgIH0KK30KKworLy8gTm90ZTogdGhpcyB0ZXN0IGlzIGV4Y2x1c2l2ZWx5IHRlc3RpbmcgdGhhdCBvcHRpbWl6ZWQgZmxhc2ggc3VwZXIgcGF0dGVybiBtYXRjaGVzIGEgZ2l2ZW4gdGFzaworLy8gbGlzdCBhbmQgaXMgYWJsZSB0byBvcHRpbWl6ZWQgYmFzZWQgb24gYSBjb3JyZWN0IHNlcXVlbmNlIG9mIHRhc2tzCitURVNUX0YoUGFyc2VUZXN0LCBPcHRpbWl6ZWRGbGFzaFN1cGVyUGF0dGVybk1hdGNoVGVzdCkgeworICAgIGlmICghZ2V0X2FuZHJvaWRfcHJvZHVjdF9vdXQoKSkgeworICAgICAgICBHVEVTVF9TS0lQKCk7CisgICAgfQorCisgICAgZnAtPnNvdXJjZS5yZXNldChuZXcgTG9jYWxJbWFnZVNvdXJjZSk7CisgICAgZnAtPnNwYXJzZV9saW1pdCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCgpOworCisgICAgZmFzdGJvb3Q6Ok1vY2tGYXN0Ym9vdERyaXZlciBmYjsKKyAgICBmcC0+ZmIgPSAmZmI7CisgICAgZnAtPnNob3VsZF9vcHRpbWl6ZV9mbGFzaF9zdXBlciA9IHRydWU7CisgICAgZnAtPnNob3VsZF91c2VfZmFzdGJvb3RfaW5mbyA9IHRydWU7CisKKyAgICBPTl9DQUxMKGZiLCBHZXRWYXIoInN1cGVyLXBhcnRpdGlvbi1uYW1lIiwgXywgXykpCisgICAgICAgICAgICAuV2lsbEJ5RGVmYXVsdCh0ZXN0aW5nOjpSZXR1cm4oZmFzdGJvb3Q6OkJBRF9BUkcpKTsKKworICAgIE9OX0NBTEwoZmIsIEdldFZhcigic2xvdC1jb3VudCIsIF8sIF8pKQorICAgICAgICAgICAgLldpbGxCeURlZmF1bHQodGVzdGluZzo6RG9BbGwodGVzdGluZzo6U2V0QXJnUG9pbnRlZTwxPigiMiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGluZzo6UmV0dXJuKGZhc3Rib290OjpTVUNDRVNTKSkpOworCisgICAgT05fQ0FMTChmYiwgR2V0VmFyKCJwYXJ0aXRpb24tc2l6ZTpzdXBlciIsIF8sIF8pKQorICAgICAgICAgICAgLldpbGxCeURlZmF1bHQodGVzdGluZzo6RG9BbGwodGVzdGluZzo6U2V0QXJnUG9pbnRlZTwxPigiMTAwMCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGluZzo6UmV0dXJuKGZhc3Rib290OjpTVUNDRVNTKSkpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiwgYm9vbD4+IHBhdHRlcm5tYXRjaHRlc3QgPSB7CisgICAgICAgICAgICB7eyJmbGFzaCBib290IiwgImZsYXNoIGluaXRfYm9vdCIsICJmbGFzaCB2ZW5kb3JfYm9vdCIsICJyZWJvb3QgZmFzdGJvb3QiLAorICAgICAgICAgICAgICAidXBkYXRlLXN1cGVyIiwgImZsYXNoIHByb2R1Y3QiLCAiZmxhc2ggc3lzdGVtIiwgImZsYXNoIHN5c3RlbV9leHQiLCAiZmxhc2ggb2RtIiwKKyAgICAgICAgICAgICAgImlmLXdpcGUgZXJhc2UgdXNlcmRhdGEifSwKKyAgICAgICAgICAgICB0cnVlfSwKKyAgICAgICAgICAgIHt7ImZsYXNoIGJvb3QiLCAiZmxhc2ggaW5pdF9ib290IiwgImZsYXNoIHZlbmRvcl9ib290IiwgInJlYm9vdCBmYXN0Ym9vdCIsCisgICAgICAgICAgICAgICJ1cGRhdGUtc3VwZXIiLCAiZmxhc2ggcHJvZHVjdCIsICJmbGFzaCBzeXN0ZW0iLCAiZmxhc2ggc3lzdGVtX2V4dCIsICJmbGFzaCBvZG0iLAorICAgICAgICAgICAgICAiaWYtd2lwZSBlcmFzZSB1c2VyZGF0YSJ9LAorICAgICAgICAgICAgIHRydWV9LAorICAgICAgICAgICAge3siZmxhc2ggYm9vdCIsICJmbGFzaCBpbml0X2Jvb3QiLCAiZmxhc2ggdmVuZG9yX2Jvb3QiLCAicmVib290IGZhc3Rib290IiwKKyAgICAgICAgICAgICAgImZsYXNoIHByb2R1Y3QiLCAiZmxhc2ggc3lzdGVtIiwgImZsYXNoIHN5c3RlbV9leHQiLCAiZmxhc2ggb2RtIiwKKyAgICAgICAgICAgICAgImlmLXdpcGUgZXJhc2UgdXNlcmRhdGEifSwKKyAgICAgICAgICAgICBmYWxzZX0sCisgICAgICAgICAgICB7eyJmbGFzaCBib290IiwgImZsYXNoIGluaXRfYm9vdCIsICJmbGFzaCB2ZW5kb3JfYm9vdCIsICJ1cGRhdGUtc3VwZXIiLCAiZmxhc2ggcHJvZHVjdCIsCisgICAgICAgICAgICAgICJmbGFzaCBzeXN0ZW0iLCAiZmxhc2ggc3lzdGVtX2V4dCIsICJmbGFzaCBvZG0iLCAiaWYtd2lwZSBlcmFzZSB1c2VyZGF0YSJ9LAorICAgICAgICAgICAgIGZhbHNlfSwKKyAgICB9OworCisgICAgZm9yIChhdXRvJiB0ZXN0IDogcGF0dGVybm1hdGNodGVzdCkgeworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VGFzaz4+IHRhc2tzID0gUGFyc2VGYXN0Ym9vdEluZm8oZnAuZ2V0KCksIHRlc3QuZmlyc3QpOworICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgd2UgaGF2ZSBhbiBvcHRpbWl6ZWQgZmxhc2ggc3VwZXIgdGFzayAmJiBubyBtb3JlIGR5bmFtaWMgcGFydGl0aW9uCisgICAgICAgIC8vIGZsYXNoaW5nIHRhc2tzCisgICAgICAgIGF1dG8mJiBJc09wdGltaXplZCA9IFtdKGNvbnN0IEZsYXNoaW5nUGxhbiogZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxUYXNrPj4mIHRhc2tzKSB7CisgICAgICAgICAgICBib29sIGNvbnRhaW5zX29wdGltaXplZF90YXNrID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGF1dG8mIHRhc2sgOiB0YXNrcykgeworICAgICAgICAgICAgICAgIGlmICh0YXNrLT5Bc09wdGltaXplZEZsYXNoU3VwZXJUYXNrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGFpbnNfb3B0aW1pemVkX3Rhc2sgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYXV0byBmbGFzaF90YXNrID0gdGFzay0+QXNGbGFzaFRhc2soKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoRmxhc2hUYXNrOjpJc0R5bmFtaWNQYXJ0aXRpb24oZnAtPnNvdXJjZS5nZXQoKSwgZmxhc2hfdGFzaykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjb250YWluc19vcHRpbWl6ZWRfdGFzazsKKyAgICAgICAgfTsKKyAgICAgICAgQVNTRVJUX0VRKElzT3B0aW1pemVkKGZwLmdldCgpLCB0YXNrcyksIHRlc3Quc2Vjb25kKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mYXN0Ym9vdC90ZXN0X2Zhc3Rib290LnB5IGIvZmFzdGJvb3QvdGVzdF9mYXN0Ym9vdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGNhZWM3Ci0tLSAvZGV2L251bGwKKysrIGIvZmFzdGJvb3QvdGVzdF9mYXN0Ym9vdC5weQpAQCAtMCwwICsxLDUzIEBACisjIS91c3IvYmluL2VudiBweXRob24zCisjCisjIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIiIiVGVzdHMgZm9yIHRoZSBmYXN0Ym9vdCBjb21tYW5kIGxpbmUgdXRpbGl0eS4KKyIiIgorCitpbXBvcnQgcmUKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyBEZXZpY2VzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgZm9yIGBmYXN0Ym9vdCBkZXZpY2VzYC4iIiIKKworCisgICAgZGVmIHRlc3RfZGV2aWNlcyhzZWxmKToKKyAgICAgICAgIiIiRW5zdXJlIHRoYXQgdGhlIGZvcm1hdCBvZiBgZmFzdGJvb3QgZGV2aWNlc2AgZG9lcyBub3QgY2hhbmdlLgorCisgICAgICAgIGBmYXN0Ym9vdCBkZXZpY2VzYCBzaG91bGQgYWx0ZXJuYXRlIGJldHdlZW4gYSBsaW5lIGNvbnRhaW5pbmcgdGhlCisgICAgICAgIGRldmljZSdzIHNlcmlhbCBudW1iZXIgYW5kIGZhc3Rib290IHN0YXRlIGFuZCBhbiBlbXB0eSBsaW5lCisgICAgICAgICIiIgorICAgICAgICBvdXRwdXQgPSBzdWJwcm9jZXNzLmNoZWNrX291dHB1dChbImZhc3Rib290IiwgImRldmljZXMiXSkKKworICAgICAgICBwcmV2aW91c19saW5lX3dhc19lbXB0eSA9IFRydWUKKyAgICAgICAgZm9yIGxpbmUgaW4gb3V0cHV0LmRlY29kZSgpLnNwbGl0bGluZXMoKToKKyAgICAgICAgICAgIGlmIHByZXZpb3VzX2xpbmVfd2FzX2VtcHR5OgorICAgICAgICAgICAgICAgIGlmIG5vdCByZS5tYXRjaChyIlthLXpBLVpcZF0rXHMrKGJvb3Rsb2FkZXJ8ZmFzdGJvb3RkKSIsIGxpbmUpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIiVzIGRvZXMgbm90IG1hdGNoIHRoZSBleHBlY3RlZCBmb3JtYXQgPHNlcmlhbCBubz5cXHMrKGJvb3Rsb2FkZXJ8ZmFzdGJvb3RkKSIgJSBsaW5lKQorICAgICAgICAgICAgICAgIHByZXZpb3VzX2xpbmVfd2FzX2VtcHR5ID0gRmFsc2UKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgbGluZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJFeHBlY3RlZCBhbiBlbXB0eSBsaW5lLiBSZWNlaXZlZCAnJXMnIiAlIGxpbmUpCisgICAgICAgICAgICAgICAgcHJldmlvdXNfbGluZV93YXNfZW1wdHkgPSBUcnVlCisKKyAgICAgICAgaWYgbGVuKG91dHB1dCkgPT0gMDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiT3V0cHV0IGlzIGVtcHR5LiBBcmUgYW55IGRldmljZXMgY29ubmVjdGVkPyIpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2Zhc3Rib290L3Rlc3RkYXRhL0FuZHJvaWQuYnAgYi9mYXN0Ym9vdC90ZXN0ZGF0YS9BbmRyb2lkLmJwCmluZGV4IGE0OTBmZTIuLjQ3YmYwOTUgMTAwNjQ0Ci0tLSBhL2Zhc3Rib290L3Rlc3RkYXRhL0FuZHJvaWQuYnAKKysrIGIvZmFzdGJvb3QvdGVzdGRhdGEvQW5kcm9pZC5icApAQCAtNDAsNiArNDAsMTQgQEAKICAgICBjbWQ6ICIkKGxvY2F0aW9uIGZhc3Rib290X2dlbl9yYW5kKSAtLXNlZWQgZHRiIC0tbGVuZ3RoIDEwMjQgPiAkKG91dCkiLAogfQogCisvLyBGYWtlIGR0YiBpbWFnZSBmb3IgcmVwbGFjZW1lbnQuCitnZW5ydWxlIHsKKyAgICBuYW1lOiAiZmFzdGJvb3RfdGVzdF9kdGJfcmVwbGFjZSIsCisgICAgZGVmYXVsdHM6IFsiZmFzdGJvb3RfdGVzdF9kYXRhX2dlbl9kZWZhdWx0cyJdLAorICAgIG91dDogWyJkdGJfcmVwbGFjZS5pbWciXSwKKyAgICBjbWQ6ICIkKGxvY2F0aW9uIGZhc3Rib290X2dlbl9yYW5kKSAtLXNlZWQgZHRiIC0tbGVuZ3RoIDIwNDggPiAkKG91dCkiLAorfQorCiAvLyBGYWtlIGJvb3Rjb25maWcgaW1hZ2UuCiBnZW5ydWxlIHsKICAgICBuYW1lOiAiZmFzdGJvb3RfdGVzdF9ib290Y29uZmlnIiwKZGlmZiAtLWdpdCBhL2Zhc3Rib290L3VzYi5oIGIvZmFzdGJvb3QvdXNiLmgKaW5kZXggNjk1ODFhYi4uZDg1Y2I4MSAxMDA2NDQKLS0tIGEvZmFzdGJvb3QvdXNiLmgKKysrIGIvZmFzdGJvb3QvdXNiLmgKQEAgLTI5LDYgKzI5LDcgQEAKICNwcmFnbWEgb25jZQogCiAjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKICNpbmNsdWRlICJ0cmFuc3BvcnQuaCIKIApAQCAtNjYsNCArNjcsNCBAQAogdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPGludCh1c2JfaWZjX2luZm8qKT4gaWZjX21hdGNoX2Z1bmM7CiAKIC8vIDAgaXMgbm9uIGJsb2NraW5nCi1Vc2JUcmFuc3BvcnQqIHVzYl9vcGVuKGlmY19tYXRjaF9mdW5jIGNhbGxiYWNrLCB1aW50MzJfdCB0aW1lb3V0X21zID0gMCk7CitzdGQ6OnVuaXF1ZV9wdHI8VXNiVHJhbnNwb3J0PiB1c2Jfb3BlbihpZmNfbWF0Y2hfZnVuYyBjYWxsYmFjaywgdWludDMyX3QgdGltZW91dF9tcyA9IDApOwpkaWZmIC0tZ2l0IGEvZmFzdGJvb3QvdXNiX2xpbnV4LmNwcCBiL2Zhc3Rib290L3VzYl9saW51eC5jcHAKaW5kZXggOTY0NDg4Yy4uMDNhZjhmNyAxMDA2NDQKLS0tIGEvZmFzdGJvb3QvdXNiX2xpbnV4LmNwcAorKysgYi9mYXN0Ym9vdC91c2JfbGludXguY3BwCkBAIC04Myw3ICs4MywxOCBAQAogLy8gYmUgcmVsaWFibGUuCiAvLyAyNTZLaUIgc2VlbXMgdG8gd29yaywgYnV0IDFNaUIgYnVsayB0cmFuc2ZlcnMgbG9jayB1cCBteSB6NjIwIHdpdGggYSAzLjEzCiAvLyBrZXJuZWwuCi0jZGVmaW5lIE1BWF9VU0JGU19CVUxLX1NJWkUgKDE2ICogMTAyNCkKKy8vIDEyOEtpQiB3YXMgZXhwZXJpbWVudGFsbHkgZm91bmQgdG8gYmUgZW5vdWdoIHRvIHNhdHVyYXRlIHRoZSBidXMgYXQKKy8vIFN1cGVyU3BlZWQrLCBzbyB3ZSBmaXJzdCB0cnkgZG91YmxlIHRoYXQgZm9yIHdyaXRlcy4gSWYgdGhlIG9wZXJhdGlvbiBmYWlscworLy8gZHVlIHRvIGEgbGFjayBvZiBjb250aWd1b3VzIHJlZ2lvbnMgKG9yIGFuIGFuY2llbnQga2VybmVsKSwgdHJ5IHNtYWxsZXIgc2l6ZXMKKy8vIHVudGlsIHdlIGZpbmQgb25lIHRoYXQgd29ya3MgKHNlZSBMaW51eFVzYlRyYW5zcG9ydDo6V3JpdGUpLiBSZWFkcyBhcmUgbGVzcworLy8gcGVyZm9ybWFuY2UgY3JpdGljYWwgc28gZm9yIG5vdyBqdXN0IHVzZSBhIGtub3duIGdvb2Qgc2l6ZS4KKyNkZWZpbmUgTUFYX1VTQkZTX0JVTEtfV1JJVEVfU0laRSAoMjU2ICogMTAyNCkKKyNkZWZpbmUgTUFYX1VTQkZTX0JVTEtfUkVBRF9TSVpFICgxNiAqIDEwMjQpCisKKy8vIFRoaXMgc2l6ZSBzaG91bGQgcHJldHR5IG11Y2ggYWx3YXlzIHdvcmsgKGl0J3MgY29tcGF0aWJsZSB3aXRoIHByZS0zLjMKKy8vIGtlcm5lbHMgYW5kIGl0J3Mgd2hhdCB3ZSB1c2VkIHRvIHVzZSBoaXN0b3JpY2FsbHkpLCBzbyBpZiBpdCBkb2Vzbid0IHdvcmsKKy8vIHNvbWV0aGluZyBoYXMgZ29uZSBiYWRseSB3cm9uZy4KKyNkZWZpbmUgTUlOX1VTQkZTX0JVTEtfV1JJVEVfU0laRSAoMTYgKiAxMDI0KQogCiBzdHJ1Y3QgdXNiX2hhbmRsZQogewpAQCAtMTA4LDYgKzExOSw3IEBACiAgIHByaXZhdGU6CiAgICAgc3RkOjp1bmlxdWVfcHRyPHVzYl9oYW5kbGU+IGhhbmRsZV87CiAgICAgY29uc3QgdWludDMyX3QgbXNfdGltZW91dF87CisgICAgc2l6ZV90IG1heF91c2Jmc19idWxrX3dyaXRlX3NpemVfID0gTUFYX1VTQkZTX0JVTEtfV1JJVEVfU0laRTsKIAogICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihMaW51eFVzYlRyYW5zcG9ydCk7CiB9OwpAQCAtMjY5LDYgKzI4MSw5IEBACiAgICAgICAgIGF1dG8gcGF0aCA9IGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigiL3N5cy9idXMvdXNiL2RldmljZXMvJXMvJXM6MS4lZC9pbnRlcmZhY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzZnNfbmFtZSwgc3lzZnNfbmFtZSwgaWZjLT5iSW50ZXJmYWNlTnVtYmVyKTsKICAgICAgICAgaWYgKGFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmcocGF0aCwgJmludGVyZmFjZSkpIHsKKyAgICAgICAgICAgIGlmICghaW50ZXJmYWNlLmVtcHR5KCkgJiYgaW50ZXJmYWNlLmJhY2soKSA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgaW50ZXJmYWNlLnBvcF9iYWNrKCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBzbnByaW50ZihpbmZvLmludGVyZmFjZSwgc2l6ZW9mKGluZm8uaW50ZXJmYWNlKSwgIiVzIiwgaW50ZXJmYWNlLmNfc3RyKCkpOwogICAgICAgICB9CiAKQEAgLTQwNCwzNCArNDE5LDkwIEBACiB7CiAgICAgdW5zaWduZWQgY2hhciAqZGF0YSA9ICh1bnNpZ25lZCBjaGFyKikgX2RhdGE7CiAgICAgdW5zaWduZWQgY291bnQgPSAwOwotICAgIHN0cnVjdCB1c2JkZXZmc19idWxrdHJhbnNmZXIgYnVsazsKLSAgICBpbnQgbjsKKyAgICBzdHJ1Y3QgdXNiZGV2ZnNfdXJiIHVyYlsyXSA9IHt9OworICAgIGJvb2wgcGVuZGluZ1syXSA9IHt9OwogCiAgICAgaWYgKGhhbmRsZV8tPmVwX291dCA9PSAwIHx8IGhhbmRsZV8tPmRlc2MgPT0gLTEpIHsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIGRvIHsKLSAgICAgICAgaW50IHhmZXI7Ci0gICAgICAgIHhmZXIgPSAobGVuID4gTUFYX1VTQkZTX0JVTEtfU0laRSkgPyBNQVhfVVNCRlNfQlVMS19TSVpFIDogbGVuOworICAgIGF1dG8gc3VibWl0X3VyYiA9IFsmXShzaXplX3QgaSkgeworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaW50IHhmZXIgPSAobGVuID4gbWF4X3VzYmZzX2J1bGtfd3JpdGVfc2l6ZV8pID8gbWF4X3VzYmZzX2J1bGtfd3JpdGVfc2l6ZV8gOiBsZW47CiAKLSAgICAgICAgYnVsay5lcCA9IGhhbmRsZV8tPmVwX291dDsKLSAgICAgICAgYnVsay5sZW4gPSB4ZmVyOwotICAgICAgICBidWxrLmRhdGEgPSBkYXRhOwotICAgICAgICBidWxrLnRpbWVvdXQgPSBtc190aW1lb3V0XzsKKyAgICAgICAgICAgIHVyYltpXS50eXBlID0gVVNCREVWRlNfVVJCX1RZUEVfQlVMSzsKKyAgICAgICAgICAgIHVyYltpXS5lbmRwb2ludCA9IGhhbmRsZV8tPmVwX291dDsKKyAgICAgICAgICAgIHVyYltpXS5idWZmZXJfbGVuZ3RoID0geGZlcjsKKyAgICAgICAgICAgIHVyYltpXS5idWZmZXIgPSBkYXRhOworICAgICAgICAgICAgdXJiW2ldLnVzZXJjb250ZXh0ID0gKHZvaWQgKilpOwogCi0gICAgICAgIG4gPSBpb2N0bChoYW5kbGVfLT5kZXNjLCBVU0JERVZGU19CVUxLLCAmYnVsayk7Ci0gICAgICAgIGlmKG4gIT0geGZlcikgewotICAgICAgICAgICAgREJHKCJFUlJPUjogbiA9ICVkLCBlcnJubyA9ICVkICglcylcbiIsCi0gICAgICAgICAgICAgICAgbiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICBpbnQgbiA9IGlvY3RsKGhhbmRsZV8tPmRlc2MsIFVTQkRFVkZTX1NVQk1JVFVSQiwgJnVyYltpXSk7CisgICAgICAgICAgICBpZiAobiAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGVycm5vID09IEVOT01FTSAmJiBtYXhfdXNiZnNfYnVsa193cml0ZV9zaXplXyA+IE1JTl9VU0JGU19CVUxLX1dSSVRFX1NJWkUpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4X3VzYmZzX2J1bGtfd3JpdGVfc2l6ZV8gLz0gMjsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERCRygiaW9jdGwoVVNCREVWRlNfU1VCTUlUVVJCKSBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGVuZGluZ1tpXSA9IHRydWU7CisgICAgICAgICAgICBjb3VudCArPSB4ZmVyOworICAgICAgICAgICAgbGVuIC09IHhmZXI7CisgICAgICAgICAgICBkYXRhICs9IHhmZXI7CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfTsKKworICAgIGF1dG8gcmVhcF91cmIgPSBbJl0oc2l6ZV90IGkpIHsKKyAgICAgICAgd2hpbGUgKHBlbmRpbmdbaV0pIHsKKyAgICAgICAgICAgIHN0cnVjdCB1c2JkZXZmc191cmIgKnVyYnA7CisgICAgICAgICAgICBpbnQgcmVzID0gaW9jdGwoaGFuZGxlXy0+ZGVzYywgVVNCREVWRlNfUkVBUFVSQiwgJnVyYnApOworICAgICAgICAgICAgaWYgKHJlcyAhPSAwKSB7CisgICAgICAgICAgICAgICAgREJHKCJpb2N0bChVU0JERVZGU19SRUFQVVJCKSBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNpemVfdCBkb25lID0gKHNpemVfdCl1cmJwLT51c2VyY29udGV4dDsKKyAgICAgICAgICAgIGlmIChkb25lID49IDIgfHwgIXBlbmRpbmdbZG9uZV0pIHsKKyAgICAgICAgICAgICAgICBEQkcoInVuZXhwZWN0ZWQgdXJiXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodXJicC0+c3RhdHVzICE9IDAgfHwgdXJicC0+YWN0dWFsX2xlbmd0aCAhPSB1cmJwLT5idWZmZXJfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgREJHKCJ1cmIgcmV0dXJuZWQgZXJyb3JcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBlbmRpbmdbZG9uZV0gPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9OworCisgICAgaWYgKCFzdWJtaXRfdXJiKDApKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICAgICAgaWYgKCFzdWJtaXRfdXJiKDEpKSB7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KLQotICAgICAgICBjb3VudCArPSB4ZmVyOwotICAgICAgICBsZW4gLT0geGZlcjsKLSAgICAgICAgZGF0YSArPSB4ZmVyOwotICAgIH0gd2hpbGUobGVuID4gMCk7Ci0KKyAgICAgICAgaWYgKCFyZWFwX3VyYigwKSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChsZW4gPD0gMCkgeworICAgICAgICAgICAgaWYgKCFyZWFwX3VyYigxKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjb3VudDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXN1Ym1pdF91cmIoMCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXJlYXBfdXJiKDEpKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFyZWFwX3VyYigwKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogICAgIHJldHVybiBjb3VudDsKIH0KIApAQCAtNDQ3LDcgKzUxOCw3IEBACiAgICAgfQogCiAgICAgd2hpbGUgKGxlbiA+IDApIHsKLSAgICAgICAgaW50IHhmZXIgPSAobGVuID4gTUFYX1VTQkZTX0JVTEtfU0laRSkgPyBNQVhfVVNCRlNfQlVMS19TSVpFIDogbGVuOworICAgICAgICBpbnQgeGZlciA9IChsZW4gPiBNQVhfVVNCRlNfQlVMS19SRUFEX1NJWkUpID8gTUFYX1VTQkZTX0JVTEtfUkVBRF9TSVpFIDogbGVuOwogCiAgICAgICAgIGJ1bGsuZXAgPSBoYW5kbGVfLT5lcF9pbjsKICAgICAgICAgYnVsay5sZW4gPSB4ZmVyOwpAQCAtNTAzLDkgKzU3NCwxNSBAQAogICAgIHJldHVybiAwOwogfQogCi1Vc2JUcmFuc3BvcnQqIHVzYl9vcGVuKGlmY19tYXRjaF9mdW5jIGNhbGxiYWNrLCB1aW50MzJfdCB0aW1lb3V0X21zKSB7CitzdGQ6OnVuaXF1ZV9wdHI8VXNiVHJhbnNwb3J0PiB1c2Jfb3BlbihpZmNfbWF0Y2hfZnVuYyBjYWxsYmFjaywgdWludDMyX3QgdGltZW91dF9tcykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxVc2JUcmFuc3BvcnQ+IHJlc3VsdDsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8dXNiX2hhbmRsZT4gaGFuZGxlID0gZmluZF91c2JfZGV2aWNlKCIvc3lzL2J1cy91c2IvZGV2aWNlcyIsIGNhbGxiYWNrKTsKLSAgICByZXR1cm4gaGFuZGxlID8gbmV3IExpbnV4VXNiVHJhbnNwb3J0KHN0ZDo6bW92ZShoYW5kbGUpLCB0aW1lb3V0X21zKSA6IG51bGxwdHI7CisKKyAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgIHJlc3VsdCA9IHN0ZDo6bWFrZV91bmlxdWU8TGludXhVc2JUcmFuc3BvcnQ+KHN0ZDo6bW92ZShoYW5kbGUpLCB0aW1lb3V0X21zKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBXYWl0IGZvciB0aGUgc3lzdGVtIHRvIG5vdGljZSB0aGUgZGV2aWNlIGlzIGdvbmUsIHNvIHRoYXQgYSBzdWJzZXF1ZW50CmRpZmYgLS1naXQgYS9mYXN0Ym9vdC91c2Jfb3N4LmNwcCBiL2Zhc3Rib290L3VzYl9vc3guY3BwCmluZGV4IDViOWU1YzguLjI4MzAwYjIgMTAwNjQ0Ci0tLSBhL2Zhc3Rib290L3VzYl9vc3guY3BwCisrKyBiL2Zhc3Rib290L3VzYl9vc3guY3BwCkBAIC00MzYsMTIgKzQzNiw3IEBACiAKICAgICBmb3IgKDs7KSB7CiAgICAgICAgIGlmICghIElPSXRlcmF0b3JJc1ZhbGlkKGl0ZXJhdG9yKSkgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIEFwcGxlIGRvY3VtZW50YXRpb24gYWR2aXNlcyByZXNldHRpbmcgdGhlIGl0ZXJhdG9yIGlmCi0gICAgICAgICAgICAgKiBpdCBzaG91bGQgYmVjb21lIGludmFsaWQgZHVyaW5nIGl0ZXJhdGlvbi4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgSU9JdGVyYXRvclJlc2V0KGl0ZXJhdG9yKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBpb19zZXJ2aWNlX3QgZGV2aWNlID0gSU9JdGVyYXRvck5leHQoaXRlcmF0b3IpOwpAQCAtNDc0LDE2ICs0NjksMjAgQEAKIC8qCiAgKiBEZWZpbml0aW9ucyBvZiB0aGlzIGZpbGUncyBwdWJsaWMgZnVuY3Rpb25zLgogICovCi0KLVVzYlRyYW5zcG9ydCogdXNiX29wZW4oaWZjX21hdGNoX2Z1bmMgY2FsbGJhY2ssIHVpbnQzMl90IHRpbWVvdXRfbXMpIHsKK3N0ZDo6dW5pcXVlX3B0cjxVc2JUcmFuc3BvcnQ+IHVzYl9vcGVuKGlmY19tYXRjaF9mdW5jIGNhbGxiYWNrLCB1aW50MzJfdCB0aW1lb3V0X21zKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPFVzYlRyYW5zcG9ydD4gcmVzdWx0OwogICAgIHN0ZDo6dW5pcXVlX3B0cjx1c2JfaGFuZGxlPiBoYW5kbGU7CiAKICAgICBpZiAoaW5pdF91c2IoY2FsbGJhY2ssICZoYW5kbGUpIDwgMCkgewogICAgICAgICAvKiBTb21ldGhpbmcgd2VudCB3cm9uZyBpbml0aWFsaXppbmcgVVNCLiAqLwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKLSAgICByZXR1cm4gbmV3IE9zeFVzYlRyYW5zcG9ydChzdGQ6Om1vdmUoaGFuZGxlKSwgdGltZW91dF9tcyk7CisgICAgaWYgKGhhbmRsZSkgeworICAgICAgICByZXN1bHQgPSBzdGQ6Om1ha2VfdW5pcXVlPE9zeFVzYlRyYW5zcG9ydD4oc3RkOjptb3ZlKGhhbmRsZSksIHRpbWVvdXRfbXMpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIE9zeFVzYlRyYW5zcG9ydDo6fk9zeFVzYlRyYW5zcG9ydCgpIHsKZGlmZiAtLWdpdCBhL2Zhc3Rib290L3VzYl93aW5kb3dzLmNwcCBiL2Zhc3Rib290L3VzYl93aW5kb3dzLmNwcAppbmRleCA2N2JmOGEzLi41NmE2ZTdkIDEwMDY0NAotLS0gYS9mYXN0Ym9vdC91c2Jfd2luZG93cy5jcHAKKysrIGIvZmFzdGJvb3QvdXNiX3dpbmRvd3MuY3BwCkBAIC0zODEsNyArMzgxLDEzIEBACiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIAotVXNiVHJhbnNwb3J0KiB1c2Jfb3BlbihpZmNfbWF0Y2hfZnVuYyBjYWxsYmFjaywgdWludDMyX3QpIHsKK3N0ZDo6dW5pcXVlX3B0cjxVc2JUcmFuc3BvcnQ+IHVzYl9vcGVuKGlmY19tYXRjaF9mdW5jIGNhbGxiYWNrLCB1aW50MzJfdCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxVc2JUcmFuc3BvcnQ+IHJlc3VsdDsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8dXNiX2hhbmRsZT4gaGFuZGxlID0gZmluZF91c2JfZGV2aWNlKGNhbGxiYWNrKTsKLSAgICByZXR1cm4gaGFuZGxlID8gbmV3IFdpbmRvd3NVc2JUcmFuc3BvcnQoc3RkOjptb3ZlKGhhbmRsZSkpIDogbnVsbHB0cjsKKworICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgcmVzdWx0ID0gc3RkOjptYWtlX3VuaXF1ZTxXaW5kb3dzVXNiVHJhbnNwb3J0PihzdGQ6Om1vdmUoaGFuZGxlKSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKIH0KZGlmZiAtLWdpdCBhL2Zhc3Rib290L3V0aWwuY3BwIGIvZmFzdGJvb3QvdXRpbC5jcHAKaW5kZXggZTAzMDEyYS4uNTk2NmFlYSAxMDA2NDQKLS0tIGEvZmFzdGJvb3QvdXRpbC5jcHAKKysrIGIvZmFzdGJvb3QvdXRpbC5jcHAKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dGltZS5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3BhcnNlaW50Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KQEAgLTQzLDkgKzQzLDkgQEAKIHN0YXRpYyBib29sIGdfdmVyYm9zZSA9IGZhbHNlOwogCiBkb3VibGUgbm93KCkgewotICAgIHN0cnVjdCB0aW1ldmFsIHR2OwotICAgIGdldHRpbWVvZmRheSgmdHYsIE5VTEwpOwotICAgIHJldHVybiAoZG91YmxlKXR2LnR2X3NlYyArIChkb3VibGUpdHYudHZfdXNlYyAvIDEwMDAwMDA7CisgICAgc3RydWN0IHRpbWVzcGVjIHRzOworICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHMpOworICAgIHJldHVybiAoZG91YmxlKXRzLnR2X3NlYyArIChkb3VibGUpdHMudHZfbnNlYyAvIDEwMDAwMDAwMDA7CiB9CiAKIHZvaWQgZGllKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CmRpZmYgLS1naXQgYS9mYXN0Ym9vdC92ZW5kb3JfYm9vdF9pbWdfdXRpbHMuY3BwIGIvZmFzdGJvb3QvdmVuZG9yX2Jvb3RfaW1nX3V0aWxzLmNwcAppbmRleCA5ZjA1MjUzLi5kYTU0N2YxIDEwMDY0NAotLS0gYS9mYXN0Ym9vdC92ZW5kb3JfYm9vdF9pbWdfdXRpbHMuY3BwCisrKyBiL2Zhc3Rib290L3ZlbmRvcl9ib290X2ltZ191dGlscy5jcHAKQEAgLTIwOSw3ICsyMDksOCBAQAogCiAvLyBSZXBsYWNlIHRoZSB2ZW5kb3IgcmFtZGlzayBhcyBhIHdob2xlLgogW1tub2Rpc2NhcmRdXSBSZXN1bHQ8c3RkOjpzdHJpbmc+IHJlcGxhY2VfZGVmYXVsdF92ZW5kb3JfcmFtZGlzayhjb25zdCBzdGQ6OnN0cmluZyYgdmVuZG9yX2Jvb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuZXdfcmFtZGlzaykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmV3X3JhbWRpc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuZXdfZHRiKSB7CiAgICAgaWYgKGF1dG8gcmVzID0gY2hlY2tfdmVuZG9yX2Jvb3RfaGRyKHZlbmRvcl9ib290LCAzKTsgIXJlcy5vaygpKSByZXR1cm4gcmVzLmVycm9yKCk7CiAgICAgYXV0byBoZHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHZlbmRvcl9ib290X2ltZ19oZHJfdjMqPih2ZW5kb3JfYm9vdC5kYXRhKCkpOwogICAgIGF1dG8gaGRyX3NpemUgPSBnZXRfdmVuZG9yX2Jvb3RfaGVhZGVyX3NpemUoaGRyKTsKQEAgLTI0NCw4ICsyNDUsMTkgQEAKICAgICAgICAgcmV0dXJuIHJlcy5lcnJvcigpOwogICAgIGlmIChhdXRvIHJlcyA9IHVwZGF0ZXIuQ2hlY2tPZmZzZXQobyArIHAsIG8gKyBuZXdfcCk7ICFyZXMub2soKSkgcmV0dXJuIHJlcy5lcnJvcigpOwogCi0gICAgLy8gQ29weSBEVEIgKFEgYnl0ZXMpLgotICAgIGlmIChhdXRvIHJlcyA9IHVwZGF0ZXIuQ29weShxKTsgIXJlcy5vaygpKSByZXR1cm4gcmVzLmVycm9yKCk7CisgICAgLy8gQ29weSBEVEIgKFEgYnl0ZXMpLiBSZXBsYWNlIGlmIGEgbmV3IG9uZSB3YXMgcHJvdmlkZWQuCisgICAgbmV3X2hkci0+ZHRiX3NpemUgPSAhbmV3X2R0Yi5lbXB0eSgpID8gbmV3X2R0Yi5zaXplKCkgOiBoZHItPmR0Yl9zaXplOworICAgIGNvbnN0IHVpbnQzMl90IG5ld19xID0gcm91bmRfdXAobmV3X2hkci0+ZHRiX3NpemUsIG5ld19oZHItPnBhZ2Vfc2l6ZSk7CisgICAgaWYgKG5ld19kdGIuZW1wdHkoKSkgeworICAgICAgICBpZiAoYXV0byByZXMgPSB1cGRhdGVyLkNvcHkocSk7ICFyZXMub2soKSkgcmV0dXJuIHJlcy5lcnJvcigpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChhdXRvIHJlcyA9IHVwZGF0ZXIuUmVwbGFjZShoZHItPmR0Yl9zaXplLCBuZXdfZHRiKTsgIXJlcy5vaygpKSByZXR1cm4gcmVzLmVycm9yKCk7CisgICAgICAgIGlmIChhdXRvIHJlcyA9IHVwZGF0ZXIuU2tpcChxIC0gaGRyLT5kdGJfc2l6ZSwgbmV3X3EgLSBuZXdfaGRyLT5kdGJfc2l6ZSk7ICFyZXMub2soKSkKKyAgICAgICAgICAgIHJldHVybiByZXMuZXJyb3IoKTsKKyAgICB9CisgICAgaWYgKGF1dG8gcmVzID0gdXBkYXRlci5DaGVja09mZnNldChvICsgcCArIHEsIG8gKyBuZXdfcCArIG5ld19xKTsgIXJlcy5vaygpKSB7CisgICAgICAgIHJldHVybiByZXMuZXJyb3IoKTsKKyAgICB9CiAKICAgICBpZiAobmV3X2hkci0+aGVhZGVyX3ZlcnNpb24gPj0gNCkgewogICAgICAgICBhdXRvIGhkcl92NCA9IHN0YXRpY19jYXN0PGNvbnN0IHZlbmRvcl9ib290X2ltZ19oZHJfdjQqPihoZHIpOwpAQCAtMjU2LDcgKzI2OCw3IEBACiAgICAgICAgIGF1dG8gbmV3X2hkcl92NCA9IHN0YXRpY19jYXN0PGNvbnN0IHZlbmRvcl9ib290X2ltZ19oZHJfdjQqPihuZXdfaGRyKTsKICAgICAgICAgYXV0byBuZXdfciA9IHJvdW5kX3VwKG5ld19oZHJfdjQtPnZlbmRvcl9yYW1kaXNrX3RhYmxlX3NpemUsIG5ld19oZHItPnBhZ2Vfc2l6ZSk7CiAgICAgICAgIGlmIChhdXRvIHJlcyA9IHVwZGF0ZXIuU2tpcChyLCBuZXdfcik7ICFyZXMub2soKSkgcmV0dXJuIHJlcy5lcnJvcigpOwotICAgICAgICBpZiAoYXV0byByZXMgPSB1cGRhdGVyLkNoZWNrT2Zmc2V0KG8gKyBwICsgcSArIHIsIG8gKyBuZXdfcCArIHEgKyBuZXdfcik7ICFyZXMub2soKSkKKyAgICAgICAgaWYgKGF1dG8gcmVzID0gdXBkYXRlci5DaGVja09mZnNldChvICsgcCArIHEgKyByLCBvICsgbmV3X3AgKyBuZXdfcSArIG5ld19yKTsgIXJlcy5vaygpKQogICAgICAgICAgICAgcmV0dXJuIHJlcy5lcnJvcigpOwogCiAgICAgICAgIC8vIFJlcGxhY2UgdGFibGUgd2l0aCBzaW5nbGUgZW50cnkgcmVwcmVzZW50aW5nIHRoZSBmdWxsIHJhbWRpc2suCkBAIC0zMDMsNyArMzE1LDggQEAKIC8vIHJlcGxhY2UgaXQgd2l0aCB0aGUgY29udGVudCBvZiB8bmV3X3JhbWRpc2t8LgogW1tub2Rpc2NhcmRdXSBSZXN1bHQ8c3RkOjpzdHJpbmc+IHJlcGxhY2VfdmVuZG9yX3JhbWRpc2tfZnJhZ21lbnQoY29uc3Qgc3RkOjpzdHJpbmcmIHJhbWRpc2tfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2ZW5kb3JfYm9vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuZXdfcmFtZGlzaykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5ld19yYW1kaXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5ld19kdGIpIHsKICAgICBpZiAoYXV0byByZXMgPSBjaGVja192ZW5kb3JfYm9vdF9oZHIodmVuZG9yX2Jvb3QsIDQpOyAhcmVzLm9rKCkpIHJldHVybiByZXMuZXJyb3IoKTsKICAgICBhdXRvIGhkciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdmVuZG9yX2Jvb3RfaW1nX2hkcl92NCo+KHZlbmRvcl9ib290LmRhdGEoKSk7CiAgICAgYXV0byBoZHJfc2l6ZSA9IGdldF92ZW5kb3JfYm9vdF9oZWFkZXJfc2l6ZShoZHIpOwpAQCAtMzY4LDggKzM4MSwxOSBAQAogICAgICAgICByZXR1cm4gcmVzLmVycm9yKCk7CiAgICAgaWYgKGF1dG8gcmVzID0gdXBkYXRlci5DaGVja09mZnNldChvICsgcCwgbyArIG5ld19wKTsgIXJlcy5vaygpKSByZXR1cm4gcmVzLmVycm9yKCk7CiAKLSAgICAvLyBDb3B5IERUQiAoUSBieXRlcykuCi0gICAgaWYgKGF1dG8gcmVzID0gdXBkYXRlci5Db3B5KHEpOyAhcmVzLm9rKCkpIHJldHVybiByZXMuZXJyb3IoKTsKKyAgICAvLyBDb3B5IERUQiAoUSBieXRlcykuIFJlcGxhY2UgaWYgYSBuZXcgb25lIHdhcyBwcm92aWRlZC4KKyAgICBuZXdfaGRyLT5kdGJfc2l6ZSA9ICFuZXdfZHRiLmVtcHR5KCkgPyBuZXdfZHRiLnNpemUoKSA6IGhkci0+ZHRiX3NpemU7CisgICAgY29uc3QgdWludDMyX3QgbmV3X3EgPSByb3VuZF91cChuZXdfaGRyLT5kdGJfc2l6ZSwgbmV3X2hkci0+cGFnZV9zaXplKTsKKyAgICBpZiAobmV3X2R0Yi5lbXB0eSgpKSB7CisgICAgICAgIGlmIChhdXRvIHJlcyA9IHVwZGF0ZXIuQ29weShxKTsgIXJlcy5vaygpKSByZXR1cm4gcmVzLmVycm9yKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGF1dG8gcmVzID0gdXBkYXRlci5SZXBsYWNlKGhkci0+ZHRiX3NpemUsIG5ld19kdGIpOyAhcmVzLm9rKCkpIHJldHVybiByZXMuZXJyb3IoKTsKKyAgICAgICAgaWYgKGF1dG8gcmVzID0gdXBkYXRlci5Ta2lwKHEgLSBoZHItPmR0Yl9zaXplLCBuZXdfcSAtIG5ld19oZHItPmR0Yl9zaXplKTsgIXJlcy5vaygpKQorICAgICAgICAgICAgcmV0dXJuIHJlcy5lcnJvcigpOworICAgIH0KKyAgICBpZiAoYXV0byByZXMgPSB1cGRhdGVyLkNoZWNrT2Zmc2V0KG8gKyBwICsgcSwgbyArIG5ld19wICsgbmV3X3EpOyAhcmVzLm9rKCkpIHsKKyAgICAgICAgcmV0dXJuIHJlcy5lcnJvcigpOworICAgIH0KIAogICAgIC8vIENvcHkgdGFibGUsIGJ1dCB3aXRoIGNvcnJlc3BvbmRpbmcgZW50cmllcyBtb2RpZmllZCwgaW5jbHVkaW5nOgogICAgIC8vIC0gcmFtZGlza19zaXplIG9mIHRoZSBlbnRyeSByZXBsYWNlZApAQCAtMzkyLDcgKzQxNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkci0+dmVuZG9yX3JhbWRpc2tfdGFibGVfZW50cnlfc2l6ZSk7CiAgICAgICAgICFyZXMub2soKSkKICAgICAgICAgcmV0dXJuIHJlcy5lcnJvcigpOwotICAgIGlmIChhdXRvIHJlcyA9IHVwZGF0ZXIuQ2hlY2tPZmZzZXQobyArIHAgKyBxICsgciwgbyArIG5ld19wICsgcSArIHIpOyAhcmVzLm9rKCkpCisgICAgaWYgKGF1dG8gcmVzID0gdXBkYXRlci5DaGVja09mZnNldChvICsgcCArIHEgKyByLCBvICsgbmV3X3AgKyBuZXdfcSArIHIpOyAhcmVzLm9rKCkpCiAgICAgICAgIHJldHVybiByZXMuZXJyb3IoKTsKIAogICAgIC8vIENvcHkgYm9vdGNvbmZpZyAoUyBieXRlcykuCkBAIC00MDQsMTEgKzQyOCwxMSBAQAogCiB9ICAvLyBuYW1lc3BhY2UKIAotW1tub2Rpc2NhcmRdXSBSZXN1bHQ8dm9pZD4gcmVwbGFjZV92ZW5kb3JfcmFtZGlzayhhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCB2ZW5kb3JfYm9vdF9mZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdmVuZG9yX2Jvb3Rfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHJhbWRpc2tfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgbmV3X3JhbWRpc2tfZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IG5ld19yYW1kaXNrX3NpemUpIHsKK1tbbm9kaXNjYXJkXV0gUmVzdWx0PHZvaWQ+IHJlcGxhY2VfdmVuZG9yX3JhbWRpc2soCisgICAgICAgIGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIHZlbmRvcl9ib290X2ZkLCB1aW50NjRfdCB2ZW5kb3JfYm9vdF9zaXplLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcmFtZGlza19uYW1lLCBhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBuZXdfcmFtZGlza19mZCwKKyAgICAgICAgdWludDY0X3QgbmV3X3JhbWRpc2tfc2l6ZSwgYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgbmV3X2R0Yl9mZCwgdWludDY0X3QgbmV3X2R0Yl9zaXplKSB7CisgICAgUmVzdWx0PHN0ZDo6c3RyaW5nPiBuZXdfZHRiID0geyIifTsKICAgICBpZiAobmV3X3JhbWRpc2tfc2l6ZSA+IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKSkgewogICAgICAgICByZXR1cm4gRXJyb3JmKCJOZXcgdmVuZG9yIHJhbWRpc2sgaXMgdG9vIGJpZyIpOwogICAgIH0KQEAgLTQxNywxMiArNDQxLDE3IEBACiAgICAgaWYgKCF2ZW5kb3JfYm9vdC5vaygpKSByZXR1cm4gdmVuZG9yX2Jvb3QuZXJyb3IoKTsKICAgICBhdXRvIG5ld19yYW1kaXNrID0gbG9hZF9maWxlKG5ld19yYW1kaXNrX2ZkLCBuZXdfcmFtZGlza19zaXplLCAibmV3IHZlbmRvciByYW1kaXNrIik7CiAgICAgaWYgKCFuZXdfcmFtZGlzay5vaygpKSByZXR1cm4gbmV3X3JhbWRpc2suZXJyb3IoKTsKKyAgICBpZiAobmV3X2R0Yl9zaXplID4gMCAmJiBuZXdfZHRiX2ZkID49IDApIHsKKyAgICAgICAgbmV3X2R0YiA9IGxvYWRfZmlsZShuZXdfZHRiX2ZkLCBuZXdfZHRiX3NpemUsICJuZXcgZHRiIik7CisgICAgICAgIGlmICghbmV3X2R0Yi5vaygpKSByZXR1cm4gbmV3X2R0Yi5lcnJvcigpOworICAgIH0KIAogICAgIFJlc3VsdDxzdGQ6OnN0cmluZz4gbmV3X3ZlbmRvcl9ib290OwogICAgIGlmIChyYW1kaXNrX25hbWUgPT0gImRlZmF1bHQiKSB7Ci0gICAgICAgIG5ld192ZW5kb3JfYm9vdCA9IHJlcGxhY2VfZGVmYXVsdF92ZW5kb3JfcmFtZGlzaygqdmVuZG9yX2Jvb3QsICpuZXdfcmFtZGlzayk7CisgICAgICAgIG5ld192ZW5kb3JfYm9vdCA9IHJlcGxhY2VfZGVmYXVsdF92ZW5kb3JfcmFtZGlzaygqdmVuZG9yX2Jvb3QsICpuZXdfcmFtZGlzaywgKm5ld19kdGIpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG5ld192ZW5kb3JfYm9vdCA9IHJlcGxhY2VfdmVuZG9yX3JhbWRpc2tfZnJhZ21lbnQocmFtZGlza19uYW1lLCAqdmVuZG9yX2Jvb3QsICpuZXdfcmFtZGlzayk7CisgICAgICAgIG5ld192ZW5kb3JfYm9vdCA9CisgICAgICAgICAgICAgICAgcmVwbGFjZV92ZW5kb3JfcmFtZGlza19mcmFnbWVudChyYW1kaXNrX25hbWUsICp2ZW5kb3JfYm9vdCwgKm5ld19yYW1kaXNrLCAqbmV3X2R0Yik7CiAgICAgfQogICAgIGlmICghbmV3X3ZlbmRvcl9ib290Lm9rKCkpIHJldHVybiBuZXdfdmVuZG9yX2Jvb3QuZXJyb3IoKTsKICAgICBpZiAoYXV0byByZXMgPSBzdG9yZV9maWxlKHZlbmRvcl9ib290X2ZkLCAqbmV3X3ZlbmRvcl9ib290LCAibmV3IHZlbmRvciBib290IGltYWdlIik7ICFyZXMub2soKSkKZGlmZiAtLWdpdCBhL2Zhc3Rib290L3ZlbmRvcl9ib290X2ltZ191dGlscy5oIGIvZmFzdGJvb3QvdmVuZG9yX2Jvb3RfaW1nX3V0aWxzLmgKaW5kZXggMGI3MDJiYy4uMGNhNzhkYSAxMDA2NDQKLS0tIGEvZmFzdGJvb3QvdmVuZG9yX2Jvb3RfaW1nX3V0aWxzLmgKKysrIGIvZmFzdGJvb3QvdmVuZG9yX2Jvb3RfaW1nX3V0aWxzLmgKQEAgLTMxLDQgKzMxLDQgQEAKIFtbbm9kaXNjYXJkXV0gYW5kcm9pZDo6YmFzZTo6UmVzdWx0PHZvaWQ+IHJlcGxhY2VfdmVuZG9yX3JhbWRpc2soCiAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIHZlbmRvcl9ib290X2ZkLCB1aW50NjRfdCB2ZW5kb3JfYm9vdF9zaXplLAogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcmFtZGlza19uYW1lLCBhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBuZXdfcmFtZGlza19mZCwKLSAgICAgICAgdWludDY0X3QgbmV3X3JhbWRpc2tfc2l6ZSk7CisgICAgICAgIHVpbnQ2NF90IG5ld19yYW1kaXNrX3NpemUsIGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIG5ld19kdGJfZmQsIHVpbnQ2NF90IG5ld19kdGJfc2l6ZSk7CmRpZmYgLS1naXQgYS9mYXN0Ym9vdC92ZW5kb3JfYm9vdF9pbWdfdXRpbHNfdGVzdC5jcHAgYi9mYXN0Ym9vdC92ZW5kb3JfYm9vdF9pbWdfdXRpbHNfdGVzdC5jcHAKaW5kZXggNDY3YzZlOS4uODQxZTUzMiAxMDA2NDQKLS0tIGEvZmFzdGJvb3QvdmVuZG9yX2Jvb3RfaW1nX3V0aWxzX3Rlc3QuY3BwCisrKyBiL2Zhc3Rib290L3ZlbmRvcl9ib290X2ltZ191dGlsc190ZXN0LmNwcApAQCAtMTYzLDcgKzE2Myw3IEBACiAgIHByb3RlY3RlZDoKICAgICAvLyB8cmVsX3BhdGh8IGlzIHRoZSByZWxhdGl2ZSBwYXRoIHVuZGVyIHRlc3QgZGF0YSBkaXJlY3RvcnkuCiAgICAgVGVzdEZpbGVIYW5kbGUoY29uc3Qgc3RkOjpmaWxlc3lzdGVtOjpwYXRoJiByZWxfcGF0aCkKLSAgICAgICAgOiBhYnNfcGF0aF8oc3RkOjptb3ZlKHN0ZDo6ZmlsZXN5c3RlbTo6cGF0aChHZXRFeGVjdXRhYmxlRGlyZWN0b3J5KCkpIC8gcmVsX3BhdGgpKSB7fQorICAgICAgICA6IGFic19wYXRoXyhzdGQ6OmZpbGVzeXN0ZW06OnBhdGgoR2V0RXhlY3V0YWJsZURpcmVjdG9yeSgpKSAvIHJlbF9wYXRoKSB7fQogICAgIC8vIEdpdmVuIHxyZWFkX2ZkfCwgdGhlIHJlYWRvbmx5IGZkIG9uIHRoZSB0ZXN0IGZpbGUsIHJldHVybiBhbiBmZCB0aGF0J3Mgc3VpdGFibGUgZm9yIGNsaWVudAogICAgIC8vIHRvIHVzZS4gSW1wbGVtZW50YXRpb24gaXMgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIHRoZSBsaWZldGltZSBvZiB0aGUgcmV0dXJuZWQgZmQuCiAgICAgdmlydHVhbCBhbmRyb2lkOjpiYXNlOjpSZXN1bHQ8Ym9ycm93ZWRfZmQ+IFRyYW5zZm9ybShjb25zdCBzdGQ6OmZpbGVzeXN0ZW06OnBhdGgmIGFic19wYXRoLApAQCAtMjQxLDYgKzI0MSw3IEBACiAKIHN0cnVjdCBSZXBhY2tWZW5kb3JCb290SW1nVGVzdFBhcmFtIHsKICAgICBzdGQ6OnN0cmluZyB2ZW5kb3JfYm9vdF9maWxlX25hbWU7CisgICAgc3RkOjpzdHJpbmcgZHRiX2ZpbGVfbmFtZTsKICAgICB1aW50MzJfdCBleHBlY3RlZF9oZWFkZXJfdmVyc2lvbjsKICAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFJlcGFja1ZlbmRvckJvb3RJbWdUZXN0UGFyYW0mIHBhcmFtKSB7CiAgICAgICAgIHJldHVybiBvcyA8PCBwYXJhbS52ZW5kb3JfYm9vdF9maWxlX25hbWU7CkBAIC0yNTIsMjIgKzI1Myw1MCBAQAogICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKICAgICAgICAgdmJvb3QgPSBzdGQ6Om1ha2VfdW5pcXVlPFJlYWRXcml0ZVRlc3RGaWxlSGFuZGxlPihHZXRQYXJhbSgpLnZlbmRvcl9ib290X2ZpbGVfbmFtZSk7CiAgICAgICAgIEFTU0VSVF9SRVNVTFRfT0sodmJvb3QtPk9wZW4oKSk7CisKKyAgICAgICAgaWYgKCFHZXRQYXJhbSgpLmR0Yl9maWxlX25hbWUuZW1wdHkoKSkgeworICAgICAgICAgICAgZHRiX3JlcGxhY2VtZW50ID0gc3RkOjptYWtlX3VuaXF1ZTxSZWFkT25seVRlc3RGaWxlSGFuZGxlPihHZXRQYXJhbSgpLmR0Yl9maWxlX25hbWUpOworICAgICAgICAgICAgQVNTRVJUX1JFU1VMVF9PSyhkdGJfcmVwbGFjZW1lbnQtPk9wZW4oKSk7CisgICAgICAgIH0KICAgICB9CiAgICAgc3RkOjp1bmlxdWVfcHRyPFRlc3RGaWxlSGFuZGxlPiB2Ym9vdDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VGVzdEZpbGVIYW5kbGU+IGR0Yl9yZXBsYWNlbWVudDsKIH07CiAKIFRFU1RfUChSZXBhY2tWZW5kb3JCb290SW1nVGVzdCwgSW52YWxpZFNpemUpIHsKLSAgICBFWFBFQ1RfRVJST1IocmVwbGFjZV92ZW5kb3JfcmFtZGlzayh2Ym9vdC0+ZmQoKSwgdmJvb3QtPnNpemUoKSArIDEsICJkZWZhdWx0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYtPnJlcGxhY2UtPmZkKCksIGVudi0+cmVwbGFjZS0+c2l6ZSgpKSwKLSAgICAgICAgICAgICAgICAgSGFzU3Vic3RyKCJTaXplIG9mIHZlbmRvciBib290IGRvZXMgbm90IG1hdGNoIikpOwotICAgIEVYUEVDVF9FUlJPUihyZXBsYWNlX3ZlbmRvcl9yYW1kaXNrKHZib290LT5mZCgpLCB2Ym9vdC0+c2l6ZSgpLCAiZGVmYXVsdCIsIGVudi0+cmVwbGFjZS0+ZmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYtPnJlcGxhY2UtPnNpemUoKSArIDEpLAotICAgICAgICAgICAgICAgICBIYXNTdWJzdHIoIlNpemUgb2YgbmV3IHZlbmRvciByYW1kaXNrIGRvZXMgbm90IG1hdGNoIikpOworICAgIEVYUEVDVF9FUlJPUigKKyAgICAgICAgICAgIHJlcGxhY2VfdmVuZG9yX3JhbWRpc2sodmJvb3QtPmZkKCksIHZib290LT5zaXplKCkgKyAxLCAiZGVmYXVsdCIsIGVudi0+cmVwbGFjZS0+ZmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LT5yZXBsYWNlLT5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFHZXRQYXJhbSgpLmR0Yl9maWxlX25hbWUuZW1wdHkoKSA/IGR0Yl9yZXBsYWNlbWVudC0+ZmQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQoLTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhR2V0UGFyYW0oKS5kdGJfZmlsZV9uYW1lLmVtcHR5KCkgPyBkdGJfcmVwbGFjZW1lbnQtPnNpemUoKSA6IDApLAorICAgICAgICAgICAgSGFzU3Vic3RyKCJTaXplIG9mIHZlbmRvciBib290IGRvZXMgbm90IG1hdGNoIikpOworICAgIEVYUEVDVF9FUlJPUigKKyAgICAgICAgICAgIHJlcGxhY2VfdmVuZG9yX3JhbWRpc2sodmJvb3QtPmZkKCksIHZib290LT5zaXplKCksICJkZWZhdWx0IiwgZW52LT5yZXBsYWNlLT5mZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYtPnJlcGxhY2UtPnNpemUoKSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFHZXRQYXJhbSgpLmR0Yl9maWxlX25hbWUuZW1wdHkoKSA/IGR0Yl9yZXBsYWNlbWVudC0+ZmQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQoLTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhR2V0UGFyYW0oKS5kdGJfZmlsZV9uYW1lLmVtcHR5KCkgPyBkdGJfcmVwbGFjZW1lbnQtPnNpemUoKSA6IDApLAorICAgICAgICAgICAgSGFzU3Vic3RyKCJTaXplIG9mIG5ldyB2ZW5kb3IgcmFtZGlzayBkb2VzIG5vdCBtYXRjaCIpKTsKKyAgICBpZiAoIUdldFBhcmFtKCkuZHRiX2ZpbGVfbmFtZS5lbXB0eSgpKSB7CisgICAgICAgIEVYUEVDVF9FUlJPUihyZXBsYWNlX3ZlbmRvcl9yYW1kaXNrKHZib290LT5mZCgpLCB2Ym9vdC0+c2l6ZSgpLCAiZGVmYXVsdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudi0+cmVwbGFjZS0+ZmQoKSwgZW52LT5yZXBsYWNlLT5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0Yl9yZXBsYWNlbWVudC0+ZmQoKSwgZHRiX3JlcGxhY2VtZW50LT5zaXplKCkgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgIEhhc1N1YnN0cigiU2l6ZSBvZiBuZXcgZHRiIGRvZXMgbm90IG1hdGNoIikpOworICAgIH0KKyAgICBFWFBFQ1RfRVJST1IoCisgICAgICAgICAgICByZXBsYWNlX3ZlbmRvcl9yYW1kaXNrKAorICAgICAgICAgICAgICAgICAgICB2Ym9vdC0+ZmQoKSwgdmJvb3QtPnNpemUoKSwgImRlZmF1bHQiLCBlbnYtPnJlcGxhY2UtPmZkKCksIGVudi0+cmVwbGFjZS0+c2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KCkpLCAxKSwKKyAgICAgICAgICAgIEhhc1N1YnN0cigiQ2FuJ3Qgc2VlayB0byB0aGUgYmVnaW5uaW5nIG9mIG5ldyBkdGIgaW1hZ2UiKSk7CiB9CiAKIFRFU1RfUChSZXBhY2tWZW5kb3JCb290SW1nVGVzdCwgUmVwbGFjZVVua25vd24pIHsKLSAgICBhdXRvIHJlcyA9IHJlcGxhY2VfdmVuZG9yX3JhbWRpc2sodmJvb3QtPmZkKCksIHZib290LT5zaXplKCksICJ1bmtub3duIiwgZW52LT5yZXBsYWNlLT5mZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYtPnJlcGxhY2UtPnNpemUoKSk7CisgICAgYXV0byByZXMgPSByZXBsYWNlX3ZlbmRvcl9yYW1kaXNrKAorICAgICAgICAgICAgdmJvb3QtPmZkKCksIHZib290LT5zaXplKCksICJ1bmtub3duIiwgZW52LT5yZXBsYWNlLT5mZCgpLCBlbnYtPnJlcGxhY2UtPnNpemUoKSwKKyAgICAgICAgICAgICFHZXRQYXJhbSgpLmR0Yl9maWxlX25hbWUuZW1wdHkoKSA/IGR0Yl9yZXBsYWNlbWVudC0+ZmQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkKC0xKSwKKyAgICAgICAgICAgICFHZXRQYXJhbSgpLmR0Yl9maWxlX25hbWUuZW1wdHkoKSA/IGR0Yl9yZXBsYWNlbWVudC0+c2l6ZSgpIDogMCk7CiAgICAgaWYgKEdldFBhcmFtKCkuZXhwZWN0ZWRfaGVhZGVyX3ZlcnNpb24gPT0gMykgewogICAgICAgICBFWFBFQ1RfRVJST1IocmVzLCBFcSgiUmVxdWlyZSB2ZW5kb3IgYm9vdCBoZWFkZXIgVjQgYnV0IGlzIFYzIikpOwogICAgIH0gZWxzZSBpZiAoR2V0UGFyYW0oKS5leHBlY3RlZF9oZWFkZXJfdmVyc2lvbiA9PSA0KSB7CkBAIC0yNzksOCArMzA4LDExIEBACiAgICAgYXV0byBvbGRfY29udGVudCA9IHZib290LT5SZWFkKCk7CiAgICAgQVNTRVJUX1JFU1VMVF9PSyhvbGRfY29udGVudCk7CiAKLSAgICBBU1NFUlRfUkVTVUxUX09LKHJlcGxhY2VfdmVuZG9yX3JhbWRpc2sodmJvb3QtPmZkKCksIHZib290LT5zaXplKCksICJkZWZhdWx0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LT5yZXBsYWNlLT5mZCgpLCBlbnYtPnJlcGxhY2UtPnNpemUoKSkpOworICAgIEFTU0VSVF9SRVNVTFRfT0socmVwbGFjZV92ZW5kb3JfcmFtZGlzaygKKyAgICAgICAgICAgIHZib290LT5mZCgpLCB2Ym9vdC0+c2l6ZSgpLCAiZGVmYXVsdCIsIGVudi0+cmVwbGFjZS0+ZmQoKSwgZW52LT5yZXBsYWNlLT5zaXplKCksCisgICAgICAgICAgICAhR2V0UGFyYW0oKS5kdGJfZmlsZV9uYW1lLmVtcHR5KCkgPyBkdGJfcmVwbGFjZW1lbnQtPmZkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCgtMSksCisgICAgICAgICAgICAhR2V0UGFyYW0oKS5kdGJfZmlsZV9uYW1lLmVtcHR5KCkgPyBkdGJfcmVwbGFjZW1lbnQtPnNpemUoKSA6IDApKTsKICAgICBFWFBFQ1RfUkVTVUxUKHZib290LT5mc2l6ZSgpLCB2Ym9vdC0+c2l6ZSgpKSA8PCAiRmlsZSBzaXplIHNob3VsZCBub3QgY2hhbmdlIGFmdGVyIHJlcGFjayI7CiAKICAgICBhdXRvIG5ld19jb250ZW50X3JlcyA9IHZib290LT5SZWFkKCk7CkBAIC0yOTEsMTQgKzMyMywyMyBAQAogICAgIEFTU0VSVF9FUSgwLCBtZW1jbXAoVkVORE9SX0JPT1RfTUFHSUMsIGhkci0+bWFnaWMsIFZFTkRPUl9CT09UX01BR0lDX1NJWkUpKTsKICAgICBBU1NFUlRfRVEoR2V0UGFyYW0oKS5leHBlY3RlZF9oZWFkZXJfdmVyc2lvbiwgaGRyLT5oZWFkZXJfdmVyc2lvbik7CiAgICAgRVhQRUNUX0VRKGhkci0+dmVuZG9yX3JhbWRpc2tfc2l6ZSwgZW52LT5yZXBsYWNlLT5zaXplKCkpOwotICAgIEVYUEVDVF9FUShoZHItPmR0Yl9zaXplLCBlbnYtPmR0Yi0+c2l6ZSgpKTsKKyAgICBpZiAoR2V0UGFyYW0oKS5kdGJfZmlsZV9uYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgRVhQRUNUX0VRKGhkci0+ZHRiX3NpemUsIGVudi0+ZHRiLT5zaXplKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEVYUEVDVF9FUShoZHItPmR0Yl9zaXplLCBkdGJfcmVwbGFjZW1lbnQtPnNpemUoKSk7CisgICAgfQogCiAgICAgYXV0byBvID0gcm91bmRfdXAoc2l6ZW9mKHZlbmRvcl9ib290X2ltZ19oZHJfdjMpLCBoZHItPnBhZ2Vfc2l6ZSk7CiAgICAgYXV0byBwID0gcm91bmRfdXAoaGRyLT52ZW5kb3JfcmFtZGlza19zaXplLCBoZHItPnBhZ2Vfc2l6ZSk7CiAgICAgYXV0byBxID0gcm91bmRfdXAoaGRyLT5kdGJfc2l6ZSwgaGRyLT5wYWdlX3NpemUpOwogCiAgICAgRVhQRUNUX1RIQVQobmV3X2NvbnRlbnQuc3Vic3RyKG8sIHApLCBJc1BhZGRlZChlbnYtPnJlcGxhY2VfY29udGVudCkpOwotICAgIEVYUEVDVF9USEFUKG5ld19jb250ZW50LnN1YnN0cihvICsgcCwgcSksIElzUGFkZGVkKGVudi0+ZHRiX2NvbnRlbnQpKTsKKyAgICBpZiAoR2V0UGFyYW0oKS5kdGJfZmlsZV9uYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgRVhQRUNUX1RIQVQobmV3X2NvbnRlbnQuc3Vic3RyKG8gKyBwLCBxKSwgSXNQYWRkZWQoZW52LT5kdGJfY29udGVudCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF1dG8gZHRiX2NvbnRlbnRfcmVzID0gZHRiX3JlcGxhY2VtZW50LT5SZWFkKCk7CisgICAgICAgIEVYUEVDVF9USEFUKG5ld19jb250ZW50LnN1YnN0cihvICsgcCwgcSksIElzUGFkZGVkKCpkdGJfY29udGVudF9yZXMpKTsKKyAgICB9CiAKICAgICBpZiAoaGRyLT5oZWFkZXJfdmVyc2lvbiA8IDQpIHJldHVybjsKIApAQCAtMzIxLDExICszNjIsMTcgQEAKIAogSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAogICAgICAgICBSZXBhY2tWZW5kb3JCb290SW1nVGVzdCwgUmVwYWNrVmVuZG9yQm9vdEltZ1Rlc3QsCi0gICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKFJlcGFja1ZlbmRvckJvb3RJbWdUZXN0UGFyYW17InZlbmRvcl9ib290X3YzLmltZyIsIDN9LAotICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBhY2tWZW5kb3JCb290SW1nVGVzdFBhcmFteyJ2ZW5kb3JfYm9vdF92NF93aXRoX2ZyYWcuaW1nIiwgNH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGFja1ZlbmRvckJvb3RJbWdUZXN0UGFyYW17InZlbmRvcl9ib290X3Y0X3dpdGhvdXRfZnJhZy5pbWciLCA0fSksCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKFJlcGFja1ZlbmRvckJvb3RJbWdUZXN0UGFyYW17InZlbmRvcl9ib290X3YzLmltZyIsICIiLCAzfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwYWNrVmVuZG9yQm9vdEltZ1Rlc3RQYXJhbXsidmVuZG9yX2Jvb3RfdjRfd2l0aF9mcmFnLmltZyIsICIiLCA0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwYWNrVmVuZG9yQm9vdEltZ1Rlc3RQYXJhbXsidmVuZG9yX2Jvb3RfdjRfd2l0aG91dF9mcmFnLmltZyIsICIiLCA0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwYWNrVmVuZG9yQm9vdEltZ1Rlc3RQYXJhbXsidmVuZG9yX2Jvb3RfdjRfd2l0aF9mcmFnLmltZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImR0Yl9yZXBsYWNlLmltZyIsIDR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBhY2tWZW5kb3JCb290SW1nVGVzdFBhcmFteyJ2ZW5kb3JfYm9vdF92NF93aXRob3V0X2ZyYWcuaW1nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHRiX3JlcGxhY2UuaW1nIiwgNH0pLAogICAgICAgICBbXShjb25zdCBhdXRvJiBpbmZvKSB7Ci0gICAgICAgICAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6U3RyaW5nUmVwbGFjZShpbmZvLnBhcmFtLnZlbmRvcl9ib290X2ZpbGVfbmFtZSwgIi4iLCAiXyIsIGZhbHNlKTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRlc3RfbmFtZSA9CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1JlcGxhY2UoaW5mby5wYXJhbS52ZW5kb3JfYm9vdF9maWxlX25hbWUsICIuIiwgIl8iLCBmYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gdGVzdF9uYW1lICsgKCFpbmZvLnBhcmFtLmR0Yl9maWxlX25hbWUuZW1wdHkoKSA/ICJfcmVwbGFjZV9kdGIiIDogIiIpOwogICAgICAgICB9KTsKIAogc3RkOjpzdHJpbmdfdmlldyBHZXRSYW1kaXNrTmFtZShjb25zdCB2ZW5kb3JfcmFtZGlza190YWJsZV9lbnRyeV92NCogZW50cnkpIHsKQEAgLTM2OCw3ICs0MTUsOCBAQAogICAgIEFTU0VSVF9SRVNVTFRfT0sob2xkX2NvbnRlbnQpOwogCiAgICAgQVNTRVJUX1JFU1VMVF9PSyhyZXBsYWNlX3ZlbmRvcl9yYW1kaXNrKHZib290LT5mZCgpLCB2Ym9vdC0+c2l6ZSgpLCByZXBsYWNlX3JhbWRpc2tfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LT5yZXBsYWNlLT5mZCgpLCBlbnYtPnJlcGxhY2UtPnNpemUoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYtPnJlcGxhY2UtPmZkKCksIGVudi0+cmVwbGFjZS0+c2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQoLTEpLCAwKSk7CiAgICAgRVhQRUNUX1JFU1VMVCh2Ym9vdC0+ZnNpemUoKSwgdmJvb3QtPnNpemUoKSkgPDwgIkZpbGUgc2l6ZSBzaG91bGQgbm90IGNoYW5nZSBhZnRlciByZXBhY2siOwogCiAgICAgYXV0byBuZXdfY29udGVudF9yZXMgPSB2Ym9vdC0+UmVhZCgpOwpkaWZmIC0tZ2l0IGEvZnNfbWdyL0FuZHJvaWQuYnAgYi9mc19tZ3IvQW5kcm9pZC5icAppbmRleCBiYmQwNjhiLi44N2RiOThiIDEwMDY0NAotLS0gYS9mc19tZ3IvQW5kcm9pZC5icAorKysgYi9mc19tZ3IvQW5kcm9pZC5icApAQCAtNDksNyArNDksNiBAQAogICAgIHNhbml0aXplOiB7CiAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbImludGVnZXIiXSwKICAgICB9LAotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJpbmNsdWRlLyJdLAogICAgIGNmbGFnczogWwogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdlcnJvciIsCkBAIC02MCw3ICs1OSw3IEBACiAgICAgbmFtZTogImxpYmZzX21ncl9kZWZhdWx0cyIsCiAgICAgZGVmYXVsdHM6IFsiZnNfbWdyX2RlZmF1bHRzIl0sCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCi0gICAgaW5jbHVkZV9kaXJzOiBbInN5c3RlbS92b2xkIl0sCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUvIl0sCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItRF9GSUxFX09GRlNFVF9CSVRTPTY0IiwKICAgICBdLApAQCAtNzAsOCArNjksOSBAQAogICAgICAgICAiZnNfbWdyLmNwcCIsCiAgICAgICAgICJmc19tZ3JfZm9ybWF0LmNwcCIsCiAgICAgICAgICJmc19tZ3JfZG1fbGluZWFyLmNwcCIsCi0gICAgICAgICJmc19tZ3Jfb3ZlcmxheWZzLmNwcCIsCiAgICAgICAgICJmc19tZ3Jfcm9vdHMuY3BwIiwKKyAgICAgICAgImZzX21ncl9vdmVybGF5ZnNfY29udHJvbC5jcHAiLAorICAgICAgICAiZnNfbWdyX292ZXJsYXlmc19tb3VudC5jcHAiLAogICAgICAgICAiZnNfbWdyX3ZlbmRvcl9vdmVybGF5LmNwcCIsCiAgICAgICAgICI6bGliZmllbWFwX3NyY3MiLAogICAgIF0sCkBAIC04OSw4ICs4OSw2IEBACiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYmF2YiIsCiAgICAgICAgICJsaWJmc19hdmIiLAotICAgICAgICAibGliZnN0YWIiLAotICAgICAgICAibGliZG0iLAogICAgICAgICAibGliZ3NpIiwKICAgICBdLAogICAgIGV4cG9ydF9zdGF0aWNfbGliX2hlYWRlcnM6IFsKQEAgLTE3NCw0MyArMTcyLDIyIEBACiB9CiAKIGNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICAvLyBEbyBub3QgZXZlciBtYWtlIHRoaXMgYSBzaGFyZWQgbGlicmFyeSBhcyBsb25nIGFzIGl0IGlzIHZlbmRvcl9hdmFpbGFibGUuCi0gICAgLy8gSXQgZG9lcyBub3QgaGF2ZSBhIHN0YWJsZSBpbnRlcmZhY2UuCi0gICAgbmFtZTogImxpYmZzdGFiIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIG5hbWU6ICJsaWJmc19tZ3JfZmlsZV93YWl0IiwKKyAgICBkZWZhdWx0czogWyJmc19tZ3JfZGVmYXVsdHMiXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQiLAorICAgIF0sCisgICAgc3JjczogWworICAgICAgICAiZmlsZV93YWl0LmNwcCIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmFzZSIsCisgICAgXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKICAgICByYW1kaXNrX2F2YWlsYWJsZTogdHJ1ZSwKICAgICB2ZW5kb3JfcmFtZGlza19hdmFpbGFibGU6IHRydWUsCiAgICAgcmVjb3ZlcnlfYXZhaWxhYmxlOiB0cnVlLAotICAgIGFwZXhfYXZhaWxhYmxlOiBbCi0gICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOmFueWFwZXgiLAotICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCi0gICAgXSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICBkZWZhdWx0czogWyJmc19tZ3JfZGVmYXVsdHMiXSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJmc19tZ3JfZnN0YWIuY3BwIiwKLSAgICAgICAgImZzX21ncl9ib290X2NvbmZpZy5jcHAiLAotICAgICAgICAiZnNfbWdyX3Nsb3RzZWxlY3QuY3BwIiwKLSAgICBdLAotICAgIHRhcmdldDogewotICAgICAgICBkYXJ3aW46IHsKLSAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAotICAgICAgICB9LAotICAgICAgICB2ZW5kb3I6IHsKLSAgICAgICAgICAgIGNmbGFnczogWwotICAgICAgICAgICAgICAgIC8vIFNraXBwaW5nIGVudHJpZXMgaW4gZnN0YWIgc2hvdWxkIG9ubHkgYmUgZG9uZSBpbiBhIHN5c3RlbQotICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgYXMgdGhlIGNvbmZpZyBmaWxlIGlzIGluIC9zeXN0ZW1fZXh0LgotICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgb3AgZnJvbSB0aGUgdmVuZG9yIHZhcmlhbnQuCi0gICAgICAgICAgICAgICAgIi1ETk9fU0tJUF9NT1VOVCIsCi0gICAgICAgICAgICBdLAotICAgICAgICB9LAotICAgIH0sCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlX2ZzdGFiIl0sCi0gICAgaGVhZGVyX2xpYnM6IFsKLSAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCi0gICAgICAgICJsaWJnc2lfaGVhZGVycyIsCi0gICAgXSwKLSAgICBtaW5fc2RrX3ZlcnNpb246ICIzMSIsCiB9CiAKIGNjX2JpbmFyeSB7CmRpZmYgLS1naXQgYS9mc19tZ3IvVEVTVF9NQVBQSU5HIGIvZnNfbWdyL1RFU1RfTUFQUElORwppbmRleCBkMzU3ZTQ1Li4xOTIyMzJkIDEwMDY0NAotLS0gYS9mc19tZ3IvVEVTVF9NQVBQSU5HCisrKyBiL2ZzX21nci9URVNUX01BUFBJTkcKQEAgLTE2LDcgKzE2LDggQEAKICAgICAgICJuYW1lIjogImZpZW1hcF93cml0ZXJfdGVzdCIKICAgICB9LAogICAgIHsKLSAgICAgICJuYW1lIjogImZzX21ncl92ZW5kb3Jfb3ZlcmxheV90ZXN0IgorICAgICAgIm5hbWUiOiAiZnNfbWdyX3ZlbmRvcl9vdmVybGF5X3Rlc3QiLAorICAgICAgImtleXdvcmRzIjogWyJpbnRlcm5hbCJdCiAgICAgfSwKICAgICB7CiAgICAgICAibmFtZSI6ICJ2dHNfbGlic25hcHNob3RfdGVzdCIKQEAgLTI0LDI2ICsyNSwyOCBAQAogICAgIHsKICAgICAgICJuYW1lIjogInZhYl9sZWdhY3lfdGVzdHMiCiAgICAgfSwKLSAgICAvLyBUT0RPOiBiLzI3OTAwOTY5NwotICAgIC8veyJuYW1lIjogInZhYmNfbGVnYWN5X3Rlc3RzIn0sCiAgICAgewogICAgICAgIm5hbWUiOiAiY293X2FwaV90ZXN0IgorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAic25hcHVzZXJkX3Rlc3QiCiAgICAgfQogICBdLAogICAia2VybmVsLXByZXN1Ym1pdCI6IFsKICAgICB7Ci0gICAgICAibmFtZSI6ICJ2dHNfbGliZG1fdGVzdCIKKyAgICAgICJuYW1lIjogImFkYi1yZW1vdW50LXNoIgogICAgIH0sCiAgICAgewotICAgICAgIm5hbWUiOiAidnRzX2NvcmVfbGlibHBfdGVzdCIKKyAgICAgICJuYW1lIjogImxpYmRtX3Rlc3QiCiAgICAgfSwKICAgICB7Ci0gICAgICAibmFtZSI6ICJ2dHNfbGlic25hcHNob3RfdGVzdCIKKyAgICAgICJuYW1lIjogImxpYmxwX3Rlc3QiCiAgICAgfSwKICAgICB7CiAgICAgICAibmFtZSI6ICJ2YWJfbGVnYWN5X3Rlc3RzIgorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAic25hcHVzZXJkX3Rlc3QiCiAgICAgfQotICAgIC8vIFRPRE86IGIvMjc5MDA5Njk3Ci0gICAgLy97Im5hbWUiOiAidmFiY19sZWdhY3lfdGVzdHMifQogICBdCiB9CmRpZmYgLS1naXQgYS9mc19tZ3IvY2xlYW5fc2NyYXRjaF9maWxlcy5yYyBiL2ZzX21nci9jbGVhbl9zY3JhdGNoX2ZpbGVzLnJjCmluZGV4IDI1YTdlNjkuLjcxNzA4ZjggMTAwNjQ0Ci0tLSBhL2ZzX21nci9jbGVhbl9zY3JhdGNoX2ZpbGVzLnJjCisrKyBiL2ZzX21nci9jbGVhbl9zY3JhdGNoX2ZpbGVzLnJjCkBAIC0xLDIgKzEsMiBAQAotb24gcG9zdC1mcy1kYXRhICYmIHByb3BlcnR5OnJvLmRlYnVnZ2FibGU9MQorb24gcG9zdC1mcy1kYXRhICYmIHByb3BlcnR5OnJvLmRlYnVnZ2FibGU9MSAmJiBwcm9wZXJ0eTpyby5ib290LmR5bmFtaWNfcGFydGl0aW9ucz10cnVlCiAgICAgZXhlY19iYWNrZ3JvdW5kIC0gcm9vdCByb290IC0tIC9zeXN0ZW0vYmluL2NsZWFuX3NjcmF0Y2hfZmlsZXMKZGlmZiAtLWdpdCBhL2ZzX21nci9mc19tZ3IuY3BwIGIvZnNfbWdyL2ZzX21nci5jcHAKaW5kZXggOGI5YmNlMS4uOWY1MmY0NCAxMDA2NDQKLS0tIGEvZnNfbWdyL2ZzX21nci5jcHAKKysrIGIvZnNfbWdyL2ZzX21nci5jcHAKQEAgLTE2LDcgKzE2LDYgQEAKIAogI2luY2x1ZGUgImZzX21nci5oIgogCi0jaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDxkaXJlbnQuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CkBAIC0yOSw2ICsyOCw3IEBACiAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiAjaW5jbHVkZSA8c3lzL21vdW50Lmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdHZmcy5oPgogI2luY2x1ZGUgPHN5cy9zd2FwLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KQEAgLTM4LDcgKzM4LDYgQEAKIAogI2luY2x1ZGUgPGFycmF5PgogI2luY2x1ZGUgPGNocm9ubz4KLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgogI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8c3RyaW5nPgpAQCAtNjUsNiArNjQsNyBAQAogI2luY2x1ZGUgPGZzX21nci9maWxlX3dhaXQuaD4KICNpbmNsdWRlIDxmc19tZ3Jfb3ZlcmxheWZzLmg+CiAjaW5jbHVkZSA8ZnNjcnlwdC9mc2NyeXB0Lmg+CisjaW5jbHVkZSA8ZnN0YWIvZnN0YWIuaD4KICNpbmNsdWRlIDxsaWJkbS9kbS5oPgogI2luY2x1ZGUgPGxpYmRtL2xvb3BfY29udHJvbC5oPgogI2luY2x1ZGUgPGxpYmxwL21ldGFkYXRhX2Zvcm1hdC5oPgpAQCAtODEsNyArODEsNyBAQAogI2RlZmluZSBGMkZTX0ZTQ0tfQklOICAgIi9zeXN0ZW0vYmluL2ZzY2suZjJmcyIKICNkZWZpbmUgTUtTV0FQX0JJTiAgICAgICIvc3lzdGVtL2Jpbi9ta3N3YXAiCiAjZGVmaW5lIFRVTkUyRlNfQklOICAgICAiL3N5c3RlbS9iaW4vdHVuZTJmcyIKLSNkZWZpbmUgUkVTSVpFMkZTX0JJTiAiL3N5c3RlbS9iaW4vcmVzaXplMmZzIgorI2RlZmluZSBSRVNJWkUyRlNfQklOICAgIi9zeXN0ZW0vYmluL3Jlc2l6ZTJmcyIKIAogI2RlZmluZSBGU0NLX0xPR19GSUxFICAgIi9kZXYvZnNja2xvZ3MvbG9nIgogCkBAIC0xMzcsOCArMTM3LDggQEAKIHN0YXRpYyB2b2lkIGxvZ19mc19zdGF0KGNvbnN0IHN0ZDo6c3RyaW5nJiBibGtfZGV2aWNlLCBpbnQgZnNfc3RhdCkgewogICAgIHN0ZDo6c3RyaW5nIG1zZyA9CiAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoIlxuZnNfc3RhdCwlcywweCV4XG4iLCBibGtfZGV2aWNlLmNfc3RyKCksIGZzX3N0YXQpOwotICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBmZChURU1QX0ZBSUxVUkVfUkVUUlkob3BlbihGU0NLX0xPR19GSUxFLCBPX1dST05MWSB8IE9fQ0xPRVhFQyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9fQVBQRU5EIHwgT19DUkVBVCwgMDY2NCkpKTsKKyAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgZmQoVEVNUF9GQUlMVVJFX1JFVFJZKAorICAgICAgICAgICAgb3BlbihGU0NLX0xPR19GSUxFLCBPX1dST05MWSB8IE9fQ0xPRVhFQyB8IE9fQVBQRU5EIHwgT19DUkVBVCwgMDY2NCkpKTsKICAgICBpZiAoZmQgPT0gLTEgfHwgIWFuZHJvaWQ6OmJhc2U6OldyaXRlU3RyaW5nVG9GZChtc2csIGZkKSkgewogICAgICAgICBMV0FSTklORyA8PCBfX0ZVTkNUSU9OX18gPDwgIigpIGNhbm5vdCBsb2cgIiA8PCBtc2c7CiAgICAgfQpAQCAtMjE1LDEwICsyMTUsNiBAQAogICAgICAgICAgKi8KICAgICAgICAgaWYgKCEoKmZzX3N0YXQgJiBGU19TVEFUX0ZVTExfTU9VTlRfRkFJTEVEKSkgeyAgLy8gYWxyZWFkeSB0cmllZCBpZiBmdWxsIG1vdW50IGZhaWxlZAogICAgICAgICAgICAgZXJybm8gPSAwOwotICAgICAgICAgICAgaWYgKGZzX3R5cGUgPT0gImV4dDQiKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBvcHRpb24gaXMgb25seSB2YWxpZCB3aXRoIGV4dDQKLSAgICAgICAgICAgICAgICB0bXBtbnRfb3B0cyArPSAiLG5vbWJsa19pb19zdWJtaXQiOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0ID0gbW91bnQoYmxrX2RldmljZS5jX3N0cigpLCB0YXJnZXQuY19zdHIoKSwgZnNfdHlwZS5jX3N0cigpLCB0bXBtbnRfZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICB0bXBtbnRfb3B0cy5jX3N0cigpKTsKICAgICAgICAgICAgIFBJTkZPIDw8IF9fRlVOQ1RJT05fXyA8PCAiKCk6IG1vdW50KCIgPDwgYmxrX2RldmljZSA8PCAiLCIgPDwgdGFyZ2V0IDw8ICIsIiA8PCBmc190eXBlCkBAIC01OTYsNyArNTkyLDcgQEAKIAogICAgIC8vIE11c3QgZ2l2ZSBgLVQgbm93YCB0byBwcmV2ZW50IGxhc3RfZnNja190aW1lIGZyb20gZ3Jvd2luZyB0b28gbGFyZ2UsCiAgICAgLy8gb3RoZXJ3aXNlLCB0dW5lMmZzIHdvbid0IGVuYWJsZSBtZXRhZGF0YV9jc3VtLgotICAgIGNvbnN0IGNoYXIqIHR1bmUyZnNfYXJnc1tdID0ge1RVTkUyRlNfQklOLCAiLU8iLCAgICAgICAgIm1ldGFkYXRhX2NzdW0sNjRiaXQsZXh0ZW50IiwKKyAgICBjb25zdCBjaGFyKiB0dW5lMmZzX2FyZ3NbXSA9IHtUVU5FMkZTX0JJTiwgIi1PIiwgICJtZXRhZGF0YV9jc3VtLDY0Yml0LGV4dGVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1UIiwgICAgICAgICJub3ciLCBibGtfZGV2aWNlLmNfc3RyKCl9OwogICAgIGNvbnN0IGNoYXIqIHJlc2l6ZTJmc19hcmdzW10gPSB7UkVTSVpFMkZTX0JJTiwgIi1iIiwgYmxrX2RldmljZS5jX3N0cigpfTsKIApAQCAtNjEzLDcgKzYwOSw2IEBACiAKIC8vIFJlYWQgdGhlIHByaW1hcnkgc3VwZXJibG9jayBmcm9tIGFuIGYyZnMgZmlsZXN5c3RlbS4gIE9uIGZhaWx1cmUgcmV0dXJuCiAvLyBmYWxzZS4gIElmIGl0J3Mgbm90IGFuIGYyZnMgZmlsZXN5c3RlbSwgYWxzbyBzZXQgRlNfU1RBVF9JTlZBTElEX01BR0lDLgotI2RlZmluZSBGMkZTX0JMS1NJWkUgNDA5NgogI2RlZmluZSBGMkZTX1NVUEVSX09GRlNFVCAxMDI0CiBzdGF0aWMgYm9vbCByZWFkX2YyZnNfc3VwZXJibG9jayhjb25zdCBzdGQ6OnN0cmluZyYgYmxrX2RldmljZSwgaW50KiBmc19zdGF0KSB7CiAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGZkKFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKGJsa19kZXZpY2UuY19zdHIoKSwgT19SRE9OTFkgfCBPX0NMT0VYRUMpKSk7CkBAIC02MjgsNyArNjIzLDkgQEAKICAgICAgICAgUEVSUk9SIDw8ICJDYW4ndCByZWFkICciIDw8IGJsa19kZXZpY2UgPDwgIicgc3VwZXJibG9jazEiOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIGlmIChURU1QX0ZBSUxVUkVfUkVUUlkocHJlYWQoZmQsICZzYjIsIHNpemVvZihzYjIpLCBGMkZTX0JMS1NJWkUgKyBGMkZTX1NVUEVSX09GRlNFVCkpICE9CisgICAgLy8gRjJGUyBvbmx5IHN1cHBvcnRzIGJsb2NrX3NpemU9cGFnZV9zaXplIGNhc2UuIFNvLCBpdCBpcyBzYWZlIHRvIGNhbGwKKyAgICAvLyBgZ2V0cGFnZXNpemUoKWAgYW5kIHVzZSB0aGF0IGFzIHNpemUgb2Ygc3VwZXIgYmxvY2suCisgICAgaWYgKFRFTVBfRkFJTFVSRV9SRVRSWShwcmVhZChmZCwgJnNiMiwgc2l6ZW9mKHNiMiksIGdldHBhZ2VzaXplKCkgKyBGMkZTX1NVUEVSX09GRlNFVCkpICE9CiAgICAgICAgIHNpemVvZihzYjIpKSB7CiAgICAgICAgIFBFUlJPUiA8PCAiQ2FuJ3QgcmVhZCAnIiA8PCBibGtfZGV2aWNlIDw8ICInIHN1cGVyYmxvY2syIjsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNjUyLDcgKzY0OSw3IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKHNiID09IGNwdV90b19sZTMyKEYyRlNfU1VQRVJfTUFHSUMpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoVEVNUF9GQUlMVVJFX1JFVFJZKHByZWFkKGZkLCAmc2IsIHNpemVvZihzYiksIEYyRlNfQkxLU0laRSArIEYyRlNfU1VQRVJfT0ZGU0VUKSkgIT0KKyAgICBpZiAoVEVNUF9GQUlMVVJFX1JFVFJZKHByZWFkKGZkLCAmc2IsIHNpemVvZihzYiksIGdldHBhZ2VzaXplKCkgKyBGMkZTX1NVUEVSX09GRlNFVCkpICE9CiAgICAgICAgIHNpemVvZihzYikpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTgxOCw5ICs4MTUsMTMgQEAKIC8vIF9fbW91bnQoKTogd3JhcHBlciBhcm91bmQgdGhlIG1vdW50KCkgc3lzdGVtIGNhbGwgd2hpY2ggYWxzbwogLy8gc2V0cyB0aGUgdW5kZXJseWluZyBibG9jayBkZXZpY2UgdG8gcmVhZC1vbmx5IGlmIHRoZSBtb3VudCBpcyByZWFkLW9ubHkuCiAvLyBTZWUgIm1hbiAyIG1vdW50IiBmb3IgcmV0dXJuIHZhbHVlcy4KLXN0YXRpYyBpbnQgX19tb3VudChjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlLCBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0LCBjb25zdCBGc3RhYkVudHJ5JiBlbnRyeSkgeworc3RhdGljIGludCBfX21vdW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0YXJnZXQsIGNvbnN0IEZzdGFiRW50cnkmIGVudHJ5LAorICAgICAgICAgICAgICAgICAgIGJvb2wgcmVhZF9vbmx5ID0gZmFsc2UpIHsKICAgICBlcnJubyA9IDA7CiAgICAgdW5zaWduZWQgbG9uZyBtb3VudGZsYWdzID0gZW50cnkuZmxhZ3M7CisgICAgaWYgKHJlYWRfb25seSkgeworICAgICAgICBtb3VudGZsYWdzIHw9IE1TX1JET05MWTsKKyAgICB9CiAgICAgaW50IHJldCA9IDA7CiAgICAgaW50IHNhdmVfZXJybm8gPSAwOwogICAgIGludCBnY19hbGxvd2FuY2UgPSAwOwpAQCAtODUwLDcgKzg1MSwxNCBAQAogICAgICAgICAgICAgICAgICAgPDwgIix0eXBlPSIgPDwgZW50cnkuZnNfdHlwZSA8PCAiLCBnY19hbGxvd2FuY2U9IiA8PCBnY19hbGxvd2FuY2UgPDwgIiUpPSIgPDwgcmV0CiAgICAgICAgICAgICAgICAgICA8PCAiKCIgPDwgc2F2ZV9lcnJubyA8PCAiKSI7CiAgICAgICAgIH0KLSAgICAgICAgcmV0ID0gbW91bnQoc291cmNlLmNfc3RyKCksIHRhcmdldC5jX3N0cigpLCBlbnRyeS5mc190eXBlLmNfc3RyKCksIG1vdW50ZmxhZ3MsCisKKyAgICAgICAgLy8gTGV0J3MgZ2V0IHRoZSByYXcgZG0gdGFyZ2V0LCBpZiBpdCdzIGEgc3ltbGluaywgc2luY2Ugc29tZSBleGlzdGluZyBhcHBsaWNhdGlvbnMKKyAgICAgICAgLy8gcmVseSBvbiAvcHJvYy9tb3VudHMgdG8gZmluZCB0aGUgdXNlcmRhdGEncyBkbSB0YXJnZXQgcGF0aC4gRG9uJ3QgYnJlYWsgdGhhdCBhc3N1bXB0aW9uLgorICAgICAgICBzdGQ6OnN0cmluZyByZWFsX3NvdXJjZTsKKyAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpSZWFscGF0aChzb3VyY2UsICZyZWFsX3NvdXJjZSkpIHsKKyAgICAgICAgICAgIHJlYWxfc291cmNlID0gc291cmNlOworICAgICAgICB9CisgICAgICAgIHJldCA9IG1vdW50KHJlYWxfc291cmNlLmNfc3RyKCksIHRhcmdldC5jX3N0cigpLCBlbnRyeS5mc190eXBlLmNfc3RyKCksIG1vdW50ZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgIG9wdHMuY19zdHIoKSk7CiAgICAgICAgIHNhdmVfZXJybm8gPSBlcnJubzsKICAgICAgICAgaWYgKHRyeV9mMmZzX2djX2FsbG93YW5jZSkgZ2NfYWxsb3dhbmNlICs9IDEwOwpAQCAtOTA3LDYgKzkxNSwxMCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCitzdGF0aWMgYm9vbCBzaG91bGRfdXNlX21ldGFkYXRhX2VuY3J5cHRpb24oY29uc3QgRnN0YWJFbnRyeSYgZW50cnkpIHsKKyAgICByZXR1cm4gIWVudHJ5Lm1ldGFkYXRhX2tleV9kaXIuZW1wdHkoKSAmJiBlbnRyeS5mc19tZ3JfZmxhZ3MuZmlsZV9lbmNyeXB0aW9uOworfQorCiAvLyBUcmllcyB0byBtb3VudCBhbnkgb2YgdGhlIGNvbnNlY3V0aXZlIGZzdGFiIGVudHJpZXMgdGhhdCBtYXRjaAogLy8gdGhlIG1vdW50cG9pbnQgb2YgdGhlIG9uZSBnaXZlbiBieSBmc3RhYltzdGFydF9pZHhdLgogLy8KQEAgLTkxNCw3ICs5MjYsNyBAQAogLy8gYXR0ZW1wdGVkX2lkeDogT24gcmV0dXJuLCB3aWxsIGluZGljYXRlIHdoaWNoIGZzdGFiIGVudHJ5CiAvLyAgICAgc3VjY2VlZGVkLiBJbiBjYXNlIG9mIGZhaWx1cmUsIGl0IHdpbGwgYmUgdGhlIHN0YXJ0X2lkeC4KIC8vIFNldHMgZXJybm8gdG8gbWF0Y2ggdGhlIDFzdCBtb3VudCBmYWlsdXJlIG9uIGZhaWx1cmUuCi1zdGF0aWMgYm9vbCBtb3VudF93aXRoX2FsdGVybmF0aXZlcyhGc3RhYiYgZnN0YWIsIGludCBzdGFydF9pZHgsIGludCogZW5kX2lkeCwKK3N0YXRpYyBib29sIG1vdW50X3dpdGhfYWx0ZXJuYXRpdmVzKEZzdGFiJiBmc3RhYiwgaW50IHN0YXJ0X2lkeCwgYm9vbCBpbnRlcnJ1cHRlZCwgaW50KiBlbmRfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBhdHRlbXB0ZWRfaWR4KSB7CiAgICAgdW5zaWduZWQgbG9uZyBpOwogICAgIGludCBtb3VudF9lcnJubyA9IDA7CkBAIC05MzQsNiArOTQ2LDEzIEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChpbnRlcnJ1cHRlZCkgeworICAgICAgICAgICAgTElORk8gPDwgX19GVU5DVElPTl9fIDw8ICIoKTogc2tpcHBpbmcgZnN0YWIgbW91bnRwb2ludD0iIDw8IGZzdGFiW2ldLm1vdW50X3BvaW50CisgICAgICAgICAgICAgICAgICA8PCAiIHJlY1siIDw8IGkgPDwgIl0uZnNfdHlwZT0iIDw8IGZzdGFiW2ldLmZzX3R5cGUKKyAgICAgICAgICAgICAgICAgIDw8ICIgKHByZXZpb3VzbHkgaW50ZXJydXB0ZWQgZHVyaW5nIGVuY3J5cHRpb24gc3RlcCkiOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKwogICAgICAgICAvLyBmc3RhYltzdGFydF9pZHhdLmJsa19kZXZpY2UgaXMgYWxyZWFkeSB1cGRhdGVkIHRvIC9kZXYvZG0tPE4+IGJ5CiAgICAgICAgIC8vIEFWQiByZWxhdGVkIGZ1bmN0aW9ucy4gQ29weSBpdCBmcm9tIHN0YXJ0X2lkeCB0byB0aGUgY3VycmVudCBpbmRleCBpLgogICAgICAgICBpZiAoKGkgIT0gc3RhcnRfaWR4KSAmJiBmc3RhYltpXS5mc19tZ3JfZmxhZ3MubG9naWNhbCAmJgpAQCAtOTUzLDggKzk3MiwxNSBAQAogICAgICAgICB9CiAKICAgICAgICAgaW50IHJldHJ5X2NvdW50ID0gMjsKKyAgICAgICAgY29uc3QgYXV0byByZWFkX29ubHkgPSBzaG91bGRfdXNlX21ldGFkYXRhX2VuY3J5cHRpb24oZnN0YWJbaV0pOworICAgICAgICBpZiAocmVhZF9vbmx5KSB7CisgICAgICAgICAgICBMT0coSU5GTykgPDwgIk1vdW50IHBvaW50ICIgPDwgZnN0YWJbaV0uYmxrX2RldmljZSA8PCAiIEAgIiA8PCBmc3RhYltpXS5tb3VudF9wb2ludAorICAgICAgICAgICAgICAgICAgICAgIDw8ICIgdXNlcyBtZXRhZGF0YSBlbmNyeXB0aW9uLCB3aGljaCBtZWFucyB3ZSBuZWVkIHRvIHVubW91bnQgaXQgbGF0ZXIgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiY2FsbCBlbmNyeXB0RnN0YWIvZW5jcnlwdF9pbnBsYWNlLiBUbyBhdm9pZCBmaWxlIG9wZXJhdGlvbnMgYmVmb3JlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZW5jcnlwdGlvbiwgd2Ugd2lsbCBtb3VudCBpdCBhcyByZWFkLW9ubHkgZmlyc3QiOworICAgICAgICB9CiAgICAgICAgIHdoaWxlIChyZXRyeV9jb3VudC0tID4gMCkgewotICAgICAgICAgICAgaWYgKCFfX21vdW50KGZzdGFiW2ldLmJsa19kZXZpY2UsIGZzdGFiW2ldLm1vdW50X3BvaW50LCBmc3RhYltpXSkpIHsKKyAgICAgICAgICAgIGlmICghX19tb3VudChmc3RhYltpXS5ibGtfZGV2aWNlLCBmc3RhYltpXS5tb3VudF9wb2ludCwgZnN0YWJbaV0sIHJlYWRfb25seSkpIHsKICAgICAgICAgICAgICAgICAqYXR0ZW1wdGVkX2lkeCA9IGk7CiAgICAgICAgICAgICAgICAgbW91bnRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgaWYgKGkgIT0gc3RhcnRfaWR4KSB7CkBAIC0xMDQ2LDEwICsxMDcyLDYgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBib29sIHNob3VsZF91c2VfbWV0YWRhdGFfZW5jcnlwdGlvbihjb25zdCBGc3RhYkVudHJ5JiBlbnRyeSkgewotICAgIHJldHVybiAhZW50cnkubWV0YWRhdGFfa2V5X2Rpci5lbXB0eSgpICYmIGVudHJ5LmZzX21ncl9mbGFncy5maWxlX2VuY3J5cHRpb247Ci19Ci0KIC8vIENoZWNrIHRvIHNlZSBpZiBhIG1vdW50YWJsZSB2b2x1bWUgaGFzIGVuY3J5cHRpb24gcmVxdWlyZW1lbnRzCiBzdGF0aWMgaW50IGhhbmRsZV9lbmNyeXB0YWJsZShjb25zdCBGc3RhYkVudHJ5JiBlbnRyeSkgewogICAgIGlmIChzaG91bGRfdXNlX21ldGFkYXRhX2VuY3J5cHRpb24oZW50cnkpKSB7CkBAIC0xMTE5LDggKzExNDEsMTEgQEAKIAogY2xhc3MgQ2hlY2twb2ludE1hbmFnZXIgewogICBwdWJsaWM6Ci0gICAgQ2hlY2twb2ludE1hbmFnZXIoaW50IG5lZWRzX2NoZWNrcG9pbnQgPSAtMSwgYm9vbCBtZXRhZGF0YV9lbmNyeXB0ZWQgPSBmYWxzZSkKLSAgICAgICAgOiBuZWVkc19jaGVja3BvaW50XyhuZWVkc19jaGVja3BvaW50KSwgbWV0YWRhdGFfZW5jcnlwdGVkXyhtZXRhZGF0YV9lbmNyeXB0ZWQpIHt9CisgICAgQ2hlY2twb2ludE1hbmFnZXIoaW50IG5lZWRzX2NoZWNrcG9pbnQgPSAtMSwgYm9vbCBtZXRhZGF0YV9lbmNyeXB0ZWQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRzX2VuY3J5cHQgPSBmYWxzZSkKKyAgICAgICAgOiBuZWVkc19jaGVja3BvaW50XyhuZWVkc19jaGVja3BvaW50KSwKKyAgICAgICAgICBtZXRhZGF0YV9lbmNyeXB0ZWRfKG1ldGFkYXRhX2VuY3J5cHRlZCksCisgICAgICAgICAgbmVlZHNfZW5jcnlwdF8obmVlZHNfZW5jcnlwdCkge30KIAogICAgIGJvb2wgTmVlZHNDaGVja3BvaW50KCkgewogICAgICAgICBpZiAobmVlZHNfY2hlY2twb2ludF8gIT0gVU5LTk9XTikgewpAQCAtMTE4Myw3ICsxMjA4LDcgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgTEVSUk9SIDw8IGVudHJ5LT5mc190eXBlIDw8ICIgZG9lcyBub3QgaW1wbGVtZW50IGNoZWNrcG9pbnRzLiI7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZW50cnktPmZzX21ncl9mbGFncy5jaGVja3BvaW50X2JsaykgeworICAgICAgICB9IGVsc2UgaWYgKGVudHJ5LT5mc19tZ3JfZmxhZ3MuY2hlY2twb2ludF9ibGsgJiYgIW5lZWRzX2VuY3J5cHRfKSB7CiAgICAgICAgICAgICBhdXRvIGFjdHVhbF9ibG9ja19kZXZpY2UgPSBibG9ja19kZXZpY2UuZW1wdHkoKSA/IGVudHJ5LT5ibGtfZGV2aWNlIDogYmxvY2tfZGV2aWNlOwogICAgICAgICAgICAgaWYgKGZzX21ncl9maW5kX2Jvd19kZXZpY2UoYWN0dWFsX2Jsb2NrX2RldmljZSkuZW1wdHkoKSkgewogICAgICAgICAgICAgICAgIHVuaXF1ZV9mZCBmZCgKQEAgLTEyNTEsMjEgKzEyNzYsMzIgQEAKICAgICBlbnVtIHsgVU5LTk9XTiA9IC0xLCBOTyA9IDAsIFlFUyA9IDEgfTsKICAgICBpbnQgbmVlZHNfY2hlY2twb2ludF87CiAgICAgYm9vbCBtZXRhZGF0YV9lbmNyeXB0ZWRfOworICAgIGJvb2wgbmVlZHNfZW5jcnlwdF87CiAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBkZXZpY2VfbWFwXzsKIH07CiAKIHN0ZDo6c3RyaW5nIGZzX21ncl9maW5kX2Jvd19kZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIGJsb2NrX2RldmljZSkgewotICAgIGlmIChibG9ja19kZXZpY2Uuc3Vic3RyKDAsIDUpICE9ICIvZGV2LyIpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiRXhwZWN0ZWQgYmxvY2sgZGV2aWNlLCBnb3QgIiA8PCBibG9ja19kZXZpY2U7Ci0gICAgICAgIHJldHVybiBzdGQ6OnN0cmluZygpOworICAgIC8vIGhhbmRsZSBzeW1saW5rIHN1Y2ggYXMgIi9kZXYvYmxvY2svbWFwcGVyL3VzZXJkYXRhIgorICAgIHN0ZDo6c3RyaW5nIHJlYWxfcGF0aDsKKyAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlYWxwYXRoKGJsb2NrX2RldmljZSwgJnJlYWxfcGF0aCkpIHsKKyAgICAgICAgcmVhbF9wYXRoID0gYmxvY2tfZGV2aWNlOwogICAgIH0KIAotICAgIHN0ZDo6c3RyaW5nIHN5c19kaXIgPSBzdGQ6OnN0cmluZygiL3N5cy8iKSArIGJsb2NrX2RldmljZS5zdWJzdHIoNSk7Ci0KKyAgICBzdHJ1Y3Qgc3RhdCBzdDsKKyAgICBpZiAoc3RhdChyZWFsX3BhdGguY19zdHIoKSwgJnN0KSA8IDApIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgInN0YXQgZmFpbGVkOiAiIDw8IHJlYWxfcGF0aDsKKyAgICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7CisgICAgfQorICAgIGlmICghU19JU0JMSyhzdC5zdF9tb2RlKSkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCByZWFsX3BhdGggPDwgIiBpcyBub3QgYmxvY2sgZGV2aWNlIjsKKyAgICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHN5c19kaXIgPSBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoIi9zeXMvZGV2L2Jsb2NrLyV1OiV1IiwgbWFqb3Ioc3Quc3RfcmRldiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5vcihzdC5zdF9yZGV2KSk7CiAgICAgZm9yICg7OykgewogICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOwogICAgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmcoc3lzX2RpciArICIvZG0vbmFtZSIsICZuYW1lKSkgewotICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgYmxvY2tfZGV2aWNlIDw8ICIgaXMgbm90IGRtIGRldmljZSI7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCByZWFsX3BhdGggPDwgIiBpcyBub3QgZG0gZGV2aWNlIjsKICAgICAgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZygpOwogICAgICAgICB9CiAKQEAgLTEzODQsMjEgKzE0MjAsNjMgQEAKICAgICByZXR1cm4gR2V0RW50cnlGb3JNb3VudFBvaW50KCZmc3RhYiwgbW91bnRfcG9pbnQpICE9IG51bGxwdHI7CiB9CiAKK3N0ZDo6c3RyaW5nIGZzX21ncl9tZXRhZGF0YV9lbmNyeXB0aW9uX2luX3Byb2dyZXNzX2ZpbGVfbmFtZShjb25zdCBGc3RhYkVudHJ5JiBlbnRyeSkgeworICAgIHJldHVybiBlbnRyeS5tZXRhZGF0YV9rZXlfZGlyICsgIi9pbl9wcm9ncmVzcyI7Cit9CisKK2Jvb2wgV2FzTWV0YWRhdGFFbmNyeXB0aW9uSW50ZXJydXB0ZWQoY29uc3QgRnN0YWJFbnRyeSYgZW50cnkpIHsKKyAgICBpZiAoIXNob3VsZF91c2VfbWV0YWRhdGFfZW5jcnlwdGlvbihlbnRyeSkpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gYWNjZXNzKGZzX21ncl9tZXRhZGF0YV9lbmNyeXB0aW9uX2luX3Byb2dyZXNzX2ZpbGVfbmFtZShlbnRyeSkuY19zdHIoKSwgUl9PSykgPT0gMDsKK30KKworc3RhdGljIEZzdGFiRW50cnkqIExvY2F0ZUZvcm1hdHRhYmxlRW50cnkoRnN0YWJFbnRyeSogY29uc3QgYmVnaW4sIEZzdGFiRW50cnkqIGNvbnN0IGVuZCkgeworICAgIGlmIChiZWdpbiA9PSBlbmQpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNvbnN0IGJvb2wgZGV2X29wdGlvbl9lbmFibGVkID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OkdldEJvb2xQcm9wZXJ0eSgicm8ucHJvZHVjdC5idWlsZC4xNmtfcGFnZS5lbmFibGVkIiwgZmFsc2UpOworICAgIEZzdGFiRW50cnkqIGYyZnNfZW50cnkgPSBudWxscHRyOworICAgIGZvciAoYXV0byBpdGVyID0gYmVnaW47IGl0ZXIgIT0gZW5kICYmIGl0ZXItPmJsa19kZXZpY2UgPT0gYmVnaW4tPmJsa19kZXZpY2U7IGl0ZXIrKykgeworICAgICAgICBpZiAoaXRlci0+ZnNfbWdyX2ZsYWdzLmZvcm1hdHRhYmxlKSB7CisgICAgICAgICAgICBpZiAoZ2V0cGFnZXNpemUoKSAhPSA0MDk2ICYmIGlzX2YyZnMoaXRlci0+ZnNfdHlwZSkgJiYgZGV2X29wdGlvbl9lbmFibGVkKSB7CisgICAgICAgICAgICAgICAgZjJmc19lbnRyeSA9IGl0ZXI7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZjJmc19lbnRyeSkgeworICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiU2tpcHBpbmcgRjJGUyBmb3JtYXQgZm9yIGJsb2NrIGRldmljZSAiIDw8IGl0ZXItPmJsa19kZXZpY2UgPDwgIiBAICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaXRlci0+bW91bnRfcG9pbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBpbiBub24tNEsgbW9kZSBmb3IgZGV2IG9wdGlvbiBlbmFibGVkIGRldmljZXMsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFzIHRoZXNlIGRldmljZXMgbmVlZCB0byB0b2dnbGUgYmV0d2VlbiA0Sy8xNksgbW9kZSwgYW5kIEYyRlMgZG9lcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3Qgc3VwcG9ydCBwYWdlX3NpemUgIT0gYmxvY2tfc2l6ZSBjb25maWd1cmF0aW9uLiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaXRlcjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZjJmc19lbnRyeSkgeworICAgICAgICBMT0coSU5GTykgPDwgIlVzaW5nIEYyRlMgZm9yICIgPDwgZjJmc19lbnRyeS0+YmxrX2RldmljZSA8PCAiIEAgIiA8PCBmMmZzX2VudHJ5LT5tb3VudF9wb2ludAorICAgICAgICAgICAgICAgICAgPDwgIiBldmVuIHRob3VnaCB3ZSBhcmUgaW4gbm9uLTRLIG1vZGUuIERldmljZSBtaWdodCByZXF1aXJlIGEgZGF0YSB3aXBlIGFmdGVyICIKKyAgICAgICAgICAgICAgICAgICAgICJnb2luZyBiYWNrIHRvIDRLIG1vZGUsIGFzIEYyRlMgZG9lcyBub3Qgc3VwcG9ydCBwYWdlX3NpemUgIT0gYmxvY2tfc2l6ZSI7CisgICAgfQorICAgIHJldHVybiBmMmZzX2VudHJ5OworfQorCiAvLyBXaGVuIG11bHRpcGxlIGZzdGFiIHJlY29yZHMgc2hhcmUgdGhlIHNhbWUgbW91bnRfcG9pbnQsIGl0IHdpbGwgdHJ5IHRvIG1vdW50IGVhY2gKIC8vIG9uZSBpbiB0dXJuLCBhbmQgaWdub3JlIGFueSBkdXBsaWNhdGVzIGFmdGVyIGEgZmlyc3Qgc3VjY2Vzc2Z1bCBtb3VudC4KIC8vIFJldHVybnMgLTEgb24gZXJyb3IsIGFuZCAgRlNfTUdSX01OVEFMTF8qIG90aGVyd2lzZS4KLU1vdW50QWxsUmVzdWx0IGZzX21ncl9tb3VudF9hbGwoRnN0YWIqIGZzdGFiLCBpbnQgbW91bnRfbW9kZSkgeworaW50IGZzX21ncl9tb3VudF9hbGwoRnN0YWIqIGZzdGFiLCBpbnQgbW91bnRfbW9kZSkgewogICAgIGludCBlbmNyeXB0YWJsZSA9IEZTX01HUl9NTlRBTExfREVWX05PVF9FTkNSWVBUQUJMRTsKICAgICBpbnQgZXJyb3JfY291bnQgPSAwOwogICAgIENoZWNrcG9pbnRNYW5hZ2VyIGNoZWNrcG9pbnRfbWFuYWdlcjsKICAgICBBdmJVbmlxdWVQdHIgYXZiX2hhbmRsZShudWxscHRyKTsKICAgICBib29sIHdpcGVkID0gZmFsc2U7Ci0KICAgICBib29sIHVzZXJkYXRhX21vdW50ZWQgPSBmYWxzZTsKKwogICAgIGlmIChmc3RhYi0+ZW1wdHkoKSkgewotICAgICAgICByZXR1cm4ge0ZTX01HUl9NTlRBTExfRkFJTCwgdXNlcmRhdGFfbW91bnRlZH07CisgICAgICAgIHJldHVybiBGU19NR1JfTU5UQUxMX0ZBSUw7CiAgICAgfQogCisgICAgYm9vbCBzY3JhdGNoX2Nhbl9iZV9tb3VudGVkID0gdHJ1ZTsKKwogICAgIC8vIEtlZXAgaSBpbnQgdG8gcHJldmVudCB1bnNpZ25lZCBpbnRlZ2VyIG92ZXJmbG93IGZyb20gKGkgPSB0b3BfaWR4IC0gMSksCiAgICAgLy8gd2hlcmUgdG9wX2lkeCBpcyAwLiBJdCB3aWxsIGdpdmUgU0lHQUJSVAogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhdGljX2Nhc3Q8aW50Pihmc3RhYi0+c2l6ZSgpKTsgaSsrKSB7CkBAIC0xNDczLDcgKzE1NTEsNyBAQAogICAgICAgICAgICAgICAgIGlmICghYXZiX2hhbmRsZSkgewogICAgICAgICAgICAgICAgICAgICBMRVJST1IgPDwgIkZhaWxlZCB0byBvcGVuIEF2YkhhbmRsZSI7CiAgICAgICAgICAgICAgICAgICAgIHNldF90eXBlX3Byb3BlcnR5KGVuY3J5cHRhYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtGU19NR1JfTU5UQUxMX0ZBSUwsIHVzZXJkYXRhX21vdW50ZWR9OworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRlNfTUdSX01OVEFMTF9GQUlMOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChhdmJfaGFuZGxlLT5TZXRVcEF2Ykhhc2h0cmVlKCZjdXJyZW50X2VudHJ5LCB0cnVlIC8qIHdhaXRfZm9yX3Zlcml0eV9kZXYgKi8pID09CkBAIC0xNDkyLDExICsxNTcwLDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpbnQgbGFzdF9pZHhfaW5zcGVjdGVkOwotICAgICAgICBpbnQgdG9wX2lkeCA9IGk7CisgICAgICAgIGludCBsYXN0X2lkeF9pbnNwZWN0ZWQgPSAtMTsKKyAgICAgICAgY29uc3QgaW50IHRvcF9pZHggPSBpOwogICAgICAgICBpbnQgYXR0ZW1wdGVkX2lkeCA9IC0xOwogCi0gICAgICAgIGJvb2wgbXJldCA9IG1vdW50X3dpdGhfYWx0ZXJuYXRpdmVzKCpmc3RhYiwgaSwgJmxhc3RfaWR4X2luc3BlY3RlZCwgJmF0dGVtcHRlZF9pZHgpOworICAgICAgICBib29sIGVuY3J5cHRpb25faW50ZXJydXB0ZWQgPSBXYXNNZXRhZGF0YUVuY3J5cHRpb25JbnRlcnJ1cHRlZChjdXJyZW50X2VudHJ5KTsKKyAgICAgICAgYm9vbCBtcmV0ID0gbW91bnRfd2l0aF9hbHRlcm5hdGl2ZXMoKmZzdGFiLCBpLCBlbmNyeXB0aW9uX2ludGVycnVwdGVkLCAmbGFzdF9pZHhfaW5zcGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0ZW1wdGVkX2lkeCk7CiAgICAgICAgIGF1dG8mIGF0dGVtcHRlZF9lbnRyeSA9ICgqZnN0YWIpW2F0dGVtcHRlZF9pZHhdOwogICAgICAgICBpID0gbGFzdF9pZHhfaW5zcGVjdGVkOwogICAgICAgICBpbnQgbW91bnRfZXJybm8gPSBlcnJubzsKQEAgLTE1MDcsNyArMTU4Nyw3IEBACiAKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRlNfTUdSX01OVEFMTF9GQUlMKSB7CiAgICAgICAgICAgICAgICAgLy8gRmF0YWwgZXJyb3IgLSBubyBwb2ludCBjb250aW51aW5nLgotICAgICAgICAgICAgICAgIHJldHVybiB7c3RhdHVzLCB1c2VyZGF0YV9tb3VudGVkfTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEZTX01HUl9NTlRBTExfREVWX05PVF9FTkNSWVBUQUJMRSkgewpAQCAtMTUxNywxMyArMTU5NywxOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbmNyeXB0YWJsZSA9IHN0YXR1czsKICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IEZTX01HUl9NTlRBTExfREVWX05FRURTX01FVEFEQVRBX0VOQ1JZUFRJT04pIHsKKyAgICAgICAgICAgICAgICAgICAgZnNfbWdyX3NldF9ibGtfcm8oYXR0ZW1wdGVkX2VudHJ5LmJsa19kZXZpY2UsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYWxsX3ZkYyh7ImNyeXB0ZnMiLCAiZW5jcnlwdEZzdGFiIiwgYXR0ZW1wdGVkX2VudHJ5LmJsa19kZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHRlZF9lbnRyeS5tb3VudF9wb2ludCwgd2lwZWQgPyAidHJ1ZSIgOiAiZmFsc2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0ZWRfZW50cnkuZnNfdHlwZSwgYXR0ZW1wdGVkX2VudHJ5LnpvbmVkX2RldmljZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHRlZF9lbnRyeS5mc190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0ZWRfZW50cnkuZnNfbWdyX2ZsYWdzLmlzX3pvbmVkID8gInRydWUiIDogImZhbHNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp0b19zdHJpbmcoYXR0ZW1wdGVkX2VudHJ5Lmxlbmd0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OkpvaW4oYXR0ZW1wdGVkX2VudHJ5LnVzZXJfZGV2aWNlcywgJyAnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6Sm9pbihhdHRlbXB0ZWRfZW50cnkuZGV2aWNlX2FsaWFzZWQsICcgJyl9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBMRVJST1IgPDwgIkVuY3J5cHRpb24gZmFpbGVkIjsKICAgICAgICAgICAgICAgICAgICAgICAgIHNldF90eXBlX3Byb3BlcnR5KGVuY3J5cHRhYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7RlNfTUdSX01OVEFMTF9GQUlMLCB1c2VyZGF0YV9tb3VudGVkfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGU19NR1JfTU5UQUxMX0ZBSUw7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xNTMxLDIwICsxNjE2LDI5IEBACiAgICAgICAgICAgICBpZiAoY3VycmVudF9lbnRyeS5tb3VudF9wb2ludCA9PSAiL2RhdGEiKSB7CiAgICAgICAgICAgICAgICAgdXNlcmRhdGFfbW91bnRlZCA9IHRydWU7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE1vdW50T3ZlcmxheWZzKGF0dGVtcHRlZF9lbnRyeSwgJnNjcmF0Y2hfY2FuX2JlX21vdW50ZWQpOworCiAgICAgICAgICAgICAvLyBTdWNjZXNzISAgR28gZ2V0IHRoZSBuZXh0IG9uZS4KICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0KKyAgICAgICAgYXV0byBmb3JtYXR0YWJsZV9lbnRyeSA9CisgICAgICAgICAgICAgICAgTG9jYXRlRm9ybWF0dGFibGVFbnRyeShmc3RhYi0+ZGF0YSgpICsgdG9wX2lkeCwgZnN0YWItPmRhdGEoKSArIGZzdGFiLT5zaXplKCkpOwogICAgICAgICAvLyBNb3VudGluZyBmYWlsZWQsIHVuZGVyc3RhbmQgd2h5IGFuZCByZXRyeS4KICAgICAgICAgd2lwZWQgPSBwYXJ0aXRpb25fd2lwZWQoY3VycmVudF9lbnRyeS5ibGtfZGV2aWNlLmNfc3RyKCkpOwogICAgICAgICBpZiAobW91bnRfZXJybm8gIT0gRUJVU1kgJiYgbW91bnRfZXJybm8gIT0gRUFDQ0VTICYmCi0gICAgICAgICAgICBjdXJyZW50X2VudHJ5LmZzX21ncl9mbGFncy5mb3JtYXR0YWJsZSAmJiB3aXBlZCkgeworICAgICAgICAgICAgY3VycmVudF9lbnRyeS5mc19tZ3JfZmxhZ3MuZm9ybWF0dGFibGUgJiYgKHdpcGVkIHx8IGVuY3J5cHRpb25faW50ZXJydXB0ZWQpKSB7CiAgICAgICAgICAgICAvLyBjdXJyZW50X2VudHJ5IGFuZCBhdHRlbXB0ZWRfZW50cnkgcG9pbnQgYXQgdGhlIHNhbWUgcGFydGl0aW9uLCBidXQgc29tZXRpbWVzCiAgICAgICAgICAgICAvLyBhdCB0d28gZGlmZmVyZW50IGxpbmVzIGluIHRoZSBmc3RhYi4gIFVzZSBjdXJyZW50X2VudHJ5IGZvciBmb3JtYXR0aW5nCiAgICAgICAgICAgICAvLyBhcyB0aGF0IGlzIHRoZSBwcmVmZXJyZWQgb25lLgotICAgICAgICAgICAgTEVSUk9SIDw8IF9fRlVOQ1RJT05fXyA8PCAiKCk6ICIgPDwgcmVhbHBhdGgoY3VycmVudF9lbnRyeS5ibGtfZGV2aWNlKQotICAgICAgICAgICAgICAgICAgIDw8ICIgaXMgd2lwZWQgYW5kICIgPDwgY3VycmVudF9lbnRyeS5tb3VudF9wb2ludCA8PCAiICIgPDwgY3VycmVudF9lbnRyeS5mc190eXBlCi0gICAgICAgICAgICAgICAgICAgPDwgIiBpcyBmb3JtYXR0YWJsZS4gRm9ybWF0IGl0LiI7CisgICAgICAgICAgICBpZiAod2lwZWQpCisgICAgICAgICAgICAgICAgTEVSUk9SIDw8IF9fRlVOQ1RJT05fXyA8PCAiKCk6ICIgPDwgcmVhbHBhdGgoY3VycmVudF9lbnRyeS5ibGtfZGV2aWNlKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGlzIHdpcGVkIGFuZCAiIDw8IGN1cnJlbnRfZW50cnkubW91bnRfcG9pbnQgPDwgIiAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGN1cnJlbnRfZW50cnkuZnNfdHlwZSA8PCAiIGlzIGZvcm1hdHRhYmxlLiBGb3JtYXQgaXQuIjsKKyAgICAgICAgICAgIGlmIChlbmNyeXB0aW9uX2ludGVycnVwdGVkKQorICAgICAgICAgICAgICAgIExFUlJPUiA8PCBfX0ZVTkNUSU9OX18gPDwgIigpOiAiIDw8IHJlYWxwYXRoKGN1cnJlbnRfZW50cnkuYmxrX2RldmljZSkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiB3YXMgaW50ZXJydXB0ZWQgZHVyaW5nIGVuY3J5cHRpb24gYW5kICIgPDwgY3VycmVudF9lbnRyeS5tb3VudF9wb2ludAorICAgICAgICAgICAgICAgICAgICAgICA8PCAiICIgPDwgY3VycmVudF9lbnRyeS5mc190eXBlIDw8ICIgaXMgZm9ybWF0dGFibGUuIEZvcm1hdCBpdC4iOwogCiAgICAgICAgICAgICBjaGVja3BvaW50X21hbmFnZXIuUmV2ZXJ0KCZjdXJyZW50X2VudHJ5KTsKIApAQCAtMTU1Nyw5ICsxNjUxLDEzIEBACiAgICAgICAgICAgICAgICAgZW5jcnlwdGFibGUgPSBGU19NR1JfTU5UQUxMX0RFVl9JU19NRVRBREFUQV9FTkNSWVBURUQ7CiAgICAgICAgICAgICAgICAgc2V0X3R5cGVfcHJvcGVydHkoZW5jcnlwdGFibGUpOwogCi0gICAgICAgICAgICAgICAgaWYgKCFjYWxsX3ZkYyh7ImNyeXB0ZnMiLCAiZW5jcnlwdEZzdGFiIiwgY3VycmVudF9lbnRyeS5ibGtfZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfZW50cnkubW91bnRfcG9pbnQsICJ0cnVlIiAvKiBzaG91bGRGb3JtYXQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9lbnRyeS5mc190eXBlLCBjdXJyZW50X2VudHJ5LnpvbmVkX2RldmljZX0sCisgICAgICAgICAgICAgICAgaWYgKCFjYWxsX3ZkYyh7ImNyeXB0ZnMiLCAiZW5jcnlwdEZzdGFiIiwgZm9ybWF0dGFibGVfZW50cnktPmJsa19kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGFibGVfZW50cnktPm1vdW50X3BvaW50LCAidHJ1ZSIgLyogc2hvdWxkRm9ybWF0ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRhYmxlX2VudHJ5LT5mc190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRhYmxlX2VudHJ5LT5mc19tZ3JfZmxhZ3MuaXNfem9uZWQgPyAidHJ1ZSIgOiAiZmFsc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKGZvcm1hdHRhYmxlX2VudHJ5LT5sZW5ndGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OkpvaW4oZm9ybWF0dGFibGVfZW50cnktPnVzZXJfZGV2aWNlcywgJyAnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpKb2luKGZvcm1hdHRhYmxlX2VudHJ5LT5kZXZpY2VfYWxpYXNlZCwgJyAnKX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKSkgewogICAgICAgICAgICAgICAgICAgICBMRVJST1IgPDwgIkVuY3J5cHRpb24gZmFpbGVkIjsKICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTU2OCw3ICsxNjY2LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChmc19tZ3JfZG9fZm9ybWF0KGN1cnJlbnRfZW50cnkpID09IDApIHsKKyAgICAgICAgICAgIGlmIChmc19tZ3JfZG9fZm9ybWF0KCpmb3JtYXR0YWJsZV9lbnRyeSkgPT0gMCkgewogICAgICAgICAgICAgICAgIC8vIExldCdzIHJlcGxheSB0aGUgbW91bnQgYWN0aW9ucy4KICAgICAgICAgICAgICAgICBpID0gdG9wX2lkeCAtIDE7CiAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC0xNTgxLDEwICsxNjc5LDEyIEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBtb3VudCgyKSByZXR1cm5lZCBhbiBlcnJvciwgaGFuZGxlIHRoZSBlbmNyeXB0YWJsZS9mb3JtYXR0YWJsZSBjYXNlLgotICAgICAgICBpZiAobW91bnRfZXJybm8gIT0gRUJVU1kgJiYgbW91bnRfZXJybm8gIT0gRUFDQ0VTICYmCisgICAgICAgIGlmIChtb3VudF9lcnJubyAhPSBFQlVTWSAmJiBtb3VudF9lcnJubyAhPSBFQUNDRVMgJiYgIWVuY3J5cHRpb25faW50ZXJydXB0ZWQgJiYKICAgICAgICAgICAgIHNob3VsZF91c2VfbWV0YWRhdGFfZW5jcnlwdGlvbihhdHRlbXB0ZWRfZW50cnkpKSB7CiAgICAgICAgICAgICBpZiAoIWNhbGxfdmRjKHsiY3J5cHRmcyIsICJtb3VudEZzdGFiIiwgYXR0ZW1wdGVkX2VudHJ5LmJsa19kZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0ZWRfZW50cnkubW91bnRfcG9pbnQsIGF0dGVtcHRlZF9lbnRyeS56b25lZF9kZXZpY2V9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdGVkX2VudHJ5Lm1vdW50X3BvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9lbnRyeS5mc19tZ3JfZmxhZ3MuaXNfem9uZWQgPyAidHJ1ZSIgOiAiZmFsc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6Sm9pbihjdXJyZW50X2VudHJ5LnVzZXJfZGV2aWNlcywgJyAnKX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpKSB7CiAgICAgICAgICAgICAgICAgKytlcnJvcl9jb3VudDsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudF9lbnRyeS5tb3VudF9wb2ludCA9PSAiL2RhdGEiKSB7CkBAIC0xNTk3LDEzICsxNjk3LDEzIEBACiAgICAgICAgICAgICAvLyBVc2UgU3RyaW5nUHJpbnRmIHRvIG91dHB1dCAiKG51bGwpIiBpbnN0ZWFkLgogICAgICAgICAgICAgaWYgKGF0dGVtcHRlZF9lbnRyeS5mc19tZ3JfZmxhZ3Mubm9fZmFpbCkgewogICAgICAgICAgICAgICAgIFBFUlJPUiA8PCBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgICAgICAgICAiSWdub3JpbmcgZmFpbHVyZSB0byBtb3VudCBhbiB1bi1lbmNyeXB0YWJsZSBvciB3aXBlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiSWdub3JpbmcgZmFpbHVyZSB0byBtb3VudCBhbiB1bi1lbmNyeXB0YWJsZSwgaW50ZXJydXB0ZWQsIG9yIHdpcGVkICIKICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJ0aXRpb24gb24gJXMgYXQgJXMgb3B0aW9uczogJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdGVkX2VudHJ5LmJsa19kZXZpY2UuY19zdHIoKSwgYXR0ZW1wdGVkX2VudHJ5Lm1vdW50X3BvaW50LmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0ZWRfZW50cnkuZnNfb3B0aW9ucy5jX3N0cigpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgUEVSUk9SIDw8IGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gbW91bnQgYW4gdW4tZW5jcnlwdGFibGUgb3Igd2lwZWQgcGFydGl0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gbW91bnQgYW4gdW4tZW5jcnlwdGFibGUsIGludGVycnVwdGVkLCBvciB3aXBlZCBwYXJ0aXRpb24gIgogICAgICAgICAgICAgICAgICAgICAgICAgIm9uICVzIGF0ICVzIG9wdGlvbnM6ICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHRlZF9lbnRyeS5ibGtfZGV2aWNlLmNfc3RyKCksIGF0dGVtcHRlZF9lbnRyeS5tb3VudF9wb2ludC5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdGVkX2VudHJ5LmZzX29wdGlvbnMuY19zdHIoKSk7CkBAIC0xNjEyLDE3ICsxNzEyLDI2IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgIH0KKyAgICBpZiAodXNlcmRhdGFfbW91bnRlZCkgeworICAgICAgICBGc3RhYiBtb3VudGVkX2ZzdGFiOworICAgICAgICBpZiAoIVJlYWRGc3RhYkZyb21GaWxlKCIvcHJvYy9tb3VudHMiLCAmbW91bnRlZF9mc3RhYikpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNvdWxkJ3QgbG9hZCBmc3RhYiBmcm9tIC9wcm9jL21vdW50cyAsIHVuYWJsZSB0byBzZXQgcm8uZnN0eXBlLmRhdGEgLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpbml0LnJjIGFjdGlvbnMgZGVwZW5kaW5nIG9uIHRoaXMgcHJvcCB3b3VsZCBub3QgcnVuLCBib290IG1pZ2h0IGZhaWwuIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBtb3VudGVkX2ZzdGFiKSB7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5Lm1vdW50X3BvaW50ID09ICIvZGF0YSIpIHsKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6U2V0UHJvcGVydHkoInJvLmZzdHlwZS5kYXRhIiwgZW50cnkuZnNfdHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCiAgICAgc2V0X3R5cGVfcHJvcGVydHkoZW5jcnlwdGFibGUpOwogCi0jaWYgQUxMT1dfQURCRF9ESVNBQkxFX1ZFUklUWSA9PSAxICAvLyAidXNlcmRlYnVnIiBidWlsZAotICAgIGZzX21ncl9vdmVybGF5ZnNfbW91bnRfYWxsKGZzdGFiKTsKLSNlbmRpZgotCiAgICAgaWYgKGVycm9yX2NvdW50KSB7Ci0gICAgICAgIHJldHVybiB7RlNfTUdSX01OVEFMTF9GQUlMLCB1c2VyZGF0YV9tb3VudGVkfTsKKyAgICAgICAgcmV0dXJuIEZTX01HUl9NTlRBTExfRkFJTDsKICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4ge2VuY3J5cHRhYmxlLCB1c2VyZGF0YV9tb3VudGVkfTsKKyAgICAgICAgcmV0dXJuIGVuY3J5cHRhYmxlOwogICAgIH0KIH0KIApAQCAtMTY1OSwxOTAgKzE3NjgsNiBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIEdldE1pbGxpc1Byb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBkZWZhdWx0X3ZhbHVlKSB7Ci0gICAgYXV0byB2YWx1ZSA9IEdldFVpbnRQcm9wZXJ0eShuYW1lLCBzdGF0aWNfY2FzdDx1aW50NjRfdD4oZGVmYXVsdF92YWx1ZS5jb3VudCgpKSk7Ci0gICAgcmV0dXJuIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoc3RkOjptb3ZlKHZhbHVlKSk7Ci19Ci0KLXN0YXRpYyBib29sIGZzX21ncl91bm1vdW50X2FsbF9kYXRhX21vdW50cyhjb25zdCBzdGQ6OnN0cmluZyYgZGF0YV9ibG9ja19kZXZpY2UpIHsKLSAgICBMSU5GTyA8PCBfX0ZVTkNUSU9OX18gPDwgIigpOiBhYm91dCB0byB1bW91bnQgZXZlcnl0aGluZyBvbiB0b3Agb2YgIiA8PCBkYXRhX2Jsb2NrX2RldmljZTsKLSAgICBUaW1lciB0OwotICAgIGF1dG8gdGltZW91dCA9IEdldE1pbGxpc1Byb3BlcnR5KCJpbml0LnVzZXJzcGFjZV9yZWJvb3QudXNlcmRhdGFfcmVtb3VudC50aW1lb3V0bWlsbGlzIiwgNXMpOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIGJvb2wgdW1vdW50X2RvbmUgPSB0cnVlOwotICAgICAgICBGc3RhYiBwcm9jX21vdW50czsKLSAgICAgICAgaWYgKCFSZWFkRnN0YWJGcm9tRmlsZSgiL3Byb2MvbW91bnRzIiwgJnByb2NfbW91bnRzKSkgewotICAgICAgICAgICAgTEVSUk9SIDw8IF9fRlVOQ1RJT05fXyA8PCAiKCk6IENhbid0IHJlYWQgL3Byb2MvbW91bnRzIjsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAvLyBOb3cgcHJvY2VlZCB3aXRoIG90aGVyIGJpbmQgbW91bnRzIG9uIHRvcCBvZiAvZGF0YS4KLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBlbnRyeSA6IHByb2NfbW91bnRzKSB7Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZyBibG9ja19kZXZpY2U7Ci0gICAgICAgICAgICBpZiAoU3RhcnRzV2l0aChlbnRyeS5ibGtfZGV2aWNlLCAiL2Rldi9ibG9jayIpICYmCi0gICAgICAgICAgICAgICAgIVJlYWxwYXRoKGVudHJ5LmJsa19kZXZpY2UsICZibG9ja19kZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgUFdBUk5JTkcgPDwgX19GVU5DVElPTl9fIDw8ICIoKTogZmFpbGVkIHRvIHJlYWxwYXRoICIgPDwgZW50cnkuYmxrX2RldmljZTsKLSAgICAgICAgICAgICAgICBibG9ja19kZXZpY2UgPSBlbnRyeS5ibGtfZGV2aWNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRhdGFfYmxvY2tfZGV2aWNlID09IGJsb2NrX2RldmljZSkgewotICAgICAgICAgICAgICAgIGlmICh1bW91bnQyKGVudHJ5Lm1vdW50X3BvaW50LmNfc3RyKCksIDApICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgUEVSUk9SIDw8IF9fRlVOQ1RJT05fXyA8PCAiKCk6IEZhaWxlZCB0byB1bW91bnQgIiA8PCBlbnRyeS5tb3VudF9wb2ludDsKLSAgICAgICAgICAgICAgICAgICAgdW1vdW50X2RvbmUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVtb3VudF9kb25lKSB7Ci0gICAgICAgICAgICBMSU5GTyA8PCBfX0ZVTkNUSU9OX18gPDwgIigpOiBVbm1vdW50aW5nIC9kYXRhIHRvb2sgIiA8PCB0OwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHQuZHVyYXRpb24oKSA+IHRpbWVvdXQpIHsKLSAgICAgICAgICAgIExFUlJPUiA8PCBfX0ZVTkNUSU9OX18gPDwgIigpOiBUaW1lZCBvdXQgdW5tb3VudGluZyBhbGwgbW91bnRzIG9uICIKLSAgICAgICAgICAgICAgICAgICA8PCBkYXRhX2Jsb2NrX2RldmljZTsKLSAgICAgICAgICAgIEZzdGFiIHJlbWFpbmluZ19tb3VudHM7Ci0gICAgICAgICAgICBpZiAoIVJlYWRGc3RhYkZyb21GaWxlKCIvcHJvYy9tb3VudHMiLCAmcmVtYWluaW5nX21vdW50cykpIHsKLSAgICAgICAgICAgICAgICBMRVJST1IgPDwgX19GVU5DVElPTl9fIDw8ICIoKTogQ2FuJ3QgcmVhZCAvcHJvYy9tb3VudHMiOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMRVJST1IgPDwgX19GVU5DVElPTl9fIDw8ICIoKTogRm9sbG93aW5nIG1vdW50cyByZW1haW5pbmciOwotICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgZSA6IHJlbWFpbmluZ19tb3VudHMpIHsKLSAgICAgICAgICAgICAgICAgICAgTEVSUk9SIDw8IF9fRlVOQ1RJT05fXyA8PCAiKCk6IG1vdW50IHBvaW50OiAiIDw8IGUubW91bnRfcG9pbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgYmxvY2sgZGV2aWNlOiAiIDw8IGUuYmxrX2RldmljZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKDUwbXMpOwotICAgIH0KLX0KLQotc3RhdGljIGJvb2wgVW53aW5kRG1EZXZpY2VTdGFjayhjb25zdCBzdGQ6OnN0cmluZyYgYmxvY2tfZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGRtX3N0YWNrKSB7Ci0gICAgaWYgKCFTdGFydHNXaXRoKGJsb2NrX2RldmljZSwgIi9kZXYvYmxvY2svIikpIHsKLSAgICAgICAgTFdBUk5JTkcgPDwgYmxvY2tfZGV2aWNlIDw8ICIgaXMgbm90IGEgYmxvY2sgZGV2aWNlIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBzdGQ6OnN0cmluZyBjdXJyZW50ID0gYmxvY2tfZGV2aWNlOwotICAgIERldmljZU1hcHBlciYgZG0gPSBEZXZpY2VNYXBwZXI6Okluc3RhbmNlKCk7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgZG1fc3RhY2stPnB1c2hfYmFjayhjdXJyZW50KTsKLSAgICAgICAgaWYgKCFkbS5Jc0RtQmxvY2tEZXZpY2UoY3VycmVudCkpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGF1dG8gcGFyZW50ID0gZG0uR2V0UGFyZW50QmxvY2tEZXZpY2VCeVBhdGgoY3VycmVudCk7Ci0gICAgICAgIGlmICghcGFyZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgY3VycmVudCA9ICpwYXJlbnQ7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1Gc3RhYkVudHJ5KiBmc19tZ3JfZ2V0X21vdW50ZWRfZW50cnlfZm9yX3VzZXJkYXRhKEZzdGFiKiBmc3RhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRhdGFfYmxvY2tfZGV2aWNlKSB7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGRtX3N0YWNrOwotICAgIGlmICghVW53aW5kRG1EZXZpY2VTdGFjayhkYXRhX2Jsb2NrX2RldmljZSwgJmRtX3N0YWNrKSkgewotICAgICAgICBMRVJST1IgPDwgIkZhaWxlZCB0byB1bndpbmQgZG0tZGV2aWNlIHN0YWNrIGZvciAiIDw8IGRhdGFfYmxvY2tfZGV2aWNlOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gICAgZm9yIChhdXRvJiBlbnRyeSA6ICpmc3RhYikgewotICAgICAgICBpZiAoZW50cnkubW91bnRfcG9pbnQgIT0gIi9kYXRhIikgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgc3RkOjpzdHJpbmcgYmxvY2tfZGV2aWNlOwotICAgICAgICBpZiAoZW50cnkuZnNfbWdyX2ZsYWdzLmxvZ2ljYWwpIHsKLSAgICAgICAgICAgIGlmICghZnNfbWdyX3VwZGF0ZV9sb2dpY2FsX3BhcnRpdGlvbigmZW50cnkpKSB7Ci0gICAgICAgICAgICAgICAgTEVSUk9SIDw8ICJGYWlsZWQgdG8gdXBkYXRlIGxvZ2ljIHBhcnRpdGlvbiAiIDw8IGVudHJ5LmJsa19kZXZpY2U7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBibG9ja19kZXZpY2UgPSBlbnRyeS5ibGtfZGV2aWNlOwotICAgICAgICB9IGVsc2UgaWYgKCFSZWFscGF0aChlbnRyeS5ibGtfZGV2aWNlLCAmYmxvY2tfZGV2aWNlKSkgewotICAgICAgICAgICAgUFdBUk5JTkcgPDwgIkZhaWxlZCB0byByZWFscGF0aCAiIDw8IGVudHJ5LmJsa19kZXZpY2U7Ci0gICAgICAgICAgICBibG9ja19kZXZpY2UgPSBlbnRyeS5ibGtfZGV2aWNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdGQ6OmZpbmQoZG1fc3RhY2suYmVnaW4oKSwgZG1fc3RhY2suZW5kKCksIGJsb2NrX2RldmljZSkgIT0gZG1fc3RhY2suZW5kKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAmZW50cnk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgTEVSUk9SIDw8ICJEaWRuJ3QgZmluZCBlbnRyeSB0aGF0IHdhcyB1c2VkIHRvIG1vdW50IC9kYXRhIG9udG8gIiA8PCBkYXRhX2Jsb2NrX2RldmljZTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLX0KLQotLy8gVE9ETyhiLzE0Mzk3MDA0Myk6IHJldHVybiBkaWZmZXJlbnQgZXJyb3IgY29kZXMgYmFzZWQgb24gd2hpY2ggc3RlcCBmYWlsZWQuCi1pbnQgZnNfbWdyX3JlbW91bnRfdXNlcmRhdGFfaW50b19jaGVja3BvaW50aW5nKEZzdGFiKiBmc3RhYikgewotICAgIEZzdGFiIHByb2NfbW91bnRzOwotICAgIGlmICghUmVhZEZzdGFiRnJvbUZpbGUoIi9wcm9jL21vdW50cyIsICZwcm9jX21vdW50cykpIHsKLSAgICAgICAgTEVSUk9SIDw8ICJDYW4ndCByZWFkIC9wcm9jL21vdW50cyI7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgYXV0byBtb3VudGVkX2VudHJ5ID0gR2V0RW50cnlGb3JNb3VudFBvaW50KCZwcm9jX21vdW50cywgIi9kYXRhIik7Ci0gICAgaWYgKG1vdW50ZWRfZW50cnkgPT0gbnVsbHB0cikgewotICAgICAgICBMRVJST1IgPDwgIi9kYXRhIGlzIG5vdCBtb3VudGVkIjsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBzdGQ6OnN0cmluZyBibG9ja19kZXZpY2U7Ci0gICAgaWYgKCFSZWFscGF0aChtb3VudGVkX2VudHJ5LT5ibGtfZGV2aWNlLCAmYmxvY2tfZGV2aWNlKSkgewotICAgICAgICBQRVJST1IgPDwgIkZhaWxlZCB0byByZWFscGF0aCAiIDw8IG1vdW50ZWRfZW50cnktPmJsa19kZXZpY2U7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgYXV0byBmc3RhYl9lbnRyeSA9IGZzX21ncl9nZXRfbW91bnRlZF9lbnRyeV9mb3JfdXNlcmRhdGEoZnN0YWIsIGJsb2NrX2RldmljZSk7Ci0gICAgaWYgKGZzdGFiX2VudHJ5ID09IG51bGxwdHIpIHsKLSAgICAgICAgTEVSUk9SIDw8ICJDYW4ndCBmaW5kIC9kYXRhIGluIGZzdGFiIjsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBib29sIGZvcmNlX3Vtb3VudCA9IEdldEJvb2xQcm9wZXJ0eSgic3lzLmluaXQudXNlcmRhdGFfcmVtb3VudC5mb3JjZV91bW91bnQiLCBmYWxzZSk7Ci0gICAgaWYgKGZvcmNlX3Vtb3VudCkgewotICAgICAgICBMSU5GTyA8PCAiV2lsbCBmb3JjZSBhbiB1bW91bnQgb2YgdXNlcmRhdGEgZXZlbiBpZiBpdCdzIG5vdCByZXF1aXJlZCI7Ci0gICAgfQotICAgIGlmICghZm9yY2VfdW1vdW50ICYmICFTdXBwb3J0c0NoZWNrcG9pbnQoZnN0YWJfZW50cnkpKSB7Ci0gICAgICAgIExJTkZPIDw8ICJVc2VyZGF0YSBkb2Vzbid0IHN1cHBvcnQgY2hlY2twb2ludGluZy4gTm90aGluZyB0byBkbyI7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBDaGVja3BvaW50TWFuYWdlciBjaGVja3BvaW50X21hbmFnZXI7Ci0gICAgaWYgKCFmb3JjZV91bW91bnQgJiYgIWNoZWNrcG9pbnRfbWFuYWdlci5OZWVkc0NoZWNrcG9pbnQoKSkgewotICAgICAgICBMSU5GTyA8PCAiQ2hlY2twb2ludGluZyBub3QgbmVlZGVkLiBEb24ndCByZW1vdW50IjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmICghZm9yY2VfdW1vdW50ICYmIGZzdGFiX2VudHJ5LT5mc19tZ3JfZmxhZ3MuY2hlY2twb2ludF9mcykgewotICAgICAgICAvLyBVc2VyZGF0YSBpcyBmMmZzLCBzaW1wbHkgcmVtb3VudCBpdC4KLSAgICAgICAgaWYgKCFjaGVja3BvaW50X21hbmFnZXIuVXBkYXRlKGZzdGFiX2VudHJ5KSkgewotICAgICAgICAgICAgTEVSUk9SIDw8ICJGYWlsZWQgdG8gcmVtb3VudCB1c2VyZGF0YSBpbiBjaGVja3BvaW50aW5nIG1vZGUiOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtb3VudChibG9ja19kZXZpY2UuY19zdHIoKSwgZnN0YWJfZW50cnktPm1vdW50X3BvaW50LmNfc3RyKCksICJub25lIiwKLSAgICAgICAgICAgICAgICAgIE1TX1JFTU9VTlQgfCBmc3RhYl9lbnRyeS0+ZmxhZ3MsIGZzdGFiX2VudHJ5LT5mc19vcHRpb25zLmNfc3RyKCkpICE9IDApIHsKLSAgICAgICAgICAgIFBFUlJPUiA8PCAiRmFpbGVkIHRvIHJlbW91bnQgdXNlcmRhdGEgaW4gY2hlY2twb2ludGluZyBtb2RlIjsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIExJTkZPIDw8ICJVbm1vdW50aW5nIC9kYXRhIGJlZm9yZSByZW1vdW50aW5nIGludG8gY2hlY2twb2ludGluZyBtb2RlIjsKLSAgICAgICAgaWYgKCFmc19tZ3JfdW5tb3VudF9hbGxfZGF0YV9tb3VudHMoYmxvY2tfZGV2aWNlKSkgewotICAgICAgICAgICAgTEVSUk9SIDw8ICJGYWlsZWQgdG8gdW1vdW50IC9kYXRhIjsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBEZXZpY2VNYXBwZXImIGRtID0gRGV2aWNlTWFwcGVyOjpJbnN0YW5jZSgpOwotICAgICAgICB3aGlsZSAoZG0uSXNEbUJsb2NrRGV2aWNlKGJsb2NrX2RldmljZSkpIHsKLSAgICAgICAgICAgIGF1dG8gbmV4dF9kZXZpY2UgPSBkbS5HZXRQYXJlbnRCbG9ja0RldmljZUJ5UGF0aChibG9ja19kZXZpY2UpOwotICAgICAgICAgICAgYXV0byBuYW1lID0gZG0uR2V0RG1EZXZpY2VOYW1lQnlQYXRoKGJsb2NrX2RldmljZSk7Ci0gICAgICAgICAgICBpZiAoIW5hbWUpIHsKLSAgICAgICAgICAgICAgICBMRVJST1IgPDwgIkZhaWxlZCB0byBnZXQgZG0tbmFtZSBmb3IgIiA8PCBibG9ja19kZXZpY2U7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTElORk8gPDwgIkRlbGV0aW5nICIgPDwgYmxvY2tfZGV2aWNlIDw8ICIgbmFtZWQgIiA8PCAqbmFtZTsKLSAgICAgICAgICAgIGlmICghZG0uRGVsZXRlRGV2aWNlKCpuYW1lLCAzcykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW5leHRfZGV2aWNlKSB7Ci0gICAgICAgICAgICAgICAgTEVSUk9SIDw8ICJGYWlsZWQgdG8gZmluZCBwYXJlbnQgZGV2aWNlIGZvciAiIDw8IGJsb2NrX2RldmljZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJsb2NrX2RldmljZSA9ICpuZXh0X2RldmljZTsKLSAgICAgICAgfQotICAgICAgICBMSU5GTyA8PCAiUmVtb3VudGluZyAvZGF0YSI7Ci0gICAgICAgIC8vIFRPRE8oYi8xNDM5NzAwNDMpOiByZW1vdmUgdGhpcyBoYWNrIGFmdGVyIGZzX21ncl9tb3VudF9hbGwgaXMgcmVmYWN0b3JlZC4KLSAgICAgICAgYXV0byByZXN1bHQgPSBmc19tZ3JfbW91bnRfYWxsKGZzdGFiLCBNT1VOVF9NT0RFX09OTFlfVVNFUkRBVEEpOwotICAgICAgICByZXR1cm4gcmVzdWx0LmNvZGUgPT0gRlNfTUdSX01OVEFMTF9GQUlMID8gLTEgOiAwOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQogLy8gd3JhcHBlciB0byBfX21vdW50KCkgYW5kIGV4cGVjdHMgYSBmdWxseSBwcmVwYXJlZCBmc3RhYl9yZWMsCiAvLyB1bmxpa2UgZnNfbWdyX2RvX21vdW50IHdoaWNoIGRvZXMgbW9yZSB0aGluZ3Mgd2l0aCBhdmIgLyB2ZXJpdHkgZXRjLgogaW50IGZzX21ncl9kb19tb3VudF9vbmUoY29uc3QgRnN0YWJFbnRyeSYgZW50cnksIGNvbnN0IHN0ZDo6c3RyaW5nJiBhbHRfbW91bnRfcG9pbnQpIHsKQEAgLTE4NTcsMjggKzE3ODIsMjUgQEAKICAgICBpbnQgcmV0ID0gcHJlcGFyZV9mc19mb3JfbW91bnQoZW50cnkuYmxrX2RldmljZSwgZW50cnksIG1vdW50X3BvaW50KTsKICAgICAvLyBXaXBlZCBjYXNlIGRvZXNuJ3QgcmVxdWlyZSB0byB0cnkgX19tb3VudCBiZWxvdy4KICAgICBpZiAocmV0ICYgRlNfU1RBVF9JTlZBTElEX01BR0lDKSB7Ci0gICAgICByZXR1cm4gRlNfTUdSX0RPTU5UX0ZBSUxFRDsKKyAgICAgICAgcmV0dXJuIEZTX01HUl9ET01OVF9GQUlMRUQ7CiAgICAgfQogCiAgICAgcmV0ID0gX19tb3VudChlbnRyeS5ibGtfZGV2aWNlLCBtb3VudF9wb2ludCwgZW50cnkpOwogICAgIGlmIChyZXQpIHsKLSAgICAgIHJldCA9IChlcnJubyA9PSBFQlVTWSkgPyBGU19NR1JfRE9NTlRfQlVTWSA6IEZTX01HUl9ET01OVF9GQUlMRUQ7CisgICAgICAgIHJldCA9IChlcnJubyA9PSBFQlVTWSkgPyBGU19NR1JfRE9NTlRfQlVTWSA6IEZTX01HUl9ET01OVF9GQUlMRUQ7CiAgICAgfQogCiAgICAgcmV0dXJuIHJldDsKIH0KIAotLy8gSWYgdG1wX21vdW50X3BvaW50IGlzIG5vbi1udWxsLCBtb3VudCB0aGUgZmlsZXN5c3RlbSB0aGVyZS4gIFRoaXMgaXMgZm9yIHRoZQotLy8gdG1wIG1vdW50IHdlIGRvIHRvIGNoZWNrIHRoZSB1c2VyIHBhc3N3b3JkCiAvLyBJZiBtdWx0aXBsZSBmc3RhYiBlbnRyaWVzIGFyZSB0byBiZSBtb3VudGVkIG9uICJuX25hbWUiLCBpdCB3aWxsIHRyeSB0byBtb3VudCBlYWNoIG9uZQogLy8gaW4gdHVybiwgYW5kIHN0b3Agb24gMXN0IHN1Y2Nlc3MsIG9yIG5vIG1vcmUgbWF0Y2guCi1zdGF0aWMgaW50IGZzX21ncl9kb19tb3VudF9oZWxwZXIoRnN0YWIqIGZzdGFiLCBjb25zdCBzdGQ6OnN0cmluZyYgbl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuX2Jsa19kZXZpY2UsIGNvbnN0IGNoYXIqIHRtcF9tb3VudF9wb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmVlZHNfY2hlY2twb2ludCwgYm9vbCBtZXRhZGF0YV9lbmNyeXB0ZWQpIHsKK2ludCBmc19tZ3JfZG9fbW91bnQoRnN0YWIqIGZzdGFiLCBjb25zdCBzdGQ6OnN0cmluZyYgbl9uYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgbl9ibGtfZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICBpbnQgbmVlZHNfY2hlY2twb2ludCwgYm9vbCBuZWVkc19lbmNyeXB0KSB7CiAgICAgaW50IG1vdW50X2Vycm9ycyA9IDA7CiAgICAgaW50IGZpcnN0X21vdW50X2Vycm5vID0gMDsKICAgICBzdGQ6OnN0cmluZyBtb3VudF9wb2ludDsKLSAgICBDaGVja3BvaW50TWFuYWdlciBjaGVja3BvaW50X21hbmFnZXIobmVlZHNfY2hlY2twb2ludCwgbWV0YWRhdGFfZW5jcnlwdGVkKTsKKyAgICBDaGVja3BvaW50TWFuYWdlciBjaGVja3BvaW50X21hbmFnZXIobmVlZHNfY2hlY2twb2ludCwgdHJ1ZSwgbmVlZHNfZW5jcnlwdCk7CiAgICAgQXZiVW5pcXVlUHRyIGF2Yl9oYW5kbGUobnVsbHB0cik7CiAKICAgICBpZiAoIWZzdGFiKSB7CkBAIC0xOTIwLDExICsxODQyLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIE5vdyBtb3VudCBpdCB3aGVyZSByZXF1ZXN0ZWQgKi8KLSAgICAgICAgaWYgKHRtcF9tb3VudF9wb2ludCkgewotICAgICAgICAgICAgbW91bnRfcG9pbnQgPSB0bXBfbW91bnRfcG9pbnQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtb3VudF9wb2ludCA9IGZzdGFiX2VudHJ5Lm1vdW50X3BvaW50OwotICAgICAgICB9CisgICAgICAgIG1vdW50X3BvaW50ID0gZnN0YWJfZW50cnkubW91bnRfcG9pbnQ7CiAKICAgICAgICAgaW50IGZzX3N0YXQgPSBwcmVwYXJlX2ZzX2Zvcl9tb3VudChuX2Jsa19kZXZpY2UsIGZzdGFiX2VudHJ5LCBtb3VudF9wb2ludCk7CiAKQEAgLTE5NjIsNiArMTg4MCw4IEBACiAgICAgICAgICAgICAgICAgaWYgKHJldHJ5X2NvdW50IDw9IDApIGJyZWFrOyAgLy8gcnVuIGNoZWNrX2ZzIG9ubHkgb25jZQogICAgICAgICAgICAgICAgIGlmICghZmlyc3RfbW91bnRfZXJybm8pIGZpcnN0X21vdW50X2Vycm5vID0gZXJybm87CiAgICAgICAgICAgICAgICAgbW91bnRfZXJyb3JzKys7CisgICAgICAgICAgICAgICAgUEVSUk9SIDw8ICJDYW5ub3QgbW91bnQgZmlsZXN5c3RlbSBvbiAiIDw8IG5fYmxrX2RldmljZSA8PCAiIGF0ICIgPDwgbW91bnRfcG9pbnQKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiB3aXRoIGZzdHlwZSAiIDw8IGZzdGFiX2VudHJ5LmZzX3R5cGU7CiAgICAgICAgICAgICAgICAgZnNfc3RhdCB8PSBGU19TVEFUX0ZVTExfTU9VTlRfRkFJTEVEOwogICAgICAgICAgICAgICAgIC8vIHRyeSBhZ2FpbiBhZnRlciBmc2NrCiAgICAgICAgICAgICAgICAgY2hlY2tfZnMobl9ibGtfZGV2aWNlLCBmc3RhYl9lbnRyeS5mc190eXBlLCBtb3VudF9wb2ludCwgJmZzX3N0YXQpOwpAQCAtMTk4MSwzNSArMTkwMSw2IEBACiAgICAgcmV0dXJuIEZTX01HUl9ET01OVF9GQUlMRUQ7CiB9CiAKLWludCBmc19tZ3JfZG9fbW91bnQoRnN0YWIqIGZzdGFiLCBjb25zdCBjaGFyKiBuX25hbWUsIGNoYXIqIG5fYmxrX2RldmljZSwgY2hhciogdG1wX21vdW50X3BvaW50KSB7Ci0gICAgcmV0dXJuIGZzX21ncl9kb19tb3VudF9oZWxwZXIoZnN0YWIsIG5fbmFtZSwgbl9ibGtfZGV2aWNlLCB0bXBfbW91bnRfcG9pbnQsIC0xLCBmYWxzZSk7Ci19Ci0KLWludCBmc19tZ3JfZG9fbW91bnQoRnN0YWIqIGZzdGFiLCBjb25zdCBjaGFyKiBuX25hbWUsIGNoYXIqIG5fYmxrX2RldmljZSwgY2hhciogdG1wX21vdW50X3BvaW50LAotICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRzX2NoZWNrcG9pbnQsIGJvb2wgbWV0YWRhdGFfZW5jcnlwdGVkKSB7Ci0gICAgcmV0dXJuIGZzX21ncl9kb19tb3VudF9oZWxwZXIoZnN0YWIsIG5fbmFtZSwgbl9ibGtfZGV2aWNlLCB0bXBfbW91bnRfcG9pbnQsIG5lZWRzX2NoZWNrcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFfZW5jcnlwdGVkKTsKLX0KLQotLyoKLSAqIG1vdW50IGEgdG1wZnMgZmlsZXN5c3RlbSBhdCB0aGUgZ2l2ZW4gcG9pbnQuCi0gKiByZXR1cm4gMCBvbiBzdWNjZXNzLCBub24temVybyBvbiBmYWlsdXJlLgotICovCi1pbnQgZnNfbWdyX2RvX3RtcGZzX21vdW50KGNvbnN0IGNoYXIgKm5fbmFtZSkKLXsKLSAgICBpbnQgcmV0OwotCi0gICAgcmV0ID0gbW91bnQoInRtcGZzIiwgbl9uYW1lLCAidG1wZnMiLCBNU19OT0FUSU1FIHwgTVNfTk9TVUlEIHwgTVNfTk9ERVYgfCBNU19OT0VYRUMsCi0gICAgICAgICAgICAgICAgQ1JZUFRPX1RNUEZTX09QVElPTlMpOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIExFUlJPUiA8PCAiQ2Fubm90IG1vdW50IHRtcGZzIGZpbGVzeXN0ZW0gYXQgIiA8PCBuX25hbWU7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiBTdWNjZXNzICovCi0gICAgcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBib29sIENvbmZpZ3VyZUlvU2NoZWR1bGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfcGF0aCkgewogICAgIGlmICghU3RhcnRzV2l0aChkZXZpY2VfcGF0aCwgIi9kZXYvIikpIHsKICAgICAgICAgTEVSUk9SIDw8IF9fZnVuY19fIDw8ICI6IGludmFsaWQgYXJndW1lbnQgIiA8PCBkZXZpY2VfcGF0aDsKQEAgLTIwNDgsMTEgKzE5MzksNDUgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorLyoKKyAqIFpyYW0gYmFja2luZyBkZXZpY2UgY2FuIGJlIGNyZWF0ZWQgYXMgbG9uZyBhcyAvZGF0YSBoYXMgYXQgbGVhc3QgYHNpemVgCisgKiBmcmVlIHNwYWNlLCB0aG91Z2ggd2UgbWF5IHdhbnQgdG8gbGVhdmUgc29tZSBleHRyYSBzcGFjZSBmb3IgdGhlIHJlbWFpbmluZworICogYm9vdCBwcm9jZXNzIGFuZCBvdGhlciBzeXN0ZW0gYWN0aXZpdGllcy4KKyAqLworc3RhdGljIGJvb2wgWnJhbUJhY2tpbmdEZXZpY2VTaXplQXZhaWxhYmxlKG9mZjY0X3Qgc2l6ZSkgeworICAgIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBkYXRhX3BhdGggPSAiL2RhdGEiOworICAgIHVpbnQ2NF90IG1pbl9mcmVlX21iID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OkdldFVpbnRQcm9wZXJ0eTx1aW50NjRfdD4oInJvLnpyYW1fYmFja2luZ19kZXZpY2VfbWluX2ZyZWVfbWIiLCAwKTsKKworICAgIC8vIE5vIG1pbl9mcmVlIHByb3BlcnR5LiBTa2lwIHRoZSBhdmFpbGFibGUgc2l6ZSBjaGVjay4KKyAgICBpZiAobWluX2ZyZWVfbWIgPT0gMCkgcmV0dXJuIHRydWU7CisKKyAgICBzdHJ1Y3Qgc3RhdHZmcyB2c3Q7CisgICAgaWYgKHN0YXR2ZnMoZGF0YV9wYXRoLCAmdnN0KSA8IDApIHsKKyAgICAgICAgUEVSUk9SIDw8ICJDYW5ub3QgY2hlY2sgYXZhaWxhYmxlIHNwYWNlOiAiIDw8IGRhdGFfcGF0aDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVpbnQ2NF90IHNpemVfZnJlZSA9IHN0YXRpY19jYXN0PHVpbnQ2NF90Pih2c3QuZl9iZnJlZSkgKiB2c3QuZl9mcnNpemU7CisgICAgdWludDY0X3Qgc2l6ZV9yZXF1aXJlZCA9IHNpemUgKyAobWluX2ZyZWVfbWIgKiAxMDI0ICogMTAyNCk7CisgICAgaWYgKHNpemVfcmVxdWlyZWQgPiBzaXplX2ZyZWUpIHsKKyAgICAgICAgUEVSUk9SIDw8ICJGcmVlIHNwYWNlIGlzIG5vdCBlbm91Z2ggZm9yIHpyYW0gYmFja2luZyBkZXZpY2U6ICIgPDwgc2l6ZV9yZXF1aXJlZCA8PCAiID4gIgorICAgICAgICAgICAgICAgPDwgc2l6ZV9mcmVlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCiBzdGF0aWMgYm9vbCBQcmVwYXJlWnJhbUJhY2tpbmdEZXZpY2Uob2ZmNjRfdCBzaXplKSB7CiAKICAgICBjb25zdGV4cHIgY29uc3QgY2hhciogZmlsZV9wYXRoID0gIi9kYXRhL3Blcl9ib290L3pyYW1fc3dhcCI7CiAgICAgaWYgKHNpemUgPT0gMCkgcmV0dXJuIHRydWU7CiAKKyAgICAvLyBDaGVjayBhdmFpbGFibGUgc3BhY2UKKyAgICBpZiAoIVpyYW1CYWNraW5nRGV2aWNlU2l6ZUF2YWlsYWJsZShzaXplKSkgeworICAgICAgICBQRVJST1IgPDwgIk5vIHNwYWNlIGZvciB0YXJnZXQgcGF0aDogIiA8PCBmaWxlX3BhdGg7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAgICAgLy8gUHJlcGFyZSB0YXJnZXQgcGF0aAogICAgIHVuaXF1ZV9mZCB0YXJnZXRfZmQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oZmlsZV9wYXRoLCBPX1JEV1IgfCBPX0NSRUFUIHwgT19DTE9FWEVDLCAwNjAwKSkpOwogICAgIGlmICh0YXJnZXRfZmQuZ2V0KCkgPT0gLTEpIHsKQEAgLTIwNjEsNiArMTk4Niw3IEBACiAgICAgfQogICAgIGlmIChmYWxsb2NhdGUodGFyZ2V0X2ZkLmdldCgpLCAwLCAwLCBzaXplKSA8IDApIHsKICAgICAgICAgUEVSUk9SIDw8ICJDYW5ub3QgdHJ1bmNhdGUgdGFyZ2V0IHBhdGg6ICIgPDwgZmlsZV9wYXRoOworICAgICAgICB1bmxpbmsoZmlsZV9wYXRoKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtMjI4MSwxOSArMjIwNywxOSBAQAogfQogCiBib29sIGZzX21ncl9tb3VudF9vdmVybGF5ZnNfZnN0YWJfZW50cnkoY29uc3QgRnN0YWJFbnRyeSYgZW50cnkpIHsKLSAgICBhdXRvIG92ZXJsYXlmc192YWxpZF9yZXN1bHQgPSBmc19tZ3Jfb3ZlcmxheWZzX3ZhbGlkKCk7Ci0gICAgaWYgKG92ZXJsYXlmc192YWxpZF9yZXN1bHQgPT0gT3ZlcmxheWZzVmFsaWRSZXN1bHQ6OmtOb3RTdXBwb3J0ZWQpIHsKKyAgICBjb25zdCBhdXRvIG92ZXJsYXlmc19jaGVja19yZXN1bHQgPSBhbmRyb2lkOjpmc19tZ3I6OkNoZWNrT3ZlcmxheWZzKCk7CisgICAgaWYgKCFvdmVybGF5ZnNfY2hlY2tfcmVzdWx0LnN1cHBvcnRlZCkgewogICAgICAgICBMRVJST1IgPDwgX19GVU5DVElPTl9fIDw8ICIoKToga2VybmVsIGRvZXMgbm90IHN1cHBvcnQgb3ZlcmxheWZzIjsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogI2lmIEFMTE9XX0FEQkRfRElTQUJMRV9WRVJJVFkgPT0gMAogICAgIC8vIEFsbG93bGlzdCB0aGUgbW91bnQgcG9pbnQgaWYgdXNlciBidWlsZC4KLSAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3Qgc3RkOjpzdHJpbmc+IGtBbGxvd2VkUGF0aHMgPSB7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBrQWxsb3dlZFBhdGhzID0gewogICAgICAgICAgICAgIi9vZG0iLCAgICAgICAgICIvb2RtX2Rsa20iLCAgICIvb2VtIiwgICAgIi9wcm9kdWN0IiwKICAgICAgICAgICAgICIvc3lzdGVtX2Rsa20iLCAiL3N5c3RlbV9leHQiLCAiL3ZlbmRvciIsICIvdmVuZG9yX2Rsa20iLAogICAgIH07Ci0gICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IHN0ZDo6c3RyaW5nPiBrQWxsb3dlZFByZWZpeGVzID0geworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4ga0FsbG93ZWRQcmVmaXhlcyA9IHsKICAgICAgICAgICAgICIvbW50L3Byb2R1Y3QvIiwKICAgICAgICAgICAgICIvbW50L3ZlbmRvci8iLAogICAgIH07CkBAIC0yMzM0LDEwICsyMjYwLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGF1dG8gb3B0aW9ucyA9ICJsb3dlcmRpcj0iICsgbG93ZXJkaXI7Ci0gICAgaWYgKG92ZXJsYXlmc192YWxpZF9yZXN1bHQgPT0gT3ZlcmxheWZzVmFsaWRSZXN1bHQ6OmtPdmVycmlkZUNyZWRzUmVxdWlyZWQpIHsKLSAgICAgICAgb3B0aW9ucyArPSAiLG92ZXJyaWRlX2NyZWRzPW9mZiI7Ci0gICAgfQorICAgIGNvbnN0IGF1dG8gb3B0aW9ucyA9ICJsb3dlcmRpcj0iICsgbG93ZXJkaXIgKyBvdmVybGF5ZnNfY2hlY2tfcmVzdWx0Lm1vdW50X2ZsYWdzOwogCiAgICAgLy8gVXNlICJvdmVybGF5LSIgKyBlbnRyeS5ibGtfZGV2aWNlIGFzIHRoZSBtb3VudCgpIHNvdXJjZSwgc28gdGhhdCBhZGItcmVtb3V0LXRlc3QgZG9uJ3QKICAgICAvLyBjb25mdXNlIHRoaXMgd2l0aCBhZGIgcmVtb3VudCBvdmVybGF5LCB3aG9zZSBkZXZpY2UgbmFtZSBpcyAib3ZlcmxheSIuCkBAIC0yMzkzLDMwICsyMzE2LDQyIEBACiAgICAgcmV0dXJuIGNvbnRleHQ7CiB9CiAKLU92ZXJsYXlmc1ZhbGlkUmVzdWx0IGZzX21ncl9vdmVybGF5ZnNfdmFsaWQoKSB7Ci0gICAgLy8gT3ZlcmxheWZzIGF2YWlsYWJsZSBpbiB0aGUga2VybmVsLCBhbmQgcGF0Y2hlZCBmb3Igb3ZlcnJpZGVfY3JlZHM/Ci0gICAgaWYgKGFjY2VzcygiL3N5cy9tb2R1bGUvb3ZlcmxheS9wYXJhbWV0ZXJzL292ZXJyaWRlX2NyZWRzIiwgRl9PSykgPT0gMCkgewotICAgICAgICByZXR1cm4gT3ZlcmxheWZzVmFsaWRSZXN1bHQ6OmtPdmVycmlkZUNyZWRzUmVxdWlyZWQ7Ci0gICAgfQoraW50IGZzX21ncl9mMmZzX2lkZWFsX2Jsb2NrX3NpemUoKSB7CisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorICAgIHJldHVybiA0MDk2OworI2Vsc2UKKyAgICByZXR1cm4gZ2V0cGFnZXNpemUoKTsKKyNlbmRpZgorfQorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZnNfbWdyIHsKKworT3ZlcmxheWZzQ2hlY2tSZXN1bHQgQ2hlY2tPdmVybGF5ZnMoKSB7CiAgICAgaWYgKCFmc19tZ3JfZmlsZXN5c3RlbV9hdmFpbGFibGUoIm92ZXJsYXkiKSkgewotICAgICAgICByZXR1cm4gT3ZlcmxheWZzVmFsaWRSZXN1bHQ6OmtOb3RTdXBwb3J0ZWQ7CisgICAgICAgIHJldHVybiB7LnN1cHBvcnRlZCA9IGZhbHNlfTsKICAgICB9CiAgICAgc3RydWN0IHV0c25hbWUgdXRzOwogICAgIGlmICh1bmFtZSgmdXRzKSA9PSAtMSkgewotICAgICAgICByZXR1cm4gT3ZlcmxheWZzVmFsaWRSZXN1bHQ6OmtOb3RTdXBwb3J0ZWQ7CisgICAgICAgIHJldHVybiB7LnN1cHBvcnRlZCA9IGZhbHNlfTsKICAgICB9CiAgICAgaW50IG1ham9yLCBtaW5vcjsKICAgICBpZiAoc3NjYW5mKHV0cy5yZWxlYXNlLCAiJWQuJWQiLCAmbWFqb3IsICZtaW5vcikgIT0gMikgewotICAgICAgICByZXR1cm4gT3ZlcmxheWZzVmFsaWRSZXN1bHQ6OmtOb3RTdXBwb3J0ZWQ7CisgICAgICAgIHJldHVybiB7LnN1cHBvcnRlZCA9IGZhbHNlfTsKICAgICB9Ci0gICAgaWYgKG1ham9yIDwgNCkgewotICAgICAgICByZXR1cm4gT3ZlcmxheWZzVmFsaWRSZXN1bHQ6OmtPazsKKyAgICAvLyBPdmVybGF5ZnMgYXZhaWxhYmxlIGluIHRoZSBrZXJuZWwsIGFuZCBwYXRjaGVkIGZvciBvdmVycmlkZV9jcmVkcz8KKyAgICBpZiAoYWNjZXNzKCIvc3lzL21vZHVsZS9vdmVybGF5L3BhcmFtZXRlcnMvb3ZlcnJpZGVfY3JlZHMiLCBGX09LKSA9PSAwKSB7CisgICAgICAgIGF1dG8gbW91bnRfZmxhZ3MgPSAiLG92ZXJyaWRlX2NyZWRzPW9mZiJzOworICAgICAgICBpZiAobWFqb3IgPiA1IHx8IChtYWpvciA9PSA1ICYmIG1pbm9yID49IDE1KSkgeworICAgICAgICAgICAgbW91bnRfZmxhZ3MgKz0gIix1c2VyeGF0dHIiczsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gey5zdXBwb3J0ZWQgPSB0cnVlLCAubW91bnRfZmxhZ3MgPSBtb3VudF9mbGFnc307CiAgICAgfQotICAgIGlmIChtYWpvciA+IDQpIHsKLSAgICAgICAgcmV0dXJuIE92ZXJsYXlmc1ZhbGlkUmVzdWx0OjprTm90U3VwcG9ydGVkOworICAgIGlmIChtYWpvciA8IDQgfHwgKG1ham9yID09IDQgJiYgbWlub3IgPD0gMykpIHsKKyAgICAgICAgcmV0dXJuIHsuc3VwcG9ydGVkID0gdHJ1ZX07CiAgICAgfQotICAgIGlmIChtaW5vciA+IDMpIHsKLSAgICAgICAgcmV0dXJuIE92ZXJsYXlmc1ZhbGlkUmVzdWx0OjprTm90U3VwcG9ydGVkOwotICAgIH0KLSAgICByZXR1cm4gT3ZlcmxheWZzVmFsaWRSZXN1bHQ6OmtPazsKKyAgICByZXR1cm4gey5zdXBwb3J0ZWQgPSBmYWxzZX07CiB9CisKK30gIC8vIG5hbWVzcGFjZSBmc19tZ3IKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvZnNfbWdyX2Jvb3RfY29uZmlnLmNwcCBiL2ZzX21nci9mc19tZ3JfYm9vdF9jb25maWcuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWQxZTBkLi4wMDAwMDAwCi0tLSBhL2ZzX21nci9mc19tZ3JfYm9vdF9jb25maWcuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGl0ZXJhdG9yPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+Ci0KLSNpbmNsdWRlICJmc19tZ3JfcHJpdi5oIgotCi1zdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4gZnNfbWdyX3BhcnNlX2NtZGxpbmUoY29uc3Qgc3RkOjpzdHJpbmcmIGNtZGxpbmUpIHsKLSAgICBzdGF0aWMgY29uc3RleHByIGNoYXIgcXVvdGUgPSAnIic7Ci0KLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4gcmVzdWx0OwotICAgIHNpemVfdCBiYXNlID0gMDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAvLyBza2lwIHF1b3RlZCBzcGFucwotICAgICAgICBhdXRvIGZvdW5kID0gYmFzZTsKLSAgICAgICAgd2hpbGUgKCgoZm91bmQgPSBjbWRsaW5lLmZpbmRfZmlyc3Rfb2YoIiBcIiIsIGZvdW5kKSkgIT0gY21kbGluZS5ucG9zKSAmJgotICAgICAgICAgICAgICAgKGNtZGxpbmVbZm91bmRdID09IHF1b3RlKSkgewotICAgICAgICAgICAgLy8gdW5iYWxhbmNlZCBxdW90ZSBpcyBvawotICAgICAgICAgICAgaWYgKChmb3VuZCA9IGNtZGxpbmUuZmluZChxdW90ZSwgZm91bmQgKyAxKSkgPT0gY21kbGluZS5ucG9zKSBicmVhazsKLSAgICAgICAgICAgICsrZm91bmQ7Ci0gICAgICAgIH0KLSAgICAgICAgc3RkOjpzdHJpbmcgcGllY2U7Ci0gICAgICAgIGF1dG8gc291cmNlID0gY21kbGluZS5zdWJzdHIoYmFzZSwgZm91bmQgLSBiYXNlKTsKLSAgICAgICAgc3RkOjpyZW1vdmVfY29weShzb3VyY2UuYmVnaW4oKSwgc291cmNlLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRfaXRlcmF0b3I8c3RkOjpzdHJpbmc+KHBpZWNlKSwgcXVvdGUpOwotICAgICAgICBhdXRvIGVxdWFsX3NpZ24gPSBwaWVjZS5maW5kKCc9Jyk7Ci0gICAgICAgIGlmIChlcXVhbF9zaWduID09IHBpZWNlLm5wb3MpIHsKLSAgICAgICAgICAgIGlmICghcGllY2UuZW1wdHkoKSkgewotICAgICAgICAgICAgICAgIC8vIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiA8a2V5PiBhbmQgPGtleT49Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUocGllY2UpLCAiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXN1bHQuZW1wbGFjZV9iYWNrKHBpZWNlLnN1YnN0cigwLCBlcXVhbF9zaWduKSwgcGllY2Uuc3Vic3RyKGVxdWFsX3NpZ24gKyAxKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZvdW5kID09IGNtZGxpbmUubnBvcykgYnJlYWs7Ci0gICAgICAgIGJhc2UgPSBmb3VuZCArIDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+IGZzX21ncl9wYXJzZV9wcm9jX2Jvb3Rjb25maWcoCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjbWRsaW5lKSB7Ci0gICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIHF1b3RlID0gJyInOwotCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+IHJlc3VsdDsKLSAgICBmb3IgKGF1dG8mIGxpbmUgOiBhbmRyb2lkOjpiYXNlOjpTcGxpdChjbWRsaW5lLCAiXG4iKSkgewotICAgICAgICBsaW5lLmVyYXNlKHN0ZDo6cmVtb3ZlKGxpbmUuYmVnaW4oKSwgbGluZS5lbmQoKSwgcXVvdGUpLCBsaW5lLmVuZCgpKTsKLSAgICAgICAgYXV0byBlcXVhbF9zaWduID0gbGluZS5maW5kKCc9Jyk7Ci0gICAgICAgIGlmIChlcXVhbF9zaWduID09IGxpbmUubnBvcykgewotICAgICAgICAgICAgaWYgKCFsaW5lLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBubyBkaWZmZXJlbmNlIGJldHdlZW4gPGtleT4gYW5kIDxrZXk+PQotICAgICAgICAgICAgICAgIHJlc3VsdC5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKGxpbmUpLCAiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXN1bHQuZW1wbGFjZV9iYWNrKGFuZHJvaWQ6OmJhc2U6OlRyaW0obGluZS5zdWJzdHIoMCwgZXF1YWxfc2lnbikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpUcmltKGxpbmUuc3Vic3RyKGVxdWFsX3NpZ24gKyAxKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotYm9vbCBmc19tZ3JfZ2V0X2Jvb3RfY29uZmlnX2Zyb21fYm9vdGNvbmZpZyhjb25zdCBzdGQ6OnN0cmluZyYgYm9vdGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFuZHJvaWRfa2V5LCBzdGQ6OnN0cmluZyogb3V0X3ZhbCkgewotICAgIEZTX01HUl9DSEVDSyhvdXRfdmFsICE9IG51bGxwdHIpOwotCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcgYm9vdGNvbmZpZ19rZXkoImFuZHJvaWRib290LiIgKyBhbmRyb2lkX2tleSk7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBba2V5LCB2YWx1ZV0gOiBmc19tZ3JfcGFyc2VfcHJvY19ib290Y29uZmlnKGJvb3Rjb25maWcpKSB7Ci0gICAgICAgIGlmIChrZXkgPT0gYm9vdGNvbmZpZ19rZXkpIHsKLSAgICAgICAgICAgICpvdXRfdmFsID0gdmFsdWU7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgICpvdXRfdmFsID0gIiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIGZzX21ncl9nZXRfYm9vdF9jb25maWdfZnJvbV9rZXJuZWwoY29uc3Qgc3RkOjpzdHJpbmcmIGNtZGxpbmUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBhbmRyb2lkX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogb3V0X3ZhbCkgewotICAgIEZTX01HUl9DSEVDSyhvdXRfdmFsICE9IG51bGxwdHIpOwotCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcgY21kbGluZV9rZXkoImFuZHJvaWRib290LiIgKyBhbmRyb2lkX2tleSk7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBba2V5LCB2YWx1ZV0gOiBmc19tZ3JfcGFyc2VfY21kbGluZShjbWRsaW5lKSkgewotICAgICAgICBpZiAoa2V5ID09IGNtZGxpbmVfa2V5KSB7Ci0gICAgICAgICAgICAqb3V0X3ZhbCA9IHZhbHVlOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAqb3V0X3ZhbCA9ICIiOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLy8gVHJpZXMgdG8gZ2V0IHRoZSBnaXZlbiBib290IGNvbmZpZyB2YWx1ZSBmcm9tIGJvb3Rjb25maWcuCi0vLyBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bGx5IGZvdW5kLCBmYWxzZSBvdGhlcndpc2UuCi1ib29sIGZzX21ncl9nZXRfYm9vdF9jb25maWdfZnJvbV9ib290Y29uZmlnX3NvdXJjZShjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBzdGQ6OnN0cmluZyogb3V0X3ZhbCkgewotICAgIHN0ZDo6c3RyaW5nIGJvb3Rjb25maWc7Ci0gICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpSZWFkRmlsZVRvU3RyaW5nKCIvcHJvYy9ib290Y29uZmlnIiwgJmJvb3Rjb25maWcpKSByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKCFib290Y29uZmlnLmVtcHR5KCkgJiYgYm9vdGNvbmZpZy5iYWNrKCkgPT0gJ1xuJykgewotICAgICAgICBib290Y29uZmlnLnBvcF9iYWNrKCk7Ci0gICAgfQotICAgIHJldHVybiBmc19tZ3JfZ2V0X2Jvb3RfY29uZmlnX2Zyb21fYm9vdGNvbmZpZyhib290Y29uZmlnLCBrZXksIG91dF92YWwpOwotfQotCi0vLyBUcmllcyB0byBnZXQgdGhlIGdpdmVuIGJvb3QgY29uZmlnIHZhbHVlIGZyb20ga2VybmVsIGNtZGxpbmUuCi0vLyBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bGx5IGZvdW5kLCBmYWxzZSBvdGhlcndpc2UuCi1ib29sIGZzX21ncl9nZXRfYm9vdF9jb25maWdfZnJvbV9rZXJuZWxfY21kbGluZShjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBzdGQ6OnN0cmluZyogb3V0X3ZhbCkgewotICAgIHN0ZDo6c3RyaW5nIGNtZGxpbmU7Ci0gICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpSZWFkRmlsZVRvU3RyaW5nKCIvcHJvYy9jbWRsaW5lIiwgJmNtZGxpbmUpKSByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKCFjbWRsaW5lLmVtcHR5KCkgJiYgY21kbGluZS5iYWNrKCkgPT0gJ1xuJykgewotICAgICAgICBjbWRsaW5lLnBvcF9iYWNrKCk7Ci0gICAgfQotICAgIHJldHVybiBmc19tZ3JfZ2V0X2Jvb3RfY29uZmlnX2Zyb21fa2VybmVsKGNtZGxpbmUsIGtleSwgb3V0X3ZhbCk7Ci19Ci0KLS8vIFRyaWVzIHRvIGdldCB0aGUgYm9vdCBjb25maWcgdmFsdWUgaW4gZGV2aWNlIHRyZWUsIHByb3BlcnRpZXMgYW5kCi0vLyBrZXJuZWwgY21kbGluZSAoaW4gdGhhdCBvcmRlcikuICBSZXR1cm5zICd0cnVlJyBpZiBzdWNjZXNzZnVsbHkKLS8vIGZvdW5kLCAnZmFsc2UnIG90aGVyd2lzZS4KLWJvb2wgZnNfbWdyX2dldF9ib290X2NvbmZpZyhjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBzdGQ6OnN0cmluZyogb3V0X3ZhbCkgewotICAgIEZTX01HUl9DSEVDSyhvdXRfdmFsICE9IG51bGxwdHIpOwotCi0gICAgLy8gZmlyc3RseSwgY2hlY2sgdGhlIGRldmljZSB0cmVlCi0gICAgaWYgKGlzX2R0X2NvbXBhdGlibGUoKSkgewotICAgICAgICBzdGQ6OnN0cmluZyBmaWxlX25hbWUgPSBnZXRfYW5kcm9pZF9kdF9kaXIoKSArICIvIiArIGtleTsKLSAgICAgICAgaWYgKGFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmcoZmlsZV9uYW1lLCBvdXRfdmFsKSkgewotICAgICAgICAgICAgaWYgKCFvdXRfdmFsLT5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgb3V0X3ZhbC0+cG9wX2JhY2soKTsgIC8vIFRyaW1zIHRoZSB0cmFpbGluZyAnXDAnIG91dC4KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIG5leHQsIGNoZWNrIGlmIHdlIGhhdmUgInJvLmJvb3QiIHByb3BlcnR5IGFscmVhZHkKLSAgICAqb3V0X3ZhbCA9IGFuZHJvaWQ6OmJhc2U6OkdldFByb3BlcnR5KCJyby5ib290LiIgKyBrZXksICIiKTsKLSAgICBpZiAoIW91dF92YWwtPmVtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8gbmV4dCwgY2hlY2sgaWYgd2UgaGF2ZSB0aGUgcHJvcGVydHkgaW4gYm9vdGNvbmZpZwotICAgIGlmIChmc19tZ3JfZ2V0X2Jvb3RfY29uZmlnX2Zyb21fYm9vdGNvbmZpZ19zb3VyY2Uoa2V5LCBvdXRfdmFsKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBmaW5hbGx5LCBmYWxsYmFjayB0byBrZXJuZWwgY21kbGluZSwgcHJvcGVydGllcyBtYXkgbm90IGJlIHJlYWR5IHlldAotICAgIGlmIChmc19tZ3JfZ2V0X2Jvb3RfY29uZmlnX2Zyb21fa2VybmVsX2NtZGxpbmUoa2V5LCBvdXRfdmFsKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19CmRpZmYgLS1naXQgYS9mc19tZ3IvZnNfbWdyX2Zvcm1hdC5jcHAgYi9mc19tZ3IvZnNfbWdyX2Zvcm1hdC5jcHAKaW5kZXggNzM4NWY3OS4uNTdlMzVhMiAxMDA2NDQKLS0tIGEvZnNfbWdyL2ZzX21ncl9mb3JtYXQuY3BwCisrKyBiL2ZzX21nci9mc19tZ3JfZm9ybWF0LmNwcApAQCAtMzIsNiArMzIsOCBAQAogI2luY2x1ZGUgPHNlbGludXgvYW5kcm9pZC5oPgogI2luY2x1ZGUgPHNlbGludXgvbGFiZWwuaD4KICNpbmNsdWRlIDxzZWxpbnV4L3NlbGludXguaD4KKyNpbmNsdWRlIDxmaWxlc3lzdGVtPgorI2luY2x1ZGUgPHN0cmluZz4KIAogI2luY2x1ZGUgImZzX21ncl9wcml2LmgiCiAKQEAgLTY4LDYgKzcwLDEzIEBACiAKICAgICAvKiBGb3JtYXQgdGhlIHBhcnRpdGlvbiB1c2luZyB0aGUgY2FsY3VsYXRlZCBsZW5ndGggKi8KIAorICAgIC8vIEVYVDQgc3VwcG9ydHMgNEsgYmxvY2sgc2l6ZSBvbiAxNksgcGFnZSBzaXplcy4gQSA0SyBibG9jaworICAgIC8vIHNpemUgZm9ybWF0dGVkIEVYVDQgcGFydGl0aW9uIHdpbGwgbW91bnQgZmluZSBvbiBib3RoIDRLIGFuZCAxNksgcGFnZQorICAgIC8vIHNpemUga2VybmVscy4KKyAgICAvLyBIb3dldmVyLCBFWFQ0IGRvZXMgbm90IHN1cHBvcnQgMTZLIGJsb2NrIHNpemUgb24gNEsgc3lzdGVtcy4KKyAgICAvLyBJZiB3ZSB3YW50IHRoZSBzYW1lIHVzZXJzcGFjZSBjb2RlIHRvIHdvcmsgb24gYm90aCA0ay8xNmsga2VybmVscywKKyAgICAvLyB1c2luZyBhIGhhcmRjb2RlZCA0MDk2IGJsb2NrIHNpemUgaXMgYSBzaW1wbGUgc29sdXRpb24uIFVzaW5nCisgICAgLy8gZ2V0cGFnZXNpemUoKSBoZXJlIHdvdWxkIHdvcmsgYXMgd2VsbCwgYnV0IDQwOTYgaXMgc2ltcGxlci4KICAgICBzdGQ6OnN0cmluZyBzaXplX3N0ciA9IHN0ZDo6dG9fc3RyaW5nKGRldl9zeiAvIDQwOTYpOwogCiAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+IG1rZTJmc19hcmdzID0geyIvc3lzdGVtL2Jpbi9ta2UyZnMiLCAiLXQiLCAiZXh0NCIsICItYiIsICI0MDk2In07CkBAIC0xMTcsNyArMTI2LDkgQEAKIH0KIAogc3RhdGljIGludCBmb3JtYXRfZjJmcyhjb25zdCBzdGQ6OnN0cmluZyYgZnNfYmxrZGV2LCB1aW50NjRfdCBkZXZfc3osIGJvb2wgbmVlZHNfcHJvamlkLAotICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRzX2Nhc2Vmb2xkLCBib29sIGZzX2NvbXByZXNzLCBjb25zdCBzdGQ6OnN0cmluZyYgem9uZWRfZGV2aWNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVlZHNfY2FzZWZvbGQsIGJvb2wgZnNfY29tcHJlc3MsIGJvb2wgaXNfem9uZWQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgdXNlcl9kZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBkZXZpY2VfYWxpYXNlZCkgewogICAgIGlmICghZGV2X3N6KSB7CiAgICAgICAgIGludCByYyA9IGdldF9kZXZfc3ooZnNfYmxrZGV2LCAmZGV2X3N6KTsKICAgICAgICAgaWYgKHJjKSB7CkBAIC0xMjcsNyArMTM4LDggQEAKIAogICAgIC8qIEZvcm1hdCB0aGUgcGFydGl0aW9uIHVzaW5nIHRoZSBjYWxjdWxhdGVkIGxlbmd0aCAqLwogCi0gICAgc3RkOjpzdHJpbmcgc2l6ZV9zdHIgPSBzdGQ6OnRvX3N0cmluZyhkZXZfc3ogLyA0MDk2KTsKKyAgICBjb25zdCBhdXRvIHNpemVfc3RyID0gc3RkOjp0b19zdHJpbmcoZGV2X3N6IC8gZ2V0cGFnZXNpemUoKSk7CisgICAgc3RkOjpzdHJpbmcgYmxvY2tfc2l6ZSA9IHN0ZDo6dG9fc3RyaW5nKGdldHBhZ2VzaXplKCkpOwogCiAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+IGFyZ3MgPSB7Ii9zeXN0ZW0vYmluL21ha2VfZjJmcyIsICItZyIsICJhbmRyb2lkIn07CiAgICAgaWYgKG5lZWRzX3Byb2ppZCkgewpAQCAtMTQ2LDE2ICsxNTgsMzEgQEAKICAgICAgICAgYXJncy5wdXNoX2JhY2soIi1PIik7CiAgICAgICAgIGFyZ3MucHVzaF9iYWNrKCJleHRyYV9hdHRyIik7CiAgICAgfQotICAgIGlmICghem9uZWRfZGV2aWNlLmVtcHR5KCkpIHsKLSAgICAgICAgYXJncy5wdXNoX2JhY2soIi1jIik7Ci0gICAgICAgIGFyZ3MucHVzaF9iYWNrKHpvbmVkX2RldmljZS5jX3N0cigpKTsKKyAgICBhcmdzLnB1c2hfYmFjaygiLXciKTsKKyAgICBhcmdzLnB1c2hfYmFjayhibG9ja19zaXplLmNfc3RyKCkpOworICAgIGFyZ3MucHVzaF9iYWNrKCItYiIpOworICAgIGFyZ3MucHVzaF9iYWNrKGJsb2NrX3NpemUuY19zdHIoKSk7CisKKyAgICBpZiAoaXNfem9uZWQpIHsKICAgICAgICAgYXJncy5wdXNoX2JhY2soIi1tIik7Ci0gICAgICAgIGFyZ3MucHVzaF9iYWNrKGZzX2Jsa2Rldi5jX3N0cigpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBhcmdzLnB1c2hfYmFjayhmc19ibGtkZXYuY19zdHIoKSk7Ci0gICAgICAgIGFyZ3MucHVzaF9iYWNrKHNpemVfc3RyLmNfc3RyKCkpOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHVzZXJfZGV2aWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICBzdGQ6OnN0cmluZyBkZXZpY2VfbmFtZSA9IHVzZXJfZGV2aWNlc1tpXTsKKworICAgICAgICBhcmdzLnB1c2hfYmFjaygiLWMiKTsKKyAgICAgICAgaWYgKGRldmljZV9hbGlhc2VkW2ldKSB7CisgICAgICAgICAgICBzdGQ6OmZpbGVzeXN0ZW06OnBhdGggcGF0aCA9IGRldmljZV9uYW1lOworICAgICAgICAgICAgZGV2aWNlX25hbWUgKz0gIkAiICsgcGF0aC5maWxlbmFtZSgpLnN0cmluZygpOworICAgICAgICB9CisgICAgICAgIGFyZ3MucHVzaF9iYWNrKGRldmljZV9uYW1lLmNfc3RyKCkpOwogICAgIH0KIAorICAgIGlmICh1c2VyX2RldmljZXMuZW1wdHkoKSkgeworICAgICAgICBhcmdzLnB1c2hfYmFjayhmc19ibGtkZXYuY19zdHIoKSk7CisgICAgICAgIGFyZ3MucHVzaF9iYWNrKHNpemVfc3RyLmNfc3RyKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGFyZ3MucHVzaF9iYWNrKGZzX2Jsa2Rldi5jX3N0cigpKTsKKyAgICB9CiAgICAgcmV0dXJuIGxvZ3dyYXBfZm9ya19leGVjdnAoYXJncy5zaXplKCksIGFyZ3MuZGF0YSgpLCBudWxscHRyLCBmYWxzZSwgTE9HX0tMT0csIGZhbHNlLCBudWxscHRyKTsKIH0KIApAQCAtMTcxLDcgKzE5OCw4IEBACiAKICAgICBpZiAoZW50cnkuZnNfdHlwZSA9PSAiZjJmcyIpIHsKICAgICAgICAgcmV0dXJuIGZvcm1hdF9mMmZzKGVudHJ5LmJsa19kZXZpY2UsIGVudHJ5Lmxlbmd0aCwgbmVlZHNfcHJvamlkLCBuZWVkc19jYXNlZm9sZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmZzX21ncl9mbGFncy5mc19jb21wcmVzcywgZW50cnkuem9uZWRfZGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmZzX21ncl9mbGFncy5mc19jb21wcmVzcywgZW50cnkuZnNfbWdyX2ZsYWdzLmlzX3pvbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkudXNlcl9kZXZpY2VzLCBlbnRyeS5kZXZpY2VfYWxpYXNlZCk7CiAgICAgfSBlbHNlIGlmIChlbnRyeS5mc190eXBlID09ICJleHQ0IikgewogICAgICAgICByZXR1cm4gZm9ybWF0X2V4dDQoZW50cnkuYmxrX2RldmljZSwgZW50cnkubW91bnRfcG9pbnQsIG5lZWRzX3Byb2ppZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmZzX21ncl9mbGFncy5leHRfbWV0YV9jc3VtKTsKZGlmZiAtLWdpdCBhL2ZzX21nci9mc19tZ3Jfb3ZlcmxheWZzLmNwcCBiL2ZzX21nci9mc19tZ3Jfb3ZlcmxheWZzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM0OWMyMC4uMDAwMDAwMAotLS0gYS9mc19tZ3IvZnNfbWdyX292ZXJsYXlmcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8ZGlyZW50Lmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8c2VsaW51eC9zZWxpbnV4Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvbW91bnQuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0dmZzLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KLSNpbmNsdWRlIDxzeXMvdmZzLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPG9wdGlvbmFsPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgotI2luY2x1ZGUgPGV4dDRfdXRpbHMvZXh0NF91dGlscy5oPgotI2luY2x1ZGUgPGZzX21nci5oPgotI2luY2x1ZGUgPGZzX21nci9maWxlX3dhaXQuaD4KLSNpbmNsdWRlIDxmc19tZ3JfZG1fbGluZWFyLmg+Ci0jaW5jbHVkZSA8ZnNfbWdyX292ZXJsYXlmcy5oPgotI2luY2x1ZGUgPGZzdGFiL2ZzdGFiLmg+Ci0jaW5jbHVkZSA8bGliZG0vZG0uaD4KLSNpbmNsdWRlIDxsaWJmaWVtYXAvaW1hZ2VfbWFuYWdlci5oPgotI2luY2x1ZGUgPGxpYmdzaS9saWJnc2kuaD4KLSNpbmNsdWRlIDxsaWJscC9idWlsZGVyLmg+Ci0jaW5jbHVkZSA8bGlibHAvbGlibHAuaD4KLSNpbmNsdWRlIDxzdG9yYWdlX2xpdGVyYWxzL3N0b3JhZ2VfbGl0ZXJhbHMuaD4KLQotI2luY2x1ZGUgImZzX21ncl9wcml2LmgiCi0jaW5jbHVkZSAiZnNfbWdyX3ByaXZfb3ZlcmxheWZzLmgiCi0jaW5jbHVkZSAibGliZmllbWFwL3V0aWxpdHkuaCIKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDo6bGl0ZXJhbHM7Ci11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6ZG07Ci11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6ZnNfbWdyOwotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnN0b3JhZ2VfbGl0ZXJhbHM7Ci11c2luZyBhbmRyb2lkOjpmaWVtYXA6OkZpbGVzeXN0ZW1IYXNSZWxpYWJsZVBpbm5pbmc7Ci11c2luZyBhbmRyb2lkOjpmaWVtYXA6OklJbWFnZU1hbmFnZXI7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNvbnN0ZXhwciBjaGFyIGtEYXRhU2NyYXRjaFNpemVNYlByb3BbXSA9ICJmc19tZ3Iub3ZlcmxheWZzLmRhdGFfc2NyYXRjaF9zaXplX21iIjsKLWNvbnN0ZXhwciBjaGFyIGtQcmVmZXJDYWNoZUJhY2tpbmdTdG9yYWdlUHJvcFtdID0gImZzX21nci5vdmVybGF5ZnMucHJlZmVyX2NhY2hlX2JhY2tpbmdfc3RvcmFnZSI7Ci0KLWJvb2wgZnNfbWdyX2FjY2Vzcyhjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgewotICAgIHJldHVybiBhY2Nlc3MocGF0aC5jX3N0cigpLCBGX09LKSA9PSAwOwotfQotCi1jb25zdCBhdXRvIGtMb3dlcmRpck9wdGlvbiA9ICJsb3dlcmRpcj0iczsKLWNvbnN0IGF1dG8ga1VwcGVyZGlyT3B0aW9uID0gInVwcGVyZGlyPSJzOwotCi1ib29sIGZzX21ncl9pbl9yZWNvdmVyeSgpIHsKLSAgICAvLyBDaGVjayB0aGUgZXhpc3RlbmNlIG9mIHJlY292ZXJ5IGJpbmFyeSBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBjb21waWxlIHRpbWUKLSAgICAvLyBfX0FORFJPSURfUkVDT1ZFUllfXyBtYWNyby4KLSAgICAvLyBJZiBCT0FSRF9VU0VTX1JFQ09WRVJZX0FTX0JPT1QgaXMgdHJ1ZSwgYm90aCBub3JtYWwgYW5kIHJlY292ZXJ5IGJvb3QKLSAgICAvLyBtb2RlIHdvdWxkIHVzZSB0aGUgc2FtZSBpbml0IGJpbmFyeSwgd2hpY2ggd291bGQgbWVhbiBkdXJpbmcgbm9ybWFsIGJvb3QKLSAgICAvLyB0aGUgJy9pbml0JyBiaW5hcnkgaXMgYWN0dWFsbHkgYSBzeW1saW5rIHBvaW50aW5nIHRvCi0gICAgLy8gaW5pdF9zZWNvbmRfc3RhZ2UucmVjb3ZlcnksIHdoaWNoIHdvdWxkIGJlIGNvbXBpbGVkIHdpdGgKLSAgICAvLyBfX0FORFJPSURfUkVDT1ZFUllfXyBkZWZpbmVkLgotICAgIHJldHVybiBmc19tZ3JfYWNjZXNzKCIvc3lzdGVtL2Jpbi9yZWNvdmVyeSIpOwotfQotCi1ib29sIGZzX21ncl9pc19kc3VfcnVubmluZygpIHsKLSAgICAvLyBTaW5jZSBhbmRyb2lkOjpnc2k6OkNhbkJvb3RJbnRvR3NpKCkgb3IgYW5kcm9pZDo6Z3NpOjpNYXJrU3lzdGVtQXNHc2koKSBpcwotICAgIC8vIG5ldmVyIGNhbGxlZCBpbiByZWNvdmVyeSwgdGhlIHJldHVybiB2YWx1ZSBvZiBhbmRyb2lkOjpnc2k6OklzR3NpUnVubmluZygpCi0gICAgLy8gaXMgbm90IHdlbGwtZGVmaW5lZC4gSW4gdGhpcyBjYXNlLCBqdXN0IHJldHVybiBmYWxzZSBhcyBiZWluZyBpbiByZWNvdmVyeQotICAgIC8vIGltcGxpZXMgbm90IHJ1bm5pbmcgYSBEU1Ugc3lzdGVtLgotICAgIGlmIChmc19tZ3JfaW5fcmVjb3ZlcnkoKSkgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiBhbmRyb2lkOjpnc2k6OklzR3NpUnVubmluZygpOwotfQotCi0vLyBsaXN0IG9mIGFjY2VwdGFibGUgb3ZlcmxheWZzIGJhY2tpbmcgc3RvcmFnZQotY29uc3QgYXV0byBrU2NyYXRjaE1vdW50UG9pbnQgPSAiL21udC9zY3JhdGNoInM7Ci1jb25zdCBhdXRvIGtDYWNoZU1vdW50UG9pbnQgPSAiL2NhY2hlInM7Ci0KLWJvb2wgSXNBQkRldmljZSgpIHsKLSAgICByZXR1cm4gIWFuZHJvaWQ6OmJhc2U6OkdldFByb3BlcnR5KCJyby5ib290LnNsb3Rfc3VmZml4IiwgIiIpLmVtcHR5KCk7Ci19Ci0KLXN0ZDo6dmVjdG9yPGNvbnN0IHN0ZDo6c3RyaW5nPiBPdmVybGF5TW91bnRQb2ludHMoKSB7Ci0gICAgLy8gTmV2ZXIgZmFsbGJhY2sgdG8gbGVnYWN5IGNhY2hlIG1vdW50IHBvaW50IGlmIHdpdGhpbiBhIERTVSBzeXN0ZW0sCi0gICAgLy8gYmVjYXVzZSBydW5uaW5nIGEgRFNVIHN5c3RlbSBpbXBsaWVzIHRoZSBkZXZpY2Ugc3VwcG9ydHMgZHluYW1pYwotICAgIC8vIHBhcnRpdGlvbnMsIHdoaWNoIG1lYW5zIGxlZ2FjeSBjYWNoZSBtdXN0bid0IGJlIHVzZWQuCi0gICAgaWYgKGZzX21ncl9pc19kc3VfcnVubmluZygpKSB7Ci0gICAgICAgIHJldHVybiB7a1NjcmF0Y2hNb3VudFBvaW50fTsKLSAgICB9Ci0KLSAgICAvLyBGb3Igbm9uLUEvQiBkZXZpY2VzIHByZWZlciBjYWNoZSBiYWNraW5nIHN0b3JhZ2UgaWYKLSAgICAvLyBrUHJlZmVyQ2FjaGVCYWNraW5nU3RvcmFnZVByb3AgcHJvcGVydHkgc2V0LgotICAgIGlmICghSXNBQkRldmljZSgpICYmIGFuZHJvaWQ6OmJhc2U6OkdldEJvb2xQcm9wZXJ0eShrUHJlZmVyQ2FjaGVCYWNraW5nU3RvcmFnZVByb3AsIGZhbHNlKSAmJgotICAgICAgICBhbmRyb2lkOjpiYXNlOjpHZXRJbnRQcm9wZXJ0eSgicm8udmVuZG9yLmFwaV9sZXZlbCIsIC0xKSA8IF9fQU5EUk9JRF9BUElfVF9fKSB7Ci0gICAgICAgIHJldHVybiB7a0NhY2hlTW91bnRQb2ludCwga1NjcmF0Y2hNb3VudFBvaW50fTsKLSAgICB9Ci0KLSAgICByZXR1cm4ge2tTY3JhdGNoTW91bnRQb2ludCwga0NhY2hlTW91bnRQb2ludH07Ci19Ci0KLS8vIFJldHVybiB0cnVlIGlmIGV2ZXJ5dGhpbmcgaXMgbW91bnRlZCwgYnV0IGJlZm9yZSBhZGIgaXMgc3RhcnRlZC4gIFJpZ2h0Ci0vLyBhZnRlciAndHJpZ2dlciBsb2FkX3BlcnNpc3RfcHJvcHNfYWN0aW9uJyBpcyBkb25lLgotYm9vbCBmc19tZ3JfYm9vdF9jb21wbGV0ZWQoKSB7Ci0gICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OkdldEJvb2xQcm9wZXJ0eSgicm8ucGVyc2lzdGVudF9wcm9wZXJ0aWVzLnJlYWR5IiwgZmFsc2UpOwotfQotCi1ib29sIGZzX21ncl9pc19kaXIoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsKLSAgICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgICByZXR1cm4gIXN0YXQocGF0aC5jX3N0cigpLCAmc3QpICYmIFNfSVNESVIoc3Quc3RfbW9kZSk7Ci19Ci0KLWJvb2wgZnNfbWdyX3J3X2FjY2Vzcyhjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgewotICAgIGlmIChwYXRoLmVtcHR5KCkpIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSyB8IFdfT0spID09IDA7Ci19Ci0KLS8vIEF0IGxlc3MgdGhhbiAxJSBvciA4TUIgb2YgZnJlZSBzcGFjZSByZXR1cm4gdmFsdWUgb2YgZmFsc2UsCi0vLyBtZWFucyB3ZSB3aWxsIHRyeSB0byB3cmFwIHdpdGggb3ZlcmxheWZzLgotYm9vbCBmc19tZ3JfZmlsZXN5c3RlbV9oYXNfc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50X3BvaW50KSB7Ci0gICAgLy8gSWYgd2UgaGF2ZSBhY2Nlc3MgaXNzdWVzIHRvIGZpbmQgb3V0IHNwYWNlIHJlbWFpbmluZywgcmV0dXJuIHRydWUKLSAgICAvLyB0byBwcmV2ZW50IHVzIHRyeWluZyB0byBvdmVycmlkZSB3aXRoIG92ZXJsYXlmcy4KLSAgICBzdHJ1Y3Qgc3RhdHZmcyB2c3Q7Ci0gICAgaWYgKHN0YXR2ZnMobW91bnRfcG9pbnQuY19zdHIoKSwgJnZzdCkpIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgInN0YXR2ZnMgIiA8PCBtb3VudF9wb2ludDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga1BlcmNlbnRUaHJlc2hvbGQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgLy8gMSUKLSAgICBzdGF0aWMgY29uc3RleHByIHVuc2lnbmVkIGxvbmcga1NpemVUaHJlc2hvbGQgPSA4ICogMTAyNCAqIDEwMjQ7ICAvLyA4TUIKLQotICAgIHJldHVybiAodnN0LmZfYmZyZWUgPj0gKHZzdC5mX2Jsb2NrcyAqIGtQZXJjZW50VGhyZXNob2xkIC8gMTAwKSkgJiYKLSAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQ2NF90Pih2c3QuZl9iZnJlZSkgKiB2c3QuZl9mcnNpemUpID49IGtTaXplVGhyZXNob2xkOwotfQotCi1jb25zdCBhdXRvIGtQaHlzaWNhbERldmljZSA9ICIvZGV2L2Jsb2NrL2J5LW5hbWUvInM7Ci1jb25zdGV4cHIgY2hhciBrU2NyYXRjaEltYWdlTWV0YWRhdGFbXSA9ICIvbWV0YWRhdGEvZ3NpL3JlbW91bnQvbHBfbWV0YWRhdGEiOwotCi0vLyBOb3RlOiB0aGlzIGlzIG1lYW50IG9ubHkgZm9yIHJlY292ZXJ5L2ZpcnN0LXN0YWdlIGluaXQuCi1ib29sIFNjcmF0Y2hJc09uRGF0YSgpIHsKLSAgICAvLyBUaGUgc2NyYXRjaCBwYXJ0aXRpb24gb2YgRFNVIGlzIG1hbmFnZWQgYnkgZ3NpZC4KLSAgICBpZiAoZnNfbWdyX2lzX2RzdV9ydW5uaW5nKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gZnNfbWdyX2FjY2VzcyhrU2NyYXRjaEltYWdlTWV0YWRhdGEpOwotfQotCi1ib29sIGZzX21ncl91cGRhdGVfYmxrX2RldmljZShGc3RhYkVudHJ5KiBlbnRyeSkgewotICAgIGlmIChlbnRyeS0+ZnNfbWdyX2ZsYWdzLmxvZ2ljYWwpIHsKLSAgICAgICAgZnNfbWdyX3VwZGF0ZV9sb2dpY2FsX3BhcnRpdGlvbihlbnRyeSk7Ci0gICAgfQotICAgIGlmIChmc19tZ3JfYWNjZXNzKGVudHJ5LT5ibGtfZGV2aWNlKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKGVudHJ5LT5ibGtfZGV2aWNlICE9ICIvZGV2L3Jvb3QiKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHN5c3RlbS1hcy1yb290ICh0YWltZW4gYW5kIG90aGVycykKLSAgICBhdXRvIGJsa19kZXZpY2UgPSBrUGh5c2ljYWxEZXZpY2UgKyAic3lzdGVtIjsKLSAgICBpZiAoIWZzX21ncl9hY2Nlc3MoYmxrX2RldmljZSkpIHsKLSAgICAgICAgYmxrX2RldmljZSArPSBmc19tZ3JfZ2V0X3Nsb3Rfc3VmZml4KCk7Ci0gICAgICAgIGlmICghZnNfbWdyX2FjY2VzcyhibGtfZGV2aWNlKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIGVudHJ5LT5ibGtfZGV2aWNlID0gYmxrX2RldmljZTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBmc19tZ3JfaGFzX3NoYXJlZF9ibG9ja3MoY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50X3BvaW50LCBjb25zdCBzdGQ6OnN0cmluZyYgZGV2KSB7Ci0gICAgc3RydWN0IHN0YXRmcyBmczsKLSAgICBpZiAoKHN0YXRmcygobW91bnRfcG9pbnQgKyAiL2xvc3QrZm91bmQiKS5jX3N0cigpLCAmZnMpID09IC0xKSB8fAotICAgICAgICAoZnMuZl90eXBlICE9IEVYVDRfU1VQRVJfTUFHSUMpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgZmQob3BlbihkZXYuY19zdHIoKSwgT19SRE9OTFkgfCBPX0NMT0VYRUMpKTsKLSAgICBpZiAoZmQgPCAwKSByZXR1cm4gZmFsc2U7Ci0KLSAgICBzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayBzYjsKLSAgICBpZiAoKFRFTVBfRkFJTFVSRV9SRVRSWShsc2VlazY0KGZkLCAxMDI0LCBTRUVLX1NFVCkpIDwgMCkgfHwKLSAgICAgICAgKFRFTVBfRkFJTFVSRV9SRVRSWShyZWFkKGZkLCAmc2IsIHNpemVvZihzYikpKSA8IDApKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzdHJ1Y3QgZnNfaW5mbyBpbmZvOwotICAgIGlmIChleHQ0X3BhcnNlX3NiKCZzYiwgJmluZm8pIDwgMCkgcmV0dXJuIGZhbHNlOwotCi0gICAgcmV0dXJuIChpbmZvLmZlYXRfcm9fY29tcGF0ICYgRVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9TSEFSRURfQkxPQ0tTKSAhPSAwOwotfQotCi0jZGVmaW5lIEYyRlNfU1VQRVJfT0ZGU0VUIDEwMjQKLSNkZWZpbmUgRjJGU19GRUFUVVJFX09GRlNFVCAyMTgwCi0jZGVmaW5lIEYyRlNfRkVBVFVSRV9STyAweDQwMDAKLWJvb2wgZnNfbWdyX2lzX3JlYWRfb25seV9mMmZzKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXYpIHsKLSAgICBpZiAoIWZzX21ncl9pc19mMmZzKGRldikpIHJldHVybiBmYWxzZTsKLQotICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBmZChvcGVuKGRldi5jX3N0cigpLCBPX1JET05MWSB8IE9fQ0xPRVhFQykpOwotICAgIGlmIChmZCA8IDApIHJldHVybiBmYWxzZTsKLQotICAgIF9fbGUzMiBmZWF0OwotICAgIGlmICgoVEVNUF9GQUlMVVJFX1JFVFJZKGxzZWVrNjQoZmQsIEYyRlNfU1VQRVJfT0ZGU0VUICsgRjJGU19GRUFUVVJFX09GRlNFVCwgU0VFS19TRVQpKSA8IDApIHx8Ci0gICAgICAgIChURU1QX0ZBSUxVUkVfUkVUUlkocmVhZChmZCwgJmZlYXQsIHNpemVvZihmZWF0KSkpIDwgMCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiAoZmVhdCAmIGNwdV90b19sZTMyKEYyRlNfRkVBVFVSRV9STykpICE9IDA7Ci19Ci0KLWJvb2wgZnNfbWdyX292ZXJsYXlmc19lbmFibGVkKEZzdGFiRW50cnkqIGVudHJ5KSB7Ci0gICAgLy8gcmVhZG9ubHkgZmlsZXN5c3RlbSwgY2FuIG5vdCBiZSBtb3VudCAtbyByZW1vdW50LHJ3Ci0gICAgLy8gZm9yIHNxdWFzaGZzLCBlcm9mcyBvciBpZiBmcmVlIHNwYWNlIGlzIChuZWFyKSB6ZXJvIG1ha2luZyBzdWNoIGEgcmVtb3VudAotICAgIC8vIHZpcnR1YWxseSB1c2VsZXNzLCBvciBpZiB0aGVyZSBhcmUgc2hhcmVkIGJsb2NrcyB0aGF0IHByZXZlbnQgcmVtb3VudCxydwotICAgIGlmICghZnNfbWdyX2ZpbGVzeXN0ZW1faGFzX3NwYWNlKGVudHJ5LT5tb3VudF9wb2ludCkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8gYmxrX2RldmljZSBuZWVkcyB0byBiZSBzZXR1cCBzbyB3ZSBjYW4gY2hlY2sgc3VwZXJibG9jay4KLSAgICAvLyBJZiB3ZSBmYWlsIGhlcmUsIGJlY2F1c2UgZHVyaW5nIGluaXQgZmlyc3Qgc3RhZ2UgYW5kIGhhdmUgZG91YnRzLgotICAgIGlmICghZnNfbWdyX3VwZGF0ZV9ibGtfZGV2aWNlKGVudHJ5KSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBmMmZzIHJlYWQtb25seSBtb2RlIGRvZXNuJ3Qgc3VwcG9ydCByZW1vdW50LHJ3Ci0gICAgaWYgKGZzX21ncl9pc19yZWFkX29ubHlfZjJmcyhlbnRyeS0+YmxrX2RldmljZSkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8gY2hlY2sgaWYgZXh0NCBkZS1kdXBlCi0gICAgYXV0byBoYXNfc2hhcmVkX2Jsb2NrcyA9IGZzX21ncl9oYXNfc2hhcmVkX2Jsb2NrcyhlbnRyeS0+bW91bnRfcG9pbnQsIGVudHJ5LT5ibGtfZGV2aWNlKTsKLSAgICBpZiAoIWhhc19zaGFyZWRfYmxvY2tzICYmIChlbnRyeS0+bW91bnRfcG9pbnQgPT0gIi9zeXN0ZW0iKSkgewotICAgICAgICBoYXNfc2hhcmVkX2Jsb2NrcyA9IGZzX21ncl9oYXNfc2hhcmVkX2Jsb2NrcygiLyIsIGVudHJ5LT5ibGtfZGV2aWNlKTsKLSAgICB9Ci0gICAgcmV0dXJuIGhhc19zaGFyZWRfYmxvY2tzOwotfQotCi1ib29sIGZzX21ncl9ybV9hbGwoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIGJvb2wqIGNoYW5nZSA9IG51bGxwdHIsIGludCBsZXZlbCA9IDApIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RElSLCBkZWNsdHlwZSgmY2xvc2VkaXIpPiBkaXIob3BlbmRpcihwYXRoLmNfc3RyKCkpLCBjbG9zZWRpcik7Ci0gICAgaWYgKCFkaXIpIHsKLSAgICAgICAgaWYgKGVycm5vID09IEVOT0VOVCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgUEVSUk9SIDw8ICJvcGVuZGlyICIgPDwgcGF0aCA8PCAiIGRlcHRoPSIgPDwgbGV2ZWw7Ci0gICAgICAgIGlmICgoZXJybm8gPT0gRVBFUk0pICYmIChsZXZlbCAhPSAwKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBkaXJlbnQqIGVudHJ5OwotICAgIGF1dG8gcmV0ID0gdHJ1ZTsKLSAgICB3aGlsZSAoKGVudHJ5ID0gcmVhZGRpcihkaXIuZ2V0KCkpKSkgewotICAgICAgICBpZiAoKCIuInMgPT0gZW50cnktPmRfbmFtZSkgfHwgKCIuLiJzID09IGVudHJ5LT5kX25hbWUpKSBjb250aW51ZTsKLSAgICAgICAgYXV0byBmaWxlID0gcGF0aCArICIvIiArIGVudHJ5LT5kX25hbWU7Ci0gICAgICAgIGlmIChlbnRyeS0+ZF90eXBlID09IERUX1VOS05PV04pIHsKLSAgICAgICAgICAgIHN0cnVjdCBzdGF0IHN0OwotICAgICAgICAgICAgaWYgKCFsc3RhdChmaWxlLmNfc3RyKCksICZzdCkgJiYgKHN0LnN0X21vZGUgJiBTX0lGRElSKSkgZW50cnktPmRfdHlwZSA9IERUX0RJUjsKLSAgICAgICAgfQotICAgICAgICBpZiAoZW50cnktPmRfdHlwZSA9PSBEVF9ESVIpIHsKLSAgICAgICAgICAgIHJldCAmPSBmc19tZ3Jfcm1fYWxsKGZpbGUsIGNoYW5nZSwgbGV2ZWwgKyAxKTsKLSAgICAgICAgICAgIGlmICghcm1kaXIoZmlsZS5jX3N0cigpKSkgewotICAgICAgICAgICAgICAgIGlmIChjaGFuZ2UpICpjaGFuZ2UgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoZXJybm8gIT0gRU5PRU5UKSByZXQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBQRVJST1IgPDwgInJtZGlyICIgPDwgZmlsZSA8PCAiIGRlcHRoPSIgPDwgbGV2ZWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXVubGluayhmaWxlLmNfc3RyKCkpKSB7Ci0gICAgICAgICAgICBpZiAoY2hhbmdlKSAqY2hhbmdlID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChlcnJubyAhPSBFTk9FTlQpIHJldCA9IGZhbHNlOwotICAgICAgICAgICAgUEVSUk9SIDw8ICJybSAiIDw8IGZpbGUgPDwgIiBkZXB0aD0iIDw8IGxldmVsOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLWNvbnN0IGF1dG8ga1VwcGVyTmFtZSA9ICJ1cHBlciJzOwotY29uc3QgYXV0byBrV29ya05hbWUgPSAid29yayJzOwotY29uc3QgYXV0byBrT3ZlcmxheVRvcERpciA9ICIvb3ZlcmxheSJzOwotCi1zdGQ6OnN0cmluZyBmc19tZ3JfZ2V0X292ZXJsYXlmc19jYW5kaWRhdGUoY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50X3BvaW50KSB7Ci0gICAgaWYgKCFmc19tZ3JfaXNfZGlyKG1vdW50X3BvaW50KSkgcmV0dXJuICIiOwotICAgIGNvbnN0IGF1dG8gYmFzZSA9IGFuZHJvaWQ6OmJhc2U6OkJhc2VuYW1lKG1vdW50X3BvaW50KSArICIvIjsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIG92ZXJsYXlfbW91bnRfcG9pbnQgOiBPdmVybGF5TW91bnRQb2ludHMoKSkgewotICAgICAgICBhdXRvIGRpciA9IG92ZXJsYXlfbW91bnRfcG9pbnQgKyBrT3ZlcmxheVRvcERpciArICIvIiArIGJhc2U7Ci0gICAgICAgIGF1dG8gdXBwZXIgPSBkaXIgKyBrVXBwZXJOYW1lOwotICAgICAgICBpZiAoIWZzX21ncl9pc19kaXIodXBwZXIpKSBjb250aW51ZTsKLSAgICAgICAgYXV0byB3b3JrID0gZGlyICsga1dvcmtOYW1lOwotICAgICAgICBpZiAoIWZzX21ncl9pc19kaXIod29yaykpIGNvbnRpbnVlOwotICAgICAgICBpZiAoIWZzX21ncl9yd19hY2Nlc3Mod29yaykpIGNvbnRpbnVlOwotICAgICAgICByZXR1cm4gZGlyOwotICAgIH0KLSAgICByZXR1cm4gIiI7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBLZXJuZWxTdXBwb3J0c1VzZXJYYXR0cnMoKSB7Ci0gICAgc3RydWN0IHV0c25hbWUgdXRzOwotICAgIHVuYW1lKCZ1dHMpOwotCi0gICAgaW50IG1ham9yLCBtaW5vcjsKLSAgICBpZiAoc3NjYW5mKHV0cy5yZWxlYXNlLCAiJWQuJWQiLCAmbWFqb3IsICZtaW5vcikgIT0gMikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBtYWpvciA+IDUgfHwgKG1ham9yID09IDUgJiYgbWlub3IgPj0gMTUpOwotfQotCi1jb25zdCBzdGQ6OnN0cmluZyBmc19tZ3JfbW91bnRfcG9pbnQoY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50X3BvaW50KSB7Ci0gICAgaWYgKCIvInMgIT0gbW91bnRfcG9pbnQpIHJldHVybiBtb3VudF9wb2ludDsKLSAgICByZXR1cm4gIi9zeXN0ZW0iOwotfQotCi0vLyBkZWZhdWx0IG9wdGlvbnMgZm9yIG1vdW50X3BvaW50LCByZXR1cm5zIGVtcHR5IHN0cmluZyBmb3Igbm9uZSBhdmFpbGFibGUuCi1zdGQ6OnN0cmluZyBmc19tZ3JfZ2V0X292ZXJsYXlmc19vcHRpb25zKGNvbnN0IEZzdGFiRW50cnkmIGVudHJ5KSB7Ci0gICAgY29uc3QgYXV0byBtb3VudF9wb2ludCA9IGZzX21ncl9tb3VudF9wb2ludChlbnRyeS5tb3VudF9wb2ludCk7Ci0gICAgYXV0byBjYW5kaWRhdGUgPSBmc19tZ3JfZ2V0X292ZXJsYXlmc19jYW5kaWRhdGUobW91bnRfcG9pbnQpOwotICAgIGlmIChjYW5kaWRhdGUuZW1wdHkoKSkgcmV0dXJuICIiOwotICAgIGF1dG8gcmV0ID0ga0xvd2VyZGlyT3B0aW9uICsgbW91bnRfcG9pbnQgKyAiLCIgKyBrVXBwZXJkaXJPcHRpb24gKyBjYW5kaWRhdGUgKyBrVXBwZXJOYW1lICsKLSAgICAgICAgICAgICAgICIsd29ya2Rpcj0iICsgY2FuZGlkYXRlICsga1dvcmtOYW1lOwotICAgIGlmIChmc19tZ3Jfb3ZlcmxheWZzX3ZhbGlkKCkgPT0gT3ZlcmxheWZzVmFsaWRSZXN1bHQ6OmtPdmVycmlkZUNyZWRzUmVxdWlyZWQpIHsKLSAgICAgICAgcmV0ICs9ICIsb3ZlcnJpZGVfY3JlZHM9b2ZmIjsKLSAgICB9Ci0gICAgaWYgKEtlcm5lbFN1cHBvcnRzVXNlclhhdHRycygpKSB7Ci0gICAgICAgIHJldCArPSAiLHVzZXJ4YXR0ciI7Ci0gICAgfQotICAgIGZvciAoY29uc3QgYXV0byYgZmxhZyA6IGFuZHJvaWQ6OmJhc2U6OlNwbGl0KGVudHJ5LmZzX29wdGlvbnMsICIsIikpIHsKLSAgICAgICAgaWYgKGFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGgoZmxhZywgImNvbnRleHQ9IikpIHsKLSAgICAgICAgICAgIHJldCArPSAiLCIgKyBmbGFnOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLWNvbnN0ZXhwciBjaGFyIGtPdmVybGF5ZnNGaWxlQ29udGV4dFtdID0gInU6b2JqZWN0X3I6b3ZlcmxheWZzX2ZpbGU6czAiOwotCi1jbGFzcyBBdXRvU2V0RnNDcmVhdGVDb24gZmluYWwgewotICBwdWJsaWM6Ci0gICAgQXV0b1NldEZzQ3JlYXRlQ29uKCkge30KLSAgICBBdXRvU2V0RnNDcmVhdGVDb24oY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRleHQpIHsgU2V0KGNvbnRleHQpOyB9Ci0gICAgfkF1dG9TZXRGc0NyZWF0ZUNvbigpIHsgUmVzdG9yZSgpOyB9Ci0KLSAgICBib29sIE9rKCkgY29uc3QgeyByZXR1cm4gb2tfOyB9Ci0gICAgYm9vbCBTZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRleHQpIHsKLSAgICAgICAgaWYgKHNldGZzY3JlYXRlY29uKGNvbnRleHQuY19zdHIoKSkpIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJzZXRmc2NyZWF0ZWNvbiAiIDw8IGNvbnRleHQ7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgb2tfID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGJvb2wgUmVzdG9yZSgpIHsKLSAgICAgICAgaWYgKHJlc3RvcmVkXyB8fCAhb2tfKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2V0ZnNjcmVhdGVjb24obnVsbHB0cikpIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJzZXRmc2NyZWF0ZWNvbiBudWxsIjsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXN0b3JlZF8gPSB0cnVlOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBib29sIG9rXyA9IGZhbHNlOwotICAgIGJvb2wgcmVzdG9yZWRfID0gZmFsc2U7Ci19OwotCi1zdGQ6OnN0cmluZyBmc19tZ3Jfb3ZlcmxheWZzX3NldHVwX2Rpcihjb25zdCBzdGQ6OnN0cmluZyYgZGlyKSB7Ci0gICAgYXV0byB0b3AgPSBkaXIgKyBrT3ZlcmxheVRvcERpcjsKLQotICAgIEF1dG9TZXRGc0NyZWF0ZUNvbiBjcmVhdGVjb24oa092ZXJsYXlmc0ZpbGVDb250ZXh0KTsKLSAgICBpZiAoIWNyZWF0ZWNvbi5PaygpKSB7Ci0gICAgICAgIHJldHVybiB7fTsKLSAgICB9Ci0gICAgaWYgKG1rZGlyKHRvcC5jX3N0cigpLCAwNzU1KSAhPSAwICYmIGVycm5vICE9IEVFWElTVCkgewotICAgICAgICBQRVJST1IgPDwgIm1rZGlyICIgPDwgdG9wOwotICAgICAgICByZXR1cm4ge307Ci0gICAgfQotICAgIGlmICghY3JlYXRlY29uLlJlc3RvcmUoKSkgewotICAgICAgICByZXR1cm4ge307Ci0gICAgfQotICAgIHJldHVybiB0b3A7Ci19Ci0KLWJvb2wgZnNfbWdyX292ZXJsYXlmc19zZXR1cF9vbmUoY29uc3Qgc3RkOjpzdHJpbmcmIG92ZXJsYXksIGNvbnN0IHN0ZDo6c3RyaW5nJiBtb3VudF9wb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogd2FudF9yZWJvb3QpIHsKLSAgICBpZiAoZnNfbWdyX292ZXJsYXlmc19hbHJlYWR5X21vdW50ZWQobW91bnRfcG9pbnQpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBhdXRvIGZzcmVjX21vdW50X3BvaW50ID0gb3ZlcmxheSArICIvIiArIGFuZHJvaWQ6OmJhc2U6OkJhc2VuYW1lKG1vdW50X3BvaW50KSArICIvIjsKLQotICAgIEF1dG9TZXRGc0NyZWF0ZUNvbiBjcmVhdGVjb24oa092ZXJsYXlmc0ZpbGVDb250ZXh0KTsKLSAgICBpZiAoIWNyZWF0ZWNvbi5PaygpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKG1rZGlyKGZzcmVjX21vdW50X3BvaW50LmNfc3RyKCksIDA3NTUpICE9IDAgJiYgZXJybm8gIT0gRUVYSVNUKSB7Ci0gICAgICAgIFBFUlJPUiA8PCAibWtkaXIgIiA8PCBmc3JlY19tb3VudF9wb2ludDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAobWtkaXIoKGZzcmVjX21vdW50X3BvaW50ICsga1dvcmtOYW1lKS5jX3N0cigpLCAwNzU1KSAhPSAwICYmIGVycm5vICE9IEVFWElTVCkgewotICAgICAgICBQRVJST1IgPDwgIm1rZGlyICIgPDwgZnNyZWNfbW91bnRfcG9pbnQgPDwga1dvcmtOYW1lOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmICghY3JlYXRlY29uLlJlc3RvcmUoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY3JlYXRlY29uID0ge307Ci0KLSAgICBhdXRvIG5ld19jb250ZXh0ID0gZnNfbWdyX2dldF9jb250ZXh0KG1vdW50X3BvaW50KTsKLSAgICBpZiAobmV3X2NvbnRleHQuZW1wdHkoKSB8fCAhY3JlYXRlY29uLlNldChuZXdfY29udGV4dCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGF1dG8gdXBwZXIgPSBmc3JlY19tb3VudF9wb2ludCArIGtVcHBlck5hbWU7Ci0gICAgaWYgKG1rZGlyKHVwcGVyLmNfc3RyKCksIDA3NTUpICE9IDAgJiYgZXJybm8gIT0gRUVYSVNUKSB7Ci0gICAgICAgIFBFUlJPUiA8PCAibWtkaXIgIiA8PCB1cHBlcjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoIWNyZWF0ZWNvbi5SZXN0b3JlKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICh3YW50X3JlYm9vdCkgKndhbnRfcmVib290ID0gdHJ1ZTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi11aW50MzJfdCBmc19tZ3Jfb3ZlcmxheWZzX3Nsb3RfbnVtYmVyKCkgewotICAgIHJldHVybiBTbG90TnVtYmVyRm9yU2xvdFN1ZmZpeChmc19tZ3JfZ2V0X3Nsb3Rfc3VmZml4KCkpOwotfQotCi1zdGQ6OnN0cmluZyBmc19tZ3Jfb3ZlcmxheWZzX3N1cGVyX2RldmljZSh1aW50MzJfdCBzbG90X251bWJlcikgewotICAgIHJldHVybiBrUGh5c2ljYWxEZXZpY2UgKyBmc19tZ3JfZ2V0X3N1cGVyX3BhcnRpdGlvbl9uYW1lKHNsb3RfbnVtYmVyKTsKLX0KLQotYm9vbCBmc19tZ3Jfb3ZlcmxheWZzX2hhc19sb2dpY2FsKGNvbnN0IEZzdGFiJiBmc3RhYikgewotICAgIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBmc3RhYikgewotICAgICAgICBpZiAoZW50cnkuZnNfbWdyX2ZsYWdzLmxvZ2ljYWwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLy8gUmV0dXJucyB0cnVlIGlmIGltbWVkaWF0ZSB1bm1vdW50IHN1Y2NlZWRlZCBhbmQgdGhlIHNjcmF0Y2ggbW91bnQgcG9pbnQgd2FzCi0vLyByZW1vdmVkLgotYm9vbCBmc19tZ3Jfb3ZlcmxheWZzX3Vtb3VudF9zY3JhdGNoKCkgewotICAgIGlmICh1bW91bnQoa1NjcmF0Y2hNb3VudFBvaW50LmNfc3RyKCkpICE9IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAocm1kaXIoa1NjcmF0Y2hNb3VudFBvaW50LmNfc3RyKCkpICE9IDAgJiYgZXJybm8gIT0gRU5PRU5UKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJybWRpciAiIDw8IGtTY3JhdGNoTW91bnRQb2ludDsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLU92ZXJsYXlmc1RlYXJkb3duUmVzdWx0IFRlYXJkb3duRGF0YVNjcmF0Y2goSUltYWdlTWFuYWdlciogaW1hZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFydGl0aW9uX25hbWUsIGJvb2wgd2FzX21vdW50ZWQpIHsKLSAgICBpZiAoIWltYWdlcykgewotICAgICAgICByZXR1cm4gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6OkVycm9yOwotICAgIH0KLSAgICBpZiAoIWltYWdlcy0+RGlzYWJsZUltYWdlKHBhcnRpdGlvbl9uYW1lKSkgewotICAgICAgICByZXR1cm4gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6OkVycm9yOwotICAgIH0KLSAgICBpZiAod2FzX21vdW50ZWQpIHsKLSAgICAgICAgLy8gSWYgb3ZlcmxheWZzIHdhcyBtb3VudGVkLCBkb24ndCBib3RoZXIgdHJ5aW5nIHRvIHVubWFwIHNpbmNlCi0gICAgICAgIC8vIGl0J2xsIGZhaWwgYW5kIGNyZWF0ZSBlcnJvciBzcGFtLgotICAgICAgICByZXR1cm4gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6OkJ1c3k7Ci0gICAgfQotICAgIGlmICghaW1hZ2VzLT5Vbm1hcEltYWdlSWZFeGlzdHMocGFydGl0aW9uX25hbWUpKSB7Ci0gICAgICAgIHJldHVybiBPdmVybGF5ZnNUZWFyZG93blJlc3VsdDo6QnVzeTsKLSAgICB9Ci0gICAgaWYgKCFpbWFnZXMtPkRlbGV0ZUJhY2tpbmdJbWFnZShwYXJ0aXRpb25fbmFtZSkpIHsKLSAgICAgICAgcmV0dXJuIE92ZXJsYXlmc1RlYXJkb3duUmVzdWx0OjpCdXN5OwotICAgIH0KLSAgICByZXR1cm4gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6Ok9rOwotfQotCi1PdmVybGF5ZnNUZWFyZG93blJlc3VsdCBmc19tZ3Jfb3ZlcmxheWZzX3RlYXJkb3duX3NjcmF0Y2goY29uc3Qgc3RkOjpzdHJpbmcmIG92ZXJsYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogY2hhbmdlKSB7Ci0gICAgLy8gdW1vdW50IGFuZCBkZWxldGUga1NjcmF0Y2hNb3VudFBvaW50IHN0b3JhZ2UgaWYgd2UgaGF2ZSBsb2dpY2FsIHBhcnRpdGlvbnMKLSAgICBpZiAob3ZlcmxheSAhPSBrU2NyYXRjaE1vdW50UG9pbnQpIHsKLSAgICAgICAgcmV0dXJuIE92ZXJsYXlmc1RlYXJkb3duUmVzdWx0OjpPazsKLSAgICB9Ci0KLSAgICAvLyBWYWxpZGF0aW9uIGNoZWNrLgotICAgIGlmIChmc19tZ3JfaXNfZHN1X3J1bm5pbmcoKSkgewotICAgICAgICBMRVJST1IgPDwgIkRlc3Ryb3lpbmcgRFNVIHNjcmF0Y2ggaXMgbm90IGFsbG93ZWQuIjsKLSAgICAgICAgcmV0dXJuIE92ZXJsYXlmc1RlYXJkb3duUmVzdWx0OjpFcnJvcjsKLSAgICB9Ci0KLSAgICBib29sIHdhc19tb3VudGVkID0gZnNfbWdyX292ZXJsYXlmc19hbHJlYWR5X21vdW50ZWQoa1NjcmF0Y2hNb3VudFBvaW50LCBmYWxzZSk7Ci0gICAgaWYgKHdhc19tb3VudGVkKSB7Ci0gICAgICAgIGZzX21ncl9vdmVybGF5ZnNfdW1vdW50X3NjcmF0Y2goKTsKLSAgICB9Ci0KLSAgICBjb25zdCBhdXRvIHBhcnRpdGlvbl9uYW1lID0gYW5kcm9pZDo6YmFzZTo6QmFzZW5hbWUoa1NjcmF0Y2hNb3VudFBvaW50KTsKLQotICAgIGF1dG8gaW1hZ2VzID0gSUltYWdlTWFuYWdlcjo6T3BlbigicmVtb3VudCIsIDEwcyk7Ci0gICAgaWYgKGltYWdlcyAmJiBpbWFnZXMtPkJhY2tpbmdJbWFnZUV4aXN0cyhwYXJ0aXRpb25fbmFtZSkpIHsKLSAgICAgICAgLy8gTm8gbmVlZCB0byBjaGVjayBzdXBlciBwYXJ0aXRpb24sIGlmIHdlIGtuZXcgd2UgaGFkIGEgc2NyYXRjaCBkZXZpY2UKLSAgICAgICAgLy8gaW4gL2RhdGEuCi0gICAgICAgIHJldHVybiBUZWFyZG93bkRhdGFTY3JhdGNoKGltYWdlcy5nZXQoKSwgcGFydGl0aW9uX25hbWUsIHdhc19tb3VudGVkKTsKLSAgICB9Ci0KLSAgICBhdXRvIHNsb3RfbnVtYmVyID0gZnNfbWdyX292ZXJsYXlmc19zbG90X251bWJlcigpOwotICAgIGF1dG8gc3VwZXJfZGV2aWNlID0gZnNfbWdyX292ZXJsYXlmc19zdXBlcl9kZXZpY2Uoc2xvdF9udW1iZXIpOwotICAgIGlmICghZnNfbWdyX3J3X2FjY2VzcyhzdXBlcl9kZXZpY2UpKSB7Ci0gICAgICAgIHJldHVybiBPdmVybGF5ZnNUZWFyZG93blJlc3VsdDo6T2s7Ci0gICAgfQotCi0gICAgYXV0byBidWlsZGVyID0gTWV0YWRhdGFCdWlsZGVyOjpOZXcoc3VwZXJfZGV2aWNlLCBzbG90X251bWJlcik7Ci0gICAgaWYgKCFidWlsZGVyKSB7Ci0gICAgICAgIHJldHVybiBPdmVybGF5ZnNUZWFyZG93blJlc3VsdDo6T2s7Ci0gICAgfQotICAgIGlmIChidWlsZGVyLT5GaW5kUGFydGl0aW9uKHBhcnRpdGlvbl9uYW1lKSA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBPdmVybGF5ZnNUZWFyZG93blJlc3VsdDo6T2s7Ci0gICAgfQotICAgIGJ1aWxkZXItPlJlbW92ZVBhcnRpdGlvbihwYXJ0aXRpb25fbmFtZSk7Ci0gICAgYXV0byBtZXRhZGF0YSA9IGJ1aWxkZXItPkV4cG9ydCgpOwotICAgIGlmIChtZXRhZGF0YSAmJiBVcGRhdGVQYXJ0aXRpb25UYWJsZShzdXBlcl9kZXZpY2UsICptZXRhZGF0YS5nZXQoKSwgc2xvdF9udW1iZXIpKSB7Ci0gICAgICAgIGlmIChjaGFuZ2UpICpjaGFuZ2UgPSB0cnVlOwotICAgICAgICBpZiAoIURlc3Ryb3lMb2dpY2FsUGFydGl0aW9uKHBhcnRpdGlvbl9uYW1lKSkgewotICAgICAgICAgICAgcmV0dXJuIE92ZXJsYXlmc1RlYXJkb3duUmVzdWx0OjpFcnJvcjsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIExFUlJPUiA8PCAiZGVsZXRlIHBhcnRpdGlvbiAiIDw8IG92ZXJsYXk7Ci0gICAgICAgIHJldHVybiBPdmVybGF5ZnNUZWFyZG93blJlc3VsdDo6RXJyb3I7Ci0gICAgfQotCi0gICAgaWYgKHdhc19tb3VudGVkKSB7Ci0gICAgICAgIHJldHVybiBPdmVybGF5ZnNUZWFyZG93blJlc3VsdDo6QnVzeTsKLSAgICB9Ci0gICAgcmV0dXJuIE92ZXJsYXlmc1RlYXJkb3duUmVzdWx0OjpPazsKLX0KLQotYm9vbCBmc19tZ3Jfb3ZlcmxheWZzX3RlYXJkb3duX29uZShjb25zdCBzdGQ6OnN0cmluZyYgb3ZlcmxheSwgY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50X3BvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBjaGFuZ2UsIGJvb2wqIHNob3VsZF9kZXN0cm95X3NjcmF0Y2ggPSBudWxscHRyKSB7Ci0gICAgY29uc3QgYXV0byB0b3AgPSBvdmVybGF5ICsga092ZXJsYXlUb3BEaXI7Ci0KLSAgICBpZiAoIWZzX21ncl9hY2Nlc3ModG9wKSkgewotICAgICAgICBpZiAoc2hvdWxkX2Rlc3Ryb3lfc2NyYXRjaCkgKnNob3VsZF9kZXN0cm95X3NjcmF0Y2ggPSB0cnVlOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBhdXRvIGNsZWFudXBfYWxsID0gbW91bnRfcG9pbnQuZW1wdHkoKTsKLSAgICBjb25zdCBhdXRvIHBhcnRpdGlvbl9uYW1lID0gYW5kcm9pZDo6YmFzZTo6QmFzZW5hbWUobW91bnRfcG9pbnQpOwotICAgIGNvbnN0IGF1dG8gb2xkcGF0aCA9IHRvcCArIChjbGVhbnVwX2FsbCA/ICIiIDogKCIvIiArIHBhcnRpdGlvbl9uYW1lKSk7Ci0gICAgY29uc3QgYXV0byBuZXdwYXRoID0gY2xlYW51cF9hbGwgPyBvdmVybGF5ICsgIi8uIiArIGtPdmVybGF5VG9wRGlyLnN1YnN0cigxKSArICIudGVhcmRvd24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0b3AgKyAiLy4iICsgcGFydGl0aW9uX25hbWUgKyAiLnRlYXJkb3duIjsKLSAgICBhdXRvIHJldCA9IGZzX21ncl9ybV9hbGwobmV3cGF0aCk7Ci0gICAgaWYgKCFyZW5hbWUob2xkcGF0aC5jX3N0cigpLCBuZXdwYXRoLmNfc3RyKCkpKSB7Ci0gICAgICAgIGlmIChjaGFuZ2UpICpjaGFuZ2UgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAoZXJybm8gIT0gRU5PRU5UKSB7Ci0gICAgICAgIHJldCA9IGZhbHNlOwotICAgICAgICBQRVJST1IgPDwgIm12ICIgPDwgb2xkcGF0aCA8PCAiICIgPDwgbmV3cGF0aDsKLSAgICB9Ci0gICAgcmV0ICY9IGZzX21ncl9ybV9hbGwobmV3cGF0aCwgY2hhbmdlKTsKLSAgICBpZiAoIXJtZGlyKG5ld3BhdGguY19zdHIoKSkpIHsKLSAgICAgICAgaWYgKGNoYW5nZSkgKmNoYW5nZSA9IHRydWU7Ci0gICAgfSBlbHNlIGlmIChlcnJubyAhPSBFTk9FTlQpIHsKLSAgICAgICAgcmV0ID0gZmFsc2U7Ci0gICAgICAgIFBFUlJPUiA8PCAicm1kaXIgIiA8PCBuZXdwYXRoOwotICAgIH0KLSAgICBpZiAoIWNsZWFudXBfYWxsKSB7Ci0gICAgICAgIGlmICghcm1kaXIodG9wLmNfc3RyKCkpKSB7Ci0gICAgICAgICAgICBpZiAoY2hhbmdlKSAqY2hhbmdlID0gdHJ1ZTsKLSAgICAgICAgICAgIGNsZWFudXBfYWxsID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChlcnJubyA9PSBFTk9URU1QVFkpIHsKLSAgICAgICAgICAgIGNsZWFudXBfYWxsID0gdHJ1ZTsKLSAgICAgICAgICAgIC8vIGNsZWFudXAgYWxsIGlmIHRoZSBjb250ZW50IGlzIGFsbCBoaWRkZW4gKGxlYWRpbmcgLikKLSAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxESVIsIGRlY2x0eXBlKCZjbG9zZWRpcik+IGRpcihvcGVuZGlyKHRvcC5jX3N0cigpKSwgY2xvc2VkaXIpOwotICAgICAgICAgICAgaWYgKCFkaXIpIHsKLSAgICAgICAgICAgICAgICBQRVJST1IgPDwgIm9wZW5kaXIgIiA8PCB0b3A7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRpcmVudCogZW50cnk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKChlbnRyeSA9IHJlYWRkaXIoZGlyLmdldCgpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LT5kX25hbWVbMF0gIT0gJy4nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbGVhbnVwX2FsbCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZXJybm8gPT0gRU5PRU5UKSB7Ci0gICAgICAgICAgICBjbGVhbnVwX2FsbCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXQgPSBmYWxzZTsKLSAgICAgICAgICAgIFBFUlJPUiA8PCAicm1kaXIgIiA8PCB0b3A7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHNob3VsZF9kZXN0cm95X3NjcmF0Y2gpICpzaG91bGRfZGVzdHJveV9zY3JhdGNoID0gY2xlYW51cF9hbGw7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotYm9vbCBmc19tZ3Jfb3ZlcmxheWZzX3NldF9zaGFyZWRfbW91bnQoY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50X3BvaW50LCBib29sIHNoYXJlZF9mbGFnKSB7Ci0gICAgYXV0byByZXQgPSBtb3VudChudWxscHRyLCBtb3VudF9wb2ludC5jX3N0cigpLCBudWxscHRyLCBzaGFyZWRfZmxhZyA/IE1TX1NIQVJFRCA6IE1TX1BSSVZBVEUsCi0gICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKLSAgICBpZiAocmV0KSB7Ci0gICAgICAgIFBFUlJPUiA8PCAiX19tb3VudCh0YXJnZXQ9IiA8PCBtb3VudF9wb2ludAotICAgICAgICAgICAgICAgPDwgIixmbGFnPSIgPDwgKHNoYXJlZF9mbGFnID8gIk1TX1NIQVJFRCIgOiAiTVNfUFJJVkFURSIpIDw8ICIpPSIgPDwgcmV0OwotICAgICAgICAvLyBJZiAiL3N5c3RlbSIgZG9lc24ndCBsb29rIGxpa2UgYSBtb3VudHBvaW50LCByZXRyeSB3aXRoICIvIi4KLSAgICAgICAgaWYgKGVycm5vID09IEVJTlZBTCAmJiBtb3VudF9wb2ludCA9PSAiL3N5c3RlbSIpIHsKLSAgICAgICAgICAgIHJldHVybiBmc19tZ3Jfb3ZlcmxheWZzX3NldF9zaGFyZWRfbW91bnQoIi8iLCBzaGFyZWRfZmxhZyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBmc19tZ3Jfb3ZlcmxheWZzX21vdmVfbW91bnQoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldCkgewotICAgIGF1dG8gcmV0ID0gbW91bnQoc291cmNlLmNfc3RyKCksIHRhcmdldC5jX3N0cigpLCBudWxscHRyLCBNU19NT1ZFLCBudWxscHRyKTsKLSAgICBpZiAocmV0KSB7Ci0gICAgICAgIFBFUlJPUiA8PCAiX19tb3VudChzb3VyY2U9IiA8PCBzb3VyY2UgPDwgIix0YXJnZXQ9IiA8PCB0YXJnZXQgPDwgIixmbGFnPU1TX01PVkUpPSIgPDwgcmV0OwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1zdHJ1Y3QgbW91bnRfaW5mbyB7Ci0gICAgc3RkOjpzdHJpbmcgbW91bnRfcG9pbnQ7Ci0gICAgYm9vbCBzaGFyZWRfZmxhZzsKLX07Ci0KLXN0ZDo6dmVjdG9yPG1vdW50X2luZm8+IFJlYWRNb3VudGluZm9Gcm9tRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgewotICAgIHN0ZDo6dmVjdG9yPG1vdW50X2luZm8+IGluZm87Ci0KLSAgICBhdXRvIGZpbGUgPSBzdGQ6OnVuaXF1ZV9wdHI8RklMRSwgZGVjbHR5cGUoJmZjbG9zZSk+e2ZvcGVuKHBhdGguY19zdHIoKSwgInJlIiksIGZjbG9zZX07Ci0gICAgaWYgKCFmaWxlKSB7Ci0gICAgICAgIFBFUlJPUiA8PCBfX0ZVTkNUSU9OX18gPDwgIigpOiBjYW5ub3Qgb3BlbiBmaWxlOiAnIiA8PCBwYXRoIDw8ICInIjsKLSAgICAgICAgcmV0dXJuIGluZm87Ci0gICAgfQotCi0gICAgc3NpemVfdCBsZW47Ci0gICAgc2l6ZV90IGFsbG9jX2xlbiA9IDA7Ci0gICAgY2hhciogbGluZSA9IG51bGxwdHI7Ci0gICAgd2hpbGUgKChsZW4gPSBnZXRsaW5lKCZsaW5lLCAmYWxsb2NfbGVuLCBmaWxlLmdldCgpKSkgIT0gLTEpIHsKLSAgICAgICAgLyogaWYgdGhlIGxhc3QgY2hhcmFjdGVyIGlzIGEgbmV3bGluZSwgc2hvcnRlbiB0aGUgc3RyaW5nIGJ5IDEgYnl0ZSAqLwotICAgICAgICBpZiAobGluZVtsZW4gLSAxXSA9PSAnXG4nKSB7Ci0gICAgICAgICAgICBsaW5lW2xlbiAtIDFdID0gJ1wwJzsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBkZWxpbVtdID0gIiBcdCI7Ci0gICAgICAgIGNoYXIqIHNhdmVfcHRyOwotICAgICAgICBpZiAoIXN0cnRva19yKGxpbmUsIGRlbGltLCAmc2F2ZV9wdHIpKSB7Ci0gICAgICAgICAgICBMRVJST1IgPDwgIkVycm9yIHBhcnNpbmcgbW91bnQgSUQiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFzdHJ0b2tfcihudWxscHRyLCBkZWxpbSwgJnNhdmVfcHRyKSkgewotICAgICAgICAgICAgTEVSUk9SIDw8ICJFcnJvciBwYXJzaW5nIHBhcmVudCBJRCI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXN0cnRva19yKG51bGxwdHIsIGRlbGltLCAmc2F2ZV9wdHIpKSB7Ci0gICAgICAgICAgICBMRVJST1IgPDwgIkVycm9yIHBhcnNpbmcgbW91bnQgc291cmNlIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmICghc3RydG9rX3IobnVsbHB0ciwgZGVsaW0sICZzYXZlX3B0cikpIHsKLSAgICAgICAgICAgIExFUlJPUiA8PCAiRXJyb3IgcGFyc2luZyByb290IjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2hhciogcDsKLSAgICAgICAgaWYgKCEocCA9IHN0cnRva19yKG51bGxwdHIsIGRlbGltLCAmc2F2ZV9wdHIpKSkgewotICAgICAgICAgICAgTEVSUk9SIDw8ICJFcnJvciBwYXJzaW5nIG1vdW50X3BvaW50IjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIG1vdW50X2luZm8gZW50cnkgPSB7cCwgZmFsc2V9OwotCi0gICAgICAgIGlmICghc3RydG9rX3IobnVsbHB0ciwgZGVsaW0sICZzYXZlX3B0cikpIHsKLSAgICAgICAgICAgIExFUlJPUiA8PCAiRXJyb3IgcGFyc2luZyBtb3VudF9mbGFncyI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlICgocCA9IHN0cnRva19yKG51bGxwdHIsIGRlbGltLCAmc2F2ZV9wdHIpKSkgewotICAgICAgICAgICAgaWYgKChwWzBdID09ICctJykgJiYgKHBbMV0gPT0gJ1wwJykpIGJyZWFrOwotICAgICAgICAgICAgaWYgKGFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGgocCwgInNoYXJlZDoiKSkgZW50cnkuc2hhcmVkX2ZsYWcgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcCkgewotICAgICAgICAgICAgTEVSUk9SIDw8ICJFcnJvciBwYXJzaW5nIGZpZWxkcyI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpbmZvLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoZW50cnkpKTsKLSAgICB9Ci0KLSAgICBmcmVlKGxpbmUpOwotICAgIGlmIChpbmZvLmVtcHR5KCkpIHsKLSAgICAgICAgTEVSUk9SIDw8IF9fRlVOQ1RJT05fXyA8PCAiKCk6IGZhaWxlZCB0byBsb2FkIG1vdW50aW5mbyBmcm9tIDogJyIgPDwgcGF0aCA8PCAiJyI7Ci0gICAgfQotICAgIHJldHVybiBpbmZvOwotfQotCi1ib29sIGZzX21ncl9vdmVybGF5ZnNfbW91bnQoY29uc3QgRnN0YWJFbnRyeSYgZW50cnkpIHsKLSAgICBjb25zdCBhdXRvIG1vdW50X3BvaW50ID0gZnNfbWdyX21vdW50X3BvaW50KGVudHJ5Lm1vdW50X3BvaW50KTsKLSAgICBjb25zdCBhdXRvIG9wdGlvbnMgPSBmc19tZ3JfZ2V0X292ZXJsYXlmc19vcHRpb25zKGVudHJ5KTsKLSAgICBpZiAob3B0aW9ucy5lbXB0eSgpKSByZXR1cm4gZmFsc2U7Ci0KLSAgICBhdXRvIHJldHZhbCA9IHRydWU7Ci0KLSAgICBzdHJ1Y3QgbW92ZV9lbnRyeSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIG1vdW50X3BvaW50OwotICAgICAgICBzdGQ6OnN0cmluZyBkaXI7Ci0gICAgICAgIGJvb2wgc2hhcmVkX2ZsYWc7Ci0gICAgfTsKLSAgICBzdGQ6OnZlY3Rvcjxtb3ZlX2VudHJ5PiBtb3ZlOwotICAgIGF1dG8gcGFyZW50X3ByaXZhdGUgPSBmYWxzZTsKLSAgICBhdXRvIHBhcmVudF9tYWRlX3ByaXZhdGUgPSBmYWxzZTsKLSAgICBhdXRvIGRldl9wcml2YXRlID0gZmFsc2U7Ci0gICAgYXV0byBkZXZfbWFkZV9wcml2YXRlID0gZmFsc2U7Ci0gICAgZm9yIChhdXRvJiBlbnRyeSA6IFJlYWRNb3VudGluZm9Gcm9tRmlsZSgiL3Byb2Mvc2VsZi9tb3VudGluZm8iKSkgewotICAgICAgICBpZiAoKGVudHJ5Lm1vdW50X3BvaW50ID09IG1vdW50X3BvaW50KSAmJiAhZW50cnkuc2hhcmVkX2ZsYWcpIHsKLSAgICAgICAgICAgIHBhcmVudF9wcml2YXRlID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGVudHJ5Lm1vdW50X3BvaW50ID09ICIvZGV2IikgJiYgIWVudHJ5LnNoYXJlZF9mbGFnKSB7Ci0gICAgICAgICAgICBkZXZfcHJpdmF0ZSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGgoZW50cnkubW91bnRfcG9pbnQsIG1vdW50X3BvaW50ICsgIi8iKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0ZDo6ZmluZF9pZihtb3ZlLmJlZ2luKCksIG1vdmUuZW5kKCksIFsmZW50cnldKGNvbnN0IGF1dG8mIGl0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGgoZW50cnkubW91bnRfcG9pbnQsIGl0Lm1vdW50X3BvaW50ICsgIi8iKTsKLSAgICAgICAgICAgIH0pICE9IG1vdmUuZW5kKCkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdXNlIGFzIHRoZSBib3VuZCBkaXJlY3RvcnkgaW4gL2Rldi4KLSAgICAgICAgQXV0b1NldEZzQ3JlYXRlQ29uIGNyZWF0ZWNvbjsKLSAgICAgICAgYXV0byBuZXdfY29udGV4dCA9IGZzX21ncl9nZXRfY29udGV4dChlbnRyeS5tb3VudF9wb2ludCk7Ci0gICAgICAgIGlmIChuZXdfY29udGV4dC5lbXB0eSgpIHx8ICFjcmVhdGVjb24uU2V0KG5ld19jb250ZXh0KSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgbW92ZV9lbnRyeSBuZXdfZW50cnkgPSB7c3RkOjptb3ZlKGVudHJ5Lm1vdW50X3BvaW50KSwgIi9kZXYvVGVtcG9yYXJ5RGlyLVhYWFhYWCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnNoYXJlZF9mbGFnfTsKLSAgICAgICAgY29uc3QgYXV0byB0YXJnZXQgPSBta2R0ZW1wKG5ld19lbnRyeS5kaXIuZGF0YSgpKTsKLSAgICAgICAgaWYgKCFjcmVhdGVjb24uUmVzdG9yZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCF0YXJnZXQpIHsKLSAgICAgICAgICAgIHJldHZhbCA9IGZhbHNlOwotICAgICAgICAgICAgUEVSUk9SIDw8ICJ0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBNU19CSU5EIjsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFwYXJlbnRfcHJpdmF0ZSAmJiAhcGFyZW50X21hZGVfcHJpdmF0ZSkgewotICAgICAgICAgICAgcGFyZW50X21hZGVfcHJpdmF0ZSA9IGZzX21ncl9vdmVybGF5ZnNfc2V0X3NoYXJlZF9tb3VudChtb3VudF9wb2ludCwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuZXdfZW50cnkuc2hhcmVkX2ZsYWcpIHsKLSAgICAgICAgICAgIG5ld19lbnRyeS5zaGFyZWRfZmxhZyA9IGZzX21ncl9vdmVybGF5ZnNfc2V0X3NoYXJlZF9tb3VudChuZXdfZW50cnkubW91bnRfcG9pbnQsIGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWZzX21ncl9vdmVybGF5ZnNfbW92ZV9tb3VudChuZXdfZW50cnkubW91bnRfcG9pbnQsIG5ld19lbnRyeS5kaXIpKSB7Ci0gICAgICAgICAgICByZXR2YWwgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChuZXdfZW50cnkuc2hhcmVkX2ZsYWcpIHsKLSAgICAgICAgICAgICAgICBmc19tZ3Jfb3ZlcmxheWZzX3NldF9zaGFyZWRfbW91bnQobmV3X2VudHJ5Lm1vdW50X3BvaW50LCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIG1vdmUuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShuZXdfZW50cnkpKTsKLSAgICB9Ci0KLSAgICAvLyBoaWphY2sgX19tb3VudCgpIHJlcG9ydCBmb3JtYXQgdG8gaGVscCB0cmlhZ2UKLSAgICBhdXRvIHJlcG9ydCA9ICJfX21vdW50KHNvdXJjZT1vdmVybGF5LHRhcmdldD0icyArIG1vdW50X3BvaW50ICsgIix0eXBlPW92ZXJsYXkiOwotICAgIGNvbnN0IGF1dG8gb3B0X2xpc3QgPSBhbmRyb2lkOjpiYXNlOjpTcGxpdChvcHRpb25zLCAiLCIpOwotICAgIGZvciAoY29uc3QgYXV0byYgb3B0IDogb3B0X2xpc3QpIHsKLSAgICAgICAgaWYgKGFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGgob3B0LCBrVXBwZXJkaXJPcHRpb24pKSB7Ci0gICAgICAgICAgICByZXBvcnQgPSByZXBvcnQgKyAiLCIgKyBvcHQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXBvcnQgPSByZXBvcnQgKyAiKT0iOwotCi0gICAgYXV0byByZXQgPSBtb3VudCgib3ZlcmxheSIsIG1vdW50X3BvaW50LmNfc3RyKCksICJvdmVybGF5IiwgTVNfUkRPTkxZIHwgTVNfTk9BVElNRSwKLSAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY19zdHIoKSk7Ci0gICAgaWYgKHJldCkgewotICAgICAgICByZXR2YWwgPSBmYWxzZTsKLSAgICAgICAgUEVSUk9SIDw8IHJlcG9ydCA8PCByZXQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTElORk8gPDwgcmVwb3J0IDw8IHJldDsKLSAgICB9Ci0KLSAgICAvLyBNb3ZlIHN1Ym1vdW50cyBiYWNrLgotICAgIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBtb3ZlKSB7Ci0gICAgICAgIGlmICghZGV2X3ByaXZhdGUgJiYgIWRldl9tYWRlX3ByaXZhdGUpIHsKLSAgICAgICAgICAgIGRldl9tYWRlX3ByaXZhdGUgPSBmc19tZ3Jfb3ZlcmxheWZzX3NldF9zaGFyZWRfbW91bnQoIi9kZXYiLCBmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWZzX21ncl9vdmVybGF5ZnNfbW92ZV9tb3VudChlbnRyeS5kaXIsIGVudHJ5Lm1vdW50X3BvaW50KSkgewotICAgICAgICAgICAgcmV0dmFsID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZiAoZW50cnkuc2hhcmVkX2ZsYWcgJiYKLSAgICAgICAgICAgICAgICAgICAhZnNfbWdyX292ZXJsYXlmc19zZXRfc2hhcmVkX21vdW50KGVudHJ5Lm1vdW50X3BvaW50LCB0cnVlKSkgewotICAgICAgICAgICAgcmV0dmFsID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcm1kaXIoZW50cnkuZGlyLmNfc3RyKCkpOwotICAgIH0KLSAgICBpZiAoZGV2X21hZGVfcHJpdmF0ZSkgewotICAgICAgICBmc19tZ3Jfb3ZlcmxheWZzX3NldF9zaGFyZWRfbW91bnQoIi9kZXYiLCB0cnVlKTsKLSAgICB9Ci0gICAgaWYgKHBhcmVudF9tYWRlX3ByaXZhdGUpIHsKLSAgICAgICAgZnNfbWdyX292ZXJsYXlmc19zZXRfc2hhcmVkX21vdW50KG1vdW50X3BvaW50LCB0cnVlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi0vLyBNb3VudCBrU2NyYXRjaE1vdW50UG9pbnQKLWJvb2wgTW91bnRTY3JhdGNoKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfcGF0aCwgYm9vbCByZWFkb25seSA9IGZhbHNlKSB7Ci0gICAgaWYgKHJlYWRvbmx5KSB7Ci0gICAgICAgIGlmICghZnNfbWdyX2FjY2VzcyhkZXZpY2VfcGF0aCkpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlBhdGggZG9lcyBub3QgZXhpc3Q6ICIgPDwgZGV2aWNlX3BhdGg7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCFmc19tZ3JfcndfYWNjZXNzKGRldmljZV9wYXRoKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJQYXRoIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCByZWFkd3JpdGU6ICIgPDwgZGV2aWNlX3BhdGg7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gZmlsZXN5c3RlbV9jYW5kaWRhdGVzOwotICAgIGlmIChmc19tZ3JfaXNfZjJmcyhkZXZpY2VfcGF0aCkpIHsKLSAgICAgICAgZmlsZXN5c3RlbV9jYW5kaWRhdGVzID0geyJmMmZzIiwgImV4dDQifTsKLSAgICB9IGVsc2UgaWYgKGZzX21ncl9pc19leHQ0KGRldmljZV9wYXRoKSkgewotICAgICAgICBmaWxlc3lzdGVtX2NhbmRpZGF0ZXMgPSB7ImV4dDQiLCAiZjJmcyJ9OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIlNjcmF0Y2ggcGFydGl0aW9uIGlzIG5vdCBmMmZzIG9yIGV4dDQiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQXV0b1NldEZzQ3JlYXRlQ29uIGNyZWF0ZWNvbihrT3ZlcmxheWZzRmlsZUNvbnRleHQpOwotICAgIGlmICghY3JlYXRlY29uLk9rKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAobWtkaXIoa1NjcmF0Y2hNb3VudFBvaW50LmNfc3RyKCksIDA3NTUpICYmIChlcnJubyAhPSBFRVhJU1QpKSB7Ci0gICAgICAgIFBFUlJPUiA8PCAiY3JlYXRlICIgPDwga1NjcmF0Y2hNb3VudFBvaW50OwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgRnN0YWJFbnRyeSBlbnRyeTsKLSAgICBlbnRyeS5ibGtfZGV2aWNlID0gZGV2aWNlX3BhdGg7Ci0gICAgZW50cnkubW91bnRfcG9pbnQgPSBrU2NyYXRjaE1vdW50UG9pbnQ7Ci0gICAgZW50cnkuZmxhZ3MgPSBNU19OT0FUSU1FIHwgTVNfUkRPTkxZOwotICAgIGlmICghcmVhZG9ubHkpIHsKLSAgICAgICAgZW50cnkuZmxhZ3MgJj0gfk1TX1JET05MWTsKLSAgICAgICAgZW50cnkuZmxhZ3MgfD0gTVNfU1lOQ0hST05PVVM7Ci0gICAgICAgIGVudHJ5LmZzX29wdGlvbnMgPSAibm9kaXNjYXJkIjsKLSAgICAgICAgZnNfbWdyX3NldF9ibGtfcm8oZGV2aWNlX3BhdGgsIGZhbHNlKTsKLSAgICB9Ci0gICAgLy8gY2hlY2tfZnMgcmVxdWlyZXMgYXBleCBydW50aW1lIGxpYnJhcnkKLSAgICBpZiAoZnNfbWdyX292ZXJsYXlmc19hbHJlYWR5X21vdW50ZWQoIi9kYXRhIiwgZmFsc2UpKSB7Ci0gICAgICAgIGVudHJ5LmZzX21ncl9mbGFncy5jaGVjayA9IHRydWU7Ci0gICAgfQotICAgIGJvb2wgbW91bnRlZCA9IGZhbHNlOwotICAgIGZvciAoYXV0byBmc190eXBlIDogZmlsZXN5c3RlbV9jYW5kaWRhdGVzKSB7Ci0gICAgICAgIGVudHJ5LmZzX3R5cGUgPSBmc190eXBlOwotICAgICAgICBpZiAoZnNfbWdyX2RvX21vdW50X29uZShlbnRyeSkgPT0gMCkgewotICAgICAgICAgICAgbW91bnRlZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIWNyZWF0ZWNvbi5SZXN0b3JlKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoIW1vdW50ZWQpIHsKLSAgICAgICAgcm1kaXIoa1NjcmF0Y2hNb3VudFBvaW50LmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBzdGQ6OnN0cmluZyBrTWtGMmZzKCIvc3lzdGVtL2Jpbi9tYWtlX2YyZnMiKTsKLWNvbnN0IHN0ZDo6c3RyaW5nIGtNa0V4dDQoIi9zeXN0ZW0vYmluL21rZTJmcyIpOwotCi0vLyBOb3RlOiBUaGUgc2NyYXRjaCBwYXJ0aXRpb24gb2YgRFNVIGlzIG1hbmFnZWQgYnkgZ3NpZCwgYW5kIHNob3VsZCBiZSBpbml0aWFsaXplZCBkdXJpbmcKLS8vIGZpcnN0LXN0YWdlLW1vdW50LiBKdXN0IGNoZWNrIGlmIHRoZSBETSBkZXZpY2UgZm9yIERTVSBzY3JhdGNoIHBhcnRpdGlvbiBpcyBjcmVhdGVkIG9yIG5vdC4KLXN0YXRpYyBzdGQ6OnN0cmluZyBHZXREc3VTY3JhdGNoRGV2aWNlKCkgewotICAgIGF1dG8mIGRtID0gRGV2aWNlTWFwcGVyOjpJbnN0YW5jZSgpOwotICAgIHN0ZDo6c3RyaW5nIGRldmljZTsKLSAgICBpZiAoZG0uR2V0U3RhdGUoYW5kcm9pZDo6Z3NpOjprRHN1U2NyYXRjaCkgIT0gRG1EZXZpY2VTdGF0ZTo6SU5WQUxJRCAmJgotICAgICAgICBkbS5HZXREbURldmljZVBhdGhCeU5hbWUoYW5kcm9pZDo6Z3NpOjprRHN1U2NyYXRjaCwgJmRldmljZSkpIHsKLSAgICAgICAgcmV0dXJuIGRldmljZTsKLSAgICB9Ci0gICAgcmV0dXJuICIiOwotfQotCi0vLyBUaGlzIHJldHVybnMgdGhlIHNjcmF0Y2ggZGV2aWNlIHRoYXQgd2FzIGRldGVjdGVkIGR1cmluZyBlYXJseSBib290IChmaXJzdC0KLS8vIHN0YWdlIGluaXQpLiBJZiB0aGUgZGV2aWNlIHdhcyBjcmVhdGVkIGxhdGVyLCBmb3IgZXhhbXBsZSBkdXJpbmcgc2V0dXAgZm9yCi0vLyB0aGUgYWRiIHJlbW91bnQgY29tbWFuZCwgaXQgY2FuIHJldHVybiBhbiBlbXB0eSBzdHJpbmcgc2luY2UgaXQgZG9lcyBub3QKLS8vIHF1ZXJ5IEltYWdlTWFuYWdlci4gKE5vdGUgdGhhdCBJbWFnZU1hbmFnZXIgaW4gZmlyc3Qtc3RhZ2UgaW5pdCB3aWxsIGFsd2F5cwotLy8gdXNlIGRldmljZS1tYXBwZXIsIHNpbmNlIC9kYXRhIGlzIG5vdCBhdmFpbGFibGUgdG8gdXNlIGxvb3AgZGV2aWNlcy4pCi1zdGF0aWMgc3RkOjpzdHJpbmcgR2V0Qm9vdFNjcmF0Y2hEZXZpY2UoKSB7Ci0gICAgLy8gTm90ZTogZnNfbWdyX2lzX2RzdV9ydW5uaW5nKCkgYWx3YXlzIHJldHVybnMgZmFsc2UgaW4gcmVjb3Zlcnkgb3IgZmFzdGJvb3RkLgotICAgIGlmIChmc19tZ3JfaXNfZHN1X3J1bm5pbmcoKSkgewotICAgICAgICByZXR1cm4gR2V0RHN1U2NyYXRjaERldmljZSgpOwotICAgIH0KLQotICAgIGF1dG8mIGRtID0gRGV2aWNlTWFwcGVyOjpJbnN0YW5jZSgpOwotCi0gICAgLy8gSWYgdGhlcmUgaXMgYSBzY3JhdGNoIHBhcnRpdGlvbiBhbGxvY2F0ZWQgaW4gL2RhdGEgb3Igb24gc3VwZXIsIHdlCi0gICAgLy8gYXV0b21hdGljYWxseSBwcmlvcml0aXplIHRoYXQgb3ZlciBzdXBlcl9vdGhlciBvciBzeXN0ZW1fb3RoZXIuCi0gICAgLy8gU29tZSBkZXZpY2VzLCBmb3IgZXhhbXBsZSwgaGF2ZSBhIHdyaXRlLXByb3RlY3RlZCBlTU1DIGFuZCB0aGUKLSAgICAvLyBzdXBlciBwYXJ0aXRpb24gY2Fubm90IGJlIHVzZWQgZXZlbiBpZiBpdCBleGlzdHMuCi0gICAgc3RkOjpzdHJpbmcgZGV2aWNlOwotICAgIGF1dG8gcGFydGl0aW9uX25hbWUgPSBhbmRyb2lkOjpiYXNlOjpCYXNlbmFtZShrU2NyYXRjaE1vdW50UG9pbnQpOwotICAgIGlmIChkbS5HZXRTdGF0ZShwYXJ0aXRpb25fbmFtZSkgIT0gRG1EZXZpY2VTdGF0ZTo6SU5WQUxJRCAmJgotICAgICAgICBkbS5HZXREbURldmljZVBhdGhCeU5hbWUocGFydGl0aW9uX25hbWUsICZkZXZpY2UpKSB7Ci0gICAgICAgIHJldHVybiBkZXZpY2U7Ci0gICAgfQotCi0gICAgcmV0dXJuICIiOwotfQotCi1ib29sIE1ha2VTY3JhdGNoRmlsZXN5c3RlbShjb25zdCBzdGQ6OnN0cmluZyYgc2NyYXRjaF9kZXZpY2UpIHsKLSAgICAvLyBGb3JjZSBta2ZzIGJ5IGRlc2lnbiBmb3Igb3ZlcmxheSBzdXBwb3J0IG9mIGFkYiByZW1vdW50LCBzaW1wbGlmeSBhbmQKLSAgICAvLyB0aHVzIGRvIG5vdCByZWx5IG9uIGZzY2sgdG8gY29ycmVjdCBwcm9ibGVtcyB0aGF0IGNvdWxkIGNyZWVwIGluLgotICAgIGF1dG8gZnNfdHlwZSA9ICIiczsKLSAgICBhdXRvIGNvbW1hbmQgPSAiInM7Ci0gICAgaWYgKCFhY2Nlc3Moa01rRjJmcy5jX3N0cigpLCBYX09LKSAmJiBmc19tZ3JfZmlsZXN5c3RlbV9hdmFpbGFibGUoImYyZnMiKSkgewotICAgICAgICBmc190eXBlID0gImYyZnMiOwotICAgICAgICBjb21tYW5kID0ga01rRjJmcyArICIgLXcgNDA5NiAtZiAtZDEgLWwiICsgYW5kcm9pZDo6YmFzZTo6QmFzZW5hbWUoa1NjcmF0Y2hNb3VudFBvaW50KTsKLSAgICB9IGVsc2UgaWYgKCFhY2Nlc3Moa01rRXh0NC5jX3N0cigpLCBYX09LKSAmJiBmc19tZ3JfZmlsZXN5c3RlbV9hdmFpbGFibGUoImV4dDQiKSkgewotICAgICAgICBmc190eXBlID0gImV4dDQiOwotICAgICAgICBjb21tYW5kID0ga01rRXh0NCArICIgLUYgLWIgNDA5NiAtdCBleHQ0IC1tIDAgLU8gaGFzX2pvdXJuYWwgLU0gIiArIGtTY3JhdGNoTW91bnRQb2ludDsKLSAgICB9IGVsc2UgewotICAgICAgICBMRVJST1IgPDwgIk5vIHN1cHBvcnRlZCBta2ZzIGNvbW1hbmQgb3IgZmlsZXN5c3RlbSBkcml2ZXIgYXZhaWxhYmxlLCBzdXBwb3J0ZWQgZmlsZXN5c3RlbXMgIgotICAgICAgICAgICAgICAgICAgImFyZTogZjJmcywgZXh0NCI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgY29tbWFuZCArPSAiICIgKyBzY3JhdGNoX2RldmljZSArICIgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCA8L2Rldi9udWxsIjsKLSAgICBmc19tZ3Jfc2V0X2Jsa19ybyhzY3JhdGNoX2RldmljZSwgZmFsc2UpOwotICAgIGF1dG8gcmV0ID0gc3lzdGVtKGNvbW1hbmQuY19zdHIoKSk7Ci0gICAgaWYgKHJldCkgewotICAgICAgICBMRVJST1IgPDwgIm1ha2UgIiA8PCBmc190eXBlIDw8ICIgZmlsZXN5c3RlbSBvbiAiIDw8IHNjcmF0Y2hfZGV2aWNlIDw8ICIgcmV0dXJuPSIgPDwgcmV0OwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCBUcnVuY2F0ZVBhcnRpdGlvbnNXaXRoU3VmZml4KE1ldGFkYXRhQnVpbGRlciogYnVpbGRlciwgY29uc3Qgc3RkOjpzdHJpbmcmIHN1ZmZpeCkgewotICAgIGF1dG8mIGRtID0gRGV2aWNlTWFwcGVyOjpJbnN0YW5jZSgpOwotCi0gICAgLy8gUmVtb3ZlIDxvdGhlcj4gcGFydGl0aW9ucwotICAgIGZvciAoY29uc3QgYXV0byYgZ3JvdXAgOiBidWlsZGVyLT5MaXN0R3JvdXBzKCkpIHsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwYXJ0IDogYnVpbGRlci0+TGlzdFBhcnRpdGlvbnNJbkdyb3VwKGdyb3VwKSkgewotICAgICAgICAgICAgY29uc3QgYXV0byYgbmFtZSA9IHBhcnQtPm5hbWUoKTsKLSAgICAgICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6RW5kc1dpdGgobmFtZSwgc3VmZml4KSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRtLkdldFN0YXRlKG5hbWUpICE9IERtRGV2aWNlU3RhdGU6OklOVkFMSUQgJiYgIURlc3Ryb3lMb2dpY2FsUGFydGl0aW9uKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWlsZGVyLT5SZXNpemVQYXJ0aXRpb24oYnVpbGRlci0+RmluZFBhcnRpdGlvbihuYW1lKSwgMCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIENyZWF0ZSBvciB1cGRhdGUgYSBzY3JhdGNoIHBhcnRpdGlvbiB3aXRoaW4gc3VwZXIuCi1zdGF0aWMgYm9vbCBDcmVhdGVEeW5hbWljU2NyYXRjaChzdGQ6OnN0cmluZyogc2NyYXRjaF9kZXZpY2UsIGJvb2wqIHBhcnRpdGlvbl9leGlzdHMpIHsKLSAgICBjb25zdCBhdXRvIHBhcnRpdGlvbl9uYW1lID0gYW5kcm9pZDo6YmFzZTo6QmFzZW5hbWUoa1NjcmF0Y2hNb3VudFBvaW50KTsKLQotICAgIGF1dG8mIGRtID0gRGV2aWNlTWFwcGVyOjpJbnN0YW5jZSgpOwotICAgICpwYXJ0aXRpb25fZXhpc3RzID0gZG0uR2V0U3RhdGUocGFydGl0aW9uX25hbWUpICE9IERtRGV2aWNlU3RhdGU6OklOVkFMSUQ7Ci0KLSAgICBhdXRvIHBhcnRpdGlvbl9jcmVhdGUgPSAhKnBhcnRpdGlvbl9leGlzdHM7Ci0gICAgYXV0byBzbG90X251bWJlciA9IGZzX21ncl9vdmVybGF5ZnNfc2xvdF9udW1iZXIoKTsKLSAgICBhdXRvIHN1cGVyX2RldmljZSA9IGZzX21ncl9vdmVybGF5ZnNfc3VwZXJfZGV2aWNlKHNsb3RfbnVtYmVyKTsKLSAgICBhdXRvIGJ1aWxkZXIgPSBNZXRhZGF0YUJ1aWxkZXI6Ok5ldyhzdXBlcl9kZXZpY2UsIHNsb3RfbnVtYmVyKTsKLSAgICBpZiAoIWJ1aWxkZXIpIHsKLSAgICAgICAgTEVSUk9SIDw8ICJvcGVuICIgPDwgc3VwZXJfZGV2aWNlIDw8ICIgbWV0YWRhdGEiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGF1dG8gcGFydGl0aW9uID0gYnVpbGRlci0+RmluZFBhcnRpdGlvbihwYXJ0aXRpb25fbmFtZSk7Ci0gICAgKnBhcnRpdGlvbl9leGlzdHMgPSBwYXJ0aXRpb24gIT0gbnVsbHB0cjsKLSAgICBhdXRvIGNoYW5nZWQgPSBmYWxzZTsKLSAgICBpZiAoISpwYXJ0aXRpb25fZXhpc3RzKSB7Ci0gICAgICAgIHBhcnRpdGlvbiA9IGJ1aWxkZXItPkFkZFBhcnRpdGlvbihwYXJ0aXRpb25fbmFtZSwgTFBfUEFSVElUSU9OX0FUVFJfTk9ORSk7Ci0gICAgICAgIGlmICghcGFydGl0aW9uKSB7Ci0gICAgICAgICAgICBMRVJST1IgPDwgImNyZWF0ZSAiIDw8IHBhcnRpdGlvbl9uYW1lOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGNoYW5nZWQgPSB0cnVlOwotICAgIH0KLSAgICAvLyBUYWtlIGhhbGYgb2YgZnJlZSBzcGFjZSwgbWluaW11bSA1MTJNQiBvciBtYXhpbXVtIGZyZWUgLSBtYXJnaW4uCi0gICAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIGtNaW5pbXVtU2l6ZSA9IHVpbnQ2NF90KDUxMiAqIDEwMjQgKiAxMDI0KTsKLSAgICBpZiAocGFydGl0aW9uLT5zaXplKCkgPCBrTWluaW11bVNpemUpIHsKLSAgICAgICAgYXV0byBwYXJ0aXRpb25fc2l6ZSA9Ci0gICAgICAgICAgICAgICAgYnVpbGRlci0+QWxsb2NhdGFibGVTcGFjZSgpIC0gYnVpbGRlci0+VXNlZFNwYWNlKCkgKyBwYXJ0aXRpb24tPnNpemUoKTsKLSAgICAgICAgaWYgKChwYXJ0aXRpb25fc2l6ZSA+IGtNaW5pbXVtU2l6ZSkgfHwgIXBhcnRpdGlvbi0+c2l6ZSgpKSB7Ci0gICAgICAgICAgICAvLyBMZWF2ZSBzb21lIHNwYWNlIGZvciBmcmVlIHNwYWNlIGppdHRlciBvZiBhIGZldyBlcmFzZQotICAgICAgICAgICAgLy8gYmxvY2tzLCBpbiBjYXNlIHRoZXkgYXJlIG5lZWRlZCBmb3IgYW55IGluZGl2aWR1YWwgdXBkYXRlcwotICAgICAgICAgICAgLy8gdG8gYW55IG90aGVyIHBhcnRpdGlvbiB0aGF0IG5lZWRzIHRvIGJlIGZsYXNoZWQgd2hpbGUKLSAgICAgICAgICAgIC8vIG92ZXJsYXlmcyBpcyBpbiBmb3JjZS4gIE9mIGNvdXJzZSBpZiBtYXJnaW5fc2l6ZSBpcyBub3QKLSAgICAgICAgICAgIC8vIGVub3VnaCBjb3VsZCBub3JtYWxseSBnZXQgYSBmbGFzaCBmYWlsdXJlLCBzbwotICAgICAgICAgICAgLy8gUmVzaXplUGFydGl0aW9uKCkgd2lsbCBkZWxldGUgdGhlIHNjcmF0Y2ggcGFydGl0aW9uIGluCi0gICAgICAgICAgICAvLyBvcmRlciB0byBmdWxmaWxsLiAgRGVsZXRpbmcgc2NyYXRjaCB3aWxsIGRlc3Ryb3kgYWxsIG9mCi0gICAgICAgICAgICAvLyB0aGUgYWRiIHJlbW91bnQgb3ZlcnJpZGVzIDotKCAuCi0gICAgICAgICAgICBhdXRvIG1hcmdpbl9zaXplID0gdWludDY0X3QoMyAqIDI1NiAqIDEwMjQpOwotICAgICAgICAgICAgQmxvY2tEZXZpY2VJbmZvIGluZm87Ci0gICAgICAgICAgICBpZiAoYnVpbGRlci0+R2V0QmxvY2tEZXZpY2VJbmZvKGZzX21ncl9nZXRfc3VwZXJfcGFydGl0aW9uX25hbWUoc2xvdF9udW1iZXIpLCAmaW5mbykpIHsKLSAgICAgICAgICAgICAgICBtYXJnaW5fc2l6ZSA9IDMgKiBpbmZvLmxvZ2ljYWxfYmxvY2tfc2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhcnRpdGlvbl9zaXplID0gc3RkOjptYXgoc3RkOjptaW4oa01pbmltdW1TaXplLCBwYXJ0aXRpb25fc2l6ZSAtIG1hcmdpbl9zaXplKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uX3NpemUgLyAyKTsKLSAgICAgICAgICAgIGlmIChwYXJ0aXRpb25fc2l6ZSA+IHBhcnRpdGlvbi0+c2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFidWlsZGVyLT5SZXNpemVQYXJ0aXRpb24ocGFydGl0aW9uLCBwYXJ0aXRpb25fc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIGZyZWUgdXAgc3BhY2UgYnkgZGVhbGxvY2F0aW5nIHBhcnRpdGlvbnMgaW4gdGhlIG90aGVyIHNsb3QuCi0gICAgICAgICAgICAgICAgICAgIFRydW5jYXRlUGFydGl0aW9uc1dpdGhTdWZmaXgoYnVpbGRlci5nZXQoKSwgZnNfbWdyX2dldF9vdGhlcl9zbG90X3N1ZmZpeCgpKTsKLQotICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25fc2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci0+QWxsb2NhdGFibGVTcGFjZSgpIC0gYnVpbGRlci0+VXNlZFNwYWNlKCkgKyBwYXJ0aXRpb24tPnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uX3NpemUgPSBzdGQ6Om1heChzdGQ6Om1pbihrTWluaW11bVNpemUsIHBhcnRpdGlvbl9zaXplIC0gbWFyZ2luX3NpemUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbl9zaXplIC8gMik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghYnVpbGRlci0+UmVzaXplUGFydGl0aW9uKHBhcnRpdGlvbiwgcGFydGl0aW9uX3NpemUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMRVJST1IgPDwgInJlc2l6ZSAiIDw8IHBhcnRpdGlvbl9uYW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghcGFydGl0aW9uX2NyZWF0ZSkgRGVzdHJveUxvZ2ljYWxQYXJ0aXRpb24ocGFydGl0aW9uX25hbWUpOwotICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICpwYXJ0aXRpb25fZXhpc3RzID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gbGFuZCB0aGUgdXBkYXRlIGJhY2sgb24gdG8gdGhlIHBhcnRpdGlvbgotICAgIGlmIChjaGFuZ2VkKSB7Ci0gICAgICAgIGF1dG8gbWV0YWRhdGEgPSBidWlsZGVyLT5FeHBvcnQoKTsKLSAgICAgICAgaWYgKCFtZXRhZGF0YSB8fCAhVXBkYXRlUGFydGl0aW9uVGFibGUoc3VwZXJfZGV2aWNlLCAqbWV0YWRhdGEuZ2V0KCksIHNsb3RfbnVtYmVyKSkgewotICAgICAgICAgICAgTEVSUk9SIDw8ICJhZGQgcGFydGl0aW9uICIgPDwgcGFydGl0aW9uX25hbWU7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoY2hhbmdlZCB8fCBwYXJ0aXRpb25fY3JlYXRlKSB7Ci0gICAgICAgIENyZWF0ZUxvZ2ljYWxQYXJ0aXRpb25QYXJhbXMgcGFyYW1zID0gewotICAgICAgICAgICAgICAgIC5ibG9ja19kZXZpY2UgPSBzdXBlcl9kZXZpY2UsCi0gICAgICAgICAgICAgICAgLm1ldGFkYXRhX3Nsb3QgPSBzbG90X251bWJlciwKLSAgICAgICAgICAgICAgICAucGFydGl0aW9uX25hbWUgPSBwYXJ0aXRpb25fbmFtZSwKLSAgICAgICAgICAgICAgICAuZm9yY2Vfd3JpdGFibGUgPSB0cnVlLAotICAgICAgICAgICAgICAgIC50aW1lb3V0X21zID0gMTBzLAotICAgICAgICB9OwotICAgICAgICBpZiAoIUNyZWF0ZUxvZ2ljYWxQYXJ0aXRpb24ocGFyYW1zLCBzY3JhdGNoX2RldmljZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoc2NyYXRjaF9kZXZpY2UtPmVtcHR5KCkpIHsKLSAgICAgICAgKnNjcmF0Y2hfZGV2aWNlID0gR2V0Qm9vdFNjcmF0Y2hEZXZpY2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdWludDY0X3QgR2V0SWRlYWxEYXRhU2NyYXRjaFNpemUoKSB7Ci0gICAgQmxvY2tEZXZpY2VJbmZvIHN1cGVyX2luZm87Ci0gICAgUGFydGl0aW9uT3BlbmVyIG9wZW5lcjsKLSAgICBpZiAoIW9wZW5lci5HZXRJbmZvKGZzX21ncl9nZXRfc3VwZXJfcGFydGl0aW9uX25hbWUoKSwgJnN1cGVyX2luZm8pKSB7Ci0gICAgICAgIExFUlJPUiA8PCAiY291bGQgbm90IGdldCBibG9jayBkZXZpY2UgaW5mbyBmb3Igc3VwZXIiOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBzdHJ1Y3Qgc3RhdHZmcyBzOwotICAgIGlmIChzdGF0dmZzKCIvZGF0YSIsICZzKSA8IDApIHsKLSAgICAgICAgUEVSUk9SIDw8ICJjb3VsZCBub3Qgc3RhdGZzIC9kYXRhIjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgYXV0byBpZGVhbF9zaXplID0gc3RkOjptaW4oc3VwZXJfaW5mby5zaXplLCAodWludDY0X3Qocy5mX2Zyc2l6ZSkgKiBzLmZfYmZyZWUpIC8gMik7Ci0KLSAgICAvLyBBbGlnbiB1cCB0byB0aGUgZmlsZXN5c3RlbSBibG9jayBzaXplLgotICAgIGlmIChhdXRvIHJlbWFpbmRlciA9IGlkZWFsX3NpemUgJSBzLmZfYnNpemU7IHJlbWFpbmRlciA+IDApIHsKLSAgICAgICAgaWRlYWxfc2l6ZSArPSBzLmZfYnNpemUgLSByZW1haW5kZXI7Ci0gICAgfQotICAgIHJldHVybiBpZGVhbF9zaXplOwotfQotCi1zdGF0aWMgYm9vbCBDcmVhdGVTY3JhdGNoT25EYXRhKHN0ZDo6c3RyaW5nKiBzY3JhdGNoX2RldmljZSwgYm9vbCogcGFydGl0aW9uX2V4aXN0cykgewotICAgICpwYXJ0aXRpb25fZXhpc3RzID0gZmFsc2U7Ci0KLSAgICBhdXRvIGltYWdlcyA9IElJbWFnZU1hbmFnZXI6Ok9wZW4oInJlbW91bnQiLCAxMHMpOwotICAgIGlmICghaW1hZ2VzKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBhdXRvIHBhcnRpdGlvbl9uYW1lID0gYW5kcm9pZDo6YmFzZTo6QmFzZW5hbWUoa1NjcmF0Y2hNb3VudFBvaW50KTsKLSAgICBpZiAoaW1hZ2VzLT5HZXRNYXBwZWRJbWFnZURldmljZShwYXJ0aXRpb25fbmFtZSwgc2NyYXRjaF9kZXZpY2UpKSB7Ci0gICAgICAgICpwYXJ0aXRpb25fZXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8gTm90ZTogY2FsbGluZyBSZW1vdmVEaXNhYmxlZEltYWdlcyBoZXJlIGVuc3VyZXMgdGhhdCB3ZSBkbyBub3QgcmFjZSB3aXRoCi0gICAgLy8gY2xlYW5fc2NyYXRjaF9maWxlcyBhbmQgYWNjaWRlbnRhbGx5IHRyeSB0byBtYXAgYW4gaW1hZ2UgdGhhdCB3aWxsIGJlCi0gICAgLy8gZGVsZXRlZC4KLSAgICBpZiAoIWltYWdlcy0+UmVtb3ZlRGlzYWJsZWRJbWFnZXMoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmICghaW1hZ2VzLT5CYWNraW5nSW1hZ2VFeGlzdHMocGFydGl0aW9uX25hbWUpKSB7Ci0gICAgICAgIGF1dG8gc2l6ZSA9IGFuZHJvaWQ6OmJhc2U6OkdldFVpbnRQcm9wZXJ0eTx1aW50NjRfdD4oa0RhdGFTY3JhdGNoU2l6ZU1iUHJvcCwgMCkgKiAxX01pQjsKLSAgICAgICAgaWYgKCFzaXplKSB7Ci0gICAgICAgICAgICBzaXplID0gR2V0SWRlYWxEYXRhU2NyYXRjaFNpemUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXNpemUpIHsKLSAgICAgICAgICAgIHNpemUgPSAyX0dpQjsKLSAgICAgICAgfQotCi0gICAgICAgIGF1dG8gZmxhZ3MgPSBJSW1hZ2VNYW5hZ2VyOjpDUkVBVEVfSU1BR0VfREVGQVVMVDsKLQotICAgICAgICBpZiAoIWltYWdlcy0+Q3JlYXRlQmFja2luZ0ltYWdlKHBhcnRpdGlvbl9uYW1lLCBzaXplLCBmbGFncykpIHsKLSAgICAgICAgICAgIExFUlJPUiA8PCAiY291bGQgbm90IGNyZWF0ZSBzY3JhdGNoIGltYWdlIG9mICIgPDwgc2l6ZSA8PCAiIGJ5dGVzIjsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIWltYWdlcy0+TWFwSW1hZ2VEZXZpY2UocGFydGl0aW9uX25hbWUsIDEwcywgc2NyYXRjaF9kZXZpY2UpKSB7Ci0gICAgICAgIExFUlJPUiA8PCAiY291bGQgbm90IG1hcCBzY3JhdGNoIGltYWdlIjsKLSAgICAgICAgLy8gSWYgd2UgY2Fubm90IHVzZSB0aGlzIGltYWdlLCB0aGVuIHJlbW92ZSBpdC4KLSAgICAgICAgVGVhcmRvd25EYXRhU2NyYXRjaChpbWFnZXMuZ2V0KCksIHBhcnRpdGlvbl9uYW1lLCBmYWxzZSAvKiB3YXNfbW91bnRlZCAqLyk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sIENhblVzZVN1cGVyUGFydGl0aW9uKGNvbnN0IEZzdGFiJiBmc3RhYikgewotICAgIGF1dG8gc2xvdF9udW1iZXIgPSBmc19tZ3Jfb3ZlcmxheWZzX3Nsb3RfbnVtYmVyKCk7Ci0gICAgYXV0byBzdXBlcl9kZXZpY2UgPSBmc19tZ3Jfb3ZlcmxheWZzX3N1cGVyX2RldmljZShzbG90X251bWJlcik7Ci0gICAgaWYgKCFmc19tZ3JfcndfYWNjZXNzKHN1cGVyX2RldmljZSkgfHwgIWZzX21ncl9vdmVybGF5ZnNfaGFzX2xvZ2ljYWwoZnN0YWIpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgYXV0byBtZXRhZGF0YSA9IFJlYWRNZXRhZGF0YShzdXBlcl9kZXZpY2UsIHNsb3RfbnVtYmVyKTsKLSAgICBpZiAoIW1ldGFkYXRhKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgZnNfbWdyX292ZXJsYXlmc19jcmVhdGVfc2NyYXRjaChjb25zdCBGc3RhYiYgZnN0YWIsIHN0ZDo6c3RyaW5nKiBzY3JhdGNoX2RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBwYXJ0aXRpb25fZXhpc3RzKSB7Ci0gICAgLy8gVXNlIHRoZSBEU1Ugc2NyYXRjaCBkZXZpY2UgbWFuYWdlZCBieSBnc2lkIGlmIHdpdGhpbiBhIERTVSBzeXN0ZW0uCi0gICAgaWYgKGZzX21ncl9pc19kc3VfcnVubmluZygpKSB7Ci0gICAgICAgICpzY3JhdGNoX2RldmljZSA9IEdldERzdVNjcmF0Y2hEZXZpY2UoKTsKLSAgICAgICAgKnBhcnRpdGlvbl9leGlzdHMgPSAhc2NyYXRjaF9kZXZpY2UtPmVtcHR5KCk7Ci0gICAgICAgIHJldHVybiAqcGFydGl0aW9uX2V4aXN0czsKLSAgICB9Ci0KLSAgICAvLyBUcnkgSW1hZ2VNYW5hZ2VyIG9uIC9kYXRhIGZpcnN0LgotICAgIGJvb2wgY2FuX3VzZV9kYXRhID0gZmFsc2U7Ci0gICAgaWYgKEZpbGVzeXN0ZW1IYXNSZWxpYWJsZVBpbm5pbmcoIi9kYXRhIiwgJmNhbl91c2VfZGF0YSkgJiYgY2FuX3VzZV9kYXRhKSB7Ci0gICAgICAgIGlmIChDcmVhdGVTY3JhdGNoT25EYXRhKHNjcmF0Y2hfZGV2aWNlLCBwYXJ0aXRpb25fZXhpc3RzKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgc2NyYXRjaCBvbiAvZGF0YSwgZmFsbGJhY2sgdG8gdXNlIGZyZWUgc3BhY2Ugb24gc3VwZXIiOwotICAgIH0KLSAgICAvLyBJZiB0aGF0IGZhaWxzLCBzZWUgaWYgd2UgY2FuIGxhbmQgb24gc3VwZXIuCi0gICAgaWYgKENhblVzZVN1cGVyUGFydGl0aW9uKGZzdGFiKSkgewotICAgICAgICByZXR1cm4gQ3JlYXRlRHluYW1pY1NjcmF0Y2goc2NyYXRjaF9kZXZpY2UsIHBhcnRpdGlvbl9leGlzdHMpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vIENyZWF0ZSBhbmQgbW91bnQga1NjcmF0Y2hNb3VudFBvaW50IHN0b3JhZ2UgaWYgd2UgaGF2ZSBsb2dpY2FsIHBhcnRpdGlvbnMKLWJvb2wgZnNfbWdyX292ZXJsYXlmc19zZXR1cF9zY3JhdGNoKGNvbnN0IEZzdGFiJiBmc3RhYikgewotICAgIGlmIChmc19tZ3Jfb3ZlcmxheWZzX2FscmVhZHlfbW91bnRlZChrU2NyYXRjaE1vdW50UG9pbnQsIGZhbHNlKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBzdGQ6OnN0cmluZyBzY3JhdGNoX2RldmljZTsKLSAgICBib29sIHBhcnRpdGlvbl9leGlzdHM7Ci0gICAgaWYgKCFmc19tZ3Jfb3ZlcmxheWZzX2NyZWF0ZV9zY3JhdGNoKGZzdGFiLCAmc2NyYXRjaF9kZXZpY2UsICZwYXJ0aXRpb25fZXhpc3RzKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIHNjcmF0Y2ggcGFydGl0aW9uIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIElmIHRoZSBwYXJ0aXRpb24gZXhpc3RzLCBhc3N1bWUgZmlyc3QgdGhhdCBpdCBjYW4gYmUgbW91bnRlZC4KLSAgICBpZiAocGFydGl0aW9uX2V4aXN0cykgewotICAgICAgICBpZiAoTW91bnRTY3JhdGNoKHNjcmF0Y2hfZGV2aWNlKSkgewotICAgICAgICAgICAgaWYgKGZzX21ncl9hY2Nlc3Moa1NjcmF0Y2hNb3VudFBvaW50ICsga092ZXJsYXlUb3BEaXIpIHx8Ci0gICAgICAgICAgICAgICAgZnNfbWdyX2ZpbGVzeXN0ZW1faGFzX3NwYWNlKGtTY3JhdGNoTW91bnRQb2ludCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGRlY2xhcmUgaXQgdXNlbGVzcywgbm8gb3ZlcnJpZGVzIGFuZCBubyBmcmVlIHNwYWNlCi0gICAgICAgICAgICBpZiAoIWZzX21ncl9vdmVybGF5ZnNfdW1vdW50X3NjcmF0Y2goKSkgewotICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byB1bm1vdW50IHNjcmF0Y2ggcGFydGl0aW9uIjsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIU1ha2VTY3JhdGNoRmlsZXN5c3RlbShzY3JhdGNoX2RldmljZSkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGZvcm1hdCBzY3JhdGNoIHBhcnRpdGlvbiI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTW91bnRTY3JhdGNoKHNjcmF0Y2hfZGV2aWNlKTsKLX0KLQotI2lmIEFMTE9XX0FEQkRfRElTQUJMRV9WRVJJVFkKLWNvbnN0ZXhwciBib29sIGtBbGxvd092ZXJsYXlmcyA9IHRydWU7Ci0jZWxzZQotY29uc3RleHByIGJvb2wga0FsbG93T3ZlcmxheWZzID0gZmFsc2U7Ci0jZW5kaWYKLQotLy8gTk9URTogT3ZlcmxheWZzU2V0dXBBbGxvd2VkKCkgbXVzdCBiZSAic3RyaWN0ZXIiIHRoYW4gT3ZlcmxheWZzVGVhcmRvd25BbGxvd2VkKCkuCi0vLyBTZXR1cCBpcyBhbGxvd2VkIG9ubHkgaWYgdGVhcmRvd24gaXMgYWxzbyBhbGxvd2VkLgotYm9vbCBPdmVybGF5ZnNTZXR1cEFsbG93ZWQoYm9vbCB2ZXJib3NlID0gZmFsc2UpIHsKLSAgICBpZiAoIWtBbGxvd092ZXJsYXlmcykgewotICAgICAgICBpZiAodmVyYm9zZSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiT3ZlcmxheWZzIHJlbW91bnRzIGNhbiBvbmx5IGJlIHVzZWQgaW4gZGVidWdnYWJsZSBidWlsZHMiOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgLy8gQ2hlY2sgbWFuZGF0b3J5IGtlcm5lbCBwYXRjaGVzLgotICAgIGlmIChmc19tZ3Jfb3ZlcmxheWZzX3ZhbGlkKCkgPT0gT3ZlcmxheWZzVmFsaWRSZXN1bHQ6OmtOb3RTdXBwb3J0ZWQpIHsKLSAgICAgICAgaWYgKHZlcmJvc2UpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIktlcm5lbCBkb2VzIG5vdCBzdXBwb3J0IG92ZXJsYXlmcyI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAvLyBpbiByZWNvdmVyeSBvciBmYXN0Ym9vdGQsIG5vdCBhbGxvd2VkIQotICAgIGlmIChmc19tZ3JfaW5fcmVjb3ZlcnkoKSkgewotICAgICAgICBpZiAodmVyYm9zZSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5zdXBwb3J0ZWQgb3ZlcmxheWZzIHNldHVwIGZyb20gcmVjb3ZlcnkiOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0ZXhwciBib29sIE92ZXJsYXlmc1RlYXJkb3duQWxsb3dlZCgpIHsKLSAgICAvLyBOZXZlciBhbGxvdyBvbiBub24tZGVidWdnYWJsZSBidWlsZC4KLSAgICByZXR1cm4ga0FsbG93T3ZlcmxheWZzOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotYm9vbCBmc19tZ3Jfd2FudHNfb3ZlcmxheWZzKEZzdGFiRW50cnkqIGVudHJ5KSB7Ci0gICAgLy8gRG9uJ3QgY2hlY2sgZW50cmllcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5IHZvbGQuCi0gICAgaWYgKGVudHJ5LT5mc19tZ3JfZmxhZ3Mudm9sZF9tYW5hZ2VkIHx8IGVudHJ5LT5mc19tZ3JfZmxhZ3MucmVjb3Zlcnlfb25seSkgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gKl9vdGhlciBkb2Vzbid0IHdhbnQgb3ZlcmxheWZzLgotICAgIGlmIChlbnRyeS0+ZnNfbWdyX2ZsYWdzLnNsb3Rfc2VsZWN0X290aGVyKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBPbmx5IGNvbmNlcm5lZCB3aXRoIHJlYWRvbmx5IHBhcnRpdGlvbnMuCi0gICAgaWYgKCEoZW50cnktPmZsYWdzICYgTVNfUkRPTkxZKSkgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gSWYgdW5iaW5kYWJsZSwgZG8gbm90IGFsbG93IG92ZXJsYXlmcyBhcyB0aGlzIGNvdWxkIGV4cG9zZSB1cyB0bwotICAgIC8vIHNlY3VyaXR5IGlzc3Vlcy4gIE9uIEFuZHJvaWQsIHRoaXMgY291bGQgYWxzbyBiZSB1c2VkIHRvIHR1cm4gb2ZmCi0gICAgLy8gdGhlIGFiaWxpdHkgdG8gb3ZlcmxheSBhbiBvdGhlcndpc2UgYWNjZXB0YWJsZSBmaWxlc3lzdGVtIHNpbmNlCi0gICAgLy8gL3N5c3RlbSBhbmQgL3ZlbmRvciBhcmUgbmV2ZXIgYm91bmQoc2ljKSB0by4KLSAgICBpZiAoZW50cnktPmZsYWdzICYgTVNfVU5CSU5EQUJMRSkgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKCFmc19tZ3Jfb3ZlcmxheWZzX2VuYWJsZWQoZW50cnkpKSByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotRnN0YWIgZnNfbWdyX292ZXJsYXlmc19jYW5kaWRhdGVfbGlzdChjb25zdCBGc3RhYiYgZnN0YWIpIHsKLSAgICBhbmRyb2lkOjpmc19tZ3I6OkZzdGFiIG1vdW50czsKLSAgICBpZiAoIWFuZHJvaWQ6OmZzX21ncjo6UmVhZEZzdGFiRnJvbUZpbGUoIi9wcm9jL21vdW50cyIsICZtb3VudHMpKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcmVhZCAvcHJvYy9tb3VudHMiOwotICAgICAgICByZXR1cm4ge307Ci0gICAgfQotCi0gICAgRnN0YWIgY2FuZGlkYXRlczsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogZnN0YWIpIHsKLSAgICAgICAgLy8gRmlsdGVyIG91dCBwYXJ0aXRpb25zIHdob3NlIHR5cGUgZG9lc24ndCBtYXRjaCB3aGF0J3MgbW91bnRlZC4KLSAgICAgICAgLy8gVGhpcyBhdm9pZHMgc3BhbW15IGJlaGF2aW9yIG9uIGRldmljZXMgd2hpY2ggY2FuIG1vdW50IGRpZmZlcmVudAotICAgICAgICAvLyBmaWxlc3lzdGVtcyBmb3IgZWFjaCBwYXJ0aXRpb24uCi0gICAgICAgIGF1dG8gcHJvY19tb3VudF9wb2ludCA9IChlbnRyeS5tb3VudF9wb2ludCA9PSAiL3N5c3RlbSIpID8gIi8iIDogZW50cnkubW91bnRfcG9pbnQ7Ci0gICAgICAgIGF1dG8gbW91bnRlZCA9IEdldEVudHJ5Rm9yTW91bnRQb2ludCgmbW91bnRzLCBwcm9jX21vdW50X3BvaW50KTsKLSAgICAgICAgaWYgKCFtb3VudGVkIHx8IG1vdW50ZWQtPmZzX3R5cGUgIT0gZW50cnkuZnNfdHlwZSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBGc3RhYkVudHJ5IG5ld19lbnRyeSA9IGVudHJ5OwotICAgICAgICBpZiAoIWZzX21ncl9vdmVybGF5ZnNfYWxyZWFkeV9tb3VudGVkKGVudHJ5Lm1vdW50X3BvaW50KSAmJgotICAgICAgICAgICAgIWZzX21ncl93YW50c19vdmVybGF5ZnMoJm5ld19lbnRyeSkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGF1dG8gbmV3X21vdW50X3BvaW50ID0gZnNfbWdyX21vdW50X3BvaW50KGVudHJ5Lm1vdW50X3BvaW50KTsKLSAgICAgICAgYXV0byBkdXBsaWNhdGVfb3JfbW9yZV9zcGVjaWZpYyA9IGZhbHNlOwotICAgICAgICBmb3IgKGF1dG8gaXQgPSBjYW5kaWRhdGVzLmJlZ2luKCk7IGl0ICE9IGNhbmRpZGF0ZXMuZW5kKCk7KSB7Ci0gICAgICAgICAgICBhdXRvIGl0X21vdW50X3BvaW50ID0gZnNfbWdyX21vdW50X3BvaW50KGl0LT5tb3VudF9wb2ludCk7Ci0gICAgICAgICAgICBpZiAoKGl0X21vdW50X3BvaW50ID09IG5ld19tb3VudF9wb2ludCkgfHwKLSAgICAgICAgICAgICAgICAoYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aChuZXdfbW91bnRfcG9pbnQsIGl0X21vdW50X3BvaW50ICsgIi8iKSkpIHsKLSAgICAgICAgICAgICAgICBkdXBsaWNhdGVfb3JfbW9yZV9zcGVjaWZpYyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aChpdF9tb3VudF9wb2ludCwgbmV3X21vdW50X3BvaW50ICsgIi8iKSkgewotICAgICAgICAgICAgICAgIGl0ID0gY2FuZGlkYXRlcy5lcmFzZShpdCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICsraXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFkdXBsaWNhdGVfb3JfbW9yZV9zcGVjaWZpYykgY2FuZGlkYXRlcy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKG5ld19lbnRyeSkpOwotICAgIH0KLSAgICByZXR1cm4gY2FuZGlkYXRlczsKLX0KLQotc3RhdGljIHZvaWQgVHJ5TW91bnRTY3JhdGNoKCkgewotICAgIC8vIE5vdGUgd2UgZ2V0IHRoZSBib290IHNjcmF0Y2ggZGV2aWNlIGhlcmUsIHdoaWNoIG1lYW5zIGlmIHNjcmF0Y2ggd2FzCi0gICAgLy8ganVzdCBjcmVhdGVkIHRocm91Z2ggSW1hZ2VNYW5hZ2VyLCB0aGlzIGNvdWxkIGZhaWwuIEluIHByYWN0aWNlIHRoaXMKLSAgICAvLyBzaG91bGQgbm90IGhhcHBlbiBiZWNhdXNlICJyZW1vdW50IiBkZXRlY3RzIHRoaXMgc2NlbmFyaW8gKGJ5IGNoZWNraW5nCi0gICAgLy8gaWYgdmVyaXR5IGlzIHN0aWxsIGRpc2FibGVkLCBpLmUuIG5vIHJlYm9vdCBvY2N1cnJlZCksIGFuZCBza2lwcyBjYWxsaW5nCi0gICAgLy8gZnNfbWdyX292ZXJsYXlmc19tb3VudF9hbGwoKS4KLSAgICBhdXRvIHNjcmF0Y2hfZGV2aWNlID0gR2V0Qm9vdFNjcmF0Y2hEZXZpY2UoKTsKLSAgICBpZiAoIWZzX21ncl9yd19hY2Nlc3Moc2NyYXRjaF9kZXZpY2UpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKCFXYWl0Rm9yRmlsZShzY3JhdGNoX2RldmljZSwgMTBzKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICghTW91bnRTY3JhdGNoKHNjcmF0Y2hfZGV2aWNlLCB0cnVlIC8qIHJlYWRvbmx5ICovKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGF1dG8gaGFzX292ZXJsYXlmc19kaXIgPSBmc19tZ3JfYWNjZXNzKGtTY3JhdGNoTW91bnRQb2ludCArIGtPdmVybGF5VG9wRGlyKTsKLSAgICBmc19tZ3Jfb3ZlcmxheWZzX3Vtb3VudF9zY3JhdGNoKCk7Ci0gICAgaWYgKGhhc19vdmVybGF5ZnNfZGlyKSB7Ci0gICAgICAgIE1vdW50U2NyYXRjaChzY3JhdGNoX2RldmljZSk7Ci0gICAgfQotfQotCi1ib29sIGZzX21ncl9vdmVybGF5ZnNfbW91bnRfYWxsKEZzdGFiKiBmc3RhYikgewotICAgIGlmICghT3ZlcmxheWZzU2V0dXBBbGxvd2VkKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBhdXRvIHJldCA9IHRydWU7Ci0gICAgYXV0byBzY3JhdGNoX2Nhbl9iZV9tb3VudGVkID0gdHJ1ZTsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogZnNfbWdyX292ZXJsYXlmc19jYW5kaWRhdGVfbGlzdCgqZnN0YWIpKSB7Ci0gICAgICAgIGlmIChmc19tZ3JfaXNfdmVyaXR5X2VuYWJsZWQoZW50cnkpKSBjb250aW51ZTsKLSAgICAgICAgYXV0byBtb3VudF9wb2ludCA9IGZzX21ncl9tb3VudF9wb2ludChlbnRyeS5tb3VudF9wb2ludCk7Ci0gICAgICAgIGlmIChmc19tZ3Jfb3ZlcmxheWZzX2FscmVhZHlfbW91bnRlZChtb3VudF9wb2ludCkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzY3JhdGNoX2Nhbl9iZV9tb3VudGVkKSB7Ci0gICAgICAgICAgICBzY3JhdGNoX2Nhbl9iZV9tb3VudGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBUcnlNb3VudFNjcmF0Y2goKTsKLSAgICAgICAgfQotICAgICAgICByZXQgJj0gZnNfbWdyX292ZXJsYXlmc19tb3VudChlbnRyeSk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLWJvb2wgZnNfbWdyX292ZXJsYXlmc19zZXR1cChjb25zdCBGc3RhYiYgZnN0YWIsIGNvbnN0IGNoYXIqIG1vdW50X3BvaW50LCBib29sKiB3YW50X3JlYm9vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGp1c3RfZGlzYWJsZWRfdmVyaXR5KSB7Ci0gICAgaWYgKCFPdmVybGF5ZnNTZXR1cEFsbG93ZWQoLyp2ZXJib3NlPSovdHJ1ZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICghZnNfbWdyX2Jvb3RfY29tcGxldGVkKCkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IHNldHVwIG92ZXJsYXlmcyBiZWZvcmUgcGVyc2lzdGVudCBwcm9wZXJ0aWVzIGFyZSByZWFkeSI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBhdXRvIGNhbmRpZGF0ZXMgPSBmc19tZ3Jfb3ZlcmxheWZzX2NhbmRpZGF0ZV9saXN0KGZzdGFiKTsKLSAgICBmb3IgKGF1dG8gaXQgPSBjYW5kaWRhdGVzLmJlZ2luKCk7IGl0ICE9IGNhbmRpZGF0ZXMuZW5kKCk7KSB7Ci0gICAgICAgIGlmIChtb3VudF9wb2ludCAmJgotICAgICAgICAgICAgKGZzX21ncl9tb3VudF9wb2ludChpdC0+bW91bnRfcG9pbnQpICE9IGZzX21ncl9tb3VudF9wb2ludChtb3VudF9wb2ludCkpKSB7Ci0gICAgICAgICAgICBpdCA9IGNhbmRpZGF0ZXMuZXJhc2UoaXQpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBhdXRvIHZlcml0eV9lbmFibGVkID0gIWp1c3RfZGlzYWJsZWRfdmVyaXR5ICYmIGZzX21ncl9pc192ZXJpdHlfZW5hYmxlZCgqaXQpOwotICAgICAgICBpZiAodmVyaXR5X2VuYWJsZWQpIHsKLSAgICAgICAgICAgIGl0ID0gY2FuZGlkYXRlcy5lcmFzZShpdCk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICArK2l0OwotICAgIH0KLQotICAgIGlmIChjYW5kaWRhdGVzLmVtcHR5KCkpIHsKLSAgICAgICAgaWYgKG1vdW50X3BvaW50KSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJObyBvdmVybGF5ZnMgY2FuZGlkYXRlIHdhcyBmb3VuZCBmb3IgIiA8PCBtb3VudF9wb2ludDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBzdGQ6OnN0cmluZyBkaXI7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBvdmVybGF5X21vdW50X3BvaW50IDogT3ZlcmxheU1vdW50UG9pbnRzKCkpIHsKLSAgICAgICAgaWYgKG92ZXJsYXlfbW91bnRfcG9pbnQgPT0ga1NjcmF0Y2hNb3VudFBvaW50KSB7Ci0gICAgICAgICAgICBpZiAoIWZzX21ncl9vdmVybGF5ZnNfc2V0dXBfc2NyYXRjaChmc3RhYikpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChHZXRFbnRyeUZvck1vdW50UG9pbnQoJmZzdGFiLCBvdmVybGF5X21vdW50X3BvaW50KSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZGlyID0gb3ZlcmxheV9tb3VudF9wb2ludDsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChkaXIuZW1wdHkoKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgYWxsb2NhdGUgYmFja2luZyBzdG9yYWdlIGZvciBvdmVybGF5cyI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjb25zdCBhdXRvIG92ZXJsYXkgPSBmc19tZ3Jfb3ZlcmxheWZzX3NldHVwX2RpcihkaXIpOwotICAgIGlmIChvdmVybGF5LmVtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2wgb2sgPSB0cnVlOwotICAgIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBjYW5kaWRhdGVzKSB7Ci0gICAgICAgIGF1dG8gZnN0YWJfbW91bnRfcG9pbnQgPSBmc19tZ3JfbW91bnRfcG9pbnQoZW50cnkubW91bnRfcG9pbnQpOwotICAgICAgICBvayAmPSBmc19tZ3Jfb3ZlcmxheWZzX3NldHVwX29uZShvdmVybGF5LCBmc3RhYl9tb3VudF9wb2ludCwgd2FudF9yZWJvb3QpOwotICAgIH0KLSAgICByZXR1cm4gb2s7Ci19Ci0KLXN0cnVjdCBNYXBJbmZvIHsKLSAgICAvLyBJZiBzZXQsIHBhcnRpdGlvbiBpcyBvd25lZCBieSBJbWFnZU1hbmFnZXIuCi0gICAgc3RkOjp1bmlxdWVfcHRyPElJbWFnZU1hbmFnZXI+IGltYWdlczsKLSAgICAvLyBJZiBzZXQsIGFuZCBpbWFnZXMgaXMgbnVsbCwgdGhpcyBpcyBhIERBUCBwYXJ0aXRpb24uCi0gICAgc3RkOjpzdHJpbmcgbmFtZTsKLSAgICAvLyBJZiBzZXQsIGFuZCBpbWFnZXMgYW5kIG5hbWUgYXJlIGVtcHR5LCB0aGlzIGlzIGEgbm9uLWR5bmFtaWMgcGFydGl0aW9uLgotICAgIHN0ZDo6c3RyaW5nIGRldmljZTsKLQotICAgIE1hcEluZm8oKSA9IGRlZmF1bHQ7Ci0gICAgTWFwSW5mbyhNYXBJbmZvJiYpID0gZGVmYXVsdDsKLSAgICB+TWFwSW5mbygpIHsKLSAgICAgICAgaWYgKGltYWdlcykgewotICAgICAgICAgICAgaW1hZ2VzLT5Vbm1hcEltYWdlRGV2aWNlKG5hbWUpOwotICAgICAgICB9IGVsc2UgaWYgKCFuYW1lLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIERlc3Ryb3lMb2dpY2FsUGFydGl0aW9uKG5hbWUpOwotICAgICAgICB9Ci0gICAgfQotfTsKLQotLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBuZXZlciByZXR1cm5zIHRoZSBEU1Ugc2NyYXRjaCBkZXZpY2UgaW4gcmVjb3Zlcnkgb3IgZmFzdGJvb3RkLAotLy8gYmVjYXVzZSB0aGUgRFNVIHNjcmF0Y2ggaXMgY3JlYXRlZCBpbiB0aGUgZmlyc3Qtc3RhZ2UtbW91bnQsIHdoaWNoIGlzIG5vdCBydW4gaW4gcmVjb3ZlcnkuCi1zdGF0aWMgc3RkOjpvcHRpb25hbDxNYXBJbmZvPiBFbnN1cmVTY3JhdGNoTWFwcGVkKCkgewotICAgIE1hcEluZm8gaW5mbzsKLSAgICBpbmZvLmRldmljZSA9IEdldEJvb3RTY3JhdGNoRGV2aWNlKCk7Ci0gICAgaWYgKCFpbmZvLmRldmljZS5lbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiB7c3RkOjptb3ZlKGluZm8pfTsKLSAgICB9Ci0gICAgaWYgKCFmc19tZ3JfaW5fcmVjb3ZlcnkoKSkgewotICAgICAgICByZXR1cm4ge307Ci0gICAgfQotCi0gICAgYXV0byBwYXJ0aXRpb25fbmFtZSA9IGFuZHJvaWQ6OmJhc2U6OkJhc2VuYW1lKGtTY3JhdGNoTW91bnRQb2ludCk7Ci0KLSAgICAvLyBDaGVjayBmb3Igc2NyYXRjaCBvbiAvZGF0YSBmaXJzdCwgYmVmb3JlIGxvb2tpbmcgZm9yIGEgbW9kaWZpZWQgc3VwZXIKLSAgICAvLyBwYXJ0aXRpb24uIFdlIHNob3VsZCBvbmx5IHJlYWNoIHRoaXMgY29kZSBpbiByZWNvdmVyeSwgYmVjYXVzZSBzY3JhdGNoCi0gICAgLy8gd291bGQgb3RoZXJ3aXNlIGFsd2F5cyBiZSBtYXBwZWQuCi0gICAgYXV0byBpbWFnZXMgPSBJSW1hZ2VNYW5hZ2VyOjpPcGVuKCJyZW1vdW50IiwgMTBzKTsKLSAgICBpZiAoaW1hZ2VzICYmIGltYWdlcy0+QmFja2luZ0ltYWdlRXhpc3RzKHBhcnRpdGlvbl9uYW1lKSkgewotICAgICAgICBpZiAoaW1hZ2VzLT5Jc0ltYWdlRGlzYWJsZWQocGFydGl0aW9uX25hbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4ge307Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFpbWFnZXMtPk1hcEltYWdlRGV2aWNlKHBhcnRpdGlvbl9uYW1lLCAxMHMsICZpbmZvLmRldmljZSkpIHsKLSAgICAgICAgICAgIHJldHVybiB7fTsKLSAgICAgICAgfQotICAgICAgICBpbmZvLm5hbWUgPSBwYXJ0aXRpb25fbmFtZTsKLSAgICAgICAgaW5mby5pbWFnZXMgPSBzdGQ6Om1vdmUoaW1hZ2VzKTsKLSAgICAgICAgcmV0dXJuIHtzdGQ6Om1vdmUoaW5mbyl9OwotICAgIH0KLQotICAgIC8vIEF2b2lkIHVhcnQgc3BhbSBieSBmaXJzdCBjaGVja2luZyBmb3IgYSBzY3JhdGNoIHBhcnRpdGlvbi4KLSAgICBhdXRvIG1ldGFkYXRhX3Nsb3QgPSBmc19tZ3Jfb3ZlcmxheWZzX3Nsb3RfbnVtYmVyKCk7Ci0gICAgYXV0byBzdXBlcl9kZXZpY2UgPSBmc19tZ3Jfb3ZlcmxheWZzX3N1cGVyX2RldmljZShtZXRhZGF0YV9zbG90KTsKLSAgICBhdXRvIG1ldGFkYXRhID0gUmVhZEN1cnJlbnRNZXRhZGF0YShzdXBlcl9kZXZpY2UpOwotICAgIGlmICghbWV0YWRhdGEpIHsKLSAgICAgICAgcmV0dXJuIHt9OwotICAgIH0KLQotICAgIGF1dG8gcGFydGl0aW9uID0gRmluZFBhcnRpdGlvbigqbWV0YWRhdGEuZ2V0KCksIHBhcnRpdGlvbl9uYW1lKTsKLSAgICBpZiAoIXBhcnRpdGlvbikgewotICAgICAgICByZXR1cm4ge307Ci0gICAgfQotCi0gICAgQ3JlYXRlTG9naWNhbFBhcnRpdGlvblBhcmFtcyBwYXJhbXMgPSB7Ci0gICAgICAgICAgICAuYmxvY2tfZGV2aWNlID0gc3VwZXJfZGV2aWNlLAotICAgICAgICAgICAgLm1ldGFkYXRhID0gbWV0YWRhdGEuZ2V0KCksCi0gICAgICAgICAgICAucGFydGl0aW9uID0gcGFydGl0aW9uLAotICAgICAgICAgICAgLmZvcmNlX3dyaXRhYmxlID0gdHJ1ZSwKLSAgICAgICAgICAgIC50aW1lb3V0X21zID0gMTBzLAotICAgIH07Ci0gICAgaWYgKCFDcmVhdGVMb2dpY2FsUGFydGl0aW9uKHBhcmFtcywgJmluZm8uZGV2aWNlKSkgewotICAgICAgICByZXR1cm4ge307Ci0gICAgfQotICAgIGluZm8ubmFtZSA9IHBhcnRpdGlvbl9uYW1lOwotICAgIHJldHVybiB7c3RkOjptb3ZlKGluZm8pfTsKLX0KLQotLy8gVGhpcyBzaG91bGQgb25seSBiZSByZWFjaGFibGUgaW4gcmVjb3ZlcnksIHdoZXJlIERTVSBzY3JhdGNoIGlzIG5vdAotLy8gYXV0b21hdGljYWxseSBtYXBwZWQuCi1zdGF0aWMgYm9vbCBNYXBEc3VTY3JhdGNoRGV2aWNlKHN0ZDo6c3RyaW5nKiBkZXZpY2UpIHsKLSAgICBzdGQ6OnN0cmluZyBkc3Vfc2xvdDsKLSAgICBpZiAoIWFuZHJvaWQ6OmdzaTo6SXNHc2lJbnN0YWxsZWQoKSB8fCAhYW5kcm9pZDo6Z3NpOjpHZXRBY3RpdmVEc3UoJmRzdV9zbG90KSB8fAotICAgICAgICBkc3Vfc2xvdC5lbXB0eSgpKSB7Ci0gICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gaWYgbm8gRFNVIGluc3RhbGxhdGlvbiBwcmVzZW50LgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYXV0byBpbWFnZXMgPSBJSW1hZ2VNYW5hZ2VyOjpPcGVuKCJkc3UvIiArIGRzdV9zbG90LCAxMHMpOwotICAgIGlmICghaW1hZ2VzIHx8ICFpbWFnZXMtPkJhY2tpbmdJbWFnZUV4aXN0cyhhbmRyb2lkOjpnc2k6OmtEc3VTY3JhdGNoKSkgewotICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGlmIERTVSBzY3JhdGNoIGRldmljZSBkb2Vzbid0IGV4aXN0LgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaW1hZ2VzLT5Vbm1hcEltYWdlRGV2aWNlKGFuZHJvaWQ6OmdzaTo6a0RzdVNjcmF0Y2gpOwotICAgIGlmICghaW1hZ2VzLT5NYXBJbWFnZURldmljZShhbmRyb2lkOjpnc2k6OmtEc3VTY3JhdGNoLCAxMHMsIGRldmljZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIE92ZXJsYXlmc1RlYXJkb3duUmVzdWx0IFRlYXJkb3duTW91bnRzQW5kU2NyYXRjaChjb25zdCBjaGFyKiBtb3VudF9wb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogd2FudF9yZWJvb3QpIHsKLSAgICBib29sIHNob3VsZF9kZXN0cm95X3NjcmF0Y2ggPSBmYWxzZTsKLSAgICBhdXRvIHJ2ID0gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6Ok9rOwotICAgIGZvciAoY29uc3QgYXV0byYgb3ZlcmxheV9tb3VudF9wb2ludCA6IE92ZXJsYXlNb3VudFBvaW50cygpKSB7Ci0gICAgICAgIGF1dG8gb2sgPSBmc19tZ3Jfb3ZlcmxheWZzX3RlYXJkb3duX29uZSgKLSAgICAgICAgICAgICAgICBvdmVybGF5X21vdW50X3BvaW50LCBtb3VudF9wb2ludCA/IGZzX21ncl9tb3VudF9wb2ludChtb3VudF9wb2ludCkgOiAiIiwKLSAgICAgICAgICAgICAgICB3YW50X3JlYm9vdCwKLSAgICAgICAgICAgICAgICBvdmVybGF5X21vdW50X3BvaW50ID09IGtTY3JhdGNoTW91bnRQb2ludCA/ICZzaG91bGRfZGVzdHJveV9zY3JhdGNoIDogbnVsbHB0cik7Ci0gICAgICAgIGlmICghb2spIHsKLSAgICAgICAgICAgIHJ2ID0gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6OkVycm9yOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gRG8gbm90IGF0dGVtcHQgdG8gZGVzdHJveSBEU1Ugc2NyYXRjaCBpZiB3aXRoaW4gYSBEU1Ugc3lzdGVtLAotICAgIC8vIGJlY2F1c2UgRFNVIHNjcmF0Y2ggcGFydGl0aW9uIGlzIG1hbmFnZWQgYnkgZ3NpZC4KLSAgICBpZiAoc2hvdWxkX2Rlc3Ryb3lfc2NyYXRjaCAmJiAhZnNfbWdyX2lzX2RzdV9ydW5uaW5nKCkpIHsKLSAgICAgICAgYXV0byBydiA9IGZzX21ncl9vdmVybGF5ZnNfdGVhcmRvd25fc2NyYXRjaChrU2NyYXRjaE1vdW50UG9pbnQsIHdhbnRfcmVib290KTsKLSAgICAgICAgaWYgKHJ2ICE9IE92ZXJsYXlmc1RlYXJkb3duUmVzdWx0OjpPaykgewotICAgICAgICAgICAgcmV0dXJuIHJ2OwotICAgICAgICB9Ci0gICAgfQotICAgIC8vIEFuZCBub3cgdGhhdCB3ZSBkaWQgd2hhdCB3ZSBjb3VsZCwgbGV0cyBpbmZvcm0KLSAgICAvLyBjYWxsZXIgdGhhdCB0aGVyZSBtYXkgc3RpbGwgYmUgbW9yZSB0byBkby4KLSAgICBpZiAoIWZzX21ncl9ib290X2NvbXBsZXRlZCgpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCB0ZWFyZG93biBvdmVybGF5ZnMgYmVmb3JlIHBlcnNpc3RlbnQgcHJvcGVydGllcyBhcmUgcmVhZHkiOwotICAgICAgICByZXR1cm4gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6OkVycm9yOwotICAgIH0KLSAgICByZXR1cm4gcnY7Ci19Ci0KLS8vIFJldHVybnMgZmFsc2UgaWYgdGVhcmRvd24gbm90IHBlcm1pdHRlZC4gSWYgc29tZXRoaW5nIGlzIGFsdGVyZWQsIHNldCAqd2FudF9yZWJvb3QuCi1PdmVybGF5ZnNUZWFyZG93blJlc3VsdCBmc19tZ3Jfb3ZlcmxheWZzX3RlYXJkb3duKGNvbnN0IGNoYXIqIG1vdW50X3BvaW50LCBib29sKiB3YW50X3JlYm9vdCkgewotICAgIGlmICghT3ZlcmxheWZzVGVhcmRvd25BbGxvd2VkKCkpIHsKLSAgICAgICAgLy8gTm90aGluZyB0byB0ZWFyZG93bi4KLSAgICAgICAgcmV0dXJuIE92ZXJsYXlmc1RlYXJkb3duUmVzdWx0OjpPazsKLSAgICB9Ci0gICAgLy8gSWYgc2NyYXRjaCBleGlzdHMsIGJ1dCBpcyBub3QgbW91bnRlZCwgbGV0cyBnYWluIGFjY2VzcyB0byBjbGVhbgotICAgIC8vIHNwZWNpZmljIG92ZXJyaWRlIGVudHJpZXMuCi0gICAgYXV0byBtb3VudF9zY3JhdGNoID0gZmFsc2U7Ci0gICAgaWYgKChtb3VudF9wb2ludCAhPSBudWxscHRyKSAmJiAhZnNfbWdyX292ZXJsYXlmc19hbHJlYWR5X21vdW50ZWQoa1NjcmF0Y2hNb3VudFBvaW50LCBmYWxzZSkpIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgc2NyYXRjaF9kZXZpY2UgPSBHZXRCb290U2NyYXRjaERldmljZSgpOwotICAgICAgICBpZiAoIXNjcmF0Y2hfZGV2aWNlLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIG1vdW50X3NjcmF0Y2ggPSBNb3VudFNjcmF0Y2goc2NyYXRjaF9kZXZpY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYXV0byBydiA9IFRlYXJkb3duTW91bnRzQW5kU2NyYXRjaChtb3VudF9wb2ludCwgd2FudF9yZWJvb3QpOwotCi0gICAgaWYgKG1vdW50X3NjcmF0Y2gpIHsKLSAgICAgICAgaWYgKCFmc19tZ3Jfb3ZlcmxheWZzX3Vtb3VudF9zY3JhdGNoKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBPdmVybGF5ZnNUZWFyZG93blJlc3VsdDo6QnVzeTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcnY7Ci19Ci0KLWJvb2wgZnNfbWdyX292ZXJsYXlmc19pc19zZXR1cCgpIHsKLSAgICBpZiAoIU92ZXJsYXlmc1NldHVwQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKGZzX21ncl9vdmVybGF5ZnNfYWxyZWFkeV9tb3VudGVkKGtTY3JhdGNoTW91bnRQb2ludCwgZmFsc2UpKSByZXR1cm4gdHJ1ZTsKLSAgICBGc3RhYiBmc3RhYjsKLSAgICBpZiAoIVJlYWREZWZhdWx0RnN0YWIoJmZzdGFiKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBmc19tZ3Jfb3ZlcmxheWZzX2NhbmRpZGF0ZV9saXN0KGZzdGFiKSkgewotICAgICAgICBpZiAoZnNfbWdyX2lzX3Zlcml0eV9lbmFibGVkKGVudHJ5KSkgY29udGludWU7Ci0gICAgICAgIGlmIChmc19tZ3Jfb3ZlcmxheWZzX2FscmVhZHlfbW91bnRlZChmc19tZ3JfbW91bnRfcG9pbnQoZW50cnkubW91bnRfcG9pbnQpKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGZzX21nciB7Ci0KLXZvaWQgTWFwU2NyYXRjaFBhcnRpdGlvbklmTmVlZGVkKEZzdGFiKiBmc3RhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mKT4mIGluaXQpIHsKLSAgICBpZiAoIU92ZXJsYXlmc1NldHVwQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKEdldEVudHJ5Rm9yTW91bnRQb2ludChmc3RhYiwga1NjcmF0Y2hNb3VudFBvaW50KSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBib29sIHdhbnRfc2NyYXRjaCA9IGZhbHNlOwotICAgIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBmc19tZ3Jfb3ZlcmxheWZzX2NhbmRpZGF0ZV9saXN0KCpmc3RhYikpIHsKLSAgICAgICAgaWYgKGZzX21ncl9pc192ZXJpdHlfZW5hYmxlZChlbnRyeSkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmc19tZ3Jfb3ZlcmxheWZzX2FscmVhZHlfbW91bnRlZChmc19tZ3JfbW91bnRfcG9pbnQoZW50cnkubW91bnRfcG9pbnQpKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgd2FudF9zY3JhdGNoID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmICghd2FudF9zY3JhdGNoKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoU2NyYXRjaElzT25EYXRhKCkpIHsKLSAgICAgICAgaWYgKGF1dG8gaW1hZ2VzID0gSUltYWdlTWFuYWdlcjo6T3BlbigicmVtb3VudCIsIDBtcykpIHsKLSAgICAgICAgICAgIGltYWdlcy0+TWFwQWxsSW1hZ2VzKGluaXQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUGh5c2ljYWwgb3IgbG9naWNhbCBwYXJ0aXRpb25zIHdpbGwgaGF2ZSBhbHJlYWR5IGJlZW4gbWFwcGVkIGhlcmUsCi0gICAgLy8gc28ganVzdCBlbnN1cmUgL2Rldi9ibG9jayBzeW1saW5rcyBleGlzdC4KLSAgICBhdXRvIGRldmljZSA9IEdldEJvb3RTY3JhdGNoRGV2aWNlKCk7Ci0gICAgaWYgKCFkZXZpY2UuZW1wdHkoKSkgewotICAgICAgICBpbml0KHthbmRyb2lkOjpiYXNlOjpCYXNlbmFtZShkZXZpY2UpfSk7Ci0gICAgfQotfQotCi12b2lkIENsZWFudXBPbGRTY3JhdGNoRmlsZXMoKSB7Ci0gICAgaWYgKCFPdmVybGF5ZnNUZWFyZG93bkFsbG93ZWQoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICghU2NyYXRjaElzT25EYXRhKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoYXV0byBpbWFnZXMgPSBJSW1hZ2VNYW5hZ2VyOjpPcGVuKCJyZW1vdW50IiwgMG1zKSkgewotICAgICAgICBpbWFnZXMtPlJlbW92ZURpc2FibGVkSW1hZ2VzKCk7Ci0gICAgfQotfQotCi12b2lkIFRlYXJkb3duQWxsT3ZlcmxheUZvck1vdW50UG9pbnQoY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50X3BvaW50KSB7Ci0gICAgaWYgKCFPdmVybGF5ZnNUZWFyZG93bkFsbG93ZWQoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICghZnNfbWdyX2luX3JlY292ZXJ5KCkpIHsKLSAgICAgICAgTEVSUk9SIDw8IF9fRlVOQ1RJT05fXyA8PCAiKCk6IG11c3QgYmUgY2FsbGVkIHdpdGhpbiByZWNvdmVyeS4iOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gRW1wdHkgc3RyaW5nIG1lYW5zIHRlYXJkb3duIGV2ZXJ5dGhpbmcuCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcgdGVhcmRvd25fZGlyID0gbW91bnRfcG9pbnQuZW1wdHkoKSA/ICIiIDogZnNfbWdyX21vdW50X3BvaW50KG1vdW50X3BvaW50KTsKLSAgICBjb25zdGV4cHIgYm9vbCogaWdub3JlX2NoYW5nZSA9IG51bGxwdHI7Ci0KLSAgICAvLyBUZWFyZG93biBsZWdhY3kgb3ZlcmxheSBtb3VudCBwb2ludHMgdGhhdCdzIG5vdCBiYWNrZWQgYnkgYSBzY3JhdGNoIGRldmljZS4KLSAgICBmb3IgKGNvbnN0IGF1dG8mIG92ZXJsYXlfbW91bnRfcG9pbnQgOiBPdmVybGF5TW91bnRQb2ludHMoKSkgewotICAgICAgICBpZiAob3ZlcmxheV9tb3VudF9wb2ludCA9PSBrU2NyYXRjaE1vdW50UG9pbnQpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGZzX21ncl9vdmVybGF5ZnNfdGVhcmRvd25fb25lKG92ZXJsYXlfbW91bnRfcG9pbnQsIHRlYXJkb3duX2RpciwgaWdub3JlX2NoYW5nZSk7Ci0gICAgfQotCi0gICAgaWYgKG1vdW50X3BvaW50LmVtcHR5KCkpIHsKLSAgICAgICAgLy8gVGhyb3cgYXdheSB0aGUgZW50aXJlIHBhcnRpdGlvbi4KLSAgICAgICAgYXV0byBwYXJ0aXRpb25fbmFtZSA9IGFuZHJvaWQ6OmJhc2U6OkJhc2VuYW1lKGtTY3JhdGNoTW91bnRQb2ludCk7Ci0gICAgICAgIGF1dG8gaW1hZ2VzID0gSUltYWdlTWFuYWdlcjo6T3BlbigicmVtb3VudCIsIDEwcyk7Ci0gICAgICAgIGlmIChpbWFnZXMgJiYgaW1hZ2VzLT5CYWNraW5nSW1hZ2VFeGlzdHMocGFydGl0aW9uX25hbWUpKSB7Ci0gICAgICAgICAgICBpZiAoaW1hZ2VzLT5EaXNhYmxlSW1hZ2UocGFydGl0aW9uX25hbWUpKSB7Ci0gICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJEaXNhYmxlZCBzY3JhdGNoIHBhcnRpdGlvbiBmb3I6ICIgPDwga1NjcmF0Y2hNb3VudFBvaW50OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gZGlzYWJsZSBzY3JhdGNoIHBhcnRpdGlvbiBmb3IgIiA8PCBrU2NyYXRjaE1vdW50UG9pbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBOb3RlIGlmIHdlIGp1c3QgZGlzYWJsZWQgc2NyYXRjaCwgdGhpcyBtb3VudCB3aWxsIGZhaWwuCi0gICAgaWYgKGF1dG8gaW5mbyA9IEVuc3VyZVNjcmF0Y2hNYXBwZWQoKTsgaW5mby5oYXNfdmFsdWUoKSkgewotICAgICAgICAvLyBNYXAgc2NyYXRjaCBkZXZpY2UsIG1vdW50IGtTY3JhdGNoTW91bnRQb2ludCBhbmQgdGVhcmRvd24ga1NjcmF0Y2hNb3VudFBvaW50LgotICAgICAgICBmc19tZ3Jfb3ZlcmxheWZzX3Vtb3VudF9zY3JhdGNoKCk7Ci0gICAgICAgIGlmIChNb3VudFNjcmF0Y2goaW5mby0+ZGV2aWNlKSkgewotICAgICAgICAgICAgYm9vbCBzaG91bGRfZGVzdHJveV9zY3JhdGNoID0gZmFsc2U7Ci0gICAgICAgICAgICBmc19tZ3Jfb3ZlcmxheWZzX3RlYXJkb3duX29uZShrU2NyYXRjaE1vdW50UG9pbnQsIHRlYXJkb3duX2RpciwgaWdub3JlX2NoYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaG91bGRfZGVzdHJveV9zY3JhdGNoKTsKLSAgICAgICAgICAgIGZzX21ncl9vdmVybGF5ZnNfdW1vdW50X3NjcmF0Y2goKTsKLSAgICAgICAgICAgIGlmIChzaG91bGRfZGVzdHJveV9zY3JhdGNoKSB7Ci0gICAgICAgICAgICAgICAgZnNfbWdyX292ZXJsYXlmc190ZWFyZG93bl9zY3JhdGNoKGtTY3JhdGNoTW91bnRQb2ludCwgbnVsbHB0cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUZWFyZG93biBEU1Ugb3ZlcmxheSBpZiBwcmVzZW50LgotICAgIHN0ZDo6c3RyaW5nIHNjcmF0Y2hfZGV2aWNlOwotICAgIGlmIChNYXBEc3VTY3JhdGNoRGV2aWNlKCZzY3JhdGNoX2RldmljZSkpIHsKLSAgICAgICAgZnNfbWdyX292ZXJsYXlmc191bW91bnRfc2NyYXRjaCgpOwotICAgICAgICBpZiAoTW91bnRTY3JhdGNoKHNjcmF0Y2hfZGV2aWNlKSkgewotICAgICAgICAgICAgZnNfbWdyX292ZXJsYXlmc190ZWFyZG93bl9vbmUoa1NjcmF0Y2hNb3VudFBvaW50LCB0ZWFyZG93bl9kaXIsIGlnbm9yZV9jaGFuZ2UpOwotICAgICAgICAgICAgZnNfbWdyX292ZXJsYXlmc191bW91bnRfc2NyYXRjaCgpOwotICAgICAgICB9Ci0gICAgICAgIERlc3Ryb3lMb2dpY2FsUGFydGl0aW9uKGFuZHJvaWQ6OmdzaTo6a0RzdVNjcmF0Y2gpOwotICAgIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGZzX21ncgotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotYm9vbCBmc19tZ3Jfb3ZlcmxheWZzX2FscmVhZHlfbW91bnRlZChjb25zdCBzdGQ6OnN0cmluZyYgbW91bnRfcG9pbnQsIGJvb2wgb3ZlcmxheV9vbmx5KSB7Ci0gICAgRnN0YWIgZnN0YWI7Ci0gICAgaWYgKCFSZWFkRnN0YWJGcm9tRmlsZSgiL3Byb2MvbW91bnRzIiwgJmZzdGFiKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGNvbnN0IGF1dG8gbG93ZXJkaXIgPSBrTG93ZXJkaXJPcHRpb24gKyBtb3VudF9wb2ludDsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogZnN0YWIpIHsKLSAgICAgICAgaWYgKG92ZXJsYXlfb25seSAmJiAib3ZlcmxheSIgIT0gZW50cnkuZnNfdHlwZSAmJiAib3ZlcmxheWZzIiAhPSBlbnRyeS5mc190eXBlKSBjb250aW51ZTsKLSAgICAgICAgaWYgKG1vdW50X3BvaW50ICE9IGVudHJ5Lm1vdW50X3BvaW50KSBjb250aW51ZTsKLSAgICAgICAgaWYgKCFvdmVybGF5X29ubHkpIHJldHVybiB0cnVlOwotICAgICAgICBjb25zdCBhdXRvIG9wdGlvbnMgPSBhbmRyb2lkOjpiYXNlOjpTcGxpdChlbnRyeS5mc19vcHRpb25zLCAiLCIpOwotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIG9wdCA6IG9wdGlvbnMpIHsKLSAgICAgICAgICAgIGlmIChvcHQgPT0gbG93ZXJkaXIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19CmRpZmYgLS1naXQgYS9mc19tZ3IvZnNfbWdyX292ZXJsYXlmc19jb250cm9sLmNwcCBiL2ZzX21nci9mc19tZ3Jfb3ZlcmxheWZzX2NvbnRyb2wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4OWIzMmUKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvZnNfbWdyX292ZXJsYXlmc19jb250cm9sLmNwcApAQCAtMCwwICsxLDEwMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdHZmcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxvcHRpb25hbD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CisjaW5jbHVkZSA8ZnNfbWdyLmg+CisjaW5jbHVkZSA8ZnNfbWdyX2RtX2xpbmVhci5oPgorI2luY2x1ZGUgPGZzX21ncl9vdmVybGF5ZnMuaD4KKyNpbmNsdWRlIDxmc3RhYi9mc3RhYi5oPgorI2luY2x1ZGUgPGxpYmRtL2RtLmg+CisjaW5jbHVkZSA8bGliZmllbWFwL2ltYWdlX21hbmFnZXIuaD4KKyNpbmNsdWRlIDxsaWJnc2kvbGliZ3NpLmg+CisjaW5jbHVkZSA8bGlibHAvYnVpbGRlci5oPgorI2luY2x1ZGUgPGxpYmxwL2xpYmxwLmg+CisjaW5jbHVkZSA8c3RvcmFnZV9saXRlcmFscy9zdG9yYWdlX2xpdGVyYWxzLmg+CisKKyNpbmNsdWRlICJmc19tZ3Jfb3ZlcmxheWZzX2NvbnRyb2wuaCIKKyNpbmNsdWRlICJmc19tZ3Jfb3ZlcmxheWZzX21vdW50LmgiCisjaW5jbHVkZSAiZnNfbWdyX3ByaXYuaCIKKyNpbmNsdWRlICJsaWJmaWVtYXAvdXRpbGl0eS5oIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOjpsaXRlcmFsczsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpkbTsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpmc19tZ3I7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6c3RvcmFnZV9saXRlcmFsczsKK3VzaW5nIGFuZHJvaWQ6OmZpZW1hcDo6RmlsZXN5c3RlbUhhc1JlbGlhYmxlUGlubmluZzsKK3VzaW5nIGFuZHJvaWQ6OmZpZW1hcDo6SUltYWdlTWFuYWdlcjsKKworbmFtZXNwYWNlIHsKKworY29uc3RleHByIGNoYXIga0RhdGFTY3JhdGNoU2l6ZU1iUHJvcFtdID0gImZzX21nci5vdmVybGF5ZnMuZGF0YV9zY3JhdGNoX3NpemVfbWIiOworCitjb25zdGV4cHIgY2hhciBrUGh5c2ljYWxEZXZpY2VbXSA9ICIvZGV2L2Jsb2NrL2J5LW5hbWUvIjsKK2NvbnN0ZXhwciBjaGFyIGtTY3JhdGNoSW1hZ2VNZXRhZGF0YVtdID0gIi9tZXRhZGF0YS9nc2kvcmVtb3VudC9scF9tZXRhZGF0YSI7CisKK2NvbnN0ZXhwciBjaGFyIGtNa0YyZnNbXSA9ICIvc3lzdGVtL2Jpbi9tYWtlX2YyZnMiOworY29uc3RleHByIGNoYXIga01rRXh0NFtdID0gIi9zeXN0ZW0vYmluL21rZTJmcyI7CisKKy8vIFJldHVybiB0cnVlIGlmIGV2ZXJ5dGhpbmcgaXMgbW91bnRlZCwgYnV0IGJlZm9yZSBhZGIgaXMgc3RhcnRlZC4gIFJpZ2h0CisvLyBhZnRlciAndHJpZ2dlciBsb2FkX3BlcnNpc3RfcHJvcHNfYWN0aW9uJyBpcyBkb25lLgorc3RhdGljIGJvb2wgZnNfbWdyX2Jvb3RfY29tcGxldGVkKCkgeworICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpHZXRCb29sUHJvcGVydHkoInJvLnBlcnNpc3RlbnRfcHJvcGVydGllcy5yZWFkeSIsIGZhbHNlKTsKK30KKworLy8gTm90ZTogdGhpcyBpcyBtZWFudCBvbmx5IGZvciByZWNvdmVyeS9maXJzdC1zdGFnZSBpbml0Lgorc3RhdGljIGJvb2wgU2NyYXRjaElzT25EYXRhKCkgeworICAgIC8vIFRoZSBzY3JhdGNoIHBhcnRpdGlvbiBvZiBEU1UgaXMgbWFuYWdlZCBieSBnc2lkLgorICAgIGlmIChmc19tZ3JfaXNfZHN1X3J1bm5pbmcoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBhY2Nlc3Moa1NjcmF0Y2hJbWFnZU1ldGFkYXRhLCBGX09LKSA9PSAwOworfQorCitzdGF0aWMgYm9vbCBmc19tZ3Jfcm1fYWxsKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBib29sKiBjaGFuZ2UgPSBudWxscHRyLCBpbnQgbGV2ZWwgPSAwKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPERJUiwgZGVjbHR5cGUoJmNsb3NlZGlyKT4gZGlyKG9wZW5kaXIocGF0aC5jX3N0cigpKSwgY2xvc2VkaXIpOworICAgIGlmICghZGlyKSB7CisgICAgICAgIGlmIChlcnJubyA9PSBFTk9FTlQpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIFBFUlJPUiA8PCAib3BlbmRpciAiIDw8IHBhdGggPDwgIiBkZXB0aD0iIDw8IGxldmVsOworICAgICAgICBpZiAoKGVycm5vID09IEVQRVJNKSAmJiAobGV2ZWwgIT0gMCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZGlyZW50KiBlbnRyeTsKKyAgICBhdXRvIHJldCA9IHRydWU7CisgICAgd2hpbGUgKChlbnRyeSA9IHJlYWRkaXIoZGlyLmdldCgpKSkpIHsKKyAgICAgICAgaWYgKCgiLiJzID09IGVudHJ5LT5kX25hbWUpIHx8ICgiLi4icyA9PSBlbnRyeS0+ZF9uYW1lKSkgY29udGludWU7CisgICAgICAgIGF1dG8gZmlsZSA9IHBhdGggKyAiLyIgKyBlbnRyeS0+ZF9uYW1lOworICAgICAgICBpZiAoZW50cnktPmRfdHlwZSA9PSBEVF9VTktOT1dOKSB7CisgICAgICAgICAgICBzdHJ1Y3Qgc3RhdCBzdDsKKyAgICAgICAgICAgIGlmICghbHN0YXQoZmlsZS5jX3N0cigpLCAmc3QpICYmIChzdC5zdF9tb2RlICYgU19JRkRJUikpIGVudHJ5LT5kX3R5cGUgPSBEVF9ESVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVudHJ5LT5kX3R5cGUgPT0gRFRfRElSKSB7CisgICAgICAgICAgICByZXQgJj0gZnNfbWdyX3JtX2FsbChmaWxlLCBjaGFuZ2UsIGxldmVsICsgMSk7CisgICAgICAgICAgICBpZiAoIXJtZGlyKGZpbGUuY19zdHIoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hhbmdlKSAqY2hhbmdlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGVycm5vICE9IEVOT0VOVCkgcmV0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgUEVSUk9SIDw8ICJybWRpciAiIDw8IGZpbGUgPDwgIiBkZXB0aD0iIDw8IGxldmVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF1bmxpbmsoZmlsZS5jX3N0cigpKSkgeworICAgICAgICAgICAgaWYgKGNoYW5nZSkgKmNoYW5nZSA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZXJybm8gIT0gRU5PRU5UKSByZXQgPSBmYWxzZTsKKyAgICAgICAgICAgIFBFUlJPUiA8PCAicm0gIiA8PCBmaWxlIDw8ICIgZGVwdGg9IiA8PCBsZXZlbDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGQ6OnN0cmluZyBmc19tZ3Jfb3ZlcmxheWZzX3NldHVwX2Rpcihjb25zdCBzdGQ6OnN0cmluZyYgZGlyKSB7CisgICAgYXV0byB0b3AgPSBkaXIgKyAiLyIgKyBrT3ZlcmxheVRvcERpcjsKKworICAgIEF1dG9TZXRGc0NyZWF0ZUNvbiBjcmVhdGVjb24oa092ZXJsYXlmc0ZpbGVDb250ZXh0KTsKKyAgICBpZiAoIWNyZWF0ZWNvbi5PaygpKSB7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisgICAgaWYgKG1rZGlyKHRvcC5jX3N0cigpLCAwNzU1KSAhPSAwICYmIGVycm5vICE9IEVFWElTVCkgeworICAgICAgICBQRVJST1IgPDwgIm1rZGlyICIgPDwgdG9wOworICAgICAgICByZXR1cm4ge307CisgICAgfQorICAgIGlmICghY3JlYXRlY29uLlJlc3RvcmUoKSkgeworICAgICAgICByZXR1cm4ge307CisgICAgfQorICAgIHJldHVybiB0b3A7Cit9CisKK2Jvb2wgZnNfbWdyX292ZXJsYXlmc19zZXR1cF9vbmUoY29uc3Qgc3RkOjpzdHJpbmcmIG92ZXJsYXksIGNvbnN0IHN0ZDo6c3RyaW5nJiBtb3VudF9wb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogd2FudF9yZWJvb3QpIHsKKyAgICBpZiAoZnNfbWdyX292ZXJsYXlmc19hbHJlYWR5X21vdW50ZWQobW91bnRfcG9pbnQpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBjb25zdCBhdXRvIGJhc2UgPSBHZXRFbmNvZGVkQmFzZURpckZvck1vdW50UG9pbnQobW91bnRfcG9pbnQpOworICAgIGF1dG8gZnNyZWNfbW91bnRfcG9pbnQgPSBvdmVybGF5ICsgIi8iICsgYmFzZSArICIvIjsKKworICAgIEF1dG9TZXRGc0NyZWF0ZUNvbiBjcmVhdGVjb24oa092ZXJsYXlmc0ZpbGVDb250ZXh0KTsKKyAgICBpZiAoIWNyZWF0ZWNvbi5PaygpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKG1rZGlyKGZzcmVjX21vdW50X3BvaW50LmNfc3RyKCksIDA3NTUpICE9IDAgJiYgZXJybm8gIT0gRUVYSVNUKSB7CisgICAgICAgIFBFUlJPUiA8PCAibWtkaXIgIiA8PCBmc3JlY19tb3VudF9wb2ludDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobWtkaXIoKGZzcmVjX21vdW50X3BvaW50ICsga1dvcmtOYW1lKS5jX3N0cigpLCAwNzU1KSAhPSAwICYmIGVycm5vICE9IEVFWElTVCkgeworICAgICAgICBQRVJST1IgPDwgIm1rZGlyICIgPDwgZnNyZWNfbW91bnRfcG9pbnQgPDwga1dvcmtOYW1lOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghY3JlYXRlY29uLlJlc3RvcmUoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY3JlYXRlY29uID0ge307CisKKyAgICBhdXRvIG5ld19jb250ZXh0ID0gZnNfbWdyX2dldF9jb250ZXh0KG1vdW50X3BvaW50KTsKKyAgICBpZiAobmV3X2NvbnRleHQuZW1wdHkoKSB8fCAhY3JlYXRlY29uLlNldChuZXdfY29udGV4dCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGF1dG8gdXBwZXIgPSBmc3JlY19tb3VudF9wb2ludCArIGtVcHBlck5hbWU7CisgICAgaWYgKG1rZGlyKHVwcGVyLmNfc3RyKCksIDA3NTUpICE9IDAgJiYgZXJybm8gIT0gRUVYSVNUKSB7CisgICAgICAgIFBFUlJPUiA8PCAibWtkaXIgIiA8PCB1cHBlcjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIWNyZWF0ZWNvbi5SZXN0b3JlKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICh3YW50X3JlYm9vdCkgKndhbnRfcmVib290ID0gdHJ1ZTsKKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdWludDMyX3QgZnNfbWdyX292ZXJsYXlmc19zbG90X251bWJlcigpIHsKKyAgICByZXR1cm4gU2xvdE51bWJlckZvclNsb3RTdWZmaXgoZnNfbWdyX2dldF9zbG90X3N1ZmZpeCgpKTsKK30KKworc3RhdGljIGJvb2wgZnNfbWdyX292ZXJsYXlmc19oYXNfbG9naWNhbChjb25zdCBGc3RhYiYgZnN0YWIpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogZnN0YWIpIHsKKyAgICAgICAgaWYgKGVudHJ5LmZzX21ncl9mbGFncy5sb2dpY2FsKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK092ZXJsYXlmc1RlYXJkb3duUmVzdWx0IFRlYXJkb3duRGF0YVNjcmF0Y2goSUltYWdlTWFuYWdlciogaW1hZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFydGl0aW9uX25hbWUsIGJvb2wgd2FzX21vdW50ZWQpIHsKKyAgICBpZiAoIWltYWdlcykgeworICAgICAgICByZXR1cm4gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6OkVycm9yOworICAgIH0KKyAgICBpZiAoIWltYWdlcy0+RGlzYWJsZUltYWdlKHBhcnRpdGlvbl9uYW1lKSkgeworICAgICAgICByZXR1cm4gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6OkVycm9yOworICAgIH0KKyAgICBpZiAod2FzX21vdW50ZWQpIHsKKyAgICAgICAgLy8gSWYgb3ZlcmxheWZzIHdhcyBtb3VudGVkLCBkb24ndCBib3RoZXIgdHJ5aW5nIHRvIHVubWFwIHNpbmNlCisgICAgICAgIC8vIGl0J2xsIGZhaWwgYW5kIGNyZWF0ZSBlcnJvciBzcGFtLgorICAgICAgICByZXR1cm4gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6OkJ1c3k7CisgICAgfQorICAgIGlmICghaW1hZ2VzLT5Vbm1hcEltYWdlSWZFeGlzdHMocGFydGl0aW9uX25hbWUpKSB7CisgICAgICAgIHJldHVybiBPdmVybGF5ZnNUZWFyZG93blJlc3VsdDo6QnVzeTsKKyAgICB9CisgICAgaWYgKCFpbWFnZXMtPkRlbGV0ZUJhY2tpbmdJbWFnZShwYXJ0aXRpb25fbmFtZSkpIHsKKyAgICAgICAgcmV0dXJuIE92ZXJsYXlmc1RlYXJkb3duUmVzdWx0OjpCdXN5OworICAgIH0KKyAgICByZXR1cm4gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6Ok9rOworfQorCitib29sIEdldE92ZXJsYXlzQWN0aXZlRmxhZygpIHsKKyAgICBhdXRvIHNsb3RfbnVtYmVyID0gZnNfbWdyX292ZXJsYXlmc19zbG90X251bWJlcigpOworICAgIGNvbnN0IGF1dG8gc3VwZXJfZGV2aWNlID0ga1BoeXNpY2FsRGV2aWNlICsgZnNfbWdyX2dldF9zdXBlcl9wYXJ0aXRpb25fbmFtZSgpOworCisgICAgYXV0byBtZXRhZGF0YSA9IFJlYWRNZXRhZGF0YShzdXBlcl9kZXZpY2UsIHNsb3RfbnVtYmVyKTsKKyAgICBpZiAoIW1ldGFkYXRhKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuICEhKG1ldGFkYXRhLT5oZWFkZXIuZmxhZ3MgJiBMUF9IRUFERVJfRkxBR19PVkVSTEFZU19BQ1RJVkUpOworfQorCitib29sIFNldE92ZXJsYXlzQWN0aXZlRmxhZyhib29sIGZsYWcpIHsKKyAgICAvLyBNYXJrIG92ZXJsYXlzIGFzIGFjdGl2ZSBpbiB0aGUgcGFydGl0aW9uIHRhYmxlLCB0byBkZXRlY3QgcmUtZmxhc2guCisgICAgYXV0byBzbG90X251bWJlciA9IGZzX21ncl9vdmVybGF5ZnNfc2xvdF9udW1iZXIoKTsKKyAgICBjb25zdCBhdXRvIHN1cGVyX2RldmljZSA9IGtQaHlzaWNhbERldmljZSArIGZzX21ncl9nZXRfc3VwZXJfcGFydGl0aW9uX25hbWUoKTsKKyAgICBhdXRvIGJ1aWxkZXIgPSBNZXRhZGF0YUJ1aWxkZXI6Ok5ldyhzdXBlcl9kZXZpY2UsIHNsb3RfbnVtYmVyKTsKKyAgICBpZiAoIWJ1aWxkZXIpIHsKKyAgICAgICAgTEVSUk9SIDw8ICJvcGVuICIgPDwgc3VwZXJfZGV2aWNlIDw8ICIgbWV0YWRhdGEiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGJ1aWxkZXItPlNldE92ZXJsYXlzQWN0aXZlRmxhZyhmbGFnKTsKKyAgICBhdXRvIG1ldGFkYXRhID0gYnVpbGRlci0+RXhwb3J0KCk7CisgICAgaWYgKCFtZXRhZGF0YSB8fCAhVXBkYXRlUGFydGl0aW9uVGFibGUoc3VwZXJfZGV2aWNlLCAqbWV0YWRhdGEuZ2V0KCksIHNsb3RfbnVtYmVyKSkgeworICAgICAgICBMRVJST1IgPDwgInVwZGF0ZSBzdXBlciBtZXRhZGF0YSI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK092ZXJsYXlmc1RlYXJkb3duUmVzdWx0IGZzX21ncl9vdmVybGF5ZnNfdGVhcmRvd25fc2NyYXRjaChjb25zdCBzdGQ6OnN0cmluZyYgb3ZlcmxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBjaGFuZ2UpIHsKKyAgICAvLyB1bW91bnQgYW5kIGRlbGV0ZSBrU2NyYXRjaE1vdW50UG9pbnQgc3RvcmFnZSBpZiB3ZSBoYXZlIGxvZ2ljYWwgcGFydGl0aW9ucworICAgIGlmIChvdmVybGF5ICE9IGtTY3JhdGNoTW91bnRQb2ludCkgeworICAgICAgICByZXR1cm4gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6Ok9rOworICAgIH0KKworICAgIC8vIFZhbGlkYXRpb24gY2hlY2suCisgICAgaWYgKGZzX21ncl9pc19kc3VfcnVubmluZygpKSB7CisgICAgICAgIExFUlJPUiA8PCAiRGVzdHJveWluZyBEU1Ugc2NyYXRjaCBpcyBub3QgYWxsb3dlZC4iOworICAgICAgICByZXR1cm4gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6OkVycm9yOworICAgIH0KKworICAgIC8vIE5vdGU6IHdlIGRvbid0IGNhcmUgaWYgU2V0T3ZlcmxheXNBY3RpdmVGbGFnIGZhaWxzLCBzaW5jZQorICAgIC8vIHRoZSBvdmVybGF5cyBhcmUgcmVtb3ZlZCBubyBtYXR0ZXIgd2hhdC4KKyAgICBTZXRPdmVybGF5c0FjdGl2ZUZsYWcoZmFsc2UpOworCisgICAgYm9vbCB3YXNfbW91bnRlZCA9IGZzX21ncl9vdmVybGF5ZnNfYWxyZWFkeV9tb3VudGVkKGtTY3JhdGNoTW91bnRQb2ludCwgZmFsc2UpOworICAgIGlmICh3YXNfbW91bnRlZCkgeworICAgICAgICBmc19tZ3Jfb3ZlcmxheWZzX3Vtb3VudF9zY3JhdGNoKCk7CisgICAgfQorCisgICAgY29uc3QgYXV0byBwYXJ0aXRpb25fbmFtZSA9IGFuZHJvaWQ6OmJhc2U6OkJhc2VuYW1lKGtTY3JhdGNoTW91bnRQb2ludCk7CisKKyAgICBhdXRvIGltYWdlcyA9IElJbWFnZU1hbmFnZXI6Ok9wZW4oInJlbW91bnQiLCAxMHMpOworICAgIGlmIChpbWFnZXMgJiYgaW1hZ2VzLT5CYWNraW5nSW1hZ2VFeGlzdHMocGFydGl0aW9uX25hbWUpKSB7CisgICAgICAgIC8vIE5vIG5lZWQgdG8gY2hlY2sgc3VwZXIgcGFydGl0aW9uLCBpZiB3ZSBrbmV3IHdlIGhhZCBhIHNjcmF0Y2ggZGV2aWNlCisgICAgICAgIC8vIGluIC9kYXRhLgorICAgICAgICByZXR1cm4gVGVhcmRvd25EYXRhU2NyYXRjaChpbWFnZXMuZ2V0KCksIHBhcnRpdGlvbl9uYW1lLCB3YXNfbW91bnRlZCk7CisgICAgfQorCisgICAgYXV0byBzbG90X251bWJlciA9IGZzX21ncl9vdmVybGF5ZnNfc2xvdF9udW1iZXIoKTsKKyAgICBjb25zdCBhdXRvIHN1cGVyX2RldmljZSA9IGtQaHlzaWNhbERldmljZSArIGZzX21ncl9nZXRfc3VwZXJfcGFydGl0aW9uX25hbWUoKTsKKyAgICBpZiAoYWNjZXNzKHN1cGVyX2RldmljZS5jX3N0cigpLCBSX09LIHwgV19PSykpIHsKKyAgICAgICAgcmV0dXJuIE92ZXJsYXlmc1RlYXJkb3duUmVzdWx0OjpPazsKKyAgICB9CisKKyAgICBhdXRvIGJ1aWxkZXIgPSBNZXRhZGF0YUJ1aWxkZXI6Ok5ldyhzdXBlcl9kZXZpY2UsIHNsb3RfbnVtYmVyKTsKKyAgICBpZiAoIWJ1aWxkZXIpIHsKKyAgICAgICAgcmV0dXJuIE92ZXJsYXlmc1RlYXJkb3duUmVzdWx0OjpPazsKKyAgICB9CisgICAgaWYgKGJ1aWxkZXItPkZpbmRQYXJ0aXRpb24ocGFydGl0aW9uX25hbWUpID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIE92ZXJsYXlmc1RlYXJkb3duUmVzdWx0OjpPazsKKyAgICB9CisgICAgYnVpbGRlci0+UmVtb3ZlUGFydGl0aW9uKHBhcnRpdGlvbl9uYW1lKTsKKyAgICBhdXRvIG1ldGFkYXRhID0gYnVpbGRlci0+RXhwb3J0KCk7CisgICAgaWYgKG1ldGFkYXRhICYmIFVwZGF0ZVBhcnRpdGlvblRhYmxlKHN1cGVyX2RldmljZSwgKm1ldGFkYXRhLmdldCgpLCBzbG90X251bWJlcikpIHsKKyAgICAgICAgaWYgKGNoYW5nZSkgKmNoYW5nZSA9IHRydWU7CisgICAgICAgIGlmICghRGVzdHJveUxvZ2ljYWxQYXJ0aXRpb24ocGFydGl0aW9uX25hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6OkVycm9yOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTEVSUk9SIDw8ICJkZWxldGUgcGFydGl0aW9uICIgPDwgb3ZlcmxheTsKKyAgICAgICAgcmV0dXJuIE92ZXJsYXlmc1RlYXJkb3duUmVzdWx0OjpFcnJvcjsKKyAgICB9CisKKyAgICBpZiAod2FzX21vdW50ZWQpIHsKKyAgICAgICAgcmV0dXJuIE92ZXJsYXlmc1RlYXJkb3duUmVzdWx0OjpCdXN5OworICAgIH0KKyAgICByZXR1cm4gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6Ok9rOworfQorCitib29sIGZzX21ncl9vdmVybGF5ZnNfdGVhcmRvd25fb25lKGNvbnN0IHN0ZDo6c3RyaW5nJiBvdmVybGF5LCBjb25zdCBzdGQ6OnN0cmluZyYgbW91bnRfcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGNoYW5nZSwgYm9vbCogc2hvdWxkX2Rlc3Ryb3lfc2NyYXRjaCA9IG51bGxwdHIpIHsKKyAgICBjb25zdCBhdXRvIHRvcCA9IG92ZXJsYXkgKyAiLyIgKyBrT3ZlcmxheVRvcERpcjsKKworICAgIGlmIChhY2Nlc3ModG9wLmNfc3RyKCksIEZfT0spKSB7CisgICAgICAgIGlmIChzaG91bGRfZGVzdHJveV9zY3JhdGNoKSAqc2hvdWxkX2Rlc3Ryb3lfc2NyYXRjaCA9IHRydWU7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGF1dG8gY2xlYW51cF9hbGwgPSBtb3VudF9wb2ludC5lbXB0eSgpOworICAgIGNvbnN0IGF1dG8gYmFzZSA9IEdldEVuY29kZWRCYXNlRGlyRm9yTW91bnRQb2ludChtb3VudF9wb2ludCk7CisgICAgY29uc3QgYXV0byBvbGRwYXRoID0gdG9wICsgKGNsZWFudXBfYWxsID8gIiIgOiAoIi8iICsgYmFzZSkpOworICAgIGNvbnN0IGF1dG8gbmV3cGF0aCA9IGNsZWFudXBfYWxsID8gb3ZlcmxheSArICIvLiIgKyBrT3ZlcmxheVRvcERpciArICIudGVhcmRvd24iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0b3AgKyAiLy4iICsgYmFzZSArICIudGVhcmRvd24iOworICAgIGF1dG8gcmV0ID0gZnNfbWdyX3JtX2FsbChuZXdwYXRoKTsKKyAgICBpZiAoIXJlbmFtZShvbGRwYXRoLmNfc3RyKCksIG5ld3BhdGguY19zdHIoKSkpIHsKKyAgICAgICAgaWYgKGNoYW5nZSkgKmNoYW5nZSA9IHRydWU7CisgICAgfSBlbHNlIGlmIChlcnJubyAhPSBFTk9FTlQpIHsKKyAgICAgICAgcmV0ID0gZmFsc2U7CisgICAgICAgIFBFUlJPUiA8PCAibXYgIiA8PCBvbGRwYXRoIDw8ICIgIiA8PCBuZXdwYXRoOworICAgIH0KKyAgICByZXQgJj0gZnNfbWdyX3JtX2FsbChuZXdwYXRoLCBjaGFuZ2UpOworICAgIGlmICghcm1kaXIobmV3cGF0aC5jX3N0cigpKSkgeworICAgICAgICBpZiAoY2hhbmdlKSAqY2hhbmdlID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKGVycm5vICE9IEVOT0VOVCkgeworICAgICAgICByZXQgPSBmYWxzZTsKKyAgICAgICAgUEVSUk9SIDw8ICJybWRpciAiIDw8IG5ld3BhdGg7CisgICAgfQorICAgIGlmICghY2xlYW51cF9hbGwpIHsKKyAgICAgICAgaWYgKCFybWRpcih0b3AuY19zdHIoKSkpIHsKKyAgICAgICAgICAgIGlmIChjaGFuZ2UpICpjaGFuZ2UgPSB0cnVlOworICAgICAgICAgICAgY2xlYW51cF9hbGwgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGVycm5vID09IEVOT1RFTVBUWSkgeworICAgICAgICAgICAgY2xlYW51cF9hbGwgPSB0cnVlOworICAgICAgICAgICAgLy8gY2xlYW51cCBhbGwgaWYgdGhlIGNvbnRlbnQgaXMgYWxsIGhpZGRlbiAobGVhZGluZyAuKQorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPERJUiwgZGVjbHR5cGUoJmNsb3NlZGlyKT4gZGlyKG9wZW5kaXIodG9wLmNfc3RyKCkpLCBjbG9zZWRpcik7CisgICAgICAgICAgICBpZiAoIWRpcikgeworICAgICAgICAgICAgICAgIFBFUlJPUiA8PCAib3BlbmRpciAiIDw8IHRvcDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGlyZW50KiBlbnRyeTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKGVudHJ5ID0gcmVhZGRpcihkaXIuZ2V0KCkpKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnktPmRfbmFtZVswXSAhPSAnLicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFudXBfYWxsID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChlcnJubyA9PSBFTk9FTlQpIHsKKyAgICAgICAgICAgIGNsZWFudXBfYWxsID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IGZhbHNlOworICAgICAgICAgICAgUEVSUk9SIDw8ICJybWRpciAiIDw8IHRvcDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc2hvdWxkX2Rlc3Ryb3lfc2NyYXRjaCkgKnNob3VsZF9kZXN0cm95X3NjcmF0Y2ggPSBjbGVhbnVwX2FsbDsKKyAgICByZXR1cm4gcmV0OworfQorCisvLyBOb3RlOiBUaGUgc2NyYXRjaCBwYXJ0aXRpb24gb2YgRFNVIGlzIG1hbmFnZWQgYnkgZ3NpZCwgYW5kIHNob3VsZCBiZSBpbml0aWFsaXplZCBkdXJpbmcKKy8vIGZpcnN0LXN0YWdlLW1vdW50LiBKdXN0IGNoZWNrIGlmIHRoZSBETSBkZXZpY2UgZm9yIERTVSBzY3JhdGNoIHBhcnRpdGlvbiBpcyBjcmVhdGVkIG9yIG5vdC4KK3N0YXRpYyBzdGQ6OnN0cmluZyBHZXREc3VTY3JhdGNoRGV2aWNlKCkgeworICAgIGF1dG8mIGRtID0gRGV2aWNlTWFwcGVyOjpJbnN0YW5jZSgpOworICAgIHN0ZDo6c3RyaW5nIGRldmljZTsKKyAgICBpZiAoZG0uR2V0U3RhdGUoYW5kcm9pZDo6Z3NpOjprRHN1U2NyYXRjaCkgIT0gRG1EZXZpY2VTdGF0ZTo6SU5WQUxJRCAmJgorICAgICAgICBkbS5HZXREbURldmljZVBhdGhCeU5hbWUoYW5kcm9pZDo6Z3NpOjprRHN1U2NyYXRjaCwgJmRldmljZSkpIHsKKyAgICAgICAgcmV0dXJuIGRldmljZTsKKyAgICB9CisgICAgcmV0dXJuICIiOworfQorCitib29sIE1ha2VTY3JhdGNoRmlsZXN5c3RlbShjb25zdCBzdGQ6OnN0cmluZyYgc2NyYXRjaF9kZXZpY2UpIHsKKyAgICAvLyBGb3JjZSBta2ZzIGJ5IGRlc2lnbiBmb3Igb3ZlcmxheSBzdXBwb3J0IG9mIGFkYiByZW1vdW50LCBzaW1wbGlmeSBhbmQKKyAgICAvLyB0aHVzIGRvIG5vdCByZWx5IG9uIGZzY2sgdG8gY29ycmVjdCBwcm9ibGVtcyB0aGF0IGNvdWxkIGNyZWVwIGluLgorICAgIGF1dG8gZnNfdHlwZSA9ICIiczsKKyAgICBhdXRvIGNvbW1hbmQgPSAiInM7CisgICAgaWYgKCFhY2Nlc3Moa01rRjJmcywgWF9PSykgJiYgZnNfbWdyX2ZpbGVzeXN0ZW1fYXZhaWxhYmxlKCJmMmZzIikpIHsKKyAgICAgICAgZnNfdHlwZSA9ICJmMmZzIjsKKyAgICAgICAgY29tbWFuZCA9IGtNa0YyZnMgKyAiIC1iICJzOworICAgICAgICBjb21tYW5kICs9IHN0ZDo6dG9fc3RyaW5nKGZzX21ncl9mMmZzX2lkZWFsX2Jsb2NrX3NpemUoKSk7CisgICAgICAgIGNvbW1hbmQgKz0gIiAtZiAtZDEgLWwiICsgYW5kcm9pZDo6YmFzZTo6QmFzZW5hbWUoa1NjcmF0Y2hNb3VudFBvaW50KTsKKyAgICB9IGVsc2UgaWYgKCFhY2Nlc3Moa01rRXh0NCwgWF9PSykgJiYgZnNfbWdyX2ZpbGVzeXN0ZW1fYXZhaWxhYmxlKCJleHQ0IikpIHsKKyAgICAgICAgZnNfdHlwZSA9ICJleHQ0IjsKKyAgICAgICAgY29tbWFuZCA9IGtNa0V4dDQgKyAiIC1GIC1iIDQwOTYgLXQgZXh0NCAtbSAwIC1PIGhhc19qb3VybmFsIC1NICJzICsga1NjcmF0Y2hNb3VudFBvaW50OworICAgIH0gZWxzZSB7CisgICAgICAgIExFUlJPUiA8PCAiTm8gc3VwcG9ydGVkIG1rZnMgY29tbWFuZCBvciBmaWxlc3lzdGVtIGRyaXZlciBhdmFpbGFibGUsIHN1cHBvcnRlZCBmaWxlc3lzdGVtcyAiCisgICAgICAgICAgICAgICAgICAiYXJlOiBmMmZzLCBleHQ0IjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjb21tYW5kICs9ICIgIiArIHNjcmF0Y2hfZGV2aWNlICsgIiA+L2Rldi9udWxsIDI+L2Rldi9udWxsIDwvZGV2L251bGwiOworICAgIGZzX21ncl9zZXRfYmxrX3JvKHNjcmF0Y2hfZGV2aWNlLCBmYWxzZSk7CisgICAgYXV0byByZXQgPSBzeXN0ZW0oY29tbWFuZC5jX3N0cigpKTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIExFUlJPUiA8PCAibWFrZSAiIDw8IGZzX3R5cGUgPDwgIiBmaWxlc3lzdGVtIG9uICIgPDwgc2NyYXRjaF9kZXZpY2UgPDwgIiByZXR1cm49IiA8PCByZXQ7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIFRydW5jYXRlUGFydGl0aW9uc1dpdGhTdWZmaXgoTWV0YWRhdGFCdWlsZGVyKiBidWlsZGVyLCBjb25zdCBzdGQ6OnN0cmluZyYgc3VmZml4KSB7CisgICAgYXV0byYgZG0gPSBEZXZpY2VNYXBwZXI6Okluc3RhbmNlKCk7CisKKyAgICAvLyBSZW1vdmUgPG90aGVyPiBwYXJ0aXRpb25zCisgICAgZm9yIChjb25zdCBhdXRvJiBncm91cCA6IGJ1aWxkZXItPkxpc3RHcm91cHMoKSkgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHBhcnQgOiBidWlsZGVyLT5MaXN0UGFydGl0aW9uc0luR3JvdXAoZ3JvdXApKSB7CisgICAgICAgICAgICBjb25zdCBhdXRvJiBuYW1lID0gcGFydC0+bmFtZSgpOworICAgICAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpFbmRzV2l0aChuYW1lLCBzdWZmaXgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZG0uR2V0U3RhdGUobmFtZSkgIT0gRG1EZXZpY2VTdGF0ZTo6SU5WQUxJRCAmJiAhRGVzdHJveUxvZ2ljYWxQYXJ0aXRpb24obmFtZSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1aWxkZXItPlJlc2l6ZVBhcnRpdGlvbihidWlsZGVyLT5GaW5kUGFydGl0aW9uKG5hbWUpLCAwKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gQ3JlYXRlIG9yIHVwZGF0ZSBhIHNjcmF0Y2ggcGFydGl0aW9uIHdpdGhpbiBzdXBlci4KK3N0YXRpYyBib29sIENyZWF0ZUR5bmFtaWNTY3JhdGNoKHN0ZDo6c3RyaW5nKiBzY3JhdGNoX2RldmljZSwgYm9vbCogcGFydGl0aW9uX2V4aXN0cykgeworICAgIGNvbnN0IGF1dG8gcGFydGl0aW9uX25hbWUgPSBhbmRyb2lkOjpiYXNlOjpCYXNlbmFtZShrU2NyYXRjaE1vdW50UG9pbnQpOworCisgICAgYXV0byYgZG0gPSBEZXZpY2VNYXBwZXI6Okluc3RhbmNlKCk7CisgICAgKnBhcnRpdGlvbl9leGlzdHMgPSBkbS5HZXRTdGF0ZShwYXJ0aXRpb25fbmFtZSkgIT0gRG1EZXZpY2VTdGF0ZTo6SU5WQUxJRDsKKworICAgIGF1dG8gcGFydGl0aW9uX2NyZWF0ZSA9ICEqcGFydGl0aW9uX2V4aXN0czsKKyAgICBhdXRvIHNsb3RfbnVtYmVyID0gZnNfbWdyX292ZXJsYXlmc19zbG90X251bWJlcigpOworICAgIGNvbnN0IGF1dG8gc3VwZXJfZGV2aWNlID0ga1BoeXNpY2FsRGV2aWNlICsgZnNfbWdyX2dldF9zdXBlcl9wYXJ0aXRpb25fbmFtZSgpOworICAgIGF1dG8gYnVpbGRlciA9IE1ldGFkYXRhQnVpbGRlcjo6TmV3KHN1cGVyX2RldmljZSwgc2xvdF9udW1iZXIpOworICAgIGlmICghYnVpbGRlcikgeworICAgICAgICBMRVJST1IgPDwgIm9wZW4gIiA8PCBzdXBlcl9kZXZpY2UgPDwgIiBtZXRhZGF0YSI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgYXV0byBwYXJ0aXRpb24gPSBidWlsZGVyLT5GaW5kUGFydGl0aW9uKHBhcnRpdGlvbl9uYW1lKTsKKyAgICAqcGFydGl0aW9uX2V4aXN0cyA9IHBhcnRpdGlvbiAhPSBudWxscHRyOworICAgIGF1dG8gY2hhbmdlZCA9IGZhbHNlOworICAgIGlmICghKnBhcnRpdGlvbl9leGlzdHMpIHsKKyAgICAgICAgcGFydGl0aW9uID0gYnVpbGRlci0+QWRkUGFydGl0aW9uKHBhcnRpdGlvbl9uYW1lLCBMUF9QQVJUSVRJT05fQVRUUl9OT05FKTsKKyAgICAgICAgaWYgKCFwYXJ0aXRpb24pIHsKKyAgICAgICAgICAgIExFUlJPUiA8PCAiY3JlYXRlICIgPDwgcGFydGl0aW9uX25hbWU7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgfQorICAgIC8vIFRha2UgaGFsZiBvZiBmcmVlIHNwYWNlLCBtaW5pbXVtIDUxMk1CIG9yIG1heGltdW0gZnJlZSAtIG1hcmdpbi4KKyAgICBzdGF0aWMgY29uc3RleHByIGF1dG8ga01pbmltdW1TaXplID0gdWludDY0X3QoNTEyICogMTAyNCAqIDEwMjQpOworICAgIGlmIChwYXJ0aXRpb24tPnNpemUoKSA8IGtNaW5pbXVtU2l6ZSkgeworICAgICAgICBhdXRvIHBhcnRpdGlvbl9zaXplID0KKyAgICAgICAgICAgICAgICBidWlsZGVyLT5BbGxvY2F0YWJsZVNwYWNlKCkgLSBidWlsZGVyLT5Vc2VkU3BhY2UoKSArIHBhcnRpdGlvbi0+c2l6ZSgpOworICAgICAgICBpZiAoKHBhcnRpdGlvbl9zaXplID4ga01pbmltdW1TaXplKSB8fCAhcGFydGl0aW9uLT5zaXplKCkpIHsKKyAgICAgICAgICAgIHBhcnRpdGlvbl9zaXplID0gc3RkOjptYXgoc3RkOjptaW4oa01pbmltdW1TaXplLCBwYXJ0aXRpb25fc2l6ZSksIHBhcnRpdGlvbl9zaXplIC8gMik7CisgICAgICAgICAgICBpZiAocGFydGl0aW9uX3NpemUgPiBwYXJ0aXRpb24tPnNpemUoKSkgeworICAgICAgICAgICAgICAgIGlmICghYnVpbGRlci0+UmVzaXplUGFydGl0aW9uKHBhcnRpdGlvbiwgcGFydGl0aW9uX3NpemUpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRyeSB0byBmcmVlIHVwIHNwYWNlIGJ5IGRlYWxsb2NhdGluZyBwYXJ0aXRpb25zIGluIHRoZSBvdGhlciBzbG90LgorICAgICAgICAgICAgICAgICAgICBUcnVuY2F0ZVBhcnRpdGlvbnNXaXRoU3VmZml4KGJ1aWxkZXIuZ2V0KCksIGZzX21ncl9nZXRfb3RoZXJfc2xvdF9zdWZmaXgoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uX3NpemUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXItPkFsbG9jYXRhYmxlU3BhY2UoKSAtIGJ1aWxkZXItPlVzZWRTcGFjZSgpICsgcGFydGl0aW9uLT5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbl9zaXplID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1heChzdGQ6Om1pbihrTWluaW11bVNpemUsIHBhcnRpdGlvbl9zaXplKSwgcGFydGl0aW9uX3NpemUgLyAyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFidWlsZGVyLT5SZXNpemVQYXJ0aXRpb24ocGFydGl0aW9uLCBwYXJ0aXRpb25fc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExFUlJPUiA8PCAicmVzaXplICIgPDwgcGFydGl0aW9uX25hbWU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFwYXJ0aXRpb25fY3JlYXRlKSBEZXN0cm95TG9naWNhbFBhcnRpdGlvbihwYXJ0aXRpb25fbmFtZSk7CisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgKnBhcnRpdGlvbl9leGlzdHMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGxhbmQgdGhlIHVwZGF0ZSBiYWNrIG9uIHRvIHRoZSBwYXJ0aXRpb24KKyAgICBpZiAoY2hhbmdlZCkgeworICAgICAgICBhdXRvIG1ldGFkYXRhID0gYnVpbGRlci0+RXhwb3J0KCk7CisgICAgICAgIGlmICghbWV0YWRhdGEgfHwgIVVwZGF0ZVBhcnRpdGlvblRhYmxlKHN1cGVyX2RldmljZSwgKm1ldGFkYXRhLmdldCgpLCBzbG90X251bWJlcikpIHsKKyAgICAgICAgICAgIExFUlJPUiA8PCAiYWRkIHBhcnRpdGlvbiAiIDw8IHBhcnRpdGlvbl9uYW1lOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNoYW5nZWQgfHwgcGFydGl0aW9uX2NyZWF0ZSkgeworICAgICAgICBDcmVhdGVMb2dpY2FsUGFydGl0aW9uUGFyYW1zIHBhcmFtcyA9IHsKKyAgICAgICAgICAgICAgICAuYmxvY2tfZGV2aWNlID0gc3VwZXJfZGV2aWNlLAorICAgICAgICAgICAgICAgIC5tZXRhZGF0YV9zbG90ID0gc2xvdF9udW1iZXIsCisgICAgICAgICAgICAgICAgLnBhcnRpdGlvbl9uYW1lID0gcGFydGl0aW9uX25hbWUsCisgICAgICAgICAgICAgICAgLmZvcmNlX3dyaXRhYmxlID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAudGltZW91dF9tcyA9IDEwcywKKyAgICAgICAgfTsKKyAgICAgICAgaWYgKCFDcmVhdGVMb2dpY2FsUGFydGl0aW9uKHBhcmFtcywgc2NyYXRjaF9kZXZpY2UpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHNjcmF0Y2hfZGV2aWNlLT5lbXB0eSgpKSB7CisgICAgICAgICpzY3JhdGNoX2RldmljZSA9IEdldEJvb3RTY3JhdGNoRGV2aWNlKCk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IEdldElkZWFsRGF0YVNjcmF0Y2hTaXplKCkgeworICAgIEJsb2NrRGV2aWNlSW5mbyBzdXBlcl9pbmZvOworICAgIFBhcnRpdGlvbk9wZW5lciBvcGVuZXI7CisgICAgaWYgKCFvcGVuZXIuR2V0SW5mbyhmc19tZ3JfZ2V0X3N1cGVyX3BhcnRpdGlvbl9uYW1lKCksICZzdXBlcl9pbmZvKSkgeworICAgICAgICBMRVJST1IgPDwgImNvdWxkIG5vdCBnZXQgYmxvY2sgZGV2aWNlIGluZm8gZm9yIHN1cGVyIjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgc3RydWN0IHN0YXR2ZnMgczsKKyAgICBpZiAoc3RhdHZmcygiL2RhdGEiLCAmcykgPCAwKSB7CisgICAgICAgIFBFUlJPUiA8PCAiY291bGQgbm90IHN0YXRmcyAvZGF0YSI7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGF1dG8gaWRlYWxfc2l6ZSA9IHN0ZDo6bWluKHN1cGVyX2luZm8uc2l6ZSwgdWludDY0X3QodWludDY0X3Qocy5mX2Zyc2l6ZSkgKiBzLmZfYmZyZWUgKiAwLjg1KSk7CisKKyAgICAvLyBBbGlnbiB1cCB0byB0aGUgZmlsZXN5c3RlbSBibG9jayBzaXplLgorICAgIGlmIChhdXRvIHJlbWFpbmRlciA9IGlkZWFsX3NpemUgJSBzLmZfYnNpemU7IHJlbWFpbmRlciA+IDApIHsKKyAgICAgICAgaWRlYWxfc2l6ZSArPSBzLmZfYnNpemUgLSByZW1haW5kZXI7CisgICAgfQorICAgIHJldHVybiBpZGVhbF9zaXplOworfQorCitzdGF0aWMgYm9vbCBDcmVhdGVTY3JhdGNoT25EYXRhKHN0ZDo6c3RyaW5nKiBzY3JhdGNoX2RldmljZSwgYm9vbCogcGFydGl0aW9uX2V4aXN0cykgeworICAgICpwYXJ0aXRpb25fZXhpc3RzID0gZmFsc2U7CisKKyAgICBhdXRvIGltYWdlcyA9IElJbWFnZU1hbmFnZXI6Ok9wZW4oInJlbW91bnQiLCAxMHMpOworICAgIGlmICghaW1hZ2VzKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBhdXRvIHBhcnRpdGlvbl9uYW1lID0gYW5kcm9pZDo6YmFzZTo6QmFzZW5hbWUoa1NjcmF0Y2hNb3VudFBvaW50KTsKKyAgICBpZiAoaW1hZ2VzLT5HZXRNYXBwZWRJbWFnZURldmljZShwYXJ0aXRpb25fbmFtZSwgc2NyYXRjaF9kZXZpY2UpKSB7CisgICAgICAgICpwYXJ0aXRpb25fZXhpc3RzID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gTm90ZTogY2FsbGluZyBSZW1vdmVEaXNhYmxlZEltYWdlcyBoZXJlIGVuc3VyZXMgdGhhdCB3ZSBkbyBub3QgcmFjZSB3aXRoCisgICAgLy8gY2xlYW5fc2NyYXRjaF9maWxlcyBhbmQgYWNjaWRlbnRhbGx5IHRyeSB0byBtYXAgYW4gaW1hZ2UgdGhhdCB3aWxsIGJlCisgICAgLy8gZGVsZXRlZC4KKyAgICBpZiAoIWltYWdlcy0+UmVtb3ZlRGlzYWJsZWRJbWFnZXMoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghaW1hZ2VzLT5CYWNraW5nSW1hZ2VFeGlzdHMocGFydGl0aW9uX25hbWUpKSB7CisgICAgICAgIGF1dG8gc2l6ZSA9IGFuZHJvaWQ6OmJhc2U6OkdldFVpbnRQcm9wZXJ0eTx1aW50NjRfdD4oa0RhdGFTY3JhdGNoU2l6ZU1iUHJvcCwgMCkgKiAxX01pQjsKKyAgICAgICAgaWYgKCFzaXplKSB7CisgICAgICAgICAgICBzaXplID0gR2V0SWRlYWxEYXRhU2NyYXRjaFNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNpemUpIHsKKyAgICAgICAgICAgIHNpemUgPSAyX0dpQjsKKyAgICAgICAgfQorCisgICAgICAgIGF1dG8gZmxhZ3MgPSBJSW1hZ2VNYW5hZ2VyOjpDUkVBVEVfSU1BR0VfREVGQVVMVDsKKworICAgICAgICBpZiAoIWltYWdlcy0+Q3JlYXRlQmFja2luZ0ltYWdlKHBhcnRpdGlvbl9uYW1lLCBzaXplLCBmbGFncykpIHsKKyAgICAgICAgICAgIExFUlJPUiA8PCAiY291bGQgbm90IGNyZWF0ZSBzY3JhdGNoIGltYWdlIG9mICIgPDwgc2l6ZSA8PCAiIGJ5dGVzIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIWltYWdlcy0+TWFwSW1hZ2VEZXZpY2UocGFydGl0aW9uX25hbWUsIDEwcywgc2NyYXRjaF9kZXZpY2UpKSB7CisgICAgICAgIExFUlJPUiA8PCAiY291bGQgbm90IG1hcCBzY3JhdGNoIGltYWdlIjsKKyAgICAgICAgLy8gSWYgd2UgY2Fubm90IHVzZSB0aGlzIGltYWdlLCB0aGVuIHJlbW92ZSBpdC4KKyAgICAgICAgVGVhcmRvd25EYXRhU2NyYXRjaChpbWFnZXMuZ2V0KCksIHBhcnRpdGlvbl9uYW1lLCBmYWxzZSAvKiB3YXNfbW91bnRlZCAqLyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIENhblVzZVN1cGVyUGFydGl0aW9uKGNvbnN0IEZzdGFiJiBmc3RhYikgeworICAgIGF1dG8gc2xvdF9udW1iZXIgPSBmc19tZ3Jfb3ZlcmxheWZzX3Nsb3RfbnVtYmVyKCk7CisgICAgY29uc3QgYXV0byBzdXBlcl9kZXZpY2UgPSBrUGh5c2ljYWxEZXZpY2UgKyBmc19tZ3JfZ2V0X3N1cGVyX3BhcnRpdGlvbl9uYW1lKCk7CisgICAgaWYgKGFjY2VzcyhzdXBlcl9kZXZpY2UuY19zdHIoKSwgUl9PSyB8IFdfT0spIHx8ICFmc19tZ3Jfb3ZlcmxheWZzX2hhc19sb2dpY2FsKGZzdGFiKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGF1dG8gbWV0YWRhdGEgPSBSZWFkTWV0YWRhdGEoc3VwZXJfZGV2aWNlLCBzbG90X251bWJlcik7CisgICAgaWYgKCFtZXRhZGF0YSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIGZzX21ncl9vdmVybGF5ZnNfY3JlYXRlX3NjcmF0Y2goY29uc3QgRnN0YWImIGZzdGFiLCBzdGQ6OnN0cmluZyogc2NyYXRjaF9kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcGFydGl0aW9uX2V4aXN0cykgeworICAgIC8vIFVzZSB0aGUgRFNVIHNjcmF0Y2ggZGV2aWNlIG1hbmFnZWQgYnkgZ3NpZCBpZiB3aXRoaW4gYSBEU1Ugc3lzdGVtLgorICAgIGlmIChmc19tZ3JfaXNfZHN1X3J1bm5pbmcoKSkgeworICAgICAgICAqc2NyYXRjaF9kZXZpY2UgPSBHZXREc3VTY3JhdGNoRGV2aWNlKCk7CisgICAgICAgICpwYXJ0aXRpb25fZXhpc3RzID0gIXNjcmF0Y2hfZGV2aWNlLT5lbXB0eSgpOworICAgICAgICByZXR1cm4gKnBhcnRpdGlvbl9leGlzdHM7CisgICAgfQorCisgICAgLy8gVHJ5IEltYWdlTWFuYWdlciBvbiAvZGF0YSBmaXJzdC4KKyAgICBib29sIGNhbl91c2VfZGF0YSA9IGZhbHNlOworICAgIGlmIChGaWxlc3lzdGVtSGFzUmVsaWFibGVQaW5uaW5nKCIvZGF0YSIsICZjYW5fdXNlX2RhdGEpICYmIGNhbl91c2VfZGF0YSkgeworICAgICAgICBpZiAoQ3JlYXRlU2NyYXRjaE9uRGF0YShzY3JhdGNoX2RldmljZSwgcGFydGl0aW9uX2V4aXN0cykpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIHNjcmF0Y2ggb24gL2RhdGEsIGZhbGxiYWNrIHRvIHVzZSBmcmVlIHNwYWNlIG9uIHN1cGVyIjsKKyAgICB9CisgICAgLy8gSWYgdGhhdCBmYWlscywgc2VlIGlmIHdlIGNhbiBsYW5kIG9uIHN1cGVyLgorICAgIGlmIChDYW5Vc2VTdXBlclBhcnRpdGlvbihmc3RhYikpIHsKKyAgICAgICAgcmV0dXJuIENyZWF0ZUR5bmFtaWNTY3JhdGNoKHNjcmF0Y2hfZGV2aWNlLCBwYXJ0aXRpb25fZXhpc3RzKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBDcmVhdGUgYW5kIG1vdW50IGtTY3JhdGNoTW91bnRQb2ludCBzdG9yYWdlIGlmIHdlIGhhdmUgbG9naWNhbCBwYXJ0aXRpb25zCitib29sIGZzX21ncl9vdmVybGF5ZnNfc2V0dXBfc2NyYXRjaChjb25zdCBGc3RhYiYgZnN0YWIpIHsKKyAgICBpZiAoZnNfbWdyX292ZXJsYXlmc19hbHJlYWR5X21vdW50ZWQoa1NjcmF0Y2hNb3VudFBvaW50LCBmYWxzZSkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgc2NyYXRjaF9kZXZpY2U7CisgICAgYm9vbCBwYXJ0aXRpb25fZXhpc3RzOworICAgIGlmICghZnNfbWdyX292ZXJsYXlmc19jcmVhdGVfc2NyYXRjaChmc3RhYiwgJnNjcmF0Y2hfZGV2aWNlLCAmcGFydGl0aW9uX2V4aXN0cykpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBzY3JhdGNoIHBhcnRpdGlvbiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIVNldE92ZXJsYXlzQWN0aXZlRmxhZyh0cnVlKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gdXBkYXRlIGR5bmFtaWMgcGFydGl0aW9uIGRhdGEiOworICAgICAgICBmc19tZ3Jfb3ZlcmxheWZzX3RlYXJkb3duX3NjcmF0Y2goa1NjcmF0Y2hNb3VudFBvaW50LCBudWxscHRyKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIElmIHRoZSBwYXJ0aXRpb24gZXhpc3RzLCBhc3N1bWUgZmlyc3QgdGhhdCBpdCBjYW4gYmUgbW91bnRlZC4KKyAgICBpZiAocGFydGl0aW9uX2V4aXN0cykgeworICAgICAgICBpZiAoTW91bnRTY3JhdGNoKHNjcmF0Y2hfZGV2aWNlKSkgeworICAgICAgICAgICAgY29uc3QgYXV0byB0b3AgPSBrU2NyYXRjaE1vdW50UG9pbnQgKyAiLyJzICsga092ZXJsYXlUb3BEaXI7CisgICAgICAgICAgICBpZiAoYWNjZXNzKHRvcC5jX3N0cigpLCBGX09LKSA9PSAwIHx8IGZzX21ncl9maWxlc3lzdGVtX2hhc19zcGFjZShrU2NyYXRjaE1vdW50UG9pbnQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBkZWNsYXJlIGl0IHVzZWxlc3MsIG5vIG92ZXJyaWRlcyBhbmQgbm8gZnJlZSBzcGFjZQorICAgICAgICAgICAgaWYgKCFmc19tZ3Jfb3ZlcmxheWZzX3Vtb3VudF9zY3JhdGNoKCkpIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gdW5tb3VudCBzY3JhdGNoIHBhcnRpdGlvbiI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFNYWtlU2NyYXRjaEZpbGVzeXN0ZW0oc2NyYXRjaF9kZXZpY2UpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBmb3JtYXQgc2NyYXRjaCBwYXJ0aXRpb24iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIE1vdW50U2NyYXRjaChzY3JhdGNoX2RldmljZSk7Cit9CisKK2NvbnN0ZXhwciBib29sIE92ZXJsYXlmc1RlYXJkb3duQWxsb3dlZCgpIHsKKyAgICAvLyBOZXZlciBhbGxvdyBvbiBub24tZGVidWdnYWJsZSBidWlsZC4KKyAgICByZXR1cm4ga0FsbG93T3ZlcmxheWZzOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworYm9vbCBmc19tZ3Jfb3ZlcmxheWZzX3NldHVwKGNvbnN0IEZzdGFiJiBmc3RhYiwgY29uc3QgY2hhciogbW91bnRfcG9pbnQsIGJvb2wqIHdhbnRfcmVib290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wganVzdF9kaXNhYmxlZF92ZXJpdHkpIHsKKyAgICBpZiAoIU92ZXJsYXlmc1NldHVwQWxsb3dlZCgvKnZlcmJvc2U9Ki90cnVlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFmc19tZ3JfYm9vdF9jb21wbGV0ZWQoKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3Qgc2V0dXAgb3ZlcmxheWZzIGJlZm9yZSBwZXJzaXN0ZW50IHByb3BlcnRpZXMgYXJlIHJlYWR5IjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGF1dG8gY2FuZGlkYXRlcyA9IGZzX21ncl9vdmVybGF5ZnNfY2FuZGlkYXRlX2xpc3QoZnN0YWIpOworICAgIGZvciAoYXV0byBpdCA9IGNhbmRpZGF0ZXMuYmVnaW4oKTsgaXQgIT0gY2FuZGlkYXRlcy5lbmQoKTspIHsKKyAgICAgICAgaWYgKG1vdW50X3BvaW50ICYmCisgICAgICAgICAgICAoZnNfbWdyX21vdW50X3BvaW50KGl0LT5tb3VudF9wb2ludCkgIT0gZnNfbWdyX21vdW50X3BvaW50KG1vdW50X3BvaW50KSkpIHsKKyAgICAgICAgICAgIGl0ID0gY2FuZGlkYXRlcy5lcmFzZShpdCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGF1dG8gdmVyaXR5X2VuYWJsZWQgPSAhanVzdF9kaXNhYmxlZF92ZXJpdHkgJiYgZnNfbWdyX2lzX3Zlcml0eV9lbmFibGVkKCppdCk7CisgICAgICAgIGlmICh2ZXJpdHlfZW5hYmxlZCkgeworICAgICAgICAgICAgaXQgPSBjYW5kaWRhdGVzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgICsraXQ7CisgICAgfQorCisgICAgaWYgKGNhbmRpZGF0ZXMuZW1wdHkoKSkgeworICAgICAgICBpZiAobW91bnRfcG9pbnQpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk5vIG92ZXJsYXlmcyBjYW5kaWRhdGUgd2FzIGZvdW5kIGZvciAiIDw8IG1vdW50X3BvaW50OworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGRpcjsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIG92ZXJsYXlfbW91bnRfcG9pbnQgOiBPdmVybGF5TW91bnRQb2ludHMoKSkgeworICAgICAgICBpZiAob3ZlcmxheV9tb3VudF9wb2ludCA9PSBrU2NyYXRjaE1vdW50UG9pbnQpIHsKKyAgICAgICAgICAgIGlmICghZnNfbWdyX292ZXJsYXlmc19zZXR1cF9zY3JhdGNoKGZzdGFiKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFmc19tZ3Jfb3ZlcmxheWZzX2FscmVhZHlfbW91bnRlZChvdmVybGF5X21vdW50X3BvaW50LCBmYWxzZSAvKiBvdmVybGF5ICovKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRpciA9IG92ZXJsYXlfbW91bnRfcG9pbnQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoZGlyLmVtcHR5KCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IGFsbG9jYXRlIGJhY2tpbmcgc3RvcmFnZSBmb3Igb3ZlcmxheXMiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3QgYXV0byBvdmVybGF5ID0gZnNfbWdyX292ZXJsYXlmc19zZXR1cF9kaXIoZGlyKTsKKyAgICBpZiAob3ZlcmxheS5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIG9rID0gdHJ1ZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogY2FuZGlkYXRlcykgeworICAgICAgICBhdXRvIGZzdGFiX21vdW50X3BvaW50ID0gZnNfbWdyX21vdW50X3BvaW50KGVudHJ5Lm1vdW50X3BvaW50KTsKKyAgICAgICAgb2sgJj0gZnNfbWdyX292ZXJsYXlmc19zZXR1cF9vbmUob3ZlcmxheSwgZnN0YWJfbW91bnRfcG9pbnQsIHdhbnRfcmVib290KTsKKyAgICB9CisgICAgcmV0dXJuIG9rOworfQorCitzdHJ1Y3QgTWFwSW5mbyB7CisgICAgLy8gSWYgc2V0LCBwYXJ0aXRpb24gaXMgb3duZWQgYnkgSW1hZ2VNYW5hZ2VyLgorICAgIHN0ZDo6dW5pcXVlX3B0cjxJSW1hZ2VNYW5hZ2VyPiBpbWFnZXM7CisgICAgLy8gSWYgc2V0LCBhbmQgaW1hZ2VzIGlzIG51bGwsIHRoaXMgaXMgYSBEQVAgcGFydGl0aW9uLgorICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgLy8gSWYgc2V0LCBhbmQgaW1hZ2VzIGFuZCBuYW1lIGFyZSBlbXB0eSwgdGhpcyBpcyBhIG5vbi1keW5hbWljIHBhcnRpdGlvbi4KKyAgICBzdGQ6OnN0cmluZyBkZXZpY2U7CisKKyAgICBNYXBJbmZvKCkgPSBkZWZhdWx0OworICAgIE1hcEluZm8oTWFwSW5mbyYmKSA9IGRlZmF1bHQ7CisgICAgfk1hcEluZm8oKSB7CisgICAgICAgIGlmIChpbWFnZXMpIHsKKyAgICAgICAgICAgIGltYWdlcy0+VW5tYXBJbWFnZURldmljZShuYW1lKTsKKyAgICAgICAgfSBlbHNlIGlmICghbmFtZS5lbXB0eSgpKSB7CisgICAgICAgICAgICBEZXN0cm95TG9naWNhbFBhcnRpdGlvbihuYW1lKTsKKyAgICAgICAgfQorICAgIH0KK307CisKKy8vIE5vdGU6IFRoaXMgZnVuY3Rpb24gbmV2ZXIgcmV0dXJucyB0aGUgRFNVIHNjcmF0Y2ggZGV2aWNlIGluIHJlY292ZXJ5IG9yIGZhc3Rib290ZCwKKy8vIGJlY2F1c2UgdGhlIERTVSBzY3JhdGNoIGlzIGNyZWF0ZWQgaW4gdGhlIGZpcnN0LXN0YWdlLW1vdW50LCB3aGljaCBpcyBub3QgcnVuIGluIHJlY292ZXJ5Lgorc3RhdGljIHN0ZDo6b3B0aW9uYWw8TWFwSW5mbz4gRW5zdXJlU2NyYXRjaE1hcHBlZCgpIHsKKyAgICBNYXBJbmZvIGluZm87CisgICAgaW5mby5kZXZpY2UgPSBHZXRCb290U2NyYXRjaERldmljZSgpOworICAgIGlmICghaW5mby5kZXZpY2UuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4ge3N0ZDo6bW92ZShpbmZvKX07CisgICAgfQorICAgIGlmICghSW5SZWNvdmVyeSgpKSB7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisKKyAgICBhdXRvIHBhcnRpdGlvbl9uYW1lID0gYW5kcm9pZDo6YmFzZTo6QmFzZW5hbWUoa1NjcmF0Y2hNb3VudFBvaW50KTsKKworICAgIC8vIENoZWNrIGZvciBzY3JhdGNoIG9uIC9kYXRhIGZpcnN0LCBiZWZvcmUgbG9va2luZyBmb3IgYSBtb2RpZmllZCBzdXBlcgorICAgIC8vIHBhcnRpdGlvbi4gV2Ugc2hvdWxkIG9ubHkgcmVhY2ggdGhpcyBjb2RlIGluIHJlY292ZXJ5LCBiZWNhdXNlIHNjcmF0Y2gKKyAgICAvLyB3b3VsZCBvdGhlcndpc2UgYWx3YXlzIGJlIG1hcHBlZC4KKyAgICBhdXRvIGltYWdlcyA9IElJbWFnZU1hbmFnZXI6Ok9wZW4oInJlbW91bnQiLCAxMHMpOworICAgIGlmIChpbWFnZXMgJiYgaW1hZ2VzLT5CYWNraW5nSW1hZ2VFeGlzdHMocGFydGl0aW9uX25hbWUpKSB7CisgICAgICAgIGlmIChpbWFnZXMtPklzSW1hZ2VEaXNhYmxlZChwYXJ0aXRpb25fbmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB7fTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWltYWdlcy0+TWFwSW1hZ2VEZXZpY2UocGFydGl0aW9uX25hbWUsIDEwcywgJmluZm8uZGV2aWNlKSkgeworICAgICAgICAgICAgcmV0dXJuIHt9OworICAgICAgICB9CisgICAgICAgIGluZm8ubmFtZSA9IHBhcnRpdGlvbl9uYW1lOworICAgICAgICBpbmZvLmltYWdlcyA9IHN0ZDo6bW92ZShpbWFnZXMpOworICAgICAgICByZXR1cm4ge3N0ZDo6bW92ZShpbmZvKX07CisgICAgfQorCisgICAgLy8gQXZvaWQgdWFydCBzcGFtIGJ5IGZpcnN0IGNoZWNraW5nIGZvciBhIHNjcmF0Y2ggcGFydGl0aW9uLgorICAgIGNvbnN0IGF1dG8gc3VwZXJfZGV2aWNlID0ga1BoeXNpY2FsRGV2aWNlICsgZnNfbWdyX2dldF9zdXBlcl9wYXJ0aXRpb25fbmFtZSgpOworICAgIGF1dG8gbWV0YWRhdGEgPSBSZWFkQ3VycmVudE1ldGFkYXRhKHN1cGVyX2RldmljZSk7CisgICAgaWYgKCFtZXRhZGF0YSkgeworICAgICAgICByZXR1cm4ge307CisgICAgfQorCisgICAgYXV0byBwYXJ0aXRpb24gPSBGaW5kUGFydGl0aW9uKCptZXRhZGF0YS5nZXQoKSwgcGFydGl0aW9uX25hbWUpOworICAgIGlmICghcGFydGl0aW9uKSB7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisKKyAgICBDcmVhdGVMb2dpY2FsUGFydGl0aW9uUGFyYW1zIHBhcmFtcyA9IHsKKyAgICAgICAgICAgIC5ibG9ja19kZXZpY2UgPSBzdXBlcl9kZXZpY2UsCisgICAgICAgICAgICAubWV0YWRhdGEgPSBtZXRhZGF0YS5nZXQoKSwKKyAgICAgICAgICAgIC5wYXJ0aXRpb24gPSBwYXJ0aXRpb24sCisgICAgICAgICAgICAuZm9yY2Vfd3JpdGFibGUgPSB0cnVlLAorICAgICAgICAgICAgLnRpbWVvdXRfbXMgPSAxMHMsCisgICAgfTsKKyAgICBpZiAoIUNyZWF0ZUxvZ2ljYWxQYXJ0aXRpb24ocGFyYW1zLCAmaW5mby5kZXZpY2UpKSB7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisgICAgaW5mby5uYW1lID0gcGFydGl0aW9uX25hbWU7CisgICAgcmV0dXJuIHtzdGQ6Om1vdmUoaW5mbyl9OworfQorCisvLyBUaGlzIHNob3VsZCBvbmx5IGJlIHJlYWNoYWJsZSBpbiByZWNvdmVyeSwgd2hlcmUgRFNVIHNjcmF0Y2ggaXMgbm90CisvLyBhdXRvbWF0aWNhbGx5IG1hcHBlZC4KK3N0YXRpYyBib29sIE1hcERzdVNjcmF0Y2hEZXZpY2Uoc3RkOjpzdHJpbmcqIGRldmljZSkgeworICAgIHN0ZDo6c3RyaW5nIGRzdV9zbG90OworICAgIGlmICghYW5kcm9pZDo6Z3NpOjpJc0dzaUluc3RhbGxlZCgpIHx8ICFhbmRyb2lkOjpnc2k6OkdldEFjdGl2ZURzdSgmZHN1X3Nsb3QpIHx8CisgICAgICAgIGRzdV9zbG90LmVtcHR5KCkpIHsKKyAgICAgICAgLy8gTm90aGluZyB0byBkbyBpZiBubyBEU1UgaW5zdGFsbGF0aW9uIHByZXNlbnQuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBhdXRvIGltYWdlcyA9IElJbWFnZU1hbmFnZXI6Ok9wZW4oImRzdS8iICsgZHN1X3Nsb3QsIDEwcyk7CisgICAgaWYgKCFpbWFnZXMgfHwgIWltYWdlcy0+QmFja2luZ0ltYWdlRXhpc3RzKGFuZHJvaWQ6OmdzaTo6a0RzdVNjcmF0Y2gpKSB7CisgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gaWYgRFNVIHNjcmF0Y2ggZGV2aWNlIGRvZXNuJ3QgZXhpc3QuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbWFnZXMtPlVubWFwSW1hZ2VEZXZpY2UoYW5kcm9pZDo6Z3NpOjprRHN1U2NyYXRjaCk7CisgICAgaWYgKCFpbWFnZXMtPk1hcEltYWdlRGV2aWNlKGFuZHJvaWQ6OmdzaTo6a0RzdVNjcmF0Y2gsIDEwcywgZGV2aWNlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQgVGVhcmRvd25Nb3VudHNBbmRTY3JhdGNoKGNvbnN0IGNoYXIqIG1vdW50X3BvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiB3YW50X3JlYm9vdCkgeworICAgIGJvb2wgc2hvdWxkX2Rlc3Ryb3lfc2NyYXRjaCA9IGZhbHNlOworICAgIGF1dG8gcnYgPSBPdmVybGF5ZnNUZWFyZG93blJlc3VsdDo6T2s7CisgICAgZm9yIChjb25zdCBhdXRvJiBvdmVybGF5X21vdW50X3BvaW50IDogT3ZlcmxheU1vdW50UG9pbnRzKCkpIHsKKyAgICAgICAgYXV0byBvayA9IGZzX21ncl9vdmVybGF5ZnNfdGVhcmRvd25fb25lKAorICAgICAgICAgICAgICAgIG92ZXJsYXlfbW91bnRfcG9pbnQsIG1vdW50X3BvaW50ID8gZnNfbWdyX21vdW50X3BvaW50KG1vdW50X3BvaW50KSA6ICIiLAorICAgICAgICAgICAgICAgIHdhbnRfcmVib290LAorICAgICAgICAgICAgICAgIG92ZXJsYXlfbW91bnRfcG9pbnQgPT0ga1NjcmF0Y2hNb3VudFBvaW50ID8gJnNob3VsZF9kZXN0cm95X3NjcmF0Y2ggOiBudWxscHRyKTsKKyAgICAgICAgaWYgKCFvaykgeworICAgICAgICAgICAgcnYgPSBPdmVybGF5ZnNUZWFyZG93blJlc3VsdDo6RXJyb3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBEbyBub3QgYXR0ZW1wdCB0byBkZXN0cm95IERTVSBzY3JhdGNoIGlmIHdpdGhpbiBhIERTVSBzeXN0ZW0sCisgICAgLy8gYmVjYXVzZSBEU1Ugc2NyYXRjaCBwYXJ0aXRpb24gaXMgbWFuYWdlZCBieSBnc2lkLgorICAgIGlmIChzaG91bGRfZGVzdHJveV9zY3JhdGNoICYmICFmc19tZ3JfaXNfZHN1X3J1bm5pbmcoKSkgeworICAgICAgICBhdXRvIHJ2ID0gZnNfbWdyX292ZXJsYXlmc190ZWFyZG93bl9zY3JhdGNoKGtTY3JhdGNoTW91bnRQb2ludCwgd2FudF9yZWJvb3QpOworICAgICAgICBpZiAocnYgIT0gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6Ok9rKSB7CisgICAgICAgICAgICByZXR1cm4gcnY7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gQW5kIG5vdyB0aGF0IHdlIGRpZCB3aGF0IHdlIGNvdWxkLCBsZXRzIGluZm9ybQorICAgIC8vIGNhbGxlciB0aGF0IHRoZXJlIG1heSBzdGlsbCBiZSBtb3JlIHRvIGRvLgorICAgIGlmICghZnNfbWdyX2Jvb3RfY29tcGxldGVkKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IHRlYXJkb3duIG92ZXJsYXlmcyBiZWZvcmUgcGVyc2lzdGVudCBwcm9wZXJ0aWVzIGFyZSByZWFkeSI7CisgICAgICAgIHJldHVybiBPdmVybGF5ZnNUZWFyZG93blJlc3VsdDo6RXJyb3I7CisgICAgfQorICAgIHJldHVybiBydjsKK30KKworLy8gUmV0dXJucyBmYWxzZSBpZiB0ZWFyZG93biBub3QgcGVybWl0dGVkLiBJZiBzb21ldGhpbmcgaXMgYWx0ZXJlZCwgc2V0ICp3YW50X3JlYm9vdC4KK092ZXJsYXlmc1RlYXJkb3duUmVzdWx0IGZzX21ncl9vdmVybGF5ZnNfdGVhcmRvd24oY29uc3QgY2hhciogbW91bnRfcG9pbnQsIGJvb2wqIHdhbnRfcmVib290KSB7CisgICAgaWYgKCFPdmVybGF5ZnNUZWFyZG93bkFsbG93ZWQoKSkgeworICAgICAgICAvLyBOb3RoaW5nIHRvIHRlYXJkb3duLgorICAgICAgICByZXR1cm4gT3ZlcmxheWZzVGVhcmRvd25SZXN1bHQ6Ok9rOworICAgIH0KKyAgICAvLyBJZiBzY3JhdGNoIGV4aXN0cywgYnV0IGlzIG5vdCBtb3VudGVkLCBsZXRzIGdhaW4gYWNjZXNzIHRvIGNsZWFuCisgICAgLy8gc3BlY2lmaWMgb3ZlcnJpZGUgZW50cmllcy4KKyAgICBhdXRvIG1vdW50X3NjcmF0Y2ggPSBmYWxzZTsKKyAgICBpZiAoKG1vdW50X3BvaW50ICE9IG51bGxwdHIpICYmICFmc19tZ3Jfb3ZlcmxheWZzX2FscmVhZHlfbW91bnRlZChrU2NyYXRjaE1vdW50UG9pbnQsIGZhbHNlKSkgeworICAgICAgICBzdGQ6OnN0cmluZyBzY3JhdGNoX2RldmljZSA9IEdldEJvb3RTY3JhdGNoRGV2aWNlKCk7CisgICAgICAgIGlmICghc2NyYXRjaF9kZXZpY2UuZW1wdHkoKSkgeworICAgICAgICAgICAgbW91bnRfc2NyYXRjaCA9IE1vdW50U2NyYXRjaChzY3JhdGNoX2RldmljZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdXRvIHJ2ID0gVGVhcmRvd25Nb3VudHNBbmRTY3JhdGNoKG1vdW50X3BvaW50LCB3YW50X3JlYm9vdCk7CisKKyAgICBpZiAobW91bnRfc2NyYXRjaCkgeworICAgICAgICBpZiAoIWZzX21ncl9vdmVybGF5ZnNfdW1vdW50X3NjcmF0Y2goKSkgeworICAgICAgICAgICAgcmV0dXJuIE92ZXJsYXlmc1RlYXJkb3duUmVzdWx0OjpCdXN5OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBydjsKK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZzX21nciB7CisKK3ZvaWQgTWFwU2NyYXRjaFBhcnRpdGlvbklmTmVlZGVkKEZzdGFiKiBmc3RhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mKT4mIGluaXQpIHsKKyAgICBpZiAoIU92ZXJsYXlmc1NldHVwQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKEdldEVudHJ5Rm9yTW91bnRQb2ludChmc3RhYiwga1NjcmF0Y2hNb3VudFBvaW50KSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIUdldE92ZXJsYXlzQWN0aXZlRmxhZygpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKFNjcmF0Y2hJc09uRGF0YSgpKSB7CisgICAgICAgIGlmIChhdXRvIGltYWdlcyA9IElJbWFnZU1hbmFnZXI6Ok9wZW4oInJlbW91bnQiLCAwbXMpKSB7CisgICAgICAgICAgICBpbWFnZXMtPk1hcEFsbEltYWdlcyhpbml0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFBoeXNpY2FsIG9yIGxvZ2ljYWwgcGFydGl0aW9ucyB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIG1hcHBlZCBoZXJlLAorICAgIC8vIHNvIGp1c3QgZW5zdXJlIC9kZXYvYmxvY2sgc3ltbGlua3MgZXhpc3QuCisgICAgYXV0byBkZXZpY2UgPSBHZXRCb290U2NyYXRjaERldmljZSgpOworICAgIGlmICghZGV2aWNlLmVtcHR5KCkpIHsKKyAgICAgICAgaW5pdCh7YW5kcm9pZDo6YmFzZTo6QmFzZW5hbWUoZGV2aWNlKX0pOworICAgIH0KK30KKwordm9pZCBDbGVhbnVwT2xkU2NyYXRjaEZpbGVzKCkgeworICAgIGlmICghT3ZlcmxheWZzVGVhcmRvd25BbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIVNjcmF0Y2hJc09uRGF0YSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGF1dG8gaW1hZ2VzID0gSUltYWdlTWFuYWdlcjo6T3BlbigicmVtb3VudCIsIDBtcykpIHsKKyAgICAgICAgaW1hZ2VzLT5SZW1vdmVEaXNhYmxlZEltYWdlcygpOworICAgICAgICBpZiAoIUdldE92ZXJsYXlzQWN0aXZlRmxhZygpKSB7CisgICAgICAgICAgICBmc19tZ3Jfb3ZlcmxheWZzX3RlYXJkb3duX3NjcmF0Y2goa1NjcmF0Y2hNb3VudFBvaW50LCBudWxscHRyKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gVGhpcyByZXR1cm5zIHRoZSBzY3JhdGNoIGRldmljZSB0aGF0IHdhcyBkZXRlY3RlZCBkdXJpbmcgZWFybHkgYm9vdCAoZmlyc3QtCisvLyBzdGFnZSBpbml0KS4gSWYgdGhlIGRldmljZSB3YXMgY3JlYXRlZCBsYXRlciwgZm9yIGV4YW1wbGUgZHVyaW5nIHNldHVwIGZvcgorLy8gdGhlIGFkYiByZW1vdW50IGNvbW1hbmQsIGl0IGNhbiByZXR1cm4gYW4gZW1wdHkgc3RyaW5nIHNpbmNlIGl0IGRvZXMgbm90CisvLyBxdWVyeSBJbWFnZU1hbmFnZXIuIChOb3RlIHRoYXQgSW1hZ2VNYW5hZ2VyIGluIGZpcnN0LXN0YWdlIGluaXQgd2lsbCBhbHdheXMKKy8vIHVzZSBkZXZpY2UtbWFwcGVyLCBzaW5jZSAvZGF0YSBpcyBub3QgYXZhaWxhYmxlIHRvIHVzZSBsb29wIGRldmljZXMuKQorc3RkOjpzdHJpbmcgR2V0Qm9vdFNjcmF0Y2hEZXZpY2UoKSB7CisgICAgLy8gTm90ZTogZnNfbWdyX2lzX2RzdV9ydW5uaW5nKCkgYWx3YXlzIHJldHVybnMgZmFsc2UgaW4gcmVjb3Zlcnkgb3IgZmFzdGJvb3RkLgorICAgIGlmIChmc19tZ3JfaXNfZHN1X3J1bm5pbmcoKSkgeworICAgICAgICByZXR1cm4gR2V0RHN1U2NyYXRjaERldmljZSgpOworICAgIH0KKworICAgIGF1dG8mIGRtID0gRGV2aWNlTWFwcGVyOjpJbnN0YW5jZSgpOworCisgICAgLy8gSWYgdGhlcmUgaXMgYSBzY3JhdGNoIHBhcnRpdGlvbiBhbGxvY2F0ZWQgaW4gL2RhdGEgb3Igb24gc3VwZXIsIHdlCisgICAgLy8gYXV0b21hdGljYWxseSBwcmlvcml0aXplIHRoYXQgb3ZlciBzdXBlcl9vdGhlciBvciBzeXN0ZW1fb3RoZXIuCisgICAgLy8gU29tZSBkZXZpY2VzLCBmb3IgZXhhbXBsZSwgaGF2ZSBhIHdyaXRlLXByb3RlY3RlZCBlTU1DIGFuZCB0aGUKKyAgICAvLyBzdXBlciBwYXJ0aXRpb24gY2Fubm90IGJlIHVzZWQgZXZlbiBpZiBpdCBleGlzdHMuCisgICAgc3RkOjpzdHJpbmcgZGV2aWNlOworICAgIGF1dG8gcGFydGl0aW9uX25hbWUgPSBhbmRyb2lkOjpiYXNlOjpCYXNlbmFtZShrU2NyYXRjaE1vdW50UG9pbnQpOworICAgIGlmIChkbS5HZXRTdGF0ZShwYXJ0aXRpb25fbmFtZSkgIT0gRG1EZXZpY2VTdGF0ZTo6SU5WQUxJRCAmJgorICAgICAgICBkbS5HZXREbURldmljZVBhdGhCeU5hbWUocGFydGl0aW9uX25hbWUsICZkZXZpY2UpKSB7CisgICAgICAgIHJldHVybiBkZXZpY2U7CisgICAgfQorCisgICAgcmV0dXJuICIiOworfQorCit2b2lkIFRlYXJkb3duQWxsT3ZlcmxheUZvck1vdW50UG9pbnQoY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50X3BvaW50KSB7CisgICAgaWYgKCFPdmVybGF5ZnNUZWFyZG93bkFsbG93ZWQoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghSW5SZWNvdmVyeSgpKSB7CisgICAgICAgIExFUlJPUiA8PCBfX0ZVTkNUSU9OX18gPDwgIigpOiBtdXN0IGJlIGNhbGxlZCB3aXRoaW4gcmVjb3ZlcnkuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEVtcHR5IHN0cmluZyBtZWFucyB0ZWFyZG93biBldmVyeXRoaW5nLgorICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHRlYXJkb3duX2RpciA9IG1vdW50X3BvaW50LmVtcHR5KCkgPyAiIiA6IGZzX21ncl9tb3VudF9wb2ludChtb3VudF9wb2ludCk7CisgICAgY29uc3RleHByIGJvb2wqIGlnbm9yZV9jaGFuZ2UgPSBudWxscHRyOworCisgICAgLy8gVGVhcmRvd24gbGVnYWN5IG92ZXJsYXkgbW91bnQgcG9pbnRzIHRoYXQncyBub3QgYmFja2VkIGJ5IGEgc2NyYXRjaCBkZXZpY2UuCisgICAgZm9yIChjb25zdCBhdXRvJiBvdmVybGF5X21vdW50X3BvaW50IDogT3ZlcmxheU1vdW50UG9pbnRzKCkpIHsKKyAgICAgICAgaWYgKG92ZXJsYXlfbW91bnRfcG9pbnQgPT0ga1NjcmF0Y2hNb3VudFBvaW50KSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBmc19tZ3Jfb3ZlcmxheWZzX3RlYXJkb3duX29uZShvdmVybGF5X21vdW50X3BvaW50LCB0ZWFyZG93bl9kaXIsIGlnbm9yZV9jaGFuZ2UpOworICAgIH0KKworICAgIGlmIChtb3VudF9wb2ludC5lbXB0eSgpKSB7CisgICAgICAgIC8vIFRocm93IGF3YXkgdGhlIGVudGlyZSBwYXJ0aXRpb24uCisgICAgICAgIGF1dG8gcGFydGl0aW9uX25hbWUgPSBhbmRyb2lkOjpiYXNlOjpCYXNlbmFtZShrU2NyYXRjaE1vdW50UG9pbnQpOworICAgICAgICBhdXRvIGltYWdlcyA9IElJbWFnZU1hbmFnZXI6Ok9wZW4oInJlbW91bnQiLCAxMHMpOworICAgICAgICBpZiAoaW1hZ2VzICYmIGltYWdlcy0+QmFja2luZ0ltYWdlRXhpc3RzKHBhcnRpdGlvbl9uYW1lKSkgeworICAgICAgICAgICAgaWYgKGltYWdlcy0+RGlzYWJsZUltYWdlKHBhcnRpdGlvbl9uYW1lKSkgeworICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiRGlzYWJsZWQgc2NyYXRjaCBwYXJ0aXRpb24gZm9yOiAiIDw8IGtTY3JhdGNoTW91bnRQb2ludDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIGRpc2FibGUgc2NyYXRjaCBwYXJ0aXRpb24gZm9yICIgPDwga1NjcmF0Y2hNb3VudFBvaW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gTm90ZSBpZiB3ZSBqdXN0IGRpc2FibGVkIHNjcmF0Y2gsIHRoaXMgbW91bnQgd2lsbCBmYWlsLgorICAgIGlmIChhdXRvIGluZm8gPSBFbnN1cmVTY3JhdGNoTWFwcGVkKCk7IGluZm8uaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgLy8gTWFwIHNjcmF0Y2ggZGV2aWNlLCBtb3VudCBrU2NyYXRjaE1vdW50UG9pbnQgYW5kIHRlYXJkb3duIGtTY3JhdGNoTW91bnRQb2ludC4KKyAgICAgICAgZnNfbWdyX292ZXJsYXlmc191bW91bnRfc2NyYXRjaCgpOworICAgICAgICBpZiAoTW91bnRTY3JhdGNoKGluZm8tPmRldmljZSkpIHsKKyAgICAgICAgICAgIGJvb2wgc2hvdWxkX2Rlc3Ryb3lfc2NyYXRjaCA9IGZhbHNlOworICAgICAgICAgICAgZnNfbWdyX292ZXJsYXlmc190ZWFyZG93bl9vbmUoa1NjcmF0Y2hNb3VudFBvaW50LCB0ZWFyZG93bl9kaXIsIGlnbm9yZV9jaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2hvdWxkX2Rlc3Ryb3lfc2NyYXRjaCk7CisgICAgICAgICAgICBmc19tZ3Jfb3ZlcmxheWZzX3Vtb3VudF9zY3JhdGNoKCk7CisgICAgICAgICAgICBpZiAoc2hvdWxkX2Rlc3Ryb3lfc2NyYXRjaCkgeworICAgICAgICAgICAgICAgIGZzX21ncl9vdmVybGF5ZnNfdGVhcmRvd25fc2NyYXRjaChrU2NyYXRjaE1vdW50UG9pbnQsIG51bGxwdHIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGVhcmRvd24gRFNVIG92ZXJsYXkgaWYgcHJlc2VudC4KKyAgICBzdGQ6OnN0cmluZyBzY3JhdGNoX2RldmljZTsKKyAgICBpZiAoTWFwRHN1U2NyYXRjaERldmljZSgmc2NyYXRjaF9kZXZpY2UpKSB7CisgICAgICAgIGZzX21ncl9vdmVybGF5ZnNfdW1vdW50X3NjcmF0Y2goKTsKKyAgICAgICAgaWYgKE1vdW50U2NyYXRjaChzY3JhdGNoX2RldmljZSkpIHsKKyAgICAgICAgICAgIGZzX21ncl9vdmVybGF5ZnNfdGVhcmRvd25fb25lKGtTY3JhdGNoTW91bnRQb2ludCwgdGVhcmRvd25fZGlyLCBpZ25vcmVfY2hhbmdlKTsKKyAgICAgICAgICAgIGZzX21ncl9vdmVybGF5ZnNfdW1vdW50X3NjcmF0Y2goKTsKKyAgICAgICAgfQorICAgICAgICBEZXN0cm95TG9naWNhbFBhcnRpdGlvbihhbmRyb2lkOjpnc2k6OmtEc3VTY3JhdGNoKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBmc19tZ3IKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvZnNfbWdyX292ZXJsYXlmc19jb250cm9sLmggYi9mc19tZ3IvZnNfbWdyX292ZXJsYXlmc19jb250cm9sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUxNmM0NgotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9mc19tZ3Jfb3ZlcmxheWZzX2NvbnRyb2wuaApAQCAtMCwwICsxLDQ0IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxmc3RhYi9mc3RhYi5oPgorCisvLyBJZiAibW91bnRfcG9pbnQiIGlzIG5vbi1udWxsLCBzZXQgdXAgZXhhY3RseSBvbmUgb3ZlcmxheS4KKy8vCisvLyBJZiAibW91bnRfcG9pbnQiIGlzIG51bGwsIHNldHVwIGFueSBvdmVybGF5cy4KKy8vCisvLyBJZiB8d2FudF9yZWJvb3R8IGlzIG5vbi1udWxsLCBhbmQgYSByZWJvb3QgaXMgbmVlZGVkIHRvIGFwcGx5IG92ZXJsYXlzLCB0aGVuCisvLyBpdCB3aWxsIGJlIHRydWUgb24gcmV0dXJuLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBpbml0aWFsaXppbmcgaXQuCitib29sIGZzX21ncl9vdmVybGF5ZnNfc2V0dXAoY29uc3QgYW5kcm9pZDo6ZnNfbWdyOjpGc3RhYiYgZnN0YWIsIGNvbnN0IGNoYXIqIG1vdW50X3BvaW50ID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiB3YW50X3JlYm9vdCA9IG51bGxwdHIsIGJvb2wganVzdF9kaXNhYmxlZF92ZXJpdHkgPSB0cnVlKTsKKworZW51bSBjbGFzcyBPdmVybGF5ZnNUZWFyZG93blJlc3VsdCB7CisgICAgT2ssCisgICAgQnVzeSwgIC8vIEluZGljYXRlcyB0aGF0IG92ZXJsYXlzIGFyZSBzdGlsbCBpbiB1c2UuCisgICAgRXJyb3IKK307CitPdmVybGF5ZnNUZWFyZG93blJlc3VsdCBmc19tZ3Jfb3ZlcmxheWZzX3RlYXJkb3duKGNvbnN0IGNoYXIqIG1vdW50X3BvaW50ID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogd2FudF9yZWJvb3QgPSBudWxscHRyKTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZzX21nciB7CisKK3ZvaWQgQ2xlYW51cE9sZFNjcmF0Y2hGaWxlcygpOworCitzdGQ6OnN0cmluZyBHZXRCb290U2NyYXRjaERldmljZSgpOworCit9ICAvLyBuYW1lc3BhY2UgZnNfbWdyCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2ZzX21ncl9vdmVybGF5ZnNfbW91bnQuY3BwIGIvZnNfbWdyL2ZzX21ncl9vdmVybGF5ZnNfbW91bnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2M2I5ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvZnNfbWdyX292ZXJsYXlmc19tb3VudC5jcHAKQEAgLTAsMCArMSw4MzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8c2VsaW51eC9zZWxpbnV4Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdHZmcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy92ZnMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Njb3BlZ3VhcmQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KKyNpbmNsdWRlIDxleHQ0X3V0aWxzL2V4dDRfdXRpbHMuaD4KKyNpbmNsdWRlIDxmc19tZ3IuaD4KKyNpbmNsdWRlIDxmc19tZ3IvZmlsZV93YWl0Lmg+CisjaW5jbHVkZSA8ZnNfbWdyX292ZXJsYXlmcy5oPgorI2luY2x1ZGUgPGZzdGFiL2ZzdGFiLmg+CisjaW5jbHVkZSA8bGliZ3NpL2xpYmdzaS5oPgorI2luY2x1ZGUgPHN0b3JhZ2VfbGl0ZXJhbHMvc3RvcmFnZV9saXRlcmFscy5oPgorCisjaW5jbHVkZSAiZnNfbWdyX292ZXJsYXlmc19jb250cm9sLmgiCisjaW5jbHVkZSAiZnNfbWdyX292ZXJsYXlmc19tb3VudC5oIgorI2luY2x1ZGUgImZzX21ncl9wcml2LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ6OmxpdGVyYWxzOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmZzX21ncjsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpzdG9yYWdlX2xpdGVyYWxzOworCitjb25zdGV4cHIgY2hhciBrUHJlZmVyQ2FjaGVCYWNraW5nU3RvcmFnZVByb3BbXSA9ICJmc19tZ3Iub3ZlcmxheWZzLnByZWZlcl9jYWNoZV9iYWNraW5nX3N0b3JhZ2UiOworCitjb25zdGV4cHIgY2hhciBrQ2FjaGVNb3VudFBvaW50W10gPSAiL2NhY2hlIjsKK2NvbnN0ZXhwciBjaGFyIGtQaHlzaWNhbERldmljZVtdID0gIi9kZXYvYmxvY2svYnktbmFtZS8iOworCisvLyBNb3VudCB0cmVlIHRvIHRlbXBvcmFyaWx5IGhvbGQgcmVmZXJlbmNlcyB0byBzdWJtb3VudHMuCitjb25zdGV4cHIgY2hhciBrTW92ZU1vdW50VGVtcERpcltdID0gIi9kZXYvcmVtb3VudCI7CisKK2NvbnN0ZXhwciBjaGFyIGtMb3dlcmRpck9wdGlvbltdID0gImxvd2VyZGlyPSI7Citjb25zdGV4cHIgY2hhciBrVXBwZXJkaXJPcHRpb25bXSA9ICJ1cHBlcmRpcj0iOworY29uc3RleHByIGNoYXIga1dvcmtkaXJPcHRpb25bXSA9ICJ3b3JrZGlyPSI7CisKK2Jvb2wgZnNfbWdyX2lzX2RzdV9ydW5uaW5nKCkgeworICAgIC8vIFNpbmNlIGFuZHJvaWQ6OmdzaTo6Q2FuQm9vdEludG9Hc2koKSBvciBhbmRyb2lkOjpnc2k6Ok1hcmtTeXN0ZW1Bc0dzaSgpIGlzCisgICAgLy8gbmV2ZXIgY2FsbGVkIGluIHJlY292ZXJ5LCB0aGUgcmV0dXJuIHZhbHVlIG9mIGFuZHJvaWQ6OmdzaTo6SXNHc2lSdW5uaW5nKCkKKyAgICAvLyBpcyBub3Qgd2VsbC1kZWZpbmVkLiBJbiB0aGlzIGNhc2UsIGp1c3QgcmV0dXJuIGZhbHNlIGFzIGJlaW5nIGluIHJlY292ZXJ5CisgICAgLy8gaW1wbGllcyBub3QgcnVubmluZyBhIERTVSBzeXN0ZW0uCisgICAgaWYgKEluUmVjb3ZlcnkoKSkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBhbmRyb2lkOjpnc2k6OklzR3NpUnVubmluZygpOworfQorCitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gT3ZlcmxheU1vdW50UG9pbnRzKCkgeworICAgIC8vIE5ldmVyIGZhbGxiYWNrIHRvIGxlZ2FjeSBjYWNoZSBtb3VudCBwb2ludCBpZiB3aXRoaW4gYSBEU1Ugc3lzdGVtLAorICAgIC8vIGJlY2F1c2UgcnVubmluZyBhIERTVSBzeXN0ZW0gaW1wbGllcyB0aGUgZGV2aWNlIHN1cHBvcnRzIGR5bmFtaWMKKyAgICAvLyBwYXJ0aXRpb25zLCB3aGljaCBtZWFucyBsZWdhY3kgY2FjaGUgbXVzdG4ndCBiZSB1c2VkLgorICAgIGlmIChmc19tZ3JfaXNfZHN1X3J1bm5pbmcoKSkgeworICAgICAgICByZXR1cm4ge2tTY3JhdGNoTW91bnRQb2ludH07CisgICAgfQorCisgICAgLy8gRm9yIG5vbi1BL0IgZGV2aWNlcyBwcmVmZXIgY2FjaGUgYmFja2luZyBzdG9yYWdlIGlmCisgICAgLy8ga1ByZWZlckNhY2hlQmFja2luZ1N0b3JhZ2VQcm9wIHByb3BlcnR5IHNldC4KKyAgICBpZiAoZnNfbWdyX2dldF9zbG90X3N1ZmZpeCgpLmVtcHR5KCkgJiYKKyAgICAgICAgYW5kcm9pZDo6YmFzZTo6R2V0Qm9vbFByb3BlcnR5KGtQcmVmZXJDYWNoZUJhY2tpbmdTdG9yYWdlUHJvcCwgZmFsc2UpICYmCisgICAgICAgIGFuZHJvaWQ6OmJhc2U6OkdldEludFByb3BlcnR5KCJyby52ZW5kb3IuYXBpX2xldmVsIiwgLTEpIDwgX19BTkRST0lEX0FQSV9UX18pIHsKKyAgICAgICAgcmV0dXJuIHtrQ2FjaGVNb3VudFBvaW50LCBrU2NyYXRjaE1vdW50UG9pbnR9OworICAgIH0KKworICAgIHJldHVybiB7a1NjcmF0Y2hNb3VudFBvaW50LCBrQ2FjaGVNb3VudFBvaW50fTsKK30KKworc3RkOjpzdHJpbmcgR2V0RW5jb2RlZEJhc2VEaXJGb3JNb3VudFBvaW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBtb3VudF9wb2ludCkgeworICAgIHN0ZDo6c3RyaW5nIG5vcm1hbGl6ZWRfcGF0aDsKKyAgICBpZiAobW91bnRfcG9pbnQuZW1wdHkoKSB8fCAhYW5kcm9pZDo6YmFzZTo6UmVhbHBhdGgobW91bnRfcG9pbnQsICZub3JtYWxpemVkX3BhdGgpKSB7CisgICAgICAgIHJldHVybiAiIjsKKyAgICB9CisgICAgc3RkOjpzdHJpbmdfdmlldyBzdihub3JtYWxpemVkX3BhdGgpOworICAgIGlmIChzdiAhPSAiLyIpIHsKKyAgICAgICAgYW5kcm9pZDo6YmFzZTo6Q29uc3VtZVByZWZpeCgmc3YsICIvIik7CisgICAgICAgIGFuZHJvaWQ6OmJhc2U6OkNvbnN1bWVTdWZmaXgoJnN2LCAiLyIpOworICAgIH0KKyAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6U3RyaW5nUmVwbGFjZShzdiwgIi8iLCAiQCIsIHRydWUpOworfQorCitzdGF0aWMgYm9vbCBmc19tZ3JfaXNfZGlyKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7CisgICAgc3RydWN0IHN0YXQgc3Q7CisgICAgcmV0dXJuICFzdGF0KHBhdGguY19zdHIoKSwgJnN0KSAmJiBTX0lTRElSKHN0LnN0X21vZGUpOworfQorCisvLyBBdCBsZXNzIHRoYW4gMSUgb3IgOE1CIG9mIGZyZWUgc3BhY2UgcmV0dXJuIHZhbHVlIG9mIGZhbHNlLAorLy8gbWVhbnMgd2Ugd2lsbCB0cnkgdG8gd3JhcCB3aXRoIG92ZXJsYXlmcy4KK2Jvb2wgZnNfbWdyX2ZpbGVzeXN0ZW1faGFzX3NwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBtb3VudF9wb2ludCkgeworICAgIC8vIElmIHdlIGhhdmUgYWNjZXNzIGlzc3VlcyB0byBmaW5kIG91dCBzcGFjZSByZW1haW5pbmcsIHJldHVybiB0cnVlCisgICAgLy8gdG8gcHJldmVudCB1cyB0cnlpbmcgdG8gb3ZlcnJpZGUgd2l0aCBvdmVybGF5ZnMuCisgICAgc3RydWN0IHN0YXR2ZnMgdnN0OworICAgIGlmIChzdGF0dmZzKG1vdW50X3BvaW50LmNfc3RyKCksICZ2c3QpKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJzdGF0dmZzICIgPDwgbW91bnRfcG9pbnQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtQZXJjZW50VGhyZXNob2xkID0gMTsgICAgICAgICAgICAgICAgICAgICAgIC8vIDElCisgICAgc3RhdGljIGNvbnN0ZXhwciB1bnNpZ25lZCBsb25nIGtTaXplVGhyZXNob2xkID0gOCAqIDEwMjQgKiAxMDI0OyAgLy8gOE1CCisKKyAgICByZXR1cm4gKHZzdC5mX2JmcmVlID49ICh2c3QuZl9ibG9ja3MgKiBrUGVyY2VudFRocmVzaG9sZCAvIDEwMCkpICYmCisgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50NjRfdD4odnN0LmZfYmZyZWUpICogdnN0LmZfZnJzaXplKSA+PSBrU2l6ZVRocmVzaG9sZDsKK30KKworc3RhdGljIGJvb2wgZnNfbWdyX3VwZGF0ZV9ibGtfZGV2aWNlKEZzdGFiRW50cnkqIGVudHJ5KSB7CisgICAgaWYgKGVudHJ5LT5mc19tZ3JfZmxhZ3MubG9naWNhbCkgeworICAgICAgICBmc19tZ3JfdXBkYXRlX2xvZ2ljYWxfcGFydGl0aW9uKGVudHJ5KTsKKyAgICB9CisgICAgaWYgKGFjY2VzcyhlbnRyeS0+YmxrX2RldmljZS5jX3N0cigpLCBGX09LKSA9PSAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoZW50cnktPmJsa19kZXZpY2UgIT0gIi9kZXYvcm9vdCIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIHNwZWNpYWwgY2FzZSBmb3Igc3lzdGVtLWFzLXJvb3QgKHRhaW1lbiBhbmQgb3RoZXJzKQorICAgIGF1dG8gYmxrX2RldmljZSA9IGtQaHlzaWNhbERldmljZSArICJzeXN0ZW0iczsKKyAgICBpZiAoYWNjZXNzKGJsa19kZXZpY2UuY19zdHIoKSwgRl9PSykpIHsKKyAgICAgICAgYmxrX2RldmljZSArPSBmc19tZ3JfZ2V0X3Nsb3Rfc3VmZml4KCk7CisgICAgICAgIGlmIChhY2Nlc3MoYmxrX2RldmljZS5jX3N0cigpLCBGX09LKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIGVudHJ5LT5ibGtfZGV2aWNlID0gYmxrX2RldmljZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgZnNfbWdyX2hhc19zaGFyZWRfYmxvY2tzKGNvbnN0IHN0ZDo6c3RyaW5nJiBtb3VudF9wb2ludCwgY29uc3Qgc3RkOjpzdHJpbmcmIGRldikgeworICAgIHN0cnVjdCBzdGF0ZnMgZnM7CisgICAgaWYgKChzdGF0ZnMoKG1vdW50X3BvaW50ICsgIi9sb3N0K2ZvdW5kIikuY19zdHIoKSwgJmZzKSA9PSAtMSkgfHwKKyAgICAgICAgKGZzLmZfdHlwZSAhPSBFWFQ0X1NVUEVSX01BR0lDKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGZkKG9wZW4oZGV2LmNfc3RyKCksIE9fUkRPTkxZIHwgT19DTE9FWEVDKSk7CisgICAgaWYgKGZkIDwgMCkgcmV0dXJuIGZhbHNlOworCisgICAgc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgc2I7CisgICAgaWYgKChURU1QX0ZBSUxVUkVfUkVUUlkobHNlZWs2NChmZCwgMTAyNCwgU0VFS19TRVQpKSA8IDApIHx8CisgICAgICAgIChURU1QX0ZBSUxVUkVfUkVUUlkocmVhZChmZCwgJnNiLCBzaXplb2Yoc2IpKSkgPCAwKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RydWN0IGZzX2luZm8gaW5mbzsKKyAgICBpZiAoZXh0NF9wYXJzZV9zYigmc2IsICZpbmZvKSA8IDApIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiAoaW5mby5mZWF0X3JvX2NvbXBhdCAmIEVYVDRfRkVBVFVSRV9ST19DT01QQVRfU0hBUkVEX0JMT0NLUykgIT0gMDsKK30KKworI2RlZmluZSBGMkZTX1NVUEVSX09GRlNFVCAxMDI0CisjZGVmaW5lIEYyRlNfRkVBVFVSRV9PRkZTRVQgMjE4MAorI2RlZmluZSBGMkZTX0ZFQVRVUkVfUk8gMHg0MDAwCitzdGF0aWMgYm9vbCBmc19tZ3JfaXNfcmVhZF9vbmx5X2YyZnMoY29uc3Qgc3RkOjpzdHJpbmcmIGRldikgeworICAgIGlmICghZnNfbWdyX2lzX2YyZnMoZGV2KSkgcmV0dXJuIGZhbHNlOworCisgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGZkKG9wZW4oZGV2LmNfc3RyKCksIE9fUkRPTkxZIHwgT19DTE9FWEVDKSk7CisgICAgaWYgKGZkIDwgMCkgcmV0dXJuIGZhbHNlOworCisgICAgX19sZTMyIGZlYXQ7CisgICAgaWYgKChURU1QX0ZBSUxVUkVfUkVUUlkobHNlZWs2NChmZCwgRjJGU19TVVBFUl9PRkZTRVQgKyBGMkZTX0ZFQVRVUkVfT0ZGU0VULCBTRUVLX1NFVCkpIDwgMCkgfHwKKyAgICAgICAgKFRFTVBfRkFJTFVSRV9SRVRSWShyZWFkKGZkLCAmZmVhdCwgc2l6ZW9mKGZlYXQpKSkgPCAwKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIChmZWF0ICYgY3B1X3RvX2xlMzIoRjJGU19GRUFUVVJFX1JPKSkgIT0gMDsKK30KKworc3RhdGljIGJvb2wgZnNfbWdyX292ZXJsYXlmc19lbmFibGVkKEZzdGFiRW50cnkqIGVudHJ5KSB7CisgICAgLy8gcmVhZG9ubHkgZmlsZXN5c3RlbSwgY2FuIG5vdCBiZSBtb3VudCAtbyByZW1vdW50LHJ3CisgICAgLy8gZm9yIHNxdWFzaGZzLCBlcm9mcyBvciBpZiBmcmVlIHNwYWNlIGlzIChuZWFyKSB6ZXJvIG1ha2luZyBzdWNoIGEgcmVtb3VudAorICAgIC8vIHZpcnR1YWxseSB1c2VsZXNzLCBvciBpZiB0aGVyZSBhcmUgc2hhcmVkIGJsb2NrcyB0aGF0IHByZXZlbnQgcmVtb3VudCxydworICAgIGlmICghZnNfbWdyX2ZpbGVzeXN0ZW1faGFzX3NwYWNlKGVudHJ5LT5tb3VudF9wb2ludCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gYmxrX2RldmljZSBuZWVkcyB0byBiZSBzZXR1cCBzbyB3ZSBjYW4gY2hlY2sgc3VwZXJibG9jay4KKyAgICAvLyBJZiB3ZSBmYWlsIGhlcmUsIGJlY2F1c2UgZHVyaW5nIGluaXQgZmlyc3Qgc3RhZ2UgYW5kIGhhdmUgZG91YnRzLgorICAgIGlmICghZnNfbWdyX3VwZGF0ZV9ibGtfZGV2aWNlKGVudHJ5KSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBmMmZzIHJlYWQtb25seSBtb2RlIGRvZXNuJ3Qgc3VwcG9ydCByZW1vdW50LHJ3CisgICAgaWYgKGZzX21ncl9pc19yZWFkX29ubHlfZjJmcyhlbnRyeS0+YmxrX2RldmljZSkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gY2hlY2sgaWYgZXh0NCBkZS1kdXBlCisgICAgYXV0byBoYXNfc2hhcmVkX2Jsb2NrcyA9IGZzX21ncl9oYXNfc2hhcmVkX2Jsb2NrcyhlbnRyeS0+bW91bnRfcG9pbnQsIGVudHJ5LT5ibGtfZGV2aWNlKTsKKyAgICBpZiAoIWhhc19zaGFyZWRfYmxvY2tzICYmIChlbnRyeS0+bW91bnRfcG9pbnQgPT0gIi9zeXN0ZW0iKSkgeworICAgICAgICBoYXNfc2hhcmVkX2Jsb2NrcyA9IGZzX21ncl9oYXNfc2hhcmVkX2Jsb2NrcygiLyIsIGVudHJ5LT5ibGtfZGV2aWNlKTsKKyAgICB9CisgICAgcmV0dXJuIGhhc19zaGFyZWRfYmxvY2tzOworfQorCitjb25zdCBzdGQ6OnN0cmluZyBmc19tZ3JfbW91bnRfcG9pbnQoY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50X3BvaW50KSB7CisgICAgaWYgKCIvInMgIT0gbW91bnRfcG9pbnQpIHJldHVybiBtb3VudF9wb2ludDsKKyAgICByZXR1cm4gIi9zeXN0ZW0iOworfQorCisvLyBkZWZhdWx0IG9wdGlvbnMgZm9yIG1vdW50X3BvaW50LCByZXR1cm5zIGVtcHR5IHN0cmluZyBmb3Igbm9uZSBhdmFpbGFibGUuCitzdGF0aWMgc3RkOjpzdHJpbmcgZnNfbWdyX2dldF9vdmVybGF5ZnNfb3B0aW9ucyhjb25zdCBGc3RhYkVudHJ5JiBlbnRyeSkgeworICAgIGNvbnN0IGF1dG8gbW91bnRfcG9pbnQgPSBmc19tZ3JfbW91bnRfcG9pbnQoZW50cnkubW91bnRfcG9pbnQpOworICAgIGlmICghZnNfbWdyX2lzX2Rpcihtb3VudF9wb2ludCkpIHsKKyAgICAgICAgcmV0dXJuICIiOworICAgIH0KKyAgICBjb25zdCBhdXRvIGJhc2UgPSBHZXRFbmNvZGVkQmFzZURpckZvck1vdW50UG9pbnQobW91bnRfcG9pbnQpOworICAgIGlmIChiYXNlLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuICIiOworICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIG92ZXJsYXlfbW91bnRfcG9pbnQgOiBPdmVybGF5TW91bnRQb2ludHMoKSkgeworICAgICAgICBjb25zdCBhdXRvIGRpciA9IG92ZXJsYXlfbW91bnRfcG9pbnQgKyAiLyIgKyBrT3ZlcmxheVRvcERpciArICIvIiArIGJhc2UgKyAiLyI7CisgICAgICAgIGNvbnN0IGF1dG8gdXBwZXIgPSBkaXIgKyBrVXBwZXJOYW1lOworICAgICAgICBjb25zdCBhdXRvIHdvcmsgPSBkaXIgKyBrV29ya05hbWU7CisgICAgICAgIGlmICghZnNfbWdyX2lzX2Rpcih1cHBlcikgfHwgIWZzX21ncl9pc19kaXIod29yaykgfHwgYWNjZXNzKHdvcmsuY19zdHIoKSwgUl9PSyB8IFdfT0spKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBhdXRvIHJldCA9IGtMb3dlcmRpck9wdGlvbiArIG1vdW50X3BvaW50ICsgIiwiICsga1VwcGVyZGlyT3B0aW9uICsgdXBwZXIgKyAiLCIgKworICAgICAgICAgICAgICAgICAgIGtXb3JrZGlyT3B0aW9uICsgd29yayArIGFuZHJvaWQ6OmZzX21ncjo6Q2hlY2tPdmVybGF5ZnMoKS5tb3VudF9mbGFnczsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBmbGFnIDogYW5kcm9pZDo6YmFzZTo6U3BsaXQoZW50cnkuZnNfb3B0aW9ucywgIiwiKSkgeworICAgICAgICAgICAgaWYgKGFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGgoZmxhZywgImNvbnRleHQ9IikpIHsKKyAgICAgICAgICAgICAgICByZXQgKz0gIiwiICsgZmxhZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXR1cm4gIiI7Cit9CisKK2Jvb2wgQXV0b1NldEZzQ3JlYXRlQ29uOjpTZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRleHQpIHsKKyAgICBpZiAoc2V0ZnNjcmVhdGVjb24oY29udGV4dC5jX3N0cigpKSkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAic2V0ZnNjcmVhdGVjb24gIiA8PCBjb250ZXh0OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG9rXyA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQXV0b1NldEZzQ3JlYXRlQ29uOjpSZXN0b3JlKCkgeworICAgIGlmIChyZXN0b3JlZF8gfHwgIW9rXykgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKHNldGZzY3JlYXRlY29uKG51bGxwdHIpKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJzZXRmc2NyZWF0ZWNvbiBudWxsIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXN0b3JlZF8gPSB0cnVlOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgaW1tZWRpYXRlIHVubW91bnQgc3VjY2VlZGVkIGFuZCB0aGUgc2NyYXRjaCBtb3VudCBwb2ludCB3YXMKKy8vIHJlbW92ZWQuCitib29sIGZzX21ncl9vdmVybGF5ZnNfdW1vdW50X3NjcmF0Y2goKSB7CisgICAgaWYgKHVtb3VudChrU2NyYXRjaE1vdW50UG9pbnQpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAocm1kaXIoa1NjcmF0Y2hNb3VudFBvaW50KSAhPSAwICYmIGVycm5vICE9IEVOT0VOVCkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAicm1kaXIgIiA8PCBrU2NyYXRjaE1vdW50UG9pbnQ7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBmc19tZ3Jfb3ZlcmxheWZzX3NldF9zaGFyZWRfbW91bnQoY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50X3BvaW50LCBib29sIHNoYXJlZF9mbGFnKSB7CisgICAgYXV0byByZXQgPSBtb3VudChudWxscHRyLCBtb3VudF9wb2ludC5jX3N0cigpLCBudWxscHRyLCBzaGFyZWRfZmxhZyA/IE1TX1NIQVJFRCA6IE1TX1BSSVZBVEUsCisgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIFBFUlJPUiA8PCAiX19tb3VudCh0YXJnZXQ9IiA8PCBtb3VudF9wb2ludAorICAgICAgICAgICAgICAgPDwgIixmbGFnPSIgPDwgKHNoYXJlZF9mbGFnID8gIk1TX1NIQVJFRCIgOiAiTVNfUFJJVkFURSIpIDw8ICIpPSIgPDwgcmV0OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBmc19tZ3Jfb3ZlcmxheWZzX21vdmVfbW91bnQoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldCkgeworICAgIGF1dG8gcmV0ID0gbW91bnQoc291cmNlLmNfc3RyKCksIHRhcmdldC5jX3N0cigpLCBudWxscHRyLCBNU19NT1ZFLCBudWxscHRyKTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIFBFUlJPUiA8PCAiX19tb3VudChzb3VyY2U9IiA8PCBzb3VyY2UgPDwgIix0YXJnZXQ9IiA8PCB0YXJnZXQgPDwgIixmbGFnPU1TX01PVkUpPSIgPDwgcmV0OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBmc19tZ3Jfb3ZlcmxheWZzX21vdW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBtb3VudF9wb2ludCwgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbnMpIHsKKyAgICBhdXRvIHJlcG9ydCA9ICJfX21vdW50KHNvdXJjZT1vdmVybGF5LHRhcmdldD0icyArIG1vdW50X3BvaW50ICsgIix0eXBlPW92ZXJsYXkiOworICAgIGZvciAoY29uc3QgYXV0byYgb3B0IDogYW5kcm9pZDo6YmFzZTo6U3BsaXQob3B0aW9ucywgIiwiKSkgeworICAgICAgICBpZiAoYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aChvcHQsIGtVcHBlcmRpck9wdGlvbikpIHsKKyAgICAgICAgICAgIHJlcG9ydCA9IHJlcG9ydCArICIsIiArIG9wdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJlcG9ydCA9IHJlcG9ydCArICIpPSI7CisgICAgYXV0byByZXQgPSBtb3VudCgib3ZlcmxheSIsIG1vdW50X3BvaW50LmNfc3RyKCksICJvdmVybGF5IiwgTVNfUkRPTkxZIHwgTVNfTk9BVElNRSwKKyAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY19zdHIoKSk7CisgICAgaWYgKHJldCkgeworICAgICAgICBQRVJST1IgPDwgcmVwb3J0IDw8IHJldDsKKyAgICB9IGVsc2UgeworICAgICAgICBMSU5GTyA8PCByZXBvcnQgPDwgcmV0OworICAgIH0KKyAgICByZXR1cm4gIXJldDsKK30KKworc3RydWN0IG1vdW50X2luZm8geworICAgIHN0ZDo6c3RyaW5nIG1vdW50X3BvaW50OworICAgIGJvb2wgc2hhcmVkX2ZsYWc7Cit9OworCitzdGF0aWMgc3RkOjp2ZWN0b3I8bW91bnRfaW5mbz4gUmVhZE1vdW50aW5mb0Zyb21GaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7CisgICAgc3RkOjp2ZWN0b3I8bW91bnRfaW5mbz4gaW5mbzsKKworICAgIGF1dG8gZmlsZSA9IHN0ZDo6dW5pcXVlX3B0cjxGSUxFLCBkZWNsdHlwZSgmZmNsb3NlKT57Zm9wZW4ocGF0aC5jX3N0cigpLCAicmUiKSwgZmNsb3NlfTsKKyAgICBpZiAoIWZpbGUpIHsKKyAgICAgICAgUEVSUk9SIDw8IF9fRlVOQ1RJT05fXyA8PCAiKCk6IGNhbm5vdCBvcGVuIGZpbGU6ICciIDw8IHBhdGggPDwgIiciOworICAgICAgICByZXR1cm4gaW5mbzsKKyAgICB9CisKKyAgICBzc2l6ZV90IGxlbjsKKyAgICBzaXplX3QgYWxsb2NfbGVuID0gMDsKKyAgICBjaGFyKiBsaW5lID0gbnVsbHB0cjsKKyAgICB3aGlsZSAoKGxlbiA9IGdldGxpbmUoJmxpbmUsICZhbGxvY19sZW4sIGZpbGUuZ2V0KCkpKSAhPSAtMSkgeworICAgICAgICAvKiBpZiB0aGUgbGFzdCBjaGFyYWN0ZXIgaXMgYSBuZXdsaW5lLCBzaG9ydGVuIHRoZSBzdHJpbmcgYnkgMSBieXRlICovCisgICAgICAgIGlmIChsaW5lW2xlbiAtIDFdID09ICdcbicpIHsKKyAgICAgICAgICAgIGxpbmVbbGVuIC0gMV0gPSAnXDAnOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGRlbGltW10gPSAiIFx0IjsKKyAgICAgICAgY2hhciogc2F2ZV9wdHI7CisgICAgICAgIGlmICghc3RydG9rX3IobGluZSwgZGVsaW0sICZzYXZlX3B0cikpIHsKKyAgICAgICAgICAgIExFUlJPUiA8PCAiRXJyb3IgcGFyc2luZyBtb3VudCBJRCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXN0cnRva19yKG51bGxwdHIsIGRlbGltLCAmc2F2ZV9wdHIpKSB7CisgICAgICAgICAgICBMRVJST1IgPDwgIkVycm9yIHBhcnNpbmcgcGFyZW50IElEIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICghc3RydG9rX3IobnVsbHB0ciwgZGVsaW0sICZzYXZlX3B0cikpIHsKKyAgICAgICAgICAgIExFUlJPUiA8PCAiRXJyb3IgcGFyc2luZyBtb3VudCBzb3VyY2UiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzdHJ0b2tfcihudWxscHRyLCBkZWxpbSwgJnNhdmVfcHRyKSkgeworICAgICAgICAgICAgTEVSUk9SIDw8ICJFcnJvciBwYXJzaW5nIHJvb3QiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjaGFyKiBwOworICAgICAgICBpZiAoIShwID0gc3RydG9rX3IobnVsbHB0ciwgZGVsaW0sICZzYXZlX3B0cikpKSB7CisgICAgICAgICAgICBMRVJST1IgPDwgIkVycm9yIHBhcnNpbmcgbW91bnRfcG9pbnQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbW91bnRfaW5mbyBlbnRyeSA9IHtwLCBmYWxzZX07CisKKyAgICAgICAgaWYgKCFzdHJ0b2tfcihudWxscHRyLCBkZWxpbSwgJnNhdmVfcHRyKSkgeworICAgICAgICAgICAgTEVSUk9SIDw8ICJFcnJvciBwYXJzaW5nIG1vdW50X2ZsYWdzIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKChwID0gc3RydG9rX3IobnVsbHB0ciwgZGVsaW0sICZzYXZlX3B0cikpKSB7CisgICAgICAgICAgICBpZiAoKHBbMF0gPT0gJy0nKSAmJiAocFsxXSA9PSAnXDAnKSkgYnJlYWs7CisgICAgICAgICAgICBpZiAoYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aChwLCAic2hhcmVkOiIpKSBlbnRyeS5zaGFyZWRfZmxhZyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFwKSB7CisgICAgICAgICAgICBMRVJST1IgPDwgIkVycm9yIHBhcnNpbmcgZmllbGRzIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGluZm8uZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShlbnRyeSkpOworICAgIH0KKworICAgIGZyZWUobGluZSk7CisgICAgaWYgKGluZm8uZW1wdHkoKSkgeworICAgICAgICBMRVJST1IgPDwgX19GVU5DVElPTl9fIDw8ICIoKTogZmFpbGVkIHRvIGxvYWQgbW91bnRpbmZvIGZyb20gOiAnIiA8PCBwYXRoIDw8ICInIjsKKyAgICB9CisgICAgcmV0dXJuIGluZm87Cit9CisKK3N0YXRpYyBib29sIGZzX21ncl9vdmVybGF5ZnNfbW91bnRfb25lKGNvbnN0IEZzdGFiRW50cnkmIGZzdGFiX2VudHJ5KSB7CisgICAgY29uc3QgYXV0byBtb3VudF9wb2ludCA9IGZzX21ncl9tb3VudF9wb2ludChmc3RhYl9lbnRyeS5tb3VudF9wb2ludCk7CisgICAgY29uc3QgYXV0byBvcHRpb25zID0gZnNfbWdyX2dldF9vdmVybGF5ZnNfb3B0aW9ucyhmc3RhYl9lbnRyeSk7CisgICAgaWYgKG9wdGlvbnMuZW1wdHkoKSkgcmV0dXJuIGZhbHNlOworCisgICAgc3RydWN0IE1vdmVFbnRyeSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1vdW50X3BvaW50OworICAgICAgICBzdGQ6OnN0cmluZyBkaXI7CisgICAgICAgIGJvb2wgc2hhcmVkX2ZsYWc7CisgICAgfTsKKyAgICBzdGQ6OnZlY3RvcjxNb3ZlRW50cnk+IG1vdmVkX21vdW50czsKKworICAgIGJvb2wgcmV0dmFsID0gdHJ1ZTsKKyAgICBib29sIG1vdmVfZGlyX3NoYXJlZCA9IHRydWU7CisgICAgYm9vbCBwYXJlbnRfc2hhcmVkID0gdHJ1ZTsKKyAgICBib29sIHBhcmVudF9oYXZlX3BhcmVudCA9IGZhbHNlOworICAgIGJvb2wgcGFyZW50X21hZGVfcHJpdmF0ZSA9IGZhbHNlOworICAgIGJvb2wgcm9vdF9zaGFyZWQgPSB0cnVlOworICAgIGJvb2wgcm9vdF9tYWRlX3ByaXZhdGUgPSBmYWxzZTsKKworICAgIC8vIFRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIG1vdW50IGVudHJpZXMgd2l0aCB0aGUgc2FtZSBtb3VudHBvaW50LgorICAgIC8vIEdyb3VwIHRoZXNlIGVudHJpZXMgdG9nZXRoZXIgd2l0aCBzdGFibGVfc29ydCwgYW5kIGtlZXAgb25seSB0aGUgbGFzdCBlbnRyeSBvZiBhIGdyb3VwLgorICAgIC8vIE9ubHkgbW92ZSBtb3VudCB0aGUgbGFzdCBlbnRyeSBpbiBhbiBvdmVyIG1vdW50IGdyb3VwLCBiZWNhdXNlIHRoZSBvdGhlciBlbnRyaWVzIGFyZQorICAgIC8vIG92ZXJzaGFkb3dlZCBhbmQgb25seSB0aGUgZmlsZXN5c3RlbSBtb3VudGVkIHdpdGggdGhlIGxhc3QgZW50cnkgcGFydGljaXBhdGVzIGluIGZpbGUKKyAgICAvLyBwYXRobmFtZSByZXNvbHV0aW9uLgorICAgIGF1dG8gbW91bnRpbmZvID0gUmVhZE1vdW50aW5mb0Zyb21GaWxlKCIvcHJvYy9zZWxmL21vdW50aW5mbyIpOworICAgIHN0ZDo6c3RhYmxlX3NvcnQobW91bnRpbmZvLmJlZ2luKCksIG1vdW50aW5mby5lbmQoKSwgW10oY29uc3QgYXV0byYgbGhzLCBjb25zdCBhdXRvJiByaHMpIHsKKyAgICAgICAgcmV0dXJuIGxocy5tb3VudF9wb2ludCA8IHJocy5tb3VudF9wb2ludDsKKyAgICB9KTsKKyAgICBzdGQ6OnJldmVyc2UobW91bnRpbmZvLmJlZ2luKCksIG1vdW50aW5mby5lbmQoKSk7CisgICAgYXV0byBlcmFzZV9mcm9tID0gc3RkOjp1bmlxdWUoCisgICAgICAgICAgICBtb3VudGluZm8uYmVnaW4oKSwgbW91bnRpbmZvLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byYgbGhzLCBjb25zdCBhdXRvJiByaHMpIHsgcmV0dXJuIGxocy5tb3VudF9wb2ludCA9PSByaHMubW91bnRfcG9pbnQ7IH0pOworICAgIG1vdW50aW5mby5lcmFzZShlcmFzZV9mcm9tLCBtb3VudGluZm8uZW5kKCkpOworICAgIHN0ZDo6cmV2ZXJzZShtb3VudGluZm8uYmVnaW4oKSwgbW91bnRpbmZvLmVuZCgpKTsKKyAgICAvLyBtb3VudGluZm8gaXMgcmV2ZXJzZWQgdHdpY2UsIHNvIHN0aWxsIGlzIGluIGxleGljYWwgc29ydGVkIG9yZGVyLgorCisgICAgZm9yIChjb25zdCBhdXRvJiBlbnRyeSA6IG1vdW50aW5mbykgeworICAgICAgICBpZiAoZW50cnkubW91bnRfcG9pbnQgPT0ga01vdmVNb3VudFRlbXBEaXIpIHsKKyAgICAgICAgICAgIG1vdmVfZGlyX3NoYXJlZCA9IGVudHJ5LnNoYXJlZF9mbGFnOworICAgICAgICB9CisgICAgICAgIGlmIChlbnRyeS5tb3VudF9wb2ludCA9PSBtb3VudF9wb2ludCB8fAorICAgICAgICAgICAgKG1vdW50X3BvaW50ID09ICIvc3lzdGVtIiAmJiBlbnRyeS5tb3VudF9wb2ludCA9PSAiLyIpKSB7CisgICAgICAgICAgICBwYXJlbnRfc2hhcmVkID0gZW50cnkuc2hhcmVkX2ZsYWc7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVudHJ5Lm1vdW50X3BvaW50ID09ICIvIikgeworICAgICAgICAgICAgcm9vdF9zaGFyZWQgPSBlbnRyeS5zaGFyZWRfZmxhZzsKKyAgICAgICAgfQorICAgICAgICAvLyBJZ25vcmUgIi8iIGFzIHdlIGRvbid0IG92ZXJsYXkgIi8iIGRpcmVjdGx5LgorICAgICAgICBpZiAoZW50cnkubW91bnRfcG9pbnQgIT0gIi8iKSB7CisgICAgICAgICAgICBwYXJlbnRfaGF2ZV9wYXJlbnQgfD0gYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aChtb3VudF9wb2ludCwgZW50cnkubW91bnRfcG9pbnQgKyAiLyIpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUHJlY29uZGl0aW9uIGlzIHRoYXQga01vdmVNb3VudFRlbXBEaXIgaXMgTVNfUFJJVkFURSwgb3RoZXJ3aXNlIGRvbid0IHRyeSB0byBtb3ZlIGFueQorICAgIC8vIHN1Ym1vdW50IGluIHRvIG9yIG91dCBvZiBpdC4KKyAgICBpZiAobW92ZV9kaXJfc2hhcmVkKSB7CisgICAgICAgIG1vdW50aW5mby5jbGVhcigpOworICAgIH0KKworICAgIC8vIE5lZWQgdG8gbWFrZSB0aGUgb3JpZ2luYWwgbW91bnRwb2ludCBNU19QUklWQVRFLCBzbyB0aGF0IHRoZSBvdmVybGF5ZnMgY2FuIGJlIE1TX01PVkUuCisgICAgLy8gVGhpcyBjb3VsZCBoYXBwZW4gaWYgaXRzIHBhcmVudCBtb3VudCBpcyByZW1vdW50ZWQgbGF0ZXIuCisgICAgaWYgKHBhcmVudF9oYXZlX3BhcmVudCkgeworICAgICAgICBwYXJlbnRfbWFkZV9wcml2YXRlIHw9IGZzX21ncl9vdmVybGF5ZnNfc2V0X3NoYXJlZF9tb3VudChtb3VudF9wb2ludCwgZmFsc2UpOworICAgICAgICBpZiAoIXBhcmVudF9tYWRlX3ByaXZhdGUgJiYgZXJybm8gPT0gRUlOVkFMICYmIG1vdW50X3BvaW50ID09ICIvc3lzdGVtIikgeworICAgICAgICAgICAgLy8gSWYgZmFpbGVkIHRvIHNldCAiL3N5c3RlbSIgbW91bnQgdHlwZSwgaXQgbWlnaHQgYmUgZHVlIHRvICIvc3lzdGVtIiBub3QgYmVpbmcgYSB2YWxpZAorICAgICAgICAgICAgLy8gbW91bnRwb2ludCBhZnRlciBzd2l0Y2ggcm9vdC4gUmV0cnkgd2l0aCAiLyIgaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgcGFyZW50X21hZGVfcHJpdmF0ZSB8PSBmc19tZ3Jfb3ZlcmxheWZzX3NldF9zaGFyZWRfbW91bnQoIi8iLCBmYWxzZSk7CisgICAgICAgICAgICByb290X21hZGVfcHJpdmF0ZSB8PSBwYXJlbnRfbWFkZV9wcml2YXRlOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChjb25zdCBhdXRvJiBlbnRyeSA6IG1vdW50aW5mbykgeworICAgICAgICAvLyBGaW5kIGFsbCBpbW1lZGlhdGUgc3VibW91bnRzLgorICAgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGgoZW50cnkubW91bnRfcG9pbnQsIG1vdW50X3BvaW50ICsgIi8iKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gRXhjbHVkZSBkdXBsaWNhdGVkIG9yIG1vcmUgc3BlY2lmaWMgZW50cmllcy4KKyAgICAgICAgaWYgKHN0ZDo6ZmluZF9pZihtb3ZlZF9tb3VudHMuYmVnaW4oKSwgbW92ZWRfbW91bnRzLmVuZCgpLCBbJmVudHJ5XShjb25zdCBhdXRvJiBpdCkgeworICAgICAgICAgICAgICAgIHJldHVybiBpdC5tb3VudF9wb2ludCA9PSBlbnRyeS5tb3VudF9wb2ludCB8fAorICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpTdGFydHNXaXRoKGVudHJ5Lm1vdW50X3BvaW50LCBpdC5tb3VudF9wb2ludCArICIvIik7CisgICAgICAgICAgICB9KSAhPSBtb3ZlZF9tb3VudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIG1vdW50aW5mbyBpcyBpbiBsZXhpY2FsIG9yZGVyLCBzbyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IHxlbnRyeXwgYmVpbmcgYSBwYXJlbnQgbW91bnQgb2YKKyAgICAgICAgLy8gZW50cmllcyBvZiB8bW92ZWRfbW91bnRzfC4KKworICAgICAgICBNb3ZlRW50cnkgbmV3X2VudHJ5e2VudHJ5Lm1vdW50X3BvaW50LCBrTW92ZU1vdW50VGVtcERpciArICIvVGVtcG9yYXJ5RGlyLVhYWFhYWCJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnNoYXJlZF9mbGFnfTsKKyAgICAgICAgeworICAgICAgICAgICAgQXV0b1NldEZzQ3JlYXRlQ29uIGNyZWF0ZWNvbjsKKyAgICAgICAgICAgIGF1dG8gbmV3X2NvbnRleHQgPSBmc19tZ3JfZ2V0X2NvbnRleHQoZW50cnkubW91bnRfcG9pbnQpOworICAgICAgICAgICAgaWYgKG5ld19jb250ZXh0LmVtcHR5KCkgfHwgIWNyZWF0ZWNvbi5TZXQobmV3X2NvbnRleHQpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdCBhdXRvIHRhcmdldCA9IG1rZHRlbXAobmV3X2VudHJ5LmRpci5kYXRhKCkpOworICAgICAgICAgICAgaWYgKCF0YXJnZXQpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBQRVJST1IgPDwgInRlbXBvcmFyeSBkaXJlY3RvcnkgZm9yIE1TX01PVkUiOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFjcmVhdGVjb24uUmVzdG9yZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcm1kaXIobmV3X2VudHJ5LmRpci5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXBhcmVudF9tYWRlX3ByaXZhdGUpIHsKKyAgICAgICAgICAgIHBhcmVudF9tYWRlX3ByaXZhdGUgfD0gZnNfbWdyX292ZXJsYXlmc19zZXRfc2hhcmVkX21vdW50KG1vdW50X3BvaW50LCBmYWxzZSk7CisgICAgICAgICAgICBpZiAoIXBhcmVudF9tYWRlX3ByaXZhdGUgJiYgZXJybm8gPT0gRUlOVkFMICYmIG1vdW50X3BvaW50ID09ICIvc3lzdGVtIikgeworICAgICAgICAgICAgICAgIC8vIElmIGZhaWxlZCB0byBzZXQgIi9zeXN0ZW0iIG1vdW50IHR5cGUsIGl0IG1pZ2h0IGJlIGR1ZSB0byAiL3N5c3RlbSIgbm90IGJlaW5nIGEKKyAgICAgICAgICAgICAgICAvLyB2YWxpZCBtb3VudHBvaW50IGFmdGVyIHN3aXRjaCByb290LiBSZXRyeSB3aXRoICIvIiBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgcGFyZW50X21hZGVfcHJpdmF0ZSB8PSBmc19tZ3Jfb3ZlcmxheWZzX3NldF9zaGFyZWRfbW91bnQoIi8iLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgcm9vdF9tYWRlX3ByaXZhdGUgfD0gcGFyZW50X21hZGVfcHJpdmF0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChuZXdfZW50cnkuc2hhcmVkX2ZsYWcpIHsKKyAgICAgICAgICAgIG5ld19lbnRyeS5zaGFyZWRfZmxhZyA9IGZzX21ncl9vdmVybGF5ZnNfc2V0X3NoYXJlZF9tb3VudChuZXdfZW50cnkubW91bnRfcG9pbnQsIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWZzX21ncl9vdmVybGF5ZnNfbW92ZV9tb3VudChuZXdfZW50cnkubW91bnRfcG9pbnQsIG5ld19lbnRyeS5kaXIpKSB7CisgICAgICAgICAgICByZXR2YWwgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChuZXdfZW50cnkuc2hhcmVkX2ZsYWcpIHsKKyAgICAgICAgICAgICAgICBmc19tZ3Jfb3ZlcmxheWZzX3NldF9zaGFyZWRfbW91bnQobmV3X2VudHJ5Lm1vdW50X3BvaW50LCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJtZGlyKG5ld19lbnRyeS5kaXIuY19zdHIoKSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBtb3ZlZF9tb3VudHMucHVzaF9iYWNrKHN0ZDo6bW92ZShuZXdfZW50cnkpKTsKKyAgICB9CisKKyAgICByZXR2YWwgJj0gZnNfbWdyX292ZXJsYXlmc19tb3VudChtb3VudF9wb2ludCwgb3B0aW9ucyk7CisKKyAgICAvLyBNb3ZlIHN1Ym1vdW50cyBiYWNrLgorICAgIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBtb3ZlZF9tb3VudHMpIHsKKyAgICAgICAgaWYgKCFmc19tZ3Jfb3ZlcmxheWZzX21vdmVfbW91bnQoZW50cnkuZGlyLCBlbnRyeS5tb3VudF9wb2ludCkpIHsKKyAgICAgICAgICAgIHJldHZhbCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKGVudHJ5LnNoYXJlZF9mbGFnICYmCisgICAgICAgICAgICAgICAgICAgIWZzX21ncl9vdmVybGF5ZnNfc2V0X3NoYXJlZF9tb3VudChlbnRyeS5tb3VudF9wb2ludCwgdHJ1ZSkpIHsKKyAgICAgICAgICAgIHJldHZhbCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJtZGlyKGVudHJ5LmRpci5jX3N0cigpKTsKKyAgICB9CisgICAgLy8gSWYgdGhlIG9yaWdpbmFsIChvdmVycmlkZGVuKSBtb3VudCB3YXMgTVNfU0hBUkVELCB0aGVuIHNldCB0aGUgb3ZlcmxheWZzIG1vdW50IHRvIE1TX1NIQVJFRC4KKyAgICBpZiAocGFyZW50X3NoYXJlZCAmJiBwYXJlbnRfbWFkZV9wcml2YXRlKSB7CisgICAgICAgIGZzX21ncl9vdmVybGF5ZnNfc2V0X3NoYXJlZF9tb3VudChtb3VudF9wb2ludCwgdHJ1ZSk7CisgICAgfQorICAgIGlmIChyb290X3NoYXJlZCAmJiByb290X21hZGVfcHJpdmF0ZSkgeworICAgICAgICBmc19tZ3Jfb3ZlcmxheWZzX3NldF9zaGFyZWRfbW91bnQoIi8iLCB0cnVlKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvLyBNb3VudCBrU2NyYXRjaE1vdW50UG9pbnQKK2Jvb2wgTW91bnRTY3JhdGNoKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfcGF0aCwgYm9vbCByZWFkb25seSkgeworICAgIGlmIChyZWFkb25seSkgeworICAgICAgICBpZiAoYWNjZXNzKGRldmljZV9wYXRoLmNfc3RyKCksIEZfT0spKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJQYXRoIGRvZXMgbm90IGV4aXN0OiAiIDw8IGRldmljZV9wYXRoOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChhY2Nlc3MoZGV2aWNlX3BhdGguY19zdHIoKSwgUl9PSyB8IFdfT0spKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlBhdGggZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IHJlYWR3cml0ZTogIiA8PCBkZXZpY2VfcGF0aDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBmaWxlc3lzdGVtX2NhbmRpZGF0ZXM7CisgICAgaWYgKGZzX21ncl9pc19mMmZzKGRldmljZV9wYXRoKSkgeworICAgICAgICBmaWxlc3lzdGVtX2NhbmRpZGF0ZXMgPSB7ImYyZnMiLCAiZXh0NCJ9OworICAgIH0gZWxzZSBpZiAoZnNfbWdyX2lzX2V4dDQoZGV2aWNlX3BhdGgpKSB7CisgICAgICAgIGZpbGVzeXN0ZW1fY2FuZGlkYXRlcyA9IHsiZXh0NCIsICJmMmZzIn07CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiU2NyYXRjaCBwYXJ0aXRpb24gaXMgbm90IGYyZnMgb3IgZXh0NCI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBdXRvU2V0RnNDcmVhdGVDb24gY3JlYXRlY29uKGtPdmVybGF5ZnNGaWxlQ29udGV4dCk7CisgICAgaWYgKCFjcmVhdGVjb24uT2soKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChta2RpcihrU2NyYXRjaE1vdW50UG9pbnQsIDA3NTUpICYmIChlcnJubyAhPSBFRVhJU1QpKSB7CisgICAgICAgIFBFUlJPUiA8PCAiY3JlYXRlICIgPDwga1NjcmF0Y2hNb3VudFBvaW50OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgRnN0YWJFbnRyeSBlbnRyeTsKKyAgICBlbnRyeS5ibGtfZGV2aWNlID0gZGV2aWNlX3BhdGg7CisgICAgZW50cnkubW91bnRfcG9pbnQgPSBrU2NyYXRjaE1vdW50UG9pbnQ7CisgICAgZW50cnkuZmxhZ3MgPSBNU19OT0FUSU1FIHwgTVNfUkRPTkxZOworICAgIGlmICghcmVhZG9ubHkpIHsKKyAgICAgICAgZW50cnkuZmxhZ3MgJj0gfk1TX1JET05MWTsKKyAgICAgICAgZW50cnkuZmxhZ3MgfD0gTVNfU1lOQ0hST05PVVM7CisgICAgICAgIGVudHJ5LmZzX29wdGlvbnMgPSAibm9kaXNjYXJkIjsKKyAgICAgICAgZnNfbWdyX3NldF9ibGtfcm8oZGV2aWNlX3BhdGgsIGZhbHNlKTsKKyAgICB9CisgICAgLy8gY2hlY2tfZnMgcmVxdWlyZXMgYXBleCBydW50aW1lIGxpYnJhcnkKKyAgICBpZiAoZnNfbWdyX292ZXJsYXlmc19hbHJlYWR5X21vdW50ZWQoIi9kYXRhIiwgZmFsc2UpKSB7CisgICAgICAgIGVudHJ5LmZzX21ncl9mbGFncy5jaGVjayA9IHRydWU7CisgICAgfQorICAgIGJvb2wgbW91bnRlZCA9IGZhbHNlOworICAgIGZvciAoYXV0byBmc190eXBlIDogZmlsZXN5c3RlbV9jYW5kaWRhdGVzKSB7CisgICAgICAgIGVudHJ5LmZzX3R5cGUgPSBmc190eXBlOworICAgICAgICBpZiAoZnNfbWdyX2RvX21vdW50X29uZShlbnRyeSkgPT0gMCkgeworICAgICAgICAgICAgbW91bnRlZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIWNyZWF0ZWNvbi5SZXN0b3JlKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIW1vdW50ZWQpIHsKKyAgICAgICAgcm1kaXIoa1NjcmF0Y2hNb3VudFBvaW50KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gTk9URTogT3ZlcmxheWZzU2V0dXBBbGxvd2VkKCkgbXVzdCBiZSAic3RyaWN0ZXIiIHRoYW4gT3ZlcmxheWZzVGVhcmRvd25BbGxvd2VkKCkuCisvLyBTZXR1cCBpcyBhbGxvd2VkIG9ubHkgaWYgdGVhcmRvd24gaXMgYWxzbyBhbGxvd2VkLgorYm9vbCBPdmVybGF5ZnNTZXR1cEFsbG93ZWQoYm9vbCB2ZXJib3NlKSB7CisgICAgaWYgKCFrQWxsb3dPdmVybGF5ZnMpIHsKKyAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk92ZXJsYXlmcyByZW1vdW50cyBjYW4gb25seSBiZSB1c2VkIGluIGRlYnVnZ2FibGUgYnVpbGRzIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIENoZWNrIG1hbmRhdG9yeSBrZXJuZWwgcGF0Y2hlcy4KKyAgICBpZiAoIWFuZHJvaWQ6OmZzX21ncjo6Q2hlY2tPdmVybGF5ZnMoKS5zdXBwb3J0ZWQpIHsKKyAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIktlcm5lbCBkb2VzIG5vdCBzdXBwb3J0IG92ZXJsYXlmcyI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBpbiByZWNvdmVyeSBvciBmYXN0Ym9vdGQsIG5vdCBhbGxvd2VkIQorICAgIGlmIChJblJlY292ZXJ5KCkpIHsKKyAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlVuc3VwcG9ydGVkIG92ZXJsYXlmcyBzZXR1cCBmcm9tIHJlY292ZXJ5IjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIGZzX21ncl93YW50c19vdmVybGF5ZnMoRnN0YWJFbnRyeSogZW50cnkpIHsKKyAgICAvLyBEb24ndCBjaGVjayBlbnRyaWVzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdm9sZC4KKyAgICBpZiAoZW50cnktPmZzX21ncl9mbGFncy52b2xkX21hbmFnZWQgfHwgZW50cnktPmZzX21ncl9mbGFncy5yZWNvdmVyeV9vbmx5KSByZXR1cm4gZmFsc2U7CisKKyAgICAvLyAqX290aGVyIGRvZXNuJ3Qgd2FudCBvdmVybGF5ZnMuCisgICAgaWYgKGVudHJ5LT5mc19tZ3JfZmxhZ3Muc2xvdF9zZWxlY3Rfb3RoZXIpIHJldHVybiBmYWxzZTsKKworICAgIC8vIE9ubHkgY29uY2VybmVkIHdpdGggcmVhZG9ubHkgcGFydGl0aW9ucy4KKyAgICBpZiAoIShlbnRyeS0+ZmxhZ3MgJiBNU19SRE9OTFkpKSByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBJZiB1bmJpbmRhYmxlLCBkbyBub3QgYWxsb3cgb3ZlcmxheWZzIGFzIHRoaXMgY291bGQgZXhwb3NlIHVzIHRvCisgICAgLy8gc2VjdXJpdHkgaXNzdWVzLiAgT24gQW5kcm9pZCwgdGhpcyBjb3VsZCBhbHNvIGJlIHVzZWQgdG8gdHVybiBvZmYKKyAgICAvLyB0aGUgYWJpbGl0eSB0byBvdmVybGF5IGFuIG90aGVyd2lzZSBhY2NlcHRhYmxlIGZpbGVzeXN0ZW0gc2luY2UKKyAgICAvLyAvc3lzdGVtIGFuZCAvdmVuZG9yIGFyZSBuZXZlciBib3VuZChzaWMpIHRvLgorICAgIGlmIChlbnRyeS0+ZmxhZ3MgJiBNU19VTkJJTkRBQkxFKSByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoIWZzX21ncl9vdmVybGF5ZnNfZW5hYmxlZChlbnRyeSkpIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworfQorCitGc3RhYiBmc19tZ3Jfb3ZlcmxheWZzX2NhbmRpZGF0ZV9saXN0KGNvbnN0IEZzdGFiJiBmc3RhYikgeworICAgIGFuZHJvaWQ6OmZzX21ncjo6RnN0YWIgbW91bnRzOworICAgIGlmICghYW5kcm9pZDo6ZnNfbWdyOjpSZWFkRnN0YWJGcm9tRmlsZSgiL3Byb2MvbW91bnRzIiwgJm1vdW50cykpIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byByZWFkIC9wcm9jL21vdW50cyI7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisKKyAgICBGc3RhYiBjYW5kaWRhdGVzOworICAgIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBmc3RhYikgeworICAgICAgICAvLyBGaWx0ZXIgb3V0IHBhcnRpdGlvbnMgd2hvc2UgdHlwZSBkb2Vzbid0IG1hdGNoIHdoYXQncyBtb3VudGVkLgorICAgICAgICAvLyBUaGlzIGF2b2lkcyBzcGFtbXkgYmVoYXZpb3Igb24gZGV2aWNlcyB3aGljaCBjYW4gbW91bnQgZGlmZmVyZW50CisgICAgICAgIC8vIGZpbGVzeXN0ZW1zIGZvciBlYWNoIHBhcnRpdGlvbi4KKyAgICAgICAgYXV0byBwcm9jX21vdW50X3BvaW50ID0gKGVudHJ5Lm1vdW50X3BvaW50ID09ICIvc3lzdGVtIikgPyAiLyIgOiBlbnRyeS5tb3VudF9wb2ludDsKKyAgICAgICAgYXV0byBtb3VudGVkID0gR2V0RW50cnlGb3JNb3VudFBvaW50KCZtb3VudHMsIHByb2NfbW91bnRfcG9pbnQpOworICAgICAgICBpZiAoIW1vdW50ZWQgfHwgbW91bnRlZC0+ZnNfdHlwZSAhPSBlbnRyeS5mc190eXBlKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEZzdGFiRW50cnkgbmV3X2VudHJ5ID0gZW50cnk7CisgICAgICAgIGlmICghZnNfbWdyX292ZXJsYXlmc19hbHJlYWR5X21vdW50ZWQoZW50cnkubW91bnRfcG9pbnQpICYmCisgICAgICAgICAgICAhZnNfbWdyX3dhbnRzX292ZXJsYXlmcygmbmV3X2VudHJ5KSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgYXV0byBuZXdfbW91bnRfcG9pbnQgPSBmc19tZ3JfbW91bnRfcG9pbnQobmV3X2VudHJ5Lm1vdW50X3BvaW50KTsKKyAgICAgICAgaWYgKHN0ZDo6ZmluZF9pZihjYW5kaWRhdGVzLmJlZ2luKCksIGNhbmRpZGF0ZXMuZW5kKCksIFsmXShjb25zdCBhdXRvJiBpdCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmc19tZ3JfbW91bnRfcG9pbnQoaXQubW91bnRfcG9pbnQpID09IG5ld19tb3VudF9wb2ludDsKKyAgICAgICAgICAgIH0pICE9IGNhbmRpZGF0ZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGNhbmRpZGF0ZXMucHVzaF9iYWNrKHN0ZDo6bW92ZShuZXdfZW50cnkpKTsKKyAgICB9CisgICAgcmV0dXJuIGNhbmRpZGF0ZXM7Cit9CisKK3N0YXRpYyB2b2lkIFRyeU1vdW50U2NyYXRjaCgpIHsKKyAgICAvLyBOb3RlIHdlIGdldCB0aGUgYm9vdCBzY3JhdGNoIGRldmljZSBoZXJlLCB3aGljaCBtZWFucyBpZiBzY3JhdGNoIHdhcworICAgIC8vIGp1c3QgY3JlYXRlZCB0aHJvdWdoIEltYWdlTWFuYWdlciwgdGhpcyBjb3VsZCBmYWlsLiBJbiBwcmFjdGljZSB0aGlzCisgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW4gYmVjYXVzZSAicmVtb3VudCIgZGV0ZWN0cyB0aGlzIHNjZW5hcmlvIChieSBjaGVja2luZworICAgIC8vIGlmIHZlcml0eSBpcyBzdGlsbCBkaXNhYmxlZCwgaS5lLiBubyByZWJvb3Qgb2NjdXJyZWQpLCBhbmQgc2tpcHMgY2FsbGluZworICAgIC8vIGZzX21ncl9vdmVybGF5ZnNfbW91bnRfYWxsKCkuCisgICAgYXV0byBzY3JhdGNoX2RldmljZSA9IEdldEJvb3RTY3JhdGNoRGV2aWNlKCk7CisgICAgaWYgKGFjY2VzcyhzY3JhdGNoX2RldmljZS5jX3N0cigpLCBSX09LIHwgV19PSykpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIVdhaXRGb3JGaWxlKHNjcmF0Y2hfZGV2aWNlLCAxMHMpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFNb3VudFNjcmF0Y2goc2NyYXRjaF9kZXZpY2UsIHRydWUgLyogcmVhZG9ubHkgKi8pKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY29uc3QgYXV0byB0b3AgPSBrU2NyYXRjaE1vdW50UG9pbnQgKyAiLyJzICsga092ZXJsYXlUb3BEaXI7CisgICAgY29uc3QgYm9vbCBoYXNfb3ZlcmxheWZzX2RpciA9IGFjY2Vzcyh0b3AuY19zdHIoKSwgRl9PSykgPT0gMDsKKyAgICBmc19tZ3Jfb3ZlcmxheWZzX3Vtb3VudF9zY3JhdGNoKCk7CisgICAgaWYgKGhhc19vdmVybGF5ZnNfZGlyKSB7CisgICAgICAgIE1vdW50U2NyYXRjaChzY3JhdGNoX2RldmljZSk7CisgICAgfQorfQorCitib29sIGZzX21ncl9vdmVybGF5ZnNfbW91bnRfYWxsKEZzdGFiKiBmc3RhYikgeworICAgIGlmICghT3ZlcmxheWZzU2V0dXBBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIEVuc3VyZSBrTW92ZU1vdW50VGVtcERpciBpcyBzdGFuZGFsb25lIG1vdW50IHRyZWUgd2l0aCAncHJpdmF0ZScgcHJvcGFnYXRpb24gYnkgYmluZCBtb3VudGluZworICAgIC8vIHRvIGl0c2VsZiBhbmQgc2V0IHRvIE1TX1BSSVZBVEUuCisgICAgLy8gT3RoZXJ3aXNlIG1vdW50cyBtb3ZlZCBpbiB0byBpdCB3b3VsZCBoYXZlIHRoZWlyIHByb3BhZ2F0aW9uIHR5cGUgY2hhbmdlZCB1bmludGVudGlvbmFsbHkuCisgICAgLy8gU2VjdGlvbiA1ZCwgaHR0cHM6Ly93d3cua2VybmVsLm9yZy9kb2MvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9zaGFyZWRzdWJ0cmVlLnR4dAorICAgIGlmICghZnNfbWdyX292ZXJsYXlmc19hbHJlYWR5X21vdW50ZWQoa01vdmVNb3VudFRlbXBEaXIsIGZhbHNlKSkgeworICAgICAgICBpZiAobWtkaXIoa01vdmVNb3VudFRlbXBEaXIsIDA3NTUpICYmIGVycm5vICE9IEVFWElTVCkgeworICAgICAgICAgICAgUEVSUk9SIDw8ICJta2RpciAiIDw8IGtNb3ZlTW91bnRUZW1wRGlyOworICAgICAgICB9CisgICAgICAgIGlmIChtb3VudChrTW92ZU1vdW50VGVtcERpciwga01vdmVNb3VudFRlbXBEaXIsIG51bGxwdHIsIE1TX0JJTkQsIG51bGxwdHIpKSB7CisgICAgICAgICAgICBQRVJST1IgPDwgImJpbmQgbW91bnQgIiA8PCBrTW92ZU1vdW50VGVtcERpcjsKKyAgICAgICAgfQorICAgIH0KKyAgICBmc19tZ3Jfb3ZlcmxheWZzX3NldF9zaGFyZWRfbW91bnQoa01vdmVNb3VudFRlbXBEaXIsIGZhbHNlKTsKKyAgICBhbmRyb2lkOjpiYXNlOjpTY29wZUd1YXJkIHVtb3VudERpcihbXSgpIHsKKyAgICAgICAgdW1vdW50KGtNb3ZlTW91bnRUZW1wRGlyKTsKKyAgICAgICAgcm1kaXIoa01vdmVNb3VudFRlbXBEaXIpOworICAgIH0pOworCisgICAgYXV0byByZXQgPSB0cnVlOworICAgIGF1dG8gc2NyYXRjaF9jYW5fYmVfbW91bnRlZCA9ICFmc19tZ3Jfb3ZlcmxheWZzX2FscmVhZHlfbW91bnRlZChrU2NyYXRjaE1vdW50UG9pbnQsIGZhbHNlKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogZnNfbWdyX292ZXJsYXlmc19jYW5kaWRhdGVfbGlzdCgqZnN0YWIpKSB7CisgICAgICAgIGlmIChmc19tZ3JfaXNfdmVyaXR5X2VuYWJsZWQoZW50cnkpKSBjb250aW51ZTsKKyAgICAgICAgYXV0byBtb3VudF9wb2ludCA9IGZzX21ncl9tb3VudF9wb2ludChlbnRyeS5tb3VudF9wb2ludCk7CisgICAgICAgIGlmIChmc19tZ3Jfb3ZlcmxheWZzX2FscmVhZHlfbW91bnRlZChtb3VudF9wb2ludCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChzY3JhdGNoX2Nhbl9iZV9tb3VudGVkKSB7CisgICAgICAgICAgICBzY3JhdGNoX2Nhbl9iZV9tb3VudGVkID0gZmFsc2U7CisgICAgICAgICAgICBUcnlNb3VudFNjcmF0Y2goKTsKKyAgICAgICAgfQorICAgICAgICByZXQgJj0gZnNfbWdyX292ZXJsYXlmc19tb3VudF9vbmUoZW50cnkpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitib29sIGZzX21ncl9vdmVybGF5ZnNfaXNfc2V0dXAoKSB7CisgICAgaWYgKCFPdmVybGF5ZnNTZXR1cEFsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChmc19tZ3Jfb3ZlcmxheWZzX2FscmVhZHlfbW91bnRlZChrU2NyYXRjaE1vdW50UG9pbnQsIGZhbHNlKSkgcmV0dXJuIHRydWU7CisgICAgRnN0YWIgZnN0YWI7CisgICAgaWYgKCFSZWFkRGVmYXVsdEZzdGFiKCZmc3RhYikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogZnNfbWdyX292ZXJsYXlmc19jYW5kaWRhdGVfbGlzdChmc3RhYikpIHsKKyAgICAgICAgaWYgKGZzX21ncl9pc192ZXJpdHlfZW5hYmxlZChlbnRyeSkpIGNvbnRpbnVlOworICAgICAgICBpZiAoZnNfbWdyX292ZXJsYXlmc19hbHJlYWR5X21vdW50ZWQoZnNfbWdyX21vdW50X3BvaW50KGVudHJ5Lm1vdW50X3BvaW50KSkpIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgZnNfbWdyX292ZXJsYXlmc19hbHJlYWR5X21vdW50ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50X3BvaW50LCBib29sIG92ZXJsYXlfb25seSkgeworICAgIEZzdGFiIGZzdGFiOworICAgIGlmICghUmVhZEZzdGFiRnJvbVByb2NNb3VudHMoJmZzdGFiKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNvbnN0IGF1dG8gbG93ZXJkaXIgPSBrTG93ZXJkaXJPcHRpb24gKyBtb3VudF9wb2ludDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogR2V0RW50cmllc0Zvck1vdW50UG9pbnQoJmZzdGFiLCBtb3VudF9wb2ludCkpIHsKKyAgICAgICAgaWYgKCFvdmVybGF5X29ubHkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChlbnRyeS0+ZnNfdHlwZSAhPSAib3ZlcmxheSIgJiYgZW50cnktPmZzX3R5cGUgIT0gIm92ZXJsYXlmcyIpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGNvbnN0IGF1dG8gb3B0aW9ucyA9IGFuZHJvaWQ6OmJhc2U6OlNwbGl0KGVudHJ5LT5mc19vcHRpb25zLCAiLCIpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIG9wdCA6IG9wdGlvbnMpIHsKKyAgICAgICAgICAgIGlmIChvcHQgPT0gbG93ZXJkaXIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBmc19tZ3IgeworCit2b2lkIE1vdW50T3ZlcmxheWZzKGNvbnN0IEZzdGFiRW50cnkmIGZzdGFiX2VudHJ5LCBib29sKiBzY3JhdGNoX2Nhbl9iZV9tb3VudGVkKSB7CisgICAgaWYgKCFPdmVybGF5ZnNTZXR1cEFsbG93ZWQoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNvbnN0IGF1dG8gY2FuZGlkYXRlcyA9IGZzX21ncl9vdmVybGF5ZnNfY2FuZGlkYXRlX2xpc3Qoe2ZzdGFiX2VudHJ5fSk7CisgICAgaWYgKGNhbmRpZGF0ZXMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNvbnN0IGF1dG8mIGVudHJ5ID0gY2FuZGlkYXRlcy5mcm9udCgpOworICAgIGlmIChmc19tZ3JfaXNfdmVyaXR5X2VuYWJsZWQoZW50cnkpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY29uc3QgYXV0byBtb3VudF9wb2ludCA9IGZzX21ncl9tb3VudF9wb2ludChlbnRyeS5tb3VudF9wb2ludCk7CisgICAgaWYgKGZzX21ncl9vdmVybGF5ZnNfYWxyZWFkeV9tb3VudGVkKG1vdW50X3BvaW50KSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICgqc2NyYXRjaF9jYW5fYmVfbW91bnRlZCkgeworICAgICAgICAqc2NyYXRjaF9jYW5fYmVfbW91bnRlZCA9IGZhbHNlOworICAgICAgICBpZiAoIWZzX21ncl9vdmVybGF5ZnNfYWxyZWFkeV9tb3VudGVkKGtTY3JhdGNoTW91bnRQb2ludCwgZmFsc2UpKSB7CisgICAgICAgICAgICBUcnlNb3VudFNjcmF0Y2goKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjb25zdCBhdXRvIG9wdGlvbnMgPSBmc19tZ3JfZ2V0X292ZXJsYXlmc19vcHRpb25zKGVudHJ5KTsKKyAgICBpZiAob3B0aW9ucy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZnNfbWdyX292ZXJsYXlmc19tb3VudChtb3VudF9wb2ludCwgb3B0aW9ucyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBmc19tZ3IKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvZnNfbWdyX292ZXJsYXlmc19tb3VudC5oIGIvZnNfbWdyL2ZzX21ncl9vdmVybGF5ZnNfbW91bnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTQxYWIxCi0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2ZzX21ncl9vdmVybGF5ZnNfbW91bnQuaApAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxmc3RhYi9mc3RhYi5oPgorCitjb25zdGV4cHIgY2hhciBrT3ZlcmxheWZzRmlsZUNvbnRleHRbXSA9ICJ1Om9iamVjdF9yOm92ZXJsYXlmc19maWxlOnMwIjsKKworY29uc3RleHByIGNoYXIga1NjcmF0Y2hNb3VudFBvaW50W10gPSAiL21udC9zY3JhdGNoIjsKK2NvbnN0ZXhwciBjaGFyIGtPdmVybGF5VG9wRGlyW10gPSAib3ZlcmxheSI7Citjb25zdGV4cHIgY2hhciBrVXBwZXJOYW1lW10gPSAidXBwZXIiOworY29uc3RleHByIGNoYXIga1dvcmtOYW1lW10gPSAid29yayI7CisKKyNpZiBBTExPV19BREJEX0RJU0FCTEVfVkVSSVRZCitjb25zdGV4cHIgYm9vbCBrQWxsb3dPdmVybGF5ZnMgPSB0cnVlOworI2Vsc2UKK2NvbnN0ZXhwciBib29sIGtBbGxvd092ZXJsYXlmcyA9IGZhbHNlOworI2VuZGlmCisKK2NsYXNzIEF1dG9TZXRGc0NyZWF0ZUNvbiBmaW5hbCB7CisgIHB1YmxpYzoKKyAgICBBdXRvU2V0RnNDcmVhdGVDb24oKSB7fQorICAgIEF1dG9TZXRGc0NyZWF0ZUNvbihjb25zdCBzdGQ6OnN0cmluZyYgY29udGV4dCkgeyBTZXQoY29udGV4dCk7IH0KKyAgICB+QXV0b1NldEZzQ3JlYXRlQ29uKCkgeyBSZXN0b3JlKCk7IH0KKworICAgIGJvb2wgT2soKSBjb25zdCB7IHJldHVybiBva187IH0KKyAgICBib29sIFNldChjb25zdCBzdGQ6OnN0cmluZyYgY29udGV4dCk7CisgICAgYm9vbCBSZXN0b3JlKCk7CisKKyAgcHJpdmF0ZToKKyAgICBib29sIG9rXyA9IGZhbHNlOworICAgIGJvb2wgcmVzdG9yZWRfID0gZmFsc2U7Cit9OworCitib29sIGZzX21ncl9pc19kc3VfcnVubmluZygpOworYm9vbCBmc19tZ3JfZmlsZXN5c3RlbV9oYXNfc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50X3BvaW50KTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGZzX21ncl9tb3VudF9wb2ludChjb25zdCBzdGQ6OnN0cmluZyYgbW91bnRfcG9pbnQpOworYm9vbCBPdmVybGF5ZnNTZXR1cEFsbG93ZWQoYm9vbCB2ZXJib3NlID0gZmFsc2UpOworYm9vbCBNb3VudFNjcmF0Y2goY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9wYXRoLCBib29sIHJlYWRvbmx5ID0gZmFsc2UpOworYm9vbCBmc19tZ3Jfb3ZlcmxheWZzX3Vtb3VudF9zY3JhdGNoKCk7CitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gT3ZlcmxheU1vdW50UG9pbnRzKCk7Citib29sIGZzX21ncl9vdmVybGF5ZnNfYWxyZWFkeV9tb3VudGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBtb3VudF9wb2ludCwgYm9vbCBvdmVybGF5X29ubHkgPSB0cnVlKTsKK2Jvb2wgZnNfbWdyX3dhbnRzX292ZXJsYXlmcyhhbmRyb2lkOjpmc19tZ3I6OkZzdGFiRW50cnkqIGVudHJ5KTsKK2FuZHJvaWQ6OmZzX21ncjo6RnN0YWIgZnNfbWdyX292ZXJsYXlmc19jYW5kaWRhdGVfbGlzdChjb25zdCBhbmRyb2lkOjpmc19tZ3I6OkZzdGFiJiBmc3RhYik7CitzdGQ6OnN0cmluZyBHZXRFbmNvZGVkQmFzZURpckZvck1vdW50UG9pbnQoY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50X3BvaW50KTsKZGlmZiAtLWdpdCBhL2ZzX21nci9mc19tZ3JfcHJpdi5oIGIvZnNfbWdyL2ZzX21ncl9wcml2LmgKaW5kZXggNDZjZGI2Mi4uODRlNDkyNCAxMDA2NDQKLS0tIGEvZnNfbWdyL2ZzX21ncl9wcml2LmgKKysrIGIvZnNfbWdyL2ZzX21ncl9wcml2LmgKQEAgLTIzLDE1ICsyMyw3IEBACiAjaW5jbHVkZSA8ZnNfbWdyLmg+CiAjaW5jbHVkZSA8ZnN0YWIvZnN0YWIuaD4KIAotI2luY2x1ZGUgImZzX21ncl9wcml2X2Jvb3RfY29uZmlnLmgiCi0KLS8qIFRoZSBDSEVDSygpIGluIGxvZ2dpbmcuaCB3aWxsIHVzZSBwcm9ncmFtIGludm9jYXRpb24gbmFtZSBhcyB0aGUgdGFnLgotICogVGh1cywgdGhlIGxvZyB3aWxsIGhhdmUgcHJlZml4ICJpbml0OiAiIHdoZW4gbGliZnNfbWdyIGlzIHN0YXRpY2FsbHkKLSAqIGxpbmtlZCBpbiB0aGUgaW5pdCBwcm9jZXNzLiBUaGlzIG1pZ2h0IGJlIG9wYXF1ZSB3aGVuIGRlYnVnZ2luZy4KLSAqIEFwcGVuZHMgImluIGxpYmZzX21nciIgYXQgdGhlIGVuZCBvZiB0aGUgYWJvcnQgbWVzc2FnZSB0byBleHBsaWNpdGx5Ci0gKiBpbmRpY2F0ZSB0aGUgY2hlY2sgaGFwcGVucyBpbiBmc19tZ3IuCi0gKi8KLSNkZWZpbmUgRlNfTUdSX0NIRUNLKHgpIENIRUNLKHgpIDw8ICJpbiBsaWJmc19tZ3IgIgorI2luY2x1ZGUgImxpYmZzdGFiL2ZzdGFiX3ByaXYuaCIKIAogI2RlZmluZSBGU19NR1JfVEFHICJbbGliZnNfbWdyXSAiCiAKQEAgLTg4LDI5ICs4MCwyNCBAQAogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7CiAKLWJvb2wgZnNfbWdyX3NldF9ibGtfcm8oY29uc3Qgc3RkOjpzdHJpbmcmIGJsb2NrZGV2LCBib29sIHJlYWRvbmx5ID0gdHJ1ZSk7Ci1ib29sIGZzX21ncl91cGRhdGVfZm9yX3Nsb3RzZWxlY3QoYW5kcm9pZDo6ZnNfbWdyOjpGc3RhYiogZnN0YWIpOwogYm9vbCBmc19tZ3JfaXNfZGV2aWNlX3VubG9ja2VkKCk7Ci1jb25zdCBzdGQ6OnN0cmluZyYgZ2V0X2FuZHJvaWRfZHRfZGlyKCk7Ci1ib29sIGlzX2R0X2NvbXBhdGlibGUoKTsKIAotYm9vbCBmc19tZ3JfaXNfZXh0NChjb25zdCBzdGQ6OnN0cmluZyYgYmxrX2RldmljZSk7CiBib29sIGZzX21ncl9pc19mMmZzKGNvbnN0IHN0ZDo6c3RyaW5nJiBibGtfZGV2aWNlKTsKIAotYm9vbCBmc19tZ3JfdGVhcmRvd25fdmVyaXR5KGFuZHJvaWQ6OmZzX21ncjo6RnN0YWJFbnRyeSogZnN0YWIpOwotCiBib29sIGZzX21ncl9maWxlc3lzdGVtX2F2YWlsYWJsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZXN5c3RlbSk7CiBzdGQ6OnN0cmluZyBmc19tZ3JfZ2V0X2NvbnRleHQoY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50X3BvaW50KTsKIAotZW51bSBjbGFzcyBPdmVybGF5ZnNWYWxpZFJlc3VsdCB7Ci0gICAga05vdFN1cHBvcnRlZCA9IDAsCi0gICAga09rLAotICAgIGtPdmVycmlkZUNyZWRzUmVxdWlyZWQsCi19OwotT3ZlcmxheWZzVmFsaWRSZXN1bHQgZnNfbWdyX292ZXJsYXlmc192YWxpZCgpOwotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgZnNfbWdyIHsKKwogYm9vbCBVbm1hcERldmljZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSk7CisKK3N0cnVjdCBPdmVybGF5ZnNDaGVja1Jlc3VsdCB7CisgICAgYm9vbCBzdXBwb3J0ZWQ7CisgICAgc3RkOjpzdHJpbmcgbW91bnRfZmxhZ3M7Cit9OworCitPdmVybGF5ZnNDaGVja1Jlc3VsdCBDaGVja092ZXJsYXlmcygpOworCiB9ICAvLyBuYW1lc3BhY2UgZnNfbWdyCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2ZzX21ncl9wcml2X2Jvb3RfY29uZmlnLmggYi9mc19tZ3IvZnNfbWdyX3ByaXZfYm9vdF9jb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEzODQwMS4uMDAwMDAwMAotLS0gYS9mc19tZ3IvZnNfbWdyX3ByaXZfYm9vdF9jb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9fQ09SRV9GU19NR1JfUFJJVl9CT09UQ09ORklHX0gKLSNkZWZpbmUgX19DT1JFX0ZTX01HUl9QUklWX0JPT1RDT05GSUdfSAotCi0jaW5jbHVkZSA8c3lzL2NkZWZzLmg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi1zdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4gZnNfbWdyX3BhcnNlX2NtZGxpbmUoY29uc3Qgc3RkOjpzdHJpbmcmIGNtZGxpbmUpOwotCi1ib29sIGZzX21ncl9nZXRfYm9vdF9jb25maWdfZnJvbV9rZXJuZWwoY29uc3Qgc3RkOjpzdHJpbmcmIGNtZGxpbmUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG91dF92YWwpOwotYm9vbCBmc19tZ3JfZ2V0X2Jvb3RfY29uZmlnX2Zyb21fa2VybmVsX2NtZGxpbmUoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgc3RkOjpzdHJpbmcqIG91dF92YWwpOwotYm9vbCBmc19tZ3JfZ2V0X2Jvb3RfY29uZmlnKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIHN0ZDo6c3RyaW5nKiBvdXRfdmFsKTsKLXN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiBmc19tZ3JfcGFyc2VfcHJvY19ib290Y29uZmlnKAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYm9vdGNvbmZpZyk7Ci1ib29sIGZzX21ncl9nZXRfYm9vdF9jb25maWdfZnJvbV9ib290Y29uZmlnKGNvbnN0IHN0ZDo6c3RyaW5nJiBib290Y29uZmlnLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogb3V0X3ZhbCk7Ci1ib29sIGZzX21ncl9nZXRfYm9vdF9jb25maWdfZnJvbV9ib290Y29uZmlnX3NvdXJjZShjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBzdGQ6OnN0cmluZyogb3V0X3ZhbCk7Ci0KLSNlbmRpZiAvKiBfX0NPUkVfRlNfTUdSX1BSSVZfQk9PVENPTkZJR19IICovCmRpZmYgLS1naXQgYS9mc19tZ3IvZnNfbWdyX3ByaXZfb3ZlcmxheWZzLmggYi9mc19tZ3IvZnNfbWdyX3ByaXZfb3ZlcmxheWZzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMzM3MDEuLjAwMDAwMDAKLS0tIGEvZnNfbWdyL2ZzX21ncl9wcml2X292ZXJsYXlmcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSA8ZnN0YWIvZnN0YWIuaD4KLQotYm9vbCBmc19tZ3Jfb3ZlcmxheWZzX2FscmVhZHlfbW91bnRlZChjb25zdCBzdGQ6OnN0cmluZyYgbW91bnRfcG9pbnQsIGJvb2wgb3ZlcmxheV9vbmx5ID0gdHJ1ZSk7Ci1ib29sIGZzX21ncl93YW50c19vdmVybGF5ZnMoYW5kcm9pZDo6ZnNfbWdyOjpGc3RhYkVudHJ5KiBlbnRyeSk7Ci1hbmRyb2lkOjpmc19tZ3I6OkZzdGFiIGZzX21ncl9vdmVybGF5ZnNfY2FuZGlkYXRlX2xpc3QoY29uc3QgYW5kcm9pZDo6ZnNfbWdyOjpGc3RhYiYgZnN0YWIpOwotCi0vLyBJZiAibW91bnRfcG9pbnQiIGlzIG5vbi1udWxsLCBzZXQgdXAgZXhhY3RseSBvbmUgb3ZlcmxheS4KLS8vIElmICJtb3VudF9wb2ludCIgaXMgbnVsbCwgc2V0dXAgYW55IG92ZXJsYXlzLgotLy8KLS8vIElmIHx3YW50X3JlYm9vdHwgaXMgbm9uLW51bGwsIGFuZCBhIHJlYm9vdCBpcyBuZWVkZWQgdG8gYXBwbHkgb3ZlcmxheXMsIHRoZW4KLS8vIGl0IHdpbGwgYmUgdHJ1ZSBvbiByZXR1cm4uIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGluaXRpYWxpemluZyBpdC4KLWJvb2wgZnNfbWdyX292ZXJsYXlmc19zZXR1cChjb25zdCBhbmRyb2lkOjpmc19tZ3I6OkZzdGFiJiBmc3RhYiwgY29uc3QgY2hhciogbW91bnRfcG9pbnQgPSBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIHdhbnRfcmVib290ID0gbnVsbHB0ciwgYm9vbCBqdXN0X2Rpc2FibGVkX3Zlcml0eSA9IHRydWUpOwotCi1lbnVtIGNsYXNzIE92ZXJsYXlmc1RlYXJkb3duUmVzdWx0IHsKLSAgICBPaywKLSAgICBCdXN5LCAgLy8gSW5kaWNhdGVzIHRoYXQgb3ZlcmxheXMgYXJlIHN0aWxsIGluIHVzZS4KLSAgICBFcnJvcgotfTsKLU92ZXJsYXlmc1RlYXJkb3duUmVzdWx0IGZzX21ncl9vdmVybGF5ZnNfdGVhcmRvd24oY29uc3QgY2hhciogbW91bnRfcG9pbnQgPSBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiB3YW50X3JlYm9vdCA9IG51bGxwdHIpOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgZnNfbWdyIHsKLQotdm9pZCBDbGVhbnVwT2xkU2NyYXRjaEZpbGVzKCk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBmc19tZ3IKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvZnNfbWdyX3JlbW91bnQuY3BwIGIvZnNfbWdyL2ZzX21ncl9yZW1vdW50LmNwcAppbmRleCA1YTlmMzkxLi5mOTFkMjMyIDEwMDY0NAotLS0gYS9mc19tZ3IvZnNfbWdyX3JlbW91bnQuY3BwCisrKyBiL2ZzX21nci9mc19tZ3JfcmVtb3VudC5jcHAKQEAgLTQyLDggKzQyLDEwIEBACiAjaW5jbHVkZSA8ZnN0YWIvZnN0YWIuaD4KICNpbmNsdWRlIDxsaWJhdmJfdXNlci9saWJhdmJfdXNlci5oPgogI2luY2x1ZGUgPGxpYmdzaS9saWJnc2lkLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAKLSNpbmNsdWRlICJmc19tZ3JfcHJpdl9vdmVybGF5ZnMuaCIKKyNpbmNsdWRlICJmc19tZ3Jfb3ZlcmxheWZzX2NvbnRyb2wuaCIKKyNpbmNsdWRlICJmc19tZ3Jfb3ZlcmxheWZzX21vdW50LmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ6OmxpdGVyYWxzOwogdXNpbmcgYW5kcm9pZDo6ZnNfbWdyOjpGc3RhYjsKQEAgLTg3LDE3ICs4OSw2IEBACiAgICAgcmV0dXJuIGVudHJ5Lm1vdW50X3BvaW50OwogfQogCi1jb25zdCBGc3RhYkVudHJ5KiBHZXRXcmFwcGVkRW50cnkoY29uc3QgRnN0YWImIG92ZXJsYXlmc19jYW5kaWRhdGVzLCBjb25zdCBGc3RhYkVudHJ5JiBlbnRyeSkgewotICAgIGF1dG8gbW91bnRfcG9pbnQgPSBzeXN0ZW1fbW91bnRfcG9pbnQoZW50cnkpOwotICAgIGF1dG8gaXQgPSBzdGQ6OmZpbmRfaWYob3ZlcmxheWZzX2NhbmRpZGF0ZXMuYmVnaW4oKSwgb3ZlcmxheWZzX2NhbmRpZGF0ZXMuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBbJm1vdW50X3BvaW50XShjb25zdCBhdXRvJiBlbnRyeSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpTdGFydHNXaXRoKG1vdW50X3BvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbV9tb3VudF9wb2ludChlbnRyeSkgKyAiLyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgaWYgKGl0ID09IG92ZXJsYXlmc19jYW5kaWRhdGVzLmVuZCgpKSByZXR1cm4gbnVsbHB0cjsKLSAgICByZXR1cm4gJigqaXQpOwotfQotCiBjbGFzcyBNeUxvZ2dlciB7CiAgIHB1YmxpYzoKICAgICBleHBsaWNpdCBNeUxvZ2dlcihib29sIHZlcmJvc2UpIDogdmVyYm9zZV8odmVyYm9zZSkge30KQEAgLTEyNywxMiArMTE4LDExIEBACiB9CiAKIHN0YXRpYyBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGQ+IEdldFZvbGQoKSB7CisgICAgYXV0byBzbSA9IGFuZHJvaWQ6OmRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwogICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIGlmIChhdXRvIHNtID0gYW5kcm9pZDo6ZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCkpIHsKLSAgICAgICAgICAgIGlmIChhdXRvIGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKGFuZHJvaWQ6OlN0cmluZzE2KCJ2b2xkIikpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGF1dG8gdm9sZCA9IGFuZHJvaWQ6OmludGVyZmFjZV9jYXN0PGFuZHJvaWQ6Om9zOjpJVm9sZD4oYmluZGVyKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9sZDsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIGlmIChhdXRvIGJpbmRlciA9IHNtLT5jaGVja1NlcnZpY2UoYW5kcm9pZDo6U3RyaW5nMTYoInZvbGQiKSkpIHsKKyAgICAgICAgICAgIGlmIChhdXRvIHZvbGQgPSBhbmRyb2lkOjppbnRlcmZhY2VfY2FzdDxhbmRyb2lkOjpvczo6SVZvbGQ+KGJpbmRlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdm9sZDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoMnMpOwpAQCAtMTY5LDE1ICsxNTksMjYgQEAKICAgICAvLyBub3QgY2hlY2twb2ludGluZy4KICAgICBhdXRvIHZvbGQgPSBHZXRWb2xkKCk7CiAgICAgYm9vbCBjaGVja3BvaW50aW5nID0gZmFsc2U7Ci0gICAgaWYgKCF2b2xkLT5pc0NoZWNrcG9pbnRpbmcoJmNoZWNrcG9pbnRpbmcpLmlzT2soKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgZGV0ZXJtaW5lIGNoZWNrcG9pbnRpbmcgc3RhdHVzLiI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKGNoZWNrcG9pbnRpbmcpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IHVzZSByZW1vdW50IHdoZW4gYSBjaGVja3BvaW50IGlzIGluIHByb2dyZXNzLiI7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIlRvIGZvcmNlIGVuZCBjaGVja3BvaW50aW5nLCBjYWxsICd2ZGMgY2hlY2twb2ludCBjb21taXRDaGFuZ2VzJyI7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIldhcm5pbmc6IHRoaXMgY2FuIGxlYWQgdG8gZGF0YSBjb3JydXB0aW9uIGlmIHJvbGxlZCBiYWNrLiI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBib29sIHNob3dfaGVscCA9IHRydWU7CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAoIXZvbGQtPmlzQ2hlY2twb2ludGluZygmY2hlY2twb2ludGluZykuaXNPaygpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgZGV0ZXJtaW5lIGNoZWNrcG9pbnRpbmcgc3RhdHVzLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjaGVja3BvaW50aW5nKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2hvd19oZWxwKSB7CisgICAgICAgICAgICBzaG93X2hlbHAgPSBmYWxzZTsKKyAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiV0FSTklORzogVXNlcmRhdGEgY2hlY2twb2ludCBpcyBpbiBwcm9ncmVzcy4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICJUbyBmb3JjaWJseSBlbmQgY2hlY2twb2ludGluZywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJjYWxsICd2ZGMgY2hlY2twb2ludCBjb21taXRDaGFuZ2VzJy4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGNhbiBsZWFkIHRvIGRhdGEgY29ycnVwdGlvbiBpZiByb2xsZWQgYmFjay4iCisgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgTE9HKElORk8pIDw8ICJXYWl0aW5nIGZvciBjaGVja3BvaW50IHRvIGNvbXBsZXRlIGJlZm9yZSByZW1vdW50aW5nLi4uIjsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoNHMpOwogICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKIH0KQEAgLTE5Niw5ICsxOTcsNiBAQAogICAgIGlmIChhdXRvIGNhbmRpZGF0ZV9lbnRyeSA9IEdldEVudHJ5Rm9yTW91bnRQb2ludCgmY2FuZGlkYXRlcywgZW50cnkubW91bnRfcG9pbnQpKSB7CiAgICAgICAgIHJldHVybiBjYW5kaWRhdGVfZW50cnktPmZzX3R5cGUgPT0gZW50cnkuZnNfdHlwZTsKICAgICB9Ci0gICAgaWYgKEdldFdyYXBwZWRFbnRyeShjYW5kaWRhdGVzLCBlbnRyeSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtMjUyLDExICsyNTAsNiBAQAogICAgICAgICB9CiAKICAgICAgICAgY29uc3QgRnN0YWJFbnRyeSogZW50cnkgPSAmKml0OwotICAgICAgICBpZiAoYXV0byB3cmFwID0gR2V0V3JhcHBlZEVudHJ5KGNhbmRpZGF0ZXMsICplbnRyeSk7IHdyYXAgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgTE9HKElORk8pIDw8ICJwYXJ0aXRpb24gIiA8PCBhcmcgPDwgIiBjb3ZlcmVkIGJ5IG92ZXJsYXlmcyBmb3IgIiA8PCB3cmFwLT5tb3VudF9wb2ludAotICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIHN3aXRjaGluZyI7Ci0gICAgICAgICAgICBlbnRyeSA9IHdyYXA7Ci0gICAgICAgIH0KIAogICAgICAgICAvLyBJZiBpdCdzIGFscmVhZHkgcmVtb3VudGVkLCBpbmNsdWRlIGl0IHNvIGl0IGdldHMgZ3JhY2VmdWxseSBza2lwcGVkCiAgICAgICAgIC8vIGxhdGVyIG9uLgpAQCAtMzg5LDggKzM4Miw4IEBACiAKICAgICAvLyBOb3cgcmVtb3VudCEKICAgICBmb3IgKGNvbnN0IGF1dG8mIG1udF9wb2ludCA6IHttb3VudF9wb2ludCwgZW50cnkubW91bnRfcG9pbnR9KSB7Ci0gICAgICAgIGlmICg6Om1vdW50KGJsa19kZXZpY2UuY19zdHIoKSwgbW50X3BvaW50LmNfc3RyKCksIGVudHJ5LmZzX3R5cGUuY19zdHIoKSwgTVNfUkVNT1VOVCwKLSAgICAgICAgICAgICAgICAgICAgbnVsbHB0cikgPT0gMCkgeworICAgICAgICBpZiAoOjptb3VudChibGtfZGV2aWNlLmNfc3RyKCksIG1udF9wb2ludC5jX3N0cigpLCBlbnRyeS5mc190eXBlLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgIE1TX1JFTU9VTlQgfCBNU19OT0FUSU1FLCBudWxscHRyKSA9PSAwKSB7CiAgICAgICAgICAgICBMT0coSU5GTykgPDwgIlJlbW91bnRlZCAiIDw8IG1udF9wb2ludCA8PCAiIGFzIFJXIjsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CkBAIC02MTcsNyArNjEwLDE5IEBACiAgICAgfQogCiAgICAgLy8gTWFrZSBzdXJlIHdlIGFyZSByb290LgotICAgIGlmICg6OmdldHVpZCgpICE9IDApIHsKKyAgICBpZiAoY29uc3QgYXV0byB1aWQgPSA6OmdldHVpZCgpOyB1aWQgIT0gQUlEX1JPT1QpIHsKKyAgICAgICAgLy8gSWYgcmVxdWVzdGluZyBhdXRvIHJlYm9vdCwgYWxzbyB0cnkgdG8gYXV0byBnYWluIHJvb3QuCisgICAgICAgIGlmIChhdXRvX3JlYm9vdCAmJiB1aWQgPT0gQUlEX1NIRUxMICYmIGFjY2VzcygiL3N5c3RlbS94YmluL3N1IiwgRl9PSykgPT0gMCkgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y2hhcio+IGFyZ3N7Y29uc3RfY2FzdDxjaGFyKj4oIi9zeXN0ZW0veGJpbi9zdSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4oInJvb3QiKX07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ2M7ICsraSkgeworICAgICAgICAgICAgICAgIGFyZ3MucHVzaF9iYWNrKGFyZ3ZbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXJncy5wdXNoX2JhY2sobnVsbHB0cik7CisgICAgICAgICAgICBMT0coSU5GTykgPDwgIkF0dGVtcHRpbmcgdG8gZ2FpbiByb290IHdpdGggXCJzdSByb290XCIiOworICAgICAgICAgICAgZXhlY3YoYXJnc1swXSwgYXJncy5kYXRhKCkpOworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBleGVjdXRlIFwic3Ugcm9vdFwiIjsKKyAgICAgICAgfQogICAgICAgICBMT0coRVJST1IpIDw8ICJOb3QgcnVubmluZyBhcyByb290LiBUcnkgXCJhZGIgcm9vdFwiIGZpcnN0LiI7CiAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZnNfbWdyL2ZzX21ncl9yb290cy5jcHAgYi9mc19tZ3IvZnNfbWdyX3Jvb3RzLmNwcAppbmRleCAyYWQ4MTI1Li5hNjk3ZmIzIDEwMDY0NAotLS0gYS9mc19tZ3IvZnNfbWdyX3Jvb3RzLmNwcAorKysgYi9mc19tZ3IvZnNfbWdyX3Jvb3RzLmNwcApAQCAtMTE1LDggKzExNSw4IEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3VwcG9ydGVkX2ZzeyJleHQ0IiwgInNxdWFzaGZzIiwgInZmYXQiLCAiZjJmcyIsICJlcm9mcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vbmUifTsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN1cHBvcnRlZF9mc3siZXh0NCIsICJzcXVhc2hmcyIsICJ2ZmF0IiwgImV4ZmF0IiwgImYyZnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcm9mcyIsICJub25lIn07CiAgICAgaWYgKHN0ZDo6ZmluZChzdXBwb3J0ZWRfZnMuYmVnaW4oKSwgc3VwcG9ydGVkX2ZzLmVuZCgpLCByZWMtPmZzX3R5cGUpID09IHN1cHBvcnRlZF9mcy5lbmQoKSkgewogICAgICAgICBMRVJST1IgPDwgInVua25vd24gZnNfdHlwZSBcIiIgPDwgcmVjLT5mc190eXBlIDw8ICJcIiBmb3IgIiA8PCBtb3VudF9wb2ludDsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvZnNfbWdyL2ZzX21ncl92ZW5kb3Jfb3ZlcmxheS5jcHAgYi9mc19tZ3IvZnNfbWdyX3ZlbmRvcl9vdmVybGF5LmNwcAppbmRleCA2YjMyYjRkLi42Njg3MjgzIDEwMDY0NAotLS0gYS9mc19tZ3IvZnNfbWdyX3ZlbmRvcl9vdmVybGF5LmNwcAorKysgYi9mc19tZ3IvZnNfbWdyX3ZlbmRvcl9vdmVybGF5LmNwcApAQCAtMzYsNyArMzYsNyBAQAogCiAvLyBUaGUgb3JkZXIgb2YgdGhlIGxpc3QgbWVhbnMgdGhlIHByaW9yaXR5IHRvIHNob3cgdGhlIGZpbGVzIGluIHRoZSBkaXJlY3RvcnkuCiAvLyBUaGUgbGFzdCBvbmUgaGFzIHRoZSBoaWdoZXN0IHByaW9yaXR5LgotY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3Qgc3RkOjpzdHJpbmc+IGtWZW5kb3JPdmVybGF5U291cmNlRGlycyA9IHsKK2NvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBrVmVuZG9yT3ZlcmxheVNvdXJjZURpcnMgPSB7CiAgICAgICAgICIvc3lzdGVtL3ZlbmRvcl9vdmVybGF5LyIsCiAgICAgICAgICIvcHJvZHVjdC92ZW5kb3Jfb3ZlcmxheS8iLAogfTsKQEAgLTg1LDEwICs4NSw4IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBhdXRvIG9wdGlvbnMgPSBrTG93ZXJkaXJPcHRpb24gKyBzb3VyY2VfZGlyZWN0b3J5ICsgIjoiICsgdmVuZG9yX21vdW50X3BvaW50OwotICAgIGlmIChmc19tZ3Jfb3ZlcmxheWZzX3ZhbGlkKCkgPT0gT3ZlcmxheWZzVmFsaWRSZXN1bHQ6OmtPdmVycmlkZUNyZWRzUmVxdWlyZWQpIHsKLSAgICAgICAgb3B0aW9ucyArPSAiLG92ZXJyaWRlX2NyZWRzPW9mZiI7Ci0gICAgfQorICAgIGNvbnN0IGF1dG8gb3B0aW9ucyA9IGtMb3dlcmRpck9wdGlvbiArIHNvdXJjZV9kaXJlY3RvcnkgKyAiOiIgKyB2ZW5kb3JfbW91bnRfcG9pbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmZzX21ncjo6Q2hlY2tPdmVybGF5ZnMoKS5tb3VudF9mbGFnczsKICAgICBhdXRvIHJlcG9ydCA9ICJfX21vdW50KHNvdXJjZT1vdmVybGF5LHRhcmdldD0icyArIHZlbmRvcl9tb3VudF9wb2ludCArICIsdHlwZT1vdmVybGF5LCIgKwogICAgICAgICAgICAgICAgICAgb3B0aW9ucyArICIpPSI7CiAgICAgYXV0byByZXQgPSBtb3VudCgib3ZlcmxheSIsIHZlbmRvcl9tb3VudF9wb2ludC5jX3N0cigpLCAib3ZlcmxheSIsIE1TX1JET05MWSB8IE1TX05PQVRJTUUsCkBAIC0xMTQsMTMgKzExMiwxNCBAQAogICAgIC8vIHByb3BlcnRpZXMgYXJlIGxvYWRlZC4KICAgICBzdGF0aWMgY29uc3QgYXV0byB2bmRrX3ZlcnNpb24gPSBhbmRyb2lkOjpiYXNlOjpHZXRQcm9wZXJ0eShrVm5ka1ZlcnNpb25Qcm9wZXJ0eU5hbWUsICIiKTsKICAgICBpZiAodm5ka192ZXJzaW9uLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gVmVuZG9yIG92ZXJsYXkgaXMgZGlzYWJsZWQgZnJvbSBWTkRLIGRlcHJlY2F0ZWQgZGV2aWNlcy4KICAgICAgICAgTElORk8gPDwgInZlbmRvciBvdmVybGF5OiB2bmRrIHZlcnNpb24gbm90IGRlZmluZWQiOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgY29uc3QgYXV0byB2ZW5kb3Jfb3ZlcmxheV9kaXJzID0gZnNfbWdyX2dldF92ZW5kb3Jfb3ZlcmxheV9kaXJzKHZuZGtfdmVyc2lvbik7CiAgICAgaWYgKHZlbmRvcl9vdmVybGF5X2RpcnMuZW1wdHkoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGZzX21ncl9vdmVybGF5ZnNfdmFsaWQoKSA9PSBPdmVybGF5ZnNWYWxpZFJlc3VsdDo6a05vdFN1cHBvcnRlZCkgeworICAgIGlmICghYW5kcm9pZDo6ZnNfbWdyOjpDaGVja092ZXJsYXlmcygpLnN1cHBvcnRlZCkgewogICAgICAgICBMSU5GTyA8PCAidmVuZG9yIG92ZXJsYXk6IGtlcm5lbCBkb2VzIG5vdCBzdXBwb3J0IG92ZXJsYXlmcyI7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CmRpZmYgLS1naXQgYS9mc19tZ3IvaW5jbHVkZS9mc19tZ3IuaCBiL2ZzX21nci9pbmNsdWRlL2ZzX21nci5oCmluZGV4IDQzZGU2ZDguLjc5NjkwODcgMTAwNjQ0Ci0tLSBhL2ZzX21nci9pbmNsdWRlL2ZzX21nci5oCisrKyBiL2ZzX21nci9pbmNsdWRlL2ZzX21nci5oCkBAIC01OCwxMyArNTgsOCBAQAogI2RlZmluZSBGU19NR1JfTU5UQUxMX0RFVl9ORUVEU19SRUNPVkVSWSA0CiAjZGVmaW5lIEZTX01HUl9NTlRBTExfREVWX05PVF9FTkNSWVBUQUJMRSAwCiAjZGVmaW5lIEZTX01HUl9NTlRBTExfRkFJTCAoLTEpCi0KLXN0cnVjdCBNb3VudEFsbFJlc3VsdCB7Ci0gICAgLy8gT25lIG9mIHRoZSBGU19NR1JfTU5UQUxMXyogcmV0dXJuZWQgY29kZSBkZWZpbmVkIGFib3ZlLgotICAgIGludCBjb2RlOwotICAgIC8vIFdoZXRoZXIgdXNlcmRhdGEgd2FzIG1vdW50ZWQgYXMgYSByZXN1bHQgb2YgfGZzX21ncl9tb3VudF9hbGx8IGNhbGwuCi0gICAgYm9vbCB1c2VyZGF0YV9tb3VudGVkOwotfTsKKy8vIGZzX21ncl9tb3VudF9hbGwoKSB1cGRhdGVzIGZzdGFiIGVudHJpZXMgdGhhdCByZWZlcmVuY2UgZGV2aWNlLW1hcHBlci4KK2ludCBmc19tZ3JfbW91bnRfYWxsKGFuZHJvaWQ6OmZzX21ncjo6RnN0YWIqIGZzdGFiLCBpbnQgbW91bnRfbW9kZSk7CiAKIHN0cnVjdCBIYXNodHJlZUluZm8gewogICAgIC8vIFRoZSBoYXNoIGFsZ29yaXRobSB1c2VkIHRvIGJ1aWxkIHRoZSBtZXJrbGUgdHJlZS4KQEAgLTc1LDIzICs3MCwxMyBAQAogICAgIGJvb2wgY2hlY2tfYXRfbW9zdF9vbmNlOwogfTsKIAotLy8gZnNfbWdyX21vdW50X2FsbCgpIHVwZGF0ZXMgZnN0YWIgZW50cmllcyB0aGF0IHJlZmVyZW5jZSBkZXZpY2UtbWFwcGVyLgotLy8gUmV0dXJucyBhIHxNb3VudEFsbFJlc3VsdHwuIFRoZSBmaXJzdCBlbGVtZW50IGlzIG9uZSBvZiB0aGUgRlNfTU5HX01OVEFMTF8qIHJldHVybiBjb2RlcwotLy8gZGVmaW5lZCBhYm92ZSwgYW5kIHRoZSBzZWNvbmQgZWxlbWVudCB0ZWxscyB3aGV0aGVyIHRoaXMgY2FsbCB0byBmc19tZ3JfbW91bnRfYWxsIHdhcyByZXNwb25zaWJsZQotLy8gZm9yIG1vdW50aW5nIHVzZXJkYXRhLiBMYXRlciBpcyByZXF1aXJlZCBmb3IgaW5pdCB0byBjb3JyZWN0bHkgZW5xdWV1ZSBmcy1yZWxhdGVkIGV2ZW50cyBhcyBwYXJ0Ci0vLyBvZiB1c2VyZGF0YSByZW1vdW50IGR1cmluZyB1c2Vyc3BhY2UgcmVib290LgotTW91bnRBbGxSZXN1bHQgZnNfbWdyX21vdW50X2FsbChhbmRyb2lkOjpmc19tZ3I6OkZzdGFiKiBmc3RhYiwgaW50IG1vdW50X21vZGUpOwotCiAjZGVmaW5lIEZTX01HUl9ET01OVF9GQUlMRUQgKC0xKQogI2RlZmluZSBGU19NR1JfRE9NTlRfQlVTWSAoLTIpCiAjZGVmaW5lIEZTX01HUl9ET01OVF9TVUNDRVNTIDAKLWludCBmc19tZ3JfZG9fbW91bnQoYW5kcm9pZDo6ZnNfbWdyOjpGc3RhYiogZnN0YWIsIGNvbnN0IGNoYXIqIG5fbmFtZSwgY2hhciogbl9ibGtfZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICBjaGFyKiB0bXBfbW91bnRfcG9pbnQpOwotaW50IGZzX21ncl9kb19tb3VudChhbmRyb2lkOjpmc19tZ3I6OkZzdGFiKiBmc3RhYiwgY29uc3QgY2hhciogbl9uYW1lLCBjaGFyKiBuX2Jsa19kZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgIGNoYXIqIHRtcF9tb3VudF9wb2ludCwgYm9vbCBuZWVkX2NwLCBib29sIG1ldGFkYXRhX2VuY3J5cHRlZCk7CitpbnQgZnNfbWdyX2RvX21vdW50KGFuZHJvaWQ6OmZzX21ncjo6RnN0YWIqIGZzdGFiLCBjb25zdCBzdGQ6OnN0cmluZyYgbl9uYW1lLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbl9ibGtfZGV2aWNlLCBpbnQgbmVlZHNfY2hlY2twb2ludCwgYm9vbCBuZWVkc19lbmNyeXB0KTsKIGludCBmc19tZ3JfZG9fbW91bnRfb25lKGNvbnN0IGFuZHJvaWQ6OmZzX21ncjo6RnN0YWJFbnRyeSYgZW50cnksCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbW91bnRfcG9pbnQgPSAiIik7Ci1pbnQgZnNfbWdyX2RvX3RtcGZzX21vdW50KGNvbnN0IGNoYXIgKm5fbmFtZSk7CiBib29sIGZzX21ncl9sb2FkX3Zlcml0eV9zdGF0ZShpbnQqIG1vZGUpOwogLy8gUmV0dXJucyB0cnVlIGlmIHZlcml0eSBpcyBlbmFibGVkIG9uIHRoaXMgcGFydGljdWxhciBGc3RhYkVudHJ5LgogYm9vbCBmc19tZ3JfaXNfdmVyaXR5X2VuYWJsZWQoY29uc3QgYW5kcm9pZDo6ZnNfbWdyOjpGc3RhYkVudHJ5JiBlbnRyeSk7CkBAIC0xMTksNiArMTA0LDEyIEBACiAvLyByZXR1cm5lZC4gT3RoZXJ3aXNlLCBpdCB3aWxsIHVzZSB0aGUgY3VycmVudCBzbG90Lgogc3RkOjpzdHJpbmcgZnNfbWdyX2dldF9zdXBlcl9wYXJ0aXRpb25fbmFtZShpbnQgc2xvdCA9IC0xKTsKIAorLy8gU2V0IHJlYWRvbmx5IGZvciB0aGUgYmxvY2sgZGV2aWNlCitib29sIGZzX21ncl9zZXRfYmxrX3JvKGNvbnN0IHN0ZDo6c3RyaW5nJiBibG9ja2RldiwgYm9vbCByZWFkb25seSA9IHRydWUpOworCisvLyBDaGVjayBpZiB0aGUgYmxvY2sgZGV2aWNlIGhhcyBleHQ0IGZpbGVzeXN0ZW0KK2Jvb2wgZnNfbWdyX2lzX2V4dDQoY29uc3Qgc3RkOjpzdHJpbmcmIGJsa19kZXZpY2UpOworCiBlbnVtIEZzTWdyVW1vdW50U3RhdHVzIDogaW50IHsKICAgICBTVUNDRVNTID0gMCwKICAgICBFUlJPUl9VTktOT1dOID0gMSA8PCAwLApAQCAtMTMwLDExICsxMjEsNiBAQAogLy8gaXQgZGVzdHJveXMgdmVyaXR5IGRldmljZXMgZnJvbSBkZXZpY2UgbWFwcGVyIGFmdGVyIHRoZSBkZXZpY2UgaXMgdW5tb3VudGVkLgogaW50IGZzX21ncl91bW91bnRfYWxsKGFuZHJvaWQ6OmZzX21ncjo6RnN0YWIqIGZzdGFiKTsKIAotLy8gRmluZHMgYSBlbnRyeSBpbiB8ZnN0YWJ8IHRoYXQgd2FzIHVzZWQgdG8gbW91bnQgYSAvZGF0YSBvbiB8ZGF0YV9ibG9ja19kZXZpY2V8LgotYW5kcm9pZDo6ZnNfbWdyOjpGc3RhYkVudHJ5KiBmc19tZ3JfZ2V0X21vdW50ZWRfZW50cnlfZm9yX3VzZXJkYXRhKAotICAgICAgICBhbmRyb2lkOjpmc19tZ3I6OkZzdGFiKiBmc3RhYiwgY29uc3Qgc3RkOjpzdHJpbmcmIGRhdGFfYmxvY2tfZGV2aWNlKTsKLWludCBmc19tZ3JfcmVtb3VudF91c2VyZGF0YV9pbnRvX2NoZWNrcG9pbnRpbmcoYW5kcm9pZDo6ZnNfbWdyOjpGc3RhYiogZnN0YWIpOwotCiAvLyBGaW5kcyB0aGUgZG1fYm93IGRldmljZSBvbiB3aGljaCB0aGlzIGJsb2NrIGRldmljZSBpcyBzdGFja2VkLCBvciByZXR1cm5zCiAvLyBlbXB0eSBzdHJpbmcKIHN0ZDo6c3RyaW5nIGZzX21ncl9maW5kX2Jvd19kZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIGJsb2NrX2RldmljZSk7CkBAIC0xNDcsMyArMTMzLDEwIEBACiAvLyBVbmxpa2UgZnNfbWdyX292ZXJsYXlmcywgbW91bnQgb3ZlcmxheWZzIHdpdGhvdXQgdXBwZXJkaXIgYW5kIHdvcmtkaXIsIHNvIHRoZQogLy8gZmlsZXN5c3RlbSBjYW5ub3QgYmUgcmVtb3VudCByZWFkLXdyaXRlLgogYm9vbCBmc19tZ3JfbW91bnRfb3ZlcmxheWZzX2ZzdGFiX2VudHJ5KGNvbnN0IGFuZHJvaWQ6OmZzX21ncjo6RnN0YWJFbnRyeSYgZW50cnkpOworCisvLyBGaWxlIG5hbWUgdXNlZCB0byB0cmFjayBpZiBlbmNyeXB0aW9uIHdhcyBpbnRlcnJ1cHRlZCwgbGVhZGluZyB0byBhIGtub3duIGJhZCBmcyBzdGF0ZQorc3RkOjpzdHJpbmcgZnNfbWdyX21ldGFkYXRhX2VuY3J5cHRpb25faW5fcHJvZ3Jlc3NfZmlsZV9uYW1lKAorICAgICAgICBjb25zdCBhbmRyb2lkOjpmc19tZ3I6OkZzdGFiRW50cnkmIGVudHJ5KTsKKworLy8gUmV0dXJucyB0aGUgaWRlYWwgYmxvY2sgc2l6ZSBmb3IgbWFrZV9mMmZzLiBSZXR1cm5zIC0xIG9uIGZhaWx1cmUuCitpbnQgZnNfbWdyX2YyZnNfaWRlYWxfYmxvY2tfc2l6ZSgpOwpkaWZmIC0tZ2l0IGEvZnNfbWdyL2luY2x1ZGUvZnNfbWdyL3Jvb3RzLmggYi9mc19tZ3IvaW5jbHVkZS9mc19tZ3Ivcm9vdHMuaAppbmRleCA2NWM1OWNmLi5lMTlmOWFkIDEwMDY0NAotLS0gYS9mc19tZ3IvaW5jbHVkZS9mc19tZ3Ivcm9vdHMuaAorKysgYi9mc19tZ3IvaW5jbHVkZS9mc19tZ3Ivcm9vdHMuaApAQCAtMjksNiArMjksOCBAQAogLy8gZmlyc3QgbWF0Y2ggb3IgbnVsbHB0ci4KIEZzdGFiRW50cnkqIEdldEVudHJ5Rm9yUGF0aChGc3RhYiogZnN0YWIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKTsKIAorc3RkOjp2ZWN0b3I8RnN0YWJFbnRyeSo+IEdldEVudHJpZXNGb3JQYXRoKEZzdGFiKiBmc3RhYiwgY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpOworCiAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgdm9sdW1lICdwYXRoJyBpcyBvbiBpcyBtb3VudGVkLgogLy8gKiBJZiAnbW91bnRfcG9pbnQnIGlzIG51bGxwdHIsIHVzZSBtb3VudCBwb2ludCBpbiBmc3RhYi4gQ2FsbGVyIGNhbiBjYWxsCiAvLyAgIGZzX21ncl9lbnN1cmVfcGF0aF91bm1vdW50ZWQoKSB3aXRoIHRoZSBzYW1lICdwYXRoJyBhcmd1bWVudCB0byB1bm1vdW50LgpkaWZmIC0tZ2l0IGEvZnNfbWdyL2luY2x1ZGUvZnNfbWdyX292ZXJsYXlmcy5oIGIvZnNfbWdyL2luY2x1ZGUvZnNfbWdyX292ZXJsYXlmcy5oCmluZGV4IGJkYWFiYmYuLmJmNjhiMmMgMTAwNjQ0Ci0tLSBhL2ZzX21nci9pbmNsdWRlL2ZzX21ncl9vdmVybGF5ZnMuaAorKysgYi9mc19tZ3IvaW5jbHVkZS9mc19tZ3Jfb3ZlcmxheWZzLmgKQEAgLTMwLDYgKzMwLDkgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBmc19tZ3IgewogCisvLyBNb3VudCB0aGUgb3ZlcmxheWZzIG92ZXJyaWRlIGZvciB8ZnN0YWJfZW50cnl8Lgordm9pZCBNb3VudE92ZXJsYXlmcyhjb25zdCBGc3RhYkVudHJ5JiBmc3RhYl9lbnRyeSwgYm9vbCogc2NyYXRjaF9jYW5fYmVfbW91bnRlZCk7CisKIHZvaWQgTWFwU2NyYXRjaFBhcnRpdGlvbklmTmVlZGVkKEZzdGFiKiBmc3RhYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mKT4mIGluaXQpOwogCmRpZmYgLS1naXQgYS9mc19tZ3IvbGliZG0vQW5kcm9pZC5icCBiL2ZzX21nci9saWJkbS9BbmRyb2lkLmJwCmluZGV4IDVjYzAzNDYuLjFlZmQ3ZGUgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJkbS9BbmRyb2lkLmJwCisrKyBiL2ZzX21nci9saWJkbS9BbmRyb2lkLmJwCkBAIC0xNSw2ICsxNSw3IEBACiAvLwogCiBwYWNrYWdlIHsKKyAgICBkZWZhdWx0X3RlYW06ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX2tlcm5lbCIsCiAgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbIkFuZHJvaWQtQXBhY2hlLTIuMCJdLAogfQogCkBAIC03MSw2ICs3Miw5IEBACiAgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlic3RvcmFnZV9saXRlcmFsc19oZWFkZXJzIiwKKyAgICBdLAogICAgIHNyY3M6IFsiOmxpYmRtX3Rlc3Rfc3JjcyJdLAogICAgIGF1dG9fZ2VuX2NvbmZpZzogdHJ1ZSwKICAgICByZXF1aXJlX3Jvb3Q6IHRydWUsCmRpZmYgLS1naXQgYS9mc19tZ3IvbGliZG0vZG0uY3BwIGIvZnNfbWdyL2xpYmRtL2RtLmNwcAppbmRleCBjNmY5MTkyLi45NGMzMjBhIDEwMDY0NAotLS0gYS9mc19tZ3IvbGliZG0vZG0uY3BwCisrKyBiL2ZzX21nci9saWJkbS9kbS5jcHAKQEAgLTM5LDYgKzM5LDkgQEAKICNpZm5kZWYgRE1fREVGRVJSRURfUkVNT1ZFCiAjZGVmaW5lIERNX0RFRkVSUkVEX1JFTU9WRSAoMSA8PCAxNykKICNlbmRpZgorI2lmbmRlZiBETV9JTUFfTUVBU1VSRU1FTlRfRkxBRworI2RlZmluZSBETV9JTUFfTUVBU1VSRU1FTlRfRkxBRyAoMSA8PCAxOSkKKyNlbmRpZgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgZG0gewpAQCAtMTA2LDYgKzEwOSwxMCBAQAogICAgIGlmICghR2V0RGV2aWNlVW5pcXVlUGF0aChuYW1lLCAmdW5pcXVlX3BhdGgpKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBnZXQgdW5pcXVlIHBhdGggZm9yIGRldmljZSAiIDw8IG5hbWU7CiAgICAgfQorICAgIC8vIEV4cGVjdCB0byBoYXZlIHVldmVudCBnZW5lcmF0ZWQgaWYgdGhlIHVuaXF1ZSBwYXRoIGFjdHVhbGx5IGV4aXN0cy4gVGhpcyBtYXkgbm90IGV4aXN0CisgICAgLy8gaWYgdGhlIGRldmljZSB3YXMgY3JlYXRlZCBidXQgaGFzIG5ldmVyIGJlZW4gYWN0aXZhdGVkIGJlZm9yZSBpdCBnZXRzIGRlbGV0ZWQuCisgICAgYm9vbCBuZWVkX3VldmVudCA9ICF1bmlxdWVfcGF0aC5lbXB0eSgpICYmIGFjY2Vzcyh1bmlxdWVfcGF0aC5jX3N0cigpLCBGX09LKSA9PSAwOworCiAgICAgc3RydWN0IGRtX2lvY3RsIGlvOwogICAgIEluaXRJbygmaW8sIG5hbWUpOwogCkBAIC0xMTYsNyArMTIzLDcgQEAKIAogICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSBhcHByb3ByaWF0ZSB1ZXZlbnQgaXMgZ2VuZXJhdGVkIHNvIHVldmVudGQgd2lsbAogICAgIC8vIGRvIHRoZSByaWdodCB0aGluZyBhbmQgcmVtb3ZlIHRoZSBjb3JyZXNwb25kaW5nIGRldmljZSBub2RlIGFuZCBzeW1saW5rcy4KLSAgICBpZiAoKGlvLmZsYWdzICYgRE1fVUVWRU5UX0dFTkVSQVRFRF9GTEFHKSA9PSAwKSB7CisgICAgaWYgKG5lZWRfdWV2ZW50ICYmIChpby5mbGFncyAmIERNX1VFVkVOVF9HRU5FUkFURURfRkxBRykgPT0gMCkgewogICAgICAgICBMT0coRVJST1IpIDw8ICJEaWRuJ3QgZ2VuZXJhdGUgdWV2ZW50IGZvciBbIiA8PCBuYW1lIDw8ICJdIHJlbW92YWwiOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtNTM2LDYgKzU0MywxMCBAQAogICAgIHJldHVybiBHZXRUYWJsZShuYW1lLCAwLCB0YWJsZSk7CiB9CiAKK2Jvb2wgRGV2aWNlTWFwcGVyOjpHZXRUYWJsZVN0YXR1c0ltYShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgc3RkOjp2ZWN0b3I8VGFyZ2V0SW5mbz4qIHRhYmxlKSB7CisgICAgcmV0dXJuIEdldFRhYmxlKG5hbWUsIERNX0lNQV9NRUFTVVJFTUVOVF9GTEFHLCB0YWJsZSk7Cit9CisKIGJvb2wgRGV2aWNlTWFwcGVyOjpHZXRUYWJsZUluZm8oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHN0ZDo6dmVjdG9yPFRhcmdldEluZm8+KiB0YWJsZSkgewogICAgIHJldHVybiBHZXRUYWJsZShuYW1lLCBETV9TVEFUVVNfVEFCTEVfRkxBRywgdGFibGUpOwogfQpAQCAtNjIyLDggKzYzMywxMiBAQAogCiBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBFeHRyYWN0QmxvY2tEZXZpY2VOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7CiAgICAgc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnN0cmluZ192aWV3IGtEZXZCbG9ja1ByZWZpeCgiL2Rldi9ibG9jay8iKTsKLSAgICBpZiAoYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aChwYXRoLCBrRGV2QmxvY2tQcmVmaXgpKSB7Ci0gICAgICAgIHJldHVybiBwYXRoLnN1YnN0cihrRGV2QmxvY2tQcmVmaXgubGVuZ3RoKCkpOworICAgIHN0ZDo6c3RyaW5nIHJlYWxfcGF0aDsKKyAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlYWxwYXRoKHBhdGgsICZyZWFsX3BhdGgpKSB7CisgICAgICAgIHJlYWxfcGF0aCA9IHBhdGg7CisgICAgfQorICAgIGlmIChhbmRyb2lkOjpiYXNlOjpTdGFydHNXaXRoKHJlYWxfcGF0aCwga0RldkJsb2NrUHJlZml4KSkgeworICAgICAgICByZXR1cm4gcmVhbF9wYXRoLnN1YnN0cihrRGV2QmxvY2tQcmVmaXgubGVuZ3RoKCkpOwogICAgIH0KICAgICByZXR1cm4ge307CiB9CkBAIC03NjgsNSArNzgzLDI1IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgRGV2aWNlTWFwcGVyOjpTZW5kTWVzc2FnZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgdWludDY0X3Qgc2VjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7CisgICAgc3RkOjpzdHJpbmcgaW9jdGxfYnVmZmVyKHNpemVvZihzdHJ1Y3QgZG1faW9jdGwpICsgc2l6ZW9mKHN0cnVjdCBkbV90YXJnZXRfbXNnKSwgMCk7CisgICAgaW9jdGxfYnVmZmVyICs9IG1lc3NhZ2U7CisgICAgaW9jdGxfYnVmZmVyLnB1c2hfYmFjaygnXDAnKTsKKworICAgIHN0cnVjdCBkbV9pb2N0bCogaW8gPSByZWludGVycHJldF9jYXN0PHN0cnVjdCBkbV9pb2N0bCo+KCZpb2N0bF9idWZmZXJbMF0pOworICAgIEluaXRJbyhpbywgbmFtZSk7CisgICAgaW8tPmRhdGFfc2l6ZSA9IGlvY3RsX2J1ZmZlci5zaXplKCk7CisgICAgaW8tPmRhdGFfc3RhcnQgPSBzaXplb2Yoc3RydWN0IGRtX2lvY3RsKTsKKyAgICBzdHJ1Y3QgZG1fdGFyZ2V0X21zZyogbXNnID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IGRtX3RhcmdldF9tc2cqPigmaW9jdGxfYnVmZmVyW3NpemVvZihzdHJ1Y3QgZG1faW9jdGwpXSk7CisgICAgbXNnLT5zZWN0b3IgPSBzZWN0b3I7CisgICAgaWYgKGlvY3RsKGZkXywgRE1fVEFSR0VUX01TRywgaW8pKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJETV9UQVJHRVRfTVNHIGZhaWxlZCI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBkbQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJkbS9kbV90YWJsZS5jcHAgYi9mc19tZ3IvbGliZG0vZG1fdGFibGUuY3BwCmluZGV4IGVmZTAzYWIuLmI1NDY5OTUgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJkbS9kbV90YWJsZS5jcHAKKysrIGIvZnNfbWdyL2xpYmRtL2RtX3RhYmxlLmNwcApAQCAtMzgsMTEgKzM4LDExIEBACiBib29sIERtVGFibGU6OnZhbGlkKCkgY29uc3QgewogICAgIGlmICh0YXJnZXRzXy5lbXB0eSgpKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgIkRldmljZS1tYXBwZXIgdGFibGUgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSB0YXJnZXQuIjsKLSAgICAgICAgcmV0dXJuICIiOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICh0YXJnZXRzX1swXS0+c3RhcnQoKSAhPSAwKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgIkRldmljZS1tYXBwZXIgdGFibGUgbXVzdCBzdGFydCBhdCBsb2dpY2FsIHNlY3RvciAwLiI7Ci0gICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKIH0KZGlmZiAtLWdpdCBhL2ZzX21nci9saWJkbS9kbV90YXJnZXQuY3BwIGIvZnNfbWdyL2xpYmRtL2RtX3RhcmdldC5jcHAKaW5kZXggOTBkOTFhMC4uYjVjYzlhYSAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYmRtL2RtX3RhcmdldC5jcHAKKysrIGIvZnNfbWdyL2xpYmRtL2RtX3RhcmdldC5jcHAKQEAgLTYxLDYgKzYxLDEwIEBACiAgICAgcmV0dXJuIGJsb2NrX2RldmljZV8gKyAiICIgKyBzdGQ6OnRvX3N0cmluZyhwaHlzaWNhbF9zZWN0b3JfKTsKIH0KIAorc3RkOjpzdHJpbmcgRG1UYXJnZXRTdHJpcGU6OkdldFBhcmFtZXRlclN0cmluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gIjIgIiArIHN0ZDo6dG9fc3RyaW5nKGNodW5rc2l6ZSkgKyAiICIgKyBibG9ja19kZXZpY2UwXyArICIgMCAiICsgYmxvY2tfZGV2aWNlMV8gKyAiIDAiOworfQorCiBEbVRhcmdldFZlcml0eTo6RG1UYXJnZXRWZXJpdHkodWludDY0X3Qgc3RhcnQsIHVpbnQ2NF90IGxlbmd0aCwgdWludDMyX3QgdmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYmxvY2tfZGV2aWNlLCBjb25zdCBzdGQ6OnN0cmluZyYgaGFzaF9kZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGF0YV9ibG9ja19zaXplLCB1aW50MzJfdCBoYXNoX2Jsb2NrX3NpemUsCkBAIC0yOTQsNSArMjk4LDQzIEBACiAgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OkpvaW4oYXJndiwgIiAiKTsKIH0KIAorRG1UYXJnZXRUaGluUG9vbDo6RG1UYXJnZXRUaGluUG9vbCh1aW50NjRfdCBzdGFydCwgdWludDY0X3QgbGVuZ3RoLCBjb25zdCBzdGQ6OnN0cmluZyYgbWV0YWRhdGFfZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGF0YV9kZXYsIHVpbnQ2NF90IGRhdGFfYmxvY2tfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgbG93X3dhdGVyX21hcmspCisgICAgOiBEbVRhcmdldChzdGFydCwgbGVuZ3RoKSwKKyAgICAgIG1ldGFkYXRhX2Rldl8obWV0YWRhdGFfZGV2KSwKKyAgICAgIGRhdGFfZGV2XyhkYXRhX2RldiksCisgICAgICBkYXRhX2Jsb2NrX3NpemVfKGRhdGFfYmxvY2tfc2l6ZSksCisgICAgICBsb3dfd2F0ZXJfbWFya18obG93X3dhdGVyX21hcmspIHt9CisKK3N0ZDo6c3RyaW5nIERtVGFyZ2V0VGhpblBvb2w6OkdldFBhcmFtZXRlclN0cmluZygpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gYXJnc3sKKyAgICAgICAgICAgIG1ldGFkYXRhX2Rldl8sCisgICAgICAgICAgICBkYXRhX2Rldl8sCisgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhkYXRhX2Jsb2NrX3NpemVfKSwKKyAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKGxvd193YXRlcl9tYXJrXyksCisgICAgfTsKKyAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6Sm9pbihhcmdzLCAiICIpOworfQorCitib29sIERtVGFyZ2V0VGhpblBvb2w6OlZhbGlkKCkgY29uc3QgeworICAgIC8vIGRhdGFfYmxvY2tfc2l6ZTogbXVzdCBiZSBiZXR3ZWVuIDEyOCAoNjRLQikgYW5kIDIwOTcxNTIgKDFHQikgYW5kIGEgbXVsdGlwbGUgb2YgMTI4ICg2NEtCKQorICAgIGlmIChkYXRhX2Jsb2NrX3NpemVfIDwgMTI4IHx8IGRhdGFfYmxvY2tfc2l6ZV8gPiAyMDk3MTUyKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKGRhdGFfYmxvY2tfc2l6ZV8gJSAxMjgpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworRG1UYXJnZXRUaGluOjpEbVRhcmdldFRoaW4odWludDY0X3Qgc3RhcnQsIHVpbnQ2NF90IGxlbmd0aCwgY29uc3Qgc3RkOjpzdHJpbmcmIHBvb2xfZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgZGV2X2lkKQorICAgIDogRG1UYXJnZXQoc3RhcnQsIGxlbmd0aCksIHBvb2xfZGV2Xyhwb29sX2RldiksIGRldl9pZF8oZGV2X2lkKSB7fQorCitzdGQ6OnN0cmluZyBEbVRhcmdldFRoaW46OkdldFBhcmFtZXRlclN0cmluZygpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gYXJnc3sKKyAgICAgICAgICAgIHBvb2xfZGV2XywKKyAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKGRldl9pZF8pLAorICAgIH07CisgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OkpvaW4oYXJncywgIiAiKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGRtCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYmRtL2RtX3Rlc3QuY3BwIGIvZnNfbWdyL2xpYmRtL2RtX3Rlc3QuY3BwCmluZGV4IDA4ZWRiZTguLjVlZGRiNTEgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJkbS9kbV90ZXN0LmNwcAorKysgYi9mc19tZ3IvbGliZG0vZG1fdGVzdC5jcHAKQEAgLTM3LDEyICszNywxNCBAQAogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAjaW5jbHVkZSA8bGliZG0vZG0uaD4KICNpbmNsdWRlIDxsaWJkbS9sb29wX2NvbnRyb2wuaD4KKyNpbmNsdWRlIDxzdG9yYWdlX2xpdGVyYWxzL3N0b3JhZ2VfbGl0ZXJhbHMuaD4KICNpbmNsdWRlICJ0ZXN0X3V0aWwuaCIKICNpbmNsdWRlICJ1dGlsaXR5LmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiB1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6ZG07Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6c3RvcmFnZV9saXRlcmFsczsKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6Om1ha2Vfc2NvcGVfZ3VhcmQ7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQ7CiAKQEAgLTE4MSw2ICsxODMsMTMgQEAKICAgICBBU1NFUlRfRVEoZG0uR2V0U3RhdGUoZGV2Lm5hbWUoKSksIERtRGV2aWNlU3RhdGU6OkFDVElWRSk7CiB9CiAKK1RFU1RfRihEbVRlc3QsIFN0cmlwZUFyZ3MpIHsKKyAgICBEbVRhcmdldFN0cmlwZSB0YXJnZXQoMCwgNDA5NiwgMTAyNCwgIi9kZXYvbG9vcDAiLCAiL2Rldi9sb29wMSIpOworICAgIEFTU0VSVF9FUSh0YXJnZXQubmFtZSgpLCAic3RyaXBlZCIpOworICAgIEFTU0VSVF9UUlVFKHRhcmdldC5WYWxpZCgpKTsKKyAgICBBU1NFUlRfRVEodGFyZ2V0LkdldFBhcmFtZXRlclN0cmluZygpLCAiMiAxMDI0IC9kZXYvbG9vcDAgMCAvZGV2L2xvb3AxIDAiKTsKK30KKwogVEVTVF9GKERtVGVzdCwgRG1WZXJpdHlBcmdzQXZiMikgewogICAgIHN0ZDo6c3RyaW5nIGRldmljZSA9ICIvZGV2L2Jsb2NrL3BsYXRmb3JtL3NvYy8xZGE0MDAwLnVmc2hjL2J5LW5hbWUvdmVuZG9yX2EiOwogICAgIHN0ZDo6c3RyaW5nIGFsZ29yaXRobSA9ICJzaGExIjsKQEAgLTU4MCw5ICs1ODksMTggQEAKICAgICBBU1NFUlRfVFJVRShkbS5HZXREbURldmljZVBhdGhCeU5hbWUoImxpYmRtLXRlc3QtZG0tbGluZWFyIiwgJnBhdGgpKTsKICAgICBBU1NFUlRfRVEoMCwgYWNjZXNzKHBhdGguY19zdHIoKSwgRl9PSykpOwogCisgICAgc3RkOjpzdHJpbmcgdW5pcXVlX3BhdGg7CisgICAgQVNTRVJUX1RSVUUoZG0uR2V0RGV2aWNlVW5pcXVlUGF0aCgibGliZG0tdGVzdC1kbS1saW5lYXIiLCAmdW5pcXVlX3BhdGgpKTsKKyAgICBBU1NFUlRfRVEoMCwgYWNjZXNzKHVuaXF1ZV9wYXRoLmNfc3RyKCksIEZfT0spKTsKKwogICAgIEFTU0VSVF9UUlVFKGRtLkRlbGV0ZURldmljZSgibGliZG0tdGVzdC1kbS1saW5lYXIiLCA1cykpOwogICAgIEFTU0VSVF9FUShEbURldmljZVN0YXRlOjpJTlZBTElELCBkbS5HZXRTdGF0ZSgibGliZG0tdGVzdC1kbS1saW5lYXIiKSk7Ci0gICAgQVNTRVJUX05FKDAsIGFjY2VzcyhwYXRoLmNfc3RyKCksIEZfT0spKTsKKyAgICAvLyBDaGVjayB0aGF0IHVuaXF1ZSBwYXRoIG9mIHRoaXMgZGV2aWNlIGhhcyBiZWVuIGRlbGV0ZXRlZC4KKyAgICAvLyBQcmV2aW91c2x5IHRoaXMgdGVzdCBjYXNlIHVzZWQgdG8gY2hlY2sgdGhhdCBkZXYgbm9kZSAoaS5lLiAvZGV2L2Jsb2NrL2RtLVhYKSBoYXMgYmVlbgorICAgIC8vIGRlbGV0ZWQuIEhvd2V2ZXIsIHRoaXMgaW50cm9kdWNlcyBhIHJhY2UgY29uZGl0aW9uLCB1ZXZlbnRkIHdpbGwgcmVtb3ZlIHRoZSB1bmlxdWUgc3ltbGluaworICAgIC8vIChpLmUuIC9kZXYvYmxvY2svbWFwcGVyL2J5LXV1aWQvLi4uKSAqKmJlZm9yZSoqIHJlbW92aW5nIHRoZSBkZXZpY2Ugbm9kZSwgd2hpbGUgRGVsZXRlRGV2aWNlCisgICAgLy8gQVBJIHN5bmNocm9uaXplcyBvbiB0aGUgdW5pcXVlIHN5bWxpbmsgYmVpbmcgZGVsZXRlZC4KKyAgICBBU1NFUlRfTkUoMCwgYWNjZXNzKHVuaXF1ZV9wYXRoLmNfc3RyKCksIEZfT0spKTsKICAgICBBU1NFUlRfRVEoRU5PRU5ULCBlcnJubyk7CiB9CiAKQEAgLTc1OCw2ICs3NzYsNDUgQEAKICAgICBBU1NFUlRfRkFMU0UodXVpZC5lbXB0eSgpKTsKIH0KIAorVEVTVF9GKERtVGVzdCwgVGhpblByb3Zpc2lvbmluZykgeworICAgIGlmICghRGV2aWNlTWFwcGVyOjpJbnN0YW5jZSgpLkdldFRhcmdldEJ5TmFtZSgidGhpbi1wb29sIiwgbnVsbHB0cikpIEdURVNUX1NLSVAoKTsKKworICAgIGNvbnN0ZXhwciB1aW50NjRfdCBNZXRhU2l6ZSA9IDJfTWlCOworICAgIGNvbnN0ZXhwciB1aW50NjRfdCBEYXRhU2l6ZSA9IDY0X01pQjsKKyAgICBjb25zdGV4cHIgdWludDY0X3QgVGhpblNpemUgPSAxX1RpQjsKKworICAgIC8vIFByZXBhcmUgdHdvIGxvb3AgZGV2aWNlcyBmb3IgbWV0YSBhbmQgZGF0YSBkZXZpY2VzLgorICAgIFRlbXBvcmFyeUZpbGUgbWV0YTsKKyAgICBBU1NFUlRfR0UobWV0YS5mZCwgMCk7CisgICAgQVNTRVJUX0VRKDAsIGZ0cnVuY2F0ZTY0KG1ldGEuZmQsIE1ldGFTaXplKSk7CisgICAgVGVtcG9yYXJ5RmlsZSBkYXRhOworICAgIEFTU0VSVF9HRShkYXRhLmZkLCAwKTsKKyAgICBBU1NFUlRfRVEoMCwgZnRydW5jYXRlNjQoZGF0YS5mZCwgRGF0YVNpemUpKTsKKworICAgIExvb3BEZXZpY2UgbG9vcF9tZXRhKG1ldGEuZmQsIDEwcyk7CisgICAgQVNTRVJUX1RSVUUobG9vcF9tZXRhLnZhbGlkKCkpOworICAgIExvb3BEZXZpY2UgbG9vcF9kYXRhKGRhdGEuZmQsIDEwcyk7CisgICAgQVNTRVJUX1RSVUUobG9vcF9kYXRhLnZhbGlkKCkpOworCisgICAgLy8gQ3JlYXRlIGEgdGhpbi1wb29sCisgICAgRG1UYWJsZSBwb29sVGFibGU7CisgICAgcG9vbFRhYmxlLkVtcGxhY2U8RG1UYXJnZXRUaGluUG9vbD4oMCwgRGF0YVNpemUgLyBrU2VjdG9yU2l6ZSwgbG9vcF9tZXRhLmRldmljZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BfZGF0YS5kZXZpY2UoKSwgMTI4LCAwKTsKKyAgICBUZW1wRGV2aWNlIHBvb2woInBvb2wiLCBwb29sVGFibGUpOworICAgIEFTU0VSVF9UUlVFKHBvb2wudmFsaWQoKSk7CisKKyAgICAvLyBDcmVhdGUgYSB0aGluIHZvbHVtZQorICAgIHVpbnQ2NF90IHRoaW5fdm9sdW1lX2lkID0gMDsKKyAgICBBU1NFUlRfVFJVRShEZXZpY2VNYXBwZXI6Okluc3RhbmNlKCkuU2VuZE1lc3NhZ2UoCisgICAgICAgICAgICAicG9vbCIsIDAsICJjcmVhdGVfdGhpbiAiICsgc3RkOjp0b19zdHJpbmcodGhpbl92b2x1bWVfaWQpKSk7CisKKyAgICAvLyBVc2UgYSB0aGluIHZvbHVtZSB0byBjcmVhdGUgYSAxVCBkZXZpY2UKKyAgICBEbVRhYmxlIHRoaW5UYWJsZTsKKyAgICB0aGluVGFibGUuRW1wbGFjZTxEbVRhcmdldFRoaW4+KDAsIFRoaW5TaXplIC8ga1NlY3RvclNpemUsIHBvb2wucGF0aCgpLCB0aGluX3ZvbHVtZV9pZCk7CisgICAgVGVtcERldmljZSB0aGluKCJ0aGluIiwgdGhpblRhYmxlKTsKKyAgICBBU1NFUlRfVFJVRSh0aGluLnZhbGlkKCkpOworfQorCiBURVNUX0YoRG1UZXN0LCBSZWRhY3REbUNyeXB0KSB7CiAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrSW1hZ2VTaXplID0gNjU1MzY7CiAgICAgdW5pcXVlX2ZkIHRlbXBfZmlsZShDcmVhdGVUZW1wRmlsZSgiZmlsZV8xIiwga0ltYWdlU2l6ZSkpOwpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYmRtL2luY2x1ZGUvbGliZG0vZG0uaCBiL2ZzX21nci9saWJkbS9pbmNsdWRlL2xpYmRtL2RtLmgKaW5kZXggM2U3ZWNjNi4uNDNkODRmOSAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYmRtL2luY2x1ZGUvbGliZG0vZG0uaAorKysgYi9mc19tZ3IvbGliZG0vaW5jbHVkZS9saWJkbS9kbS5oCkBAIC01Miw4ICs1Miw4IEBACiAKIHN0YXRpYyBjb25zdGV4cHIgdWludDY0X3Qga1NlY3RvclNpemUgPSA1MTI7CiAKLS8vIFJldHVybnMgYHBhdGhgIHdpdGhvdXQgL2Rldi9ibG9jayBwcmVmaXggaWYgYW5kIG9ubHkgaWYgYHBhdGhgIHN0YXJ0cyB3aXRoCi0vLyB0aGF0IHByZWZpeC4KKy8vIFJldHVybnMgYHBhdGhgIHdpdGhvdXQgL2Rldi9ibG9jayBwcmVmaXggaWYgYHBhdGhgIHN0YXJ0cyB3aXRoIHRoYXQgcHJlZml4LgorLy8gT3IsIGlmIGBwYXRoYCBpcyBhIHN5bWxpbmssIGRvIHRoZSBzYW1lIHdpdGggaXRzIHJlYWwgcGF0aC4KIHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IEV4dHJhY3RCbG9ja0RldmljZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpOwogCiAvLyBUaGlzIGludGVyZmFjZSBpcyBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gU2VlIERldmljZU1hcHBlciBwcm9wZXIgZm9yIHdoYXQgdGhlc2UgbWV0aG9kcyBkby4KQEAgLTc4LDYgKzc4LDcgQEAKICAgICB2aXJ0dWFsIGJvb2wgTG9hZFRhYmxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBEbVRhYmxlJiB0YWJsZSkgPSAwOwogICAgIHZpcnR1YWwgYm9vbCBHZXRUYWJsZUluZm8oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHN0ZDo6dmVjdG9yPFRhcmdldEluZm8+KiB0YWJsZSkgPSAwOwogICAgIHZpcnR1YWwgYm9vbCBHZXRUYWJsZVN0YXR1cyhjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgc3RkOjp2ZWN0b3I8VGFyZ2V0SW5mbz4qIHRhYmxlKSA9IDA7CisgICAgdmlydHVhbCBib29sIEdldFRhYmxlU3RhdHVzSW1hKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBzdGQ6OnZlY3RvcjxUYXJnZXRJbmZvPiogdGFibGUpID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgR2V0RG1EZXZpY2VQYXRoQnlOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBzdGQ6OnN0cmluZyogcGF0aCkgPSAwOwogICAgIHZpcnR1YWwgYm9vbCBHZXREZXZpY2VTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHN0ZDo6c3RyaW5nKiBkZXYpID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgRGVsZXRlRGV2aWNlSWZFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpID0gMDsKQEAgLTI2Nyw2ICsyNjgsMTIgQEAKICAgICAvLyBmYWxzZS4KICAgICBib29sIEdldFRhYmxlU3RhdHVzKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBzdGQ6OnZlY3RvcjxUYXJnZXRJbmZvPiogdGFibGUpIG92ZXJyaWRlOwogCisgICAgLy8gUXVlcnkgdGhlIHN0YXR1cyBvZiBhIHRhYmxlLCBnaXZlbiBhIGRldmljZSBuYW1lLiBUaGUgb3V0cHV0IHZlY3RvciB3aWxsCisgICAgLy8gY29udGFpbiBJTUEgVGFyZ2V0SW5mbyBmb3IgZWFjaCB0YXJnZXQgaW4gdGhlIHRhYmxlLiBJZiB0aGUgZGV2aWNlIGRvZXMKKyAgICAvLyBub3QgZXhpc3QsIG9yIHRoZXJlIHdlcmUgdG9vIG1hbnkgdGFyZ2V0cywgdGhlIGNhbGwgd2lsbCBmYWlsIGFuZCByZXR1cm4KKyAgICAvLyBmYWxzZS4KKyAgICBib29sIEdldFRhYmxlU3RhdHVzSW1hKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBzdGQ6OnZlY3RvcjxUYXJnZXRJbmZvPiogdGFibGUpIG92ZXJyaWRlOworCiAgICAgLy8gSWRlbnRpY2FsIHRvIEdldFRhYmxlU3RhdHVzLCBleGNlcHQgYWxzbyByZXRyaXZlcyB0aGUgYWN0aXZlIHRhYmxlIGZvciB0aGUgZGV2aWNlCiAgICAgLy8gbWFwcGVyIGRldmljZSBmcm9tIHRoZSBrZXJuZWwuCiAgICAgYm9vbCBHZXRUYWJsZUluZm8oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHN0ZDo6dmVjdG9yPFRhcmdldEluZm8+KiB0YWJsZSkgb3ZlcnJpZGU7CkBAIC0zMDAsNiArMzA3LDkgQEAKIAogICAgIGJvb2wgR2V0RGV2aWNlTmFtZUFuZFV1aWQoZGV2X3QgZGV2LCBzdGQ6OnN0cmluZyogbmFtZSwgc3RkOjpzdHJpbmcqIHV1aWQpOwogCisgICAgLy8gU2VuZCB8bWVzc2FnZXwgdG8gdGFyZ2V0LCBwb2ludGVkIGJ5IHxuYW1lfCBhbmQgfHNlY3RvcnwuIFVzZSAwIGlmIHxzZWN0b3J8IGlzIG5vdCBuZWVkZWQuCisgICAgYm9vbCBTZW5kTWVzc2FnZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgdWludDY0X3Qgc2VjdG9yLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSk7CisKICAgcHJpdmF0ZToKICAgICAvLyBNYXhpbXVtIHBvc3NpYmxlIGRldmljZSBtYXBwZXIgdGFyZ2V0cyByZWdpc3RlcmVkIGluIHRoZSBrZXJuZWwuCiAgICAgLy8gVGhpcyBpcyBvbmx5IHVzZWQgdG8gcmVhZCB0aGUgbGlzdCBvZiB0YXJnZXRzIGZyb20ga2VybmVsIHNvIHdlIGFsbG9jYXRlCmRpZmYgLS1naXQgYS9mc19tZ3IvbGliZG0vaW5jbHVkZS9saWJkbS9kbV90YXJnZXQuaCBiL2ZzX21nci9saWJkbS9pbmNsdWRlL2xpYmRtL2RtX3RhcmdldC5oCmluZGV4IDA5ZmUyMDAuLmM0OWZjNWUgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJkbS9pbmNsdWRlL2xpYmRtL2RtX3RhcmdldC5oCisrKyBiL2ZzX21nci9saWJkbS9pbmNsdWRlL2xpYmRtL2RtX3RhcmdldC5oCkBAIC0xMTYsNiArMTE2LDI0IEBACiAgICAgdWludDY0X3QgcGh5c2ljYWxfc2VjdG9yXzsKIH07CiAKK2NsYXNzIERtVGFyZ2V0U3RyaXBlIGZpbmFsIDogcHVibGljIERtVGFyZ2V0IHsKKyAgcHVibGljOgorICAgIERtVGFyZ2V0U3RyaXBlKHVpbnQ2NF90IHN0YXJ0LCB1aW50NjRfdCBsZW5ndGgsIHVpbnQ2NF90IGNodW5rc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYmxvY2tfZGV2aWNlMCwgY29uc3Qgc3RkOjpzdHJpbmcmIGJsb2NrX2RldmljZTEpCisgICAgICAgIDogRG1UYXJnZXQoc3RhcnQsIGxlbmd0aCksCisgICAgICAgICAgY2h1bmtzaXplKGNodW5rc2l6ZSksCisgICAgICAgICAgYmxvY2tfZGV2aWNlMF8oYmxvY2tfZGV2aWNlMCksCisgICAgICAgICAgYmxvY2tfZGV2aWNlMV8oYmxvY2tfZGV2aWNlMSkge30KKworICAgIHN0ZDo6c3RyaW5nIG5hbWUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAic3RyaXBlZCI7IH0KKyAgICBzdGQ6OnN0cmluZyBHZXRQYXJhbWV0ZXJTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKworICBwcml2YXRlOgorICAgIHVpbnQ2NF90IGNodW5rc2l6ZTsKKyAgICBzdGQ6OnN0cmluZyBibG9ja19kZXZpY2UwXzsKKyAgICBzdGQ6OnN0cmluZyBibG9ja19kZXZpY2UxXzsKK307CisKIGNsYXNzIERtVGFyZ2V0VmVyaXR5IGZpbmFsIDogcHVibGljIERtVGFyZ2V0IHsKICAgcHVibGljOgogICAgIERtVGFyZ2V0VmVyaXR5KHVpbnQ2NF90IHN0YXJ0LCB1aW50NjRfdCBsZW5ndGgsIHVpbnQzMl90IHZlcnNpb24sCkBAIC0zMzEsNiArMzQ5LDM1IEBACiAgICAgc3RkOjpzdHJpbmcgR2V0UGFyYW1ldGVyU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gIiI7IH0KIH07CiAKK2NsYXNzIERtVGFyZ2V0VGhpblBvb2wgZmluYWwgOiBwdWJsaWMgRG1UYXJnZXQgeworICBwdWJsaWM6CisgICAgRG1UYXJnZXRUaGluUG9vbCh1aW50NjRfdCBzdGFydCwgdWludDY0X3QgbGVuZ3RoLCBjb25zdCBzdGQ6OnN0cmluZyYgbWV0YWRhdGFfZGV2LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRhdGFfZGV2LCB1aW50NjRfdCBkYXRhX2Jsb2NrX3NpemUsCisgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBsb3dfd2F0ZXJfbWFyayk7CisKKyAgICBzdGQ6OnN0cmluZyBuYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gInRoaW4tcG9vbCI7IH0KKyAgICBzdGQ6OnN0cmluZyBHZXRQYXJhbWV0ZXJTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sIFZhbGlkKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnN0cmluZyBtZXRhZGF0YV9kZXZfOworICAgIHN0ZDo6c3RyaW5nIGRhdGFfZGV2XzsKKyAgICB1aW50NjRfdCBkYXRhX2Jsb2NrX3NpemVfOworICAgIHVpbnQ2NF90IGxvd193YXRlcl9tYXJrXzsKK307CisKK2NsYXNzIERtVGFyZ2V0VGhpbiBmaW5hbCA6IHB1YmxpYyBEbVRhcmdldCB7CisgIHB1YmxpYzoKKyAgICBEbVRhcmdldFRoaW4odWludDY0X3Qgc3RhcnQsIHVpbnQ2NF90IGxlbmd0aCwgY29uc3Qgc3RkOjpzdHJpbmcmIHBvb2xfZGV2LCB1aW50NjRfdCBkZXZfaWQpOworCisgICAgc3RkOjpzdHJpbmcgbmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICJ0aGluIjsgfQorICAgIHN0ZDo6c3RyaW5nIEdldFBhcmFtZXRlclN0cmluZygpIGNvbnN0IG92ZXJyaWRlOworCisgIHByaXZhdGU6CisgICAgc3RkOjpzdHJpbmcgcG9vbF9kZXZfOworICAgIHVpbnQ2NF90IGRldl9pZF87Cit9OworCiB9ICAvLyBuYW1lc3BhY2UgZG0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJmaWVtYXAvQW5kcm9pZC5icCBiL2ZzX21nci9saWJmaWVtYXAvQW5kcm9pZC5icAppbmRleCBkZGRhNjQ4Li5hNmJlNTg1IDEwMDY0NAotLS0gYS9mc19tZ3IvbGliZmllbWFwL0FuZHJvaWQuYnAKKysrIGIvZnNfbWdyL2xpYmZpZW1hcC9BbmRyb2lkLmJwCkBAIC0xNSw2ICsxNSw3IEBACiAvLwogCiBwYWNrYWdlIHsKKyAgICBkZWZhdWx0X3RlYW06ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX2tlcm5lbCIsCiAgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbIkFuZHJvaWQtQXBhY2hlLTIuMCJdLAogfQogCkBAIC0yNCw2ICsyNSw3IEBACiAgICAgdmVuZG9yX3JhbWRpc2tfYXZhaWxhYmxlOiB0cnVlLAogICAgIHJlY292ZXJ5X2F2YWlsYWJsZTogdHJ1ZSwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKIH0KIAogZmlsZWdyb3VwIHsKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJmaWVtYXAvYmluZGVyLmNwcCBiL2ZzX21nci9saWJmaWVtYXAvYmluZGVyLmNwcAppbmRleCA0MWU1MzRhLi40MzlhYWM5IDEwMDY0NAotLS0gYS9mc19tZ3IvbGliZmllbWFwL2JpbmRlci5jcHAKKysrIGIvZnNfbWdyL2xpYmZpZW1hcC9iaW5kZXIuY3BwCkBAIC03Nyw3ICs3Nyw3IEBACiAKIHN0YXRpYyBGaWVtYXBTdGF0dXMgVG9GaWVtYXBTdGF0dXMoY29uc3QgY2hhciogZnVuYywgY29uc3QgYmluZGVyOjpTdGF0dXMmIHN0YXR1cykgewogICAgIGlmICghc3RhdHVzLmlzT2soKSkgewotICAgICAgICBMT0coRVJST1IpIDw8IGZ1bmMgPDwgIiBiaW5kZXIgcmV0dXJuZWQ6ICIgPDwgc3RhdHVzLnRvU3RyaW5nOCgpLnN0cmluZygpOworICAgICAgICBMT0coRVJST1IpIDw8IGZ1bmMgPDwgIiBiaW5kZXIgcmV0dXJuZWQ6ICIgPDwgc3RhdHVzLnRvU3RyaW5nOCgpLmNfc3RyKCk7CiAgICAgICAgIGlmIChzdGF0dXMuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCkgIT0gMCkgewogICAgICAgICAgICAgcmV0dXJuIEZpZW1hcFN0YXR1czo6RnJvbUVycm9yQ29kZShzdGF0dXMuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCkpOwogICAgICAgICB9IGVsc2UgewpAQCAtMTA2LDcgKzEwNiw3IEBACiAgICAgYXV0byBzdGF0dXMgPSBtYW5hZ2VyXy0+ZGVsZXRlQmFja2luZ0ltYWdlKG5hbWUpOwogICAgIGlmICghc3RhdHVzLmlzT2soKSkgewogICAgICAgICBMT0coRVJST1IpIDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18KLSAgICAgICAgICAgICAgICAgICA8PCAiIGJpbmRlciByZXR1cm5lZDogIiA8PCBzdGF0dXMuZXhjZXB0aW9uTWVzc2FnZSgpLnN0cmluZygpOworICAgICAgICAgICAgICAgICAgIDw8ICIgYmluZGVyIHJldHVybmVkOiAiIDw8IHN0YXR1cy5leGNlcHRpb25NZXNzYWdlKCkuY19zdHIoKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKQEAgLTEyMiw3ICsxMjIsNyBAQAogICAgIGF1dG8gc3RhdHVzID0gbWFuYWdlcl8tPm1hcEltYWdlRGV2aWNlKG5hbWUsIHRpbWVvdXRfbXNfY291bnQsICZtYXApOwogICAgIGlmICghc3RhdHVzLmlzT2soKSkgewogICAgICAgICBMT0coRVJST1IpIDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18KLSAgICAgICAgICAgICAgICAgICA8PCAiIGJpbmRlciByZXR1cm5lZDogIiA8PCBzdGF0dXMuZXhjZXB0aW9uTWVzc2FnZSgpLnN0cmluZygpOworICAgICAgICAgICAgICAgICAgIDw8ICIgYmluZGVyIHJldHVybmVkOiAiIDw8IHN0YXR1cy5leGNlcHRpb25NZXNzYWdlKCkuY19zdHIoKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICAqcGF0aCA9IG1hcC5wYXRoOwpAQCAtMTMzLDcgKzEzMyw3IEBACiAgICAgYXV0byBzdGF0dXMgPSBtYW5hZ2VyXy0+dW5tYXBJbWFnZURldmljZShuYW1lKTsKICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCBfX1BSRVRUWV9GVU5DVElPTl9fCi0gICAgICAgICAgICAgICAgICAgPDwgIiBiaW5kZXIgcmV0dXJuZWQ6ICIgPDwgc3RhdHVzLmV4Y2VwdGlvbk1lc3NhZ2UoKS5zdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICA8PCAiIGJpbmRlciByZXR1cm5lZDogIiA8PCBzdGF0dXMuZXhjZXB0aW9uTWVzc2FnZSgpLmNfc3RyKCk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIHRydWU7CkBAIC0xNDQsNyArMTQ0LDcgQEAKICAgICBhdXRvIHN0YXR1cyA9IG1hbmFnZXJfLT5iYWNraW5nSW1hZ2VFeGlzdHMobmFtZSwgJnJldHZhbCk7CiAgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgX19QUkVUVFlfRlVOQ1RJT05fXwotICAgICAgICAgICAgICAgICAgIDw8ICIgYmluZGVyIHJldHVybmVkOiAiIDw8IHN0YXR1cy5leGNlcHRpb25NZXNzYWdlKCkuc3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgPDwgIiBiaW5kZXIgcmV0dXJuZWQ6ICIgPDwgc3RhdHVzLmV4Y2VwdGlvbk1lc3NhZ2UoKS5jX3N0cigpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiByZXR2YWw7CkBAIC0xNTUsNyArMTU1LDcgQEAKICAgICBhdXRvIHN0YXR1cyA9IG1hbmFnZXJfLT5pc0ltYWdlTWFwcGVkKG5hbWUsICZyZXR2YWwpOwogICAgIGlmICghc3RhdHVzLmlzT2soKSkgewogICAgICAgICBMT0coRVJST1IpIDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18KLSAgICAgICAgICAgICAgICAgICA8PCAiIGJpbmRlciByZXR1cm5lZDogIiA8PCBzdGF0dXMuZXhjZXB0aW9uTWVzc2FnZSgpLnN0cmluZygpOworICAgICAgICAgICAgICAgICAgIDw8ICIgYmluZGVyIHJldHVybmVkOiAiIDw8IHN0YXR1cy5leGNlcHRpb25NZXNzYWdlKCkuY19zdHIoKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gcmV0dmFsOwpAQCAtMTc1LDcgKzE3NSw3IEBACiAgICAgYXV0byBzdGF0dXMgPSBtYW5hZ2VyXy0+Z2V0QWxsQmFja2luZ0ltYWdlcygmcmV0dmFsKTsKICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCBfX1BSRVRUWV9GVU5DVElPTl9fCi0gICAgICAgICAgICAgICAgICAgPDwgIiBiaW5kZXIgcmV0dXJuZWQ6ICIgPDwgc3RhdHVzLmV4Y2VwdGlvbk1lc3NhZ2UoKS5zdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICA8PCAiIGJpbmRlciByZXR1cm5lZDogIiA8PCBzdGF0dXMuZXhjZXB0aW9uTWVzc2FnZSgpLmNfc3RyKCk7CiAgICAgfQogICAgIHJldHVybiByZXR2YWw7CiB9CkBAIC0xODksNyArMTg5LDcgQEAKICAgICBhdXRvIHN0YXR1cyA9IG1hbmFnZXJfLT5yZW1vdmVBbGxJbWFnZXMoKTsKICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCBfX1BSRVRUWV9GVU5DVElPTl9fCi0gICAgICAgICAgICAgICAgICAgPDwgIiBiaW5kZXIgcmV0dXJuZWQ6ICIgPDwgc3RhdHVzLmV4Y2VwdGlvbk1lc3NhZ2UoKS5zdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICA8PCAiIGJpbmRlciByZXR1cm5lZDogIiA8PCBzdGF0dXMuZXhjZXB0aW9uTWVzc2FnZSgpLmNfc3RyKCk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIHRydWU7CkBAIC0xOTksNyArMTk5LDcgQEAKICAgICBhdXRvIHN0YXR1cyA9IG1hbmFnZXJfLT5kaXNhYmxlSW1hZ2UobmFtZSk7CiAgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgX19QUkVUVFlfRlVOQ1RJT05fXwotICAgICAgICAgICAgICAgICAgIDw8ICIgYmluZGVyIHJldHVybmVkOiAiIDw8IHN0YXR1cy5leGNlcHRpb25NZXNzYWdlKCkuc3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgPDwgIiBiaW5kZXIgcmV0dXJuZWQ6ICIgPDwgc3RhdHVzLmV4Y2VwdGlvbk1lc3NhZ2UoKS5jX3N0cigpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiB0cnVlOwpAQCAtMjA5LDcgKzIwOSw3IEBACiAgICAgYXV0byBzdGF0dXMgPSBtYW5hZ2VyXy0+cmVtb3ZlRGlzYWJsZWRJbWFnZXMoKTsKICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCBfX1BSRVRUWV9GVU5DVElPTl9fCi0gICAgICAgICAgICAgICAgICAgPDwgIiBiaW5kZXIgcmV0dXJuZWQ6ICIgPDwgc3RhdHVzLmV4Y2VwdGlvbk1lc3NhZ2UoKS5zdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICA8PCAiIGJpbmRlciByZXR1cm5lZDogIiA8PCBzdGF0dXMuZXhjZXB0aW9uTWVzc2FnZSgpLmNfc3RyKCk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIHRydWU7CkBAIC0yMTksNyArMjE5LDcgQEAKICAgICBhdXRvIHN0YXR1cyA9IG1hbmFnZXJfLT5nZXRNYXBwZWRJbWFnZURldmljZShuYW1lLCBkZXZpY2UpOwogICAgIGlmICghc3RhdHVzLmlzT2soKSkgewogICAgICAgICBMT0coRVJST1IpIDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18KLSAgICAgICAgICAgICAgICAgICA8PCAiIGJpbmRlciByZXR1cm5lZDogIiA8PCBzdGF0dXMuZXhjZXB0aW9uTWVzc2FnZSgpLnN0cmluZygpOworICAgICAgICAgICAgICAgICAgIDw8ICIgYmluZGVyIHJldHVybmVkOiAiIDw8IHN0YXR1cy5leGNlcHRpb25NZXNzYWdlKCkuY19zdHIoKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gIWRldmljZS0+ZW1wdHkoKTsKQEAgLTIzMCw3ICsyMzAsNyBAQAogICAgIGF1dG8gc3RhdHVzID0gbWFuYWdlcl8tPmlzSW1hZ2VEaXNhYmxlZChuYW1lLCAmcmV0dmFsKTsKICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCBfX1BSRVRUWV9GVU5DVElPTl9fCi0gICAgICAgICAgICAgICAgICAgPDwgIiBiaW5kZXIgcmV0dXJuZWQ6ICIgPDwgc3RhdHVzLmV4Y2VwdGlvbk1lc3NhZ2UoKS5zdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICA8PCAiIGJpbmRlciByZXR1cm5lZDogIiA8PCBzdGF0dXMuZXhjZXB0aW9uTWVzc2FnZSgpLmNfc3RyKCk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIHJldHZhbDsKQEAgLTI0OSw3ICsyNDksNyBAQAogCiAgICAgYXV0byBzdGF0dXMgPSBzZXJ2aWNlLT5vcGVuSW1hZ2VTZXJ2aWNlKGRpciwgJm1hbmFnZXIpOwogICAgIGlmICghc3RhdHVzLmlzT2soKSB8fCAhbWFuYWdlcikgewotICAgICAgICBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgYWNxdWlyZSBJSW1hZ2VNYW5hZ2VyOiAiIDw8IHN0YXR1cy5leGNlcHRpb25NZXNzYWdlKCkuc3RyaW5nKCk7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBhY3F1aXJlIElJbWFnZU1hbmFnZXI6ICIgPDwgc3RhdHVzLmV4Y2VwdGlvbk1lc3NhZ2UoKS5jX3N0cigpOwogICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CiAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8SW1hZ2VNYW5hZ2VyQmluZGVyPihzdGQ6Om1vdmUoc2VydmljZSksIHN0ZDo6bW92ZShtYW5hZ2VyKSk7CmRpZmYgLS1naXQgYS9mc19tZ3IvbGliZmllbWFwL2ZpZW1hcF93cml0ZXIuY3BwIGIvZnNfbWdyL2xpYmZpZW1hcC9maWVtYXBfd3JpdGVyLmNwcAppbmRleCAyNzUzODhlLi5kNjFlMDA3IDEwMDY0NAotLS0gYS9mc19tZ3IvbGliZmllbWFwL2ZpZW1hcF93cml0ZXIuY3BwCisrKyBiL2ZzX21nci9saWJmaWVtYXAvZmllbWFwX3dyaXRlci5jcHAKQEAgLTYwLDYgKzYwLDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjbGVhbnVwKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlX3BhdGgsIGJvb2wgY3JlYXRlZCkgewogICAgIGlmIChjcmVhdGVkKSB7CiAgICAgICAgIHVubGluayhmaWxlX3BhdGguY19zdHIoKSk7CisgICAgICAgIHN5bmMoKTsKICAgICB9CiB9CiAKQEAgLTQ1OCw5ICs0NTksMzQgQEAKICAgICAgICAgICAgIHJldHVybiBGaWVtYXBTdGF0dXM6OkVycm9yKCk7CiAgICAgfQogCi0gICAgaWYgKGZhbGxvY2F0ZShmaWxlX2ZkLCAwLCAwLCBmaWxlX3NpemUpKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgc3BhY2UgZm9yIGZpbGU6ICIgPDwgZmlsZV9wYXRoIDw8ICIgc2l6ZTogIiA8PCBmaWxlX3NpemU7Ci0gICAgICAgIHJldHVybiBGaWVtYXBTdGF0dXM6OkZyb21FcnJubyhlcnJubyk7CisgICAgLy8gRjJGUyBjYW4gcmV0dXJuIEVBR0FJTiBhbmQgcGFydGlhbGx5IGZhbGxvY2F0ZS4gS2VlcCB0cnlpbmcgdG8gZmFsbG9jYXRlLAorICAgIC8vIGFuZCBpZiB3ZSBkb24ndCBtYWtlIGZvcndhcmQgcHJvZ3Jlc3MsIHJldHVybiBFTk9TUEMuCisgICAgc3RkOjpvcHRpb25hbDxvZmZfdD4gcHJldl9zaXplOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmIChmYWxsb2NhdGUoZmlsZV9mZCwgMCwgMCwgZmlsZV9zaXplKSA9PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXJybm8gIT0gRUFHQUlOKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIHNwYWNlIGZvciBmaWxlOiAiIDw8IGZpbGVfcGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBzaXplOiAiIDw8IGZpbGVfc2l6ZTsKKyAgICAgICAgICAgIHJldHVybiBGaWVtYXBTdGF0dXM6OkZyb21FcnJubyhlcnJubyk7CisgICAgICAgIH0KKworICAgICAgICBzdHJ1Y3Qgc3RhdCBzOworICAgICAgICBpZiAoZnN0YXQoZmlsZV9mZCwgJnMpIDwgMCkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBmc3RhdCBhZnRlciBmYWxsb2NhdGUgZmFpbHVyZTogIiA8PCBmaWxlX3BhdGg7CisgICAgICAgICAgICByZXR1cm4gRmllbWFwU3RhdHVzOjpGcm9tRXJybm8oZXJybm8pOworICAgICAgICB9CisgICAgICAgIGlmICghcHJldl9zaXplKSB7CisgICAgICAgICAgICBwcmV2X3NpemUgPSB7cy5zdF9zaXplfTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICgqcHJldl9zaXplID49IHMuc3Rfc2l6ZSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFsbG9jYXRlIHJldHJ5IGZhaWxlZCwgZ290ICIgPDwgcy5zdF9zaXplIDw8ICIsIGFza2VkIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGZpbGVfc2l6ZTsKKyAgICAgICAgICAgIHJldHVybiBGaWVtYXBTdGF0dXMoRmllbWFwU3RhdHVzOjpFcnJvckNvZGU6Ok5PX1NQQUNFKTsKKyAgICAgICAgfQorICAgICAgICBMT0coSU5GTykgPDwgIlJldHJ5aW5nIGZhbGxvY2F0ZSwgZ290ICIgPDwgcy5zdF9zaXplIDw8ICIsIGFza2VkIGZvciAiIDw8IGZpbGVfc2l6ZTsKICAgICB9CiAKICAgICBpZiAobmVlZF9leHBsaWNpdF93cml0ZXMpIHsKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJmaWVtYXAvZmllbWFwX3dyaXRlcl90ZXN0LmNwcCBiL2ZzX21nci9saWJmaWVtYXAvZmllbWFwX3dyaXRlcl90ZXN0LmNwcAppbmRleCBiZDk3YTc4Li4xMTVmNTNlIDEwMDY0NAotLS0gYS9mc19tZ3IvbGliZmllbWFwL2ZpZW1hcF93cml0ZXJfdGVzdC5jcHAKKysrIGIvZnNfbWdyL2xpYmZpZW1hcC9maWVtYXBfd3JpdGVyX3Rlc3QuY3BwCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8c3lzL3Zmcy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCisjaW5jbHVkZSA8Y3N0cmluZz4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dXRpbGl0eT4KIApAQCAtNjUsNyArNjYsMTEgQEAKICAgICAgICAgdGVzdGZpbGUgPSBnVGVzdERpciArICIvInMgKyB0aW5mby0+bmFtZSgpOwogICAgIH0KIAotICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7IHVubGluayh0ZXN0ZmlsZS5jX3N0cigpKTsgfQorICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIHRydW5jYXRlKHRlc3RmaWxlLmNfc3RyKCksIDApOworICAgICAgICB1bmxpbmsodGVzdGZpbGUuY19zdHIoKSk7CisgICAgICAgIHN5bmMoKTsKKyAgICB9CiAKICAgICAvLyBuYW1lIG9mIHRoZSBmaWxlIHdlIHVzZSBmb3IgdGVzdGluZwogICAgIHN0ZDo6c3RyaW5nIHRlc3RmaWxlOwpAQCAtNTE4LDcgKzUyMyw4IEBACiAgICAgICAgIEFTU0VSVF9FUShyZXQsIDApOwogCiAgICAgICAgIC8vIG1vdW50IHRoZSBmaWxlIHN5c3RlbQotICAgICAgICBBU1NFUlRfRVEobW91bnQobG9vcF9kZXYuZGV2aWNlKCkuY19zdHIoKSwgbW50cG9pbnRfLmNfc3RyKCksICJmMmZzIiwgMCwgbnVsbHB0ciksIDApOworICAgICAgICBBU1NFUlRfRVEobW91bnQobG9vcF9kZXYuZGV2aWNlKCkuY19zdHIoKSwgbW50cG9pbnRfLmNfc3RyKCksICJmMmZzIiwgMCwgbnVsbHB0ciksIDApCisgICAgICAgICAgICAgICAgPDwgc3RyZXJyb3IoZXJybm8pOwogICAgIH0KIAogICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CmRpZmYgLS1naXQgYS9mc19tZ3IvbGliZmllbWFwL2ltYWdlX21hbmFnZXIuY3BwIGIvZnNfbWdyL2xpYmZpZW1hcC9pbWFnZV9tYW5hZ2VyLmNwcAppbmRleCBjNDE2ZjRkLi5hNWRhNmUzIDEwMDY0NAotLS0gYS9mc19tZ3IvbGliZmllbWFwL2ltYWdlX21hbmFnZXIuY3BwCisrKyBiL2ZzX21nci9saWJmaWVtYXAvaW1hZ2VfbWFuYWdlci5jcHAKQEAgLTUzMSwxMSArNTMxLDE2IEBACiAgICAgLy8gSWYgdGhlcmUgaXMgbm8gaW50ZXJtZWRpYXRlIGRldmljZS1tYXBwZXIgbm9kZSwgdGhlbiBwYXJ0aXRpb25zIGNhbm5vdCBiZQogICAgIC8vIG9wZW5lZCB3cml0YWJsZSBkdWUgdG8gc2Vwb2xpY3kgYW5kIGV4Y2x1c2l2aXR5IG9mIGhhdmluZyBhIG1vdW50ZWQKICAgICAvLyBmaWxlc3lzdGVtLiBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBvbiBkZXZpY2VzIHdpdGggbm8gZW5jcnlwdGlvbiwgb3IKLSAgICAvLyBkZXZpY2VzIHdpdGggRkJFIGFuZCBubyBtZXRhZGF0YSBlbmNyeXB0aW9uLiBGb3IgdGhlc2UgY2FzZXMgaXQgc3VmZmljZXMKLSAgICAvLyB0byBwZXJmb3JtIG5vcm1hbCBmaWxlIHdyaXRlcyB0byAvZGF0YS9nc2kgKHdoaWNoIGlzIHVuZW5jcnlwdGVkKS4KKyAgICAvLyBkZXZpY2VzIHdpdGggRkJFIGFuZCBubyBtZXRhZGF0YSBlbmNyeXB0aW9uLiBGb3IgdGhlc2UgY2FzZXMgd2UgQ09VTEQKKyAgICAvLyBwZXJmb3JtIG5vcm1hbCB3cml0ZXMgdG8gL2RhdGEvZ3NpICh3aGljaCBpcyB1bmVuY3J5cHRlZCksIGJ1dCBnaXZlbiB0aGF0CisgICAgLy8gbWV0YWRhdGEgZW5jcnlwdGlvbiBoYXMgYmVlbiBtYW5kYXRlZCBzaW5jZSBBbmRyb2lkIFIsIHdlIGRvbid0IGFjdHVhbGx5CisgICAgLy8gc3VwcG9ydCBvciB0ZXN0IHRoaXMuCiAgICAgLy8KLSAgICAvLyBOb3RlOiB0aGlzIGlzIG5vdCBnYXRlZCBvbiBEZXZpY2VJbmZvLCBiZWNhdXNlIHRoZSByZWNvdmVyeS1zcGVjaWZpYyBwYXRoCi0gICAgLy8gbXVzdCBvbmx5IGJlIHVzZWQgaW4gYWN0dWFsIHJlY292ZXJ5LgorICAgIC8vIFNvLCB3ZSB2YWxpZGF0ZSBoZXJlIHRoYXQgL2RhdGEgaXMgYmFja2VkIGJ5IGRldmljZS1tYXBwZXIuIFRoaXMgY29kZQorICAgIC8vIGlzbid0IG5lZWRlZCBpbiByZWNvdmVyeSBzaW5jZSB0aGVyZSBpcyBubyAvZGF0YS4KKyAgICAvLworICAgIC8vIElmIHRoaXMgbG9naWMgc3RpY2tzIGZvciBhIHJlbGVhc2UsIHdlIGNhbiByZW1vdmUgTWFwV2l0aExvb3BEZXZpY2UsIGFzCisgICAgLy8gd2VsbCBhcyBXcmFwVXNlcmRhdGFJZk5lZWRlZCBpbiBmc19tZ3IuCiAgICAgc3RkOjpzdHJpbmcgYmxvY2tfZGV2aWNlOwogICAgIGJvb2wgY2FuX3VzZV9kZXZpY2VtYXBwZXI7CiAgICAgaWYgKCFGaWVtYXBXcml0ZXI6OkdldEJsb2NrRGV2aWNlRm9yRmlsZShpbWFnZV9oZWFkZXIsICZibG9ja19kZXZpY2UsICZjYW5fdXNlX2RldmljZW1hcHBlcikpIHsKQEAgLTU0MywyMSArNTQ4LDE2IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoY2FuX3VzZV9kZXZpY2VtYXBwZXIpIHsKLSAgICAgICAgaWYgKCFNYXBXaXRoRG1MaW5lYXIoKnBhcnRpdGlvbl9vcGVuZXJfLmdldCgpLCBuYW1lLCB0aW1lb3V0X21zLCBwYXRoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICghTWFwV2l0aExvb3BEZXZpY2UobmFtZSwgdGltZW91dF9tcywgcGF0aCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSNlbHNlCi0gICAgLy8gSW4gcmVjb3ZlcnksIHdlIGNhbiAqb25seSogdXNlIGRldmljZS1tYXBwZXIsIHNpbmNlIHBhcnRpdGlvbnMgYXJlbid0Ci0gICAgLy8gbW91bnRlZC4gVGhhdCBhbHNvIG1lYW5zIHdlIGNhbm5vdCBjYWxsIEdldEJsb2NrRGV2aWNlRm9yRmlsZS4KLSAgICBpZiAoIU1hcFdpdGhEbUxpbmVhcigqcGFydGl0aW9uX29wZW5lcl8uZ2V0KCksIG5hbWUsIHRpbWVvdXRfbXMsIHBhdGgpKSB7CisgICAgaWYgKCFjYW5fdXNlX2RldmljZW1hcHBlcikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgbWFwIGltYWdlOiAvZGF0YSBtdXN0IGJlIG1vdW50ZWQgb24gdG9wIG9mIGRldmljZS1tYXBwZXIuIjsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICNlbmRpZgogCisgICAgaWYgKCFNYXBXaXRoRG1MaW5lYXIoKnBhcnRpdGlvbl9vcGVuZXJfLmdldCgpLCBuYW1lLCB0aW1lb3V0X21zLCBwYXRoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCiAgICAgLy8gU2V0IGEgcHJvcGVydHkgc28gd2UgcmVtZW1iZXIgdGhpcyBpcyBtYXBwZWQuCiAgICAgYXV0byBwcm9wX25hbWUgPSBHZXRTdGF0dXNQcm9wZXJ0eU5hbWUobmFtZSk7CiAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpTZXRQcm9wZXJ0eShwcm9wX25hbWUsICpwYXRoKSkgewpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYmZpZW1hcC9pbmNsdWRlL2xpYmZpZW1hcC9maWVtYXBfc3RhdHVzLmggYi9mc19tZ3IvbGliZmllbWFwL2luY2x1ZGUvbGliZmllbWFwL2ZpZW1hcF9zdGF0dXMuaAppbmRleCBkN2IyY2YxLi4xMzY1YmE0IDEwMDY0NAotLS0gYS9mc19tZ3IvbGliZmllbWFwL2luY2x1ZGUvbGliZmllbWFwL2ZpZW1hcF9zdGF0dXMuaAorKysgYi9mc19tZ3IvbGliZmllbWFwL2luY2x1ZGUvbGliZmllbWFwL2ZpZW1hcF9zdGF0dXMuaApAQCAtNTYsOCArNTYsNyBAQAogICAgIC8vIEZvciBsb2dnaW5nIGFuZCBkZWJ1Z2dpbmcgb25seS4KICAgICBzdGQ6OnN0cmluZyBzdHJpbmcoKSBjb25zdDsKIAotICBwcm90ZWN0ZWQ6Ci0gICAgRmllbWFwU3RhdHVzKEVycm9yQ29kZSBjb2RlKSA6IGVycm9yX2NvZGVfKGNvZGUpIHt9CisgICAgZXhwbGljaXQgRmllbWFwU3RhdHVzKEVycm9yQ29kZSBjb2RlKSA6IGVycm9yX2NvZGVfKGNvZGUpIHt9CiAKICAgcHJpdmF0ZToKICAgICBFcnJvckNvZGUgZXJyb3JfY29kZV87CmRpZmYgLS1naXQgYS9mc19tZ3IvbGliZmllbWFwL21ldGFkYXRhLmNwcCBiL2ZzX21nci9saWJmaWVtYXAvbWV0YWRhdGEuY3BwCmluZGV4IDIyYjhhZmIuLjBhNTZmNmEgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJmaWVtYXAvbWV0YWRhdGEuY3BwCisrKyBiL2ZzX21nci9saWJmaWVtYXAvbWV0YWRhdGEuY3BwCkBAIC0xMTEsMTMgKzExMSw3IEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIHVuaXF1ZV9mZCBmZChvcGVuKG1ldGFkYXRhX2ZpbGUuY19zdHIoKSwgT19DUkVBVCB8IE9fUkRXUiB8IE9fVFJVTkMgfCBPX0NMT0VYRUMgfCBPX0JJTkFSWSB8IE9fU1lOQywgMDY0NCkpOwotICAgIGlmIChmZCA8IDApIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAib3BlbiBmYWlsZWQ6ICIgPDwgbWV0YWRhdGFfZmlsZTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICghV3JpdGVUb0ltYWdlRmlsZShmZCwgKmV4cG9ydGVkLmdldCgpKSkgeworICAgIGlmICghV3JpdGVUb0ltYWdlRmlsZShtZXRhZGF0YV9maWxlLCAqZXhwb3J0ZWQuZ2V0KCkpKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBzYXZlIG5ldyBtZXRhZGF0YSI7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CmRpZmYgLS1naXQgYS9mc19tZ3IvbGliZmllbWFwL3NwbGl0X2ZpZW1hcF93cml0ZXIuY3BwIGIvZnNfbWdyL2xpYmZpZW1hcC9zcGxpdF9maWVtYXBfd3JpdGVyLmNwcAppbmRleCAwZGY2MTI1Li4xZjMyZDJmIDEwMDY0NAotLS0gYS9mc19tZ3IvbGliZmllbWFwL3NwbGl0X2ZpZW1hcF93cml0ZXIuY3BwCisrKyBiL2ZzX21nci9saWJmaWVtYXAvc3BsaXRfZmllbWFwX3dyaXRlci5jcHAKQEAgLTE5NiwxMCArMTk2LDEzIEBACiAgICAgICAgICAgICBpZiAoYWNjZXNzKGZpbGUuY19zdHIoKSwgRl9PSykgIT0gMCAmJiAoZXJybm8gPT0gRU5PRU5UIHx8IGVycm5vID09IEVOQU1FVE9PTE9ORykpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRydW5jYXRlKGZpbGUuY19zdHIoKSwgMCk7CiAgICAgICAgICAgICBvayAmPSBhbmRyb2lkOjpiYXNlOjpSZW1vdmVGaWxlSWZFeGlzdHMoZmlsZSwgbWVzc2FnZSk7CiAgICAgICAgIH0KICAgICB9CisgICAgdHJ1bmNhdGUoZmlsZV9wYXRoLmNfc3RyKCksIDApOwogICAgIG9rICY9IGFuZHJvaWQ6OmJhc2U6OlJlbW92ZUZpbGVJZkV4aXN0cyhmaWxlX3BhdGgsIG1lc3NhZ2UpOworICAgIHN5bmMoKTsKICAgICByZXR1cm4gb2s7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJmc19hdmIvYXZiX29wcy5jcHAgYi9mc19tZ3IvbGliZnNfYXZiL2F2Yl9vcHMuY3BwCmluZGV4IGExMTliZmMuLjdmMDA4MzkgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJmc19hdmIvYXZiX29wcy5jcHAKKysrIGIvZnNfbWdyL2xpYmZzX2F2Yi9hdmJfb3BzLmNwcApAQCAtMzQsNiArMzQsNyBAQAogCiAjaW5jbHVkZSA8c3RyaW5nPgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CkBAIC0xMDgsOCArMTA5LDggQEAKIC8vIENvbnZlcnRzIGEgcGFydGl0aW9uIG5hbWUgKHdpdGggYWJfc3VmZml4KSB0byB0aGUgY29ycmVzcG9uZGluZyBtb3VudCBwb2ludC4KIC8vIGUuZy4sICJzeXN0ZW1fYSIgPT4gIi9zeXN0ZW0iLAogLy8gZS5nLiwgInZlbmRvcl9hIiA9PiAiL3ZlbmRvciIsCi1zdGF0aWMgc3RkOjpzdHJpbmcgRGVyaXZlTW91bnRQb2ludChjb25zdCBzdGQ6OnN0cmluZyYgcGFydGl0aW9uX25hbWUpIHsKLSAgICBjb25zdCBzdGQ6OnN0cmluZyBhYl9zdWZmaXggPSBmc19tZ3JfZ2V0X3Nsb3Rfc3VmZml4KCk7CitzdGF0aWMgc3RkOjpzdHJpbmcgRGVyaXZlTW91bnRQb2ludChjb25zdCBzdGQ6OnN0cmluZyYgcGFydGl0aW9uX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYWJfc3VmZml4KSB7CiAgICAgc3RkOjpzdHJpbmcgbW91bnRfcG9pbnQocGFydGl0aW9uX25hbWUpOwogICAgIGF1dG8gZm91bmQgPSBwYXJ0aXRpb25fbmFtZS5yZmluZChhYl9zdWZmaXgpOwogICAgIGlmIChmb3VuZCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewpAQCAtMTE5LDcgKzEyMCw3IEBACiAgICAgcmV0dXJuICIvIiArIG1vdW50X3BvaW50OwogfQogCi1Gc01hbmFnZXJBdmJPcHM6OkZzTWFuYWdlckF2Yk9wcygpIHsKK0ZzTWFuYWdlckF2Yk9wczo6RnNNYW5hZ2VyQXZiT3BzKGNvbnN0IHN0ZDo6c3RyaW5nJiBzbG90X3N1ZmZpeCkgewogICAgIC8vIFdlIG9ubHkgbmVlZCB0byBwcm92aWRlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiByZWFkX2Zyb21fcGFydGl0aW9uKCkKICAgICAvLyBvcGVyYXRpb24gc2luY2UgdGhhdCdzIGFsbCB3aGF0IGlzIGJlaW5nIHVzZWQgYnkgdGhlIGF2Yl9zbG90X3ZlcmlmeSgpLgogICAgIC8vIE90aGVyIEkvTyBvcGVyYXRpb25zIGFyZSBvbmx5IHJlcXVpcmVkIGluIGJvb3Rsb2FkZXIgYnV0IG5vdCBpbgpAQCAtMTM1LDYgKzEzNiwxMSBAQAogCiAgICAgLy8gU2V0cyB1c2VyX2RhdGEgZm9yIEdldEluc3RhbmNlRnJvbUF2Yk9wcygpIHRvIGNvbnZlcnQgaXQgYmFjayB0byBGc01hbmFnZXJBdmJPcHMuCiAgICAgYXZiX29wc18udXNlcl9kYXRhID0gdGhpczsKKworICAgIHNsb3Rfc3VmZml4XyA9IHNsb3Rfc3VmZml4OworICAgIGlmIChzbG90X3N1ZmZpeF8uZW1wdHkoKSkgeworICAgICAgICBzbG90X3N1ZmZpeF8gPSBmc19tZ3JfZ2V0X3Nsb3Rfc3VmZml4KCk7CisgICAgfQogfQogCiAvLyBHaXZlbiBhIHBhcnRpdGlvbiBuYW1lICh3aXRoIGFiX3N1ZmZpeCksIGUuZy4sIHN5c3RlbV9hLCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nCkBAIC0xNDksNyArMTU1LDcgQEAKICAgICAgICAgcmV0dXJuICIiOwogICAgIH0KIAotICAgIGNvbnN0IGF1dG8gbW91bnRfcG9pbnQgPSBEZXJpdmVNb3VudFBvaW50KHBhcnRpdGlvbl9uYW1lKTsKKyAgICBjb25zdCBhdXRvIG1vdW50X3BvaW50ID0gRGVyaXZlTW91bnRQb2ludChwYXJ0aXRpb25fbmFtZSwgc2xvdF9zdWZmaXhfKTsKICAgICBpZiAobW91bnRfcG9pbnQuZW1wdHkoKSkgcmV0dXJuICIiOwogCiAgICAgYXV0byBmc3RhYl9lbnRyeSA9IEdldEVudHJ5Rm9yTW91bnRQb2ludCgmZnN0YWJfLCBtb3VudF9wb2ludCk7CmRpZmYgLS1naXQgYS9mc19tZ3IvbGliZnNfYXZiL2F2Yl9vcHMuaCBiL2ZzX21nci9saWJmc19hdmIvYXZiX29wcy5oCmluZGV4IDEyNjg2YTYuLjcwOTA5MWUgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJmc19hdmIvYXZiX29wcy5oCisrKyBiL2ZzX21nci9saWJmc19hdmIvYXZiX29wcy5oCkBAIC00OCw3ICs0OCw3IEBACiAvLwogY2xhc3MgRnNNYW5hZ2VyQXZiT3BzIHsKICAgcHVibGljOgotICAgIEZzTWFuYWdlckF2Yk9wcygpOworICAgIGV4cGxpY2l0IEZzTWFuYWdlckF2Yk9wcyhjb25zdCBzdGQ6OnN0cmluZyYgc2xvdF9zdWZmaXggPSB7fSk7CiAKICAgICBzdGF0aWMgRnNNYW5hZ2VyQXZiT3BzKiBHZXRJbnN0YW5jZUZyb21BdmJPcHMoQXZiT3BzKiBvcHMpIHsKICAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RnNNYW5hZ2VyQXZiT3BzKj4ob3BzLT51c2VyX2RhdGEpOwpAQCAtNjYsNiArNjYsNyBAQAogICAgIHN0ZDo6c3RyaW5nIEdldFBhcnRpdGlvblBhdGgoY29uc3QgY2hhciogcGFydGl0aW9uX25hbWUpOwogICAgIEF2Yk9wcyBhdmJfb3BzXzsKICAgICBGc3RhYiBmc3RhYl87CisgICAgc3RkOjpzdHJpbmcgc2xvdF9zdWZmaXhfOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGZzX21ncgpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYmZzX2F2Yi9hdmJfdXRpbC5jcHAgYi9mc19tZ3IvbGliZnNfYXZiL2F2Yl91dGlsLmNwcAppbmRleCA5MGI2NWNlLi4zN2M5ZWFiIDEwMDY0NAotLS0gYS9mc19tZ3IvbGliZnNfYXZiL2F2Yl91dGlsLmNwcAorKysgYi9mc19tZ3IvbGliZnNfYXZiL2F2Yl91dGlsLmNwcApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGFycmF5PgogI2luY2x1ZGUgPHNzdHJlYW0+CiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CmRpZmYgLS1naXQgYS9mc19tZ3IvbGliZnNfYXZiL2ZzX2F2Yi5jcHAgYi9mc19tZ3IvbGliZnNfYXZiL2ZzX2F2Yi5jcHAKaW5kZXggYTI4ODg3Ni4uNGU2YWFmNSAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYmZzX2F2Yi9mc19hdmIuY3BwCisrKyBiL2ZzX21nci9saWJmc19hdmIvZnNfYXZiLmNwcApAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcGFyc2VpbnQuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KQEAgLTE4Miw2ICsxODMsMTEgQEAKIAogLy8gY2xhc3MgQXZiSGFuZGxlCiAvLyAtLS0tLS0tLS0tLS0tLS0KK0F2YkhhbmRsZTo6QXZiSGFuZGxlKCkgOiBzdGF0dXNfKEF2YkhhbmRsZVN0YXR1czo6a1VuaW5pdGlhbGl6ZWQpIHsKKyAgICBzbG90X3N1ZmZpeF8gPSBmc19tZ3JfZ2V0X3Nsb3Rfc3VmZml4KCk7CisgICAgb3RoZXJfc2xvdF9zdWZmaXhfID0gZnNfbWdyX2dldF9vdGhlcl9zbG90X3N1ZmZpeCgpOworfQorCiBBdmJVbmlxdWVQdHIgQXZiSGFuZGxlOjpMb2FkQW5kVmVyaWZ5VmJtZXRhKAogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFydGl0aW9uX25hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBhYl9zdWZmaXgsCiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhYl9vdGhlcl9zdWZmaXgsIGNvbnN0IHN0ZDo6c3RyaW5nJiBleHBlY3RlZF9wdWJsaWNfa2V5X3BhdGgsCkBAIC0xOTQsNiArMjAwLDkgQEAKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgfQogCisgICAgYXZiX2hhbmRsZS0+c2xvdF9zdWZmaXhfID0gYWJfc3VmZml4OworICAgIGF2Yl9oYW5kbGUtPm90aGVyX3Nsb3Rfc3VmZml4XyA9IGFiX290aGVyX3N1ZmZpeDsKKwogICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkX2tleV9ibG9iOwogICAgIGlmICghZXhwZWN0ZWRfcHVibGljX2tleV9wYXRoLmVtcHR5KCkpIHsKICAgICAgICAgaWYgKGFjY2VzcyhleHBlY3RlZF9wdWJsaWNfa2V5X3BhdGguY19zdHIoKSwgRl9PSykgIT0gMCkgewpAQCAtMjgwLDE0ICsyODksODIgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUF2YlVuaXF1ZVB0ciBBdmJIYW5kbGU6OkxvYWRBbmRWZXJpZnlWYm1ldGEoY29uc3QgRnN0YWJFbnRyeSYgZnN0YWJfZW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcHJlbG9hZF9hdmJfa2V5X2Jsb2JzKSB7Citib29sIElzUHVibGljS2V5TWF0Y2hpbmcoY29uc3QgRnN0YWJFbnRyeSYgZnN0YWJfZW50cnksIGNvbnN0IHN0ZDo6c3RyaW5nJiBwdWJsaWNfa2V5X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwcmVsb2FkX2F2Yl9rZXlfYmxvYnMpIHsKICAgICAvLyBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBzaG91bGQgYmUgcHJvdmlkZWQgZm9yIHB1YmxpYyBrZXkgbWF0Y2hpbmcuCiAgICAgaWYgKHByZWxvYWRfYXZiX2tleV9ibG9icy5lbXB0eSgpICYmIGZzdGFiX2VudHJ5LmF2Yl9rZXlzLmVtcHR5KCkpIHsKICAgICAgICAgTEVSUk9SIDw8ICJhdmJfa2V5cz0vcGF0aC90by9rZXkocykgaXMgbWlzc2luZyBmb3IgIiA8PCBmc3RhYl9lbnRyeS5tb3VudF9wb2ludDsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICAvLyBFeHBlY3RlZCBrZXkgc2hvdWxkbid0IGJlIGVtcHR5LgorICAgIGlmIChwdWJsaWNfa2V5X2RhdGEuZW1wdHkoKSkgeworICAgICAgICBMRVJST1IgPDwgInB1YmxpYyBrZXkgZGF0YSBzaG91bGRuJ3QgYmUgZW1wdHkgZm9yICIgPDwgZnN0YWJfZW50cnkubW91bnRfcG9pbnQ7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBQZXJmb3JtcyBrZXkgbWF0Y2hpbmcgZm9yIHByZWxvYWRfYXZiX2tleV9ibG9icyBmaXJzdCwgaWYgaXQgaXMgcHJlc2VudC4KKyAgICBpZiAoIXByZWxvYWRfYXZiX2tleV9ibG9icy5lbXB0eSgpKSB7CisgICAgICAgIGlmIChzdGQ6OmZpbmQocHJlbG9hZF9hdmJfa2V5X2Jsb2JzLmJlZ2luKCksIHByZWxvYWRfYXZiX2tleV9ibG9icy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNfa2V5X2RhdGEpICE9IHByZWxvYWRfYXZiX2tleV9ibG9icy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBQZXJmb3JtcyBrZXkgbWF0Y2hpbmcgZm9yIGZzdGFiX2VudHJ5LmF2Yl9rZXlzIGlmIG5lY2Vzc2FyeS4KKyAgICAvLyBOb3RlIHRoYXQgaXQgaXMgaW50ZW50aW9uYWwgdG8gbWF0Y2ggYm90aCBwcmVsb2FkX2F2Yl9rZXlfYmxvYnMgYW5kIGZzdGFiX2VudHJ5LmF2Yl9rZXlzLgorICAgIC8vIFNvbWUga2V5cyBtaWdodCBvbmx5IGJlIGF2YWlsYWJsZSBiZWZvcmUgaW5pdCBjaHJvb3RzIGludG8gL3N5c3RlbSwgZS5nLiwgL2F2Yi9rZXkxCisgICAgLy8gaW4gdGhlIGZpcnN0LXN0YWdlIHJhbWRpc2ssIHdoaWxlIG90aGVyIGtleXMgbWlnaHQgb25seSBiZSBhdmFpbGFibGUgYWZ0ZXIgdGhlIGNocm9vdCwKKyAgICAvLyBlLmcuLCAvc3lzdGVtL2V0Yy9hdmIva2V5Mi4KKyAgICAvLyBmc3RhYl9lbnRyeS5hdmJfa2V5cyBtaWdodCBiZSBlaXRoZXIgYSBkaXJlY3RvcnkgY29udGFpbmluZyBtdWx0aXBsZSBrZXlzLAorICAgIC8vIG9yIGEgc3RyaW5nIGluZGljYXRpbmcgbXVsdGlwbGUga2V5cyBzZXBhcmF0ZWQgYnkgJzonLgorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhbGxvd2VkX2F2Yl9rZXlzOworICAgIGF1dG8gbGlzdF9hdmJfa2V5c19pbl9kaXIgPSBMaXN0RmlsZXMoZnN0YWJfZW50cnkuYXZiX2tleXMpOworICAgIGlmIChsaXN0X2F2Yl9rZXlzX2luX2Rpci5vaygpKSB7CisgICAgICAgIHN0ZDo6c29ydChsaXN0X2F2Yl9rZXlzX2luX2Rpci0+YmVnaW4oKSwgbGlzdF9hdmJfa2V5c19pbl9kaXItPmVuZCgpKTsKKyAgICAgICAgYWxsb3dlZF9hdmJfa2V5cyA9ICpsaXN0X2F2Yl9rZXlzX2luX2RpcjsKKyAgICB9IGVsc2UgeworICAgICAgICBhbGxvd2VkX2F2Yl9rZXlzID0gU3BsaXQoZnN0YWJfZW50cnkuYXZiX2tleXMsICI6Iik7CisgICAgfQorICAgIHJldHVybiBWYWxpZGF0ZVB1YmxpY0tleUJsb2IocHVibGljX2tleV9kYXRhLCBhbGxvd2VkX2F2Yl9rZXlzKTsKK30KKworYm9vbCBJc0hhc2h0cmVlRGVzY3JpcHRvclJvb3REaWdlc3RNYXRjaGluZyhjb25zdCBGc3RhYkVudHJ5JiBmc3RhYl9lbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VkJNZXRhRGF0YT4mIHZibWV0YV9pbWFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhYl9zdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhYl9vdGhlcl9zdWZmaXgpIHsKKyAgICAvLyBSZWFkIGV4cGVjdGVkIHZhbHVlIG9mIGhhc2h0cmVlIGRlc2NyaXB0b3Igcm9vdCBkaWdlc3QgZnJvbSBmc3RhYl9lbnRyeS4KKyAgICBzdGQ6OnN0cmluZyByb290X2RpZ2VzdF9leHBlY3RlZDsKKyAgICBpZiAoIVJlYWRGaWxlVG9TdHJpbmcoZnN0YWJfZW50cnkuYXZiX2hhc2h0cmVlX2RpZ2VzdCwgJnJvb3RfZGlnZXN0X2V4cGVjdGVkKSkgeworICAgICAgICBMRVJST1IgPDwgIkZhaWxlZCB0byBsb2FkIGV4cGVjdGVkIHJvb3QgZGlnZXN0IGZvciAiIDw8IGZzdGFiX2VudHJ5Lm1vdW50X3BvaW50OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gUmVhZCBhY3R1YWwgaGFzaHRyZWUgZGVzY3JpcHRvciBmcm9tIHZibWV0YSBpbWFnZS4KKyAgICBzdGQ6OnN0cmluZyBwYXJ0aXRpb25fbmFtZSA9IERlcml2ZUF2YlBhcnRpdGlvbk5hbWUoZnN0YWJfZW50cnksIGFiX3N1ZmZpeCwgYWJfb3RoZXJfc3VmZml4KTsKKyAgICBpZiAocGFydGl0aW9uX25hbWUuZW1wdHkoKSkgeworICAgICAgICBMRVJST1IgPDwgIkZhaWxlZCB0byBmaW5kIHBhcnRpdGlvbiBuYW1lIGZvciAiIDw8IGZzdGFiX2VudHJ5Lm1vdW50X3BvaW50OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjxGc0F2Ykhhc2h0cmVlRGVzY3JpcHRvcj4gaGFzaHRyZWVfZGVzY3JpcHRvciA9CisgICAgICAgICAgICBhbmRyb2lkOjpmc19tZ3I6OkdldEhhc2h0cmVlRGVzY3JpcHRvcihwYXJ0aXRpb25fbmFtZSwgdmJtZXRhX2ltYWdlcyk7CisgICAgaWYgKCFoYXNodHJlZV9kZXNjcmlwdG9yKSB7CisgICAgICAgIExFUlJPUiA8PCAiTm90IGZvdW5kIGhhc2h0cmVlIGRlc2NyaXB0b3IgZm9yICIgPDwgZnN0YWJfZW50cnkubW91bnRfcG9pbnQ7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBQZXJmb3JtcyBoYXNodHJlZSBkZXNjcmlwdG9yIHJvb3QgZGlnZXN0IG1hdGNoaW5nLgorICAgIGlmIChoYXNodHJlZV9kZXNjcmlwdG9yLT5yb290X2RpZ2VzdCAhPSByb290X2RpZ2VzdF9leHBlY3RlZCkgeworICAgICAgICBMRVJST1IgPDwgInJvb3QgZGlnZXN0ICgiIDw8IGhhc2h0cmVlX2Rlc2NyaXB0b3ItPnJvb3RfZGlnZXN0CisgICAgICAgICAgICAgICA8PCAiKSBpcyBkaWZmZXJlbnQgZnJvbSBleHBlY3RlZCB2YWx1ZSAoIiA8PCByb290X2RpZ2VzdF9leHBlY3RlZCA8PCAiKSI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworQXZiVW5pcXVlUHRyIEF2YkhhbmRsZTo6TG9hZEFuZFZlcmlmeVZibWV0YShjb25zdCBGc3RhYkVudHJ5JiBmc3RhYl9lbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwcmVsb2FkX2F2Yl9rZXlfYmxvYnMpIHsKICAgICAvLyBCaW5kcyBhbGxvd192ZXJpZmljYXRpb25fZXJyb3IgYW5kIHJvbGxiYWNrX3Byb3RlY3Rpb24gdG8gZGV2aWNlIHVubG9jayBzdGF0ZS4KICAgICBib29sIGFsbG93X3ZlcmlmaWNhdGlvbl9lcnJvciA9IElzQXZiUGVybWlzc2l2ZSgpOwogICAgIGJvb2wgcm9sbGJhY2tfcHJvdGVjdGlvbiA9ICFhbGxvd192ZXJpZmljYXRpb25fZXJyb3I7CkBAIC0zMjUsNDAgKzQwMiwyNCBAQAogICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgfQogCi0gICAgYm9vbCBwdWJsaWNfa2V5X21hdGNoID0gZmFsc2U7Ci0gICAgLy8gUGVyZm9ybXMga2V5IG1hdGNoaW5nIGZvciBwcmVsb2FkX2F2Yl9rZXlfYmxvYnMgZmlyc3QsIGlmIGl0IGlzIHByZXNlbnQuCi0gICAgaWYgKCFwdWJsaWNfa2V5X2RhdGEuZW1wdHkoKSAmJiAhcHJlbG9hZF9hdmJfa2V5X2Jsb2JzLmVtcHR5KCkpIHsKLSAgICAgICAgaWYgKHN0ZDo6ZmluZChwcmVsb2FkX2F2Yl9rZXlfYmxvYnMuYmVnaW4oKSwgcHJlbG9hZF9hdmJfa2V5X2Jsb2JzLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY19rZXlfZGF0YSkgIT0gcHJlbG9hZF9hdmJfa2V5X2Jsb2JzLmVuZCgpKSB7Ci0gICAgICAgICAgICBwdWJsaWNfa2V5X21hdGNoID0gdHJ1ZTsKKyAgICAvLyBWZXJpZnkgdmJtZXRhIGltYWdlIGNoZWNraW5nIGJ5IGVpdGhlciBwdWJsaWMga2V5IG9yIGhhc2h0cmVlIGRlc2NyaXB0b3Igcm9vdCBkaWdlc3QuCisgICAgaWYgKCFwcmVsb2FkX2F2Yl9rZXlfYmxvYnMuZW1wdHkoKSB8fCAhZnN0YWJfZW50cnkuYXZiX2tleXMuZW1wdHkoKSkgeworICAgICAgICBpZiAoIUlzUHVibGljS2V5TWF0Y2hpbmcoZnN0YWJfZW50cnksIHB1YmxpY19rZXlfZGF0YSwgcHJlbG9hZF9hdmJfa2V5X2Jsb2JzKSkgeworICAgICAgICAgICAgYXZiX2hhbmRsZS0+c3RhdHVzXyA9IEF2YkhhbmRsZVN0YXR1czo6a1ZlcmlmaWNhdGlvbkVycm9yOworICAgICAgICAgICAgTFdBUk5JTkcgPDwgIkZvdW5kIHVua25vd24gcHVibGljIGtleSB1c2VkIHRvIHNpZ24gIiA8PCBmc3RhYl9lbnRyeS5tb3VudF9wb2ludDsKKyAgICAgICAgICAgIGlmICghYWxsb3dfdmVyaWZpY2F0aW9uX2Vycm9yKSB7CisgICAgICAgICAgICAgICAgTEVSUk9SIDw8ICJVbmtub3duIHB1YmxpYyBrZXkgaXMgbm90IGFsbG93ZWQiOworICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfQotICAgIC8vIFBlcmZvcm1zIGtleSBtYXRjaGluZyBmb3IgZnN0YWJfZW50cnkuYXZiX2tleXMgaWYgbmVjZXNzYXJ5LgotICAgIC8vIE5vdGUgdGhhdCBpdCBpcyBpbnRlbnRpb25hbCB0byBtYXRjaCBib3RoIHByZWxvYWRfYXZiX2tleV9ibG9icyBhbmQgZnN0YWJfZW50cnkuYXZiX2tleXMuCi0gICAgLy8gU29tZSBrZXlzIG1pZ2h0IG9ubHkgYmUgYXZhaWxibGUgYmVmb3JlIGluaXQgY2hyb290cyBpbnRvIC9zeXN0ZW0sIGUuZy4sIC9hdmIva2V5MQotICAgIC8vIGluIHRoZSBmaXJzdC1zdGFnZSByYW1kaXNrLCB3aGlsZSBvdGhlciBrZXlzIG1pZ2h0IG9ubHkgYmUgYXZhaWxhYmxlIGFmdGVyIHRoZSBjaHJvb3QsCi0gICAgLy8gZS5nLiwgL3N5c3RlbS9ldGMvYXZiL2tleTIuCi0gICAgaWYgKCFwdWJsaWNfa2V5X2RhdGEuZW1wdHkoKSAmJiAhcHVibGljX2tleV9tYXRjaCkgewotICAgICAgICAvLyBmc3RhYl9lbnRyeS5hdmJfa2V5cyBtaWdodCBiZSBlaXRoZXIgYSBkaXJlY3RvcnkgY29udGFpbmluZyBtdWx0aXBsZSBrZXlzLAotICAgICAgICAvLyBvciBhIHN0cmluZyBpbmRpY2F0aW5nIG11bHRpcGxlIGtleXMgc2VwYXJhdGVkIGJ5ICc6Jy4KLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGFsbG93ZWRfYXZiX2tleXM7Ci0gICAgICAgIGF1dG8gbGlzdF9hdmJfa2V5c19pbl9kaXIgPSBMaXN0RmlsZXMoZnN0YWJfZW50cnkuYXZiX2tleXMpOwotICAgICAgICBpZiAobGlzdF9hdmJfa2V5c19pbl9kaXIub2soKSkgewotICAgICAgICAgICAgc3RkOjpzb3J0KGxpc3RfYXZiX2tleXNfaW5fZGlyLT5iZWdpbigpLCBsaXN0X2F2Yl9rZXlzX2luX2Rpci0+ZW5kKCkpOwotICAgICAgICAgICAgYWxsb3dlZF9hdmJfa2V5cyA9ICpsaXN0X2F2Yl9rZXlzX2luX2RpcjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFsbG93ZWRfYXZiX2tleXMgPSBTcGxpdChmc3RhYl9lbnRyeS5hdmJfa2V5cywgIjoiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoVmFsaWRhdGVQdWJsaWNLZXlCbG9iKHB1YmxpY19rZXlfZGF0YSwgYWxsb3dlZF9hdmJfa2V5cykpIHsKLSAgICAgICAgICAgIHB1YmxpY19rZXlfbWF0Y2ggPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFwdWJsaWNfa2V5X21hdGNoKSB7CisgICAgfSBlbHNlIGlmICghSXNIYXNodHJlZURlc2NyaXB0b3JSb290RGlnZXN0TWF0Y2hpbmcoZnN0YWJfZW50cnksIGF2Yl9oYW5kbGUtPnZibWV0YV9pbWFnZXNfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Yl9oYW5kbGUtPnNsb3Rfc3VmZml4XywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmJfaGFuZGxlLT5vdGhlcl9zbG90X3N1ZmZpeF8pKSB7CiAgICAgICAgIGF2Yl9oYW5kbGUtPnN0YXR1c18gPSBBdmJIYW5kbGVTdGF0dXM6OmtWZXJpZmljYXRpb25FcnJvcjsKLSAgICAgICAgTFdBUk5JTkcgPDwgIkZvdW5kIHVua25vd24gcHVibGljIGtleSB1c2VkIHRvIHNpZ24gIiA8PCBmc3RhYl9lbnRyeS5tb3VudF9wb2ludDsKKyAgICAgICAgTFdBUk5JTkcgPDwgIkZvdW5kIHVua25vd24gaGFzaHRyZWUgZGVzY3JpcHRvciByb290IGRpZ2VzdCB1c2VkIG9uICIKKyAgICAgICAgICAgICAgICAgPDwgZnN0YWJfZW50cnkubW91bnRfcG9pbnQ7CiAgICAgICAgIGlmICghYWxsb3dfdmVyaWZpY2F0aW9uX2Vycm9yKSB7Ci0gICAgICAgICAgICBMRVJST1IgPDwgIlVua25vd24gcHVibGljIGtleSBpcyBub3QgYWxsb3dlZCI7CisgICAgICAgICAgICBMRVJST1IgPDwgIlZlcmlmaWNhdGlvbiBiYXNlZCBvbiByb290IGRpZ2VzdCBmYWlsZWQuIFZibWV0YSBpbWFnZSBpcyBub3QgYWxsb3dlZC4iOwogICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgICAgIH0KICAgICB9CkBAIC0zNzMsOSArNDM0LDE0IEBACiAgICAgcmV0dXJuIGF2Yl9oYW5kbGU7CiB9CiAKLUF2YlVuaXF1ZVB0ciBBdmJIYW5kbGU6OkxvYWRBbmRWZXJpZnlWYm1ldGEoKSB7CitBdmJVbmlxdWVQdHIgQXZiSGFuZGxlOjpMb2FkQW5kVmVyaWZ5VmJtZXRhKGNvbnN0IHN0ZDo6c3RyaW5nJiBzbG90X3N1ZmZpeCkgewogICAgIC8vIExvYWRzIGlubGluZSB2Ym1ldGEgaW1hZ2VzLCBzdGFydGluZyBmcm9tIC92Ym1ldGEuCi0gICAgcmV0dXJuIExvYWRBbmRWZXJpZnlWYm1ldGEoInZibWV0YSIsIGZzX21ncl9nZXRfc2xvdF9zdWZmaXgoKSwgZnNfbWdyX2dldF9vdGhlcl9zbG90X3N1ZmZpeCgpLAorICAgIGF1dG8gc3VmZml4ID0gc2xvdF9zdWZmaXg7CisgICAgaWYgKHN1ZmZpeC5lbXB0eSgpKSB7CisgICAgICAgIHN1ZmZpeCA9IGZzX21ncl9nZXRfc2xvdF9zdWZmaXgoKTsKKyAgICB9CisgICAgYXV0byBvdGhlcl9zdWZmaXggPSBhbmRyb2lkOjpmc19tZ3I6Ok90aGVyU2xvdFN1ZmZpeChzdWZmaXgpOworICAgIHJldHVybiBMb2FkQW5kVmVyaWZ5VmJtZXRhKCJ2Ym1ldGEiLCBzdWZmaXgsIG90aGVyX3N1ZmZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7fSAvKiBleHBlY3RlZF9wdWJsaWNfa2V5LCBhbHJlYWR5IGNoZWNrZWQgYnkgYm9vdGxvYWRlciAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXNoQWxnb3JpdGhtOjprU0hBMjU2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzQXZiUGVybWlzc2l2ZSgpLCAvKiBhbGxvd192ZXJpZmljYXRpb25fZXJyb3IgKi8KQEAgLTM5OSw3ICs0NjUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBVkJfU0xPVF9WRVJJRllfRkxBR1NfQUxMT1dfVkVSSUZJQ0FUSU9OX0VSUk9SCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFWQl9TTE9UX1ZFUklGWV9GTEFHU19OT05FOwogICAgIEF2YlNsb3RWZXJpZnlSZXN1bHQgdmVyaWZ5X3Jlc3VsdCA9Ci0gICAgICAgICAgICBhdmJfb3BzLkF2YlNsb3RWZXJpZnkoZnNfbWdyX2dldF9zbG90X3N1ZmZpeCgpLCBmbGFncywgJmF2Yl9oYW5kbGUtPnZibWV0YV9pbWFnZXNfKTsKKyAgICAgICAgICAgIGF2Yl9vcHMuQXZiU2xvdFZlcmlmeShhdmJfaGFuZGxlLT5zbG90X3N1ZmZpeF8sIGZsYWdzLCAmYXZiX2hhbmRsZS0+dmJtZXRhX2ltYWdlc18pOwogCiAgICAgLy8gT25seSBhbGxvdyB0aGUgZm9sbG93aW5nIHZlcmlmeSByZXN1bHRzOgogICAgIC8vICAgLSBBVkJfU0xPVF9WRVJJRllfUkVTVUxUX09LLgpAQCAtNDkyLDcgKzU1OCw3IEBACiAgICAgfQogCiAgICAgaWYgKCFMb2FkQXZiSGFzaHRyZWVUb0VuYWJsZVZlcml0eShmc3RhYl9lbnRyeSwgd2FpdF9mb3JfdmVyaXR5X2RldiwgdmJtZXRhX2ltYWdlc18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmc19tZ3JfZ2V0X3Nsb3Rfc3VmZml4KCksIGZzX21ncl9nZXRfb3RoZXJfc2xvdF9zdWZmaXgoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3Rfc3VmZml4Xywgb3RoZXJfc2xvdF9zdWZmaXhfKSkgewogICAgICAgICByZXR1cm4gQXZiSGFzaHRyZWVSZXN1bHQ6OmtGYWlsOwogICAgIH0KIApAQCAtNTI2LDggKzU5Miw4IEBACiAgICAgaWYgKHZibWV0YV9pbWFnZXNfLnNpemUoKSA8IDEpIHsKICAgICAgICAgcmV0dXJuICIiOwogICAgIH0KLSAgICBzdGQ6OnN0cmluZyBhdmJfcGFydGl0aW9uX25hbWUgPSBEZXJpdmVBdmJQYXJ0aXRpb25OYW1lKGZzdGFiX2VudHJ5LCBmc19tZ3JfZ2V0X3Nsb3Rfc3VmZml4KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmc19tZ3JfZ2V0X290aGVyX3Nsb3Rfc3VmZml4KCkpOworICAgIHN0ZDo6c3RyaW5nIGF2Yl9wYXJ0aXRpb25fbmFtZSA9CisgICAgICAgICAgICBEZXJpdmVBdmJQYXJ0aXRpb25OYW1lKGZzdGFiX2VudHJ5LCBzbG90X3N1ZmZpeF8sIG90aGVyX3Nsb3Rfc3VmZml4Xyk7CiAgICAgYXV0byBhdmJfcHJvcF9uYW1lID0gImNvbS5hbmRyb2lkLmJ1aWxkLiIgKyBhdmJfcGFydGl0aW9uX25hbWUgKyAiLnNlY3VyaXR5X3BhdGNoIjsKICAgICByZXR1cm4gR2V0QXZiUHJvcGVydHlEZXNjcmlwdG9yKGF2Yl9wcm9wX25hbWUsIHZibWV0YV9pbWFnZXNfKTsKIH0KZGlmZiAtLWdpdCBhL2ZzX21nci9saWJmc19hdmIvZnNfYXZiX3V0aWwuY3BwIGIvZnNfbWdyL2xpYmZzX2F2Yi9mc19hdmJfdXRpbC5jcHAKaW5kZXggNTMyNjIyNi4uYTc0YWEyNSAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYmZzX2F2Yi9mc19hdmJfdXRpbC5jcHAKKysrIGIvZnNfbWdyL2xpYmZzX2F2Yi9mc19hdmJfdXRpbC5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgogI2luY2x1ZGUgPGZzdGFiL2ZzdGFiLmg+CiAjaW5jbHVkZSA8bGliYXZiL2xpYmF2Yi5oPgpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYmZzX2F2Yi9pbmNsdWRlL2ZzX2F2Yi9mc19hdmIuaCBiL2ZzX21nci9saWJmc19hdmIvaW5jbHVkZS9mc19hdmIvZnNfYXZiLmgKaW5kZXggNDcwMmU2OC4uOTI0YWIyNCAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYmZzX2F2Yi9pbmNsdWRlL2ZzX2F2Yi9mc19hdmIuaAorKysgYi9mc19tZ3IvbGliZnNfYXZiL2luY2x1ZGUvZnNfYXZiL2ZzX2F2Yi5oCkBAIC04Myw4ICs4Myw4IEBACiAgICAgLy8gICAgIGlzIHZlcmlmaWVkIGFuZCBjYW4gYmUgdHJ1c3RlZC4KICAgICAvLwogICAgIC8vIFRPRE8oYm93Z290c2FpKTogcmVtb3ZlIE9wZW4oKSBhbmQgc3dpdGNoIHRvIExvYWRBbmRWZXJpZnlWYm1ldGEoKS4KLSAgICBzdGF0aWMgQXZiVW5pcXVlUHRyIE9wZW4oKTsgICAgICAgICAgICAgICAgIC8vIGxvYWRzIGlubGluZSB2Ym1ldGEsIHZpYSBsaWJhdmIuCi0gICAgc3RhdGljIEF2YlVuaXF1ZVB0ciBMb2FkQW5kVmVyaWZ5VmJtZXRhKCk7ICAvLyBsb2FkcyBpbmxpbmUgdmJtZXRhLgorICAgIHN0YXRpYyBBdmJVbmlxdWVQdHIgT3BlbigpOyAgLy8gbG9hZHMgaW5saW5lIHZibWV0YSwgdmlhIGxpYmF2Yi4KKyAgICBzdGF0aWMgQXZiVW5pcXVlUHRyIExvYWRBbmRWZXJpZnlWYm1ldGEoY29uc3Qgc3RkOjpzdHJpbmcmIHNsb3Rfc3VmZml4ID0ge30pOwogCiAgICAgLy8gVGhlIGNhbGxlciBjYW4gc3BlY2lmeSBvcHRpb25hbCBwcmVsb2FkX2F2Yl9rZXlfYmxvYnMgZm9yIHB1YmxpYyBrZXkgbWF0Y2hpbmcuCiAgICAgLy8gVGhpcyBpcyBtb3N0bHkgZm9yIGluaXQgdG8gcHJlbG9hZCBBVkIga2V5cyBiZWZvcmUgY2hyb290IGludG8gL3N5c3RlbS4KQEAgLTEzNywxMiArMTM3LDE0IEBACiAgICAgQXZiSGFuZGxlJiBvcGVyYXRvcj0oQXZiSGFuZGxlJiYpIG5vZXhjZXB0ID0gZGVsZXRlOyAgLy8gbm8gbW92ZSBhc3NpZ25tZW50CiAKICAgcHJpdmF0ZToKLSAgICBBdmJIYW5kbGUoKSA6IHN0YXR1c18oQXZiSGFuZGxlU3RhdHVzOjprVW5pbml0aWFsaXplZCkge30KKyAgICBBdmJIYW5kbGUoKTsKIAogICAgIHN0ZDo6dmVjdG9yPFZCTWV0YURhdGE+IHZibWV0YV9pbWFnZXNfOwogICAgIFZCTWV0YUluZm8gdmJtZXRhX2luZm9fOyAgLy8gQSBzdW1tYXJ5IGluZm8gZm9yIHZibWV0YV9pbWFnZXNfLgogICAgIEF2YkhhbmRsZVN0YXR1cyBzdGF0dXNfOwogICAgIHN0ZDo6c3RyaW5nIGF2Yl92ZXJzaW9uXzsKKyAgICBzdGQ6OnN0cmluZyBzbG90X3N1ZmZpeF87CisgICAgc3RkOjpzdHJpbmcgb3RoZXJfc2xvdF9zdWZmaXhfOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGZzX21ncgpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYmZzX2F2Yi90ZXN0cy9hdmJfdXRpbF90ZXN0LmNwcCBiL2ZzX21nci9saWJmc19hdmIvdGVzdHMvYXZiX3V0aWxfdGVzdC5jcHAKaW5kZXggMmUzNDkyMC4uODVlZWViMCAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYmZzX2F2Yi90ZXN0cy9hdmJfdXRpbF90ZXN0LmNwcAorKysgYi9mc19tZ3IvbGliZnNfYXZiL3Rlc3RzL2F2Yl91dGlsX3Rlc3QuY3BwCkBAIC0xNiwxMCArMTYsMTEgQEAKIAogI2luY2x1ZGUgPGVuZGlhbi5oPgogCisjaW5jbHVkZSA8cmFuZG9tPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CiAjaW5jbHVkZSA8YmFzZS9maWxlcy9maWxlX3V0aWwuaD4KLSNpbmNsdWRlIDxiYXNlL3JhbmRfdXRpbC5oPgotI2luY2x1ZGUgPGJhc2Uvc3RyaW5ncy9zdHJpbmdfdXRpbC5oPgogI2luY2x1ZGUgPGxpYmF2Yi9saWJhdmIuaD4KIAogI2luY2x1ZGUgImF2Yl91dGlsLmgiCkBAIC03MCw3ICs3MSw3IEBACiAKICAgICBzdGQ6OnN0cmluZyBpbWFnZV9maWxlX25hbWUgPSBpbWFnZV9wYXRoLlJlbW92ZUV4dGVuc2lvbigpLkJhc2VOYW1lKCkudmFsdWUoKTsKICAgICBib29sIGlzX3ZibWV0YV9wYXJ0aXRpb24gPQotICAgICAgICBiYXNlOjpTdGFydHNXaXRoKGltYWdlX2ZpbGVfbmFtZSwgInZibWV0YSIsIGJhc2U6OkNvbXBhcmVDYXNlOjpJTlNFTlNJVElWRV9BU0NJSSk7CisgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGhJZ25vcmVDYXNlKGltYWdlX2ZpbGVfbmFtZSwgInZibWV0YSIpOwogCiAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGZkKG9wZW4oaW1hZ2VfcGF0aC52YWx1ZSgpLmNfc3RyKCksIE9fUkRXUiB8IE9fQ0xPRVhFQykpOwogICAgIEVYUEVDVF9UUlVFKGZkID4gMCk7CkBAIC02MDMsNyArNjA0LDcgQEAKICAgICBzdGQ6OnN0cmluZyBpbWFnZV9maWxlX25hbWUgPSBhdmJfaW1hZ2VfcGF0aC5SZW1vdmVFeHRlbnNpb24oKS5CYXNlTmFtZSgpLnZhbHVlKCk7CiAKICAgICBiYXNlOjpGaWxlUGF0aCBleHRyYWN0ZWRfdmJtZXRhX3BhdGg7Ci0gICAgaWYgKGJhc2U6OlN0YXJ0c1dpdGgoaW1hZ2VfZmlsZV9uYW1lLCAidmJtZXRhIiwgYmFzZTo6Q29tcGFyZUNhc2U6OklOU0VOU0lUSVZFX0FTQ0lJKSkgeworICAgIGlmIChhbmRyb2lkOjpiYXNlOjpTdGFydHNXaXRoSWdub3JlQ2FzZShpbWFnZV9maWxlX25hbWUsICJ2Ym1ldGEiKSkgewogICAgICAgICBleHRyYWN0ZWRfdmJtZXRhX3BhdGggPSBhdmJfaW1hZ2VfcGF0aDsgIC8vIG5vIG5lZWQgdG8gZXh0cmFjdCBpZiBpdCdzIGEgdmJtZXRhIGltYWdlLgogICAgIH0gZWxzZSB7CiAgICAgICAgIGV4dHJhY3RlZF92Ym1ldGFfcGF0aCA9IEV4dHJhY3RWQk1ldGFJbWFnZShhdmJfaW1hZ2VfcGF0aCwgaW1hZ2VfZmlsZV9uYW1lICsgIi12Ym1ldGEuaW1nIik7CkBAIC02NTUsMTAgKzY1NiwxMiBAQAogICAgICAgICAgICAgIiAgICAgIFBhcnRpdGlvbiBOYW1lOiAgICAgICAgICBib290XG4iCiAgICAgICAgICAgICAiICAgICAgUm9sbGJhY2sgSW5kZXggTG9jYXRpb246IDFcbiIKICAgICAgICAgICAgICIgICAgICBQdWJsaWMga2V5IChzaGExKTogICAgICAgY2RiYjc3MTc3ZjczMTkyMGJiZTBhMGY5NGY4NGQ5MDM4YWUwNjE3ZFxuIgorICAgICAgICAgICAgIiAgICAgIEZsYWdzOiAgICAgICAgICAgICAgICAgICAwXG4iCiAgICAgICAgICAgICAiICAgIENoYWluIFBhcnRpdGlvbiBkZXNjcmlwdG9yOlxuIgogICAgICAgICAgICAgIiAgICAgIFBhcnRpdGlvbiBOYW1lOiAgICAgICAgICBzeXN0ZW1cbiIKICAgICAgICAgICAgICIgICAgICBSb2xsYmFjayBJbmRleCBMb2NhdGlvbjogMlxuIgotICAgICAgICAgICAgIiAgICAgIFB1YmxpYyBrZXkgKHNoYTEpOiAgICAgICAyNTk3YzIxOGFhZTQ3MGExMzBmNjExNjJmZWFhZTcwYWZkOTdmMDExXG4iLAorICAgICAgICAgICAgIiAgICAgIFB1YmxpYyBrZXkgKHNoYTEpOiAgICAgICAyNTk3YzIxOGFhZTQ3MGExMzBmNjExNjJmZWFhZTcwYWZkOTdmMDExXG4iCisgICAgICAgICAgICAiICAgICAgRmxhZ3M6ICAgICAgICAgICAgICAgICAgIDBcbiIsCiAgICAgICAgICAgICBJbmZvSW1hZ2UoInZibWV0YS5pbWciKSk7CiAKICAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgZmQob3Blbih2Ym1ldGFfcGF0aC52YWx1ZSgpLmNfc3RyKCksIE9fUkRPTkxZIHwgT19DTE9FWEVDKSk7CkBAIC03MjUsNyArNzI4LDEwIEBACiAKICAgICAvLyBJbnRyb2R1Y2VzIGEgbmV3IG1vZGlmaWNhdGlvbi4KICAgICBpZiAobGVuZ3RoID4gMCkgewotICAgICAgICBpbnQgbW9kaWZ5X2xvY2F0aW9uID0gYmFzZTo6UmFuZEludChvZmZzZXQsIG9mZnNldCArIGxlbmd0aCAtIDEpOworICAgICAgICAvLyBtZXJzZW5uZV90d2lzdGVyX2VuZ2luZSBzZWVkZWQgd2l0aCB0aGUgZGVmYXVsdCBzZWVkIHNvdXJjZS4KKyAgICAgICAgc3RhdGljIHN0ZDo6bXQxOTkzNyBnZW4oc3RkOjpyYW5kb21fZGV2aWNle30oKSk7CisgICAgICAgIHN0ZDo6dW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPD4gcmFuZF9kaXN0cmlidXRpb24ob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGggLSAxKTsKKyAgICAgICAgaW50IG1vZGlmeV9sb2NhdGlvbiA9IHJhbmRfZGlzdHJpYnV0aW9uKGdlbik7CiAgICAgICAgIGZpbGVfY29udGVudFttb2RpZnlfbG9jYXRpb25dIF49IDB4ODA7CiAgICAgICAgIGxhc3RfZmlsZV9wYXRoID0gZmlsZV9wYXRoLnZhbHVlKCk7CiAgICAgICAgIGxhc3RfbW9kaWZpZWRfbG9jYXRpb24gPSBtb2RpZnlfbG9jYXRpb247CkBAIC04NzYsMTAgKzg4MiwxMiBAQAogICAgICAgICAgICAgIiAgICAgIFBhcnRpdGlvbiBOYW1lOiAgICAgICAgICBib290XG4iCiAgICAgICAgICAgICAiICAgICAgUm9sbGJhY2sgSW5kZXggTG9jYXRpb246IDFcbiIKICAgICAgICAgICAgICIgICAgICBQdWJsaWMga2V5IChzaGExKTogICAgICAgY2RiYjc3MTc3ZjczMTkyMGJiZTBhMGY5NGY4NGQ5MDM4YWUwNjE3ZFxuIgorICAgICAgICAgICAgIiAgICAgIEZsYWdzOiAgICAgICAgICAgICAgICAgICAwXG4iCiAgICAgICAgICAgICAiICAgIENoYWluIFBhcnRpdGlvbiBkZXNjcmlwdG9yOlxuIgogICAgICAgICAgICAgIiAgICAgIFBhcnRpdGlvbiBOYW1lOiAgICAgICAgICB2Ym1ldGFfc3lzdGVtXG4iCiAgICAgICAgICAgICAiICAgICAgUm9sbGJhY2sgSW5kZXggTG9jYXRpb246IDJcbiIKLSAgICAgICAgICAgICIgICAgICBQdWJsaWMga2V5IChzaGExKTogICAgICAgMjU5N2MyMThhYWU0NzBhMTMwZjYxMTYyZmVhYWU3MGFmZDk3ZjAxMVxuIiwKKyAgICAgICAgICAgICIgICAgICBQdWJsaWMga2V5IChzaGExKTogICAgICAgMjU5N2MyMThhYWU0NzBhMTMwZjYxMTYyZmVhYWU3MGFmZDk3ZjAxMVxuIgorICAgICAgICAgICAgIiAgICAgIEZsYWdzOiAgICAgICAgICAgICAgICAgICAwXG4iLAogICAgICAgICAgICAgSW5mb0ltYWdlKCJ2Ym1ldGEuaW1nIikpOwogCiAgICAgYm9vbCBmYXRhbF9lcnJvciA9IGZhbHNlOwpAQCAtOTA5LDcgKzkxNyw4IEBACiAgICAgICAgICAgICAiICAgIENoYWluIFBhcnRpdGlvbiBkZXNjcmlwdG9yOlxuIgogICAgICAgICAgICAgIiAgICAgIFBhcnRpdGlvbiBOYW1lOiAgICAgICAgICBzeXN0ZW1cbiIKICAgICAgICAgICAgICIgICAgICBSb2xsYmFjayBJbmRleCBMb2NhdGlvbjogM1xuIgotICAgICAgICAgICAgIiAgICAgIFB1YmxpYyBrZXkgKHNoYTEpOiAgICAgICAyNTk3YzIxOGFhZTQ3MGExMzBmNjExNjJmZWFhZTcwYWZkOTdmMDExXG4iLAorICAgICAgICAgICAgIiAgICAgIFB1YmxpYyBrZXkgKHNoYTEpOiAgICAgICAyNTk3YzIxOGFhZTQ3MGExMzBmNjExNjJmZWFhZTcwYWZkOTdmMDExXG4iCisgICAgICAgICAgICAiICAgICAgRmxhZ3M6ICAgICAgICAgICAgICAgICAgIDBcbiIsCiAgICAgICAgICAgICBJbmZvSW1hZ2UoInZibWV0YV9zeXN0ZW0uaW1nIikpOwogCiAgICAgY2hhaW5lZF9kZXNjcmlwdG9ycyA9IEdldENoYWluUGFydGl0aW9uSW5mbyhMb2FkVkJNZXRhRGF0YSgidmJtZXRhX3N5c3RlbS5pbWciKSwgJmZhdGFsX2Vycm9yKTsKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJmc19hdmIvdGVzdHMvYmFzaWNfdGVzdC5jcHAgYi9mc19tZ3IvbGliZnNfYXZiL3Rlc3RzL2Jhc2ljX3Rlc3QuY3BwCmluZGV4IDFjNDdjMDcuLmUwZDQ2NWUgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJmc19hdmIvdGVzdHMvYmFzaWNfdGVzdC5jcHAKKysrIGIvZnNfbWdyL2xpYmZzX2F2Yi90ZXN0cy9iYXNpY190ZXN0LmNwcApAQCAtMjAsNyArMjAsNiBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KICNpbmNsdWRlIDxiYXNlL2ZpbGVzL2ZpbGVfdXRpbC5oPgotI2luY2x1ZGUgPGJhc2Uvc3RyaW5ncy9zdHJpbmdfdXRpbC5oPgogCiBuYW1lc3BhY2UgZnNfYXZiX2hvc3RfdGVzdCB7CiAKQEAgLTI2OCwxMCArMjY3LDEyIEBACiAgICAgICAgICAgICAiICAgICAgUGFydGl0aW9uIE5hbWU6ICAgICAgICAgIGJvb3RcbiIKICAgICAgICAgICAgICIgICAgICBSb2xsYmFjayBJbmRleCBMb2NhdGlvbjogMVxuIgogICAgICAgICAgICAgIiAgICAgIFB1YmxpYyBrZXkgKHNoYTEpOiAgICAgICBjZGJiNzcxNzdmNzMxOTIwYmJlMGEwZjk0Zjg0ZDkwMzhhZTA2MTdkXG4iCisgICAgICAgICAgICAiICAgICAgRmxhZ3M6ICAgICAgICAgICAgICAgICAgIDBcbiIKICAgICAgICAgICAgICIgICAgQ2hhaW4gUGFydGl0aW9uIGRlc2NyaXB0b3I6XG4iCiAgICAgICAgICAgICAiICAgICAgUGFydGl0aW9uIE5hbWU6ICAgICAgICAgIHN5c3RlbVxuIgogICAgICAgICAgICAgIiAgICAgIFJvbGxiYWNrIEluZGV4IExvY2F0aW9uOiAyXG4iCi0gICAgICAgICAgICAiICAgICAgUHVibGljIGtleSAoc2hhMSk6ICAgICAgIDI1OTdjMjE4YWFlNDcwYTEzMGY2MTE2MmZlYWFlNzBhZmQ5N2YwMTFcbiIsCisgICAgICAgICAgICAiICAgICAgUHVibGljIGtleSAoc2hhMSk6ICAgICAgIDI1OTdjMjE4YWFlNDcwYTEzMGY2MTE2MmZlYWFlNzBhZmQ5N2YwMTFcbiIKKyAgICAgICAgICAgICIgICAgICBGbGFnczogICAgICAgICAgICAgICAgICAgMFxuIiwKICAgICAgICAgICAgIEluZm9JbWFnZSgidmJtZXRhLmltZyIpKTsKIH0KIApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYmZzX2F2Yi90ZXN0cy9mc19hdmJfdGVzdC5jcHAgYi9mc19tZ3IvbGliZnNfYXZiL3Rlc3RzL2ZzX2F2Yl90ZXN0LmNwcAppbmRleCAyYzgxOWE5Li41ZjE1M2Y1IDEwMDY0NAotLS0gYS9mc19tZ3IvbGliZnNfYXZiL3Rlc3RzL2ZzX2F2Yl90ZXN0LmNwcAorKysgYi9mc19tZ3IvbGliZnNfYXZiL3Rlc3RzL2ZzX2F2Yl90ZXN0LmNwcApAQCAtMTgsOCArMTgsOCBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgogI2luY2x1ZGUgPGJhc2UvZmlsZXMvZmlsZV91dGlsLmg+Ci0jaW5jbHVkZSA8YmFzZS9zdHJpbmdzL3N0cmluZ191dGlsLmg+CiAjaW5jbHVkZSA8ZnNfYXZiL2ZzX2F2Yi5oPgogI2luY2x1ZGUgPGxpYmF2Yi9saWJhdmIuaD4KIApAQCAtNDksNyArNDksNyBAQAogCiAgICAgLy8gT25seSBzdXBwb3J0IG1vZGlmeWluZyB0aGUgZmxhZ3MgaW4gdmJtZXRhKi5pbWcuCiAgICAgc3RkOjpzdHJpbmcgaW1hZ2VfZmlsZV9uYW1lID0gdmJtZXRhX2ltYWdlX3BhdGguUmVtb3ZlRXh0ZW5zaW9uKCkuQmFzZU5hbWUoKS52YWx1ZSgpOwotICAgIEFTU0VSVF9UUlVFKGJhc2U6OlN0YXJ0c1dpdGgoaW1hZ2VfZmlsZV9uYW1lLCAidmJtZXRhIiwgYmFzZTo6Q29tcGFyZUNhc2U6OklOU0VOU0lUSVZFX0FTQ0lJKSk7CisgICAgQVNTRVJUX1RSVUUoYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aElnbm9yZUNhc2UoaW1hZ2VfZmlsZV9uYW1lLCAidmJtZXRhIikpOwogCiAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGZkKG9wZW4odmJtZXRhX2ltYWdlX3BhdGgudmFsdWUoKS5jX3N0cigpLCBPX1JEV1IgfCBPX0NMT0VYRUMpKTsKICAgICBFWFBFQ1RfVFJVRShmZCA+IDApOwpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYmZzX2F2Yi90ZXN0cy9mc19hdmJfdGVzdF91dGlsLmNwcCBiL2ZzX21nci9saWJmc19hdmIvdGVzdHMvZnNfYXZiX3Rlc3RfdXRpbC5jcHAKaW5kZXggMWM5NWNmMC4uMjhmZGJjMiAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYmZzX2F2Yi90ZXN0cy9mc19hdmJfdGVzdF91dGlsLmNwcAorKysgYi9mc19tZ3IvbGliZnNfYXZiL3Rlc3RzL2ZzX2F2Yl90ZXN0X3V0aWwuY3BwCkBAIC0xOSw4ICsxOSw5IEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPGJhc2UvZmlsZXMvZmlsZV91dGlsLmg+Ci0jaW5jbHVkZSA8YmFzZS9zdHJpbmdzL3N0cmluZ191dGlsLmg+CiAKIG5hbWVzcGFjZSBmc19hdmJfaG9zdF90ZXN0IHsKIApAQCAtNjQsOSArNjUsNyBAQAogICAgIHN0ZDo6c3RyaW5nIHZibWV0YV9kaWdlc3RfZGF0YTsKICAgICBFWFBFQ1RfVFJVRShiYXNlOjpSZWFkRmlsZVRvU3RyaW5nKHZibWV0YV9kaWdlc3RfcGF0aCwgJnZibWV0YV9kaWdlc3RfZGF0YSkpOwogICAgIC8vIFJldHVybnMgdGhlIHRyaW1tZWQgZGlnZXN0LgotICAgIHN0ZDo6c3RyaW5nIHRyaW1tZWRfZGlnZXN0X2RhdGE7Ci0gICAgYmFzZTo6VHJpbVN0cmluZyh2Ym1ldGFfZGlnZXN0X2RhdGEsICIgXHRcbiIsICZ0cmltbWVkX2RpZ2VzdF9kYXRhKTsKLSAgICByZXR1cm4gdHJpbW1lZF9kaWdlc3RfZGF0YTsKKyAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6VHJpbSh2Ym1ldGFfZGlnZXN0X2RhdGEpOwogfQogCiBiYXNlOjpGaWxlUGF0aCBCYXNlRnNBdmJUZXN0OjpHZW5lcmF0ZVZCTWV0YUltYWdlKApAQCAtOTEsNyArOTAsNyBAQAogICAgIC8vIC0tY2hhaW5fcGFydGl0aW9ucwogICAgIHN0ZDo6c3RyaW5nIGNoYWluX3BhcnRpdGlvbl9vcHRpb25zOwogICAgIGZvciAoY29uc3QgYXV0byYgcGFydGl0aW9uIDogY2hhaW5fcGFydGl0aW9ucykgewotICAgICAgICBjaGFpbl9wYXJ0aXRpb25fb3B0aW9ucyArPSBiYXNlOjpTdHJpbmdQcmludGYoCisgICAgICAgIGNoYWluX3BhcnRpdGlvbl9vcHRpb25zICs9IGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigKICAgICAgICAgICAgICAgICAiIC0tY2hhaW5fcGFydGl0aW9uICVzOiV1OiVzIiwgcGFydGl0aW9uLnBhcnRpdGlvbl9uYW1lLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgcGFydGl0aW9uLnJvbGxiYWNrX2luZGV4X2xvY2F0aW9uLCBwYXJ0aXRpb24ua2V5X2Jsb2JfcGF0aC52YWx1ZSgpLmNfc3RyKCkpOwogICAgIH0KZGlmZiAtLWdpdCBhL2ZzX21nci9saWJmc19hdmIvdGVzdHMvZnNfYXZiX3Rlc3RfdXRpbC5oIGIvZnNfbWdyL2xpYmZzX2F2Yi90ZXN0cy9mc19hdmJfdGVzdF91dGlsLmgKaW5kZXggYWIxOTgwYi4uZmJkYTBlMSAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYmZzX2F2Yi90ZXN0cy9mc19hdmJfdGVzdF91dGlsLmgKKysrIGIvZnNfbWdyL2xpYmZzX2F2Yi90ZXN0cy9mc19hdmJfdGVzdF91dGlsLmgKQEAgLTI2LDkgKzI2LDkgQEAKICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KICNpbmNsdWRlIDxiYXNlL2ZpbGVzL2ZpbGVfcGF0aC5oPgotI2luY2x1ZGUgPGJhc2Uvc3RyaW5ncy9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxmc19hdmIvdHlwZXMuaD4KICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogCkBAIC0zNyw3ICszNyw3IEBACiAvLyB0aGUgY29tbWFuZCBleGl0cyBub3JtYWxseSB3aXRoIGV4aXQgc3RhdHVzIHxleHBlY3RlZF9leGl0X3N0YXR1c3wuCiAjZGVmaW5lIEVYUEVDVF9DT01NQU5EKGV4cGVjdGVkX2V4aXRfc3RhdHVzLCBjb21tYW5kX2Zvcm1hdCwgLi4uKSAgICAgICAgICAgICAgICAgICBcCiAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGludCByYyA9IHN5c3RlbShiYXNlOjpTdHJpbmdQcmludGYoY29tbWFuZF9mb3JtYXQsICMjX19WQV9BUkdTX18pLmNfc3RyKCkpOyBcCisgICAgICAgIGludCByYyA9IHN5c3RlbShhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoY29tbWFuZF9mb3JtYXQsICMjX19WQV9BUkdTX18pLmNfc3RyKCkpOyBcCiAgICAgICAgIEVYUEVDVF9UUlVFKFdJRkVYSVRFRChyYykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEVYUEVDVF9FUShXRVhJVFNUQVRVUyhyYyksIGV4cGVjdGVkX2V4aXRfc3RhdHVzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfSB3aGlsZSAoMCk7CmRpZmYgLS1naXQgYS9mc19tZ3IvbGliZnNfYXZiL3V0aWwuY3BwIGIvZnNfbWdyL2xpYmZzX2F2Yi91dGlsLmNwcAppbmRleCA3NzgzZDA0Li43OWM3Yjk0IDEwMDY0NAotLS0gYS9mc19tZ3IvbGliZnNfYXZiL3V0aWwuY3BwCisrKyBiL2ZzX21nci9saWJmc19hdmIvdXRpbC5jcHAKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgPHRocmVhZD4KIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYmZzX2F2Yi91dGlsLmggYi9mc19tZ3IvbGliZnNfYXZiL3V0aWwuaAppbmRleCAyOWQxZTljLi41NzA0NTYwIDEwMDY0NAotLS0gYS9mc19tZ3IvbGliZnNfYXZiL3V0aWwuaAorKysgYi9mc19tZ3IvbGliZnNfYXZiL3V0aWwuaApAQCAtMjAsMTIgKzIwLDYgQEAKICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogCi0jaWZkZWYgSE9TVF9URVNUCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jZWxzZQotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+Ci0jZW5kaWYKLQogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9yZXN1bHQuaD4KIAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6RXJybm9FcnJvcjsKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJmc3RhYi9BbmRyb2lkLmJwIGIvZnNfbWdyL2xpYmZzdGFiL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYwMjY5YwotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJmc3RhYi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNjIgQEAKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy8vCisKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiQW5kcm9pZC1BcGFjaGUtMi4wIiwKKyAgICAgICAgInN5c3RlbV9jb3JlX2ZzX21ncl9saWNlbnNlIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgLy8gRG8gbm90IGV2ZXIgbWFrZSB0aGlzIGEgc2hhcmVkIGxpYnJhcnkgYXMgbG9uZyBhcyBpdCBpcyB2ZW5kb3JfYXZhaWxhYmxlLgorICAgIC8vIEl0IGRvZXMgbm90IGhhdmUgYSBzdGFibGUgaW50ZXJmYWNlLgorICAgIG5hbWU6ICJsaWJmc3RhYiIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICByYW1kaXNrX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2ZW5kb3JfcmFtZGlza19hdmFpbGFibGU6IHRydWUsCisgICAgcmVjb3ZlcnlfYXZhaWxhYmxlOiB0cnVlLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIGRlZmF1bHRzOiBbImZzX21ncl9kZWZhdWx0cyJdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAorICAgICAgICAibGliZ3NpX2hlYWRlcnMiLAorICAgIF0sCisgICAgc3JjczogWworICAgICAgICAiZnN0YWIuY3BwIiwKKyAgICAgICAgImJvb3RfY29uZmlnLmNwcCIsCisgICAgICAgICJzbG90c2VsZWN0LmNwcCIsCisgICAgXSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICAgICAgdmVuZG9yOiB7CisgICAgICAgICAgICBjZmxhZ3M6IFsKKyAgICAgICAgICAgICAgICAvLyBTa2lwcGluZyBlbnRyaWVzIGluIGZzdGFiIHNob3VsZCBvbmx5IGJlIGRvbmUgaW4gYSBzeXN0ZW0KKyAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIGFzIHRoZSBjb25maWcgZmlsZSBpcyBpbiAvc3lzdGVtX2V4dC4KKyAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIG9wIGZyb20gdGhlIHZlbmRvciB2YXJpYW50LgorICAgICAgICAgICAgICAgICItRE5PX1NLSVBfTU9VTlQiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgfSwKKyAgICB9LAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOmFueWFwZXgiLAorICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgXSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIzMSIsCit9CmRpZmYgLS1naXQgYS9mc19tZ3IvbGliZnN0YWIvYm9vdF9jb25maWcuY3BwIGIvZnNfbWdyL2xpYmZzdGFiL2Jvb3RfY29uZmlnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjE0OTVlCi0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYmZzdGFiL2Jvb3RfY29uZmlnLmNwcApAQCAtMCwwICsxLDIwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CisKKyNpbmNsdWRlICJmc3RhYl9wcml2LmgiCisjaW5jbHVkZSAibG9nZ2luZ19tYWNyb3MuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZzX21nciB7CisKK2NvbnN0IHN0ZDo6c3RyaW5nJiBHZXRBbmRyb2lkRHREaXIoKSB7CisgICAgLy8gU2V0IG9uY2UgYW5kIHNhdmVzIHRpbWUgZm9yIHN1YnNlcXVlbnQgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbgorICAgIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQW5kcm9pZER0RGlyID0gW10geworICAgICAgICBzdGQ6OnN0cmluZyBhbmRyb2lkX2R0X2RpcjsKKyAgICAgICAgaWYgKChHZXRCb290Y29uZmlnKCJhbmRyb2lkYm9vdC5hbmRyb2lkX2R0X2RpciIsICZhbmRyb2lkX2R0X2RpcikgfHwKKyAgICAgICAgICAgICBHZXRLZXJuZWxDbWRsaW5lKCJhbmRyb2lkYm9vdC5hbmRyb2lkX2R0X2RpciIsICZhbmRyb2lkX2R0X2RpcikpICYmCisgICAgICAgICAgICAhYW5kcm9pZF9kdF9kaXIuZW1wdHkoKSkgeworICAgICAgICAgICAgLy8gRW5zdXJlIHRoZSByZXR1cm5lZCBwYXRoIGVuZHMgd2l0aCBhIC8KKyAgICAgICAgICAgIGlmIChhbmRyb2lkX2R0X2Rpci5iYWNrKCkgIT0gJy8nKSB7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9kdF9kaXIucHVzaF9iYWNrKCcvJyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIHN0YW5kYXJkIHByb2Nmcy1iYXNlZCBwYXRoCisgICAgICAgICAgICBhbmRyb2lkX2R0X2RpciA9ICIvcHJvYy9kZXZpY2UtdHJlZS9maXJtd2FyZS9hbmRyb2lkLyI7CisgICAgICAgIH0KKyAgICAgICAgTElORk8gPDwgIlVzaW5nIEFuZHJvaWQgRFQgZGlyZWN0b3J5ICIgPDwgYW5kcm9pZF9kdF9kaXI7CisgICAgICAgIHJldHVybiBhbmRyb2lkX2R0X2RpcjsKKyAgICB9KCk7CisgICAgcmV0dXJuIGtBbmRyb2lkRHREaXI7Cit9CisKK3ZvaWQgSW1wb3J0Qm9vdGNvbmZpZ0Zyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGJvb3Rjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcpPiYgZm4pIHsKKyAgICBmb3IgKHN0ZDo6c3RyaW5nX3ZpZXcgbGluZSA6IGFuZHJvaWQ6OmJhc2U6OlNwbGl0KGJvb3Rjb25maWcsICJcbiIpKSB7CisgICAgICAgIGNvbnN0IGF1dG8gZXF1YWxfcG9zID0gbGluZS5maW5kKCc9Jyk7CisgICAgICAgIHN0ZDo6c3RyaW5nIGtleSA9IGFuZHJvaWQ6OmJhc2U6OlRyaW0obGluZS5zdWJzdHIoMCwgZXF1YWxfcG9zKSk7CisgICAgICAgIGlmIChrZXkuZW1wdHkoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzdHJpbmcgdmFsdWU7CisgICAgICAgIGlmIChlcXVhbF9wb3MgIT0gbGluZS5ucG9zKSB7CisgICAgICAgICAgICB2YWx1ZSA9IGFuZHJvaWQ6OmJhc2U6OlRyaW0obGluZS5zdWJzdHIoZXF1YWxfcG9zICsgMSkpOworICAgICAgICAgICAgLy8gSWYgdGhlIHZhbHVlIGlzIGEgY29tbWEtZGVsaW1pdGVkIGxpc3QsIHRoZSBrZXJuZWwgd291bGQgaW5zZXJ0IGEgc3BhY2UgYmV0d2VlbiB0aGUKKyAgICAgICAgICAgIC8vIGxpc3QgZWxlbWVudHMgd2hlbiByZWFkIGZyb20gL3Byb2MvYm9vdGNvbmZpZy4KKyAgICAgICAgICAgIC8vIEJvYXJkQ29uZmlnLm1rOgorICAgICAgICAgICAgLy8gICAgICBCT0FSRF9CT09UQ09ORklHIDo9IGtleT12YWx1ZTEsdmFsdWUyLHZhbHVlMworICAgICAgICAgICAgLy8gL3Byb2MvYm9vdGNvbmZpZzoKKyAgICAgICAgICAgIC8vICAgICAga2V5ID0gInZhbHVlMSIsICJ2YWx1ZTIiLCAidmFsdWUzIgorICAgICAgICAgICAgaWYgKGtleSA9PSAiYW5kcm9pZGJvb3QuYm9vdF9kZXZpY2UiIHx8IGtleSA9PSAiYW5kcm9pZGJvb3QuYm9vdF9kZXZpY2VzIikgeworICAgICAgICAgICAgICAgIC8vIGJvb3RfZGV2aWNlW3NdIGlzIGEgc3BlY2lhbCBjYXNlIHdoZXJlIGEgbGlzdCBlbGVtZW50IGNhbiBjb250YWluIGNvbW1hIGFuZCB0aGUKKyAgICAgICAgICAgICAgICAvLyBjYWxsZXIgZXhwZWN0cyBhIHNwYWNlLWRlbGltaXRlZCBsaXN0LCBzbyBkb24ndCByZW1vdmUgc3BhY2UgaGVyZS4KKyAgICAgICAgICAgICAgICB2YWx1ZS5lcmFzZShzdGQ6OnJlbW92ZSh2YWx1ZS5iZWdpbigpLCB2YWx1ZS5lbmQoKSwgJyInKSwgdmFsdWUuZW5kKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBJbiBvcmRlciB0byBub3QgYnJlYWsgdGhlIGV4cGVjdGF0aW9ucyBvZiBleGlzdGluZyBjb2RlLCB3ZSBtb2RpZnkgdGhlIHZhbHVlIHRvCisgICAgICAgICAgICAgICAgLy8ga2VlcCB0aGUgZm9ybWF0IGNvbnNpc3RlbnQgd2l0aCB0aGUga2VybmVsIGNtZGxpbmUgYnkgcmVtb3ZpbmcgcXVvdGUgYW5kIHNwYWNlLgorICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nX3ZpZXcgc3YodmFsdWUpOworICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OkNvbnN1bWVQcmVmaXgoJnN2LCAiXCIiKTsKKyAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpDb25zdW1lU3VmZml4KCZzdiwgIlwiIik7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBhbmRyb2lkOjpiYXNlOjpTdHJpbmdSZXBsYWNlKHN2LCBSIigiLCAiKSIsICIsIiwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gImtleSIgYW5kICJrZXkgPSIgbWVhbnMgZW1wdHkgdmFsdWUuCisgICAgICAgIGZuKHN0ZDo6bW92ZShrZXkpLCBzdGQ6Om1vdmUodmFsdWUpKTsKKyAgICB9Cit9CisKK2Jvb2wgR2V0Qm9vdGNvbmZpZ0Zyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGJvb3Rjb25maWcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvdXQpIHsKKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgSW1wb3J0Qm9vdGNvbmZpZ0Zyb21TdHJpbmcoYm9vdGNvbmZpZywgWyZdKHN0ZDo6c3RyaW5nIGNvbmZpZ19rZXksIHN0ZDo6c3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGlmICghZm91bmQgJiYgY29uZmlnX2tleSA9PSBrZXkpIHsKKyAgICAgICAgICAgICpvdXQgPSBzdGQ6Om1vdmUodmFsdWUpOworICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICB9CisgICAgfSk7CisgICAgcmV0dXJuIGZvdW5kOworfQorCit2b2lkIEltcG9ydEJvb3Rjb25maWcoY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZyk+JiBmbikgeworICAgIHN0ZDo6c3RyaW5nIGJvb3Rjb25maWc7CisgICAgYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZygiL3Byb2MvYm9vdGNvbmZpZyIsICZib290Y29uZmlnKTsKKyAgICBJbXBvcnRCb290Y29uZmlnRnJvbVN0cmluZyhib290Y29uZmlnLCBmbik7Cit9CisKK2Jvb2wgR2V0Qm9vdGNvbmZpZyhjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBzdGQ6OnN0cmluZyogb3V0KSB7CisgICAgc3RkOjpzdHJpbmcgYm9vdGNvbmZpZzsKKyAgICBhbmRyb2lkOjpiYXNlOjpSZWFkRmlsZVRvU3RyaW5nKCIvcHJvYy9ib290Y29uZmlnIiwgJmJvb3Rjb25maWcpOworICAgIHJldHVybiBHZXRCb290Y29uZmlnRnJvbVN0cmluZyhib290Y29uZmlnLCBrZXksIG91dCk7Cit9CisKK3ZvaWQgSW1wb3J0S2VybmVsQ21kbGluZUZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGNtZGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcpPiYgZm4pIHsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIgcXVvdGUgPSAnIic7CisKKyAgICBzaXplX3QgYmFzZSA9IDA7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgLy8gc2tpcCBxdW90ZWQgc3BhbnMKKyAgICAgICAgYXV0byBmb3VuZCA9IGJhc2U7CisgICAgICAgIHdoaWxlICgoKGZvdW5kID0gY21kbGluZS5maW5kX2ZpcnN0X29mKCIgXCIiLCBmb3VuZCkpICE9IGNtZGxpbmUubnBvcykgJiYKKyAgICAgICAgICAgICAgIChjbWRsaW5lW2ZvdW5kXSA9PSBxdW90ZSkpIHsKKyAgICAgICAgICAgIC8vIHVuYmFsYW5jZWQgcXVvdGUgaXMgb2sKKyAgICAgICAgICAgIGlmICgoZm91bmQgPSBjbWRsaW5lLmZpbmQocXVvdGUsIGZvdW5kICsgMSkpID09IGNtZGxpbmUubnBvcykgYnJlYWs7CisgICAgICAgICAgICArK2ZvdW5kOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RyaW5nIHBpZWNlID0gY21kbGluZS5zdWJzdHIoYmFzZSwgZm91bmQgLSBiYXNlKTsKKyAgICAgICAgcGllY2UuZXJhc2Uoc3RkOjpyZW1vdmUocGllY2UuYmVnaW4oKSwgcGllY2UuZW5kKCksIHF1b3RlKSwgcGllY2UuZW5kKCkpOworICAgICAgICBhdXRvIGVxdWFsX3NpZ24gPSBwaWVjZS5maW5kKCc9Jyk7CisgICAgICAgIGlmIChlcXVhbF9zaWduID09IHBpZWNlLm5wb3MpIHsKKyAgICAgICAgICAgIGlmICghcGllY2UuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIC8vIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiA8a2V5PiBhbmQgPGtleT49CisgICAgICAgICAgICAgICAgZm4oc3RkOjptb3ZlKHBpZWNlKSwgIiIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgdmFsdWUgPSBwaWVjZS5zdWJzdHIoZXF1YWxfc2lnbiArIDEpOworICAgICAgICAgICAgcGllY2UucmVzaXplKGVxdWFsX3NpZ24pOworICAgICAgICAgICAgZm4oc3RkOjptb3ZlKHBpZWNlKSwgc3RkOjptb3ZlKHZhbHVlKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvdW5kID09IGNtZGxpbmUubnBvcykgYnJlYWs7CisgICAgICAgIGJhc2UgPSBmb3VuZCArIDE7CisgICAgfQorfQorCitib29sIEdldEtlcm5lbENtZGxpbmVGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBjbWRsaW5lLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogb3V0KSB7CisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgIEltcG9ydEtlcm5lbENtZGxpbmVGcm9tU3RyaW5nKGNtZGxpbmUsIFsmXShzdGQ6OnN0cmluZyBjb25maWdfa2V5LCBzdGQ6OnN0cmluZyB2YWx1ZSkgeworICAgICAgICBpZiAoIWZvdW5kICYmIGNvbmZpZ19rZXkgPT0ga2V5KSB7CisgICAgICAgICAgICAqb3V0ID0gc3RkOjptb3ZlKHZhbHVlKTsKKyAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0pOworICAgIHJldHVybiBmb3VuZDsKK30KKwordm9pZCBJbXBvcnRLZXJuZWxDbWRsaW5lKGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcpPiYgZm4pIHsKKyAgICBzdGQ6OnN0cmluZyBjbWRsaW5lOworICAgIGFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmcoIi9wcm9jL2NtZGxpbmUiLCAmY21kbGluZSk7CisgICAgSW1wb3J0S2VybmVsQ21kbGluZUZyb21TdHJpbmcoYW5kcm9pZDo6YmFzZTo6VHJpbShjbWRsaW5lKSwgZm4pOworfQorCitib29sIEdldEtlcm5lbENtZGxpbmUoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgc3RkOjpzdHJpbmcqIG91dCkgeworICAgIHN0ZDo6c3RyaW5nIGNtZGxpbmU7CisgICAgYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZygiL3Byb2MvY21kbGluZSIsICZjbWRsaW5lKTsKKyAgICByZXR1cm4gR2V0S2VybmVsQ21kbGluZUZyb21TdHJpbmcoYW5kcm9pZDo6YmFzZTo6VHJpbShjbWRsaW5lKSwga2V5LCBvdXQpOworfQorCit9ICAvLyBuYW1lc3BhY2UgZnNfbWdyCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisvLyBUcmllcyB0byBnZXQgdGhlIGJvb3QgY29uZmlnIHZhbHVlIGluIGRldmljZSB0cmVlLCBwcm9wZXJ0aWVzLCBrZXJuZWwgYm9vdGNvbmZpZyBhbmQga2VybmVsCisvLyBjbWRsaW5lIChpbiB0aGF0IG9yZGVyKS4KKy8vIFJldHVybnMgJ3RydWUnIGlmIHN1Y2Nlc3NmdWxseSBmb3VuZCwgJ2ZhbHNlJyBvdGhlcndpc2UuCitib29sIGZzX21ncl9nZXRfYm9vdF9jb25maWcoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgc3RkOjpzdHJpbmcqIG91dF92YWwpIHsKKyAgICBGU1RBQl9DSEVDSyhvdXRfdmFsICE9IG51bGxwdHIpOworCisgICAgLy8gZmlyc3RseSwgY2hlY2sgdGhlIGRldmljZSB0cmVlCisgICAgaWYgKGlzX2R0X2NvbXBhdGlibGUoKSkgeworICAgICAgICBzdGQ6OnN0cmluZyBmaWxlX25hbWUgPSBhbmRyb2lkOjpmc19tZ3I6OkdldEFuZHJvaWREdERpcigpICsga2V5OworICAgICAgICBpZiAoYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZyhmaWxlX25hbWUsIG91dF92YWwpKSB7CisgICAgICAgICAgICBpZiAoIW91dF92YWwtPmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBvdXRfdmFsLT5wb3BfYmFjaygpOyAgLy8gVHJpbXMgdGhlIHRyYWlsaW5nICdcMCcgb3V0LgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gbmV4dCwgY2hlY2sgaWYgd2UgaGF2ZSAicm8uYm9vdCIgcHJvcGVydHkgYWxyZWFkeQorICAgICpvdXRfdmFsID0gYW5kcm9pZDo6YmFzZTo6R2V0UHJvcGVydHkoInJvLmJvb3QuIiArIGtleSwgIiIpOworICAgIGlmICghb3V0X3ZhbC0+ZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBuZXh0LCBjaGVjayBpZiB3ZSBoYXZlIHRoZSBwcm9wZXJ0eSBpbiBib290Y29uZmlnCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgY29uZmlnX2tleSA9ICJhbmRyb2lkYm9vdC4iICsga2V5OworICAgIGlmIChhbmRyb2lkOjpmc19tZ3I6OkdldEJvb3Rjb25maWcoY29uZmlnX2tleSwgb3V0X3ZhbCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gZmluYWxseSwgZmFsbGJhY2sgdG8ga2VybmVsIGNtZGxpbmUsIHByb3BlcnRpZXMgbWF5IG5vdCBiZSByZWFkeSB5ZXQKKyAgICBpZiAoYW5kcm9pZDo6ZnNfbWdyOjpHZXRLZXJuZWxDbWRsaW5lKGNvbmZpZ19rZXksIG91dF92YWwpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL2ZzX21nci9mc19tZ3JfZnN0YWIuY3BwIGIvZnNfbWdyL2xpYmZzdGFiL2ZzdGFiLmNwcApzaW1pbGFyaXR5IGluZGV4IDg1JQpyZW5hbWUgZnJvbSBmc19tZ3IvZnNfbWdyX2ZzdGFiLmNwcApyZW5hbWUgdG8gZnNfbWdyL2xpYmZzdGFiL2ZzdGFiLmNwcAppbmRleCBkYTllNDVmLi5jYTM1OTkwIDEwMDY0NAotLS0gYS9mc19tZ3IvZnNfbWdyX2ZzdGFiLmNwcAorKysgYi9mc19tZ3IvbGliZnN0YWIvZnN0YWIuY3BwCkBAIC0zNiw3ICszNiwxMiBAQAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CiAjaW5jbHVkZSA8bGliZ3NpL2xpYmdzaS5oPgogCi0jaW5jbHVkZSAiZnNfbWdyX3ByaXYuaCIKKyNpbmNsdWRlICJmc3RhYl9wcml2LmgiCisjaW5jbHVkZSAibG9nZ2luZ19tYWNyb3MuaCIKKworI2lmICFkZWZpbmVkKE1TX0xBWllUSU1FKQorI2RlZmluZSBNU19MQVpZVElNRSAoMSA8PCAyNSkKKyNlbmRpZgogCiB1c2luZyBhbmRyb2lkOjpiYXNlOjpFbmRzV2l0aDsKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlBhcnNlQnl0ZUNvdW50OwpAQCAtNTAsMTEgKzU1LDEwIEBACiBuYW1lc3BhY2UgZnNfbWdyIHsKIG5hbWVzcGFjZSB7CiAKLWNvbnN0ZXhwciBjaGFyIGtEZWZhdWx0QW5kcm9pZER0RGlyW10gPSAiL3Byb2MvZGV2aWNlLXRyZWUvZmlybXdhcmUvYW5kcm9pZCI7CiBjb25zdGV4cHIgY2hhciBrUHJvY01vdW50c1BhdGhbXSA9ICIvcHJvYy9tb3VudHMiOwogCiBzdHJ1Y3QgRmxhZ0xpc3QgewotICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgY29uc3QgY2hhciogbmFtZTsKICAgICB1aW50NjRfdCBmbGFnOwogfTsKIApAQCAtNzQsMTMgKzc4LDE0IEBACiAgICAgICAgIHsicHJpdmF0ZSIsIE1TX1BSSVZBVEV9LAogICAgICAgICB7InNsYXZlIiwgTVNfU0xBVkV9LAogICAgICAgICB7InNoYXJlZCIsIE1TX1NIQVJFRH0sCisgICAgICAgIHsibGF6eXRpbWUiLCBNU19MQVpZVElNRX0sCiAgICAgICAgIHsiZGVmYXVsdHMiLCAwfSwKIH07CiAKIG9mZjY0X3QgQ2FsY3VsYXRlWnJhbVNpemUoaW50IHBlcmNlbnRhZ2UpIHsKICAgICBvZmY2NF90IHRvdGFsOwogCi0gICAgdG90YWwgID0gc3lzY29uZihfU0NfUEhZU19QQUdFUyk7CisgICAgdG90YWwgPSBzeXNjb25mKF9TQ19QSFlTX1BBR0VTKTsKICAgICB0b3RhbCAqPSBwZXJjZW50YWdlOwogICAgIHRvdGFsIC89IDEwMDsKIApAQCAtMTQ3LDYgKzE1MiwzMCBAQAogICAgIGVudHJ5LT5mc19vcHRpb25zID0gc3RkOjptb3ZlKGZzX29wdGlvbnMpOwogfQogCit2b2lkIFBhcnNlVXNlckRldmljZXMoY29uc3Qgc3RkOjpzdHJpbmcmIGFyZywgRnN0YWJFbnRyeSogZW50cnkpIHsKKyAgICBhdXRvIHBhcmFtID0gU3BsaXQoYXJnLCAiOiIpOworICAgIGlmIChwYXJhbS5zaXplKCkgIT0gMikgeworICAgICAgICBMV0FSTklORyA8PCAiV2FybmluZzogZGV2aWNlPSBtYWxmb3JtZWQ6ICIgPDwgYXJnOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGFjY2VzcyhwYXJhbVsxXS5jX3N0cigpLCBGX09LKSAhPSAwKSB7CisgICAgICAgIExXQVJOSU5HIDw8ICJXYXJuaW5nOiBkZXZpY2UgZG9lcyBub3QgZXhpc3QgOiAiIDw8IHBhcmFtWzFdOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHBhcmFtWzBdID09ICJ6b25lZCIpIHsKKyAgICAgICAgLy8gYXRnYyBpbiBmMmZzIGRvZXMgbm90IHN1cHBvcnQgYSB6b25lZCBkZXZpY2UKKyAgICAgICAgYXV0byBvcHRpb25zID0gU3BsaXQoZW50cnktPmZzX29wdGlvbnMsICIsIik7CisgICAgICAgIG9wdGlvbnMuZXJhc2Uoc3RkOjpyZW1vdmUob3B0aW9ucy5iZWdpbigpLCBvcHRpb25zLmVuZCgpLCAiYXRnYyIpLCBvcHRpb25zLmVuZCgpKTsKKyAgICAgICAgZW50cnktPmZzX29wdGlvbnMgPSBhbmRyb2lkOjpiYXNlOjpKb2luKG9wdGlvbnMsICIsIik7CisgICAgICAgIExJTkZPIDw8ICJSZW1vdmVkIEFUR0MgaW4gZnNfb3B0aW9ucyBhcyAiIDw8IGVudHJ5LT5mc19vcHRpb25zIDw8ICIgZm9yIHpvbmVkIGRldmljZSI7CisgICAgICAgIGVudHJ5LT5mc19tZ3JfZmxhZ3MuaXNfem9uZWQgPSB0cnVlOworICAgIH0KKyAgICBlbnRyeS0+dXNlcl9kZXZpY2VzLnB1c2hfYmFjayhwYXJhbVsxXSk7CisgICAgZW50cnktPmRldmljZV9hbGlhc2VkLnB1c2hfYmFjayhwYXJhbVswXSA9PSAiZXhwX2FsaWFzIiA/IDEgOiAwKTsKK30KKwogYm9vbCBQYXJzZUZzTWdyRmxhZ3MoY29uc3Qgc3RkOjpzdHJpbmcmIGZsYWdzLCBGc3RhYkVudHJ5KiBlbnRyeSkgewogICAgIGZvciAoY29uc3QgYXV0byYgZmxhZyA6IFNwbGl0KGZsYWdzLCAiLCIpKSB7CiAgICAgICAgIGlmIChmbGFnLmVtcHR5KCkgfHwgZmxhZyA9PSAiZGVmYXVsdHMiKSBjb250aW51ZTsKQEAgLTIzMyw3ICsyNjIsNyBAQAogICAgICAgICAgICAgaWYgKCFhcmcuZW1wdHkoKSAmJiBhcmcuYmFjaygpID09ICclJykgewogICAgICAgICAgICAgICAgIGFyZy5wb3BfYmFjaygpOwogICAgICAgICAgICAgICAgIGludCB2YWw7Ci0gICAgICAgICAgICAgICAgaWYgKFBhcnNlSW50KGFyZywgJnZhbCwgMCwgMTAwKSkgeworICAgICAgICAgICAgICAgIGlmIChQYXJzZUludChhcmcsICZ2YWwsIDAsIDIwMCkpIHsKICAgICAgICAgICAgICAgICAgICAgZW50cnktPnpyYW1fc2l6ZSA9IENhbGN1bGF0ZVpyYW1TaXplKHZhbCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgTFdBUk5JTkcgPDwgIldhcm5pbmc6IHpyYW1zaXplPSBmbGFnIG1hbGZvcm1lZDogIiA8PCBhcmc7CkBAIC0yNDMsNyArMjcyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgTFdBUk5JTkcgPDwgIldhcm5pbmc6IHpyYW1zaXplPSBmbGFnIG1hbGZvcm1lZDogIiA8PCBhcmc7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKFN0YXJ0c1dpdGgoZmxhZywgImZpbGVlbmNyeXB0aW9uPSIpKSB7CisgICAgICAgIH0gZWxzZSBpZiAoU3RhcnRzV2l0aChmbGFnLCAiZmlsZWVuY3J5cHRpb249IikgfHwgZmxhZyA9PSAiZmlsZWVuY3J5cHRpb24iKSB7CisgICAgICAgICAgICAvLyAiZmlsZWVuY3J5cHRpb24iIGVuYWJsZXMgZmlsZS1iYXNlZCBlbmNyeXB0aW9uLiAgSXQncyBub3JtYWxseSBmb2xsb3dlZCBieSBhbiA9IGFuZAorICAgICAgICAgICAgLy8gdGhlbiB0aGUgZW5jcnlwdGlvbiBvcHRpb25zLiAgQnV0IHRoYXQgY2FuIGJlIG9taXR0ZWQgdG8gdXNlIHRoZSBkZWZhdWx0IG9wdGlvbnMuCiAgICAgICAgICAgICBQYXJzZUZpbGVFbmNyeXB0aW9uKGFyZywgZW50cnkpOwogICAgICAgICB9IGVsc2UgaWYgKFN0YXJ0c1dpdGgoZmxhZywgIm1heF9jb21wX3N0cmVhbXM9IikpIHsKICAgICAgICAgICAgIGlmICghUGFyc2VJbnQoYXJnLCAmZW50cnktPm1heF9jb21wX3N0cmVhbXMpKSB7CkBAIC0yODQsNiArMzE1LDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoU3RhcnRzV2l0aChmbGFnLCAiYXZiX2tleXM9IikpIHsgIC8vIG11c3QgYmVmb3JlIHRoZSBmb2xsb3dpbmcgImF2YiIKICAgICAgICAgICAgIGVudHJ5LT5hdmJfa2V5cyA9IGFyZzsKKyAgICAgICAgfSBlbHNlIGlmIChTdGFydHNXaXRoKGZsYWcsICJhdmJfaGFzaHRyZWVfZGlnZXN0PSIpKSB7CisgICAgICAgICAgICAvLyAiYXZiX2hhc2h0cmVlX2RpZ2VzdCIgbXVzdCBiZWZvcmUgdGhlIGZvbGxvd2luZyAiYXZiIgorICAgICAgICAgICAgLy8gVGhlIHBhdGggd2hlcmUgaGV4LWVuY29kZWQgaGFzaHRyZWUgZGVzY3JpcHRvciByb290IGRpZ2VzdCBpcyBsb2NhdGVkLgorICAgICAgICAgICAgZW50cnktPmF2Yl9oYXNodHJlZV9kaWdlc3QgPSBhcmc7CiAgICAgICAgIH0gZWxzZSBpZiAoU3RhcnRzV2l0aChmbGFnLCAiYXZiIikpIHsKICAgICAgICAgICAgIGVudHJ5LT5mc19tZ3JfZmxhZ3MuYXZiID0gdHJ1ZTsKICAgICAgICAgICAgIGVudHJ5LT52Ym1ldGFfcGFydGl0aW9uID0gYXJnOwpAQCAtMzA1LDE3ICszNDAsOCBAQAogICAgICAgICAgICAgaWYgKCFQYXJzZUJ5dGVDb3VudChhcmcsICZlbnRyeS0+enJhbV9iYWNraW5nZGV2X3NpemUpKSB7CiAgICAgICAgICAgICAgICAgTFdBUk5JTkcgPDwgIldhcm5pbmc6IHpyYW1fYmFja2luZ2Rldl9zaXplPSBmbGFnIG1hbGZvcm1lZDogIiA8PCBhcmc7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZmxhZyA9PSAiem9uZWRfZGV2aWNlIikgewotICAgICAgICAgICAgaWYgKGFjY2VzcygiL2Rldi9ibG9jay9ieS1uYW1lL3pvbmVkX2RldmljZSIsIEZfT0spID09IDApIHsKLSAgICAgICAgICAgICAgICBlbnRyeS0+em9uZWRfZGV2aWNlID0gIi9kZXYvYmxvY2svYnktbmFtZS96b25lZF9kZXZpY2UiOwotCi0gICAgICAgICAgICAgICAgLy8gYXRnYyBpbiBmMmZzIGRvZXMgbm90IHN1cHBvcnQgYSB6b25lZCBkZXZpY2UKLSAgICAgICAgICAgICAgICBhdXRvIG9wdGlvbnMgPSBTcGxpdChlbnRyeS0+ZnNfb3B0aW9ucywgIiwiKTsKLSAgICAgICAgICAgICAgICBvcHRpb25zLmVyYXNlKHN0ZDo6cmVtb3ZlKG9wdGlvbnMuYmVnaW4oKSwgb3B0aW9ucy5lbmQoKSwgImF0Z2MiKSwgb3B0aW9ucy5lbmQoKSk7Ci0gICAgICAgICAgICAgICAgZW50cnktPmZzX29wdGlvbnMgPSBhbmRyb2lkOjpiYXNlOjpKb2luKG9wdGlvbnMsICIsIik7Ci0gICAgICAgICAgICAgICAgTElORk8gPDwgIlJlbW92ZWQgQVRHQyBpbiBmc19vcHRpb25zIGFzICIgPDwgZW50cnktPmZzX29wdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZvciB6b25lZCBkZXZpY2U9IiA8PCBlbnRyeS0+em9uZWRfZGV2aWNlOwotICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKFN0YXJ0c1dpdGgoZmxhZywgImRldmljZT0iKSkgeworICAgICAgICAgICAgUGFyc2VVc2VyRGV2aWNlcyhhcmcsIGVudHJ5KTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIExXQVJOSU5HIDw8ICJXYXJuaW5nOiB1bmtub3duIGZsYWc6ICIgPDwgZmxhZzsKICAgICAgICAgfQpAQCAtMzI2LDggKzM1Miw3IEBACiAgICAgLy8gc29tZSByZWNvdmVyeSBmc3RhYnMgc3RpbGwgY29udGFpbiB0aGUgRkRFIG9wdGlvbnMgc2luY2UgdGhleSBkaWRuJ3QgZG8KICAgICAvLyBhbnl0aGluZyBpbiByZWNvdmVyeSBtb2RlIGFueXdheSAoZXhjZXB0IHBvc3NpYmx5IHRvIGNhdXNlIHRoZQogICAgIC8vIHJlc2VydmF0aW9uIG9mIGEgY3J5cHRvIGZvb3RlcikgYW5kIHRodXMgbmV2ZXIgZ290IHJlbW92ZWQuCi0gICAgaWYgKGVudHJ5LT5mc19tZ3JfZmxhZ3MuY3J5cHQgJiYgIWVudHJ5LT5mc19tZ3JfZmxhZ3Mudm9sZF9tYW5hZ2VkICYmCi0gICAgICAgIGFjY2VzcygiL3N5c3RlbS9iaW4vcmVjb3ZlcnkiLCBGX09LKSAhPSAwKSB7CisgICAgaWYgKGVudHJ5LT5mc19tZ3JfZmxhZ3MuY3J5cHQgJiYgIWVudHJ5LT5mc19tZ3JfZmxhZ3Mudm9sZF9tYW5hZ2VkICYmICFJblJlY292ZXJ5KCkpIHsKICAgICAgICAgTEVSUk9SIDw8ICJGREUgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZDsgJ2VuY3J5cHRhYmxlJyBjYW4gb25seSBiZSB1c2VkIGZvciBhZG9wdGFibGUgIgogICAgICAgICAgICAgICAgICAgInN0b3JhZ2UiOwogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0zMzUsMjUgKzM2MCwxNCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1zdGQ6OnN0cmluZyBJbml0QW5kcm9pZER0RGlyKCkgewotICAgIHN0ZDo6c3RyaW5nIGFuZHJvaWRfZHRfZGlyOwotICAgIC8vIFRoZSBwbGF0Zm9ybSBtYXkgc3BlY2lmeSBhIGN1c3RvbSBBbmRyb2lkIERUIHBhdGggaW4ga2VybmVsIGNtZGxpbmUKLSAgICBpZiAoIWZzX21ncl9nZXRfYm9vdF9jb25maWdfZnJvbV9ib290Y29uZmlnX3NvdXJjZSgiYW5kcm9pZF9kdF9kaXIiLCAmYW5kcm9pZF9kdF9kaXIpICYmCi0gICAgICAgICFmc19tZ3JfZ2V0X2Jvb3RfY29uZmlnX2Zyb21fa2VybmVsX2NtZGxpbmUoImFuZHJvaWRfZHRfZGlyIiwgJmFuZHJvaWRfZHRfZGlyKSkgewotICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIHN0YW5kYXJkIHByb2Nmcy1iYXNlZCBwYXRoCi0gICAgICAgIGFuZHJvaWRfZHRfZGlyID0ga0RlZmF1bHRBbmRyb2lkRHREaXI7Ci0gICAgfQotICAgIHJldHVybiBhbmRyb2lkX2R0X2RpcjsKLX0KLQogYm9vbCBJc0R0RnN0YWJDb21wYXRpYmxlKCkgewogICAgIHN0ZDo6c3RyaW5nIGR0X3ZhbHVlOwotICAgIHN0ZDo6c3RyaW5nIGZpbGVfbmFtZSA9IGdldF9hbmRyb2lkX2R0X2RpcigpICsgIi9mc3RhYi9jb21wYXRpYmxlIjsKKyAgICBzdGQ6OnN0cmluZyBmaWxlX25hbWUgPSBHZXRBbmRyb2lkRHREaXIoKSArICJmc3RhYi9jb21wYXRpYmxlIjsKIAogICAgIGlmIChSZWFkRHRGaWxlKGZpbGVfbmFtZSwgJmR0X3ZhbHVlKSAmJiBkdF92YWx1ZSA9PSAiYW5kcm9pZCxmc3RhYiIpIHsKICAgICAgICAgLy8gSWYgdGhlcmUncyBubyBzdGF0dXMgcHJvcGVydHkgb3IgaXRzIHNldCB0byAib2siIG9yICJva2F5IiwgdGhlbiB3ZSB1c2UgdGhlIERUIGZzdGFiLgogICAgICAgICBzdGQ6OnN0cmluZyBzdGF0dXNfdmFsdWU7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHN0YXR1c19maWxlX25hbWUgPSBnZXRfYW5kcm9pZF9kdF9kaXIoKSArICIvZnN0YWIvc3RhdHVzIjsKKyAgICAgICAgc3RkOjpzdHJpbmcgc3RhdHVzX2ZpbGVfbmFtZSA9IEdldEFuZHJvaWREdERpcigpICsgImZzdGFiL3N0YXR1cyI7CiAgICAgICAgIHJldHVybiAhUmVhZER0RmlsZShzdGF0dXNfZmlsZV9uYW1lLCAmc3RhdHVzX3ZhbHVlKSB8fCBzdGF0dXNfdmFsdWUgPT0gIm9rIiB8fAogICAgICAgICAgICAgICAgc3RhdHVzX3ZhbHVlID09ICJva2F5IjsKICAgICB9CkBAIC0zNjYsNyArMzgwLDcgQEAKICAgICAgICAgcmV0dXJuIHt9OwogICAgIH0KIAotICAgIHN0ZDo6c3RyaW5nIGZzdGFiZGlyX25hbWUgPSBnZXRfYW5kcm9pZF9kdF9kaXIoKSArICIvZnN0YWIiOworICAgIHN0ZDo6c3RyaW5nIGZzdGFiZGlyX25hbWUgPSBHZXRBbmRyb2lkRHREaXIoKSArICJmc3RhYiI7CiAgICAgc3RkOjp1bmlxdWVfcHRyPERJUiwgaW50ICgqKShESVIqKT4gZnN0YWJkaXIob3BlbmRpcihmc3RhYmRpcl9uYW1lLmNfc3RyKCkpLCBjbG9zZWRpcik7CiAgICAgaWYgKCFmc3RhYmRpcikgcmV0dXJuIHt9OwogCkBAIC0zOTksNyArNDEzLDcgQEAKIAogICAgICAgICBzdGQ6OnN0cmluZyBtb3VudF9wb2ludDsKICAgICAgICAgZmlsZV9uYW1lID0KLSAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigiJXMvJXMvbW50X3BvaW50IiwgZnN0YWJkaXJfbmFtZS5jX3N0cigpLCBkcC0+ZF9uYW1lKTsKKyAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoIiVzLyVzL21udF9wb2ludCIsIGZzdGFiZGlyX25hbWUuY19zdHIoKSwgZHAtPmRfbmFtZSk7CiAgICAgICAgIGlmIChSZWFkRHRGaWxlKGZpbGVfbmFtZSwgJnZhbHVlKSkgewogICAgICAgICAgICAgTElORk8gPDwgImR0X2ZzdGFiOiBVc2luZyBhIHNwZWNpZmllZCBtb3VudCBwb2ludCAiIDw8IHZhbHVlIDw8ICIgZm9yICIgPDwgZHAtPmRfbmFtZTsKICAgICAgICAgICAgIG1vdW50X3BvaW50ID0gdmFsdWU7CkBAIC00MTUsMTQgKzQyOSwxNiBAQAogICAgICAgICB9CiAgICAgICAgIGZzdGFiX2VudHJ5LnB1c2hfYmFjayh2YWx1ZSk7CiAKLSAgICAgICAgZmlsZV9uYW1lID0gYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKCIlcy8lcy9tbnRfZmxhZ3MiLCBmc3RhYmRpcl9uYW1lLmNfc3RyKCksIGRwLT5kX25hbWUpOworICAgICAgICBmaWxlX25hbWUgPQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigiJXMvJXMvbW50X2ZsYWdzIiwgZnN0YWJkaXJfbmFtZS5jX3N0cigpLCBkcC0+ZF9uYW1lKTsKICAgICAgICAgaWYgKCFSZWFkRHRGaWxlKGZpbGVfbmFtZSwgJnZhbHVlKSkgewogICAgICAgICAgICAgTEVSUk9SIDw8ICJkdF9mc3RhYjogRmFpbGVkIHRvIGZpbmQgdHlwZSBmb3IgcGFydGl0aW9uICIgPDwgZHAtPmRfbmFtZTsKICAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICAgfQogICAgICAgICBmc3RhYl9lbnRyeS5wdXNoX2JhY2sodmFsdWUpOwogCi0gICAgICAgIGZpbGVfbmFtZSA9IGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigiJXMvJXMvZnNtZ3JfZmxhZ3MiLCBmc3RhYmRpcl9uYW1lLmNfc3RyKCksIGRwLT5kX25hbWUpOworICAgICAgICBmaWxlX25hbWUgPQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigiJXMvJXMvZnNtZ3JfZmxhZ3MiLCBmc3RhYmRpcl9uYW1lLmNfc3RyKCksIGRwLT5kX25hbWUpOwogICAgICAgICBpZiAoIVJlYWREdEZpbGUoZmlsZV9uYW1lLCAmdmFsdWUpKSB7CiAgICAgICAgICAgICBMRVJST1IgPDwgImR0X2ZzdGFiOiBGYWlsZWQgdG8gZmluZCB0eXBlIGZvciBwYXJ0aXRpb24gIiA8PCBkcC0+ZF9uYW1lOwogICAgICAgICAgICAgcmV0dXJuIHt9OwpAQCAtNTEwLDYgKzUyNiwyNCBAQAogCiB9ICAvLyBuYW1lc3BhY2UKIAorLy8gUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSByZWNvdmVyeSBmc3RhYiBmaWxlLiAgVGhlcmUgbWF5IGJlIG11bHRpcGxlIGZzdGFiIGZpbGVzOworLy8gdGhlIG9uZSB0aGF0IGlzIHJldHVybmVkIHdpbGwgYmUgdGhlIGZpcnN0IHRoYXQgZXhpc3RzIG9mIHJlY292ZXJ5LmZzdGFiLjxmc3RhYl9zdWZmaXg+LAorLy8gcmVjb3ZlcnkuZnN0YWIuPGhhcmR3YXJlPiwgYW5kIHJlY292ZXJ5LmZzdGFiLjxoYXJkd2FyZS5wbGF0Zm9ybT4uCitzdGQ6OnN0cmluZyBHZXRSZWNvdmVyeUZzdGFiUGF0aCgpIHsKKyAgICBmb3IgKGNvbnN0IGNoYXIqIHByb3AgOiB7ImZzdGFiX3N1ZmZpeCIsICJoYXJkd2FyZSIsICJoYXJkd2FyZS5wbGF0Zm9ybSJ9KSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHN1ZmZpeDsKKworICAgICAgICBpZiAoIWZzX21ncl9nZXRfYm9vdF9jb25maWcocHJvcCwgJnN1ZmZpeCkpIGNvbnRpbnVlOworCisgICAgICAgIHN0ZDo6c3RyaW5nIGZzdGFiX3BhdGggPSAiL2V0Yy9yZWNvdmVyeS5mc3RhYi4iICsgc3VmZml4OworICAgICAgICBpZiAoYWNjZXNzKGZzdGFiX3BhdGguY19zdHIoKSwgRl9PSykgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZzdGFiX3BhdGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gIi9ldGMvcmVjb3ZlcnkuZnN0YWIiOworfQorCiAvLyBSZXR1cm4gdGhlIHBhdGggdG8gdGhlIGZzdGFiIGZpbGUuICBUaGVyZSBtYXkgYmUgbXVsdGlwbGUgZnN0YWIgZmlsZXM7IHRoZQogLy8gb25lIHRoYXQgaXMgcmV0dXJuZWQgd2lsbCBiZSB0aGUgZmlyc3QgdGhhdCBleGlzdHMgb2YgZnN0YWIuPGZzdGFiX3N1ZmZpeD4sCiAvLyBmc3RhYi48aGFyZHdhcmU+LCBhbmQgZnN0YWIuPGhhcmR3YXJlLnBsYXRmb3JtPi4gIFRoZSBmc3RhYiBpcyBzZWFyY2hlZCBmb3IKQEAgLTUxOCw2ICs1NTIsOSBAQAogLy8gcmFtZGlzaydzIGNvcHkgb2YgdGhlIGZzdGFiIGhhZCB0byBiZSBsb2NhdGVkIGluIHRoZSByb290IGRpcmVjdG9yeSwgYnV0IG5vdwogLy8gdGhlIHN5c3RlbS9ldGMgZGlyZWN0b3J5IGlzIHN1cHBvcnRlZCB0b28gYW5kIGlzIHRoZSBwcmVmZXJyZWQgbG9jYXRpb24uCiBzdGQ6OnN0cmluZyBHZXRGc3RhYlBhdGgoKSB7CisgICAgaWYgKEluUmVjb3ZlcnkoKSkgeworICAgICAgICByZXR1cm4gR2V0UmVjb3ZlcnlGc3RhYlBhdGgoKTsKKyAgICB9CiAgICAgZm9yIChjb25zdCBjaGFyKiBwcm9wIDogeyJmc3RhYl9zdWZmaXgiLCAiaGFyZHdhcmUiLCAiaGFyZHdhcmUucGxhdGZvcm0ifSkgewogICAgICAgICBzdGQ6OnN0cmluZyBzdWZmaXg7CiAKQEAgLTcyMSw3ICs3NTgsNyBAQAogICAgIGlmICghUmVhZEZzdGFiRnJvbUZpbGVDb21tb24ocGF0aCwgZnN0YWIpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgaWYgKHBhdGggIT0ga1Byb2NNb3VudHNQYXRoKSB7CisgICAgaWYgKHBhdGggIT0ga1Byb2NNb3VudHNQYXRoICYmICFJblJlY292ZXJ5KCkpIHsKICAgICAgICAgaWYgKCFhY2Nlc3MoYW5kcm9pZDo6Z3NpOjprR3NpQm9vdGVkSW5kaWNhdG9yRmlsZSwgRl9PSykpIHsKICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRzdV9zbG90OwogICAgICAgICAgICAgaWYgKCFhbmRyb2lkOjpnc2k6OkdldEFjdGl2ZURzdSgmZHN1X3Nsb3QpKSB7CkBAIC04MzMsMTkgKzg3MCwxMSBAQAogICAgIGZzdGFiLT5jbGVhcigpOwogICAgIFJlYWRGc3RhYkZyb21EdChmc3RhYiwgZmFsc2UgLyogdmVyYm9zZSAqLyk7CiAKLSAgICBzdGQ6OnN0cmluZyBkZWZhdWx0X2ZzdGFiX3BhdGg7Ci0gICAgLy8gVXNlIGRpZmZlcmVudCBmc3RhYiBwYXRocyBmb3Igbm9ybWFsIGJvb3QgYW5kIHJlY292ZXJ5IGJvb3QsIHJlc3BlY3RpdmVseQotICAgIGlmICgoYWNjZXNzKCIvc2Jpbi9yZWNvdmVyeSIsIEZfT0spID09IDApIHx8IChhY2Nlc3MoIi9zeXN0ZW0vYmluL3JlY292ZXJ5IiwgRl9PSykgPT0gMCkpIHsKLSAgICAgICAgZGVmYXVsdF9mc3RhYl9wYXRoID0gIi9ldGMvcmVjb3ZlcnkuZnN0YWIiOwotICAgIH0gZWxzZSB7ICAvLyBub3JtYWwgYm9vdAotICAgICAgICBkZWZhdWx0X2ZzdGFiX3BhdGggPSBHZXRGc3RhYlBhdGgoKTsKLSAgICB9Ci0KICAgICBGc3RhYiBkZWZhdWx0X2ZzdGFiOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGRlZmF1bHRfZnN0YWJfcGF0aCA9IEdldEZzdGFiUGF0aCgpOwogICAgIGlmICghZGVmYXVsdF9mc3RhYl9wYXRoLmVtcHR5KCkgJiYgUmVhZEZzdGFiRnJvbUZpbGUoZGVmYXVsdF9mc3RhYl9wYXRoLCAmZGVmYXVsdF9mc3RhYikpIHsKLSAgICAgICAgZm9yIChhdXRvJiYgZW50cnkgOiBkZWZhdWx0X2ZzdGFiKSB7Ci0gICAgICAgICAgICBmc3RhYi0+ZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShlbnRyeSkpOwotICAgICAgICB9CisgICAgICAgIGZzdGFiLT5pbnNlcnQoZnN0YWItPmVuZCgpLCBzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcihkZWZhdWx0X2ZzdGFiLmJlZ2luKCkpLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9tb3ZlX2l0ZXJhdG9yKGRlZmF1bHRfZnN0YWIuZW5kKCkpKTsKICAgICB9IGVsc2UgewogICAgICAgICBMSU5GTyA8PCBfX0ZVTkNUSU9OX18gPDwgIigpOiBmYWlsZWQgdG8gZmluZCBkZXZpY2UgZGVmYXVsdCBmc3RhYiI7CiAgICAgfQpAQCAtODU4LDYgKzg4NywxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmcGF0aF0oY29uc3QgRnN0YWJFbnRyeSYgZW50cnkpIHsgcmV0dXJuIGVudHJ5Lm1vdW50X3BvaW50ID09IHBhdGg7IH0pOwogfQogCitGc3RhYkVudHJ5KiBHZXRFbnRyeUZvck1vdW50UG9pbnQoRnN0YWIqIGZzdGFiLCBjb25zdCBzdGQ6OnN0cmluZ192aWV3IHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmdfdmlldyBmc3R5cGUpIHsKKyAgICBhdXRvJiYgdmVjID0gR2V0RW50cmllc0J5UHJlZChmc3RhYiwgWyZwYXRoLCBmc3R5cGVdKGNvbnN0IEZzdGFiRW50cnkmIGVudHJ5KSB7CisgICAgICAgIHJldHVybiBlbnRyeS5tb3VudF9wb2ludCA9PSBwYXRoICYmIGVudHJ5LmZzX3R5cGUgPT0gZnN0eXBlOworICAgIH0pOworICAgIHJldHVybiB2ZWMuZW1wdHkoKSA/IG51bGxwdHIgOiB2ZWMuZnJvbnQoKTsKK30KKwogc3RkOjp2ZWN0b3I8Y29uc3QgRnN0YWJFbnRyeSo+IEdldEVudHJpZXNGb3JNb3VudFBvaW50KGNvbnN0IEZzdGFiKiBmc3RhYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgewogICAgIHJldHVybiBHZXRFbnRyaWVzQnlQcmVkKGZzdGFiLApAQCAtODc1LDQwICs5MTIsMzMgQEAKIH0KIAogc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IEdldEJvb3REZXZpY2VzKCkgeworICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBib290X2RldmljZXM7CiAgICAgLy8gRmlyc3QgY2hlY2sgYm9vdGNvbmZpZywgdGhlbiBrZXJuZWwgY29tbWFuZGxpbmUsIHRoZW4gdGhlIGRldmljZSB0cmVlCi0gICAgc3RkOjpzdHJpbmcgZHRfZmlsZV9uYW1lID0gZ2V0X2FuZHJvaWRfZHRfZGlyKCkgKyAiL2Jvb3RfZGV2aWNlcyI7CiAgICAgc3RkOjpzdHJpbmcgdmFsdWU7Ci0gICAgaWYgKGZzX21ncl9nZXRfYm9vdF9jb25maWdfZnJvbV9ib290Y29uZmlnX3NvdXJjZSgiYm9vdF9kZXZpY2VzIiwgJnZhbHVlKSB8fAotICAgICAgICBmc19tZ3JfZ2V0X2Jvb3RfY29uZmlnX2Zyb21fYm9vdGNvbmZpZ19zb3VyY2UoImJvb3RfZGV2aWNlIiwgJnZhbHVlKSkgewotICAgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gYm9vdF9kZXZpY2VzOwotICAgICAgICAvLyByZW1vdmUgcXVvdGVzIGFuZCBzcGxpdCBieSBzcGFjZXMKLSAgICAgICAgYXV0byBib290X2RldmljZV9zdHJpbmdzID0gYmFzZTo6U3BsaXQoYmFzZTo6U3RyaW5nUmVwbGFjZSh2YWx1ZSwgIlwiIiwgIiIsIHRydWUpLCAiICIpOwotICAgICAgICBmb3IgKHN0ZDo6c3RyaW5nX3ZpZXcgZGV2aWNlIDogYm9vdF9kZXZpY2Vfc3RyaW5ncykgewotICAgICAgICAgICAgLy8gdHJpbSB0aGUgdHJhaWxpbmcgY29tbWEsIGtlZXAgdGhlIHJlc3QuCisgICAgaWYgKEdldEJvb3Rjb25maWcoImFuZHJvaWRib290LmJvb3RfZGV2aWNlcyIsICZ2YWx1ZSkgfHwKKyAgICAgICAgR2V0Qm9vdGNvbmZpZygiYW5kcm9pZGJvb3QuYm9vdF9kZXZpY2UiLCAmdmFsdWUpKSB7CisgICAgICAgIC8vIHNwbGl0IGJ5IHNwYWNlcyBhbmQgdHJpbSB0aGUgdHJhaWxpbmcgY29tbWEuCisgICAgICAgIGZvciAoc3RkOjpzdHJpbmdfdmlldyBkZXZpY2UgOiBhbmRyb2lkOjpiYXNlOjpTcGxpdCh2YWx1ZSwgIiAiKSkgewogICAgICAgICAgICAgYmFzZTo6Q29uc3VtZVN1ZmZpeCgmZGV2aWNlLCAiLCIpOwogICAgICAgICAgICAgYm9vdF9kZXZpY2VzLmVtcGxhY2UoZGV2aWNlKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gYm9vdF9kZXZpY2VzOwogICAgIH0KIAotICAgIGlmIChmc19tZ3JfZ2V0X2Jvb3RfY29uZmlnX2Zyb21fa2VybmVsX2NtZGxpbmUoImJvb3RfZGV2aWNlcyIsICZ2YWx1ZSkgfHwKLSAgICAgICAgUmVhZER0RmlsZShkdF9maWxlX25hbWUsICZ2YWx1ZSkpIHsKLSAgICAgICAgYXV0byBib290X2RldmljZXMgPSBTcGxpdCh2YWx1ZSwgIiwiKTsKLSAgICAgICAgcmV0dXJuIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPihib290X2RldmljZXMuYmVnaW4oKSwgYm9vdF9kZXZpY2VzLmVuZCgpKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBkdF9maWxlX25hbWUgPSBHZXRBbmRyb2lkRHREaXIoKSArICJib290X2RldmljZXMiOworICAgIGlmIChHZXRLZXJuZWxDbWRsaW5lKCJhbmRyb2lkYm9vdC5ib290X2RldmljZXMiLCAmdmFsdWUpIHx8IFJlYWREdEZpbGUoZHRfZmlsZV9uYW1lLCAmdmFsdWUpKSB7CisgICAgICAgIGF1dG8gYm9vdF9kZXZpY2VzX2xpc3QgPSBTcGxpdCh2YWx1ZSwgIiwiKTsKKyAgICAgICAgcmV0dXJuIHtzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcihib290X2RldmljZXNfbGlzdC5iZWdpbigpKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcihib290X2RldmljZXNfbGlzdC5lbmQoKSl9OwogICAgIH0KIAotICAgIHN0ZDo6c3RyaW5nIGNtZGxpbmU7Ci0gICAgaWYgKGFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmcoIi9wcm9jL2NtZGxpbmUiLCAmY21kbGluZSkpIHsKLSAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGJvb3RfZGV2aWNlczsKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgY21kbGluZV9rZXkgPSAiYW5kcm9pZGJvb3QuYm9vdF9kZXZpY2UiOwotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIFtrZXksIHZhbHVlXSA6IGZzX21ncl9wYXJzZV9jbWRsaW5lKGNtZGxpbmUpKSB7Ci0gICAgICAgICAgICBpZiAoa2V5ID09IGNtZGxpbmVfa2V5KSB7Ci0gICAgICAgICAgICAgICAgYm9vdF9kZXZpY2VzLmVtcGxhY2UodmFsdWUpOwotICAgICAgICAgICAgfQorICAgIEltcG9ydEtlcm5lbENtZGxpbmUoWyZdKHN0ZDo6c3RyaW5nIGtleSwgc3RkOjpzdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgaWYgKGtleSA9PSAiYW5kcm9pZGJvb3QuYm9vdF9kZXZpY2UiKSB7CisgICAgICAgICAgICBib290X2RldmljZXMuZW1wbGFjZShzdGQ6Om1vdmUodmFsdWUpKTsKICAgICAgICAgfQotICAgICAgICBpZiAoIWJvb3RfZGV2aWNlcy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gYm9vdF9kZXZpY2VzOwotICAgICAgICB9CisgICAgfSk7CisgICAgaWYgKCFib290X2RldmljZXMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gYm9vdF9kZXZpY2VzOwogICAgIH0KIAogICAgIC8vIEZhbGxiYWNrIHRvIGV4dHJhY3QgYm9vdCBkZXZpY2VzIGZyb20gZnN0YWIuCkBAIC05MjAsNiArOTUwLDIyIEBACiAgICAgcmV0dXJuIEV4dHJhQm9vdERldmljZXMoZnN0YWIpOwogfQogCitzdGQ6OnN0cmluZyBHZXRCb290UGFydFV1aWQoKSB7CisgICAgc3RkOjpzdHJpbmcgYm9vdF9wYXJ0X3V1aWQ7CisKKyAgICBpZiAoR2V0Qm9vdGNvbmZpZygiYW5kcm9pZGJvb3QuYm9vdF9wYXJ0X3V1aWQiLCAmYm9vdF9wYXJ0X3V1aWQpKSB7CisgICAgICAgIHJldHVybiBib290X3BhcnRfdXVpZDsKKyAgICB9CisKKyAgICBJbXBvcnRLZXJuZWxDbWRsaW5lKFsmXShzdGQ6OnN0cmluZyBrZXksIHN0ZDo6c3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGlmIChrZXkgPT0gImFuZHJvaWRib290LmJvb3RfcGFydF91dWlkIikgeworICAgICAgICAgICAgYm9vdF9wYXJ0X3V1aWQgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0pOworCisgICAgcmV0dXJuIGJvb3RfcGFydF91dWlkOworfQorCiBzdGQ6OnN0cmluZyBHZXRWZXJpdHlEZXZpY2VOYW1lKGNvbnN0IEZzdGFiRW50cnkmIGVudHJ5KSB7CiAgICAgc3RkOjpzdHJpbmcgYmFzZV9kZXZpY2U7CiAgICAgaWYgKGVudHJ5Lm1vdW50X3BvaW50ID09ICIvIikgewpAQCAtOTM0LDE4ICs5ODAsMjIgQEAKICAgICByZXR1cm4gYmFzZV9kZXZpY2UgKyAiLXZlcml0eSI7CiB9CiAKK2Jvb2wgSW5SZWNvdmVyeSgpIHsKKyAgICAvLyBDaGVjayB0aGUgZXhpc3RlbmNlIG9mIHJlY292ZXJ5IGJpbmFyeSBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBjb21waWxlIHRpbWUKKyAgICAvLyBfX0FORFJPSURfUkVDT1ZFUllfXyBtYWNyby4KKyAgICAvLyBJZiBCT0FSRF9VU0VTX1JFQ09WRVJZX0FTX0JPT1QgaXMgdHJ1ZSwgYm90aCBub3JtYWwgYW5kIHJlY292ZXJ5IGJvb3QKKyAgICAvLyBtb2RlIHdvdWxkIHVzZSB0aGUgc2FtZSBpbml0IGJpbmFyeSwgd2hpY2ggd291bGQgbWVhbiBkdXJpbmcgbm9ybWFsIGJvb3QKKyAgICAvLyB0aGUgJy9pbml0JyBiaW5hcnkgaXMgYWN0dWFsbHkgYSBzeW1saW5rIHBvaW50aW5nIHRvCisgICAgLy8gaW5pdF9zZWNvbmRfc3RhZ2UucmVjb3ZlcnksIHdoaWNoIHdvdWxkIGJlIGNvbXBpbGVkIHdpdGgKKyAgICAvLyBfX0FORFJPSURfUkVDT1ZFUllfXyBkZWZpbmVkLgorICAgIHJldHVybiBhY2Nlc3MoIi9zeXN0ZW0vYmluL3JlY292ZXJ5IiwgRl9PSykgPT0gMCB8fCBhY2Nlc3MoIi9zYmluL3JlY292ZXJ5IiwgRl9PSykgPT0gMDsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGZzX21ncgogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAotLy8gRklYTUU6IFRoZSBzYW1lIGxvZ2ljIGlzIGR1cGxpY2F0ZWQgaW4gc3lzdGVtL2NvcmUvaW5pdC8KLWNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfYW5kcm9pZF9kdF9kaXIoKSB7Ci0gICAgLy8gU2V0IG9uY2UgYW5kIHNhdmVzIHRpbWUgZm9yIHN1YnNlcXVlbnQgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbgotICAgIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQW5kcm9pZER0RGlyID0gYW5kcm9pZDo6ZnNfbWdyOjpJbml0QW5kcm9pZER0RGlyKCk7Ci0gICAgcmV0dXJuIGtBbmRyb2lkRHREaXI7Ci19Ci0KIGJvb2wgaXNfZHRfY29tcGF0aWJsZSgpIHsKLSAgICBzdGQ6OnN0cmluZyBmaWxlX25hbWUgPSBnZXRfYW5kcm9pZF9kdF9kaXIoKSArICIvY29tcGF0aWJsZSI7CisgICAgc3RkOjpzdHJpbmcgZmlsZV9uYW1lID0gYW5kcm9pZDo6ZnNfbWdyOjpHZXRBbmRyb2lkRHREaXIoKSArICJjb21wYXRpYmxlIjsKICAgICBzdGQ6OnN0cmluZyBkdF92YWx1ZTsKICAgICBpZiAoYW5kcm9pZDo6ZnNfbWdyOjpSZWFkRHRGaWxlKGZpbGVfbmFtZSwgJmR0X3ZhbHVlKSkgewogICAgICAgICBpZiAoZHRfdmFsdWUgPT0gImFuZHJvaWQsZmlybXdhcmUiKSB7CmRpZmYgLS1naXQgYS9mc19tZ3IvbGliZnN0YWIvZnN0YWJfcHJpdi5oIGIvZnNfbWdyL2xpYmZzdGFiL2ZzdGFiX3ByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2NiMTc1Ci0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYmZzdGFiL2ZzdGFiX3ByaXYuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGZzdGFiL2ZzdGFiLmg+CisKKy8vIERvIG5vdCBpbmNsdWRlIGxvZ2dpbmdfbWFjcm9zLmggaGVyZSBhcyB0aGlzIGhlYWRlciBpcyB1c2VkIGJ5IGZzX21nciwgdG9vLgorCitib29sIGZzX21ncl9nZXRfYm9vdF9jb25maWcoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgc3RkOjpzdHJpbmcqIG91dF92YWwpOworCitib29sIGZzX21ncl91cGRhdGVfZm9yX3Nsb3RzZWxlY3QoYW5kcm9pZDo6ZnNfbWdyOjpGc3RhYiogZnN0YWIpOworYm9vbCBpc19kdF9jb21wYXRpYmxlKCk7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBmc19tZ3IgeworCitib29sIEluUmVjb3ZlcnkoKTsKK2Jvb2wgUGFyc2VGc3RhYkZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGZzdGFiX3N0ciwgYm9vbCBwcm9jX21vdW50cywgRnN0YWIqIGZzdGFiX291dCk7Citib29sIFNraXBNb3VudFdpdGhDb25maWcoY29uc3Qgc3RkOjpzdHJpbmcmIHNraXBfY29uZmlnLCBGc3RhYiogZnN0YWIsIGJvb2wgdmVyYm9zZSk7CitzdGQ6OnN0cmluZyBHZXRGc3RhYlBhdGgoKTsKKwordm9pZCBJbXBvcnRCb290Y29uZmlnRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgYm9vdGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZyk+JiBmbik7CisKK3ZvaWQgSW1wb3J0S2VybmVsQ21kbGluZUZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGNtZGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcpPiYgZm4pOworCitib29sIEdldEtlcm5lbENtZGxpbmVGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBjbWRsaW5lLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogb3V0KTsKKworfSAgLy8gbmFtZXNwYWNlIGZzX21ncgorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9mdXp6L0FuZHJvaWQuYnAgYi9mc19tZ3IvbGliZnN0YWIvZnV6ei9BbmRyb2lkLmJwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBmc19tZ3IvZnV6ei9BbmRyb2lkLmJwCnJlbmFtZSB0byBmc19tZ3IvbGliZnN0YWIvZnV6ei9BbmRyb2lkLmJwCmRpZmYgLS1naXQgYS9mc19tZ3IvZnV6ei9mc19tZ3JfZnN0YWJfZnV6emVyLmNwcCBiL2ZzX21nci9saWJmc3RhYi9mdXp6L2ZzX21ncl9mc3RhYl9mdXp6ZXIuY3BwCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIGZzX21nci9mdXp6L2ZzX21ncl9mc3RhYl9mdXp6ZXIuY3BwCnJlbmFtZSB0byBmc19tZ3IvbGliZnN0YWIvZnV6ei9mc19tZ3JfZnN0YWJfZnV6emVyLmNwcAppbmRleCBiNWZkYWQ0Li5iMDliMjczIDEwMDY0NAotLS0gYS9mc19tZ3IvZnV6ei9mc19tZ3JfZnN0YWJfZnV6emVyLmNwcAorKysgYi9mc19tZ3IvbGliZnN0YWIvZnV6ei9mc19tZ3JfZnN0YWJfZnV6emVyLmNwcApAQCAtMjAsNiArMjAsOCBAQAogI2luY2x1ZGUgPGZzdGFiL2ZzdGFiLmg+CiAjaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgogCisjaW5jbHVkZSAiLi4vZnN0YWJfcHJpdi5oIgorCiBleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CiAgICAgRnV6emVkRGF0YVByb3ZpZGVyIGZkcChkYXRhLCBzaXplKTsKIApkaWZmIC0tZ2l0IGEvZnNfbWdyL2Z1enovZnN0YWIuZGljdCBiL2ZzX21nci9saWJmc3RhYi9mdXp6L2ZzdGFiLmRpY3QKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGZzX21nci9mdXp6L2ZzdGFiLmRpY3QKcmVuYW1lIHRvIGZzX21nci9saWJmc3RhYi9mdXp6L2ZzdGFiLmRpY3QKZGlmZiAtLWdpdCBhL2ZzX21nci9pbmNsdWRlX2ZzdGFiL2ZzdGFiL2ZzdGFiLmggYi9mc19tZ3IvbGliZnN0YWIvaW5jbHVkZS9mc3RhYi9mc3RhYi5oCnNpbWlsYXJpdHkgaW5kZXggNjglCnJlbmFtZSBmcm9tIGZzX21nci9pbmNsdWRlX2ZzdGFiL2ZzdGFiL2ZzdGFiLmgKcmVuYW1lIHRvIGZzX21nci9saWJmc3RhYi9pbmNsdWRlL2ZzdGFiL2ZzdGFiLmgKaW5kZXggOWNiMTU0Ni4uMGZmMzE4OCAxMDA2NDQKLS0tIGEvZnNfbWdyL2luY2x1ZGVfZnN0YWIvZnN0YWIvZnN0YWIuaAorKysgYi9mc19tZ3IvbGliZnN0YWIvaW5jbHVkZS9mc3RhYi9mc3RhYi5oCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgogI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgpAQCAtMzEsNyArMzIsOCBAQAogCiBzdHJ1Y3QgRnN0YWJFbnRyeSB7CiAgICAgc3RkOjpzdHJpbmcgYmxrX2RldmljZTsKLSAgICBzdGQ6OnN0cmluZyB6b25lZF9kZXZpY2U7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHVzZXJfZGV2aWNlczsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IGRldmljZV9hbGlhc2VkOwogICAgIHN0ZDo6c3RyaW5nIGxvZ2ljYWxfcGFydGl0aW9uX25hbWU7CiAgICAgc3RkOjpzdHJpbmcgbW91bnRfcG9pbnQ7CiAgICAgc3RkOjpzdHJpbmcgZnNfdHlwZTsKQEAgLTU2LDYgKzU4LDcgQEAKICAgICB1aW50NjRfdCB6cmFtX2JhY2tpbmdkZXZfc2l6ZSA9IDA7CiAgICAgc3RkOjpzdHJpbmcgYXZiX2tleXM7CiAgICAgc3RkOjpzdHJpbmcgbG93ZXJkaXI7CisgICAgc3RkOjpzdHJpbmcgYXZiX2hhc2h0cmVlX2RpZ2VzdDsKIAogICAgIHN0cnVjdCBGc01nckZsYWdzIHsKICAgICAgICAgYm9vbCB3YWl0IDogMTsKQEAgLTgzLDYgKzg2LDcgQEAKICAgICAgICAgYm9vbCBleHRfbWV0YV9jc3VtIDogMTsKICAgICAgICAgYm9vbCBmc19jb21wcmVzcyA6IDE7CiAgICAgICAgIGJvb2wgb3ZlcmxheWZzX3JlbW92ZV9taXNzaW5nX2xvd2VyZGlyIDogMTsKKyAgICAgICAgYm9vbCBpc196b25lZCA6IDE7CiAgICAgfSBmc19tZ3JfZmxhZ3MgPSB7fTsKIAogICAgIGJvb2wgaXNfZW5jcnlwdGFibGUoKSBjb25zdCB7IHJldHVybiBmc19tZ3JfZmxhZ3MuY3J5cHQ7IH0KQEAgLTkzLDEzICs5Nyw2IEBACiAvLyBVbmxlc3MgZXhwbGljaXRseSByZXF1ZXN0ZWQsIGEgbG9va3VwIG9uIG1vdW50IHBvaW50IHNob3VsZCBhbHdheXMgcmV0dXJuIHRoZSAxc3Qgb25lLgogdXNpbmcgRnN0YWIgPSBzdGQ6OnZlY3RvcjxGc3RhYkVudHJ5PjsKIAotLy8gRXhwb3J0ZWQgZm9yIHRlc3RhYmlsaXR5LiBSZWd1bGFyIHVzZXJzIHNob3VsZCB1c2UgUmVhZEZzdGFiRnJvbUZpbGUoKS4KLWJvb2wgUGFyc2VGc3RhYkZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGZzdGFiX3N0ciwgYm9vbCBwcm9jX21vdW50cywgRnN0YWIqIGZzdGFiX291dCk7Ci0vLyBFeHBvcnRlZCBmb3IgdGVzdGFiaWxpdHkuIFJlZ3VsYXIgdXNlcnMgc2hvdWxkIHVzZSBSZWFkRGVmYXVsdEZzdGFiKCkuCi1zdGQ6OnN0cmluZyBHZXRGc3RhYlBhdGgoKTsKLS8vIEV4cG9ydGVkIGZvciB0ZXN0YWJpbGl0eS4KLWJvb2wgU2tpcE1vdW50V2l0aENvbmZpZyhjb25zdCBzdGQ6OnN0cmluZyYgc2tpcF9jb25maWcsIEZzdGFiKiBmc3RhYiwgYm9vbCB2ZXJib3NlKTsKLQogYm9vbCBSZWFkRnN0YWJGcm9tRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgRnN0YWIqIGZzdGFiKTsKIGJvb2wgUmVhZEZzdGFiRnJvbVByb2NNb3VudHMoRnN0YWIqIGZzdGFiKTsKIGJvb2wgUmVhZEZzdGFiRnJvbUR0KEZzdGFiKiBmc3RhYiwgYm9vbCB2ZXJib3NlID0gdHJ1ZSk7CkBAIC0xMTMsNiArMTEwLDkgQEAKIEZzdGFiRW50cnkqIEdldEVudHJ5Rm9yTW91bnRQb2ludChGc3RhYiogZnN0YWIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKTsKIGNvbnN0IEZzdGFiRW50cnkqIEdldEVudHJ5Rm9yTW91bnRQb2ludChjb25zdCBGc3RhYiogZnN0YWIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKTsKIAorRnN0YWJFbnRyeSogR2V0RW50cnlGb3JNb3VudFBvaW50KEZzdGFiKiBmc3RhYiwgY29uc3Qgc3RkOjpzdHJpbmdfdmlldyBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nX3ZpZXcgZnN0eXBlKTsKKwogLy8gVGhpcyBtZXRob2QgYnVpbGRzIERTVSBmc3RhYiBlbnRyaWVzIGFuZCB0cmFuc2ZlciB0aGUgZnN0YWIuCiAvLwogLy8gZnN0YWIgcG9pbnRzIHRvIHRoZSB1bm1vZGlmaWVkIGZzdGFiLgpAQCAtMTI2LDEwICsxMjYsNDYgQEAKIAogc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IEdldEJvb3REZXZpY2VzKCk7CiAKKy8vIEdldCB0aGUgUGFydGl0aW9uIFVVSUQgdGhlIGtlcm5lbCBsb2FkZWQgZnJvbSBpZiB0aGUgYm9vdGxvYWRlciBwYXNzZWQgaXQuCisvLworLy8gSWYgdGhlIGtlcm5lbCdzIFBhcnRpdGlvbiBVVUlEIGlzIHByb3ZpZGVkIHRoZW4gd2UgY2FuIHVzZSB0aGlzIHRvIGhlbHAKKy8vIGlkZW50aWZ5IHdoaWNoIGJsb2NrIGRldmljZSBjb250YWlucyB0aGUgZmlsZXN5c3RlbXMgd2UgY2FyZSBhYm91dC4KKy8vCisvLyBOT1RFOiBOb3RoaW5nIHNlY3VyZXMgYSBVVUlEIG90aGVyIHRoYW4gdGhlIGNvbnZlbnRpb24gdGhhdCB0d28gZGlza3MKKy8vIGFyZW4ndCBzdXBwb3NlZCB0byBib3RoIGhhdmUgdGhlIHNhbWUgVVVJRC4gV2Ugc3RpbGwgbmVlZCBvdGhlciBtZWNoYW5pc21zCisvLyB0byBlbnN1cmUgd2UndmUgZ290IHRoZSByaWdodCBkaXNrLgorc3RkOjpzdHJpbmcgR2V0Qm9vdFBhcnRVdWlkKCk7CisKIC8vIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZG0tdmVyaXR5IGRldmljZSBmb3IgdGhlIGdpdmVuIGZzdGFiIGVudHJ5LiBUaGlzIGRvZXMKIC8vIG5vdCBjaGVjayB3aGV0aGVyIHRoZSBkZXZpY2UgaXMgdmFsaWQgb3IgZXhpc3RzOyBpdCBtZXJlbHkgcmV0dXJucyB0aGUKIC8vIGV4cGVjdGVkIG5hbWUuCiBzdGQ6OnN0cmluZyBHZXRWZXJpdHlEZXZpY2VOYW1lKGNvbnN0IEZzdGFiRW50cnkmIGVudHJ5KTsKIAorLy8gUmV0dXJucyB0aGUgQW5kcm9pZCBEZXZpY2UgVHJlZSBkaXJlY3RvcnkgYXMgc3BlY2lmaWVkIGluIHRoZSBrZXJuZWwgYm9vdGNvbmZpZyBvciBjbWRsaW5lLgorLy8gSWYgdGhlIHBsYXRmb3JtIGRvZXMgbm90IGNvbmZpZ3VyZSBhIGN1c3RvbSBEVCBwYXRoLCByZXR1cm5zIHRoZSBzdGFuZGFyZCBvbmUgKGJhc2VkIGluIHByb2NmcykuCitjb25zdCBzdGQ6OnN0cmluZyYgR2V0QW5kcm9pZER0RGlyKCk7CisKKy8vIEltcG9ydCB0aGUga2VybmVsIGJvb3Rjb25maWcgYnkgY2FsbGluZyB0aGUgY2FsbGJhY2sgfGZufCB3aXRoIGVhY2gga2V5LXZhbHVlIHBhaXIuCit2b2lkIEltcG9ydEJvb3Rjb25maWcoY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZyk+JiBmbik7CisKKy8vIEdldCB0aGUga2VybmVsIGJvb3Rjb25maWcgdmFsdWUgZm9yIHxrZXl8LgorLy8gUmV0dXJucyB0cnVlIGlmIHxrZXl8IGlzIGZvdW5kIGluIGJvb3Rjb25maWcuCisvLyBPdGhlcndpc2UgcmV0dXJucyBmYWxzZSBhbmQgfCpvdXR8IGlzIG5vdCBtb2RpZmllZC4KK2Jvb2wgR2V0Qm9vdGNvbmZpZyhjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBzdGQ6OnN0cmluZyogb3V0KTsKKworLy8gSW1wb3J0IHRoZSBrZXJuZWwgY21kbGluZSBieSBjYWxsaW5nIHRoZSBjYWxsYmFjayB8Zm58IHdpdGggZWFjaCBrZXktdmFsdWUgcGFpci4KK3ZvaWQgSW1wb3J0S2VybmVsQ21kbGluZShjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nKT4mIGZuKTsKKworLy8gR2V0IHRoZSBrZXJuZWwgY21kbGluZSB2YWx1ZSBmb3IgfGtleXwuCisvLyBSZXR1cm5zIHRydWUgaWYgfGtleXwgaXMgZm91bmQgaW4gdGhlIGtlcm5lbCBjbWRsaW5lLgorLy8gT3RoZXJ3aXNlIHJldHVybnMgZmFsc2UgYW5kIHwqb3V0fCBpcyBub3QgbW9kaWZpZWQuCitib29sIEdldEtlcm5lbENtZGxpbmUoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgc3RkOjpzdHJpbmcqIG91dCk7CisKKy8vIFJldHVybiB0aGUgIm90aGVyIiBzbG90IGZvciB0aGUgZ2l2ZW4gc2xvdCBzdWZmaXguCitzdGQ6OnN0cmluZyBPdGhlclNsb3RTdWZmaXgoY29uc3Qgc3RkOjpzdHJpbmcmIHN1ZmZpeCk7CisKK2Jvb2wgR2V0Qm9vdGNvbmZpZ0Zyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGJvb3Rjb25maWcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvdXQpOworCiB9ICAvLyBuYW1lc3BhY2UgZnNfbWdyCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYmZzdGFiL2xvZ2dpbmdfbWFjcm9zLmggYi9mc19tZ3IvbGliZnN0YWIvbG9nZ2luZ19tYWNyb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWExYjc3Ci0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYmZzdGFiL2xvZ2dpbmdfbWFjcm9zLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2RlZmluZSBGU1RBQl9UQUcgIltsaWJmc3RhYl0gIgorCisvKiBUaGUgQ0hFQ0soKSBpbiBsb2dnaW5nLmggd2lsbCB1c2UgcHJvZ3JhbSBpbnZvY2F0aW9uIG5hbWUgYXMgdGhlIHRhZy4KKyAqIFRodXMsIHRoZSBsb2cgd2lsbCBoYXZlIHByZWZpeCAiaW5pdDogIiB3aGVuIGxpYmZzX21nciBpcyBzdGF0aWNhbGx5CisgKiBsaW5rZWQgaW4gdGhlIGluaXQgcHJvY2Vzcy4gVGhpcyBtaWdodCBiZSBvcGFxdWUgd2hlbiBkZWJ1Z2dpbmcuCisgKiBBcHBlbmQgYSBsaWJyYXJ5IG5hbWUgdGFnIGF0IHRoZSBlbmQgb2YgdGhlIGFib3J0IG1lc3NhZ2UgdG8gYWlkIGRlYnVnZ2luZy4KKyAqLworI2RlZmluZSBGU1RBQl9DSEVDSyh4KSBDSEVDSyh4KSA8PCAiaW4gIiA8PCBGU1RBQl9UQUcKKworLy8gTG9ncyBhIG1lc3NhZ2UgdG8ga2VybmVsCisjZGVmaW5lIExJTkZPIExPRyhJTkZPKSA8PCBGU1RBQl9UQUcKKyNkZWZpbmUgTFdBUk5JTkcgTE9HKFdBUk5JTkcpIDw8IEZTVEFCX1RBRworI2RlZmluZSBMRVJST1IgTE9HKEVSUk9SKSA8PCBGU1RBQl9UQUcKKyNkZWZpbmUgTEZBVEFMIExPRyhGQVRBTCkgPDwgRlNUQUJfVEFHCisKKy8vIExvZ3MgYSBtZXNzYWdlIHdpdGggc3RyZXJyb3IoZXJybm8pIGF0IHRoZSBlbmQKKyNkZWZpbmUgUElORk8gUExPRyhJTkZPKSA8PCBGU1RBQl9UQUcKKyNkZWZpbmUgUFdBUk5JTkcgUExPRyhXQVJOSU5HKSA8PCBGU1RBQl9UQUcKKyNkZWZpbmUgUEVSUk9SIFBMT0coRVJST1IpIDw8IEZTVEFCX1RBRworI2RlZmluZSBQRkFUQUwgUExPRyhGQVRBTCkgPDwgRlNUQUJfVEFHCmRpZmYgLS1naXQgYS9mc19tZ3IvZnNfbWdyX3Nsb3RzZWxlY3QuY3BwIGIvZnNfbWdyL2xpYmZzdGFiL3Nsb3RzZWxlY3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggOTElCnJlbmFtZSBmcm9tIGZzX21nci9mc19tZ3Jfc2xvdHNlbGVjdC5jcHAKcmVuYW1lIHRvIGZzX21nci9saWJmc3RhYi9zbG90c2VsZWN0LmNwcAppbmRleCAwOWMxYjdlLi5kYjNmOGRhIDEwMDY0NAotLS0gYS9mc19tZ3IvZnNfbWdyX3Nsb3RzZWxlY3QuY3BwCisrKyBiL2ZzX21nci9saWJmc3RhYi9zbG90c2VsZWN0LmNwcApAQCAtMTgsOCArMTgsOCBAQAogCiAjaW5jbHVkZSA8c3RyaW5nPgogCi0jaW5jbHVkZSAiZnNfbWdyLmgiCi0jaW5jbHVkZSAiZnNfbWdyX3ByaXYuaCIKKyNpbmNsdWRlICJmc3RhYl9wcml2LmgiCisjaW5jbHVkZSAibG9nZ2luZ19tYWNyb3MuaCIKIAogLy8gUmVhbGlzdGljYWxseSwgdGhpcyBmaWxlIHNob3VsZCBiZSBwYXJ0IG9mIHRoZSBhbmRyb2lkOjpmc19tZ3IgbmFtZXNwYWNlOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmZzX21ncjsKQEAgLTc0LDMgKzc0LDEzIEBACiAgICAgfQogICAgIHJldHVybiB0cnVlOwogfQorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZnNfbWdyIHsKKworc3RkOjpzdHJpbmcgT3RoZXJTbG90U3VmZml4KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWZmaXgpIHsKKyAgICByZXR1cm4gb3RoZXJfc3VmZml4KHN1ZmZpeCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBmc19tZ3IKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlibHAvQW5kcm9pZC5icCBiL2ZzX21nci9saWJscC9BbmRyb2lkLmJwCmluZGV4IDk5NmZmZDcuLmIyMTFlODMgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJscC9BbmRyb2lkLmJwCisrKyBiL2ZzX21nci9saWJscC9BbmRyb2lkLmJwCkBAIC0xNSw2ICsxNSw3IEBACiAvLwogCiBwYWNrYWdlIHsKKyAgICBkZWZhdWx0X3RlYW06ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX2tlcm5lbCIsCiAgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbIkFuZHJvaWQtQXBhY2hlLTIuMCJdLAogfQogCkBAIC05Myw4ICs5NCw4IEBACiAgICAgc3JjczogWwogICAgICAgICAiYnVpbGRlcl90ZXN0LmNwcCIsCiAgICAgICAgICJzdXBlcl9sYXlvdXRfYnVpbGRlcl90ZXN0LmNwcCIsCi0gICAgICAgICJ0ZXN0X3BhcnRpdGlvbl9vcGVuZXIuY3BwIiwKICAgICAgICAgInV0aWxpdHlfdGVzdC5jcHAiLAorICAgICAgICAiOlRlc3RQYXJ0aXRpb25PcGVuZXJfZ3JvdXAiLAogICAgIF0sCiB9CiAKQEAgLTEyMiwzICsxMjMsOCBAQAogICAgIG5hbWU6ICJ2dHNfa2VybmVsX2xpYmxwX3Rlc3QiLAogICAgIGRlZmF1bHRzOiBbImxpYmxwX3Rlc3RfZGVmYXVsdHMiXSwKIH0KKworZmlsZWdyb3VwIHsKKyAgIG5hbWU6ICJUZXN0UGFydGl0aW9uT3BlbmVyX2dyb3VwIiwKKyAgIHNyY3M6IFsgInRlc3RfcGFydGl0aW9uX29wZW5lci5jcHAiXSwKK30KZGlmZiAtLWdpdCBhL2ZzX21nci9saWJscC9idWlsZGVyLmNwcCBiL2ZzX21nci9saWJscC9idWlsZGVyLmNwcAppbmRleCA2Y2IyYzUxLi40ZTZlOTdiIDEwMDY0NAotLS0gYS9mc19tZ3IvbGlibHAvYnVpbGRlci5jcHAKKysrIGIvZnNfbWdyL2xpYmxwL2J1aWxkZXIuY3BwCkBAIC0xMjExLDYgKzEyMTEsMTUgQEAKICAgICBoZWFkZXJfLmZsYWdzIHw9IExQX0hFQURFUl9GTEFHX1ZJUlRVQUxfQUJfREVWSUNFOwogfQogCit2b2lkIE1ldGFkYXRhQnVpbGRlcjo6U2V0T3ZlcmxheXNBY3RpdmVGbGFnKGJvb2wgZmxhZykgeworICAgIFJlcXVpcmVFeHBhbmRlZE1ldGFkYXRhSGVhZGVyKCk7CisgICAgaWYgKGZsYWcpIHsKKyAgICAgICAgaGVhZGVyXy5mbGFncyB8PSBMUF9IRUFERVJfRkxBR19PVkVSTEFZU19BQ1RJVkU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaGVhZGVyXy5mbGFncyAmPSB+TFBfSEVBREVSX0ZMQUdfT1ZFUkxBWVNfQUNUSVZFOworICAgIH0KK30KKwogYm9vbCBNZXRhZGF0YUJ1aWxkZXI6OklzQUJEZXZpY2UoKSB7CiAgICAgcmV0dXJuICFJUHJvcGVydHlGZXRjaGVyOjpHZXRJbnN0YW5jZSgpLT5HZXRQcm9wZXJ0eSgicm8uYm9vdC5zbG90X3N1ZmZpeCIsICIiKS5lbXB0eSgpOwogfQpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYmxwL2Z1enplci9BbmRyb2lkLmJwIGIvZnNfbWdyL2xpYmxwL2Z1enplci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YmQwMzEKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGlibHAvZnV6emVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X3RlYW06ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX2tlcm5lbCIsCit9CisKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGlibHBfZnV6el9kZWZhdWx0cyIsCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYnN0b3JhZ2VfbGl0ZXJhbHNfaGVhZGVycyIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibHAiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgXSwKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgInN5c3RlbS9jb3JlL2ZzX21nci9saWJscCIsCisgICAgXSwKKyAgICBmdXp6X2NvbmZpZzogeworICAgICAgICBjYzogWworICAgICAgICAgICAgImFuZHJvaWQtc3lzdGVtcy1zdG9yYWdlQGdvb2dsZS5jb20iLAorICAgICAgICBdLAorICAgICAgICBjb21wb25lbnRpZDogNTkxNDgsCisgICAgICAgIGhvdGxpc3RzOiBbIjQ1OTMzMTEiXSwKKyAgICAgICAgZGVzY3JpcHRpb246ICJUaGUgZnV6emVycyB0YXJnZXQgdGhlIEFQSXMgb2YgYWxsIGxpYmxwIG1vZHVsZXMiLAorICAgICAgICB2ZWN0b3I6ICJsb2NhbF9ub19wcml2aWxlZ2VzX3JlcXVpcmVkIiwKKyAgICAgICAgc2VydmljZV9wcml2aWxlZ2U6ICJwcml2aWxlZ2VkIiwKKyAgICAgICAgdXNlcnM6ICJtdWx0aV91c2VyIiwKKyAgICAgICAgZnV6emVkX2NvZGVfdXNhZ2U6ICJzaGlwcGVkIiwKKyAgICB9LAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibGlibHBfYnVpbGRlcl9mdXp6ZXIiLAorICAgIHNyY3M6IFsibGlibHBfYnVpbGRlcl9mdXp6ZXIuY3BwIl0sCisgICAgZGVmYXVsdHM6IFsibGlibHBfZnV6el9kZWZhdWx0cyJdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibGlibHBfc3VwZXJfbGF5b3V0X2J1aWxkZXJfZnV6emVyIiwKKyAgICBzcmNzOiBbImxpYmxwX3N1cGVyX2xheW91dF9idWlsZGVyX2Z1enplci5jcHAiXSwKKyAgICBkZWZhdWx0czogWyJsaWJscF9mdXp6X2RlZmF1bHRzIl0sCit9CisKK3B5dGhvbl9iaW5hcnlfaG9zdCB7CisgICAgbmFtZTogImltYWdlX2dlbl9yYW5kIiwKKyAgICBzcmNzOiBbImltYWdlX2dlbl9yYW5kLnB5Il0sCit9CisKK2dlbnJ1bGVfZGVmYXVsdHMgeworICAgIG5hbWU6ICJ0ZXN0X2RhdGFfZ2VuX2RlZmF1bHRzIiwKKyAgICB0b29sczogWworICAgICAgICAiaW1hZ2VfZ2VuX3JhbmQiLAorICAgIF0sCit9CisKKy8vIEZha2UgZHRiIGltYWdlLgorZ2VucnVsZSB7CisgICAgbmFtZTogInRlc3RfZHRiIiwKKyAgICBkZWZhdWx0czogWyJ0ZXN0X2RhdGFfZ2VuX2RlZmF1bHRzIl0sCisgICAgb3V0OiBbInRlc3RfZHRiLmltZyJdLAorICAgIGNtZDogIiQobG9jYXRpb24gaW1hZ2VfZ2VuX3JhbmQpIC0tc2VlZCBkdGIgLS1sZW5ndGggMTAyNCA+ICQob3V0KSIsCit9CisKKy8vIEZha2UgYm9vdGNvbmZpZyBpbWFnZS4KK2dlbnJ1bGUgeworICAgIG5hbWU6ICJ0ZXN0X2Jvb3Rjb25maWciLAorICAgIGRlZmF1bHRzOiBbInRlc3RfZGF0YV9nZW5fZGVmYXVsdHMiXSwKKyAgICBvdXQ6IFsidGVzdF9ib290Y29uZmlnLmltZyJdLAorICAgIGNtZDogIiQobG9jYXRpb24gaW1hZ2VfZ2VuX3JhbmQpIC0tc2VlZCBib290Y29uZmlnIC0tbGVuZ3RoIDEwMjQgPiAkKG91dCkiLAorfQorCisvLyBGYWtlIHZlbmRvciByYW1kaXNrIHdpdGggdHlwZSAibm9uZSIuCitnZW5ydWxlIHsKKyAgICBuYW1lOiAidGVzdF92ZW5kb3JfcmFtZGlza19ub25lIiwKKyAgICBkZWZhdWx0czogWyJ0ZXN0X2RhdGFfZ2VuX2RlZmF1bHRzIl0sCisgICAgb3V0OiBbInRlc3RfdmVuZG9yX3JhbWRpc2tfbm9uZS5pbWciXSwKKyAgICBjbWQ6ICIkKGxvY2F0aW9uIGltYWdlX2dlbl9yYW5kKSAtLXNlZWQgdmVuZG9yX3JhbWRpc2tfbm9uZSAtLWxlbmd0aCAxMDI0ID4gJChvdXQpIiwKK30KKworLy8gRmFrZSB2ZW5kb3IgcmFtZGlzayB3aXRoIHR5cGUgInBsYXRmb3JtIi4KK2dlbnJ1bGUgeworICAgIG5hbWU6ICJ0ZXN0X3ZlbmRvcl9yYW1kaXNrX3BsYXRmb3JtIiwKKyAgICBkZWZhdWx0czogWyJ0ZXN0X2RhdGFfZ2VuX2RlZmF1bHRzIl0sCisgICAgb3V0OiBbInRlc3RfdmVuZG9yX3JhbWRpc2tfcGxhdGZvcm0uaW1nIl0sCisgICAgY21kOiAiJChsb2NhdGlvbiBpbWFnZV9nZW5fcmFuZCkgLS1zZWVkIHZlbmRvcl9yYW1kaXNrX3BsYXRmb3JtIC0tbGVuZ3RoIDEwMjQgPiAkKG91dCkiLAorfQorCisvLyBGYWtlIHJlcGxhY2VtZW50IHJhbWRpc2suCitnZW5ydWxlIHsKKyAgICBuYW1lOiAidGVzdF92ZW5kb3JfcmFtZGlza19yZXBsYWNlIiwKKyAgICBkZWZhdWx0czogWyJ0ZXN0X2RhdGFfZ2VuX2RlZmF1bHRzIl0sCisgICAgb3V0OiBbInRlc3RfdmVuZG9yX3JhbWRpc2tfcmVwbGFjZS5pbWciXSwKKyAgICBjbWQ6ICIkKGxvY2F0aW9uIGltYWdlX2dlbl9yYW5kKSAtLXNlZWQgcmVwbGFjZSAtLWxlbmd0aCAzMDcyID4gJChvdXQpIiwKK30KKworLy8gR2VucnVsZXMgZm9yIHRlc3QgdmVuZG9yIGJvb3QgaW1hZ2VzLgorZmFzdGJvb3Rfc2lnbl90ZXN0X2ltYWdlID0gIiQobG9jYXRpb24gYXZidG9vbCkgYWRkX2hhc2hfZm9vdGVyIC0tc2FsdCAwMCAtLWltYWdlICQob3V0KSAiICsKKyAgICAiLS1wYXJ0aXRpb25fbmFtZSB2ZW5kb3JfYm9vdCAtLXBhcnRpdGlvbl9zaXplICQkKCggMSAqIDEwMjQgKiAxMDI0ICkpIgorCitnZW5ydWxlX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAidGVzdF92ZW5kb3JfYm9vdF9nZW5fZGVmYXVsdHMiLAorICAgIGRlZmF1bHRzOiBbInRlc3RfZGF0YV9nZW5fZGVmYXVsdHMiXSwKKyAgICB0b29sczogWworICAgICAgICAiYXZidG9vbCIsCisgICAgICAgICJta2Jvb3RpbWciLAorICAgIF0sCit9CisKK2dlbnJ1bGUgeworICAgIG5hbWU6ICJ0ZXN0X3ZlbmRvcl9ib290X3YzIiwKKyAgICBkZWZhdWx0czogWyJ0ZXN0X3ZlbmRvcl9ib290X2dlbl9kZWZhdWx0cyJdLAorICAgIG91dDogWyJ0ZXN0X3ZlbmRvcl9ib290X3YzLmltZyJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgIjp0ZXN0X2R0YiIsCisgICAgICAgICI6dGVzdF92ZW5kb3JfcmFtZGlza19ub25lIiwKKyAgICBdLAorICAgIGNtZDogIiQobG9jYXRpb24gbWtib290aW1nKSAtLWhlYWRlcl92ZXJzaW9uIDMgIiArCisgICAgICAgICItLXZlbmRvcl9yYW1kaXNrICQobG9jYXRpb24gOnRlc3RfdmVuZG9yX3JhbWRpc2tfbm9uZSkgIiArCisgICAgICAgICItLWR0YiAkKGxvY2F0aW9uIDp0ZXN0X2R0YikgIiArCisgICAgICAgICItLXZlbmRvcl9ib290ICQob3V0KSAmJiAiICsKKyAgICAgICAgZmFzdGJvb3Rfc2lnbl90ZXN0X2ltYWdlLAorfQorCitnZW5ydWxlIHsKKyAgICBuYW1lOiAidGVzdF92ZW5kb3JfYm9vdF92NF93aXRob3V0X2ZyYWciLAorICAgIGRlZmF1bHRzOiBbInRlc3RfdmVuZG9yX2Jvb3RfZ2VuX2RlZmF1bHRzIl0sCisgICAgb3V0OiBbInRlc3RfdmVuZG9yX2Jvb3RfdjRfd2l0aG91dF9mcmFnLmltZyJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgIjp0ZXN0X2R0YiIsCisgICAgICAgICI6dGVzdF92ZW5kb3JfcmFtZGlza19ub25lIiwKKyAgICAgICAgIjp0ZXN0X2Jvb3Rjb25maWciLAorICAgIF0sCisgICAgY21kOiAiJChsb2NhdGlvbiBta2Jvb3RpbWcpIC0taGVhZGVyX3ZlcnNpb24gNCAiICsKKyAgICAgICAgIi0tdmVuZG9yX3JhbWRpc2sgJChsb2NhdGlvbiA6dGVzdF92ZW5kb3JfcmFtZGlza19ub25lKSAiICsKKyAgICAgICAgIi0tZHRiICQobG9jYXRpb24gOnRlc3RfZHRiKSAiICsKKyAgICAgICAgIi0tdmVuZG9yX2Jvb3Rjb25maWcgJChsb2NhdGlvbiA6dGVzdF9ib290Y29uZmlnKSAiICsKKyAgICAgICAgIi0tdmVuZG9yX2Jvb3QgJChvdXQpICYmICIgKworICAgICAgICBmYXN0Ym9vdF9zaWduX3Rlc3RfaW1hZ2UsCit9CisKK2dlbnJ1bGUgeworICAgIG5hbWU6ICJ0ZXN0X3ZlbmRvcl9ib290X3Y0X3dpdGhfZnJhZyIsCisgICAgZGVmYXVsdHM6IFsidGVzdF92ZW5kb3JfYm9vdF9nZW5fZGVmYXVsdHMiXSwKKyAgICBvdXQ6IFsidGVzdF92ZW5kb3JfYm9vdF92NF93aXRoX2ZyYWcuaW1nIl0sCisgICAgc3JjczogWworICAgICAgICAiOnRlc3RfZHRiIiwKKyAgICAgICAgIjp0ZXN0X3ZlbmRvcl9yYW1kaXNrX25vbmUiLAorICAgICAgICAiOnRlc3RfdmVuZG9yX3JhbWRpc2tfcGxhdGZvcm0iLAorICAgICAgICAiOnRlc3RfYm9vdGNvbmZpZyIsCisgICAgXSwKKyAgICBjbWQ6ICIkKGxvY2F0aW9uIG1rYm9vdGltZykgLS1oZWFkZXJfdmVyc2lvbiA0ICIgKworICAgICAgICAiLS1kdGIgJChsb2NhdGlvbiA6dGVzdF9kdGIpICIgKworICAgICAgICAiLS12ZW5kb3JfYm9vdGNvbmZpZyAkKGxvY2F0aW9uIDp0ZXN0X2Jvb3Rjb25maWcpICIgKworICAgICAgICAiLS1yYW1kaXNrX3R5cGUgbm9uZSAtLXJhbWRpc2tfbmFtZSBub25lX3JhbWRpc2sgIiArCisgICAgICAgICItLXZlbmRvcl9yYW1kaXNrX2ZyYWdtZW50ICQobG9jYXRpb24gOnRlc3RfdmVuZG9yX3JhbWRpc2tfbm9uZSkgIiArCisgICAgICAgICItLXJhbWRpc2tfdHlwZSBwbGF0Zm9ybSAtLXJhbWRpc2tfbmFtZSBwbGF0Zm9ybV9yYW1kaXNrICIgKworICAgICAgICAiLS12ZW5kb3JfcmFtZGlza19mcmFnbWVudCAkKGxvY2F0aW9uIDp0ZXN0X3ZlbmRvcl9yYW1kaXNrX3BsYXRmb3JtKSAiICsKKyAgICAgICAgIi0tdmVuZG9yX2Jvb3QgJChvdXQpICYmICIgKworICAgICAgICBmYXN0Ym9vdF9zaWduX3Rlc3RfaW1hZ2UsCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJsaWJscF9hcGlzX2Z1enplciIsCisgICAgc3JjczogWworICAgICAgICAibGlibHBfYXBpc19mdXp6ZXIuY3BwIiwKKyAgICAgICAgIjpUZXN0UGFydGl0aW9uT3BlbmVyX2dyb3VwIiwKKyAgICBdLAorICAgIGRlZmF1bHRzOiBbImxpYmxwX2Z1enpfZGVmYXVsdHMiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3BhcnNlIiwKKyAgICBdLAorICAgIGRhdGE6IFsKKyAgICAgICAgIjp0ZXN0X2R0YiIsCisgICAgICAgICI6dGVzdF9ib290Y29uZmlnIiwKKyAgICAgICAgIjp0ZXN0X3ZlbmRvcl9yYW1kaXNrX25vbmUiLAorICAgICAgICAiOnRlc3RfdmVuZG9yX3JhbWRpc2tfcGxhdGZvcm0iLAorICAgICAgICAiOnRlc3RfdmVuZG9yX3JhbWRpc2tfcmVwbGFjZSIsCisgICAgICAgICI6dGVzdF92ZW5kb3JfYm9vdF92MyIsCisgICAgICAgICI6dGVzdF92ZW5kb3JfYm9vdF92NF93aXRob3V0X2ZyYWciLAorICAgICAgICAiOnRlc3RfdmVuZG9yX2Jvb3RfdjRfd2l0aF9mcmFnIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYmxwL2Z1enplci9SRUFETUUubWQgYi9mc19tZ3IvbGlibHAvZnV6emVyL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTVjNTliCi0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYmxwL2Z1enplci9SRUFETUUubWQKQEAgLTAsMCArMSwxMzAgQEAKKyMgRnV6emVycyBmb3IgbGlibHAKKyMjIFRhYmxlIG9mIGNvbnRlbnRzCisrICBbbGlibHBfYnVpbGRlcl9mdXp6ZXJdKCNCdWlsZGVyKQorKyAgW2xpYmxwX3N1cGVyX2xheW91dF9idWlsZGVyX2Z1enplcl0oI1N1cGVyQnVpbGRlcikKKysgIFtsaWJscF9hcGlzX2Z1enplcl0oI0FQSXMpCisKKyMgPGEgIG5hbWU9IkJ1aWxkZXIiPjwvYT4gRnV6emVyIGZvciBMaWJscEJ1aWxkZXIKKworTGlibHBCdWlsZGVyIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKzEuIGtBdHRyaWJ1dGVUeXBlcyAocGFyYW1ldGVyIG5hbWU6ICJhdHRyaWJ1dGUiKQorMi4gYmxvY2tEZXZTaXplIChwYXJhbWV0ZXIgbmFtZTogImJsb2NrZGV2X3NpemUiKQorMy4gbWV0YWRhdGFNYXhTaXplIChwYXJhbWV0ZXIgbmFtZTogIm1ldGFkYXRhX21heF9zaXplIikKKzQuIG1ldGFkYXRhU2xvdENvdW50IChwYXJhbWV0ZXIgbmFtZTogIm1ldGFkYXRhX3Nsb3RfY291bnQiKQorNS4gcGFydGl0aW9uTmFtZSAocGFyYW1ldGVyIG5hbWU6ICJwYXJ0aXRpb25fbmFtZSIpCis2LiBzdXBlckJsb2NrRGV2aWNlTmFtZSAocGFyYW1ldGVyIG5hbWU6ICJibG9ja19kZXZpY2VfbmFtZSIpCis3LiBibG9ja0RldmljZUluZm9TaXplIChwYXJhbWV0ZXIgbmFtZTogImJsb2NrX2RldmljZV9pbmZvX3NpemUiKQorOC4gYWxpZ25tZW50IChwYXJhbWV0ZXIgbmFtZTogImFsaWdubWVudCIpCis5LiBhbGlnbm1lbnRPZmZzZXQgKHBhcmFtZXRlciBuYW1lOiAiYWxpZ25tZW50X29mZnNldCIpCisxMC4gbG9naWNhbEJsb2NrU2l6ZSAocGFyYW1ldGVyIG5hbWU6ICJsb2dpY2FsX2Jsb2NrX3NpemUiKQorMTEuIG1heE1ldGFkYXRhU2l6ZSAocGFyYW1ldGVyIG5hbWU6ICJtYXhfbWV0YWRhdGFfc2l6ZSIpCisxMi4gZGV2aWNlSW5kZXggKHBhcmFtZXRlciBuYW1lOiAiZGV2aWNlX2luZGV4IikKKzEzLiBzdGFydCAocGFyYW1ldGVyIG5hbWU6ICJzdGFydCIpCisxNC4gZW5kIChwYXJhbWV0ZXIgbmFtZTogImVuZCIpCisxNS4gYWRkZWRHcm91cE5hbWUgKHBhcmFtZXRlciBuYW1lOiAiZ3JvdXBfbmFtZSIpCisxNi4gcGFydGl0aW9uR3JvdXBOYW1lIChwYXJhbWV0ZXIgbmFtZTogInBhcnRpdGlvbl9uYW1lIikKKzE3LiBudW1TZWN0b3JzIChwYXJhbWV0ZXIgbmFtZTogIm51bV9zZWN0b3JzIikKKzE4LiBwaHlzaWNhbFNlY3RvciAocGFyYW1ldGVyIG5hbWU6ICJwaHlzaWNhbF9zZWN0b3IiKQorMTkuIHJlc2l6ZWRQYXJ0aXRpb25TaXplIChwYXJhbWV0ZXIgbmFtZTogInJlcXVlc3RlZF9zaXplIikKKworfCBQYXJhbWV0ZXJ8IFZhbGlkIFZhbHVlc3wgQ29uZmlndXJlZCBWYWx1ZXwKK3wtLS0tLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tfCAtLS0tLSB8Cit8YGtBdHRyaWJ1dGVUeXBlc2B8IDEuYExQX1BBUlRJVElPTl9BVFRSX05PTkVgLDxici8+IDIuYExQX1BBUlRJVElPTl9BVFRSX1JFQURPTkxZYCw8YnIvPiAzLmBMUF9QQVJUSVRJT05fQVRUUl9TTE9UX1NVRkZJWEVEYCw8YnIvPiA0LmBMUF9QQVJUSVRJT05fQVRUUl9VUERBVEVEYCw8YnIvPiA1LmBMUF9QQVJUSVRJT05fQVRUUl9ESVNBQkxFRGB8VmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8YGJsb2NrRGV2U2l6ZWB8IEludGVnZXIgdmFsdWUgZnJvbSBgMGAgdG8gYDEwMDAwMGB8VmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8YG1ldGFkYXRhTWF4U2l6ZWB8IEludGVnZXIgdmFsdWUgZnJvbSBgMGAgdG8gYDEwMDAwYCB8VmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8YG1ldGFkYXRhU2xvdENvdW50YHwgSW50ZWdlciB2YWx1ZSBmcm9tIGAwYCB0byBgMmAgfFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfGBwYXJ0aXRpb25OYW1lYHwgU3RyaW5nIHxWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKK3xgc3VwZXJCbG9ja0RldmljZU5hbWVgfCBTdHJpbmcgfFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfGBibG9ja0RldmljZUluZm9TaXplYHwgSW50ZWdlciB8VmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8YGFsaWdubWVudGB8IEludGVnZXIgfFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfGBhbGlnbm1lbnRPZmZzZXRgfCBJbnRlZ2VyIHxWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKK3xgbG9naWNhbEJsb2NrU2l6ZWB8IEludGVnZXIgfFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfGBtYXhNZXRhZGF0YVNpemVgfCBJbnRlZ2VyIHZhbHVlIGZyb20gYDBgIHRvIGAxMDAwMGAgfFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfGBkZXZpY2VJbmRleGB8IEludGVnZXIgfFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfGBzdGFydGB8IEludGVnZXIgfFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfGBlbmRgfCBJbnRlZ2VyIHxWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKK3xgcGFydGl0aW9uR3JvdXBOYW1lYHwgU3RyaW5nIHxWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKK3xgbnVtU2VjdG9yc2B8IEludGVnZXIgdmFsdWUgZnJvbSBgMWAgdG8gYDEwMDAwMDBgIHxWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKK3xgcGh5c2ljYWxTZWN0b3JgfCBJbnRlZ2VyIHZhbHVlIGZyb20gYDFgIHRvIGAxMDAwMDAwYCB8VmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8YHJlc2l6ZWRQYXJ0aXRpb25TaXplYHwgSW50ZWdlciB2YWx1ZSBmcm9tIGAwYCB0byBgMTAwMDBgIHxWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKKworIyMjIyBTdGVwcyB0byBydW4KKzEuIEJ1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgbGlibHBfYnVpbGRlcl9mdXp6ZXIKK2BgYAorMi4gUnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L2xpYmxwX2J1aWxkZXJfZnV6emVyL2xpYmxwX2J1aWxkZXJfZnV6emVyCitgYGAKKworIyA8YSAgbmFtZT0iU3VwZXJCdWlsZGVyIj48L2E+IEZ1enplciBmb3IgTGlibHBTdXBlckxheW91dEJ1aWxkZXIKKworU3VwZXJMYXlvdXRCdWlsZGVyIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKzEuIGtBdHRyaWJ1dGVUeXBlcyAocGFyYW1ldGVyIG5hbWU6ICJhdHRyaWJ1dGUiKQorMi4gYmxvY2tEZXZTaXplIChwYXJhbWV0ZXIgbmFtZTogImJsb2NrZGV2X3NpemUiKQorMy4gbWV0YWRhdGFNYXhTaXplIChwYXJhbWV0ZXIgbmFtZTogIm1ldGFkYXRhX21heF9zaXplIikKKzQuIHBhcnRpdGlvbk5hbWUgKHBhcmFtZXRlciBuYW1lOiAicGFydGl0aW9uX25hbWUiKQorNS4gZGF0YSAocGFyYW1ldGVyIG5hbWU6ICJkYXRhIikKKzYuIGltYWdlTmFtZSAocGFyYW1ldGVyIG5hbWU6ICJpbWFnZV9uYW1lIikKKworfCBQYXJhbWV0ZXJ8IFZhbGlkIFZhbHVlc3wgQ29uZmlndXJlZCBWYWx1ZXwKK3wtLS0tLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tfCAtLS0tLSB8Cit8YGtBdHRyaWJ1dGVUeXBlc2B8IDEuYExQX1BBUlRJVElPTl9BVFRSX05PTkVgLDxici8+IDIuYExQX1BBUlRJVElPTl9BVFRSX1JFQURPTkxZYCw8YnIvPiAzLmBMUF9QQVJUSVRJT05fQVRUUl9TTE9UX1NVRkZJWEVEYCw8YnIvPiA0LmBMUF9QQVJUSVRJT05fQVRUUl9VUERBVEVEYCw8YnIvPiA1LmBMUF9QQVJUSVRJT05fQVRUUl9ESVNBQkxFRGB8VmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8YGJsb2NrRGV2U2l6ZWB8IEludGVnZXIgdmFsdWUgZnJvbSBgMGAgdG8gYDEwMDAwMGB8VmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8YG1ldGFkYXRhTWF4U2l6ZWB8IEludGVnZXIgdmFsdWUgZnJvbSBgMGAgdG8gYDEwMDAwYCB8VmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8YHBhcnRpdGlvbk5hbWVgfCBTdHJpbmcgfFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfGBkYXRhYHwgU3RyaW5nIHxWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKK3xgaW1hZ2VOYW1lYHwgU3RyaW5nIHxWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKKworIyMjIyBTdGVwcyB0byBydW4KKzEuIEJ1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgbGlibHBfc3VwZXJfbGF5b3V0X2J1aWxkZXJfZnV6emVyCitgYGAKKzIuIFJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9saWJscF9zdXBlcl9sYXlvdXRfYnVpbGRlcl9mdXp6ZXIvbGlibHBfc3VwZXJfbGF5b3V0X2J1aWxkZXJfZnV6emVyCitgYGAKKworIyA8YSAgbmFtZT0iQVBJcyI+PC9hPiBGdXp6ZXIgZm9yIExpYmxwQXBpcworCitMaWJscEFQSXMgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorMS4gYmxvY2tEZXZpY2VJbmZvU2l6ZSAocGFyYW1ldGVyIG5hbWU6ICJibG9ja19kZXZpY2VfaW5mb19zaXplIikKKzIuIGFsaWdubWVudCAocGFyYW1ldGVyIG5hbWU6ICJhbGlnbm1lbnQiKQorMy4gYWxpZ25tZW50T2Zmc2V0IChwYXJhbWV0ZXIgbmFtZTogImFsaWdubWVudF9vZmZzZXQiKQorNC4gbG9naWNhbEJsb2NrU2l6ZSAocGFyYW1ldGVyIG5hbWU6ICJsb2dpY2FsX2Jsb2NrX3NpemUiKQorNS4gYmxvY2tEZXZTaXplIChwYXJhbWV0ZXIgbmFtZTogImJsb2NrZGV2X3NpemUiKQorNi4gbWV0YWRhdGFNYXhTaXplIChwYXJhbWV0ZXIgbmFtZTogIm1ldGFkYXRhX21heF9zaXplIikKKzcuIGJsb2NrRGV2aWNlSW5mb05hbWUgKHBhcmFtZXRlciBuYW1lOiAiYmxvY2tfZGV2aWNlX2luZm9fbmFtZSIpCis4LiBudW1TZWN0b3JzIChwYXJhbWV0ZXIgbmFtZTogIm51bV9zZWN0b3JzIikKKzkuIHBoeXNpY2FsU2VjdG9yIChwYXJhbWV0ZXIgbmFtZTogInBoeXNpY2FsX3NlY3RvciIpCisxMC4gc3BhcnNpZnkgKHBhcmFtZXRlciBuYW1lOiAic3BhcnNpZnkiKQorMTEuIGJ1ZmZlciAocGFyYW1ldGVyIG5hbWU6ICJkYXRhIikKKworfCBQYXJhbWV0ZXJ8IFZhbGlkIFZhbHVlc3wgQ29uZmlndXJlZCBWYWx1ZXwKK3wtLS0tLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tfCAtLS0tLSB8Cit8YGJsb2NrRGV2aWNlSW5mb1NpemVgfCBJbnRlZ2VyIHxWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKK3xgYWxpZ25tZW50YHwgSW50ZWdlciB8VmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8YGFsaWdubWVudE9mZnNldGB8IEludGVnZXIgfFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfGBsb2dpY2FsQmxvY2tTaXplYHwgSW50ZWdlciB8VmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8YGJsb2NrRGV2U2l6ZWB8IEludGVnZXIgdmFsdWUgaW4gbXVsdGlwbGVzIG9mIGBMUF9TRUNUT1JfU0laRWB8VmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8YG1ldGFkYXRhTWF4U2l6ZWB8IEludGVnZXIgdmFsdWUgZnJvbSBgMGAgdG8gYDEwMDAwYCB8VmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8YGJsb2NrRGV2aWNlSW5mb05hbWVgfCBTdHJpbmcgfFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfGBudW1TZWN0b3JzYHwgSW50ZWdlciB2YWx1ZSBmcm9tIGAxYCB0byBgMTAwMDAwMGAgfFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfGBwaHlzaWNhbFNlY3RvcmB8IEludGVnZXIgdmFsdWUgZnJvbSBgMWAgdG8gYDEwMDAwMDBgIHxWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKK3xgYWxpZ25tZW50YHwgQm9vbCB8VmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8YGFsaWdubWVudGB8IFZlY3RvciB8VmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8CisKKyMjIyMgU3RlcHMgdG8gcnVuCisxLiBCdWlsZCB0aGUgZnV6emVyCitgYGAKKyAgJCBtbSAtaiQobnByb2MpIGxpYmxwX2FwaXNfZnV6emVyCitgYGAKKzIuIFJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9saWJscF9hcGlzX2Z1enplci9saWJscF9hcGlzX2Z1enplcgorYGBgCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlibHAvZnV6emVyL2ltYWdlX2dlbl9yYW5kLnB5IGIvZnNfbWdyL2xpYmxwL2Z1enplci9pbWFnZV9nZW5fcmFuZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTg1NDcyCi0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYmxwL2Z1enplci9pbWFnZV9nZW5fcmFuZC5weQpAQCAtMCwwICsxLDMyIEBACisjIS91c3IvYmluL2VudiBweXRob24zCisKKyMgQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyIiIgorV3JpdGUgZ2l2ZW4gbnVtYmVyIG9mIHJhbmRvbSBieXRlcywgZ2VuZXJhdGVkIHdpdGggb3B0aW9uYWwgc2VlZC4KKyIiIgorCitpbXBvcnQgcmFuZG9tLCBhcmdwYXJzZQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj1fX2RvY19fKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXNlZWQnLCBoZWxwPSdTZWVkIHRvIHJhbmRvbSBnZW5lcmF0b3InKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWxlbmd0aCcsIHR5cGU9aW50LCByZXF1aXJlZD1UcnVlLCBoZWxwPSdMZW5ndGggb2Ygb3V0cHV0JykKKyAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKworICBpZiBhcmdzLnNlZWQ6CisgICAgcmFuZG9tLnNlZWQoYXJncy5zZWVkKQorCisgIHByaW50KCcnLmpvaW4oY2hyKHJhbmRvbS5yYW5kcmFuZ2UoMCwweGZmKSkgZm9yIF8gaW4gcmFuZ2UoYXJncy5sZW5ndGgpKSkKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJscC9mdXp6ZXIvbGlibHBfYXBpc19mdXp6ZXIuY3BwIGIvZnNfbWdyL2xpYmxwL2Z1enplci9saWJscF9hcGlzX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IxOTJlYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJscC9mdXp6ZXIvbGlibHBfYXBpc19mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxsaWJscC9idWlsZGVyLmg+CisjaW5jbHVkZSA8bGlibHAvcGFydGl0aW9uX29wZW5lci5oPgorI2luY2x1ZGUgPGxpbnV4L21lbWZkLmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDx3cml0ZXIuaD4KKyNpbmNsdWRlICJpbWFnZXMuaCIKKyNpbmNsdWRlICJ0ZXN0X3BhcnRpdGlvbl9vcGVuZXIuaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmZzX21ncjsKK3VzaW5nIHVuaXF1ZV9mZCA9IGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZDsKKworc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga0Rpc2tTaXplID0gMTMxMDcyOworc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01ldGFkYXRhU2l6ZSA9IDUxMjsKK3N0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNZXRhZGF0YVNsb3RzID0gMjsKK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga01heEJ5dGVzID0gMjA7CitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtWYWxpZEFsaWdubWVudCA9IDA7CitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtWYWxpZEFsaWdubWVudE9mZnNldCA9IDA7CitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtWYWxpZExvZ2ljYWxCbG9ja1NpemUgPSA0MDk2Oworc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrTWluTWV0YWRhdGFTaXplID0gMDsKK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga01heE1ldGFkYXRhU2l6ZSA9IDEwMDAwOworc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrTWluRmFjdG9yID0gMDsKK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga01heEZhY3RvciA9IDEwOworc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrTWV0YWRhdGFHZW9tZXRyeVNpemUgPSA0MDk2Oworc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrVmFsaWROdW1TZWN0b3JzID0gMTkwMTU2ODsKK3N0YXRpYyBjb25zdGV4cHIgdWludDY0X3Qga1ZhbGlkUGh5c2ljYWxTZWN0b3IgPSAzNjA4NTc2Oworc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrTWluU2VjdG9yVmFsdWUgPSAxOworc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrTWF4U2VjdG9yVmFsdWUgPSAxMDAwMDAwOworc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrTWF4QnVmZmVyU2l6ZSA9IDEwMDAwMDsKKworY29uc3Qgc3RyaW5nIGtJbWFnZUZpbGUgPSAiaW1hZ2VfZmlsZSI7Citjb25zdCBzdHJpbmcga1N1cGVyTmFtZSA9ICJzdXBlciI7Citjb25zdCBzdHJpbmcga1N5c3RlbVBhcnRpdGlvbk5hbWUgPSAic3lzdGVtIjsKK2NvbnN0IHN0cmluZyBrUGFydGl0aW9uTmFtZSA9ICJidWlsZGVyX3BhcnRpdGlvbiI7Citjb25zdCBzdHJpbmcga1N1cGVyUGFydGl0aW9uTmFtZSA9ICJzdXBlcl9wYXJ0aXRpb24iOworCitjb25zdCBzdHJpbmcga1N1ZmZpeFtdID0geyJfYSIsICJfYiIsICJhIiwgImIifTsKKworY2xhc3MgTGlwbHBBcGlzRnV6emVyIHsKKyAgcHVibGljOgorICAgIExpcGxwQXBpc0Z1enplcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgOiBtRmRwKGRhdGEsIHNpemUpe307CisgICAgdm9pZCBwcm9jZXNzKCk7CisKKyAgcHJpdmF0ZToKKyAgICB2b2lkIHNldHVwQnVpbGRlcigpOworICAgIEJsb2NrRGV2aWNlSW5mbyBnZXRCbG9ja0RldmljZSgpOworICAgIEZ1enplZERhdGFQcm92aWRlciBtRmRwOworICAgIHVuaXF1ZV9wdHI8TWV0YWRhdGFCdWlsZGVyPiBtQnVpbGRlcjsKKyAgICBzdHJpbmcgbUJsb2NrRGV2aWNlSW5mb05hbWU7CisgICAgc3RyaW5nIG1TdXBlclBhcnRpdGlvbk5hbWU7CisgICAgc3RyaW5nIG1QYXJ0aXRpb25OYW1lOworICAgIGNvbnN0IHN0cmluZyBtSW1hZ2VQYXRoc1sxMF0gPSB7CisgICAgICAgICAgICAiZGF0YS90ZXN0X2R0Yi5pbWciLAorICAgICAgICAgICAgImRhdGEvdGVzdF9ib290Y29uZmlnLmltZyIsCisgICAgICAgICAgICAiZGF0YS90ZXN0X3ZlbmRvcl9yYW1kaXNrX25vbmUuaW1nIiwKKyAgICAgICAgICAgICJkYXRhL3Rlc3RfdmVuZG9yX3JhbWRpc2tfcGxhdGZvcm0uaW1nIiwKKyAgICAgICAgICAgICJkYXRhL3Rlc3RfdmVuZG9yX3JhbWRpc2tfcmVwbGFjZS5pbWciLAorICAgICAgICAgICAgImRhdGEvdGVzdF92ZW5kb3JfYm9vdF92NF93aXRoX2ZyYWcuaW1nIiwKKyAgICAgICAgICAgICJkYXRhL3Rlc3RfdmVuZG9yX2Jvb3RfdjRfd2l0aG91dF9mcmFnLmltZyIsCisgICAgICAgICAgICAiZGF0YS90ZXN0X3ZlbmRvcl9ib290X3YzLmltZyIsCisgICAgICAgICAgICAiZGV2L251bGwiLAorICAgICAgICAgICAgbUZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtNYXhCeXRlcyksCisgICAgfTsKK307CisKK0Jsb2NrRGV2aWNlSW5mbyBMaXBscEFwaXNGdXp6ZXI6OmdldEJsb2NrRGV2aWNlKCkgeworICAgIG1CbG9ja0RldmljZUluZm9OYW1lID0KKyAgICAgICAgICAgIG1GZHAuQ29uc3VtZUJvb2woKSA/IGtTdXBlck5hbWUgOiBtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heEJ5dGVzKTsKKyAgICB1aW50NjRfdCBibG9ja0RldmljZUluZm9TaXplID0KKyAgICAgICAgICAgIG1GZHAuQ29uc3VtZUJvb2woKSA/IG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQ2NF90PigpIDoga0Rpc2tTaXplOworICAgIHVpbnQzMl90IGFsaWdubWVudCA9IG1GZHAuQ29uc3VtZUJvb2woKSA/IG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQzMl90PigpIDoga1ZhbGlkQWxpZ25tZW50OworICAgIHVpbnQzMl90IGFsaWdubWVudE9mZnNldCA9CisgICAgICAgICAgICBtRmRwLkNvbnN1bWVCb29sKCkgPyBtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKSA6IGtWYWxpZEFsaWdubWVudE9mZnNldDsKKyAgICB1aW50MzJfdCBsb2dpY2FsQmxvY2tTaXplID0KKyAgICAgICAgICAgIG1GZHAuQ29uc3VtZUJvb2woKSA/IG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQzMl90PigpIDoga1ZhbGlkTG9naWNhbEJsb2NrU2l6ZTsKKworICAgIEJsb2NrRGV2aWNlSW5mbyBzdXBlckluZm97bUJsb2NrRGV2aWNlSW5mb05hbWUsIGJsb2NrRGV2aWNlSW5mb1NpemUsIGFsaWdubWVudCwgYWxpZ25tZW50T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9naWNhbEJsb2NrU2l6ZX07CisgICAgcmV0dXJuIHN1cGVySW5mbzsKK30KKwordm9pZCBMaXBscEFwaXNGdXp6ZXI6OnNldHVwQnVpbGRlcigpIHsKKyAgICB1aW50NjRfdCByYW5kb21CbG9ja0RldlNpemUgPQorICAgICAgICAgICAgbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQ2NF90PihrTWluRmFjdG9yLCBrTWF4RmFjdG9yKSAqIExQX1NFQ1RPUl9TSVpFOworICAgIHVpbnQ2NF90IGJsb2NrRGV2U2l6ZSA9IG1GZHAuQ29uc3VtZUJvb2woKSA/IHJhbmRvbUJsb2NrRGV2U2l6ZSA6IGtEaXNrU2l6ZTsKKyAgICB1aW50MzJfdCByYW5kb21NZXRhZGF0YU1heFNpemUgPQorICAgICAgICAgICAgbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQzMl90PihrTWluTWV0YWRhdGFTaXplLCBrTWF4TWV0YWRhdGFTaXplKTsKKyAgICB1aW50MzJfdCBtZXRhZGF0YU1heFNpemUgPSBtRmRwLkNvbnN1bWVCb29sKCkgPyBrTWV0YWRhdGFTaXplIDogcmFuZG9tTWV0YWRhdGFNYXhTaXplOworICAgIHVpbnQzMl90IG1ldGFkYXRhU2xvdENvdW50ID0gbUZkcC5Db25zdW1lQm9vbCgpID8gMCA6IDE7CisgICAgbUJ1aWxkZXIgPSBNZXRhZGF0YUJ1aWxkZXI6Ok5ldyhibG9ja0RldlNpemUsIG1ldGFkYXRhTWF4U2l6ZSwgbWV0YWRhdGFTbG90Q291bnQpOworCisgICAgaWYgKG1CdWlsZGVyLmdldCgpKSB7CisgICAgICAgIG1CdWlsZGVyLT5BZGRQYXJ0aXRpb24oa1N5c3RlbVBhcnRpdGlvbk5hbWUsIExQX1BBUlRJVElPTl9BVFRSX1JFQURPTkxZKTsKKworICAgICAgICBtUGFydGl0aW9uTmFtZSA9CisgICAgICAgICAgICAgICAgbUZkcC5Db25zdW1lQm9vbCgpID8gbUZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtNYXhCeXRlcykgOiBrUGFydGl0aW9uTmFtZTsKKyAgICAgICAgaWYgKCFtUGFydGl0aW9uTmFtZS5zaXplKCkpIHsKKyAgICAgICAgICAgIG1QYXJ0aXRpb25OYW1lID0ga1BhcnRpdGlvbk5hbWU7CisgICAgICAgIH0KKyAgICAgICAgbVN1cGVyUGFydGl0aW9uTmFtZSA9IG1GZHAuQ29uc3VtZUJvb2woKSA/IG1GZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrTWF4Qnl0ZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBrU3VwZXJQYXJ0aXRpb25OYW1lOworICAgICAgICBpZiAoIW1TdXBlclBhcnRpdGlvbk5hbWUuc2l6ZSgpKSB7CisgICAgICAgICAgICBtU3VwZXJQYXJ0aXRpb25OYW1lID0ga1N1cGVyUGFydGl0aW9uTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIFBhcnRpdGlvbiogc3VwZXIgPSBtQnVpbGRlci0+QWRkUGFydGl0aW9uKG1TdXBlclBhcnRpdGlvbk5hbWUsIExQX1BBUlRJVElPTl9BVFRSX1JFQURPTkxZKTsKKyAgICAgICAgbUJ1aWxkZXItPkFkZFBhcnRpdGlvbihtUGFydGl0aW9uTmFtZSwgTFBfUEFSVElUSU9OX0FUVFJfUkVBRE9OTFkpOworCisgICAgICAgIGlmIChzdXBlcikgeworICAgICAgICAgICAgaW50NjRfdCBudW1TZWN0b3JzID0gbUZkcC5Db25zdW1lQm9vbCgpID8gbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQ2NF90PigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga01pblNlY3RvclZhbHVlLCBrTWF4U2VjdG9yVmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBrVmFsaWROdW1TZWN0b3JzOworICAgICAgICAgICAgaW50NjRfdCBwaHlzaWNhbFNlY3RvciA9IG1GZHAuQ29uc3VtZUJvb2woKSA/IG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50NjRfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTWluU2VjdG9yVmFsdWUsIGtNYXhTZWN0b3JWYWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBrVmFsaWRQaHlzaWNhbFNlY3RvcjsKKyAgICAgICAgICAgIG1CdWlsZGVyLT5BZGRMaW5lYXJFeHRlbnQoc3VwZXIsIG1CbG9ja0RldmljZUluZm9OYW1lLCBudW1TZWN0b3JzLCBwaHlzaWNhbFNlY3Rvcik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTGlwbHBBcGlzRnV6emVyOjpwcm9jZXNzKCkgeworICAgIEJsb2NrRGV2aWNlSW5mbyBzdXBlckluZm8gPSBnZXRCbG9ja0RldmljZSgpOworICAgIHVuaXF1ZV9mZCBmZChzeXNjYWxsKF9fTlJfbWVtZmRfY3JlYXRlLCAiaW1hZ2VfZmlsZSIsIE1GRF9BTExPV19TRUFMSU5HKSk7CisgICAgc2V0dXBCdWlsZGVyKCk7CisKKyAgICBUZXN0UGFydGl0aW9uT3BlbmVyIG9wZW5lcigKKyAgICAgICAgICAgIHt7bUZkcC5Db25zdW1lQm9vbCgpID8gbUZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtNYXhCeXRlcykgOiBrU3VwZXJOYW1lLCBmZH19LAorICAgICAgICAgICAge3ttRmRwLkNvbnN1bWVCb29sKCkgPyBtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heEJ5dGVzKSA6IGtTdXBlck5hbWUsCisgICAgICAgICAgICAgIHN1cGVySW5mb319KTsKKworICAgIGlmIChtQnVpbGRlci5nZXQoKSkgeworICAgICAgICB1bmlxdWVfcHRyPExwTWV0YWRhdGE+IG1ldGFkYXRhID0gbUJ1aWxkZXItPkV4cG9ydCgpOworICAgICAgICBjb25zdCBMcE1ldGFkYXRhJiBtZXRhZGF0YVZhbHVlID0gKm1ldGFkYXRhLmdldCgpOworCisgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gaW1hZ2VzID0ge307CisgICAgICAgIGlmIChtRmRwLkNvbnN1bWVCb29sKCkpIHsKKyAgICAgICAgICAgIGltYWdlc1ttU3VwZXJQYXJ0aXRpb25OYW1lXSA9IG1GZHAuUGlja1ZhbHVlSW5BcnJheShtSW1hZ2VQYXRocyk7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAobUZkcC5yZW1haW5pbmdfYnl0ZXMoKSkgeworICAgICAgICAgICAgYXV0byBpbnZva2VBUElzID0gbUZkcC5QaWNrVmFsdWVJbkFycmF5PGNvbnN0IGZ1bmN0aW9uPHZvaWQoKT4+KHsKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeyBXcml0ZVRvSW1hZ2VGaWxlKGZkLCBtZXRhZGF0YVZhbHVlKTsgfSwKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeyBXcml0ZVRvSW1hZ2VGaWxlKGtJbWFnZUZpbGUuY19zdHIoKSwgbWV0YWRhdGFWYWx1ZSk7IH0sCisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsgRmxhc2hQYXJ0aXRpb25UYWJsZShvcGVuZXIsIGtTdXBlck5hbWUsIG1ldGFkYXRhVmFsdWUpOyB9LAorICAgICAgICAgICAgICAgICAgICBbJl0oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVQYXJ0aXRpb25UYWJsZShvcGVuZXIsIG1QYXJ0aXRpb25OYW1lLCBtZXRhZGF0YVZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZkcC5Db25zdW1lQm9vbCgpID8gMCA6IDEgLyogc2xvdF9udW1iZXIgKi8pOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICBbJl0oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBSZWFkTWV0YWRhdGEobVBhcnRpdGlvbk5hbWUsIG1GZHAuQ29uc3VtZUJvb2woKSA/IDAgOiAxIC8qIHNsb3RfbnVtYmVyICovKTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeyBGbGFzaFBhcnRpdGlvblRhYmxlKG1QYXJ0aXRpb25OYW1lLCBtZXRhZGF0YVZhbHVlKTsgfSwKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlUGFydGl0aW9uVGFibGUobVBhcnRpdGlvbk5hbWUsIG1ldGFkYXRhVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmRwLkNvbnN1bWVCb29sKCkgPyAwIDogMSAvKiBzbG90X251bWJlciAqLyk7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlVG9JbWFnZUZpbGUoa0ltYWdlRmlsZS5jX3N0cigpLCBtZXRhZGF0YVZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS0+Z2VvbWV0cnkubG9naWNhbF9ibG9ja19zaXplLCBpbWFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GZHAuQ29uc3VtZUJvb2woKSA/IHRydWUgOiBmYWxzZSAvKiBzcGFyc2lmeSAqLyk7CisgICAgICAgICAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVTcGxpdEltYWdlRmlsZXMoa0ltYWdlRmlsZS5jX3N0cigpLCBtZXRhZGF0YVZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEtPmdlb21ldHJ5LmxvZ2ljYWxfYmxvY2tfc2l6ZSwgaW1hZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZkcC5Db25zdW1lQm9vbCgpID8gdHJ1ZSA6IGZhbHNlIC8qIHNwYXJzaWZ5ICovKTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeyBSZWFkRnJvbUltYWdlRmlsZShrSW1hZ2VGaWxlLmNfc3RyKCkpOyB9LAorICAgICAgICAgICAgICAgICAgICBbJl0oKSB7IElzRW1wdHlTdXBlckltYWdlKGtJbWFnZUZpbGUuY19zdHIoKSk7IH0sCisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJ1ZmZlclNpemUgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDY0X3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICoga01ldGFkYXRhR2VvbWV0cnlTaXplLCBrTWF4QnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8dWludDhfdD4gYnVmZmVyID0gbUZkcC5Db25zdW1lQnl0ZXM8dWludDhfdD4oa01heEJ5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5yZXNpemUoYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBSZWFkRnJvbUltYWdlQmxvYihidWZmZXIuZGF0YSgpLCBidWZmZXIuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ3JvdXBWZWN0b3JTaXplID0gbWV0YWRhdGEtPmdyb3Vwcy5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByYW5kb21Hcm91cEluZGV4ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQzMl90PigwLCBncm91cFZlY3RvclNpemUgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldFBhcnRpdGlvbkdyb3VwTmFtZShtZXRhZGF0YS0+Z3JvdXBzW3JhbmRvbUdyb3VwSW5kZXhdKTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYmxvY2tEZXZpY2VWZWN0b3JTaXplID0gbWV0YWRhdGEtPmJsb2NrX2RldmljZXMuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmFuZG9tQmxvY2tEZXZpY2VJbmRleCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50MzJfdD4oMCwgYmxvY2tEZXZpY2VWZWN0b3JTaXplIC0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBHZXRCbG9ja0RldmljZVBhcnRpdGlvbk5hbWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLT5ibG9ja19kZXZpY2VzW3JhbmRvbUJsb2NrRGV2aWNlSW5kZXhdKTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeyBHZXRNZXRhZGF0YVN1cGVyQmxvY2tEZXZpY2UobWV0YWRhdGFWYWx1ZSk7IH0sCisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdWZmaXggPSBtRmRwLkNvbnN1bWVCb29sKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbUZkcC5QaWNrVmFsdWVJbkFycmF5PHN0cmluZz4oa1N1ZmZpeCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbUZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtNYXhCeXRlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBTbG90TnVtYmVyRm9yU2xvdFN1ZmZpeChzdWZmaXgpOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICBbJl0oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGVudHJ5ID0gRmluZFBhcnRpdGlvbihtZXRhZGF0YVZhbHVlLCBrU3lzdGVtUGFydGl0aW9uTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBHZXRQYXJ0aXRpb25TaXplKG1ldGFkYXRhVmFsdWUsICplbnRyeSk7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsgR2V0UGFydGl0aW9uU2xvdFN1ZmZpeChtUGFydGl0aW9uTmFtZSk7IH0sCisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsgRmluZFBhcnRpdGlvbihtZXRhZGF0YVZhbHVlLCBtUGFydGl0aW9uTmFtZSk7IH0sCisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhcnRpdGlvblZlY3RvclNpemUgPSBtZXRhZGF0YS0+cGFydGl0aW9ucy5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByYW5kb21QYXJ0aXRpb25JbmRleCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50MzJfdD4oMCwgcGFydGl0aW9uVmVjdG9yU2l6ZSAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgR2V0UGFydGl0aW9uTmFtZShtZXRhZGF0YS0+cGFydGl0aW9uc1tyYW5kb21QYXJ0aXRpb25JbmRleF0pOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICBbJl0oKSB7IEdldFRvdGFsU3VwZXJQYXJ0aXRpb25TaXplKG1ldGFkYXRhVmFsdWUpOyB9LAorICAgICAgICAgICAgICAgICAgICBbJl0oKSB7IEdldEJsb2NrRGV2aWNlUGFydGl0aW9uTmFtZXMobWV0YWRhdGFWYWx1ZSk7IH0sCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGludm9rZUFQSXMoKTsKKyAgICAgICAgfQorICAgICAgICByZW1vdmUoa0ltYWdlRmlsZS5jX3N0cigpKTsKKyAgICB9Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBMaXBscEFwaXNGdXp6ZXIgbGlwbHBBcGlzRnV6emVyKGRhdGEsIHNpemUpOworICAgIGxpcGxwQXBpc0Z1enplci5wcm9jZXNzKCk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mc19tZ3IvbGlibHAvZnV6emVyL2xpYmxwX2J1aWxkZXJfZnV6emVyLmNwcCBiL2ZzX21nci9saWJscC9mdXp6ZXIvbGlibHBfYnVpbGRlcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MmM5ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGlibHAvZnV6emVyL2xpYmxwX2J1aWxkZXJfZnV6emVyLmNwcApAQCAtMCwwICsxLDQ0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKKyNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGlibHAvYnVpbGRlci5oPgorI2luY2x1ZGUgPGxpYmxwL3Byb3BlcnR5X2ZldGNoZXIuaD4KKyNpbmNsdWRlIDxzdG9yYWdlX2xpdGVyYWxzL3N0b3JhZ2VfbGl0ZXJhbHMuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmZzX21ncjsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6c3RvcmFnZV9saXRlcmFsczsKKworc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrVmFsaWRCbG9ja1NpemUgPSA0MDk2ICogNTA7CitzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtCbG9ja0RldmljZUluZm9TaXplID0gMTAyNCAqIDEwMjQ7CitzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtWYWxpZEJsb2NrRGV2aWNlSW5mb1NpemUgPSA4X0dpQjsKK3N0YXRpYyBjb25zdGV4cHIgdWludDY0X3Qga1ZhbGlkTWF4R3JvdXBTaXplID0gNDA5NjA7CitzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtNaW5CbG9ja0RldlZhbHVlID0gMTsKK3N0YXRpYyBjb25zdGV4cHIgdWludDY0X3Qga01heEJsb2NrRGV2VmFsdWUgPSAxMDAwMDA7CitzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtNaW5TZWN0b3JWYWx1ZSA9IDE7CitzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtNYXhTZWN0b3JWYWx1ZSA9IDEwMDAwMDA7CitzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtNaW5WYWx1ZSA9IDA7CitzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtNYXhWYWx1ZSA9IDEwMDAwOworc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrVmFsaWROdW1TZWN0b3JzID0gMTkwMTU2ODsKK3N0YXRpYyBjb25zdGV4cHIgdWludDY0X3Qga1ZhbGlkUGh5c2ljYWxTZWN0b3IgPSAzNjA4NTc2Oworc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrTWluRWxlbWVudHMgPSAwOworc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrTWF4RWxlbWVudHMgPSAxMDsKK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga1ZhbGlkQWxpZ25tZW50ID0gNzg2NDMyOworc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrVmFsaWRNZXRhZGF0YVNpemUgPSA0MDk2MDsKK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga1ZhbGlkQWxpZ25tZW50T2Zmc2V0ID0gMjI5Mzc2Oworc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrVmFsaWRMb2dpY2FsQmxvY2tTaXplID0gNDA5NjsKK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga1ZhbGlkTWF4TWV0YWRhdGFTaXplID0gNjU1MzY7CitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtNaW5NZXRhZGF0YVZhbHVlID0gMDsKK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga01heE1ldGFkYXRhVmFsdWUgPSAxMDAwMDsKK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga1plcm9BbGlnbm1lbnQgPSAwOworc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrWmVyb0FsaWdubWVudE9mZnNldCA9IDA7CitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtNYXhCeXRlcyA9IDIwOworc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrTWluQnVpbGRlciA9IDA7CitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtNYXhCdWlsZGVyID0gNDsKKworY29uc3QgdWludDY0X3Qga0F0dHJpYnV0ZVR5cGVzW10gPSB7CisgICAgICAgIExQX1BBUlRJVElPTl9BVFRSX05PTkUsICAgIExQX1BBUlRJVElPTl9BVFRSX1JFQURPTkxZLCBMUF9QQVJUSVRJT05fQVRUUl9TTE9UX1NVRkZJWEVELAorICAgICAgICBMUF9QQVJUSVRJT05fQVRUUl9VUERBVEVELCBMUF9QQVJUSVRJT05fQVRUUl9ESVNBQkxFRCwKK307CisKK2NvbnN0IHN0cmluZyBrRnV6elBhcnRpdGlvbk5hbWUgPSAiZnV6el9wYXJ0aXRpb25fbmFtZSI7Citjb25zdCBzdHJpbmcga1N1cGVyUGFydGl0aW9uTmFtZSA9ICJzdXBlcl9wYXJ0aXRpb24iOworY29uc3Qgc3RyaW5nIGtEZXZpY2VJbmZvTmFtZSA9ICJzdXBlciI7Citjb25zdCBzdHJpbmcga0RlZmF1bHRHcm91cE5hbWUgPSAiZGVmYXVsdCI7CisKK2NsYXNzIEJ1aWxkZXJGdXp6ZXIgeworICBwdWJsaWM6CisgICAgQnVpbGRlckZ1enplcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgOiBtRmRwKGRhdGEsIHNpemUpe307CisgICAgdm9pZCBwcm9jZXNzKCk7CisKKyAgcHJpdmF0ZToKKyAgICBGdXp6ZWREYXRhUHJvdmlkZXIgbUZkcDsKKyAgICB2b2lkIGludm9rZUJ1aWxkZXJBUElzKCk7CisgICAgdm9pZCBzZWxlY3RSYW5kb21CdWlsZGVyKGludDMyX3QgcmFuZG9tQnVpbGRlciwgc3RyaW5nIHN1cGVyQmxvY2tEZXZpY2VOYW1lKTsKKyAgICB2b2lkIHNldHVwQnVpbGRlcihzdHJpbmcgc3VwZXJCbG9ja0RldmljZU5hbWUpOworICAgIHZvaWQgY2FsbENoYW5nZVBhcnRpdGlvbkdyb3VwKCk7CisgICAgdm9pZCBjYWxsVmVyaWZ5RXh0ZW50c0FnYWluc3RTb3VyY2VNZXRhZGF0YSgpOworICAgIHZlY3RvcjxCbG9ja0RldmljZUluZm8+IG1CbG9ja0RldmljZXM7CisgICAgdW5pcXVlX3B0cjxNZXRhZGF0YUJ1aWxkZXI+IG1CdWlsZGVyOworICAgIHN0cmluZyBtUmVzaXplUGFydGl0aW9uTmFtZTsKKyAgICBzdHJpbmcgbUdyb3VwTmFtZXNbNF0gPSB7CisgICAgICAgICAgICAiZGVmYXVsdCIsCisgICAgICAgICAgICAiZ3JvdXBfYSIsCisgICAgICAgICAgICAiZ3JvdXBfYiIsCisgICAgICAgICAgICBtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heEJ5dGVzKSwKKyAgICB9OworICAgIHN0cmluZyBtUGFydGl0aW9uTmFtZXNbNV0gPSB7CisgICAgICAgICAgICAic3lzdGVtX2EiLAorICAgICAgICAgICAgInZlbmRvcl9hIiwKKyAgICAgICAgICAgICJzeXN0ZW1fYiIsCisgICAgICAgICAgICAidmVuZG9yX2IiLAorICAgICAgICAgICAgbUZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtNYXhCeXRlcyksCisgICAgfTsKKyAgICBQYXJ0aXRpb24qIG1QYXJ0aXRpb247CisgICAgUGFydGl0aW9uKiBtRnV6elBhcnRpdGlvbjsKKyAgICBQYXJ0aXRpb24qIG1SZXNpemVQYXJ0aXRpb247CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgVCBnZXRQYXJhbVZhbHVlKFQgdmFsaWRWYWx1ZSkgeworICAgICAgICBUIHBhcmFtZXRlciA9IHZhbGlkVmFsdWU7CisgICAgICAgIGlmIChtRmRwLkNvbnN1bWVCb29sKCkpIHsKKyAgICAgICAgICAgIHBhcmFtZXRlciA9IG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTxUPihrTWluVmFsdWUsIGtNYXhWYWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhcmFtZXRlcjsKKyAgICB9Cit9OworCit2b2lkIEJ1aWxkZXJGdXp6ZXI6OnNlbGVjdFJhbmRvbUJ1aWxkZXIoaW50MzJfdCByYW5kb21CdWlsZGVyLCBzdHJpbmcgc3VwZXJCbG9ja0RldmljZU5hbWUpIHsKKyAgICBzd2l0Y2ggKHJhbmRvbUJ1aWxkZXIpIHsKKyAgICAgICAgY2FzZSAwOiB7CisgICAgICAgICAgICB1aW50MzJfdCBtYXhNZXRhZGF0YVNpemUgPSBnZXRQYXJhbVZhbHVlKGtWYWxpZE1heE1ldGFkYXRhU2l6ZSk7CisgICAgICAgICAgICB1aW50MzJfdCBudW1TbG90cyA9IG1GZHAuQ29uc3VtZUJvb2woKSA/IDAgOiAxOworICAgICAgICAgICAgbUJ1aWxkZXIgPSBNZXRhZGF0YUJ1aWxkZXI6Ok5ldyhtQmxvY2tEZXZpY2VzLCBzdXBlckJsb2NrRGV2aWNlTmFtZSwgbWF4TWV0YWRhdGFTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1TbG90cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIDE6IHsKKyAgICAgICAgICAgIHVpbnQ2NF90IGJsb2NrRGV2U2l6ZSA9CisgICAgICAgICAgICAgICAgICAgIG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50NjRfdD4oa01pbkJsb2NrRGV2VmFsdWUsIGtNYXhCbG9ja0RldlZhbHVlKTsKKyAgICAgICAgICAgIHVpbnQzMl90IG1ldGFkYXRhTWF4U2l6ZSA9CisgICAgICAgICAgICAgICAgICAgIG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50MzJfdD4oa01pbk1ldGFkYXRhVmFsdWUsIGtNYXhNZXRhZGF0YVZhbHVlKTsKKyAgICAgICAgICAgIHVpbnQzMl90IG1ldGFkYXRhU2xvdENvdW50ID0gbUZkcC5Db25zdW1lQm9vbCgpID8gMCA6IDE7CisgICAgICAgICAgICBtQnVpbGRlciA9IE1ldGFkYXRhQnVpbGRlcjo6TmV3KGJsb2NrRGV2U2l6ZSwgbWV0YWRhdGFNYXhTaXplLCBtZXRhZGF0YVNsb3RDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIDI6IHsKKyAgICAgICAgICAgIHVpbnQ2NF90IGJsb2NrRGV2U2l6ZSA9IGdldFBhcmFtVmFsdWUoa1ZhbGlkQmxvY2tTaXplKTsKKyAgICAgICAgICAgIHVpbnQzMl90IG1ldGFkYXRhU2l6ZSA9IGdldFBhcmFtVmFsdWUoa1ZhbGlkTWV0YWRhdGFTaXplKTsKKyAgICAgICAgICAgIHVpbnQzMl90IG1ldGFkYXRhU2xvdENvdW50ID0gbUZkcC5Db25zdW1lQm9vbCgpID8gMCA6IDE7CisgICAgICAgICAgICBtQnVpbGRlciA9IE1ldGFkYXRhQnVpbGRlcjo6TmV3KGJsb2NrRGV2U2l6ZSwgbWV0YWRhdGFTaXplLCBtZXRhZGF0YVNsb3RDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIDM6IHsKKyAgICAgICAgICAgIHN0cmluZyBzdXBlclBhcnRpdGlvbk5hbWUgPSBtRmRwLkNvbnN1bWVCb29sKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ga1N1cGVyUGFydGl0aW9uTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heEJ5dGVzKTsKKyAgICAgICAgICAgIG1CdWlsZGVyID0gTWV0YWRhdGFCdWlsZGVyOjpOZXcoUGFydGl0aW9uT3BlbmVyKCksIHN1cGVyUGFydGl0aW9uTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlKDAsIDEpIC8qIHNsb3RfbnVtYmVyICovKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgNDogeworICAgICAgICAgICAgc3RyaW5nIHN1cGVyUGFydGl0aW9uTmFtZSA9IG1GZHAuQ29uc3VtZUJvb2woKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBrU3VwZXJQYXJ0aXRpb25OYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1GZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrTWF4Qnl0ZXMpOworICAgICAgICAgICAgbUJ1aWxkZXIgPSBNZXRhZGF0YUJ1aWxkZXI6Ok5ldygKKyAgICAgICAgICAgICAgICAgICAgc3VwZXJQYXJ0aXRpb25OYW1lLAorICAgICAgICAgICAgICAgICAgICBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDMyX3Q+KDAsIDEpIC8qIHNsb3RfbnVtYmVyICovKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEJ1aWxkZXJGdXp6ZXI6OnNldHVwQnVpbGRlcihzdHJpbmcgc3VwZXJCbG9ja0RldmljZU5hbWUpIHsKKyAgICB1aW50NjRfdCBibG9ja0RldmljZUluZm9TaXplID0KKyAgICAgICAgICAgIG1GZHAuQ29uc3VtZUJvb2woKQorICAgICAgICAgICAgICAgICAgICA/IG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50NjRfdD4oa01pbkJsb2NrRGV2VmFsdWUsIGtNYXhCbG9ja0RldlZhbHVlKQorICAgICAgICAgICAgICAgICAgICA6IGtWYWxpZEJsb2NrRGV2aWNlSW5mb1NpemU7CisgICAgdWludDMyX3QgYWxpZ25tZW50ID0gbUZkcC5Db25zdW1lQm9vbCgpID8gbUZkcC5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCkgOiBrVmFsaWRBbGlnbm1lbnQ7CisgICAgdWludDMyX3QgYWxpZ25tZW50T2Zmc2V0ID0KKyAgICAgICAgICAgIG1GZHAuQ29uc3VtZUJvb2woKSA/IG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQzMl90PigpIDoga1ZhbGlkQWxpZ25tZW50T2Zmc2V0OworICAgIHVpbnQzMl90IGxvZ2ljYWxCbG9ja1NpemUgPSBtRmRwLkNvbnN1bWVCb29sKCkgPyBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDMyX3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtNaW5CbG9ja0RldlZhbHVlLCBrTWF4QmxvY2tEZXZWYWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoga1ZhbGlkTG9naWNhbEJsb2NrU2l6ZTsKKworICAgIEJsb2NrRGV2aWNlSW5mbyBzdXBlcihzdXBlckJsb2NrRGV2aWNlTmFtZSwgYmxvY2tEZXZpY2VJbmZvU2l6ZSwgYWxpZ25tZW50LCBhbGlnbm1lbnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2ljYWxCbG9ja1NpemUpOworICAgIG1CbG9ja0RldmljZXMucHVzaF9iYWNrKHN1cGVyKTsKKworICAgIG1CdWlsZGVyLT5BZGRHcm91cChrRGVmYXVsdEdyb3VwTmFtZSwgbUZkcC5Db25zdW1lSW50ZWdyYWw8dWludDY0X3Q+KCkgLyogbWF4X3NpemUgKi8pOworICAgIG1QYXJ0aXRpb24gPSBtQnVpbGRlci0+QWRkUGFydGl0aW9uKGtTdXBlclBhcnRpdGlvbk5hbWUsIExQX1BBUlRJVElPTl9BVFRSX1JFQURPTkxZKTsKKworICAgIG1GdXp6UGFydGl0aW9uID0gbUJ1aWxkZXItPkFkZFBhcnRpdGlvbihrRnV6elBhcnRpdGlvbk5hbWUsIGtEZWZhdWx0R3JvdXBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUF9QQVJUSVRJT05fQVRUUl9SRUFET05MWSk7CisKKyAgICBzdHJpbmcgbVJlc2l6ZVBhcnRpdGlvbk5hbWUgPSBtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heEJ5dGVzKTsKKyAgICBpZiAoIW1SZXNpemVQYXJ0aXRpb25OYW1lLnNpemUoKSkgeworICAgICAgICBtUmVzaXplUGFydGl0aW9uTmFtZSA9ICJyZXNpemVfcGFydGl0aW9uIjsKKyAgICB9CisgICAgbVJlc2l6ZVBhcnRpdGlvbiA9IG1CdWlsZGVyLT5BZGRQYXJ0aXRpb24obVJlc2l6ZVBhcnRpdGlvbk5hbWUsIGtEZWZhdWx0R3JvdXBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQX1BBUlRJVElPTl9BVFRSX1JFQURPTkxZKTsKKworICAgIHN0cmluZyBjaGFuZ2VQYXJ0aXRpb25EZXZpY2VJbmZvTmFtZSA9CisgICAgICAgICAgICBtRmRwLkNvbnN1bWVCb29sKCkgPyBrRGV2aWNlSW5mb05hbWUgOiBtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heEJ5dGVzKTsKKyAgICBCbG9ja0RldmljZUluZm8gY2hhbmdlUGFydGl0aW9uRGV2aWNlSW5mbygKKyAgICAgICAgICAgIGNoYW5nZVBhcnRpdGlvbkRldmljZUluZm9OYW1lLAorICAgICAgICAgICAgbUZkcC5Db25zdW1lQm9vbCgpCisgICAgICAgICAgICAgICAgICAgID8gbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQ2NF90PihrTWluQmxvY2tEZXZWYWx1ZSwga01heEJsb2NrRGV2VmFsdWUpCisgICAgICAgICAgICAgICAgICAgIDoga0Jsb2NrRGV2aWNlSW5mb1NpemUgLyogc2l6ZSAqLywKKyAgICAgICAgICAgIG1GZHAuQ29uc3VtZUJvb2woKSA/IG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQzMl90PigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBrWmVyb0FsaWdubWVudE9mZnNldCAvKiBhbGlnbm1lbnQgKi8sCisgICAgICAgICAgICBtRmRwLkNvbnN1bWVCb29sKCkgPyBtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoga1plcm9BbGlnbm1lbnRPZmZzZXQgLyogYWxpZ25tZW50X29mZnNldCAqLywKKyAgICAgICAgICAgIG1GZHAuQ29uc3VtZUJvb2woKQorICAgICAgICAgICAgICAgICAgICA/IG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50MzJfdD4oa01pbkJsb2NrRGV2VmFsdWUsIGtNYXhCbG9ja0RldlZhbHVlKQorICAgICAgICAgICAgICAgICAgICA6IGtWYWxpZExvZ2ljYWxCbG9ja1NpemUpOworICAgIG1CbG9ja0RldmljZXMucHVzaF9iYWNrKGNoYW5nZVBhcnRpdGlvbkRldmljZUluZm8pOworfQorCit2b2lkIEJ1aWxkZXJGdXp6ZXI6OmNhbGxDaGFuZ2VQYXJ0aXRpb25Hcm91cCgpIHsKKyAgICBzdHJpbmcgZ3JvdXAxID0gbUZkcC5Db25zdW1lQm9vbCgpID8gbUZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtNYXhCeXRlcykgOiAiZ3JvdXAxIjsKKyAgICB1aW50NjRfdCBncm91cDFTaXplID0gZ2V0UGFyYW1WYWx1ZSgwKTsKKworICAgIHN0cmluZyBncm91cDIgPSBtRmRwLkNvbnN1bWVCb29sKCkgPyBtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heEJ5dGVzKSA6ICJncm91cDIiOworICAgIHVpbnQ2NF90IGdyb3VwMlNpemUgPSBnZXRQYXJhbVZhbHVlKDApOworCisgICAgYm9vbCBncm91cDFBZGRlZCA9IG1CdWlsZGVyLT5BZGRHcm91cChncm91cDEsIGdyb3VwMVNpemUpOworICAgIGJvb2wgZ3JvdXAyQWRkZWQgPSBtQnVpbGRlci0+QWRkR3JvdXAoZ3JvdXAyLCBncm91cDJTaXplKTsKKworICAgIHN0cmluZyBjaGFuZ2VHcm91cFBhcnRpdGlvbk5hbWUgPSBtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heEJ5dGVzKTsKKyAgICBpZiAoY2hhbmdlR3JvdXBQYXJ0aXRpb25OYW1lLnNpemUoKSAmJiBncm91cDFBZGRlZCAmJiBncm91cDJBZGRlZCkgeworICAgICAgICBQYXJ0aXRpb24qIGNoYW5nZUdyb3VwUGFydGl0aW9uID0gbUJ1aWxkZXItPkFkZFBhcnRpdGlvbihjaGFuZ2VHcm91cFBhcnRpdGlvbk5hbWUsIGdyb3VwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBfUEFSVElUSU9OX0FUVFJfUkVBRE9OTFkpOworICAgICAgICBpZiAoY2hhbmdlR3JvdXBQYXJ0aXRpb24pIHsKKyAgICAgICAgICAgIG1CdWlsZGVyLT5DaGFuZ2VQYXJ0aXRpb25Hcm91cChjaGFuZ2VHcm91cFBhcnRpdGlvbiwgZ3JvdXAyKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBCdWlsZGVyRnV6emVyOjpjYWxsVmVyaWZ5RXh0ZW50c0FnYWluc3RTb3VyY2VNZXRhZGF0YSgpIHsKKyAgICB1aW50NjRfdCBzb3VyY2VCbG9ja0RldlNpemUgPSBnZXRQYXJhbVZhbHVlKGtWYWxpZEJsb2NrU2l6ZSk7CisgICAgdWludDMyX3Qgc291cmNlTWV0YWRhdGFNYXhTaXplID0gZ2V0UGFyYW1WYWx1ZShrVmFsaWRNZXRhZGF0YVNpemUpOworICAgIHVpbnQzMl90IHNvdXJjZVNsb3RDb3VudCA9IG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50MzJfdD4oMCwgMSk7CisgICAgYXV0byBzb3VyY2VCdWlsZGVyID0KKyAgICAgICAgICAgIE1ldGFkYXRhQnVpbGRlcjo6TmV3KHNvdXJjZUJsb2NrRGV2U2l6ZSwgc291cmNlTWV0YWRhdGFNYXhTaXplLCBzb3VyY2VTbG90Q291bnQpOworCisgICAgdWludDY0X3QgdGFyZ2V0QmxvY2tEZXZTaXplID0gZ2V0UGFyYW1WYWx1ZShrVmFsaWRCbG9ja1NpemUpOworICAgIHVpbnQzMl90IHRhcmdldE1ldGFkYXRhTWF4U2l6ZSA9IGdldFBhcmFtVmFsdWUoa1ZhbGlkTWV0YWRhdGFTaXplKTsKKyAgICB1aW50MzJfdCB0YXJnZXRTbG90Q291bnQgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDMyX3Q+KDAsIDEpOworICAgIGF1dG8gdGFyZ2V0QnVpbGRlciA9CisgICAgICAgICAgICBNZXRhZGF0YUJ1aWxkZXI6Ok5ldyh0YXJnZXRCbG9ja0RldlNpemUsIHRhcmdldE1ldGFkYXRhTWF4U2l6ZSwgdGFyZ2V0U2xvdENvdW50KTsKKworICAgIGlmIChzb3VyY2VCdWlsZGVyICYmIHRhcmdldEJ1aWxkZXIpIHsKKyAgICAgICAgaW50NjRfdCBzb3VyY2VHcm91cHMgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50NjRfdD4oa01pbkVsZW1lbnRzLCBrTWF4RWxlbWVudHMpOworICAgICAgICBmb3IgKGludDY0X3QgaWR4ID0gMDsgaWR4IDwgc291cmNlR3JvdXBzOyArK2lkeCkgeworICAgICAgICAgICAgc291cmNlQnVpbGRlci0+QWRkR3JvdXAoCisgICAgICAgICAgICAgICAgICAgIG1GZHAuUGlja1ZhbHVlSW5BcnJheShtR3JvdXBOYW1lcyksCisgICAgICAgICAgICAgICAgICAgIG1GZHAuQ29uc3VtZUJvb2woKSA/IGtWYWxpZE1heEdyb3VwU2l6ZSA6IG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQ2NF90PigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGludDY0X3Qgc291cmNlUGFydGl0aW9ucyA9IG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQ2NF90PihrTWluRWxlbWVudHMsIGtNYXhFbGVtZW50cyk7CisgICAgICAgIGZvciAoaW50NjRfdCBpZHggPSAwOyBpZHggPCBzb3VyY2VQYXJ0aXRpb25zOyArK2lkeCkgeworICAgICAgICAgICAgc291cmNlQnVpbGRlci0+QWRkUGFydGl0aW9uKG1GZHAuUGlja1ZhbHVlSW5BcnJheShtUGFydGl0aW9uTmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQX1BBUlRJVElPTl9BVFRSX1JFQURPTkxZKTsKKyAgICAgICAgfQorCisgICAgICAgIGludDY0X3QgdGFyZ2V0R3JvdXBzID0gbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludDY0X3Q+KGtNaW5FbGVtZW50cywga01heEVsZW1lbnRzKTsKKyAgICAgICAgZm9yIChpbnQ2NF90IGlkeCA9IDA7IGlkeCA8IHRhcmdldEdyb3VwczsgKytpZHgpIHsKKyAgICAgICAgICAgIHRhcmdldEJ1aWxkZXItPkFkZEdyb3VwKAorICAgICAgICAgICAgICAgICAgICBtRmRwLlBpY2tWYWx1ZUluQXJyYXkobUdyb3VwTmFtZXMpLAorICAgICAgICAgICAgICAgICAgICBtRmRwLkNvbnN1bWVCb29sKCkgPyBrVmFsaWRNYXhHcm91cFNpemUgOiBtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50NjRfdD4oKSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQ2NF90IHRhcmdldFBhcnRpdGlvbnMgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50NjRfdD4oa01pbkVsZW1lbnRzLCBrTWF4RWxlbWVudHMpOworICAgICAgICBmb3IgKGludDY0X3QgaWR4ID0gMDsgaWR4IDwgdGFyZ2V0UGFydGl0aW9uczsgKytpZHgpIHsKKyAgICAgICAgICAgIHRhcmdldEJ1aWxkZXItPkFkZFBhcnRpdGlvbihtRmRwLlBpY2tWYWx1ZUluQXJyYXkobVBhcnRpdGlvbk5hbWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUF9QQVJUSVRJT05fQVRUUl9SRUFET05MWSk7CisgICAgICAgIH0KKworICAgICAgICBNZXRhZGF0YUJ1aWxkZXI6OlZlcmlmeUV4dGVudHNBZ2FpbnN0U291cmNlTWV0YWRhdGEoCisgICAgICAgICAgICAgICAgKnNvdXJjZUJ1aWxkZXIsIG1GZHAuQ29uc3VtZUJvb2woKSA/IDAgOiAxIC8qIHNvdXJjZV9zbG90X251bWJlciAqLywgKnRhcmdldEJ1aWxkZXIsCisgICAgICAgICAgICAgICAgbUZkcC5Db25zdW1lQm9vbCgpID8gMCA6IDEgLyogdGFyZ2V0X3Nsb3RfbnVtYmVyICovLAorICAgICAgICAgICAgICAgIHZlY3RvcjxzdHJpbmc+eyJzeXN0ZW0iLCAidmVuZG9yIiwgbUZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtNYXhCeXRlcyl9KTsKKyAgICB9Cit9CisKK3ZvaWQgQnVpbGRlckZ1enplcjo6aW52b2tlQnVpbGRlckFQSXMoKSB7CisgICAgc3RyaW5nIHN1cGVyQmxvY2tEZXZpY2VOYW1lID0KKyAgICAgICAgICAgIG1GZHAuQ29uc3VtZUJvb2woKSA/IG1GZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrTWF4Qnl0ZXMpIDoga0RldmljZUluZm9OYW1lOworICAgIHVpbnQzMl90IHJhbmRvbUJ1aWxkZXIgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDMyX3Q+KGtNaW5CdWlsZGVyLCBrTWF4QnVpbGRlcik7CisgICAgc2VsZWN0UmFuZG9tQnVpbGRlcihyYW5kb21CdWlsZGVyLCBzdXBlckJsb2NrRGV2aWNlTmFtZSk7CisKKyAgICBpZiAobUJ1aWxkZXIuZ2V0KCkpIHsKKyAgICAgICAgc2V0dXBCdWlsZGVyKHN1cGVyQmxvY2tEZXZpY2VOYW1lKTsKKworICAgICAgICB3aGlsZSAobUZkcC5yZW1haW5pbmdfYnl0ZXMoKSkgeworICAgICAgICAgICAgYXV0byBpbnZva2VBUElzID0gbUZkcC5QaWNrVmFsdWVJbkFycmF5PGNvbnN0IGZ1bmN0aW9uPHZvaWQoKT4+KHsKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeyBjYWxsQ2hhbmdlUGFydGl0aW9uR3JvdXAoKTsgfSwKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGFkZGVkR3JvdXBOYW1lID0gbUZkcC5QaWNrVmFsdWVJbkFycmF5KG1Hcm91cE5hbWVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLT5BZGRHcm91cChhZGRlZEdyb3VwTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDY0X3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga01pblZhbHVlLCBrTWF4VmFsdWUpIC8qIG1heF9zaXplICovKTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHBhcnRpdGlvbk5hbWUgPSBtRmRwLlBpY2tWYWx1ZUluQXJyYXkobVBhcnRpdGlvbk5hbWVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRpdGlvbiogYWRkZWRQYXJ0aXRpb24gPSBtQnVpbGRlci0+QWRkUGFydGl0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25OYW1lLCBtRmRwLlBpY2tWYWx1ZUluQXJyYXkoa0F0dHJpYnV0ZVR5cGVzKSk7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbnVtU2VjdG9ycyA9IG1GZHAuQ29uc3VtZUJvb2woKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50NjRfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTWluU2VjdG9yVmFsdWUsIGtNYXhTZWN0b3JWYWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBrVmFsaWROdW1TZWN0b3JzOworICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwaHlzaWNhbFNlY3RvciA9IG1GZHAuQ29uc3VtZUJvb2woKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDY0X3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtNaW5TZWN0b3JWYWx1ZSwga01heFNlY3RvclZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBrVmFsaWRQaHlzaWNhbFNlY3RvcjsKKworICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBudW1FeHRlbnRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludDY0X3Q+KGtNaW5FbGVtZW50cywga01heEVsZW1lbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRnV6elBhcnRpdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXh0ZW50QWRkZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludDY0X3QgaSA9IDA7IGkgPD0gbnVtRXh0ZW50czsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVudEFkZGVkID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci0+QWRkTGluZWFyRXh0ZW50KG1GdXp6UGFydGl0aW9uLCBrRGV2aWNlSW5mb05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1TZWN0b3JzLCBwaHlzaWNhbFNlY3Rvcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dGVudEFkZGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZV9wdHI8THBNZXRhZGF0YT4gbWV0YWRhdGEgPSBtQnVpbGRlci0+RXhwb3J0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGFsaWduZWRTaXplID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDY0X3Q+KGtNaW5WYWx1ZSwga01heFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZ1enpQYXJ0aXRpb24tPkdldEJlZ2lubmluZ0V4dGVudHMoTFBfU0VDVE9SX1NJWkUgKiBudW1FeHRlbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsgY2FsbFZlcmlmeUV4dGVudHNBZ2FpbnN0U291cmNlTWV0YWRhdGEoKTsgfSwKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeyBtQnVpbGRlci0+TGlzdFBhcnRpdGlvbnNJbkdyb3VwKG1GZHAuUGlja1ZhbHVlSW5BcnJheShtR3JvdXBOYW1lcykpOyB9LAorICAgICAgICAgICAgICAgICAgICBbJl0oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG1heFNpemUgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50NjRfdD4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLT5DaGFuZ2VHcm91cFNpemUobUZkcC5QaWNrVmFsdWVJbkFycmF5KG1Hcm91cE5hbWVzKSwgbWF4U2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBkZXZpY2VJbmZvTmFtZSA9IG1GZHAuQ29uc3VtZUJvb2woKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGtEZXZpY2VJbmZvTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1GZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrTWF4Qnl0ZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXItPkdldEJsb2NrRGV2aWNlSW5mbyhkZXZpY2VJbmZvTmFtZSwgJm1CbG9ja0RldmljZXNbMV0pOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICBbJl0oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZGV2aWNlSW5mb05hbWUgPSBtRmRwLkNvbnN1bWVCb29sKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBrRGV2aWNlSW5mb05hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heEJ5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CdWlsZGVyLT5VcGRhdGVCbG9ja0RldmljZUluZm8oZGV2aWNlSW5mb05hbWUsIG1CbG9ja0RldmljZXNbMV0pOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICBbJl0oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVfcHRyPExwTWV0YWRhdGE+IG1ldGFkYXRhID0gbUJ1aWxkZXItPkV4cG9ydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbUJ1aWxkZXItPkltcG9ydFBhcnRpdGlvbnMoKm1ldGFkYXRhLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge21GZHAuUGlja1ZhbHVlSW5BcnJheShtUGFydGl0aW9uTmFtZXMpfSk7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsgbUJ1aWxkZXItPkhhc0Jsb2NrRGV2aWNlKG1GZHAuUGlja1ZhbHVlSW5BcnJheShtUGFydGl0aW9uTmFtZXMpKTsgfSwKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeyBtQnVpbGRlci0+U2V0VmlydHVhbEFCRGV2aWNlRmxhZygpOyB9LAorICAgICAgICAgICAgICAgICAgICBbJl0oKSB7IG1CdWlsZGVyLT5TZXRBdXRvU2xvdFN1ZmZpeGluZygpOyB9LAorICAgICAgICAgICAgICAgICAgICBbJl0oKSB7IG1CdWlsZGVyLT5MaXN0R3JvdXBzKCk7IH0sCisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsgbUJ1aWxkZXItPlVzZWRTcGFjZSgpOyB9LAorICAgICAgICAgICAgICAgICAgICBbJl0oKSB7IG1CdWlsZGVyLT5SZXF1aXJlRXhwYW5kZWRNZXRhZGF0YUhlYWRlcigpOyB9LAorICAgICAgICAgICAgICAgICAgICBbJl0oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCByZXNpemVkUGFydGl0aW9uU2l6ZSA9IGdldFBhcmFtVmFsdWUoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQnVpbGRlci0+UmVzaXplUGFydGl0aW9uKG1SZXNpemVQYXJ0aXRpb24sIHJlc2l6ZWRQYXJ0aXRpb25TaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc291cmNlU2xvdCA9IG1GZHAuQ29uc3VtZUJvb2woKSA/IDAgOiAxOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdGFyZ2V0U2xvdCA9IG1GZHAuQ29uc3VtZUJvb2woKSA/IDAgOiAxOworICAgICAgICAgICAgICAgICAgICAgICAgUGFydGl0aW9uT3BlbmVyIHBhcnRpdGlvbk9wZW5lcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzb3VyY2VQYXJ0aXRpb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmRwLkNvbnN1bWVCb29sKCkgPyBrRnV6elBhcnRpdGlvbk5hbWUgOiBrRGV2aWNlSW5mb05hbWU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhQnVpbGRlcjo6TmV3Rm9yVXBkYXRlKHBhcnRpdGlvbk9wZW5lciwgc291cmNlUGFydGl0aW9uLCBzb3VyY2VTbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0U2xvdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25PcGVuZXIuR2V0RGV2aWNlU3RyaW5nKG1GZHAuUGlja1ZhbHVlSW5BcnJheShtUGFydGl0aW9uTmFtZXMpKTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlX3B0cjxMcE1ldGFkYXRhPiBtZXRhZGF0YSA9IG1CdWlsZGVyLT5FeHBvcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhQnVpbGRlcjo6TmV3KCptZXRhZGF0YS5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsgbUJ1aWxkZXItPkFsbG9jYXRhYmxlU3BhY2UoKTsgfSwKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgUGFydGl0aW9uT3BlbmVyIHBPcGVuZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3VwZXJQYXJ0aXRpb25OYW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZkcC5Db25zdW1lQm9vbCgpID8ga1N1cGVyUGFydGl0aW9uTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heEJ5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBPcGVuZXIuT3BlbihzdXBlclBhcnRpdGlvbk5hbWUsIE9fUkRPTkxZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBPcGVuZXIuR2V0SW5mbyhzdXBlclBhcnRpdGlvbk5hbWUsICZtQmxvY2tEZXZpY2VzWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgUGFydGl0aW9uT3BlbmVyIHBPcGVuZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3VwZXJQYXJ0aXRpb25OYW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZkcC5Db25zdW1lQm9vbCgpID8ga1N1cGVyUGFydGl0aW9uTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heEJ5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBPcGVuZXIuT3BlbihzdXBlclBhcnRpdGlvbk5hbWUsIE9fUkRPTkxZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBPcGVuZXIuR2V0RGV2aWNlU3RyaW5nKHN1cGVyUGFydGl0aW9uTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEludGVydmFsOjpJbnRlcnNlY3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVydmFsKG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQ2NF90PigpIC8qIGRldmljZSBfaW5kZXggKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQ2NF90PigpIC8qIHN0YXJ0ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50NjRfdD4oKSkgLyogZW5kICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcnZhbChtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50NjRfdD4oKSAvKiBkZXZpY2UgX2luZGV4ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50NjRfdD4oKSAvKiBzdGFydCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZkcC5Db25zdW1lSW50ZWdyYWw8dWludDY0X3Q+KCkgLyogZW5kICovKSk7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxJbnRlcnZhbD4gaW50ZXJ2YWxWZWN0b3JBOworICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBpbnRlcm5hbFZlY3RvckFFbGVtZW50cyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQ2NF90PihrTWluRWxlbWVudHMsIGtNYXhFbGVtZW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludDY0X3QgaWR4ID0gMDsgaWR4IDwgaW50ZXJuYWxWZWN0b3JBRWxlbWVudHM7ICsraWR4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWxWZWN0b3JBLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVydmFsKG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQ2NF90PigpIC8qIGRldmljZSBfaW5kZXggKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50NjRfdD4oKSAvKiBzdGFydCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQ2NF90PigpIC8qIGVuZCAqLykpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8SW50ZXJ2YWw+IGludGVydmFsVmVjdG9yQjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgaW50ZXJuYWxWZWN0b3JCRWxlbWVudHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50NjRfdD4oa01pbkVsZW1lbnRzLCBrTWF4RWxlbWVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQ2NF90IGlkeCA9IDA7IGlkeCA8IGludGVybmFsVmVjdG9yQkVsZW1lbnRzOyArK2lkeCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsVmVjdG9yQi5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcnZhbChtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50NjRfdD4oKSAvKiBkZXZpY2UgX2luZGV4ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZkcC5Db25zdW1lSW50ZWdyYWw8dWludDY0X3Q+KCkgLyogc3RhcnQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50NjRfdD4oKSAvKiBlbmQgKi8pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJ2YWw6OkludGVyc2VjdChpbnRlcnZhbFZlY3RvckEsIGludGVydmFsVmVjdG9yQik7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IG51bVNlY3RvcnMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDY0X3Q+KGtNaW5WYWx1ZSwga01heFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRldmljZUluZGV4ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQzMl90PihrTWluVmFsdWUsIGtNYXhWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBwaHlzaWNhbFNlY3RvciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50NjRfdD4oa01pblZhbHVlLCBrTWF4VmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgTGluZWFyRXh0ZW50IGV4dGVudChudW1TZWN0b3JzLCBkZXZpY2VJbmRleCwgcGh5c2ljYWxTZWN0b3IpOworICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW50LkFzSW50ZXJ2YWwoKTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgWyZdKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgSVByb3BlcnR5RmV0Y2hlcjo6T3ZlcnJpZGVGb3JUZXN0aW5nKHN0ZDo6bWFrZV91bmlxdWU8UHJvcGVydHlGZXRjaGVyPigpKTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgaW52b2tlQVBJcygpOworICAgICAgICB9CisgICAgICAgIGlmIChtRmRwLkNvbnN1bWVCb29sKCkpIHsKKyAgICAgICAgICAgIG1CdWlsZGVyLT5SZW1vdmVHcm91cEFuZFBhcnRpdGlvbnMobUZkcC5QaWNrVmFsdWVJbkFycmF5KG1Hcm91cE5hbWVzKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdHJpbmcgcmVtb3ZlUGFydGl0aW9uID0gbUZkcC5QaWNrVmFsdWVJbkFycmF5KG1QYXJ0aXRpb25OYW1lcyk7CisgICAgICAgICAgICBtQnVpbGRlci0+UmVtb3ZlUGFydGl0aW9uKHJlbW92ZVBhcnRpdGlvbik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQnVpbGRlckZ1enplcjo6cHJvY2VzcygpIHsKKyAgICBpbnZva2VCdWlsZGVyQVBJcygpOworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQnVpbGRlckZ1enplciBidWlsZGVyRnV6emVyKGRhdGEsIHNpemUpOworICAgIGJ1aWxkZXJGdXp6ZXIucHJvY2VzcygpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYmxwL2Z1enplci9saWJscF9zdXBlcl9sYXlvdXRfYnVpbGRlcl9mdXp6ZXIuY3BwIGIvZnNfbWdyL2xpYmxwL2Z1enplci9saWJscF9zdXBlcl9sYXlvdXRfYnVpbGRlcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NjQyZDcKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGlibHAvZnV6emVyL2xpYmxwX3N1cGVyX2xheW91dF9idWlsZGVyX2Z1enplci5jcHAKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgorI2luY2x1ZGUgPGxpYmxwL21ldGFkYXRhX2Zvcm1hdC5oPgorI2luY2x1ZGUgPGxpYmxwL3N1cGVyX2xheW91dF9idWlsZGVyLmg+CisjaW5jbHVkZSA8bGludXgvbWVtZmQuaD4KKyNpbmNsdWRlIDxzdG9yYWdlX2xpdGVyYWxzL3N0b3JhZ2VfbGl0ZXJhbHMuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6ZnNfbWdyOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIHVuaXF1ZV9mZCA9IGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpzdG9yYWdlX2xpdGVyYWxzOworCitzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtTdXBlckxheW91dFZhbGlkQmxvY2tEZXZTaXplID0gNF9NaUI7CitzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtNaW5CbG9ja0RldlZhbHVlID0gMDsKK3N0YXRpYyBjb25zdGV4cHIgdWludDY0X3Qga01heEJsb2NrRGV2VmFsdWUgPSAxMDAwMDA7CitzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtNaW5FbGVtZW50cyA9IDA7CitzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtNYXhFbGVtZW50cyA9IDEwOworc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrU3VwZXJMYXlvdXRWYWxpZE1ldGFkYXRhU2l6ZSA9IDhfS2lCOworc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrTWluTWV0YWRhdGFWYWx1ZSA9IDA7CitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtNYXhNZXRhZGF0YVZhbHVlID0gMTAwMDA7CitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtNYXhCeXRlcyA9IDIwOworc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrTWluT3BlbiA9IDA7CitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtNYXhPcGVuID0gMjsKKworY29uc3QgdWludDY0X3Qga0F0dHJpYnV0ZVR5cGVzW10gPSB7CisgICAgICAgIExQX1BBUlRJVElPTl9BVFRSX05PTkUsICAgIExQX1BBUlRJVElPTl9BVFRSX1JFQURPTkxZLCBMUF9QQVJUSVRJT05fQVRUUl9TTE9UX1NVRkZJWEVELAorICAgICAgICBMUF9QQVJUSVRJT05fQVRUUl9VUERBVEVELCBMUF9QQVJUSVRJT05fQVRUUl9ESVNBQkxFRCwKK307CisKK2NsYXNzIFN1cGVyTGF5b3V0QnVpbGRlckZ1enplciB7CisgIHB1YmxpYzoKKyAgICBTdXBlckxheW91dEJ1aWxkZXJGdXp6ZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIDogbUZkcChkYXRhLCBzaXplKXt9OworICAgIHZvaWQgcHJvY2VzcygpOworCisgIHByaXZhdGU6CisgICAgRnV6emVkRGF0YVByb3ZpZGVyIG1GZHA7CisgICAgdm9pZCBpbnZva2VTdXBlckxheW91dEJ1aWxkZXJBUElzKCk7CisgICAgdm9pZCBjYWxsUmFuZG9tT3BlbihpbnQzMl90IG9wZW4pOworICAgIHZvaWQgYWRkTXVsdGlwbGVQYXJ0aXRpb25zKGludDMyX3QgbnVtUGFydGl0aW9ucyk7CisgICAgdm9pZCBzZXR1cFN1cGVyTGF5b3V0QnVpbGRlcigpOworICAgIFN1cGVyTGF5b3V0QnVpbGRlciBtU3VwZXJMYXlvdXRCdWlsZGVyOworICAgIHVuaXF1ZV9wdHI8TWV0YWRhdGFCdWlsZGVyPiBtU3VwZXJCdWlsZGVyOworICAgIHVuaXF1ZV9wdHI8THBNZXRhZGF0YT4gbU1ldGFkYXRhOworICAgIGJvb2wgbU9wZW5TdWNjZXNzID0gZmFsc2U7Cit9OworCit2b2lkIFN1cGVyTGF5b3V0QnVpbGRlckZ1enplcjo6c2V0dXBTdXBlckxheW91dEJ1aWxkZXIoKSB7CisgICAgdWludDY0X3QgcmFuZG9tQmxvY2tEZXZTaXplID0KKyAgICAgICAgICAgIG1GZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50NjRfdD4oa01pbkJsb2NrRGV2VmFsdWUsIGtNYXhCbG9ja0RldlZhbHVlKTsKKyAgICB1aW50NjRfdCBibG9ja0RldlNpemUgPSBtRmRwLkNvbnN1bWVCb29sKCkgPyBrU3VwZXJMYXlvdXRWYWxpZEJsb2NrRGV2U2l6ZSA6IHJhbmRvbUJsb2NrRGV2U2l6ZTsKKyAgICB1aW50MzJfdCByYW5kb21NZXRhZGF0YU1heFNpemUgPQorICAgICAgICAgICAgbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQzMl90PihrTWluTWV0YWRhdGFWYWx1ZSwga01heE1ldGFkYXRhVmFsdWUpOworICAgIHVpbnQzMl90IG1ldGFkYXRhTWF4U2l6ZSA9CisgICAgICAgICAgICBtRmRwLkNvbnN1bWVCb29sKCkgPyBrU3VwZXJMYXlvdXRWYWxpZE1ldGFkYXRhU2l6ZSA6IHJhbmRvbU1ldGFkYXRhTWF4U2l6ZTsKKyAgICB1aW50MzJfdCBtZXRhZGF0YVNsb3RDb3VudCA9IG1GZHAuQ29uc3VtZUJvb2woKSA/IDAgOiAxOworICAgIG1TdXBlckJ1aWxkZXIgPSBNZXRhZGF0YUJ1aWxkZXI6Ok5ldyhibG9ja0RldlNpemUsIG1ldGFkYXRhTWF4U2l6ZSwgbWV0YWRhdGFTbG90Q291bnQpOworCisgICAgaWYgKG1TdXBlckJ1aWxkZXIuZ2V0KCkpIHsKKyAgICAgICAgaWYgKG1GZHAuQ29uc3VtZUJvb2woKSkgeworICAgICAgICAgICAgaW50MzJfdCBudW1QYXJ0aXRpb25zID0KKyAgICAgICAgICAgICAgICAgICAgbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludDMyX3Q+KGtNaW5FbGVtZW50cywga01heEVsZW1lbnRzKTsKKyAgICAgICAgICAgIGFkZE11bHRpcGxlUGFydGl0aW9ucyhudW1QYXJ0aXRpb25zKTsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IHJhbmRvbU9wZW4gPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDMyX3Q+KGtNaW5PcGVuLCBrTWF4T3Blbik7CisgICAgICAgIGNhbGxSYW5kb21PcGVuKHJhbmRvbU9wZW4pOworICAgIH0KK30KKwordm9pZCBTdXBlckxheW91dEJ1aWxkZXJGdXp6ZXI6OmFkZE11bHRpcGxlUGFydGl0aW9ucyhpbnQzMl90IG51bVBhcnRpdGlvbnMpIHsKKyAgICBmb3IgKGludDMyX3QgaWR4ID0gMDsgaWR4IDwgbnVtUGFydGl0aW9uczsgKytpZHgpIHsKKyAgICAgICAgc3RyaW5nIHBhcnRpdGlvbk5hbWUgPSBtRmRwLkNvbnN1bWVCb29sKCkgPyBtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heEJ5dGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJidWlsZGVyX3BhcnRpdGlvbiI7CisgICAgICAgIG1TdXBlckJ1aWxkZXItPkFkZFBhcnRpdGlvbihwYXJ0aXRpb25OYW1lLCBtRmRwLlBpY2tWYWx1ZUluQXJyYXkoa0F0dHJpYnV0ZVR5cGVzKSk7CisgICAgfQorfQorCit2b2lkIFN1cGVyTGF5b3V0QnVpbGRlckZ1enplcjo6Y2FsbFJhbmRvbU9wZW4oaW50MzJfdCBvcGVuKSB7CisgICAgbU1ldGFkYXRhID0gbVN1cGVyQnVpbGRlci0+RXhwb3J0KCk7CisgICAgc3dpdGNoIChvcGVuKSB7CisgICAgICAgIGNhc2UgMDogeworICAgICAgICAgICAgdmVjdG9yPHVpbnQ4X3Q+IGltYWdlRGF0YSA9IG1GZHAuQ29uc3VtZUJ5dGVzPHVpbnQ4X3Q+KGtNYXhCeXRlcyk7CisgICAgICAgICAgICBtT3BlblN1Y2Nlc3MgPSBtU3VwZXJMYXlvdXRCdWlsZGVyLk9wZW4oKHZvaWQqKShpbWFnZURhdGEuZGF0YSgpKSwgaW1hZ2VEYXRhLnNpemUoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIDE6IHsKKyAgICAgICAgICAgIG1PcGVuU3VjY2VzcyA9IG1TdXBlckxheW91dEJ1aWxkZXIuT3BlbigqbU1ldGFkYXRhLmdldCgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgMjogeworICAgICAgICAgICAgdW5pcXVlX2ZkIGZkKHN5c2NhbGwoX19OUl9tZW1mZF9jcmVhdGUsICJpbWFnZV9maWxlIiwgMCkpOworICAgICAgICAgICAgV3JpdGVUb0ltYWdlRmlsZShmZCwgKm1NZXRhZGF0YS5nZXQoKSk7CisgICAgICAgICAgICBtT3BlblN1Y2Nlc3MgPSBtU3VwZXJMYXlvdXRCdWlsZGVyLk9wZW4oZmQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgU3VwZXJMYXlvdXRCdWlsZGVyRnV6emVyOjppbnZva2VTdXBlckxheW91dEJ1aWxkZXJBUElzKCkgeworICAgIHN0cmluZyBpbWFnZU5hbWUgPSBtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heEJ5dGVzKTsKKyAgICBzdHJpbmcgZnV6elBhcnRpdGlvbk5hbWUgPQorICAgICAgICAgICAgbUZkcC5Db25zdW1lQm9vbCgpID8gImJ1aWxkZXJfcGFydGl0aW9uIiA6IG1GZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrTWF4Qnl0ZXMpOworICAgIGlmICghZnV6elBhcnRpdGlvbk5hbWUuc2l6ZSgpKSB7CisgICAgICAgIGZ1enpQYXJ0aXRpb25OYW1lID0gImJ1aWxkZXJfcGFydGl0aW9uIjsKKyAgICB9CisgICAgc2V0dXBTdXBlckxheW91dEJ1aWxkZXIoKTsKKyAgICBpZiAobU9wZW5TdWNjZXNzKSB7CisgICAgICAgIHdoaWxlIChtRmRwLnJlbWFpbmluZ19ieXRlcygpKSB7CisgICAgICAgICAgICBhdXRvIGludm9rZVN1cGVyQVBJcyA9IG1GZHAuUGlja1ZhbHVlSW5BcnJheTxjb25zdCBmdW5jdGlvbjx2b2lkKCk+Pih7CisgICAgICAgICAgICAgICAgICAgIFsmXSgpIHsgbVN1cGVyTGF5b3V0QnVpbGRlci5HZXRJbWFnZUxheW91dCgpOyB9LAorICAgICAgICAgICAgICAgICAgICBbJl0oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3VwZXJMYXlvdXRCdWlsZGVyLkFkZFBhcnRpdGlvbihmdXp6UGFydGl0aW9uTmFtZSwgaW1hZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZkcC5Db25zdW1lSW50ZWdyYWw8dWludDY0X3Q+KCkpOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpbnZva2VTdXBlckFQSXMoKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBTdXBlckxheW91dEJ1aWxkZXJGdXp6ZXI6OnByb2Nlc3MoKSB7CisgICAgaW52b2tlU3VwZXJMYXlvdXRCdWlsZGVyQVBJcygpOworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgU3VwZXJMYXlvdXRCdWlsZGVyRnV6emVyIHN1cGVyTGF5b3V0QnVpbGRlckZ1enplcihkYXRhLCBzaXplKTsKKyAgICBzdXBlckxheW91dEJ1aWxkZXJGdXp6ZXIucHJvY2VzcygpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYmxwL2ltYWdlcy5jcHAgYi9mc19tZ3IvbGlibHAvaW1hZ2VzLmNwcAppbmRleCAwMmI2NGFjLi5hMmRiYjEwIDEwMDY0NAotLS0gYS9mc19tZ3IvbGlibHAvaW1hZ2VzLmNwcAorKysgYi9mc19tZ3IvbGlibHAvaW1hZ2VzLmNwcApAQCAtMTIzLDEzICsxMjMsNDYgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBXcml0ZVRvSW1hZ2VGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlLCBjb25zdCBMcE1ldGFkYXRhJiBpbnB1dCkgewotICAgIHVuaXF1ZV9mZCBmZChvcGVuKGZpbGUuY19zdHIoKSwgT19DUkVBVCB8IE9fUkRXUiB8IE9fVFJVTkMgfCBPX0NMT0VYRUMgfCBPX0JJTkFSWSwgMDY0NCkpOwotICAgIGlmIChmZCA8IDApIHsKLSAgICAgICAgUEVSUk9SIDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18gPDwgIiBvcGVuIGZhaWxlZDogIiA8PCBmaWxlOworI2lmICFkZWZpbmVkKF9XSU4zMikKK2Jvb2wgRnN5bmNEaXJlY3RvcnkoY29uc3QgY2hhciogZGlybmFtZSkgeworICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBmZChURU1QX0ZBSUxVUkVfUkVUUlkob3BlbihkaXJuYW1lLCBPX1JET05MWSB8IE9fQ0xPRVhFQykpKTsKKyAgICBpZiAoZmQgPT0gLTEpIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBvcGVuICIgPDwgZGlybmFtZTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICByZXR1cm4gV3JpdGVUb0ltYWdlRmlsZShmZCwgaW5wdXQpOworICAgIGlmIChmc3luYyhmZCkgPT0gLTEpIHsKKyAgICAgICAgaWYgKGVycm5vID09IEVST0ZTIHx8IGVycm5vID09IEVJTlZBTCkgeworICAgICAgICAgICAgUExPRyhXQVJOSU5HKSA8PCAiU2tpcCBmc3luYyAiIDw8IGRpcm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBvbiBhIGZpbGUgc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgc3luY2hyb25pemF0aW9uIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZnN5bmMgIiA8PCBkaXJuYW1lOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorI2VuZGlmCisKK2Jvb2wgV3JpdGVUb0ltYWdlRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZSwgY29uc3QgTHBNZXRhZGF0YSYgaW5wdXQpIHsKKyAgICBjb25zdCBhdXRvIHBhcmVudF9kaXIgPSBiYXNlOjpEaXJuYW1lKGZpbGUpOworICAgIFRlbXBvcmFyeUZpbGUgdG1wZmlsZShwYXJlbnRfZGlyKTsKKyAgICBpZiAoIVdyaXRlVG9JbWFnZUZpbGUodG1wZmlsZS5mZCwgaW5wdXQpKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gd3JpdGUgZ2VvbWV0cnkgZGF0YSB0byB0bXBmaWxlICIgPDwgdG1wZmlsZS5wYXRoOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisjaWYgIWRlZmluZWQoX1dJTjMyKQorICAgIGZzeW5jKHRtcGZpbGUuZmQpOworI2VuZGlmCisgICAgY29uc3QgYXV0byBlcnIgPSByZW5hbWUodG1wZmlsZS5wYXRoLCBmaWxlLmNfc3RyKCkpOworICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlbmFtZSB0bXAgZ2VvbWV0cnkgZmlsZSAiIDw8IHRtcGZpbGUucGF0aCA8PCAiIHRvICIgPDwgZmlsZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyNpZiAhZGVmaW5lZChfV0lOMzIpCisgICAgRnN5bmNEaXJlY3RvcnkocGFyZW50X2Rpci5jX3N0cigpKTsKKyNlbmRpZgorICAgIHJldHVybiB0cnVlOwogfQogCiBJbWFnZUJ1aWxkZXI6OkltYWdlQnVpbGRlcihjb25zdCBMcE1ldGFkYXRhJiBtZXRhZGF0YSwgdWludDMyX3QgYmxvY2tfc2l6ZSwKQEAgLTIwOCw3ICsyNDEsOCBAQAogICAgICAgICBzdGQ6OnN0cmluZyBmaWxlX25hbWUgPSAic3VwZXJfIiArIG5hbWUgKyAiLmltZyI7CiAgICAgICAgIHN0ZDo6c3RyaW5nIGZpbGVfcGF0aCA9IG91dHB1dF9kaXIgKyAiLyIgKyBmaWxlX25hbWU7CiAKLSAgICAgICAgc3RhdGljIGNvbnN0IGludCBrT3BlbkZsYWdzID0gT19DUkVBVCB8IE9fUkRXUiB8IE9fVFJVTkMgfCBPX0NMT0VYRUMgfCBPX05PRk9MTE9XIHwgT19CSU5BUlk7CisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga09wZW5GbGFncyA9CisgICAgICAgICAgICAgICAgT19DUkVBVCB8IE9fUkRXUiB8IE9fVFJVTkMgfCBPX0NMT0VYRUMgfCBPX05PRk9MTE9XIHwgT19CSU5BUlk7CiAgICAgICAgIHVuaXF1ZV9mZCBmZChvcGVuKGZpbGVfcGF0aC5jX3N0cigpLCBrT3BlbkZsYWdzLCAwNjQ0KSk7CiAgICAgICAgIGlmIChmZCA8IDApIHsKICAgICAgICAgICAgIFBFUlJPUiA8PCAib3BlbiBmYWlsZWQ6ICIgPDwgZmlsZV9wYXRoOwpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYmxwL2luY2x1ZGUvbGlibHAvYnVpbGRlci5oIGIvZnNfbWdyL2xpYmxwL2luY2x1ZGUvbGlibHAvYnVpbGRlci5oCmluZGV4IDU0ZjMxYmMuLjk1N2I5NmIgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJscC9pbmNsdWRlL2xpYmxwL2J1aWxkZXIuaAorKysgYi9mc19tZ3IvbGlibHAvaW5jbHVkZS9saWJscC9idWlsZGVyLmgKQEAgLTM0Niw2ICszNDYsOCBAQAogICAgIHZvaWQgU2V0QXV0b1Nsb3RTdWZmaXhpbmcoKTsKICAgICAvLyBTZXQgdGhlIExQX0hFQURFUl9GTEFHX1ZJUlRVQUxfQUJfREVWSUNFIGZsYWcuCiAgICAgdm9pZCBTZXRWaXJ0dWFsQUJEZXZpY2VGbGFnKCk7CisgICAgLy8gU2V0IG9yIHVuc2V0IHRoZSBMUF9IRUFERVJfRkxBR19PVkVSTEFZU19BQ1RJVkUgZmxhZy4KKyAgICB2b2lkIFNldE92ZXJsYXlzQWN0aXZlRmxhZyhib29sIGZsYWcpOwogCiAgICAgYm9vbCBHZXRCbG9ja0RldmljZUluZm8oY29uc3Qgc3RkOjpzdHJpbmcmIHBhcnRpdGlvbl9uYW1lLCBCbG9ja0RldmljZUluZm8qIGluZm8pIGNvbnN0OwogICAgIGJvb2wgVXBkYXRlQmxvY2tEZXZpY2VJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJ0aXRpb25fbmFtZSwgY29uc3QgQmxvY2tEZXZpY2VJbmZvJiBpbmZvKTsKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJscC9pbmNsdWRlL2xpYmxwL21ldGFkYXRhX2Zvcm1hdC5oIGIvZnNfbWdyL2xpYmxwL2luY2x1ZGUvbGlibHAvbWV0YWRhdGFfZm9ybWF0LmgKaW5kZXggNDFkOGIwYy4uOGQ3NzA5NyAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYmxwL2luY2x1ZGUvbGlibHAvbWV0YWRhdGFfZm9ybWF0LmgKKysrIGIvZnNfbWdyL2xpYmxwL2luY2x1ZGUvbGlibHAvbWV0YWRhdGFfZm9ybWF0LmgKQEAgLTI0MCw2ICsyNDAsOSBAQAogICovCiAjZGVmaW5lIExQX0hFQURFUl9GTEFHX1ZJUlRVQUxfQUJfREVWSUNFIDB4MQogCisvKiBUaGlzIGRldmljZSBoYXMgb3ZlcmxheXMgYWN0aXZhdGVkIHZpYSAiYWRiIHJlbW91bnQiLiAqLworI2RlZmluZSBMUF9IRUFERVJfRkxBR19PVkVSTEFZU19BQ1RJVkUgMHgyCisKIC8qIFRoaXMgc3RydWN0IGRlZmluZXMgYSBsb2dpY2FsIHBhcnRpdGlvbiBlbnRyeSwgc2ltaWxhciB0byB3aGF0IHdvdWxkIGJlCiAgKiBwcmVzZW50IGluIGEgR1VJRCBQYXJ0aXRpb24gVGFibGUuCiAgKi8KZGlmZiAtLWdpdCBhL2ZzX21nci9saWJscC9zdXBlcl9sYXlvdXRfYnVpbGRlci5jcHAgYi9mc19tZ3IvbGlibHAvc3VwZXJfbGF5b3V0X2J1aWxkZXIuY3BwCmluZGV4IDM3ZjI4ZTEuLmJmZjI2ZWEgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJscC9zdXBlcl9sYXlvdXRfYnVpbGRlci5jcHAKKysrIGIvZnNfbWdyL2xpYmxwL3N1cGVyX2xheW91dF9idWlsZGVyLmNwcApAQCAtMTcsNiArMTcsOCBAQAogCiAjaW5jbHVkZSA8bGlibHAvbGlibHAuaD4KIAorI2luY2x1ZGUgPGFsZ29yaXRobT4KKwogI2luY2x1ZGUgImltYWdlcy5oIgogI2luY2x1ZGUgInV0aWxpdHkuaCIKICNpbmNsdWRlICJ3cml0ZXIuaCIKQEAgLTQ2LDIxICs0OCwyMSBAQAogYm9vbCBTdXBlckxheW91dEJ1aWxkZXI6Ok9wZW4oY29uc3QgTHBNZXRhZGF0YSYgbWV0YWRhdGEpIHsKICAgICBmb3IgKGNvbnN0IGF1dG8mIHBhcnRpdGlvbiA6IG1ldGFkYXRhLnBhcnRpdGlvbnMpIHsKICAgICAgICAgaWYgKHBhcnRpdGlvbi5hdHRyaWJ1dGVzICYgTFBfUEFSVElUSU9OX0FUVFJfU0xPVF9TVUZGSVhFRCkgewotICAgICAgICAgICAgLy8gUmV0cm9maXQgZGV2aWNlcyBhcmUgbm90IHN1cHBvcnRlZC4KKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlJldHJvZml0IGRldmljZXMgYXJlIG5vdCBzdXBwb3J0ZWQiOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmICghKHBhcnRpdGlvbi5hdHRyaWJ1dGVzICYgTFBfUEFSVElUSU9OX0FUVFJfUkVBRE9OTFkpKSB7Ci0gICAgICAgICAgICAvLyBXcml0YWJsZSBwYXJ0aXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkLgorICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiV3JpdGFibGUgcGFydGl0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCI7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKCFtZXRhZGF0YS5leHRlbnRzLmVtcHR5KCkpIHsKLSAgICAgICAgLy8gUGFydGl0aW9ucyB0aGF0IGFscmVhZHkgaGF2ZSBleHRlbnRzIGFyZSBub3Qgc3VwcG9ydGVkIChzaG91bGQKLSAgICAgICAgLy8gbmV2ZXIgYmUgdHJ1ZSBvZiBzdXBlcl9lbXB0eS5pbWcpLgorICAgICAgICBMT0coRVJST1IpIDw8ICJQYXJ0aXRpb25zIHRoYXQgYWxyZWFkeSBoYXZlIGV4dGVudHMgYXJlIG5vdCBzdXBwb3J0ZWQiOworICAgICAgICAvLyBzaG91bGQgbmV2ZXIgYmUgdHJ1ZSBvZiBzdXBlcl9lbXB0eS5pbWcuCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKG1ldGFkYXRhLmJsb2NrX2RldmljZXMuc2l6ZSgpICE9IDEpIHsKLSAgICAgICAgLy8gT25seSBvbmUgInN1cGVyIiBpcyBzdXBwb3J0ZWQuCisgICAgICAgIExPRyhFUlJPUikgPDwgIk9ubHkgb25lICdzdXBlcicgaXMgc3VwcG9ydGVkIjsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtMTgyLDcgKzE4NCw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IGUubnVtX3NlY3RvcnMgKiBMUF9TRUNUT1JfU0laRTsKKyAgICAgICAgICAgIHVpbnQ2NF90IHNpemUgPSBlLm51bV9zZWN0b3JzICogTFBfU0VDVE9SX1NJWkU7CiAgICAgICAgICAgICB1aW50NjRfdCBzdXBlcl9vZmZzZXQgPSBlLnRhcmdldF9kYXRhICogTFBfU0VDVE9SX1NJWkU7CiAgICAgICAgICAgICBleHRlbnRzLmVtcGxhY2VfYmFjayhzdXBlcl9vZmZzZXQsIHNpemUsIGltYWdlX25hbWUsIGltYWdlX29mZnNldCk7CiAKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJscC91dGlsaXR5LmNwcCBiL2ZzX21nci9saWJscC91dGlsaXR5LmNwcAppbmRleCBkOGUxNzFiLi43MGM3Yjc5IDEwMDY0NAotLS0gYS9mc19tZ3IvbGlibHAvdXRpbGl0eS5jcHAKKysrIGIvZnNfbWdyL2xpYmxwL3V0aWxpdHkuY3BwCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiAjZW5kaWYKIAorI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9BbmRyb2lkLmJwIGIvZnNfbWdyL2xpYnNuYXBzaG90L0FuZHJvaWQuYnAKaW5kZXggM2RkMWYxYS4uOTY2Njk2YiAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L0FuZHJvaWQuYnAKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L0FuZHJvaWQuYnAKQEAgLTE1LDYgKzE1LDcgQEAKIC8vCiAKIHBhY2thZ2UgeworICAgIGRlZmF1bHRfdGVhbTogInRyZW5keV90ZWFtX2FuZHJvaWRfa2VybmVsIiwKICAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCiB9CiAKQEAgLTQ0LDcgKzQ1LDcgQEAKICAgICAgICAgImxpYmV4dDJfdXVpZCIsCiAgICAgICAgICJsaWJleHQ0X3V0aWxzIiwKICAgICAgICAgImxpYmZzdGFiIiwKLSAgICAgICAgImxpYnNuYXBzaG90X3NuYXB1c2VyZCIsCisgICAgICAgICJsaWJzbmFwdXNlcmRfY2xpZW50IiwKICAgICAgICAgImxpYnoiLAogICAgIF0sCiAgICAgaGVhZGVyX2xpYnM6IFsKQEAgLTg1LDE0ICs4NiwxMyBAQAogICAgICAgICAiYW5kcm9pZC9zbmFwc2hvdC9zbmFwc2hvdC5wcm90byIsCiAgICAgICAgICJkZXZpY2VfaW5mby5jcHAiLAogICAgICAgICAic25hcHNob3QuY3BwIiwKLSAgICAgICAgInNuYXBzaG90X3JlYWRlci5jcHAiLAogICAgICAgICAic25hcHNob3Rfc3RhdHMuY3BwIiwKICAgICAgICAgInNuYXBzaG90X3N0dWIuY3BwIiwKICAgICAgICAgInNuYXBzaG90X21ldGFkYXRhX3VwZGF0ZXIuY3BwIiwKLSAgICAgICAgInNuYXBzaG90X3dyaXRlci5jcHAiLAogICAgICAgICAicGFydGl0aW9uX2Nvd19jcmVhdG9yLmNwcCIsCiAgICAgICAgICJyZXR1cm4uY3BwIiwKICAgICAgICAgInV0aWxpdHkuY3BwIiwKKyAgICAgICAgInNjcmF0Y2hfc3VwZXIuY3BwIiwKICAgICBdLAogfQogCkBAIC0xMDMsMjAgKzEwMyw0NCBAQAogfQogCiBjY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYnNuYXBzaG90IiwKKyAgICBuYW1lOiAibGlic25hcHNob3Rfc3RhdGljIiwKICAgICBkZWZhdWx0czogWwogICAgICAgICAibGlic25hcHNob3RfZGVmYXVsdHMiLAogICAgICAgICAibGlic25hcHNob3RfaGFsX2RlcHMiLAogICAgIF0sCiAgICAgc3JjczogWyI6bGlic25hcHNob3Rfc291cmNlcyJdLAogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJmc19tZ3JfYmluZGVyIgorICAgICAgICAibGliZnNfbWdyX2JpbmRlciIsCisgICAgXSwKKyAgICB3aG9sZV9zdGF0aWNfbGliczogWworICAgICAgICAibGlic2VsaW51eCIsCisgICAgXSwKK30KKworY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYnNuYXBzaG90IiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGlic25hcHNob3RfZGVmYXVsdHMiLAorICAgICAgICAibGlic25hcHNob3RfY293X2RlZmF1bHRzIiwKKyAgICAgICAgImxpYnNuYXBzaG90X2hhbF9kZXBzIiwKKyAgICBdLAorICAgIHNyY3M6IFsiOmxpYnNuYXBzaG90X3NvdXJjZXMiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliZnNfbWdyX2JpbmRlciIsCisgICAgICAgICJsaWJscCIsCisgICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic25hcHNob3RfY293IiwKKyAgICBdLAorICAgIHdob2xlX3N0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzZWxpbnV4IiwKICAgICBdLAogfQogCiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYnNuYXBzaG90X2luaXQiLAotICAgIG5hdGl2ZV9jb3ZlcmFnZSA6IHRydWUsCisgICAgbmF0aXZlX2NvdmVyYWdlOiB0cnVlLAogICAgIGRlZmF1bHRzOiBbImxpYnNuYXBzaG90X2RlZmF1bHRzIl0sCiAgICAgc3JjczogWyI6bGlic25hcHNob3Rfc291cmNlcyJdLAogICAgIHJhbWRpc2tfYXZhaWxhYmxlOiB0cnVlLApAQCAtMTI2LDYgKzE1MCw3IEBACiAgICAgXSwKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGliZnNfbWdyIiwKKyAgICAgICAgImxpYnNlbGludXgiLAogICAgIF0sCiB9CiAKQEAgLTE0Myw2ICsxNjgsOSBAQAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJmc19tZ3IiLAogICAgIF0sCisgICAgd2hvbGVfc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnNlbGludXgiLAorICAgIF0sCiB9CiAKIGNjX2RlZmF1bHRzIHsKQEAgLTE2Myw4ICsxOTEsMTEgQEAKICAgICAgICAgImxpYmJyb3RsaSIsCiAgICAgICAgICJsaWJ6IiwKICAgICAgICAgImxpYmx6NCIsCisgICAgICAgICJsaWJ6c3RkIiwKICAgICBdLAotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJ1cGRhdGVfZW5naW5lX2hlYWRlcnMiLAorICAgIF0sCiB9CiAKIGNjX2xpYnJhcnlfc3RhdGljIHsKQEAgLTE3MywxMiArMjA0LDIyIEBACiAgICAgICAgICJsaWJzbmFwc2hvdF9jb3dfZGVmYXVsdHMiLAogICAgIF0sCiAgICAgc3JjczogWwotICAgICAgICAibGlic25hcHNob3RfY293L2Nvd19kZWNvbXByZXNzLmNwcCIsCi0gICAgICAgICJsaWJzbmFwc2hvdF9jb3cvY293X3JlYWRlci5jcHAiLAotICAgICAgICAibGlic25hcHNob3RfY293L2Nvd193cml0ZXIuY3BwIiwKLSAgICAgICAgImxpYnNuYXBzaG90X2Nvdy9jb3dfZm9ybWF0LmNwcCIsCiAgICAgICAgICJsaWJzbmFwc2hvdF9jb3cvY293X2NvbXByZXNzLmNwcCIsCisgICAgICAgICJsaWJzbmFwc2hvdF9jb3cvY293X2RlY29tcHJlc3MuY3BwIiwKKyAgICAgICAgImxpYnNuYXBzaG90X2Nvdy9jb3dfZm9ybWF0LmNwcCIsCisgICAgICAgICJsaWJzbmFwc2hvdF9jb3cvY293X3JlYWRlci5jcHAiLAorICAgICAgICAibGlic25hcHNob3RfY293L3BhcnNlcl92Mi5jcHAiLAorICAgICAgICAibGlic25hcHNob3RfY293L3BhcnNlcl92My5jcHAiLAorICAgICAgICAibGlic25hcHNob3RfY293L3NuYXBzaG90X3JlYWRlci5jcHAiLAorICAgICAgICAibGlic25hcHNob3RfY293L3dyaXRlcl9iYXNlLmNwcCIsCisgICAgICAgICJsaWJzbmFwc2hvdF9jb3cvd3JpdGVyX3YyLmNwcCIsCisgICAgICAgICJsaWJzbmFwc2hvdF9jb3cvd3JpdGVyX3YzLmNwcCIsCiAgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJzdG9yYWdlX2xpdGVyYWxzX2hlYWRlcnMiLAorICAgIF0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiAgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCiAgICAgcmVjb3ZlcnlfYXZhaWxhYmxlOiB0cnVlLAogICAgIHJhbWRpc2tfYXZhaWxhYmxlOiB0cnVlLApAQCAtMjEyLDE4ICsyNTMsMjAgQEAKICAgICAgICAgImxpYmZzX21nciIsCiAgICAgICAgICJsaWJnbW9jayIsCiAgICAgICAgICJsaWJndGVzdCIsCisgICAgICAgICJsaWJzZWxpbnV4IiwKICAgICBdLAogfQogCiBjY19kZWZhdWx0cyB7CiAgICAgbmFtZTogImxpYnNuYXBzaG90X3Rlc3RfZGVmYXVsdHMiLAotICAgIGRlZmF1bHRzOiBbImxpYnNuYXBzaG90X2RlZmF1bHRzIiwgImxpYnNuYXBzaG90X2Nvd19kZWZhdWx0cyJdLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJzbmFwc2hvdF9kZWZhdWx0cyIsCisgICAgICAgICJsaWJzbmFwc2hvdF9jb3dfZGVmYXVsdHMiLAorICAgIF0sCiAgICAgc3JjczogWwogICAgICAgICAicGFydGl0aW9uX2Nvd19jcmVhdG9yX3Rlc3QuY3BwIiwKICAgICAgICAgInNuYXBzaG90X21ldGFkYXRhX3VwZGF0ZXJfdGVzdC5jcHAiLAotICAgICAgICAic25hcHNob3RfcmVhZGVyX3Rlc3QuY3BwIiwKICAgICAgICAgInNuYXBzaG90X3Rlc3QuY3BwIiwKLSAgICAgICAgInNuYXBzaG90X3dyaXRlcl90ZXN0LmNwcCIsCiAgICAgXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYmluZGVyIiwKQEAgLTIzOCwxMyArMjgxLDEyIEBACiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmJvb3RAMS4xIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYm9vdC1WMS1uZGsiLAogICAgICAgICAibGliYnJvdGxpIiwKLSAgICAgICAgImxpYmMrK2ZzIiwKICAgICAgICAgImxpYmZzX21ncl9iaW5kZXIiLAogICAgICAgICAibGliZ2ZsYWdzIiwKICAgICAgICAgImxpYmdzaSIsCiAgICAgICAgICJsaWJnbW9jayIsCiAgICAgICAgICJsaWJscCIsCi0gICAgICAgICJsaWJzbmFwc2hvdCIsCisgICAgICAgICJsaWJzbmFwc2hvdF9zdGF0aWMiLAogICAgICAgICAibGlic25hcHNob3RfY293IiwKICAgICAgICAgImxpYnNuYXBzaG90X3Rlc3RfaGVscGVycyIsCiAgICAgICAgICJsaWJzcGFyc2UiLApAQCAtMjU0LDE2ICsyOTYsMjcgQEAKICAgICBdLAogICAgIGF1dG9fZ2VuX2NvbmZpZzogdHJ1ZSwKICAgICByZXF1aXJlX3Jvb3Q6IHRydWUsCi0gICAgY29tcGlsZV9tdWx0aWxpYjogImZpcnN0IiwKIH0KIAogY2NfdGVzdCB7CiAgICAgbmFtZTogInZ0c19saWJzbmFwc2hvdF90ZXN0IiwKLSAgICBkZWZhdWx0czogWyJsaWJzbmFwc2hvdF90ZXN0X2RlZmF1bHRzIiwgImxpYnNuYXBzaG90X2hhbF9kZXBzIl0sCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYnNuYXBzaG90X3Rlc3RfZGVmYXVsdHMiLAorICAgICAgICAibGlic25hcHNob3RfaGFsX2RlcHMiLAorICAgIF0sCiAgICAgdGVzdF9zdWl0ZXM6IFsKICAgICAgICAgInZ0cyIsCi0gICAgICAgICJkZXZpY2UtdGVzdHMiCisgICAgICAgICJnZW5lcmFsLXRlc3RzIiwKICAgICBdLAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJib3RoIiwKKyAgICBtdWx0aWxpYjogeworICAgICAgICBsaWIzMjogeworICAgICAgICAgICAgc3VmZml4OiAiMzIiLAorICAgICAgICB9LAorICAgICAgICBsaWI2NDogeworICAgICAgICAgICAgc3VmZml4OiAiNjQiLAorICAgICAgICB9LAorICAgIH0sCiAgICAgdGVzdF9vcHRpb25zOiB7CiAgICAgICAgIG1pbl9zaGlwcGluZ19hcGlfbGV2ZWw6IDMwLAogICAgIH0sCkBAIC0yNzEsMzEgKzMyNCwyNiBAQAogCiBjY190ZXN0IHsKICAgICBuYW1lOiAidmFiX2xlZ2FjeV90ZXN0cyIsCi0gICAgZGVmYXVsdHM6IFsibGlic25hcHNob3RfdGVzdF9kZWZhdWx0cyIsICJsaWJzbmFwc2hvdF9oYWxfZGVwcyJdLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJzbmFwc2hvdF90ZXN0X2RlZmF1bHRzIiwKKyAgICAgICAgImxpYnNuYXBzaG90X2hhbF9kZXBzIiwKKyAgICBdLAogICAgIGNwcGZsYWdzOiBbCiAgICAgICAgICItRExJQlNOQVBTSE9UX1RFU1RfVkFCX0xFR0FDWSIsCiAgICAgXSwKICAgICB0ZXN0X3N1aXRlczogWwotICAgICAgICAiZGV2aWNlLXRlc3RzIgorICAgICAgICAiZ2VuZXJhbC10ZXN0cyIsCiAgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiNjQiLAogICAgIHRlc3Rfb3B0aW9uczogewogICAgICAgICAvLyBMZWdhY3kgVkFCIGxhdW5jaGVkIGluIEFuZHJvaWQgUi4KICAgICAgICAgbWluX3NoaXBwaW5nX2FwaV9sZXZlbDogMzAsCi0gICAgfSwKLX0KLQotY2NfdGVzdCB7Ci0gICAgbmFtZTogInZhYmNfbGVnYWN5X3Rlc3RzIiwKLSAgICBkZWZhdWx0czogWyJsaWJzbmFwc2hvdF90ZXN0X2RlZmF1bHRzIiwgImxpYnNuYXBzaG90X2hhbF9kZXBzIl0sCi0gICAgY3BwZmxhZ3M6IFsKLSAgICAgICAgIi1ETElCU05BUFNIT1RfVEVTVF9WQUJDX0xFR0FDWSIsCi0gICAgXSwKLSAgICB0ZXN0X3N1aXRlczogWwotICAgICAgICAiZGV2aWNlLXRlc3RzIgotICAgIF0sCi0gICAgdGVzdF9vcHRpb25zOiB7Ci0gICAgICAgIC8vIExlZ2FjeSBWQUJDIGxhdW5jaGVkIGluIEFuZHJvaWQgUy4KLSAgICAgICAgbWluX3NoaXBwaW5nX2FwaV9sZXZlbDogMzEsCisgICAgICAgIHRlc3RfcnVubmVyX29wdGlvbnM6IFsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuYW1lOiAiZm9yY2Utbm8tdGVzdC1lcnJvciIsCisgICAgICAgICAgICAgICAgdmFsdWU6ICJmYWxzZSIsCisgICAgICAgICAgICB9LAorICAgICAgICBdLAogICAgIH0sCiB9CiAKQEAgLTMxOSwxNiArMzY3LDE3IEBACiAKIGNjX2JpbmFyeSB7CiAgICAgbmFtZTogInNuYXBzaG90Y3RsIiwKLSAgICBkZWZhdWx0czogWyJsaWJzbmFwc2hvdF9jb3dfZGVmYXVsdHMiLCAibGlic25hcHNob3RfaGFsX2RlcHMiXSwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGlic25hcHNob3RfY293X2RlZmF1bHRzIiwKKyAgICAgICAgImxpYnNuYXBzaG90X2hhbF9kZXBzIiwKKyAgICBdLAogICAgIHNyY3M6IFsKICAgICAgICAgInNuYXBzaG90Y3RsLmNwcCIsCisgICAgICAgICJzY3JhdGNoX3N1cGVyLmNwcCIsCiAgICAgXSwKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGliYnJvdGxpIiwKLSAgICAgICAgImxpYmMrK2ZzIiwKICAgICAgICAgImxpYmZzdGFiIiwKLSAgICAgICAgImxpYnNuYXBzaG90IiwKLSAgICAgICAgImxpYnNuYXBzaG90X2NvdyIsCiAgICAgICAgICJsaWJ6IiwKICAgICAgICAgInVwZGF0ZV9tZXRhZGF0YS1wcm90b3MiLAogICAgIF0sCkBAIC0zNDEsNiArMzkwLDcgQEAKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJscCIsCiAgICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCisgICAgICAgICJsaWJzbmFwc2hvdCIsCiAgICAgICAgICJsaWJzdGF0c2xvZyIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKQEAgLTM2OSw3ICs0MTksOSBAQAogICAgICAgICAibGlic25hcHNob3RfY293X2RlZmF1bHRzIiwKICAgICBdLAogICAgIHNyY3M6IFsKLSAgICAgICAgImxpYnNuYXBzaG90X2Nvdy9jb3dfYXBpX3Rlc3QuY3BwIiwKKyAgICAgICAgImxpYnNuYXBzaG90X2Nvdy9zbmFwc2hvdF9yZWFkZXJfdGVzdC5jcHAiLAorICAgICAgICAibGlic25hcHNob3RfY293L3Rlc3RfdjIuY3BwIiwKKyAgICAgICAgImxpYnNuYXBzaG90X2Nvdy90ZXN0X3YzLmNwcCIsCiAgICAgXSwKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQiLApAQCAtMzg3LDEyICs0MzksMTkgQEAKICAgICAgICAgImxpYmd0ZXN0IiwKICAgICAgICAgImxpYnNuYXBzaG90X2NvdyIsCiAgICAgXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlic3RvcmFnZV9saXRlcmFsc19oZWFkZXJzIiwKKyAgICBdLAogICAgIHRlc3Rfc3VpdGVzOiBbCi0gICAgICAgICJkZXZpY2UtdGVzdHMiCisgICAgICAgICJnZW5lcmFsLXRlc3RzIiwKICAgICBdLAogICAgIHRlc3Rfb3B0aW9uczogewogICAgICAgICBtaW5fc2hpcHBpbmdfYXBpX2xldmVsOiAzMCwKICAgICB9LAorICAgIGRhdGE6IFsKKyAgICAgICAgInRvb2xzL3Rlc3RkYXRhL2Nvd192MiIsCisgICAgICAgICJ0b29scy90ZXN0ZGF0YS9pbmNvbXByZXNzaWJsZV9ibG9jayIsCisgICAgXSwKICAgICBhdXRvX2dlbl9jb25maWc6IHRydWUsCiAgICAgcmVxdWlyZV9yb290OiBmYWxzZSwKICAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKQEAgLTQxMyw2ICs0NzIsNyBAQAogICAgICAgICAibGliYnJvdGxpIiwKICAgICAgICAgImxpYmNyeXB0b19zdGF0aWMiLAogICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYmdmbGFncyIsCiAgICAgICAgICJsaWJzbmFwc2hvdF9jb3ciLAogICAgICAgICAibGlieiIsCiAgICAgXSwKQEAgLTQyMyw2ICs0ODMsNTYgQEAKICAgICBdLAogfQogCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJjcmVhdGVfc25hcHNob3QiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIGRldmljZV9zdXBwb3J0ZWQ6IGZhbHNlLAorCisgICAgc3JjczogWyJsaWJzbmFwc2hvdF9jb3cvY3JlYXRlX2Nvdy5jcHAiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJleHQ0X3V0aWxzIiwKKyAgICAgICAgImxpYnNuYXBzaG90X2NvdyIsCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgICAgICAibGliYnJvdGxpIiwKKyAgICAgICAgImxpYnoiLAorICAgICAgICAibGlibHo0IiwKKyAgICAgICAgImxpYnpzdGQiLAorICAgICAgICAibGliZ2ZsYWdzIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJzdG9yYWdlX2xpdGVyYWxzX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBkaXN0OiB7CisgICAgICAgIHRhcmdldHM6IFsKKyAgICAgICAgICAgICJzZGsiLAorICAgICAgICAgICAgInNkay1yZXBvLXBsYXRmb3JtLXRvb2xzIiwKKyAgICAgICAgICAgICJzZGtfcmVwbyIsCisgICAgICAgIF0sCisgICAgfSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICAgICAgd2luZG93czogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKKyAgICBzdGw6ICJsaWJjKytfc3RhdGljIiwKKyAgICBzdGF0aWNfZXhlY3V0YWJsZTogdHJ1ZSwKK30KKwogcHl0aG9uX2xpYnJhcnlfaG9zdCB7CiAgICAgbmFtZTogInNuYXBzaG90X3Byb3RvX3B5dGhvbiIsCiAgICAgc3JjczogWwpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L09XTkVSUyBiL2ZzX21nci9saWJzbmFwc2hvdC9PV05FUlMKaW5kZXggOWQyYjg3Ny4uYzhiMTAwMyAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L09XTkVSUworKysgYi9mc19tZ3IvbGlic25hcHNob3QvT1dORVJTCkBAIC0xLDUgKzEsNiBAQAotIyBCdWcgY29tcG9uZW50OiAzMDU0NQorIyBCdWcgY29tcG9uZW50OiAxMDE0OTUxCiBiYWxzaW5pQGdvb2dsZS5jb20KIGR2YW5kZXJAZ29vZ2xlLmNvbQogZWxza0Bnb29nbGUuY29tCiBha2FpbGFzaEBnb29nbGUuY29tCit6aGFuZ2tlbHZpbkBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3QvYW5kcm9pZC9zbmFwc2hvdC9zbmFwc2hvdC5wcm90byBiL2ZzX21nci9saWJzbmFwc2hvdC9hbmRyb2lkL3NuYXBzaG90L3NuYXBzaG90LnByb3RvCmluZGV4IGZhMDRjNDMuLjVmYjcxYTMgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9hbmRyb2lkL3NuYXBzaG90L3NuYXBzaG90LnByb3RvCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9hbmRyb2lkL3NuYXBzaG90L3NuYXBzaG90LnByb3RvCkBAIC0xMDMsNyArMTAzLDcgQEAKICAgICAvLyBUaGUgb2xkIHBhcnRpdGlvbiBzaXplIChpZiBub25lIGV4aXN0ZWQsIHRoaXMgd2lsbCBiZSB6ZXJvKS4KICAgICB1aW50NjQgb2xkX3BhcnRpdGlvbl9zaXplID0gMTA7CiAKLSAgICAvLyBDb21wcmVzc2lvbiBhbGdvcml0aG0gKG5vbmUsIGd6LCBvciBicm90bGkpLgorICAgIC8vIENvbXByZXNzaW9uIGFsZ29yaXRobSAobm9uZSwgbHo0LCB6c3RkKS4KICAgICBzdHJpbmcgY29tcHJlc3Npb25fYWxnb3JpdGhtID0gMTE7CiAKICAgICAvLyBFc3RpbWF0ZWQgQ09XIHNpemUgZnJvbSBPVEEgbWFuaWZlc3QuCkBAIC0xMTQsNiArMTE0LDIzIEBACiAKICAgICAvLyBFbmFibGUgYmF0Y2hpbmcgZm9yIENPVyB3cml0ZXMKICAgICBib29sIGJhdGNoZWRfd3JpdGVzID0gMTQ7CisKKyAgICAvLyBTaXplIG9mIHYzIG9wZXJhdGlvbiBidWZmZXIuIE5lZWRzIHRvIGJlIGRldGVybWluZWQgZHVyaW5nIHdyaXRlciBpbml0aWFsaXphdGlvbgorICAgIHVpbnQ2NCBlc3RpbWF0ZWRfb3BzX2J1ZmZlcl9zaXplID0gMTU7CisKKyAgICAvLyBNYXggYnl0ZXMgdG8gYmUgY29tcHJlc3NlZCBhdCBvbmNlICg0aywgOGssIDE2aywgMzJrLCA2NGssIDEyOGspCisgICAgdWludDY0IGNvbXByZXNzaW9uX2ZhY3RvciA9IDE2OworCisgICAgLy8gRGVmYXVsdCB2YWx1ZSBpcyAzMiwgY2FuIGJlIHNldCBsb3dlciBmb3IgbG93IG1lbSBkZXZpY2VzCisgICAgdWludDMyIHJlYWRfYWhlYWRfc2l6ZSA9IDE3OworCisgICAgcmVzZXJ2ZWQgMTg7CisKKyAgICAvLyBCbG9ja3Mgc2l6ZSB0byBiZSB2ZXJpZmllZCBhdCBvbmNlCisgICAgdWludDY0IHZlcmlmeV9ibG9ja19zaXplID0gMTk7CisKKyAgICAvLyBEZWZhdWx0IHZhbHVlIGlzIDIsIGNvbmZpZ3VyZXMgdGhyZWFkcyB0byBkbyB2ZXJpZmljYXRpb24gcGhhc2UKKyAgICB1aW50MzIgbnVtX3ZlcmlmeV90aHJlYWRzID0gMjA7CiB9CiAKIC8vIE5leHQ6IDgKQEAgLTIwNiw2ICsyMjMsMTggQEAKIAogICAgIC8vIGlvX3VyaW5nIHN1cHBvcnQKICAgICBib29sIGlvX3VyaW5nX2VuYWJsZWQgPSAxMDsKKworICAgIC8vIGxlZ2FjeSBkbS1zbmFwc2hvdCBiYXNlZCBzbmFwdXNlcmQKKyAgICBib29sIGxlZ2FjeV9zbmFwdXNlcmQgPSAxMTsKKworICAgIC8vIEVuYWJsZSBkaXJlY3QgcmVhZHMgZnJvbSBzb3VyY2UgZGV2aWNlCisgICAgYm9vbCBvX2RpcmVjdCA9IDEyOworCisgICAgLy8gTnVtYmVyIG9mIGNvdyBvcGVyYXRpb25zIHRvIGJlIG1lcmdlZCBhdCBvbmNlCisgICAgdWludDMyIGNvd19vcF9tZXJnZV9zaXplID0gMTM7CisKKyAgICAvLyBOdW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgdG8gc2VydmUgSS9PIGZyb20gZG0tdXNlcgorICAgIHVpbnQzMiBudW1fd29ya2VyX3RocmVhZHMgPSAxNDsKIH0KIAogLy8gTmV4dDogMTAKQEAgLTI1MCw0ICsyNzksNyBAQAogCiAgICAgLy8gV2hldGhlciB0aGlzIHVwZGF0ZSBhdHRlbXB0IHVzZWQgaW9fdXJpbmcuCiAgICAgYm9vbCBpb3VyaW5nX3VzZWQgPSAxMzsKKworICAgIC8vIFNpemUgb2YgdjMgb3BlcmF0aW9uIGJ1ZmZlci4gTmVlZHMgdG8gYmUgZGV0ZXJtaW5lZCBkdXJpbmcgd3JpdGVyIGluaXRpYWxpemF0aW9uCisgICAgdWludDY0IGVzdGltYXRlZF9vcF9jb3VudF9tYXggPSAxNDsKIH0KZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9kZXZpY2VfaW5mby5jcHAgYi9mc19tZ3IvbGlic25hcHNob3QvZGV2aWNlX2luZm8uY3BwCmluZGV4IDBhYjYxMDMuLjE5ZjNlMDIgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9kZXZpY2VfaW5mby5jcHAKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L2RldmljZV9pbmZvLmNwcApAQCAtMTMsNiArMTMsNyBAQAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJkZXZpY2VfaW5mby5oIgorI2luY2x1ZGUgInNjcmF0Y2hfc3VwZXIuaCIKIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8ZnNfbWdyLmg+CkBAIC0zNyw4ICszOCwyNCBAQAogY29uc3RleHByIGJvb2wga0lzUmVjb3ZlcnkgPSBmYWxzZTsKICNlbmRpZgogCitEZXZpY2VJbmZvOjpEZXZpY2VJbmZvKCkgeworICAgIHN0ZDo6c3RyaW5nIHNjcmF0Y2hfZGV2aWNlID0gYW5kcm9pZDo6c25hcHNob3Q6OkdldFNjcmF0Y2hPdGFNZXRhZGF0YVBhcnRpdGlvbigpOworICAgIGlmICghc2NyYXRjaF9kZXZpY2UuZW1wdHkoKSkgeworICAgICAgICBzdGQ6OnN0cmluZyBzY3JhdGNoX21ldGFkYXRhID0KKyAgICAgICAgICAgICAgICBhbmRyb2lkOjpzbmFwc2hvdDo6TWFwU2NyYXRjaE90YU1ldGFkYXRhUGFydGl0aW9uKHNjcmF0Y2hfZGV2aWNlKTsKKyAgICAgICAgaWYgKCFzY3JhdGNoX21ldGFkYXRhLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIFNldE1ldGFkYXRhRGlyKHNjcmF0Y2hfbWV0YWRhdGEpOworICAgICAgICAgICAgU2V0VGVtcE1ldGFkYXRhKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIHN0ZDo6c3RyaW5nIERldmljZUluZm86OkdldE1ldGFkYXRhRGlyKCkgY29uc3QgewotICAgIHJldHVybiAiL21ldGFkYXRhL290YSJzOworICAgIHJldHVybiBtZXRhZGF0YV9kaXJfOworfQorCit2b2lkIERldmljZUluZm86OlNldE1ldGFkYXRhRGlyKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIG1ldGFkYXRhX2Rpcl8gPSB2YWx1ZTsKIH0KIAogc3RkOjpzdHJpbmcgRGV2aWNlSW5mbzo6R2V0U2xvdFN1ZmZpeCgpIGNvbnN0IHsKQEAgLTEwNCw2ICsxMjEsMjQgQEAKICAgICByZXR1cm4gZmlyc3Rfc3RhZ2VfaW5pdF87CiB9CiAKK2Jvb2wgRGV2aWNlSW5mbzo6U2V0QWN0aXZlQm9vdFNsb3QoW1ttYXliZV91bnVzZWRdXSB1bnNpZ25lZCBpbnQgc2xvdCkgeworI2lmZGVmIExJQlNOQVBTSE9UX1VTRV9IQUwKKyAgICBpZiAoIUVuc3VyZUJvb3RIYWwoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQ29tbWFuZFJlc3VsdCByZXN1bHQgPSBib290X2NvbnRyb2xfLT5TZXRBY3RpdmVCb290U2xvdChzbG90KTsKKyAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkVycm9yIHNldHRpbmcgc2xvdCAiIDw8IHNsb3QgPDwgIiBhY3RpdmU6ICIgPDwgcmVzdWx0LmVyck1zZzsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyNlbHNlCisgICAgTE9HKEVSUk9SKSA8PCAiSEFMIHN1cHBvcnQgbm90IGVuYWJsZWQuIjsKKyAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKK30KKwogYm9vbCBEZXZpY2VJbmZvOjpTZXRTbG90QXNVbmJvb3RhYmxlKFtbbWF5YmVfdW51c2VkXV0gdW5zaWduZWQgaW50IHNsb3QpIHsKICNpZmRlZiBMSUJTTkFQU0hPVF9VU0VfSEFMCiAgICAgaWYgKCFFbnN1cmVCb290SGFsKCkpIHsKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9kZXZpY2VfaW5mby5oIGIvZnNfbWdyL2xpYnNuYXBzaG90L2RldmljZV9pbmZvLmgKaW5kZXggZDA2ZjFiZS4uZTkzZWM0OSAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L2RldmljZV9pbmZvLmgKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L2RldmljZV9pbmZvLmgKQEAgLTI5LDYgKzI5LDcgQEAKICAgICB1c2luZyBNZXJnZVN0YXR1cyA9IDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmJvb3Q6Ok1lcmdlU3RhdHVzOwogCiAgIHB1YmxpYzoKKyAgICBEZXZpY2VJbmZvKCk7CiAgICAgc3RkOjpzdHJpbmcgR2V0TWV0YWRhdGFEaXIoKSBjb25zdCBvdmVycmlkZTsKICAgICBzdGQ6OnN0cmluZyBHZXRTbG90U3VmZml4KCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgc3RkOjpzdHJpbmcgR2V0T3RoZXJTbG90U3VmZml4KCkgY29uc3Qgb3ZlcnJpZGU7CkBAIC0zNiwxOSArMzcsMjUgQEAKICAgICBzdGQ6OnN0cmluZyBHZXRTdXBlckRldmljZSh1aW50MzJfdCBzbG90KSBjb25zdCBvdmVycmlkZTsKICAgICBib29sIElzT3ZlcmxheWZzU2V0dXAoKSBjb25zdCBvdmVycmlkZTsKICAgICBib29sIFNldEJvb3RDb250cm9sTWVyZ2VTdGF0dXMoTWVyZ2VTdGF0dXMgc3RhdHVzKSBvdmVycmlkZTsKKyAgICBib29sIFNldEFjdGl2ZUJvb3RTbG90KHVuc2lnbmVkIGludCBzbG90KSBvdmVycmlkZTsKICAgICBib29sIFNldFNsb3RBc1VuYm9vdGFibGUodW5zaWduZWQgaW50IHNsb3QpIG92ZXJyaWRlOwogICAgIGJvb2wgSXNSZWNvdmVyeSgpIGNvbnN0IG92ZXJyaWRlOwogICAgIHN0ZDo6dW5pcXVlX3B0cjxJSW1hZ2VNYW5hZ2VyPiBPcGVuSW1hZ2VNYW5hZ2VyKCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgYm9vbCBJc0ZpcnN0U3RhZ2VJbml0KCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgYW5kcm9pZDo6ZG06OklEZXZpY2VNYXBwZXImIEdldERldmljZU1hcHBlcigpIG92ZXJyaWRlOwotCisgICAgdm9pZCBTZXRNZXRhZGF0YURpcihjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOwogICAgIHZvaWQgc2V0X2ZpcnN0X3N0YWdlX2luaXQoYm9vbCB2YWx1ZSkgeyBmaXJzdF9zdGFnZV9pbml0XyA9IHZhbHVlOyB9CisgICAgYm9vbCBJc1RlbXBNZXRhZGF0YSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRlbXBfbWV0YWRhdGFfOyB9CisgICAgdm9pZCBTZXRUZW1wTWV0YWRhdGEoKSB7IHRlbXBfbWV0YWRhdGFfID0gdHJ1ZTsgfQogCiAgIHByaXZhdGU6CiAgICAgYm9vbCBFbnN1cmVCb290SGFsKCk7CiAKICAgICBhbmRyb2lkOjpmc19tZ3I6OlBhcnRpdGlvbk9wZW5lciBvcGVuZXJfOwogICAgIGJvb2wgZmlyc3Rfc3RhZ2VfaW5pdF8gPSBmYWxzZTsKKyAgICAvLyBEZWZhdWx0IHZhbHVlCisgICAgc3RkOjpzdHJpbmcgbWV0YWRhdGFfZGlyXyA9ICIvbWV0YWRhdGEvb3RhIjsKKyAgICBib29sIHRlbXBfbWV0YWRhdGFfID0gZmFsc2U7CiAjaWZkZWYgTElCU05BUFNIT1RfVVNFX0hBTAogICAgIHN0ZDo6dW5pcXVlX3B0cjw6OmFuZHJvaWQ6OmhhbDo6Qm9vdENvbnRyb2xDbGllbnQ+IGJvb3RfY29udHJvbF87CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9pbmNsdWRlL2xpYnNuYXBzaG90L2Nvd19jb21wcmVzcy5oIGIvZnNfbWdyL2xpYnNuYXBzaG90L2luY2x1ZGUvbGlic25hcHNob3QvY293X2NvbXByZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM1YTM4YwotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9pbmNsdWRlL2xpYnNuYXBzaG90L2Nvd19jb21wcmVzcy5oCkBAIC0wLDAgKzEsNTUgQEAKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy8vCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImxpYnNuYXBzaG90L2Nvd19mb3JtYXQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHNuYXBzaG90IHsKKworY2xhc3MgSUNvbXByZXNzb3IgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgSUNvbXByZXNzb3IoY29uc3QgaW50MzJfdCBjb21wcmVzc2lvbl9sZXZlbCwgY29uc3QgdWludDMyX3QgYmxvY2tfc2l6ZSkKKyAgICAgICAgOiBjb21wcmVzc2lvbl9sZXZlbF8oY29tcHJlc3Npb25fbGV2ZWwpLCBibG9ja19zaXplXyhibG9ja19zaXplKSB7fQorCisgICAgdmlydHVhbCB+SUNvbXByZXNzb3IoKSB7fQorICAgIC8vIEZhY3RvcnkgbWV0aG9kcyBmb3IgY29tcHJlc3Npb24gbWV0aG9kcy4KKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPElDb21wcmVzc29yPiBHeihjb25zdCBpbnQzMl90IGNvbXByZXNzaW9uX2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGJsb2NrX3NpemUpOworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8SUNvbXByZXNzb3I+IEJyb3RsaShjb25zdCBpbnQzMl90IGNvbXByZXNzaW9uX2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBibG9ja19zaXplKTsKKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPElDb21wcmVzc29yPiBMejQoY29uc3QgaW50MzJfdCBjb21wcmVzc2lvbl9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgYmxvY2tfc2l6ZSk7CisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxJQ29tcHJlc3Nvcj4gWnN0ZChjb25zdCBpbnQzMl90IGNvbXByZXNzaW9uX2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgYmxvY2tfc2l6ZSk7CisKKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPElDb21wcmVzc29yPiBDcmVhdGUoQ293Q29tcHJlc3Npb24gY29tcHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGJsb2NrX3NpemUpOworCisgICAgaW50MzJfdCBHZXRDb21wcmVzc2lvbkxldmVsKCkgY29uc3QgeyByZXR1cm4gY29tcHJlc3Npb25fbGV2ZWxfOyB9CisgICAgdWludDMyX3QgR2V0QmxvY2tTaXplKCkgY29uc3QgeyByZXR1cm4gYmxvY2tfc2l6ZV87IH0KKyAgICBbW25vZGlzY2FyZF1dIHZpcnR1YWwgc3RkOjp2ZWN0b3I8dWludDhfdD4gQ29tcHJlc3MoY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IGxlbmd0aCkgY29uc3QgPSAwOworCisgIHByaXZhdGU6CisgICAgY29uc3QgaW50MzJfdCBjb21wcmVzc2lvbl9sZXZlbF87CisgICAgY29uc3QgdWludDMyX3QgYmxvY2tfc2l6ZV87Cit9OworfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L2luY2x1ZGUvbGlic25hcHNob3QvY293X2Zvcm1hdC5oIGIvZnNfbWdyL2xpYnNuYXBzaG90L2luY2x1ZGUvbGlic25hcHNob3QvY293X2Zvcm1hdC5oCmluZGV4IGJhNzVhOGQuLjk5MWUxN2MgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9pbmNsdWRlL2xpYnNuYXBzaG90L2Nvd19mb3JtYXQuaAorKysgYi9mc19tZ3IvbGlic25hcHNob3QvaW5jbHVkZS9saWJzbmFwc2hvdC9jb3dfZm9ybWF0LmgKQEAgLTE1LDE5ICsxNSwyNCBAQAogI3ByYWdtYSBvbmNlCiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8b3B0aW9uYWw+CisjaW5jbHVkZSA8c3RyaW5nX3ZpZXc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBzbmFwc2hvdCB7CiAKK3N0cnVjdCBDb3dPcGVyYXRpb25WMzsKK3R5cGVkZWYgQ293T3BlcmF0aW9uVjMgQ293T3BlcmF0aW9uOworCiBzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtDb3dNYWdpY051bWJlciA9IDB4NDM2Zjc3NjM0ZjU3MjEyMVVMTDsKIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga0Nvd1ZlcnNpb25NYWpvciA9IDI7CiBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtDb3dWZXJzaW9uTWlub3IgPSAwOwogCi1zdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtDb3dWZXJzaW9uTWFuaWZlc3QgPSAyOwotCi1zdGF0aWMgY29uc3RleHByIHNpemVfdCBCTE9DS19TWiA9IDQwOTY7Ci1zdGF0aWMgY29uc3RleHByIHNpemVfdCBCTE9DS19TSElGVCA9IChfX2J1aWx0aW5fZmZzKEJMT0NLX1NaKSAtIDEpOworc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrTWluQ293VmVyc2lvbiA9IDE7CitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtNYXhDb3dWZXJzaW9uID0gMzsKIAogLy8gVGhpcyBoZWFkZXIgYXBwZWFycyBhcyB0aGUgZmlyc3Qgc2VxdWVuY2Ugb2YgYnl0ZXMgaW4gdGhlIENPVy4gQWxsIGZpZWxkcwogLy8gaW4gdGhlIGxheW91dCBhcmUgbGl0dGxlLWVuZGlhbiBlbmNvZGVkLiBUaGUgb24tZGlzayBsYXlvdXQgaXM6CkBAIC00Myw3ICs0OCw5IEBACiAvLyAgICAgIHwgICAgRm9vdGVyIChmaXhlZCkgICAgIHwKIC8vICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogLy8KLS8vIFRoZSBvcGVyYXRpb25zIGJlZ2luIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBoZWFkZXIsIGFuZCB0aGUgInJhdyBkYXRhIgorLy8gQWZ0ZXIgdGhlIGhlYWRlciBpcyBhIDJtYiBzY3JhdGNoIHNwYWNlIHRoYXQgaXMgdXNlZCB0byByZWFkIGFoZWFkIGRhdGEgZHVyaW5nIG1lcmdlIG9wZXJhdGlvbnMKKy8vCisvLyBUaGUgb3BlcmF0aW9ucyBiZWdpbiBpbW1lZGlhdGVseSBhZnRlciB0aGUgc2NyYXRjaCBzcGFjZSwgYW5kIHRoZSAicmF3IGRhdGEiCiAvLyBpbW1lZGlhdGVseSBmb2xsb3dzIHRoZSBvcGVyYXRpb24gd2hpY2ggcmVmZXJzIHRvIGl0LiBXaGlsZSBzdHJlYW1pbmcKIC8vIGFuIE9UQSwgd2UgY2FuIGltbWVkaWF0ZWx5IHdyaXRlIHRoZSBvcCBhbmQgZGF0YSwgc3luY2luZyBhZnRlciBlYWNoIHBhaXIsCiAvLyB3aGlsZSBzdG9yaW5nIG9wZXJhdGlvbiBtZXRhZGF0YSBpbiBtZW1vcnkuIEF0IHRoZSBlbmQsIHdlIGNvbXB1dGUgZGF0YSBhbmQKQEAgLTUzLDEzICs2MCwxNSBAQAogLy8gYmV0d2VlbiB3cml0aW5nIHRoZSBsYXN0IG9wZXJhdGlvbi9kYXRhIHBhaXIsIG9yIHRoZSBmb290ZXIgaXRzZWxmLiBJbiB0aGlzCiAvLyBjYXNlLCB0aGUgc2FmZXN0IHdheSB0byBwcm9jZWVkIGlzIHRvIGFzc3VtZSB0aGUgbGFzdCBvcGVyYXRpb24gaXMgZmF1bHR5LgogCi1zdHJ1Y3QgQ293SGVhZGVyIHsKK3N0cnVjdCBDb3dIZWFkZXJQcmVmaXggewogICAgIHVpbnQ2NF90IG1hZ2ljOwogICAgIHVpbnQxNl90IG1ham9yX3ZlcnNpb247CiAgICAgdWludDE2X3QgbWlub3JfdmVyc2lvbjsKKyAgICB1aW50MTZfdCBoZWFkZXJfc2l6ZTsgIC8vIHNpemUgb2YgQ293SGVhZGVyLgorfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAotICAgIC8vIFNpemUgb2YgdGhpcyBzdHJ1Y3QuCi0gICAgdWludDE2X3QgaGVhZGVyX3NpemU7CitzdHJ1Y3QgQ293SGVhZGVyIHsKKyAgICBDb3dIZWFkZXJQcmVmaXggcHJlZml4OwogCiAgICAgLy8gU2l6ZSBvZiBmb290ZXIgc3RydWN0CiAgICAgdWludDE2X3QgZm9vdGVyX3NpemU7CkBAIC03OCwxOCArODcsNjYgQEAKIAogICAgIC8vIFNjcmF0Y2ggc3BhY2UgdXNlZCBkdXJpbmcgbWVyZ2UKICAgICB1aW50MzJfdCBidWZmZXJfc2l6ZTsKKwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAorLy8gUmVzdW1lIHBvaW50IHN0cnVjdHVyZSB1c2VkIGZvciByZXN1bWUgYnVmZmVyCitzdHJ1Y3QgUmVzdW1lUG9pbnQgeworICAgIC8vIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyB2YWx1ZSB1c2VkIGJ5IHVwZGF0ZV9lbmdpbmUKKyAgICB1aW50NjRfdCBsYWJlbDsKKyAgICAvLyBJbmRleCBvZiBsYXN0IENvd09wZXJhdGlvbiBndWFyYW50ZWVkIHRvIGJlIHJlc3VtYWJsZQorICAgIHVpbnQ2NF90IG9wX2luZGV4OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtOdW1SZXN1bWVQb2ludHMgPSA0OworCitzdHJ1Y3QgQ293SGVhZGVyVjMgOiBwdWJsaWMgQ293SGVhZGVyIHsKKyAgICAvLyBOdW1iZXIgb2Ygc2VxdWVuY2UgZGF0YSBzdG9yZWQgKGVhY2ggb2Ygd2hpY2ggaXMgYSAzMiBiaXQgaW50ZWdlcikKKyAgICB1aW50NjRfdCBzZXF1ZW5jZV9kYXRhX2NvdW50OworICAgIC8vIE51bWJlciBvZiBjdXJyZW50bHkgd3JpdHRlbiByZXN1bWUgcG9pbnRzICYmCisgICAgdWludDMyX3QgcmVzdW1lX3BvaW50X2NvdW50OworICAgIC8vIE51bWJlciBvZiBtYXggcmVzdW1lIHBvaW50cyB0aGF0IGNhbiBiZSB3cml0dGVuCisgICAgdWludDMyX3QgcmVzdW1lX3BvaW50X21heDsKKyAgICAvLyBOdW1iZXIgb2YgQ293T3BlcmF0aW9uVjMgc3RydWN0cyBpbiB0aGUgb3BlcmF0aW9uIGJ1ZmZlciwgY3VycmVudGx5IGFuZCB0b3RhbAorICAgIC8vIHJlZ2lvbiBzaXplLgorICAgIHVpbnQ2NF90IG9wX2NvdW50OworICAgIHVpbnQ2NF90IG9wX2NvdW50X21heDsKKyAgICAvLyBDb21wcmVzc2lvbiBBbGdvcml0aG0KKyAgICB1aW50MzJfdCBjb21wcmVzc2lvbl9hbGdvcml0aG07CisgICAgLy8gTWF4IGNvbXByZXNzaW9uIHNpemUgc3VwcG9ydGVkCisgICAgdWludDMyX3QgbWF4X2NvbXByZXNzaW9uX3NpemU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitlbnVtIGNsYXNzIENvd09wZXJhdGlvblR5cGUgOiB1aW50OF90IHsKKyAgICBrQ293Q29weU9wID0gMSwKKyAgICBrQ293UmVwbGFjZU9wID0gMiwKKyAgICBrQ293WmVyb09wID0gMywKKyAgICBrQ293TGFiZWxPcCA9IDQsCisgICAga0Nvd0NsdXN0ZXJPcCA9IDUsCisgICAga0Nvd1hvck9wID0gNiwKKyAgICBrQ293U2VxdWVuY2VPcCA9IDcsCisgICAga0Nvd0Zvb3Rlck9wID0gc3RkOjpudW1lcmljX2xpbWl0czx1aW50OF90Pjo6bWF4KCksCit9OworCitzdGF0aWMgY29uc3RleHByIENvd09wZXJhdGlvblR5cGUga0Nvd0NvcHlPcCA9IENvd09wZXJhdGlvblR5cGU6OmtDb3dDb3B5T3A7CitzdGF0aWMgY29uc3RleHByIENvd09wZXJhdGlvblR5cGUga0Nvd1JlcGxhY2VPcCA9IENvd09wZXJhdGlvblR5cGU6OmtDb3dSZXBsYWNlT3A7CitzdGF0aWMgY29uc3RleHByIENvd09wZXJhdGlvblR5cGUga0Nvd1plcm9PcCA9IENvd09wZXJhdGlvblR5cGU6OmtDb3daZXJvT3A7CitzdGF0aWMgY29uc3RleHByIENvd09wZXJhdGlvblR5cGUga0Nvd0xhYmVsT3AgPSBDb3dPcGVyYXRpb25UeXBlOjprQ293TGFiZWxPcDsKK3N0YXRpYyBjb25zdGV4cHIgQ293T3BlcmF0aW9uVHlwZSBrQ293Q2x1c3Rlck9wID0gQ293T3BlcmF0aW9uVHlwZTo6a0Nvd0NsdXN0ZXJPcDsKK3N0YXRpYyBjb25zdGV4cHIgQ293T3BlcmF0aW9uVHlwZSBrQ293WG9yT3AgPSBDb3dPcGVyYXRpb25UeXBlOjprQ293WG9yT3A7CitzdGF0aWMgY29uc3RleHByIENvd09wZXJhdGlvblR5cGUga0Nvd1NlcXVlbmNlT3AgPSBDb3dPcGVyYXRpb25UeXBlOjprQ293U2VxdWVuY2VPcDsKK3N0YXRpYyBjb25zdGV4cHIgQ293T3BlcmF0aW9uVHlwZSBrQ293Rm9vdGVyT3AgPSBDb3dPcGVyYXRpb25UeXBlOjprQ293Rm9vdGVyT3A7CisKIC8vIFRoaXMgc3RydWN0dXJlIGlzIHRoZSBzYW1lIHNpemUgb2YgYSBub3JtYWwgT3BlcmF0aW9uLCBidXQgaXMgcmVwdXJwb3NlZCBmb3IgdGhlIGZvb3Rlci4KIHN0cnVjdCBDb3dGb290ZXJPcGVyYXRpb24gewogICAgIC8vIFRoZSBvcGVyYXRpb24gY29kZSAoYWx3YXlzIGtDb3dGb290ZXJPcCkuCi0gICAgdWludDhfdCB0eXBlOworICAgIENvd09wZXJhdGlvblR5cGUgdHlwZTsKIAogICAgIC8vIElmIHRoaXMgb3BlcmF0aW9uIHJlYWRzIGZyb20gdGhlIGRhdGEgc2VjdGlvbiBvZiB0aGUgQ09XLCB0aGlzIGNvbnRhaW5zCiAgICAgLy8gdGhlIGNvbXByZXNzaW9uIHR5cGUgb2YgdGhhdCBkYXRhIChzZWUgY29uc3RhbnRzIGJlbG93KS4KICAgICB1aW50OF90IGNvbXByZXNzaW9uOwogCi0gICAgLy8gTGVuZ3RoIG9mIEZvb3RlciBEYXRhLiBDdXJyZW50bHkgNjQgZm9yIGJvdGggY2hlY2tzdW1zCisgICAgLy8gTGVuZ3RoIG9mIEZvb3RlciBEYXRhLiBDdXJyZW50bHkgNjQuCiAgICAgdWludDE2X3QgZGF0YV9sZW5ndGg7CiAKICAgICAvLyBUaGUgYW1vdW50IG9mIGZpbGUgc3BhY2UgdXNlZCBieSBDb3cgb3BlcmF0aW9ucwpAQCAtOTksMTkgKzE1NiwxMCBAQAogICAgIHVpbnQ2NF90IG51bV9vcHM7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCi1zdHJ1Y3QgQ293Rm9vdGVyRGF0YSB7Ci0gICAgLy8gU0hBMjU2IGNoZWNrc3VtcyBvZiBGb290ZXIgb3AKLSAgICB1aW50OF90IGZvb3Rlcl9jaGVja3N1bVszMl07Ci0KLSAgICAvLyBTSEEyNTYgb2YgdGhlIG9wZXJhdGlvbiBzZXF1ZW5jZS4KLSAgICB1aW50OF90IG9wc19jaGVja3N1bVszMl07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0vLyBDb3cgb3BlcmF0aW9ucyBhcmUgY3VycmVudGx5IGZpeGVkLXNpemUgZW50cmllcywgYnV0IHRoaXMgbWF5IGNoYW5nZSBpZgotLy8gbmVlZGVkLgotc3RydWN0IENvd09wZXJhdGlvbiB7CisvLyBWMiB2ZXJzaW9uIG9mIENPVy4gT24gZGlzayBmb3JtYXQgZm9yIG9sZGVyIGRldmljZXMKK3N0cnVjdCBDb3dPcGVyYXRpb25WMiB7CiAgICAgLy8gVGhlIG9wZXJhdGlvbiBjb2RlIChzZWUgdGhlIGNvbnN0YW50cyBhbmQgc3RydWN0dXJlcyBiZWxvdykuCi0gICAgdWludDhfdCB0eXBlOworICAgIENvd09wZXJhdGlvblR5cGUgdHlwZTsKIAogICAgIC8vIElmIHRoaXMgb3BlcmF0aW9uIHJlYWRzIGZyb20gdGhlIGRhdGEgc2VjdGlvbiBvZiB0aGUgQ09XLCB0aGlzIGNvbnRhaW5zCiAgICAgLy8gdGhlIGNvbXByZXNzaW9uIHR5cGUgb2YgdGhhdCBkYXRhIChzZWUgY29uc3RhbnRzIGJlbG93KS4KQEAgLTE0MywzMSArMTkxLDEyOSBAQAogICAgIHVpbnQ2NF90IHNvdXJjZTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKLXN0YXRpY19hc3NlcnQoc2l6ZW9mKENvd09wZXJhdGlvbikgPT0gc2l6ZW9mKENvd0Zvb3Rlck9wZXJhdGlvbikpOworc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrQ293T3BTb3VyY2VJbmZvRGF0YU1hc2sgPSAoMVVMTCA8PCA0OCkgLSAxOworc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrQ293T3BTb3VyY2VJbmZvVHlwZUJpdCA9IDYwOworc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrQ293T3BTb3VyY2VJbmZvVHlwZU51bUJpdHMgPSA0Oworc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrQ293T3BTb3VyY2VJbmZvVHlwZU1hc2sgPSAoMVVMTCA8PCBrQ293T3BTb3VyY2VJbmZvVHlwZU51bUJpdHMpIC0gMTsKIAotc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtDb3dDb3B5T3AgPSAxOwotc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtDb3dSZXBsYWNlT3AgPSAyOwotc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtDb3daZXJvT3AgPSAzOwotc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtDb3dMYWJlbE9wID0gNDsKLXN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrQ293Q2x1c3Rlck9wID0gNTsKLXN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrQ293WG9yT3AgPSA2Owotc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtDb3dTZXF1ZW5jZU9wID0gNzsKLXN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrQ293Rm9vdGVyT3AgPSAtMTsKK3N0YXRpYyBjb25zdGV4cHIgdWludDY0X3Qga0Nvd09wU291cmNlSW5mb0NvbXByZXNzaW9uQml0ID0gNTc7CitzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtDb3dPcFNvdXJjZUluZm9Db21wcmVzc2lvbk51bUJpdHMgPSAzOworc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrQ293T3BTb3VyY2VJbmZvQ29tcHJlc3Npb25NYXNrID0KKyAgICAgICAgKCgxVUxMIDw8IGtDb3dPcFNvdXJjZUluZm9Db21wcmVzc2lvbk51bUJpdHMpIC0gMSk7CisKKy8vIFRoZSBvbiBkaXNrIGZvcm1hdCBvZiBjb3cgKGN1cnJlbnRseSA9PSAgQ293T3BlcmF0aW9uKQorc3RydWN0IENvd09wZXJhdGlvblYzIHsKKyAgICAvLyBJZiB0aGlzIG9wZXJhdGlvbiByZWFkcyBmcm9tIHRoZSBkYXRhIHNlY3Rpb24gb2YgdGhlIENPVywgdGhpcyBjb250YWlucworICAgIC8vIHRoZSBsZW5ndGguCisgICAgdWludDMyX3QgZGF0YV9sZW5ndGg7CisKKyAgICAvLyBUaGUgYmxvY2sgb2YgZGF0YSBpbiB0aGUgbmV3IGltYWdlIHRoYXQgdGhpcyBvcGVyYXRpb24gbW9kaWZpZXMuCisgICAgdWludDMyX3QgbmV3X2Jsb2NrOworCisgICAgLy8gc291cmNlX2luZm8gd2l0aCBoYXZlIHRoZSBmb2xsb3dpbmcgbGF5b3V0CisgICAgLy8gfC0tLSA0IGJpdHMgLS0gfCAtLS0tLS0tLS0gMyBiaXRzIC0tLS0tLSB8IC0tLSA5IGJpdHMgLS0tIHwgLS0tIDQ4IGJpdHMgLS0tfAorICAgIC8vIHwtLS0gdHlwZSAtLS0gIHwgLS0gY29tcHJlc3Npb24gZmFjdG9yIC0tfCAtLS0gdW51c2VkIC0tLSB8IC0tLSBzb3VyY2UgLS0tIHwKKyAgICAvLworICAgIC8vIFRoZSB2YWx1ZSBvZiB8c291cmNlfCBkZXBlbmRzIG9uIHRoZSBvcGVyYXRpb24gY29kZS4KKyAgICAvLworICAgIC8vIENvcHlPcDogYSAzMi1iaXQgYmxvY2sgbG9jYXRpb24gaW4gdGhlIHNvdXJjZSBpbWFnZS4KKyAgICAvLyBSZXBsYWNlT3A6IGFuIGFic29sdXRlIGJ5dGUgb2Zmc2V0IHdpdGhpbiB0aGUgQ09XJ3MgZGF0YSBzZWN0aW9uLgorICAgIC8vIFhvck9wOiBhbiBhYnNvbHV0ZSBieXRlIG9mZnNldCBpbiB0aGUgc291cmNlIGltYWdlLgorICAgIC8vIFplcm9PcDogdW51c2VkCisgICAgLy8gTGFiZWxPcDogYSA2NC1iaXQgb3BhcXVlIGlkZW50aWZpZXIuCisgICAgLy8KKyAgICAvLyBGb3Igb3BzIG90aGVyIHRoYW4gTGFiZWw6CisgICAgLy8gIEJpdHMgNDctNjIgYXJlIHJlc2VydmVkIGFuZCBtdXN0IGJlIHplcm8uCisgICAgLy8gQSBibG9jayBpcyBjb21wcmVzc2VkIGlmIGl04oCZcyBkYXRhIGlzIDwgYmxvY2tfc3oKKyAgICAvLworICAgIC8vIEJpdHMgWzU3LTU5XSByZXByZXNlbnRzIHRoZSBjb21wcmVzc2lvbiBmYWN0b3IuCisgICAgLy8KKyAgICAvLyAgICAgICBDb21wcmVzc2lvbiAtIGZhY3RvcgorICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLy8gMDAwIC0gIDRrCisgICAgLy8gMDAxIC0gIDhrCisgICAgLy8gMDEwIC0gIDE2aworICAgIC8vIC4uLgorICAgIC8vIDExMCAtICAyNTZrCisgICAgLy8KKyAgICB1aW50NjRfdCBzb3VyY2VfaW5mb187CisgICAgY29uc3RleHByIHVpbnQ2NF90IHNvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIHNvdXJjZV9pbmZvXyAmIGtDb3dPcFNvdXJjZUluZm9EYXRhTWFzazsgfQorICAgIGNvbnN0ZXhwciB2b2lkIHNldF9zb3VyY2UodWludDY0X3Qgc291cmNlKSB7CisgICAgICAgIC8vIENsZWFyIHRoZSBmaXJzdCA0OCBiaXQgZmlyc3QKKyAgICAgICAgc291cmNlX2luZm9fICY9IH5rQ293T3BTb3VyY2VJbmZvRGF0YU1hc2s7CisgICAgICAgIC8vIFNldCB0aGUgYWN0dWFsIHNvdXJjZSBmaWVsZAorICAgICAgICBzb3VyY2VfaW5mb18gfD0gc291cmNlICYga0Nvd09wU291cmNlSW5mb0RhdGFNYXNrOworICAgIH0KKyAgICBjb25zdGV4cHIgQ293T3BlcmF0aW9uVHlwZSB0eXBlKCkgY29uc3QgeworICAgICAgICAvLyB0aGlzIGlzIGEgbWFzayB0byBncmFiIHRoZSBmaXJzdCA0IGJpdHMgb2YgYSA2NCBiaXQgaW50ZWdlcgorICAgICAgICBjb25zdCBhdXRvIHR5cGUgPSAoc291cmNlX2luZm9fID4+IGtDb3dPcFNvdXJjZUluZm9UeXBlQml0KSAmIGtDb3dPcFNvdXJjZUluZm9UeXBlTWFzazsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PENvd09wZXJhdGlvblR5cGU+KHR5cGUpOworICAgIH0KKyAgICBjb25zdGV4cHIgdm9pZCBzZXRfdHlwZShDb3dPcGVyYXRpb25UeXBlIHR5cGUpIHsKKyAgICAgICAgLy8gQ2xlYXIgdGhlIHRvcCA0IGJpdHMgZmlyc3QKKyAgICAgICAgc291cmNlX2luZm9fICY9ICgoMVVMTCA8PCBrQ293T3BTb3VyY2VJbmZvVHlwZUJpdCkgLSAxKTsKKyAgICAgICAgLy8gc2V0IHRoZSBhY3R1YWwgdHlwZSBiaXRzCisgICAgICAgIHNvdXJjZV9pbmZvXyB8PSAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHR5cGUpICYga0Nvd09wU291cmNlSW5mb1R5cGVNYXNrKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwga0Nvd09wU291cmNlSW5mb1R5cGVCaXQ7CisgICAgfQorICAgIGNvbnN0ZXhwciB2b2lkIHNldF9jb21wcmVzc2lvbl9iaXRzKHVpbnQ4X3QgY29tcHJlc3Npb25fZmFjdG9yKSB7CisgICAgICAgIC8vIENsZWFyIHRoZSAzIGJpdHMgZnJvbSBiaXQgNTcgLSBbNTctNTldCisgICAgICAgIHNvdXJjZV9pbmZvXyAmPSB+KGtDb3dPcFNvdXJjZUluZm9Db21wcmVzc2lvbk1hc2sgPDwga0Nvd09wU291cmNlSW5mb0NvbXByZXNzaW9uQml0KTsKKyAgICAgICAgLy8gU2V0IHRoZSBhY3R1YWwgY29tcHJlc3Npb24gZmFjdG9yCisgICAgICAgIHNvdXJjZV9pbmZvXyB8PQorICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50NjRfdD4oY29tcHJlc3Npb25fZmFjdG9yKSAmIGtDb3dPcFNvdXJjZUluZm9Db21wcmVzc2lvbk1hc2spCisgICAgICAgICAgICAgICAgPDwga0Nvd09wU291cmNlSW5mb0NvbXByZXNzaW9uQml0OworICAgIH0KKyAgICBjb25zdGV4cHIgdWludDhfdCBjb21wcmVzc2lvbl9iaXRzKCkgY29uc3QgeworICAgICAgICAvLyBHcmFiIHRoZSAzIGJpdHMgZnJvbSBbNTctNTldCisgICAgICAgIGNvbnN0IGF1dG8gY29tcHJlc3Npb25fZmFjdG9yID0KKyAgICAgICAgICAgICAgICAoc291cmNlX2luZm9fID4+IGtDb3dPcFNvdXJjZUluZm9Db21wcmVzc2lvbkJpdCkgJiBrQ293T3BTb3VyY2VJbmZvQ29tcHJlc3Npb25NYXNrOworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29tcHJlc3Npb25fZmFjdG9yKTsKKyAgICB9Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvLyBFbnN1cmUgdGhhdCBnZXR0ZXJzL3NldHRlcnMgYWRkZWQgdG8gQ293T3BlcmF0aW9uVjMgZG9lcyBub3QgaW5jcmVhc2VzIHNpemUKKy8vIG9mIENvd09wZXJhdGlvblYzIHN0cnVjdChubyB2aXJ0dWFsIG1ldGhvZCB0YWJsZXMgYWRkZWQpLgorc3RhdGljX2Fzc2VydChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZV92PENvd09wZXJhdGlvblYzPik7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0X3Y8Q293T3BlcmF0aW9uVjM+KTsKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKENvd09wZXJhdGlvblYyKSA9PSBzaXplb2YoQ293Rm9vdGVyT3BlcmF0aW9uKSk7CiAKIGVudW0gQ293Q29tcHJlc3Npb25BbGdvcml0aG0gOiB1aW50OF90IHsKICAgICBrQ293Q29tcHJlc3NOb25lID0gMCwKICAgICBrQ293Q29tcHJlc3NHeiA9IDEsCiAgICAga0Nvd0NvbXByZXNzQnJvdGxpID0gMiwKLSAgICBrQ293Q29tcHJlc3NMejQgPSAzCisgICAga0Nvd0NvbXByZXNzTHo0ID0gMywKKyAgICBrQ293Q29tcHJlc3Nac3RkID0gNCwKK307CitzdHJ1Y3QgQ293Q29tcHJlc3Npb24geworICAgIENvd0NvbXByZXNzaW9uQWxnb3JpdGhtIGFsZ29yaXRobSA9IGtDb3dDb21wcmVzc05vbmU7CisgICAgaW50MzJfdCBjb21wcmVzc2lvbl9sZXZlbCA9IDA7CiB9OwogCiBzdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga0Nvd1JlYWRBaGVhZE5vdFN0YXJ0ZWQgPSAwOwogc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtDb3dSZWFkQWhlYWRJblByb2dyZXNzID0gMTsKIHN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrQ293UmVhZEFoZWFkRG9uZSA9IDI7CiAKK3N0YXRpYyBjb25zdGV4cHIgb2ZmX3QgR2V0U2VxdWVuY2VPZmZzZXQoY29uc3QgQ293SGVhZGVyVjMmIGhlYWRlcikgeworICAgIHJldHVybiBoZWFkZXIucHJlZml4LmhlYWRlcl9zaXplICsgaGVhZGVyLmJ1ZmZlcl9zaXplOworfQorCitzdGF0aWMgY29uc3RleHByIG9mZl90IEdldFJlc3VtZU9mZnNldChjb25zdCBDb3dIZWFkZXJWMyYgaGVhZGVyKSB7CisgICAgcmV0dXJuIEdldFNlcXVlbmNlT2Zmc2V0KGhlYWRlcikgKyAoaGVhZGVyLnNlcXVlbmNlX2RhdGFfY291bnQgKiBzaXplb2YodWludDMyX3QpKTsKK30KKworc3RhdGljIGNvbnN0ZXhwciBvZmZfdCBHZXRPcE9mZnNldCh1aW50MzJfdCBvcF9pbmRleCwgY29uc3QgQ293SGVhZGVyVjMmIGhlYWRlcikgeworICAgIHJldHVybiBHZXRSZXN1bWVPZmZzZXQoaGVhZGVyKSArIChoZWFkZXIucmVzdW1lX3BvaW50X21heCAqIHNpemVvZihSZXN1bWVQb2ludCkpICsKKyAgICAgICAgICAgKG9wX2luZGV4ICogc2l6ZW9mKENvd09wZXJhdGlvblYzKSk7Cit9CisKK3N0YXRpYyBjb25zdGV4cHIgb2ZmX3QgR2V0RGF0YU9mZnNldChjb25zdCBDb3dIZWFkZXJWMyYgaGVhZGVyKSB7CisgICAgcmV0dXJuIEdldE9wT2Zmc2V0KGhlYWRlci5vcF9jb3VudF9tYXgsIGhlYWRlcik7Cit9CisKIHN0cnVjdCBDb3dGb290ZXIgewogICAgIENvd0Zvb3Rlck9wZXJhdGlvbiBvcDsKLSAgICBDb3dGb290ZXJEYXRhIGRhdGE7CisgICAgdWludDhfdCB1bnVzZWRbNjRdOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogc3RydWN0IFNjcmF0Y2hNZXRhZGF0YSB7CkBAIC0xODYsMTUgKzMzMiwzMCBAQAogLy8gMk1CIFNjcmF0Y2ggc3BhY2UgdXNlZCBmb3IgcmVhZC1haGVhZAogc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBCVUZGRVJfUkVHSU9OX0RFRkFVTFRfU0laRSA9ICgxVUxMIDw8IDIxKTsKIAotc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIENvd09wZXJhdGlvbiBjb25zdCYgYXJnKTsKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBDb3dPcGVyYXRpb25WMiBjb25zdCYgYXJnKTsKIAotaW50NjRfdCBHZXROZXh0T3BPZmZzZXQoY29uc3QgQ293T3BlcmF0aW9uJiBvcCwgdWludDMyX3QgY2x1c3Rlcl9zaXplKTsKLWludDY0X3QgR2V0TmV4dERhdGFPZmZzZXQoY29uc3QgQ293T3BlcmF0aW9uJiBvcCwgdWludDMyX3QgY2x1c3Rlcl9zaXplKTsKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBDb3dPcGVyYXRpb25WMyBjb25zdCYgYXJnKTsKKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIFJlc3VtZVBvaW50IGNvbnN0JiBhcmcpOworCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgQ293T3BlcmF0aW9uVHlwZSBjb3dfdHlwZSk7CisKK2ludDY0X3QgR2V0TmV4dE9wT2Zmc2V0KGNvbnN0IENvd09wZXJhdGlvblYyJiBvcCwgdWludDMyX3QgY2x1c3Rlcl9zaXplKTsKK2ludDY0X3QgR2V0TmV4dERhdGFPZmZzZXQoY29uc3QgQ293T3BlcmF0aW9uVjImIG9wLCB1aW50MzJfdCBjbHVzdGVyX3NpemUpOwogCiAvLyBPcHMgdGhhdCBhcmUgaW50ZXJuYWwgdG8gdGhlIENvdyBGb3JtYXQgYW5kIG5vdCBPVEEgZGF0YQogYm9vbCBJc01ldGFkYXRhT3AoY29uc3QgQ293T3BlcmF0aW9uJiBvcCk7CiAvLyBPcHMgdGhhdCBoYXZlIGRlcGVuZGVuY2llcyBvbiBvbGQgYmxvY2tzLCBhbmQgbXVzdCB0YWtlIGNhcmUgaW4gdGhlaXIgbWVyZ2Ugb3JkZXIKIGJvb2wgSXNPcmRlcmVkT3AoY29uc3QgQ293T3BlcmF0aW9uJiBvcCk7CiAKKy8vIENvbnZlcnQgY29tcHJlc3Npb24gbmFtZSB0byBpbnRlcm5hbCB2YWx1ZS4KK3N0ZDo6b3B0aW9uYWw8Q293Q29tcHJlc3Npb25BbGdvcml0aG0+IENvbXByZXNzaW9uQWxnb3JpdGhtRnJvbVN0cmluZyhzdGQ6OnN0cmluZ192aWV3IG5hbWUpOworCisvLyBSZXR1cm4gYmxvY2sgc2l6ZSB1c2VkIGZvciBjb21wcmVzc2lvbgorc2l6ZV90IENvd09wQ29tcHJlc3Npb25TaXplKGNvbnN0IENvd09wZXJhdGlvbiogb3AsIHNpemVfdCBibG9ja19zaXplKTsKKworLy8gUmV0dXJuIHRoZSByZWxhdGl2ZSBvZmZzZXQgb2YgdGhlIEkvTyBibG9jayB3aGljaCB0aGUgQ293T3BlcmF0aW9uCisvLyBtdWx0aS1ibG9jayBjb21wcmVzc2lvbgorYm9vbCBHZXRCbG9ja09mZnNldChjb25zdCBDb3dPcGVyYXRpb24qIG9wLCB1aW50NjRfdCBpb19ibG9jaywgc2l6ZV90IGJsb2NrX3NpemUsIG9mZl90KiBvZmZzZXQpOwogfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90CiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L2luY2x1ZGUvbGlic25hcHNob3QvY293X3JlYWRlci5oIGIvZnNfbWdyL2xpYnNuYXBzaG90L2luY2x1ZGUvbGlic25hcHNob3QvY293X3JlYWRlci5oCmluZGV4IGU4ZTRkNzIuLjMzODlmNTggMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9pbmNsdWRlL2xpYnNuYXBzaG90L2Nvd19yZWFkZXIuaAorKysgYi9mc19tZ3IvbGlic25hcHNob3QvaW5jbHVkZS9saWJzbmFwc2hvdC9jb3dfcmVhZGVyLmgKQEAgLTE2LDU1ICsxNiwzMiBAQAogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKLSNpbmNsdWRlIDxmdW5jdGlvbmFsPgogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxvcHRpb25hbD4KICNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KICNpbmNsdWRlIDxsaWJzbmFwc2hvdC9jb3dfZm9ybWF0Lmg+CiAKK25hbWVzcGFjZSBjaHJvbWVvc191cGRhdGVfZW5naW5lIHsKK2NsYXNzIEZpbGVEZXNjcmlwdG9yOworfSAgLy8gbmFtZXNwYWNlIGNocm9tZW9zX3VwZGF0ZV9lbmdpbmUKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHNuYXBzaG90IHsKIAogY2xhc3MgSUNvd09wSXRlcjsKIAotLy8gQSBCeXRlU2luayBvYmplY3QgaGFuZGxlcyByZXF1ZXN0cyBmb3IgYSBidWZmZXIgb2YgYSBzcGVjaWZpYyBzaXplLiBJdAotLy8gYWx3YXlzIG93bnMgdGhlIHVuZGVybHlpbmcgYnVmZmVyLiBJdCdzIGRlc2lnbmVkIHRvIG1pbmltaXplIHBvdGVudGlhbAotLy8gY29weWluZyBhcyB3ZSBwYXJzZSBvciBkZWNvbXByZXNzIHRoZSBDT1cuCi1jbGFzcyBJQnl0ZVNpbmsgewotICBwdWJsaWM6Ci0gICAgdmlydHVhbCB+SUJ5dGVTaW5rKCkge30KLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSByZWFkZXIgaGFzIGRhdGEuIFRoZSBzaXplIG9mIHRoZSByZXF1ZXN0IGlzIGdpdmVuLiBUaGUKLSAgICAvLyBzaW5rIG11c3QgcmV0dXJuIGEgdmFsaWQgcG9pbnRlciAob3IgbnVsbCBvbiBmYWlsdXJlKSwgYW5kIHJldHVybiB0aGUKLSAgICAvLyBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSB3cml0dGVuIHRvIHRoZSByZXR1cm5lZCBidWZmZXIuCi0gICAgLy8KLSAgICAvLyBUaGUgcmV0dXJuZWQgYnVmZmVyIGlzIG93bmVkIGJ5IElCeXRlU2luaywgYnV0IG11c3QgcmVtYWluIHZhbGlkIHVudGlsCi0gICAgLy8gdGhlIHJlYWQgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQgKG9yIHRoZSBlbnRpcmUgYnVmZmVyIGhhcyBiZWVuCi0gICAgLy8gY292ZXJlZCBieSBjYWxscyB0byBSZXR1cm5EYXRhKS4KLSAgICAvLwotICAgIC8vIEFmdGVyIGNhbGxpbmcgR2V0QnVmZmVyKCksIGFsbCBwcmV2aW91cyBidWZmZXJzIHJldHVybmVkIGFyZSBubyBsb25nZXIKLSAgICAvLyB2YWxpZC4KLSAgICAvLwotICAgIC8vIEdldEJ1ZmZlcigpIGlzIGludGVuZGVkIHRvIGJlIHNlcXVlbnRpYWwuIEEgcmV0dXJuZWQgc2l6ZSBvZiBOIGluZGljYXRlcwotICAgIC8vIHRoYXQgdGhlIG91dHB1dCBzdHJlYW0gd2lsbCBhZHZhbmNlIGJ5IE4gYnl0ZXMsIGFuZCB0aGUgUmV0dXJuRGF0YSBjYWxsCi0gICAgLy8gaW5kaWNhdGVzIHRoYXQgdGhvc2UgYnl0ZXMgaGF2ZSBiZWVuIGZ1bGZpbGxlZC4gVGhlcmVmb3JlLCBpdCBpcwotICAgIC8vIHBvc3NpYmxlIHRvIGhhdmUgUmV0dXJuQnVmZmVyIGRvIG5vdGhpbmcsIGlmIHRoZSBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0Ci0gICAgLy8gY2FyZSBhYm91dCBpbmNyZW1lbnRhbCB3cml0ZXMuCi0gICAgdmlydHVhbCB2b2lkKiBHZXRCdWZmZXIoc2l6ZV90IHJlcXVlc3RlZCwgc2l6ZV90KiBhY3R1YWwpID0gMDsKLQotICAgIC8vIENhbGxlZCB3aGVuIGEgc2VjdGlvbiByZXR1cm5lZCBieSB8R2V0QnVmZmVyfCBoYXMgYmVlbiBmaWxsZWQgd2l0aCBkYXRhLgotICAgIHZpcnR1YWwgYm9vbCBSZXR1cm5EYXRhKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgPSAwOwotfTsKLQogLy8gSW50ZXJmYWNlIGZvciByZWFkaW5nIGZyb20gYSBzbmFwdXNlcmQgQ09XLgogY2xhc3MgSUNvd1JlYWRlciB7CiAgIHB1YmxpYzoKKyAgICB1c2luZyBGaWxlRGVzY3JpcHRvciA9IGNocm9tZW9zX3VwZGF0ZV9lbmdpbmU6OkZpbGVEZXNjcmlwdG9yOworCiAgICAgdmlydHVhbCB+SUNvd1JlYWRlcigpIHt9CiAKICAgICAvLyBSZXR1cm4gdGhlIGZpbGUgaGVhZGVyLgotICAgIHZpcnR1YWwgYm9vbCBHZXRIZWFkZXIoQ293SGVhZGVyKiBoZWFkZXIpID0gMDsKKyAgICB2aXJ0dWFsIENvd0hlYWRlciYgR2V0SGVhZGVyKCkgPSAwOwogCiAgICAgLy8gUmV0dXJuIHRoZSBmaWxlIGZvb3Rlci4KICAgICB2aXJ0dWFsIGJvb2wgR2V0Rm9vdGVyKENvd0Zvb3RlciogZm9vdGVyKSA9IDA7CkBAIC04MywyOSArNjAsNTUgQEAKICAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxJQ293T3BJdGVyPiBHZXRNZXJnZU9wSXRlcihib29sIGlnbm9yZV9wcm9ncmVzcykgPSAwOwogCiAgICAgLy8gR2V0IGRlY29kZWQgYnl0ZXMgZnJvbSB0aGUgZGF0YSBzZWN0aW9uLCBoYW5kbGluZyBhbnkgZGVjb21wcmVzc2lvbi4KLSAgICAvLyBBbGwgcmV0cmlldmVkIGRhdGEgaXMgcGFzc2VkIHRvIHRoZSBzaW5rLgotICAgIHZpcnR1YWwgYm9vbCBSZWFkRGF0YShjb25zdCBDb3dPcGVyYXRpb24mIG9wLCBJQnl0ZVNpbmsqIHNpbmspID0gMDsKKyAgICAvLworICAgIC8vIElmIGlnbm9yZV9ieXRlcyBpcyBub24temVybywgaXQgc3BlY2lmaWVzIHRoZSBpbml0aWFsIG51bWJlciBvZiBieXRlcworICAgIC8vIHRvIHNraXAgd3JpdGluZyB0byB8YnVmZmVyfC4KKyAgICAvLworICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIHxidWZmZXJ8LCBvciAtMSBvbiBmYWlsdXJlLgorICAgIC8vIGVycm5vIGlzIE5PVCBzZXQuCisgICAgLy8KKyAgICAvLyBQYXJ0aWFsIHJlYWRzIGFyZSBub3QgcG9zc2libGUgdW5sZXNzIHxidWZmZXJfc2l6ZXwgaXMgbGVzcyB0aGFuIHRoZQorICAgIC8vIG9wZXJhdGlvbiBibG9jayBzaXplLgorICAgIC8vCisgICAgLy8gVGhlIG9wZXJhdGlvbiBwb2ludGVyIG11c3QgZGVyaXZlIGZyb20gSUNvd09wSXRlcjo6R2V0KCkuCisgICAgdmlydHVhbCBzc2l6ZV90IFJlYWREYXRhKGNvbnN0IENvd09wZXJhdGlvbiogb3AsIHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaWdub3JlX2J5dGVzID0gMCkgPSAwOworCisgICAgLy8gR2V0IHRoZSBhYnNvbHV0ZSBzb3VyY2Ugb2Zmc2V0LCBpbiBieXRlcywgb2YgYSBDb3dPcGVyYXRpb24uIFJldHVybnMKKyAgICAvLyBmYWxzZSBpZiB0aGUgb3BlcmF0aW9uIGRvZXMgbm90IHJlYWQgZnJvbSBzb3VyY2UgcGFydGl0aW9ucy4KKyAgICB2aXJ0dWFsIGJvb2wgR2V0U291cmNlT2Zmc2V0KGNvbnN0IENvd09wZXJhdGlvbiogb3AsIHVpbnQ2NF90KiBzb3VyY2Vfb2Zmc2V0KSA9IDA7CiB9OwogCi0vLyBJdGVyYXRlIG92ZXIgYSBzZXF1ZW5jZSBvZiBDT1cgb3BlcmF0aW9ucy4KK3N0YXRpYyBjb25zdGV4cHIgdWludDY0X3QgR2V0QmxvY2tGcm9tT2Zmc2V0KGNvbnN0IENvd0hlYWRlciYgaGVhZGVyLCB1aW50NjRfdCBvZmZzZXQpIHsKKyAgICByZXR1cm4gb2Zmc2V0IC8gaGVhZGVyLmJsb2NrX3NpemU7Cit9CisKK3N0YXRpYyBjb25zdGV4cHIgdWludDY0X3QgR2V0QmxvY2tSZWxhdGl2ZU9mZnNldChjb25zdCBDb3dIZWFkZXImIGhlYWRlciwgdWludDY0X3Qgb2Zmc2V0KSB7CisgICAgcmV0dXJuIG9mZnNldCAlIGhlYWRlci5ibG9ja19zaXplOworfQorCisvLyBJdGVyYXRlIG92ZXIgYSBzZXF1ZW5jZSBvZiBDT1cgb3BlcmF0aW9ucy4gVGhlIGl0ZXJhdG9yIGlzIGJpZGlyZWN0aW9uYWwuCiBjbGFzcyBJQ293T3BJdGVyIHsKICAgcHVibGljOgogICAgIHZpcnR1YWwgfklDb3dPcEl0ZXIoKSB7fQogCi0gICAgLy8gVHJ1ZSBpZiB0aGVyZSBhcmUgbm8gbW9yZSBpdGVtcyB0byByZWFkIGZvcndhcmQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICB2aXJ0dWFsIGJvb2wgRG9uZSgpID0gMDsKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGl0ZXJhdG9yIGlzIGF0IHRoZSBlbmQgb2YgdGhlIG9wZXJhdGlvbiBsaXN0LgorICAgIC8vIElmIHRydWUsIEdldCgpIGFuZCBOZXh0KCkgbXVzdCBub3QgYmUgY2FsbGVkLgorICAgIHZpcnR1YWwgYm9vbCBBdEVuZCgpID0gMDsKIAogICAgIC8vIFJlYWQgdGhlIGN1cnJlbnQgb3BlcmF0aW9uLgotICAgIHZpcnR1YWwgY29uc3QgQ293T3BlcmF0aW9uJiBHZXQoKSA9IDA7CisgICAgdmlydHVhbCBjb25zdCBDb3dPcGVyYXRpb24qIEdldCgpID0gMDsKIAogICAgIC8vIEFkdmFuY2UgdG8gdGhlIG5leHQgaXRlbS4KICAgICB2aXJ0dWFsIHZvaWQgTmV4dCgpID0gMDsKIAorICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgaXRlcmF0b3IgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgb3BlcmF0aW9uIGxpc3QuCisgICAgLy8gSWYgdHJ1ZSwgUHJldigpIG11c3Qgbm90IGJlIGNhbGxlZDsgR2V0KCkgaG93ZXZlciB3aWxsIGJlIHZhbGlkIGlmCisgICAgLy8gQXRFbmQoKSBpcyBub3QgdHJ1ZS4KKyAgICB2aXJ0dWFsIGJvb2wgQXRCZWdpbigpID0gMDsKKwogICAgIC8vIEFkdmFuY2UgdG8gdGhlIHByZXZpb3VzIGl0ZW0uCiAgICAgdmlydHVhbCB2b2lkIFByZXYoKSA9IDA7Ci0KLSAgICAvLyBUcnVlIGlmIHRoZXJlIGFyZSBubyBtb3JlIGl0ZW1zIHRvIHJlYWQgYmFja3dhcmRzLCBmYWxzZSBvdGhlcndpc2UKLSAgICB2aXJ0dWFsIGJvb2wgUkRvbmUoKSA9IDA7CiB9OwogCiBjbGFzcyBDb3dSZWFkZXIgZmluYWwgOiBwdWJsaWMgSUNvd1JlYWRlciB7CkBAIC0xMjQsMTIgKzEyNywxMSBAQAogICAgIGJvb2wgUGFyc2UoYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgZmQsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGxhYmVsID0ge30pOwogCiAgICAgYm9vbCBJbml0Rm9yTWVyZ2UoYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkJiYgZmQpOworCiAgICAgYm9vbCBWZXJpZnlNZXJnZU9wcygpIG92ZXJyaWRlOwotCi0gICAgYm9vbCBHZXRIZWFkZXIoQ293SGVhZGVyKiBoZWFkZXIpIG92ZXJyaWRlOwogICAgIGJvb2wgR2V0Rm9vdGVyKENvd0Zvb3RlciogZm9vdGVyKSBvdmVycmlkZTsKLQogICAgIGJvb2wgR2V0TGFzdExhYmVsKHVpbnQ2NF90KiBsYWJlbCkgb3ZlcnJpZGU7CisgICAgYm9vbCBHZXRTb3VyY2VPZmZzZXQoY29uc3QgQ293T3BlcmF0aW9uKiBvcCwgdWludDY0X3QqIHNvdXJjZV9vZmZzZXQpIG92ZXJyaWRlOwogCiAgICAgLy8gQ3JlYXRlIGEgQ293T3BJdGVyIG9iamVjdCB3aGljaCBjb250YWlucyBmb290ZXJfLm51bV9vcHMKICAgICAvLyBDb3dPcGVyYXRpb24gb2JqZWN0cy4gR2V0KCkgcmV0dXJucyBhIHVuaXF1ZSBDb3dPcGVyYXRpb24gb2JqZWN0CkBAIC0xMzksOCArMTQxLDEzIEBACiAgICAgc3RkOjp1bmlxdWVfcHRyPElDb3dPcEl0ZXI+IEdldFJldk1lcmdlT3BJdGVyKGJvb2wgaWdub3JlX3Byb2dyZXNzID0gZmFsc2UpIG92ZXJyaWRlOwogICAgIHN0ZDo6dW5pcXVlX3B0cjxJQ293T3BJdGVyPiBHZXRNZXJnZU9wSXRlcihib29sIGlnbm9yZV9wcm9ncmVzcyA9IGZhbHNlKSBvdmVycmlkZTsKIAotICAgIGJvb2wgUmVhZERhdGEoY29uc3QgQ293T3BlcmF0aW9uJiBvcCwgSUJ5dGVTaW5rKiBzaW5rKSBvdmVycmlkZTsKKyAgICBzc2l6ZV90IFJlYWREYXRhKGNvbnN0IENvd09wZXJhdGlvbiogb3AsIHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGlnbm9yZV9ieXRlcyA9IDApIG92ZXJyaWRlOwogCisgICAgQ293SGVhZGVyJiBHZXRIZWFkZXIoKSBvdmVycmlkZSB7IHJldHVybiBoZWFkZXJfOyB9CisgICAgY29uc3QgQ293SGVhZGVyVjMmIGhlYWRlcl92MygpIGNvbnN0IHsgcmV0dXJuIGhlYWRlcl87IH0KKworICAgIGJvb2wgR2V0UmF3Qnl0ZXMoY29uc3QgQ293T3BlcmF0aW9uKiBvcCwgdm9pZCogYnVmZmVyLCBzaXplX3QgbGVuLCBzaXplX3QqIHJlYWQpOwogICAgIGJvb2wgR2V0UmF3Qnl0ZXModWludDY0X3Qgb2Zmc2V0LCB2b2lkKiBidWZmZXIsIHNpemVfdCBsZW4sIHNpemVfdCogcmVhZCk7CiAKICAgICAvLyBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgZGF0YSBvcHMgdGhhdCBzaG91bGQgYmUgbWVyZ2VkLiBUaGlzIGlzIHRoZQpAQCAtMTU2LDE2ICsxNjMsMjYgQEAKICAgICAvLyBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIGN1cnJlbnQgQ293UmVhZGVyIHdpdGhvdXQgdGhlIGZpbGUgaGFuZGxlcnMKICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q293UmVhZGVyPiBDbG9uZUNvd1JlYWRlcigpOwogCisgICAgLy8gR2V0IHRoZSBtYXggY29tcHJlc3Npb24gc2l6ZQorICAgIHVpbnQzMl90IEdldE1heENvbXByZXNzaW9uU2l6ZSgpOworCiAgICAgdm9pZCBVcGRhdGVNZXJnZU9wc0NvbXBsZXRlZChpbnQgbnVtX21lcmdlX29wcykgeyBoZWFkZXJfLm51bV9tZXJnZV9vcHMgKz0gbnVtX21lcmdlX29wczsgfQogCiAgIHByaXZhdGU6Ci0gICAgYm9vbCBQYXJzZU9wcyhzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBsYWJlbCk7CisgICAgYm9vbCBQYXJzZVYyKGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIGZkLCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBsYWJlbCk7CiAgICAgYm9vbCBQcmVwTWVyZ2VPcHMoKTsKKyAgICAvLyBzZXF1ZW5jZSBkYXRhIGlzIHN0b3JlZCBhcyBhbiBvcGVyYXRpb24gd2l0aCBhY3R1YWwgZGF0YSByZXNpZGluZyBpbiB0aGUgZGF0YSBvZmZzZXQuCisgICAgYm9vbCBHZXRTZXF1ZW5jZURhdGFWMihzdGQ6OnZlY3Rvcjx1aW50MzJfdD4qIG1lcmdlX29wX2Jsb2Nrcywgc3RkOjp2ZWN0b3I8aW50Piogb3RoZXJfb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQzMl90LCBpbnQ+KiBibG9ja19tYXApOworICAgIC8vIHYzIG9mIHRoZSBjb3cgd3JpdGVzIHNlcXVlbmNlIGRhdGEgd2l0aGluIGl0cyBvd24gc2VwYXJhdGUgc2VxdWVuY2UgYnVmZmVyLgorICAgIGJvb2wgR2V0U2VxdWVuY2VEYXRhKHN0ZDo6dmVjdG9yPHVpbnQzMl90PiogbWVyZ2Vfb3BfYmxvY2tzLCBzdGQ6OnZlY3RvcjxpbnQ+KiBvdGhlcl9vcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQzMl90LCBpbnQ+KiBibG9ja19tYXApOwogICAgIHVpbnQ2NF90IEZpbmROdW1Db3B5b3BzKCk7CisgICAgdWludDhfdCBHZXRDb21wcmVzc2lvblR5cGUoKTsKIAogICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBvd25lZF9mZF87CiAgICAgYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgZmRfOwotICAgIENvd0hlYWRlciBoZWFkZXJfOworICAgIENvd0hlYWRlclYzIGhlYWRlcl87CiAgICAgc3RkOjpvcHRpb25hbDxDb3dGb290ZXI+IGZvb3Rlcl87CiAgICAgdWludDY0X3QgZmRfc2l6ZV87CiAgICAgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gbGFzdF9sYWJlbF87CkBAIC0xNzUsMTAgKzE5MiwxNCBAQAogICAgIHVpbnQ2NF90IG51bV90b3RhbF9kYXRhX29wc197fTsKICAgICB1aW50NjRfdCBudW1fb3JkZXJlZF9vcHNfdG9fbWVyZ2Vfe307CiAgICAgYm9vbCBoYXNfc2VxX29wc197fTsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCB1aW50NjRfdD4+IGRhdGFfbG9jXzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCB1aW50NjRfdD4+IHhvcl9kYXRhX2xvY187CiAgICAgUmVhZGVyRmxhZ3MgcmVhZGVyX2ZsYWdfOwogICAgIGJvb2wgaXNfbWVyZ2Vfe307CiB9OwogCisvLyBUaG91Z2ggdGhpcyBmdW5jdGlvbiB0YWtlcyBpbiBhIENvd0hlYWRlclYzLCB0aGUgc3RydWN0IGNvdWxkIGJlIHBvcHVsYXRlZCBhcyBhIHYxL3YyIENvd0hlYWRlci4KKy8vIFRoZSBleHRyYSBmaWVsZHMgd2lsbCBqdXN0IGJlIGZpbGxlZCBhcyAwLiBWMyBoZWFkZXIgaXMgc3RyaWN0bHkgYSBzdXBlcnNldCBvZiB2MS92MiBoZWFkZXIgYW5kCisvLyBjb250YWlucyBhbGwgb2YgdGhlIGxhdHRlcidzIGZpZWxkCitib29sIFJlYWRDb3dIZWFkZXIoYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgZmQsIENvd0hlYWRlclYzKiBoZWFkZXIpOwogfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90CiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L2luY2x1ZGUvbGlic25hcHNob3QvY293X3dyaXRlci5oIGIvZnNfbWdyL2xpYnNuYXBzaG90L2luY2x1ZGUvbGlic25hcHNob3QvY293X3dyaXRlci5oCmluZGV4IGM3YjgzYTguLjJjNmVlZmIgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9pbmNsdWRlL2xpYnNuYXBzaG90L2Nvd193cml0ZXIuaAorKysgYi9mc19tZ3IvbGlic25hcHNob3QvaW5jbHVkZS9saWJzbmFwc2hvdC9jb3dfd3JpdGVyLmgKQEAgLTEsMzEgKzEsMzAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLyBjb3B5cmlnaHQgKGMpIDIwMTkgdGhlIGFuZHJvaWQgb3BlbiBzb3VyY2UgcHJvamVjdAogLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyBsaWNlbnNlZCB1bmRlciB0aGUgYXBhY2hlIGxpY2Vuc2UsIHZlcnNpb24gMi4wICh0aGUgImxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgbGljZW5zZS4KKy8vIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgbGljZW5zZSBhdAogLy8KLS8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9saWNlbnNlLTIuMAogLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIGxpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gImFzIGlzIiBiYXNpcywKKy8vIHdpdGhvdXQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIGFueSBraW5kLCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gc2VlIHRoZSBsaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIGxpY2Vuc2UuCiAKICNwcmFnbWEgb25jZQogCisjaW5jbHVkZSA8bGlic25hcHNob3QvY293X2NvbXByZXNzLmg+CisKICNpbmNsdWRlIDxzdGRpbnQuaD4KIAogI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KICNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGZ1dHVyZT4KICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8bXV0ZXg+CiAjaW5jbHVkZSA8b3B0aW9uYWw+CiAjaW5jbHVkZSA8cXVldWU+CiAjaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHRocmVhZD4KLSNpbmNsdWRlIDx1dGlsaXR5PgogI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KQEAgLTM0LDcgKzMzLDEwIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBzbmFwc2hvdCB7Ci0KK3N0cnVjdCBDb3dTaXplSW5mbyB7CisgICAgdWludDY0X3QgY293X3NpemU7CisgICAgdWludDY0X3Qgb3BfY291bnRfbWF4OworfTsKIHN0cnVjdCBDb3dPcHRpb25zIHsKICAgICB1aW50MzJfdCBibG9ja19zaXplID0gNDA5NjsKICAgICBzdGQ6OnN0cmluZyBjb21wcmVzc2lvbjsKQEAgLTQzLDcgKzQ1LDcgQEAKICAgICBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBtYXhfYmxvY2tzOwogCiAgICAgLy8gTnVtYmVyIG9mIENvd09wZXJhdGlvbnMgaW4gYSBjbHVzdGVyLiAwIGZvciBubyBjbHVzdGVyaW5nLiBDYW5ub3QgYmUgMS4KLSAgICB1aW50MzJfdCBjbHVzdGVyX29wcyA9IDIwMDsKKyAgICB1aW50MzJfdCBjbHVzdGVyX29wcyA9IDEwMjQ7CiAKICAgICBib29sIHNjcmF0Y2hfc3BhY2UgPSB0cnVlOwogCkBAIC01MSwxOTYgKzUzLDExNSBAQAogICAgIHVpbnQ2NF90IG51bV9tZXJnZV9vcHMgPSAwOwogCiAgICAgLy8gTnVtYmVyIG9mIHRocmVhZHMgZm9yIGNvbXByZXNzaW9uCi0gICAgaW50IG51bV9jb21wcmVzc190aHJlYWRzID0gMDsKKyAgICB1aW50MTZfdCBudW1fY29tcHJlc3NfdGhyZWFkcyA9IDA7CiAKICAgICAvLyBCYXRjaCB3cml0ZSBjbHVzdGVyIG9wcwogICAgIGJvb2wgYmF0Y2hfd3JpdGUgPSBmYWxzZTsKKworICAgIC8vIFNpemUgb2YgdGhlIGNvdyBvcGVyYXRpb24gYnVmZmVyOyB1c2VkIGluIHYzIG9ubHkuCisgICAgdWludDY0X3Qgb3BfY291bnRfbWF4ID0gMDsKKworICAgIC8vIENvbXByZXNzaW9uIGZhY3RvcgorICAgIHVpbnQ2NF90IGNvbXByZXNzaW9uX2ZhY3RvciA9IDQwOTY7CiB9OwogCiAvLyBJbnRlcmZhY2UgZm9yIHdyaXRpbmcgdG8gYSBzbmFwdXNlcmQgQ09XLiBBbGwgb3BlcmF0aW9ucyBhcmUgb3JkZXJlZDsgbWVyZ2VzCiAvLyB3aWxsIG9jY3VyIGluIHRoZSBzZXF1ZW5jZSB0aGV5IHdlcmUgYWRkZWQgdG8gdGhlIENPVy4KIGNsYXNzIElDb3dXcml0ZXIgewogICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgSUNvd1dyaXRlcihjb25zdCBDb3dPcHRpb25zJiBvcHRpb25zKSA6IG9wdGlvbnNfKG9wdGlvbnMpIHt9CisgICAgdXNpbmcgRmlsZURlc2NyaXB0b3IgPSBjaHJvbWVvc191cGRhdGVfZW5naW5lOjpGaWxlRGVzY3JpcHRvcjsKIAogICAgIHZpcnR1YWwgfklDb3dXcml0ZXIoKSB7fQogCiAgICAgLy8gRW5jb2RlIGFuIG9wZXJhdGlvbiB0aGF0IGNvcGllcyB0aGUgY29udGVudHMgb2YgfG9sZF9ibG9ja3wgdG8gdGhlCiAgICAgLy8gbG9jYXRpb24gb2YgfG5ld19ibG9ja3wuICdudW1fYmxvY2tzJyBpcyB0aGUgbnVtYmVyIG9mIGNvbnRpZ3VvdXMKICAgICAvLyBDT1BZIG9wZXJhdGlvbnMgZnJvbSB8b2xkX2Jsb2NrfCB0byB8bmV3X2Jsb2NrfC4KLSAgICBib29sIEFkZENvcHkodWludDY0X3QgbmV3X2Jsb2NrLCB1aW50NjRfdCBvbGRfYmxvY2ssIHVpbnQ2NF90IG51bV9ibG9ja3MgPSAxKTsKKyAgICB2aXJ0dWFsIGJvb2wgQWRkQ29weSh1aW50NjRfdCBuZXdfYmxvY2ssIHVpbnQ2NF90IG9sZF9ibG9jaywgdWludDY0X3QgbnVtX2Jsb2NrcyA9IDEpID0gMDsKIAogICAgIC8vIEVuY29kZSBhIHNlcXVlbmNlIG9mIHJhdyBibG9ja3MuIHxzaXplfCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUuCi0gICAgYm9vbCBBZGRSYXdCbG9ja3ModWludDY0X3QgbmV3X2Jsb2NrX3N0YXJ0LCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgdmlydHVhbCBib29sIEFkZFJhd0Jsb2Nrcyh1aW50NjRfdCBuZXdfYmxvY2tfc3RhcnQsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKSA9IDA7CiAKICAgICAvLyBBZGQgYSBzZXF1ZW5jZSBvZiB4b3InZCBibG9ja3MuIHxzaXplfCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUuCi0gICAgYm9vbCBBZGRYb3JCbG9ja3ModWludDMyX3QgbmV3X2Jsb2NrX3N0YXJ0LCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSwgdWludDMyX3Qgb2xkX2Jsb2NrLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG9mZnNldCk7CisgICAgdmlydHVhbCBib29sIEFkZFhvckJsb2Nrcyh1aW50MzJfdCBuZXdfYmxvY2tfc3RhcnQsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2xkX2Jsb2NrLCB1aW50MTZfdCBvZmZzZXQpID0gMDsKIAogICAgIC8vIEVuY29kZSBhIHNlcXVlbmNlIG9mIHplcm9lZCBibG9ja3MuIHxzaXplfCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUuCi0gICAgYm9vbCBBZGRaZXJvQmxvY2tzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgdWludDY0X3QgbnVtX2Jsb2Nrcyk7CisgICAgdmlydHVhbCBib29sIEFkZFplcm9CbG9ja3ModWludDY0X3QgbmV3X2Jsb2NrX3N0YXJ0LCB1aW50NjRfdCBudW1fYmxvY2tzKSA9IDA7CiAKICAgICAvLyBBZGQgYSBsYWJlbCB0byB0aGUgb3Agc2VxdWVuY2UuCi0gICAgYm9vbCBBZGRMYWJlbCh1aW50NjRfdCBsYWJlbCk7CisgICAgdmlydHVhbCBib29sIEFkZExhYmVsKHVpbnQ2NF90IGxhYmVsKSA9IDA7CiAKICAgICAvLyBBZGQgc2VxdWVuY2UgZGF0YSBmb3Igb3AgbWVyZ2luZy4gRGF0YSBpcyBhIGxpc3Qgb2YgdGhlIGRlc3RpbmF0aW9uIGJsb2NrIG51bWJlcnMuCi0gICAgYm9vbCBBZGRTZXF1ZW5jZURhdGEoc2l6ZV90IG51bV9vcHMsIGNvbnN0IHVpbnQzMl90KiBkYXRhKTsKKyAgICB2aXJ0dWFsIGJvb2wgQWRkU2VxdWVuY2VEYXRhKHNpemVfdCBudW1fb3BzLCBjb25zdCB1aW50MzJfdCogZGF0YSkgPSAwOwogCiAgICAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgd3JpdGVzLiBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBjbG9zaW5nIHRoZSB3cml0ZXIKICAgICAvLyB0byBlbnN1cmUgdGhhdCB0aGUgY29ycmVjdCBoZWFkZXJzIGFuZCBmb290ZXJzIGFyZSB3cml0dGVuLgogICAgIHZpcnR1YWwgYm9vbCBGaW5hbGl6ZSgpID0gMDsKIAotICAgIC8vIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgdGhlIGNvdyBpbWFnZSBvY2N1cGllcyBvbiBkaXNrLgotICAgIHZpcnR1YWwgdWludDY0X3QgR2V0Q293U2l6ZSgpID0gMDsKKyAgICAvLyBSZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHRoZSBjb3cgaW1hZ2Ugb2NjdXBpZXMgb24gZGlzayArIHRoZSBzaXplIG9mIHNlcXVlbmNlICYmIG9wcyBidWZmZXIKKyAgICAvLyBUaGUgbGF0dGVyIHR3byBmaWVsZHMgYXJlIHVzZWQgaW4gdjMgY293IGZvcm1hdCBhbmQgbGVmdCBhcyAwIGZvciB2MiBjb3cgZm9ybWF0CisgICAgdmlydHVhbCBDb3dTaXplSW5mbyBHZXRDb3dTaXplSW5mbygpIGNvbnN0ID0gMDsKIAotICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBBZGRDb3B5KCkgb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgYm9vbCBTdXBwb3J0c0NvcHlPcGVyYXRpb24oKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgICAgdmlydHVhbCB1aW50MzJfdCBHZXRCbG9ja1NpemUoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzdGQ6Om9wdGlvbmFsPHVpbnQzMl90PiBHZXRNYXhCbG9ja3MoKSBjb25zdCA9IDA7CiAKLSAgICBjb25zdCBDb3dPcHRpb25zJiBvcHRpb25zKCkgeyByZXR1cm4gb3B0aW9uc187IH0KKyAgICAvLyBPcGVuIGFuIElDb3dSZWFkZXIgZm9yIHRoaXMgd3JpdGVyLiBUaGUgcmVhZGVyIHdpbGwgYmUgYSBzbmFwc2hvdCBvZiB0aGUKKyAgICAvLyBjdXJyZW50IG9wZXJhdGlvbnMgaW4gdGhlIHdyaXRlcjsgbmV3IHdyaXRlcyBhZnRlciBPcGVuUmVhZGVyKCkgd2lsbCBub3QKKyAgICAvLyBiZSByZWZsZWN0ZWQuCisgICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8SUNvd1JlYWRlcj4gT3BlblJlYWRlcigpID0gMDsKIAotICBwcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBib29sIEVtaXRDb3B5KHVpbnQ2NF90IG5ld19ibG9jaywgdWludDY0X3Qgb2xkX2Jsb2NrLCB1aW50NjRfdCBudW1fYmxvY2tzID0gMSkgPSAwOwotICAgIHZpcnR1YWwgYm9vbCBFbWl0UmF3QmxvY2tzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpID0gMDsKLSAgICB2aXJ0dWFsIGJvb2wgRW1pdFhvckJsb2Nrcyh1aW50MzJfdCBuZXdfYmxvY2tfc3RhcnQsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9sZF9ibG9jaywgdWludDE2X3Qgb2Zmc2V0KSA9IDA7Ci0gICAgdmlydHVhbCBib29sIEVtaXRaZXJvQmxvY2tzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgdWludDY0X3QgbnVtX2Jsb2NrcykgPSAwOwotICAgIHZpcnR1YWwgYm9vbCBFbWl0TGFiZWwodWludDY0X3QgbGFiZWwpID0gMDsKLSAgICB2aXJ0dWFsIGJvb2wgRW1pdFNlcXVlbmNlRGF0YShzaXplX3QgbnVtX29wcywgY29uc3QgdWludDMyX3QqIGRhdGEpID0gMDsKLQotICAgIGJvb2wgVmFsaWRhdGVOZXdCbG9jayh1aW50NjRfdCBuZXdfYmxvY2spOwotCi0gIHByb3RlY3RlZDoKLSAgICBDb3dPcHRpb25zIG9wdGlvbnNfOworICAgIC8vIE9wZW4gYSBmaWxlIGRlc2NyaXB0b3IuIFRoaXMgYWxsb3dzIHJlYWRpbmcgYW5kIHNlZWluZyB0aHJvdWdoIHRoZSBjb3cKKyAgICAvLyBhcyBpZiBpdCB3ZXJlIGEgbm9ybWFsIGZpbGUuIFRoZSBvcHRpb25hbCBzb3VyY2VfZGV2aWNlIG11c3QgYmUgYSB2YWxpZAorICAgIC8vIHBhdGggaWYgdGhlIENvd1JlYWRlciBjb250YWlucyBhbnkgY29weSBvciB4b3Igb3BlcmF0aW9ucy4KKyAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxGaWxlRGVzY3JpcHRvcj4gT3BlbkZpbGVEZXNjcmlwdG9yKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4mIHNvdXJjZV9kZXZpY2UpID0gMDsKIH07CiAKIGNsYXNzIENvbXByZXNzV29ya2VyIHsKICAgcHVibGljOgotICAgIENvbXByZXNzV29ya2VyKENvd0NvbXByZXNzaW9uQWxnb3JpdGhtIGNvbXByZXNzaW9uLCB1aW50MzJfdCBibG9ja19zaXplKTsKKyAgICBDb21wcmVzc1dvcmtlcihzdGQ6OnVuaXF1ZV9wdHI8SUNvbXByZXNzb3I+JiYgY29tcHJlc3Nvcik7CiAgICAgYm9vbCBSdW5UaHJlYWQoKTsKLSAgICB2b2lkIEVucXVldWVDb21wcmVzc0Jsb2Nrcyhjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBudW1fYmxvY2tzKTsKLSAgICBib29sIEdldENvbXByZXNzZWRCdWZmZXJzKHN0ZDo6dmVjdG9yPHN0ZDo6YmFzaWNfc3RyaW5nPHVpbnQ4X3Q+PiogY29tcHJlc3NlZF9idWYpOworICAgIHZvaWQgRW5xdWV1ZUNvbXByZXNzQmxvY2tzKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGJsb2NrX3NpemUsIHNpemVfdCBudW1fYmxvY2tzKTsKKyAgICBib29sIEdldENvbXByZXNzZWRCdWZmZXJzKHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiogY29tcHJlc3NlZF9idWYpOwogICAgIHZvaWQgRmluYWxpemUoKTsKLSAgICBzdGF0aWMgc3RkOjpiYXNpY19zdHJpbmc8dWludDhfdD4gQ29tcHJlc3MoQ293Q29tcHJlc3Npb25BbGdvcml0aG0gY29tcHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBsZW5ndGgpOworICAgIHN0YXRpYyB1aW50MzJfdCBHZXREZWZhdWx0Q29tcHJlc3Npb25MZXZlbChDb3dDb21wcmVzc2lvbkFsZ29yaXRobSBjb21wcmVzc2lvbik7CiAKLSAgICBzdGF0aWMgYm9vbCBDb21wcmVzc0Jsb2NrcyhDb3dDb21wcmVzc2lvbkFsZ29yaXRobSBjb21wcmVzc2lvbiwgc2l6ZV90IGJsb2NrX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3QgbnVtX2Jsb2NrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OmJhc2ljX3N0cmluZzx1aW50OF90Pj4qIGNvbXByZXNzZWRfZGF0YSk7CisgICAgc3RhdGljIGJvb2wgQ29tcHJlc3NCbG9ja3MoSUNvbXByZXNzb3IqIGNvbXByZXNzb3IsIHNpemVfdCBibG9ja19zaXplLCBjb25zdCB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bV9ibG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8dWludDhfdD4+KiBjb21wcmVzc2VkX2RhdGEpOwogCiAgIHByaXZhdGU6CiAgICAgc3RydWN0IENvbXByZXNzV29yayB7CiAgICAgICAgIGNvbnN0IHZvaWQqIGJ1ZmZlcjsKICAgICAgICAgc2l6ZV90IG51bV9ibG9ja3M7CisgICAgICAgIHNpemVfdCBibG9ja19zaXplOwogICAgICAgICBib29sIGNvbXByZXNzaW9uX3N0YXR1cyA9IGZhbHNlOwotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OmJhc2ljX3N0cmluZzx1aW50OF90Pj4gY29tcHJlc3NlZF9kYXRhOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gY29tcHJlc3NlZF9kYXRhOwogICAgIH07CiAKLSAgICBDb3dDb21wcmVzc2lvbkFsZ29yaXRobSBjb21wcmVzc2lvbl87Ci0gICAgdWludDMyX3QgYmxvY2tfc2l6ZV87CisgICAgc3RkOjp1bmlxdWVfcHRyPElDb21wcmVzc29yPiBjb21wcmVzc29yXzsKIAogICAgIHN0ZDo6cXVldWU8Q29tcHJlc3NXb3JrPiB3b3JrX3F1ZXVlXzsKICAgICBzdGQ6OnF1ZXVlPENvbXByZXNzV29yaz4gY29tcHJlc3NlZF9xdWV1ZV87CiAgICAgc3RkOjptdXRleCBsb2NrXzsKICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBjdl87CiAgICAgYm9vbCBzdG9wcGVkXyA9IGZhbHNlOworICAgIHNpemVfdCB0b3RhbF9zdWJtaXR0ZWRfID0gMDsKKyAgICBzaXplX3QgdG90YWxfcHJvY2Vzc2VkXyA9IDA7CiAKLSAgICBzdGQ6OmJhc2ljX3N0cmluZzx1aW50OF90PiBDb21wcmVzcyhjb25zdCB2b2lkKiBkYXRhLCBzaXplX3QgbGVuZ3RoKTsKLSAgICBib29sIENvbXByZXNzQmxvY2tzKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IG51bV9ibG9ja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OmJhc2ljX3N0cmluZzx1aW50OF90Pj4qIGNvbXByZXNzZWRfZGF0YSk7CisgICAgYm9vbCBDb21wcmVzc0Jsb2Nrcyhjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBudW1fYmxvY2tzLCBzaXplX3QgYmxvY2tfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiogY29tcHJlc3NlZF9kYXRhKTsKIH07CiAKLWNsYXNzIENvd1dyaXRlciA6IHB1YmxpYyBJQ293V3JpdGVyIHsKLSAgcHVibGljOgotICAgIGV4cGxpY2l0IENvd1dyaXRlcihjb25zdCBDb3dPcHRpb25zJiBvcHRpb25zKTsKLSAgICB+Q293V3JpdGVyKCk7CisvLyBDcmVhdGUgYW4gSUNvd1dyaXRlciBub3QgYmFja2VkIGJ5IGFueSBmaWxlLiBUaGlzIGlzIHVzZWZ1bCBmb3IgZXN0aW1hdGluZworLy8gdGhlIGZpbmFsIHNpemUgb2YgYSBjb3cgZmlsZS4KK3N0ZDo6dW5pcXVlX3B0cjxJQ293V3JpdGVyPiBDcmVhdGVDb3dFc3RpbWF0b3IodWludDMyX3QgdmVyc2lvbiwgY29uc3QgQ293T3B0aW9ucyYgb3B0aW9ucyk7CiAKLSAgICAvLyBTZXQgdXAgdGhlIHdyaXRlci4KLSAgICAvLyBUaGUgZmlsZSBzdGFydHMgZnJvbSB0aGUgYmVnaW5uaW5nLgotICAgIC8vCi0gICAgLy8gSWYgZmQgaXMgPCAwLCB0aGUgQ293V3JpdGVyIHdpbGwgYmUgb3BlbmVkIGFnYWluc3QgL2Rldi9udWxsLiBUaGlzIGlzIGZvcgotICAgIC8vIGNvbXB1dGluZyBDT1cgc2l6ZXMgd2l0aG91dCB1c2luZyBzdG9yYWdlIHNwYWNlLgotICAgIGJvb2wgSW5pdGlhbGl6ZShhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQmJiBmZCk7Ci0gICAgYm9vbCBJbml0aWFsaXplKGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIGZkKTsKLSAgICAvLyBTZXQgdXAgYSB3cml0ZXIsIGFzc3VtaW5nIHRoYXQgdGhlIGdpdmVuIGxhYmVsIGlzIHRoZSBsYXN0IHZhbGlkIGxhYmVsLgotICAgIC8vIFRoaXMgd2lsbCByZXN1bHQgaW4gZHJvcHBpbmcgYW55IGxhYmVscyB0aGF0IG9jY3VyIGFmdGVyIHRoZSBnaXZlbiBvbiwgYW5kIHdpbGwgZmFpbAotICAgIC8vIGlmIHRoZSBnaXZlbiBsYWJlbCBkb2VzIG5vdCBhcHBlYXIuCi0gICAgYm9vbCBJbml0aWFsaXplQXBwZW5kKGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCYmLCB1aW50NjRfdCBsYWJlbCk7Ci0gICAgYm9vbCBJbml0aWFsaXplQXBwZW5kKGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIGZkLCB1aW50NjRfdCBsYWJlbCk7Ci0KLSAgICBib29sIEZpbmFsaXplKCkgb3ZlcnJpZGU7Ci0KLSAgICB1aW50NjRfdCBHZXRDb3dTaXplKCkgb3ZlcnJpZGU7Ci0KLSAgICB1aW50MzJfdCBHZXRDb3dWZXJzaW9uKCkgeyByZXR1cm4gaGVhZGVyXy5tYWpvcl92ZXJzaW9uOyB9Ci0KLSAgcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgYm9vbCBFbWl0Q29weSh1aW50NjRfdCBuZXdfYmxvY2ssIHVpbnQ2NF90IG9sZF9ibG9jaywgdWludDY0X3QgbnVtX2Jsb2NrcyA9IDEpIG92ZXJyaWRlOwotICAgIHZpcnR1YWwgYm9vbCBFbWl0UmF3QmxvY2tzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOwotICAgIHZpcnR1YWwgYm9vbCBFbWl0WG9yQmxvY2tzKHVpbnQzMl90IG5ld19ibG9ja19zdGFydCwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2xkX2Jsb2NrLCB1aW50MTZfdCBvZmZzZXQpIG92ZXJyaWRlOwotICAgIHZpcnR1YWwgYm9vbCBFbWl0WmVyb0Jsb2Nrcyh1aW50NjRfdCBuZXdfYmxvY2tfc3RhcnQsIHVpbnQ2NF90IG51bV9ibG9ja3MpIG92ZXJyaWRlOwotICAgIHZpcnR1YWwgYm9vbCBFbWl0TGFiZWwodWludDY0X3QgbGFiZWwpIG92ZXJyaWRlOwotICAgIHZpcnR1YWwgYm9vbCBFbWl0U2VxdWVuY2VEYXRhKHNpemVfdCBudW1fb3BzLCBjb25zdCB1aW50MzJfdCogZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgcHJpdmF0ZToKLSAgICBib29sIEVtaXRDbHVzdGVyKCk7Ci0gICAgYm9vbCBFbWl0Q2x1c3RlcklmTmVlZGVkKCk7Ci0gICAgYm9vbCBFbWl0QmxvY2tzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUsIHVpbnQ2NF90IG9sZF9ibG9jaywKLSAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgb2Zmc2V0LCB1aW50OF90IHR5cGUpOwotICAgIHZvaWQgU2V0dXBIZWFkZXJzKCk7Ci0gICAgdm9pZCBTZXR1cFdyaXRlT3B0aW9ucygpOwotICAgIGJvb2wgUGFyc2VPcHRpb25zKCk7Ci0gICAgYm9vbCBPcGVuRm9yV3JpdGUoKTsKLSAgICBib29sIE9wZW5Gb3JBcHBlbmQodWludDY0X3QgbGFiZWwpOwotICAgIGJvb2wgR2V0RGF0YVBvcyh1aW50NjRfdCogcG9zKTsKLSAgICBib29sIFdyaXRlUmF3RGF0YShjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0gICAgYm9vbCBXcml0ZU9wZXJhdGlvbihjb25zdCBDb3dPcGVyYXRpb24mIG9wLCBjb25zdCB2b2lkKiBkYXRhID0gbnVsbHB0ciwgc2l6ZV90IHNpemUgPSAwKTsKLSAgICB2b2lkIEFkZE9wZXJhdGlvbihjb25zdCBDb3dPcGVyYXRpb24mIG9wKTsKLSAgICB2b2lkIEluaXRQb3MoKTsKLSAgICB2b2lkIEluaXRCYXRjaFdyaXRlcygpOwotICAgIHZvaWQgSW5pdFdvcmtlcnMoKTsKLSAgICBib29sIEZsdXNoQ2x1c3RlcigpOwotCi0gICAgYm9vbCBDb21wcmVzc0Jsb2NrcyhzaXplX3QgbnVtX2Jsb2NrcywgY29uc3Qgdm9pZCogZGF0YSk7Ci0gICAgYm9vbCBTZXRGZChhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBmZCk7Ci0gICAgYm9vbCBTeW5jKCk7Ci0gICAgYm9vbCBUcnVuY2F0ZShvZmZfdCBsZW5ndGgpOwotICAgIGJvb2wgRW5zdXJlU3BhY2VBdmFpbGFibGUoY29uc3QgdWludDY0X3QgYnl0ZXNfbmVlZGVkKSBjb25zdDsKLQotICBwcml2YXRlOgotICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBvd25lZF9mZF87Ci0gICAgYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgZmRfOwotICAgIENvd0hlYWRlciBoZWFkZXJfe307Ci0gICAgQ293Rm9vdGVyIGZvb3Rlcl97fTsKLSAgICBDb3dDb21wcmVzc2lvbkFsZ29yaXRobSBjb21wcmVzc2lvbl8gPSBrQ293Q29tcHJlc3NOb25lOwotICAgIHVpbnQ2NF90IGN1cnJlbnRfb3BfcG9zXyA9IDA7Ci0gICAgdWludDY0X3QgbmV4dF9vcF9wb3NfID0gMDsKLSAgICB1aW50NjRfdCBuZXh0X2RhdGFfcG9zXyA9IDA7Ci0gICAgdWludDY0X3QgY3VycmVudF9kYXRhX3Bvc18gPSAwOwotICAgIHNzaXplX3QgdG90YWxfZGF0YV93cml0dGVuXyA9IDA7Ci0gICAgdWludDMyX3QgY2x1c3Rlcl9zaXplXyA9IDA7Ci0gICAgdWludDMyX3QgY3VycmVudF9jbHVzdGVyX3NpemVfID0gMDsKLSAgICB1aW50NjRfdCBjdXJyZW50X2RhdGFfc2l6ZV8gPSAwOwotICAgIGJvb2wgaXNfZGV2X251bGxfID0gZmFsc2U7Ci0gICAgYm9vbCBtZXJnZV9pbl9wcm9ncmVzc18gPSBmYWxzZTsKLSAgICBib29sIGlzX2Jsb2NrX2RldmljZV8gPSBmYWxzZTsKLSAgICB1aW50NjRfdCBjb3dfaW1hZ2Vfc2l6ZV8gPSBJTlQ2NF9NQVg7Ci0KLSAgICBpbnQgbnVtX2NvbXByZXNzX3RocmVhZHNfID0gMTsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q29tcHJlc3NXb3JrZXI+PiBjb21wcmVzc190aHJlYWRzXzsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OmZ1dHVyZTxib29sPj4gdGhyZWFkc187Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjpiYXNpY19zdHJpbmc8dWludDhfdD4+IGNvbXByZXNzZWRfYnVmXzsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OmJhc2ljX3N0cmluZzx1aW50OF90Pj46Oml0ZXJhdG9yIGJ1Zl9pdGVyXzsKLQotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDb3dPcGVyYXRpb24+PiBvcGJ1ZmZlcl92ZWNfOwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+PiBkYXRhYnVmZmVyX3ZlY187Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHN0cnVjdCBpb3ZlY1tdPiBjb3dvcF92ZWNfOwotICAgIGludCBvcF92ZWNfaW5kZXhfID0gMDsKLQotICAgIHN0ZDo6dW5pcXVlX3B0cjxzdHJ1Y3QgaW92ZWNbXT4gZGF0YV92ZWNfOwotICAgIGludCBkYXRhX3ZlY19pbmRleF8gPSAwOwotICAgIGJvb2wgYmF0Y2hfd3JpdGVfID0gZmFsc2U7Ci19OworLy8gQ3JlYXRlIGFuIElDb3dXcml0ZXIgb2YgdGhlIGdpdmVuIHZlcnNpb24gYW5kIG9wdGlvbnMuIElmIGEgbGFiZWwgaXMgZ2l2ZW4sCisvLyB0aGUgd3JpdGVyIGlzIG9wZW5lZCBpbiBhcHBlbmQgbW9kZS4KK3N0ZDo6dW5pcXVlX3B0cjxJQ293V3JpdGVyPiBDcmVhdGVDb3dXcml0ZXIodWludDMyX3QgdmVyc2lvbiwgY29uc3QgQ293T3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkJiYgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGxhYmVsID0ge30pOwogCiB9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3QvaW5jbHVkZS9saWJzbmFwc2hvdC9tb2NrX2Nvd193cml0ZXIuaCBiL2ZzX21nci9saWJzbmFwc2hvdC9pbmNsdWRlL2xpYnNuYXBzaG90L21vY2tfY293X3dyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0OTFmYjAKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGlic25hcHNob3QvaW5jbHVkZS9saWJzbmFwc2hvdC9tb2NrX2Nvd193cml0ZXIuaApAQCAtMCwwICsxLDQ0IEBACisvLworLy8gQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisvLworCisjaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KKyNpbmNsdWRlIDxsaWJzbmFwc2hvdC9jb3dfd3JpdGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkOjpzbmFwc2hvdCB7CisKK2NsYXNzIE1vY2tDb3dXcml0ZXIgOiBwdWJsaWMgSUNvd1dyaXRlciB7CisgIHB1YmxpYzoKKyAgICB1c2luZyBGaWxlRGVzY3JpcHRvciA9IGNocm9tZW9zX3VwZGF0ZV9lbmdpbmU6OkZpbGVEZXNjcmlwdG9yOworCisgICAgTU9DS19NRVRIT0QoYm9vbCwgRmluYWxpemUsICgpLCAob3ZlcnJpZGUpKTsKKyAgICBNT0NLX01FVEhPRChDb3dTaXplSW5mbywgR2V0Q293U2l6ZUluZm8sICgpLCAoY29uc3QsIG92ZXJyaWRlKSk7CisKKyAgICBNT0NLX01FVEhPRChib29sLCBBZGRDb3B5LCAodWludDY0X3QsIHVpbnQ2NF90LCB1aW50NjRfdCksIChvdmVycmlkZSkpOworICAgIE1PQ0tfTUVUSE9EKGJvb2wsIEFkZFJhd0Jsb2NrcywgKHVpbnQ2NF90LCBjb25zdCB2b2lkKiwgc2l6ZV90KSwgKG92ZXJyaWRlKSk7CisgICAgTU9DS19NRVRIT0QoYm9vbCwgQWRkWG9yQmxvY2tzLCAodWludDMyX3QsIGNvbnN0IHZvaWQqLCBzaXplX3QsIHVpbnQzMl90LCB1aW50MTZfdCksCisgICAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7CisgICAgTU9DS19NRVRIT0QoYm9vbCwgQWRkWmVyb0Jsb2NrcywgKHVpbnQ2NF90LCB1aW50NjRfdCksIChvdmVycmlkZSkpOworICAgIE1PQ0tfTUVUSE9EKGJvb2wsIEFkZExhYmVsLCAodWludDY0X3QpLCAob3ZlcnJpZGUpKTsKKyAgICBNT0NLX01FVEhPRChib29sLCBBZGRTZXF1ZW5jZURhdGEsIChzaXplX3QsIGNvbnN0IHVpbnQzMl90KiksIChvdmVycmlkZSkpOworICAgIE1PQ0tfTUVUSE9EKHVpbnQzMl90LCBHZXRCbG9ja1NpemUsICgpLCAob3ZlcnJpZGUsIGNvbnN0KSk7CisgICAgTU9DS19NRVRIT0Qoc3RkOjpvcHRpb25hbDx1aW50MzJfdD4sIEdldE1heEJsb2NrcywgKCksIChvdmVycmlkZSwgY29uc3QpKTsKKworICAgIE1PQ0tfTUVUSE9EKHN0ZDo6dW5pcXVlX3B0cjxJQ293UmVhZGVyPiwgT3BlblJlYWRlciwgKCksIChvdmVycmlkZSkpOworICAgIE1PQ0tfTUVUSE9EKHN0ZDo6dW5pcXVlX3B0cjxGaWxlRGVzY3JpcHRvcj4sIE9wZW5GaWxlRGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4mKSwgKG92ZXJyaWRlKSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZDo6c25hcHNob3QKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9pbmNsdWRlL2xpYnNuYXBzaG90L21vY2tfZGV2aWNlX2luZm8uaCBiL2ZzX21nci9saWJzbmFwc2hvdC9pbmNsdWRlL2xpYnNuYXBzaG90L21vY2tfZGV2aWNlX2luZm8uaAppbmRleCA1NzNhODViLi5jYTFhYzFlIDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3QvaW5jbHVkZS9saWJzbmFwc2hvdC9tb2NrX2RldmljZV9pbmZvLmgKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L2luY2x1ZGUvbGlic25hcHNob3QvbW9ja19kZXZpY2VfaW5mby5oCkBAIC0yOSw2ICsyOSw3IEBACiAgICAgTU9DS19NRVRIT0QoY29uc3QgYW5kcm9pZDo6ZnNfbWdyOjpJUGFydGl0aW9uT3BlbmVyJiwgR2V0UGFydGl0aW9uT3BlbmVyLCAoKSwgKGNvbnN0KSk7CiAgICAgTU9DS19NRVRIT0QoYm9vbCwgSXNPdmVybGF5ZnNTZXR1cCwgKCksIChjb25zdCwgb3ZlcnJpZGUpKTsKICAgICBNT0NLX01FVEhPRChib29sLCBTZXRCb290Q29udHJvbE1lcmdlU3RhdHVzLCAoTWVyZ2VTdGF0dXMgc3RhdHVzKSwgKG92ZXJyaWRlKSk7CisgICAgTU9DS19NRVRIT0QoYm9vbCwgU2V0QWN0aXZlQm9vdFNsb3QsICh1bnNpZ25lZCBpbnQgc2xvdCksIChvdmVycmlkZSkpOwogICAgIE1PQ0tfTUVUSE9EKGJvb2wsIFNldFNsb3RBc1VuYm9vdGFibGUsICh1bnNpZ25lZCBpbnQgc2xvdCksIChvdmVycmlkZSkpOwogICAgIE1PQ0tfTUVUSE9EKGJvb2wsIElzUmVjb3ZlcnksICgpLCAoY29uc3QsIG92ZXJyaWRlKSk7CiAgICAgTU9DS19NRVRIT0QoYm9vbCwgSXNGaXJzdFN0YWdlSW5pdCwgKCksIChjb25zdCwgb3ZlcnJpZGUpKTsKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9pbmNsdWRlL2xpYnNuYXBzaG90L21vY2tfc25hcHNob3QuaCBiL2ZzX21nci9saWJzbmFwc2hvdC9pbmNsdWRlL2xpYnNuYXBzaG90L21vY2tfc25hcHNob3QuaAppbmRleCBkNDU4Yjg3Li5jYTQ1ZDJmIDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3QvaW5jbHVkZS9saWJzbmFwc2hvdC9tb2NrX3NuYXBzaG90LmgKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L2luY2x1ZGUvbGlic25hcHNob3QvbW9ja19zbmFwc2hvdC5oCkBAIC00Miw5ICs0Miw5IEBACiAgICAgICAgICAgICAgICAgKGNvbnN0IGFuZHJvaWQ6OmZzX21ncjo6Q3JlYXRlTG9naWNhbFBhcnRpdGlvblBhcmFtcyYgcGFyYW1zLAogICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogc25hcHNob3RfcGF0aCksCiAgICAgICAgICAgICAgICAgKG92ZXJyaWRlKSk7Ci0gICAgTU9DS19NRVRIT0Qoc3RkOjp1bmlxdWVfcHRyPElTbmFwc2hvdFdyaXRlcj4sIE9wZW5TbmFwc2hvdFdyaXRlciwKKyAgICBNT0NLX01FVEhPRChzdGQ6OnVuaXF1ZV9wdHI8SUNvd1dyaXRlcj4sIE9wZW5TbmFwc2hvdFdyaXRlciwKICAgICAgICAgICAgICAgICAoY29uc3QgYW5kcm9pZDo6ZnNfbWdyOjpDcmVhdGVMb2dpY2FsUGFydGl0aW9uUGFyYW1zJiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+JiksCisgICAgICAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+KSwKICAgICAgICAgICAgICAgICAob3ZlcnJpZGUpKTsKICAgICBNT0NLX01FVEhPRChib29sLCBVbm1hcFVwZGF0ZVNuYXBzaG90LCAoY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldF9wYXJ0aXRpb25fbmFtZSksIChvdmVycmlkZSkpOwogICAgIE1PQ0tfTUVUSE9EKGJvb2wsIE5lZWRTbmFwc2hvdHNJbkZpcnN0U3RhZ2VNb3VudCwgKCksIChvdmVycmlkZSkpOwpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L2luY2x1ZGUvbGlic25hcHNob3QvbW9ja19zbmFwc2hvdF93cml0ZXIuaCBiL2ZzX21nci9saWJzbmFwc2hvdC9pbmNsdWRlL2xpYnNuYXBzaG90L21vY2tfc25hcHNob3Rfd3JpdGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ODI4YmMuLjAwMDAwMDAKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L2luY2x1ZGUvbGlic25hcHNob3QvbW9ja19zbmFwc2hvdF93cml0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vCi0vLyBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLSNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgotI2luY2x1ZGUgPGxpYnNuYXBzaG90L3NuYXBzaG90X3dyaXRlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZDo6c25hcHNob3QgewotCi1jbGFzcyBNb2NrU25hcHNob3RXcml0ZXIgOiBwdWJsaWMgSVNuYXBzaG90V3JpdGVyIHsKLSAgcHVibGljOgotICAgIHVzaW5nIEZpbGVEZXNjcmlwdG9yID0gSVNuYXBzaG90V3JpdGVyOjpGaWxlRGVzY3JpcHRvcjsKLQotICAgIGV4cGxpY2l0IE1vY2tTbmFwc2hvdFdyaXRlcihjb25zdCBDb3dPcHRpb25zJiBvcHRpb25zKSA6IElTbmFwc2hvdFdyaXRlcihvcHRpb25zKSB7fQotICAgIE1vY2tTbmFwc2hvdFdyaXRlcigpIDogSVNuYXBzaG90V3JpdGVyKHt9KSB7fQotCi0gICAgTU9DS19NRVRIT0QoYm9vbCwgRmluYWxpemUsICgpLCAob3ZlcnJpZGUpKTsKLQotICAgIC8vIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgdGhlIGNvdyBpbWFnZSBvY2N1cGllcyBvbiBkaXNrLgotICAgIE1PQ0tfTUVUSE9EKHVpbnQ2NF90LCBHZXRDb3dTaXplLCAoKSwgKG92ZXJyaWRlKSk7Ci0KLSAgICAvLyBSZXR1cm5zIHRydWUgaWYgQWRkQ29weSgpIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KLSAgICBNT0NLX01FVEhPRChib29sLCBTdXBwb3J0c0NvcHlPcGVyYXRpb24sICgpLCAoY29uc3Qgb3ZlcnJpZGUpKTsKLQotICAgIE1PQ0tfTUVUSE9EKGJvb2wsIEVtaXRDb3B5LCAodWludDY0X3QsIHVpbnQ2NF90LCB1aW50NjRfdCksIChvdmVycmlkZSkpOwotICAgIE1PQ0tfTUVUSE9EKGJvb2wsIEVtaXRSYXdCbG9ja3MsICh1aW50NjRfdCwgY29uc3Qgdm9pZCosIHNpemVfdCksIChvdmVycmlkZSkpOwotICAgIE1PQ0tfTUVUSE9EKGJvb2wsIEVtaXRYb3JCbG9ja3MsICh1aW50MzJfdCwgY29uc3Qgdm9pZCosIHNpemVfdCwgdWludDMyX3QsIHVpbnQxNl90KSwKLSAgICAgICAgICAgICAgICAob3ZlcnJpZGUpKTsKLSAgICBNT0NLX01FVEhPRChib29sLCBFbWl0WmVyb0Jsb2NrcywgKHVpbnQ2NF90LCB1aW50NjRfdCksIChvdmVycmlkZSkpOwotICAgIE1PQ0tfTUVUSE9EKGJvb2wsIEVtaXRMYWJlbCwgKHVpbnQ2NF90KSwgKG92ZXJyaWRlKSk7Ci0gICAgTU9DS19NRVRIT0QoYm9vbCwgRW1pdFNlcXVlbmNlRGF0YSwgKHNpemVfdCwgY29uc3QgdWludDMyX3QqKSwgKG92ZXJyaWRlKSk7Ci0KLSAgICAvLyBPcGVuIHRoZSB3cml0ZXIgaW4gd3JpdGUgbW9kZSAobm8gYXBwZW5kKS4KLSAgICBNT0NLX01FVEhPRChib29sLCBJbml0aWFsaXplLCAoKSwgKG92ZXJyaWRlKSk7Ci0gICAgTU9DS19NRVRIT0QoYm9vbCwgVmVyaWZ5TWVyZ2VPcHMsICgpLCAob3ZlcnJpZGUsIGNvbnN0LCBub2V4Y2VwdCkpOwotCi0gICAgLy8gT3BlbiB0aGUgd3JpdGVyIGluIGFwcGVuZCBtb2RlLCB3aXRoIHRoZSBsYXN0IGxhYmVsIHRvIHJlc3VtZQotICAgIC8vIGZyb20uIFNlZSBDb3dXcml0ZXI6OkluaXRpYWxpemVBcHBlbmQuCi0gICAgTU9DS19NRVRIT0QoYm9vbCwgSW5pdGlhbGl6ZUFwcGVuZCwgKHVpbnQ2NF90IGxhYmVsKSwgKG92ZXJyaWRlKSk7Ci0KLSAgICBNT0NLX01FVEhPRChzdGQ6OnVuaXF1ZV9wdHI8RmlsZURlc2NyaXB0b3I+LCBPcGVuUmVhZGVyLCAoKSwgKG92ZXJyaWRlKSk7Ci19OwotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQ6OnNuYXBzaG90CmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3QvaW5jbHVkZS9saWJzbmFwc2hvdC9zbmFwc2hvdC5oIGIvZnNfbWdyL2xpYnNuYXBzaG90L2luY2x1ZGUvbGlic25hcHNob3Qvc25hcHNob3QuaAppbmRleCA5ZWI4OWI2Li5kZTIwNTI2IDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3QvaW5jbHVkZS9saWJzbmFwc2hvdC9zbmFwc2hvdC5oCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9pbmNsdWRlL2xpYnNuYXBzaG90L3NuYXBzaG90LmgKQEAgLTMzLDEyICszMywxMSBAQAogI2luY2x1ZGUgPGxpYmZpZW1hcC9pbWFnZV9tYW5hZ2VyLmg+CiAjaW5jbHVkZSA8bGlibHAvYnVpbGRlci5oPgogI2luY2x1ZGUgPGxpYmxwL2xpYmxwLmg+Ci0jaW5jbHVkZSA8dXBkYXRlX2VuZ2luZS91cGRhdGVfbWV0YWRhdGEucGIuaD4KLQogI2luY2x1ZGUgPGxpYnNuYXBzaG90L2F1dG9fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGlic25hcHNob3QvY293X3dyaXRlci5oPgogI2luY2x1ZGUgPGxpYnNuYXBzaG90L3JldHVybi5oPgotI2luY2x1ZGUgPGxpYnNuYXBzaG90L3NuYXBzaG90X3dyaXRlci5oPgogI2luY2x1ZGUgPHNuYXB1c2VyZC9zbmFwdXNlcmRfY2xpZW50Lmg+CisjaW5jbHVkZSA8dXBkYXRlX2VuZ2luZS91cGRhdGVfbWV0YWRhdGEucGIuaD4KIAogI2lmbmRlZiBGUklFTkRfVEVTVAogI2RlZmluZSBGUklFTkRfVEVTVCh0ZXN0X3NldF9uYW1lLCBpbmRpdmlkdWFsX3Rlc3QpIFwKQEAgLTc0LDYgKzczLDkgQEAKIGNsYXNzIFNuYXBzaG90TWVyZ2VTdGF0czsKIGNsYXNzIFNuYXBzaG90U3RhdHVzOwogCit1c2luZyBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKKwogc3RhdGljIGNvbnN0ZXhwciBjb25zdCBzdGQ6OnN0cmluZ192aWV3IGtDb3dHcm91cE5hbWUgPSAiY293IjsKIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrVmlydHVhbEFiQ29tcHJlc3Npb25Qcm9wW10gPSAicm8udmlydHVhbF9hYi5jb21wcmVzc2lvbi5lbmFibGVkIjsKIApAQCAtMTAyLDEyICsxMDQsMTQgQEAKICAgICAgICAgdmlydHVhbCBjb25zdCBhbmRyb2lkOjpmc19tZ3I6OklQYXJ0aXRpb25PcGVuZXImIEdldFBhcnRpdGlvbk9wZW5lcigpIGNvbnN0ID0gMDsKICAgICAgICAgdmlydHVhbCBib29sIElzT3ZlcmxheWZzU2V0dXAoKSBjb25zdCA9IDA7CiAgICAgICAgIHZpcnR1YWwgYm9vbCBTZXRCb290Q29udHJvbE1lcmdlU3RhdHVzKE1lcmdlU3RhdHVzIHN0YXR1cykgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgU2V0QWN0aXZlQm9vdFNsb3QodW5zaWduZWQgaW50IHNsb3QpID0gMDsKICAgICAgICAgdmlydHVhbCBib29sIFNldFNsb3RBc1VuYm9vdGFibGUodW5zaWduZWQgaW50IHNsb3QpID0gMDsKICAgICAgICAgdmlydHVhbCBib29sIElzUmVjb3ZlcnkoKSBjb25zdCA9IDA7CiAgICAgICAgIHZpcnR1YWwgYm9vbCBJc1Rlc3REZXZpY2UoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogICAgICAgICB2aXJ0dWFsIGJvb2wgSXNGaXJzdFN0YWdlSW5pdCgpIGNvbnN0ID0gMDsKICAgICAgICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8SUltYWdlTWFuYWdlcj4gT3BlbkltYWdlTWFuYWdlcigpIGNvbnN0ID0gMDsKICAgICAgICAgdmlydHVhbCBhbmRyb2lkOjpkbTo6SURldmljZU1hcHBlciYgR2V0RGV2aWNlTWFwcGVyKCkgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgSXNUZW1wTWV0YWRhdGEoKSBjb25zdCA9IDA7CiAKICAgICAgICAgLy8gSGVscGVyIG1ldGhvZCBmb3IgaW1wbGVtZW50aW5nIE9wZW5JbWFnZU1hbmFnZXIuCiAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJSW1hZ2VNYW5hZ2VyPiBPcGVuSW1hZ2VNYW5hZ2VyKGNvbnN0IHN0ZDo6c3RyaW5nJiBnc2lkX2RpcikgY29uc3Q7CkBAIC0yMTEsMTYgKzIxNSwxMyBAQAogICAgIHZpcnR1YWwgYm9vbCBNYXBVcGRhdGVTbmFwc2hvdChjb25zdCBhbmRyb2lkOjpmc19tZ3I6OkNyZWF0ZUxvZ2ljYWxQYXJ0aXRpb25QYXJhbXMmIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIHNuYXBzaG90X3BhdGgpID0gMDsKIAotICAgIC8vIENyZWF0ZSBhbiBJU25hcHNob3RXcml0ZXIgdG8gYnVpbGQgYSBzbmFwc2hvdCBhZ2FpbnN0IGEgdGFyZ2V0IHBhcnRpdGlvbi4gVGhlIHBhcnRpdGlvbiBuYW1lCisgICAgLy8gQ3JlYXRlIGFuIElDb3dXcml0ZXIgdG8gYnVpbGQgYSBzbmFwc2hvdCBhZ2FpbnN0IGEgdGFyZ2V0IHBhcnRpdGlvbi4gVGhlIHBhcnRpdGlvbiBuYW1lCiAgICAgLy8gbXVzdCBiZSBzdWZmaXhlZC4gSWYgYSBzb3VyY2UgcGFydGl0aW9uIGV4aXN0cywgaXQgbXVzdCBiZSBzcGVjaWZpZWQgYXMgd2VsbC4gVGhlIHNvdXJjZQogICAgIC8vIHBhcnRpdGlvbiB3aWxsIG9ubHkgYmUgdXNlZCBpZiByYXcgYnl0ZXMgYXJlIG5lZWRlZC4gVGhlIHNvdXJjZSBwYXJ0aXRpb24gc2hvdWxkIGJlIGFuCiAgICAgLy8gYWJzb2x1dGUgcGF0aCB0byB0aGUgZGV2aWNlLCBub3QgYSBwYXJ0aXRpb24gbmFtZS4KLSAgICAvLwotICAgIC8vIEFmdGVyIGNhbGxpbmcgT3BlblNuYXBzaG90V3JpdGVyLCB0aGUgY2FsbGVyIG11c3QgaW52b2tlIEluaXRpYWxpemUgb3IgSW5pdGlhbGl6ZUZvckFwcGVuZAotICAgIC8vIGJlZm9yZSBpbnZva2luZyB3cml0ZSBvcGVyYXRpb25zLgotICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPElTbmFwc2hvdFdyaXRlcj4gT3BlblNuYXBzaG90V3JpdGVyKAorICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPElDb3dXcml0ZXI+IE9wZW5TbmFwc2hvdFdyaXRlcigKICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OmZzX21ncjo6Q3JlYXRlTG9naWNhbFBhcnRpdGlvblBhcmFtcyYgcGFyYW1zLAotICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4mIHNvdXJjZV9kZXZpY2UpID0gMDsKKyAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGxhYmVsID0ge30pID0gMDsKIAogICAgIC8vIFVubWFwIGEgc25hcHNob3QgZGV2aWNlIG9yIENvd1dyaXRlciB0aGF0IHdhcyBwcmV2aW91c2x5IG9wZW5lZCB3aXRoIE1hcFVwZGF0ZVNuYXBzaG90LAogICAgIC8vIE9wZW5TbmFwc2hvdFdyaXRlci4gQWxsIG91dHN0YW5kaW5nIG9wZW4gZGVzY3JpcHRvcnMsIHdyaXRlcnMsIG9yCkBAIC0zMjksNiArMzMwLDEwIEBACiAgICAgLy8gbWlnaHQgYmUgbmVlZGVkIHRvIHBlcmZvcm0gZmlyc3Qtc3RhZ2UgbW91bnRzLgogICAgIHN0YXRpYyBib29sIElzU25hcHNob3RNYW5hZ2VyTmVlZGVkKCk7CiAKKyAgICAvLyBNYXAgdGhlIHRlbXAgT1RBIG1ldGFkYXRhIHBhcnRpdGlvbiBmcm9tIHN1cGVyCisgICAgc3RhdGljIGJvb2wgTWFwVGVtcE90YU1ldGFkYXRhUGFydGl0aW9uSWZOZWVkZWQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3Qgc3RkOjpzdHJpbmcmKT4mIGluaXQpOworCiAgICAgLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBzZWNvbmQgc3RhZ2UgaW5pdCB0byByZXN0b3JlY29uIG9uIHRoZSByb2xsYmFjayBpbmRpY2F0b3IuCiAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIEdldEdsb2JhbFJvbGxiYWNrSW5kaWNhdG9yUGF0aCgpOwogCkBAIC0zMzYsNiArMzQxLDkgQEAKICAgICAvLyBhZnRlciBsb2FkaW5nIHNlbGludXggcG9saWN5LgogICAgIGJvb2wgUHJlcGFyZVNuYXB1c2VyZEFyZ3NGb3JTZWxpbnV4KHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogc25hcHVzZXJkX2FyZ3YpOwogCisgICAgLy8gSWYgc25hcHVzZXJkIGZyb20gZmlyc3Qgc3RhZ2UgaW5pdCB3YXMgc3RhcnRlZCBmcm9tIHN5c3RlbSBwYXJ0aXRpb24uCisgICAgYm9vbCBNYXJrU25hcHVzZXJkRnJvbVN5c3RlbSgpOworCiAgICAgLy8gRGV0YWNoIGRtLXVzZXIgZGV2aWNlcyBmcm9tIHRoZSBmaXJzdCBzdGFnZSBzbmFwdXNlcmQuIExvYWQKICAgICAvLyBuZXcgZG0tdXNlciB0YWJsZXMgYWZ0ZXIgbG9hZGluZyBzZWxpbnV4IHBvbGljeS4KICAgICBib29sIERldGFjaEZpcnN0U3RhZ2VTbmFwdXNlcmRGb3JTZWxpbnV4KCk7CkBAIC0zNjIsOSArMzcwLDkgQEAKICAgICBSZXR1cm4gQ3JlYXRlVXBkYXRlU25hcHNob3RzKGNvbnN0IERlbHRhQXJjaGl2ZU1hbmlmZXN0JiBtYW5pZmVzdCkgb3ZlcnJpZGU7CiAgICAgYm9vbCBNYXBVcGRhdGVTbmFwc2hvdChjb25zdCBDcmVhdGVMb2dpY2FsUGFydGl0aW9uUGFyYW1zJiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogc25hcHNob3RfcGF0aCkgb3ZlcnJpZGU7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPElTbmFwc2hvdFdyaXRlcj4gT3BlblNuYXBzaG90V3JpdGVyKAorICAgIHN0ZDo6dW5pcXVlX3B0cjxJQ293V3JpdGVyPiBPcGVuU25hcHNob3RXcml0ZXIoCiAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpmc19tZ3I6OkNyZWF0ZUxvZ2ljYWxQYXJ0aXRpb25QYXJhbXMmIHBhcmFtcywKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+JiBzb3VyY2VfZGV2aWNlKSBvdmVycmlkZTsKKyAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGxhYmVsKSBvdmVycmlkZTsKICAgICBib29sIFVubWFwVXBkYXRlU25hcHNob3QoY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldF9wYXJ0aXRpb25fbmFtZSkgb3ZlcnJpZGU7CiAgICAgYm9vbCBOZWVkU25hcHNob3RzSW5GaXJzdFN0YWdlTW91bnQoKSBvdmVycmlkZTsKICAgICBib29sIENyZWF0ZUxvZ2ljYWxBbmRTbmFwc2hvdFBhcnRpdGlvbnMoCkBAIC00MDYsMjAgKzQxNCwxMiBAQAogCiAgICAgLy8gQWRkIG5ldyBwdWJsaWMgZW50cmllcyBhYm92ZSB0aGlzIGxpbmUuCiAKLSAgICAvLyBIZWxwZXJzIGZvciBmYWlsdXJlIGluamVjdGlvbi4KLSAgICB1c2luZyBNZXJnZUNvbnNpc3RlbmN5Q2hlY2tlciA9Ci0gICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPE1lcmdlRmFpbHVyZUNvZGUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IFNuYXBzaG90U3RhdHVzJiBzdGF0dXMpPjsKLQotICAgIHZvaWQgc2V0X21lcmdlX2NvbnNpc3RlbmN5X2NoZWNrZXIoTWVyZ2VDb25zaXN0ZW5jeUNoZWNrZXIgY2hlY2tlcikgewotICAgICAgICBtZXJnZV9jb25zaXN0ZW5jeV9jaGVja2VyXyA9IGNoZWNrZXI7Ci0gICAgfQotICAgIE1lcmdlQ29uc2lzdGVuY3lDaGVja2VyIG1lcmdlX2NvbnNpc3RlbmN5X2NoZWNrZXIoKSBjb25zdCB7IHJldHVybiBtZXJnZV9jb25zaXN0ZW5jeV9jaGVja2VyXzsgfQotCiAgIHByaXZhdGU6CiAgICAgRlJJRU5EX1RFU1QoU25hcHNob3RUZXN0LCBDbGVhbkZpcnN0U3RhZ2VNb3VudCk7CiAgICAgRlJJRU5EX1RFU1QoU25hcHNob3RUZXN0LCBDcmVhdGVTbmFwc2hvdCk7CiAgICAgRlJJRU5EX1RFU1QoU25hcHNob3RUZXN0LCBGaXJzdFN0YWdlTW91bnRBZnRlclJvbGxiYWNrKTsKICAgICBGUklFTkRfVEVTVChTbmFwc2hvdFRlc3QsIEZpcnN0U3RhZ2VNb3VudEFuZE1lcmdlKTsKKyAgICBGUklFTkRfVEVTVChTbmFwc2hvdFRlc3QsIEZsYWdDaGVjayk7CiAgICAgRlJJRU5EX1RFU1QoU25hcHNob3RUZXN0LCBGbGFzaFN1cGVyRHVyaW5nTWVyZ2UpOwogICAgIEZSSUVORF9URVNUKFNuYXBzaG90VGVzdCwgRmxhc2hTdXBlckR1cmluZ1VwZGF0ZSk7CiAgICAgRlJJRU5EX1RFU1QoU25hcHNob3RUZXN0LCBNYXBQYXJ0aWFsU25hcHNob3QpOwpAQCAtNDI4LDIzICs0MjgsMjggQEAKICAgICBGUklFTkRfVEVTVChTbmFwc2hvdFRlc3QsIE1lcmdlRmFpbHVyZUNvZGUpOwogICAgIEZSSUVORF9URVNUKFNuYXBzaG90VGVzdCwgTm9NZXJnZUJlZm9yZVJlYm9vdCk7CiAgICAgRlJJRU5EX1RFU1QoU25hcHNob3RUZXN0LCBVcGRhdGVCb290Q29udHJvbEhhbCk7CisgICAgRlJJRU5EX1RFU1QoU25hcHNob3RUZXN0LCBCb290U25hcHNob3RXaXRob3V0U2xvdFN3aXRjaCk7CiAgICAgRlJJRU5EX1RFU1QoU25hcHNob3RVcGRhdGVUZXN0LCBBZGRQYXJ0aXRpb24pOwogICAgIEZSSUVORF9URVNUKFNuYXBzaG90VXBkYXRlVGVzdCwgQ29uc2lzdGVuY3lDaGVja1Jlc3VtZSk7CiAgICAgRlJJRU5EX1RFU1QoU25hcHNob3RVcGRhdGVUZXN0LCBEYWVtb25UcmFuc2l0aW9uKTsKICAgICBGUklFTkRfVEVTVChTbmFwc2hvdFVwZGF0ZVRlc3QsIERhdGFXaXBlQWZ0ZXJSb2xsYmFjayk7CiAgICAgRlJJRU5EX1RFU1QoU25hcHNob3RVcGRhdGVUZXN0LCBEYXRhV2lwZVJvbGxiYWNrSW5SZWNvdmVyeSk7CiAgICAgRlJJRU5EX1RFU1QoU25hcHNob3RVcGRhdGVUZXN0LCBEYXRhV2lwZVdpdGhTdGFsZVNuYXBzaG90cyk7CisgICAgRlJJRU5EX1RFU1QoU25hcHNob3RVcGRhdGVUZXN0LCBGbGFnQ2hlY2spOwogICAgIEZSSUVORF9URVNUKFNuYXBzaG90VXBkYXRlVGVzdCwgRnVsbFVwZGF0ZUZsb3cpOwogICAgIEZSSUVORF9URVNUKFNuYXBzaG90VXBkYXRlVGVzdCwgTWVyZ2VDYW5ub3RSZW1vdmVDb3cpOwogICAgIEZSSUVORF9URVNUKFNuYXBzaG90VXBkYXRlVGVzdCwgTWVyZ2VJblJlY292ZXJ5KTsKICAgICBGUklFTkRfVEVTVChTbmFwc2hvdFVwZGF0ZVRlc3QsIFF1ZXJ5U3RhdHVzRXJyb3IpOwogICAgIEZSSUVORF9URVNUKFNuYXBzaG90VXBkYXRlVGVzdCwgU25hcHNob3RTdGF0dXNGaWxlV2l0aG91dENvdyk7CiAgICAgRlJJRU5EX1RFU1QoU25hcHNob3RVcGRhdGVUZXN0LCBTcGFjZVN3YXBVcGRhdGUpOworICAgIEZSSUVORF9URVNUKFNuYXBzaG90VXBkYXRlVGVzdCwgSW50ZXJydXB0TWVyZ2VEdXJpbmdQaGFzZVVwZGF0ZSk7CisgICAgRlJJRU5EX1RFU1QoU25hcHNob3RVcGRhdGVUZXN0LCBNYXBBbGxTbmFwc2hvdHNXaXRob3V0U2xvdFN3aXRjaCk7CiAgICAgZnJpZW5kIGNsYXNzIFNuYXBzaG90VGVzdDsKICAgICBmcmllbmQgY2xhc3MgU25hcHNob3RVcGRhdGVUZXN0OwogICAgIGZyaWVuZCBjbGFzcyBGbGFzaEFmdGVyVXBkYXRlVGVzdDsKICAgICBmcmllbmQgY2xhc3MgTG9ja1Rlc3RDb25zdW1lcjsKICAgICBmcmllbmQgY2xhc3MgU25hcHNob3RGdXp6RW52OworICAgIGZyaWVuZCBjbGFzcyBNYXBTbmFwc2hvdHM7CiAgICAgZnJpZW5kIHN0cnVjdCBBdXRvRGVsZXRlQ293SW1hZ2U7CiAgICAgZnJpZW5kIHN0cnVjdCBBdXRvRGVsZXRlU25hcHNob3Q7CiAgICAgZnJpZW5kIHN0cnVjdCBQYXJ0aXRpb25Db3dDcmVhdG9yOwpAQCAtNDU5LDcgKzQ2NCw3IEBACiAgICAgYm9vbCBFbnN1cmVJbWFnZU1hbmFnZXIoKTsKIAogICAgIC8vIEVuc3VyZSB3ZSdyZSBjb25uZWN0ZWQgdG8gc25hcHVzZXJkLgotICAgIGJvb2wgRW5zdXJlU25hcHVzZXJkQ29ubmVjdGVkKCk7CisgICAgYm9vbCBFbnN1cmVTbmFwdXNlcmRDb25uZWN0ZWQoc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyB0aW1lb3V0X21zID0gMTBzKTsKIAogICAgIC8vIEhlbHBlcnMgZm9yIGZpcnN0LXN0YWdlIGluaXQuCiAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPElEZXZpY2VJbmZvPiYgZGV2aWNlKCkgY29uc3QgeyByZXR1cm4gZGV2aWNlXzsgfQpAQCAtNTUyLDYgKzU1NywxNiBAQAogICAgIC8vIFVubWFwIGFuZCByZW1vdmUgYWxsIGtub3duIHNuYXBzaG90cy4KICAgICBib29sIFJlbW92ZUFsbFNuYXBzaG90cyhMb2NrZWRGaWxlKiBsb2NrKTsKIAorICAgIC8vIEJvb3QgZGV2aWNlIG9mZiBzbmFwc2hvdHMgd2l0aG91dCBzbG90IHN3aXRjaAorICAgIGJvb2wgQm9vdEZyb21TbmFwc2hvdHNXaXRob3V0U2xvdFN3aXRjaCgpOworCisgICAgLy8gUmVtb3ZlIGtCb290U25hcHNob3RzV2l0aG91dFNsb3RTd2l0Y2ggc28gdGhhdCBkZXZpY2UgY2FuIGJvb3QKKyAgICAvLyB3aXRob3V0IHNuYXBzaG90cyBvbiB0aGUgY3VycmVudCBzbG90CisgICAgYm9vbCBQcmVwYXJlRGV2aWNlVG9Cb290V2l0aG91dFNuYXBzaG90KCk7CisKKyAgICAvLyBJcyB0aGUga0Jvb3RTbmFwc2hvdHNXaXRob3V0U2xvdFN3aXRjaCBwcmVzZW50CisgICAgYm9vbCBJc1NuYXBzaG90V2l0aG91dFNsb3RTd2l0Y2goKTsKKwogICAgIC8vIExpc3QgdGhlIGtub3duIHNuYXBzaG90IG5hbWVzLgogICAgIGJvb2wgTGlzdFNuYXBzaG90cyhMb2NrZWRGaWxlKiBsb2NrLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHNuYXBzaG90cywKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN1ZmZpeCA9ICIiKTsKQEAgLTYyOCw3ICs2NDMsNyBAQAogICAgIGJvb2wgQ29sbGFwc2VTbmFwc2hvdERldmljZShMb2NrZWRGaWxlKiBsb2NrLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU25hcHNob3RTdGF0dXMmIHN0YXR1cyk7CiAKLSAgICBzdHJ1Y3QgTWVyZ2VSZXN1bHQgeworICAgIHN0cnVjdCBbW25vZGlzY2FyZF1dIE1lcmdlUmVzdWx0IHsKICAgICAgICAgZXhwbGljaXQgTWVyZ2VSZXN1bHQoVXBkYXRlU3RhdGUgc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lcmdlRmFpbHVyZUNvZGUgZmFpbHVyZV9jb2RlID0gTWVyZ2VGYWlsdXJlQ29kZTo6T2spCiAgICAgICAgICAgICA6IHN0YXRlKHN0YXRlKSwgZmFpbHVyZV9jb2RlKGZhaWx1cmVfY29kZSkge30KQEAgLTY0NSw4ICs2NjAsNiBAQAogICAgIE1lcmdlUmVzdWx0IENoZWNrTWVyZ2VTdGF0ZShMb2NrZWRGaWxlKiBsb2NrLCBjb25zdCBzdGQ6OmZ1bmN0aW9uPGJvb2woKT4mIGJlZm9yZV9jYW5jZWwpOwogICAgIE1lcmdlUmVzdWx0IENoZWNrVGFyZ2V0TWVyZ2VTdGF0ZShMb2NrZWRGaWxlKiBsb2NrLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU25hcHNob3RVcGRhdGVTdGF0dXMmIHVwZGF0ZV9zdGF0dXMpOwotICAgIE1lcmdlRmFpbHVyZUNvZGUgQ2hlY2tNZXJnZUNvbnNpc3RlbmN5KExvY2tlZEZpbGUqIGxvY2ssIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNuYXBzaG90U3RhdHVzJiB1cGRhdGVfc3RhdHVzKTsKIAogICAgIGF1dG8gVXBkYXRlU3RhdGVUb1N0cihlbnVtIFVwZGF0ZVN0YXRlIHN0YXRlKTsKICAgICAvLyBHZXQgc3RhdHVzIG9yIHRhYmxlIGluZm9ybWF0aW9uIGFib3V0IGEgZGV2aWNlLW1hcHBlciBub2RlIHdpdGggYSBzaW5nbGUgdGFyZ2V0LgpAQCAtNjY2LDYgKzY3OSwxMCBAQAogICAgIHN0ZDo6c3RyaW5nIEdldFJvbGxiYWNrSW5kaWNhdG9yUGF0aCgpOwogICAgIHN0ZDo6c3RyaW5nIEdldEZvcndhcmRNZXJnZUluZGljYXRvclBhdGgoKTsKICAgICBzdGQ6OnN0cmluZyBHZXRPbGRQYXJ0aXRpb25NZXRhZGF0YVBhdGgoKTsKKyAgICBzdGQ6OnN0cmluZyBHZXRCb290U25hcHNob3RzV2l0aG91dFNsb3RTd2l0Y2hQYXRoKCk7CisgICAgc3RkOjpzdHJpbmcgR2V0U25hcHVzZXJkRnJvbVN5c3RlbVBhdGgoKTsKKworICAgIGJvb2wgSGFzRm9yd2FyZE1lcmdlSW5kaWNhdG9yKCk7CiAKICAgICBjb25zdCBMcE1ldGFkYXRhKiBSZWFkT2xkUGFydGl0aW9uTWV0YWRhdGEoTG9ja2VkRmlsZSogbG9jayk7CiAKQEAgLTY5MywxNCArNzEwLDEwIEBACiAgICAgfTsKIAogICAgIC8vIEhlbHBlcnMgZm9yIE9wZW5TbmFwc2hvdFdyaXRlci4KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8SVNuYXBzaG90V3JpdGVyPiBPcGVuQ29tcHJlc3NlZFNuYXBzaG90V3JpdGVyKAotICAgICAgICAgICAgTG9ja2VkRmlsZSogbG9jaywgY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4mIHNvdXJjZV9kZXZpY2UsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFydGl0aW9uX25hbWUsIGNvbnN0IFNuYXBzaG90U3RhdHVzJiBzdGF0dXMsCi0gICAgICAgICAgICBjb25zdCBTbmFwc2hvdFBhdGhzJiBwYXRocyk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPElTbmFwc2hvdFdyaXRlcj4gT3Blbktlcm5lbFNuYXBzaG90V3JpdGVyKAotICAgICAgICAgICAgTG9ja2VkRmlsZSogbG9jaywgY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4mIHNvdXJjZV9kZXZpY2UsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFydGl0aW9uX25hbWUsIGNvbnN0IFNuYXBzaG90U3RhdHVzJiBzdGF0dXMsCi0gICAgICAgICAgICBjb25zdCBTbmFwc2hvdFBhdGhzJiBwYXRocyk7CisgICAgc3RkOjp1bmlxdWVfcHRyPElDb3dXcml0ZXI+IE9wZW5Db21wcmVzc2VkU25hcHNob3RXcml0ZXIoTG9ja2VkRmlsZSogbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbmFwc2hvdFN0YXR1cyYgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNuYXBzaG90UGF0aHMmIHBhdGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGxhYmVsKTsKIAogICAgIC8vIE1hcCB0aGUgYmFzZSBkZXZpY2UsIENPVyBkZXZpY2VzLCBhbmQgc25hcHNob3QgZGV2aWNlLgogICAgIGJvb2wgTWFwUGFydGl0aW9uV2l0aFNuYXBzaG90KExvY2tlZEZpbGUqIGxvY2ssIENyZWF0ZUxvZ2ljYWxQYXJ0aXRpb25QYXJhbXMgcGFyYW1zLApAQCAtNzQ3LDcgKzc2MCw3IEBACiAgICAgLy8gSW5pdGlhbGl6ZSBzbmFwc2hvdHMgc28gdGhhdCB0aGV5IGNhbiBiZSBtYXBwZWQgbGF0ZXIuCiAgICAgLy8gTWFwIHRoZSBDT1cgcGFydGl0aW9uIGFuZCB6ZXJvLWluaXRpYWxpemUgdGhlIGhlYWRlci4KICAgICBSZXR1cm4gSW5pdGlhbGl6ZVVwZGF0ZVNuYXBzaG90cygKLSAgICAgICAgICAgIExvY2tlZEZpbGUqIGxvY2ssIE1ldGFkYXRhQnVpbGRlciogdGFyZ2V0X21ldGFkYXRhLAorICAgICAgICAgICAgTG9ja2VkRmlsZSogbG9jaywgdWludDMyX3QgY293X3ZlcnNpb24sIE1ldGFkYXRhQnVpbGRlciogdGFyZ2V0X21ldGFkYXRhLAogICAgICAgICAgICAgY29uc3QgTHBNZXRhZGF0YSogZXhwb3J0ZWRfdGFyZ2V0X21ldGFkYXRhLCBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0X3N1ZmZpeCwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBTbmFwc2hvdFN0YXR1cz4mIGFsbF9zbmFwc2hvdF9zdGF0dXMpOwogCkBAIC03ODEsMTEgKzc5NCw4IEBACiAgICAgYm9vbCBVcGRhdGVGb3J3YXJkTWVyZ2VJbmRpY2F0b3IoYm9vbCB3aXBlKTsKIAogICAgIC8vIEhlbHBlciBmb3IgSGFuZGxlSW1taW5lbnREYXRhV2lwZS4KLSAgICAvLyBDYWxsIFByb2Nlc3NVcGRhdGVTdGF0ZSBhbmQgaGFuZGxlIHN0YXRlcyB3aXRoIHNwZWNpYWwgcnVsZXMgYmVmb3JlIGRhdGEgd2lwZS4gU3BlY2lmaWNhbGx5LAotICAgIC8vIGlmIHxhbGxvd19mb3J3YXJkX21lcmdlfCBhbmQgYWxsb3ctZm9yd2FyZC1tZXJnZSBpbmRpY2F0b3IgZXhpc3RzLCBpbml0aWF0ZSBtZXJnZSBpZgotICAgIC8vIG5lY2Vzc2FyeS4KLSAgICBVcGRhdGVTdGF0ZSBQcm9jZXNzVXBkYXRlU3RhdGVPbkRhdGFXaXBlKGJvb2wgYWxsb3dfZm9yd2FyZF9tZXJnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248Ym9vbCgpPiYgY2FsbGJhY2spOworICAgIC8vIENhbGwgUHJvY2Vzc1VwZGF0ZVN0YXRlIGFuZCBoYW5kbGUgc3RhdGVzIHdpdGggc3BlY2lhbCBydWxlcyBiZWZvcmUgZGF0YSB3aXBlLgorICAgIFVwZGF0ZVN0YXRlIFByb2Nlc3NVcGRhdGVTdGF0ZU9uRGF0YVdpcGUoY29uc3Qgc3RkOjpmdW5jdGlvbjxib29sKCk+JiBjYWxsYmFjayk7CiAKICAgICAvLyBSZXR1cm4gZGV2aWNlIHN0cmluZyBvZiBhIG1hcHBlZCBpbWFnZSwgb3IgaWYgaXQgaXMgbm90IGF2YWlsYWJsZSwgdGhlIG1hcHBlZCBpbWFnZSBwYXRoLgogICAgIGJvb2wgR2V0TWFwcGVkSW1hZ2VEZXZpY2VTdHJpbmdPclBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9uYW1lLApAQCAtODI0LDIxICs4MzQsMzUgQEAKICAgICAvLyBDaGVjayBpZiBpb191cmluZyBBUEkncyBuZWVkIHRvIGJlIHVzZWQKICAgICBib29sIFVwZGF0ZVVzZXNJb3VyaW5nKExvY2tlZEZpbGUqIGxvY2spOwogCisgICAgLy8gQ2hlY2sgaWYgZGlyZWN0IHJlYWRzIGFyZSBlbmFibGVkIGZvciB0aGUgc291cmNlIGltYWdlCisgICAgYm9vbCBVcGRhdGVVc2VzT0RpcmVjdChMb2NrZWRGaWxlKiBsb2NrKTsKKworICAgIC8vIEdldCB2YWx1ZSBvZiBtYXhpbXVtIGNvdyBvcCBtZXJnZSBzaXplCisgICAgdWludDMyX3QgR2V0VXBkYXRlQ293T3BNZXJnZVNpemUoTG9ja2VkRmlsZSogbG9jayk7CisKKyAgICAvLyBHZXQgbnVtYmVyIG9mIHRocmVhZHMgdG8gcGVyZm9ybSBwb3N0IE9UQSBib290IHZlcmlmaWNhdGlvbgorICAgIHVpbnQzMl90IEdldFVwZGF0ZVdvcmtlckNvdW50KExvY2tlZEZpbGUqIGxvY2spOworCiAgICAgLy8gV3JhcHBlciBhcm91bmQgbGliZG0sIHdpdGggZGlhZ25vc3RpY3MuCiAgICAgYm9vbCBEZWxldGVEZXZpY2VJZkV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMmIHRpbWVvdXRfbXMgPSB7fSk7CiAKKyAgICAvLyBTZXQgcmVhZC1haGVhZCBzaXplIGR1cmluZyBPVEEKKyAgICB2b2lkIFNldFJlYWRBaGVhZFNpemUoY29uc3Qgc3RkOjpzdHJpbmcmIGVudHJ5X2Jsb2NrX2RldmljZSwgb2ZmNjRfdCBzaXplX2tiKTsKKworICAgIC8vIFJldHVybnMgdHJ1ZSBwb3N0IE9UQSByZWJvb3QgaWYgbGVnYWN5IHNuYXB1c2VyZCBpcyByZXF1aXJlZAorICAgIGJvb2wgSXNMZWdhY3lTbmFwdXNlcmRQb3N0UmVib290KCk7CisKICAgICBhbmRyb2lkOjpkbTo6SURldmljZU1hcHBlciYgZG1fOwogICAgIHN0ZDo6dW5pcXVlX3B0cjxJRGV2aWNlSW5mbz4gZGV2aWNlXzsKICAgICBzdGQ6OnN0cmluZyBtZXRhZGF0YV9kaXJfOwogICAgIHN0ZDo6dW5pcXVlX3B0cjxJSW1hZ2VNYW5hZ2VyPiBpbWFnZXNfOwogICAgIGJvb2wgdXNlX2ZpcnN0X3N0YWdlX3NuYXB1c2VyZF8gPSBmYWxzZTsKLSAgICBib29sIGluX2ZhY3RvcnlfZGF0YV9yZXNldF8gPSBmYWxzZTsKICAgICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3Qgc3RkOjpzdHJpbmcmKT4gdWV2ZW50X3JlZ2VuX2NhbGxiYWNrXzsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHVzZXJkQ2xpZW50PiBzbmFwdXNlcmRfY2xpZW50XzsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8THBNZXRhZGF0YT4gb2xkX3BhcnRpdGlvbl9tZXRhZGF0YV87CiAgICAgc3RkOjpvcHRpb25hbDxib29sPiBpc19zbmFwc2hvdF91c2Vyc3BhY2VfOwotICAgIE1lcmdlQ29uc2lzdGVuY3lDaGVja2VyIG1lcmdlX2NvbnNpc3RlbmN5X2NoZWNrZXJfOworICAgIHN0ZDo6b3B0aW9uYWw8Ym9vbD4gaXNfbGVnYWN5X3NuYXB1c2VyZF87CiB9OwogCiB9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9pbmNsdWRlL2xpYnNuYXBzaG90L3NuYXBzaG90X3N0dWIuaCBiL2ZzX21nci9saWJzbmFwc2hvdC9pbmNsdWRlL2xpYnNuYXBzaG90L3NuYXBzaG90X3N0dWIuaAppbmRleCAxNzFjN2M2Li4xYzliNDAzIDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3QvaW5jbHVkZS9saWJzbmFwc2hvdC9zbmFwc2hvdF9zdHViLmgKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L2luY2x1ZGUvbGlic25hcHNob3Qvc25hcHNob3Rfc3R1Yi5oCkBAIC00MCw5ICs0MCw5IEBACiAgICAgICAgICAgICBjb25zdCBjaHJvbWVvc191cGRhdGVfZW5naW5lOjpEZWx0YUFyY2hpdmVNYW5pZmVzdCYgbWFuaWZlc3QpIG92ZXJyaWRlOwogICAgIGJvb2wgTWFwVXBkYXRlU25hcHNob3QoY29uc3QgYW5kcm9pZDo6ZnNfbWdyOjpDcmVhdGVMb2dpY2FsUGFydGl0aW9uUGFyYW1zJiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogc25hcHNob3RfcGF0aCkgb3ZlcnJpZGU7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPElTbmFwc2hvdFdyaXRlcj4gT3BlblNuYXBzaG90V3JpdGVyKAorICAgIHN0ZDo6dW5pcXVlX3B0cjxJQ293V3JpdGVyPiBPcGVuU25hcHNob3RXcml0ZXIoCiAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpmc19tZ3I6OkNyZWF0ZUxvZ2ljYWxQYXJ0aXRpb25QYXJhbXMmIHBhcmFtcywKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+JiBzb3VyY2VfZGV2aWNlKSBvdmVycmlkZTsKKyAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGxhYmVsKSBvdmVycmlkZTsKICAgICBib29sIFVubWFwVXBkYXRlU25hcHNob3QoY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldF9wYXJ0aXRpb25fbmFtZSkgb3ZlcnJpZGU7CiAgICAgYm9vbCBOZWVkU25hcHNob3RzSW5GaXJzdFN0YWdlTW91bnQoKSBvdmVycmlkZTsKICAgICBib29sIENyZWF0ZUxvZ2ljYWxBbmRTbmFwc2hvdFBhcnRpdGlvbnMoCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3QvaW5jbHVkZS9saWJzbmFwc2hvdC9zbmFwc2hvdF93cml0ZXIuaCBiL2ZzX21nci9saWJzbmFwc2hvdC9pbmNsdWRlL2xpYnNuYXBzaG90L3NuYXBzaG90X3dyaXRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTNiMWRiLi4wMDAwMDAwCi0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9pbmNsdWRlL2xpYnNuYXBzaG90L3NuYXBzaG90X3dyaXRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPG9wdGlvbmFsPgotCi0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgotCi0jaW5jbHVkZSA8bGlic25hcHNob3QvY293X3dyaXRlci5oPgotCi1uYW1lc3BhY2UgY2hyb21lb3NfdXBkYXRlX2VuZ2luZSB7Ci1jbGFzcyBGaWxlRGVzY3JpcHRvcjsKLX0gIC8vIG5hbWVzcGFjZSBjaHJvbWVvc191cGRhdGVfZW5naW5lCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBzbmFwc2hvdCB7Ci0KLWNsYXNzIElTbmFwc2hvdFdyaXRlciA6IHB1YmxpYyBJQ293V3JpdGVyIHsKLSAgcHVibGljOgotICAgIHVzaW5nIEZpbGVEZXNjcmlwdG9yID0gY2hyb21lb3NfdXBkYXRlX2VuZ2luZTo6RmlsZURlc2NyaXB0b3I7Ci0KLSAgICBleHBsaWNpdCBJU25hcHNob3RXcml0ZXIoY29uc3QgQ293T3B0aW9ucyYgb3B0aW9ucyk7Ci0KLSAgICAvLyBTZXQgdGhlIHNvdXJjZSBkZXZpY2UuIFRoaXMgaXMgdXNlZCBmb3IgQWRkQ29weSgpIG9wZXJhdGlvbnMsIGlmIHRoZQotICAgIC8vIHVuZGVybHlpbmcgd3JpdGVyIG5lZWRzIHRoZSBvcmlnaW5hbCBieXRlcyAoZm9yIGV4YW1wbGUgaWYgYmFja2VkIGJ5Ci0gICAgLy8gZG0tc25hcHNob3Qgb3IgaWYgd3JpdGluZyBkaXJlY3RseSB0byBhbiB1bnNuYXBzaG90dGVkIHJlZ2lvbikuIFRoZQotICAgIC8vIGRldmljZSBpcyBvbmx5IG9wZW5lZCBvbiB0aGUgZmlyc3Qgb3BlcmF0aW9uIHRoYXQgcmVxdWlyZXMgaXQuCi0gICAgdm9pZCBTZXRTb3VyY2VEZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZV9kZXZpY2UpOwotCi0gICAgLy8gT3BlbiB0aGUgd3JpdGVyIGluIHdyaXRlIG1vZGUgKG5vIGFwcGVuZCkuCi0gICAgdmlydHVhbCBib29sIEluaXRpYWxpemUoKSA9IDA7Ci0KLSAgICAvLyBPcGVuIHRoZSB3cml0ZXIgaW4gYXBwZW5kIG1vZGUsIHdpdGggdGhlIGxhc3QgbGFiZWwgdG8gcmVzdW1lCi0gICAgLy8gZnJvbS4gU2VlIENvd1dyaXRlcjo6SW5pdGlhbGl6ZUFwcGVuZC4KLSAgICB2aXJ0dWFsIGJvb2wgSW5pdGlhbGl6ZUFwcGVuZCh1aW50NjRfdCBsYWJlbCkgPSAwOwotCi0gICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8RmlsZURlc2NyaXB0b3I+IE9wZW5SZWFkZXIoKSA9IDA7Ci0gICAgdmlydHVhbCBib29sIFZlcmlmeU1lcmdlT3BzKCkgY29uc3Qgbm9leGNlcHQgPSAwOwotCi0gIHByb3RlY3RlZDoKLSAgICBhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBHZXRTb3VyY2VGZCgpOwotCi0gICAgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gc291cmNlX2RldmljZV87Ci0KLSAgcHJpdmF0ZToKLSAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgc291cmNlX2ZkXzsKLX07Ci0KLS8vIFNlbmQgd3JpdGVzIHRvIGEgQ09XIG9yIGEgcmF3IGRldmljZSBkaXJlY3RseSwgYmFzZWQgb24gYSB0aHJlc2hvbGQuCi1jbGFzcyBDb21wcmVzc2VkU25hcHNob3RXcml0ZXIgZmluYWwgOiBwdWJsaWMgSVNuYXBzaG90V3JpdGVyIHsKLSAgcHVibGljOgotICAgIENvbXByZXNzZWRTbmFwc2hvdFdyaXRlcihjb25zdCBDb3dPcHRpb25zJiBvcHRpb25zKTsKLQotICAgIC8vIFNldHMgdGhlIENPVyBkZXZpY2U7IHRoaXMgaXMgcmVxdWlyZWQuCi0gICAgYm9vbCBTZXRDb3dEZXZpY2UoYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkJiYgY293X2RldmljZSk7Ci0KLSAgICBib29sIEluaXRpYWxpemUoKSBvdmVycmlkZTsKLSAgICBib29sIEluaXRpYWxpemVBcHBlbmQodWludDY0X3QgbGFiZWwpIG92ZXJyaWRlOwotICAgIGJvb2wgRmluYWxpemUoKSBvdmVycmlkZTsKLSAgICB1aW50NjRfdCBHZXRDb3dTaXplKCkgb3ZlcnJpZGU7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPEZpbGVEZXNjcmlwdG9yPiBPcGVuUmVhZGVyKCkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBWZXJpZnlNZXJnZU9wcygpIGNvbnN0IG5vZXhjZXB0OwotCi0gIHByb3RlY3RlZDoKLSAgICBib29sIEVtaXRDb3B5KHVpbnQ2NF90IG5ld19ibG9jaywgdWludDY0X3Qgb2xkX2Jsb2NrLCB1aW50NjRfdCBudW1fYmxvY2tzID0gMSkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBFbWl0UmF3QmxvY2tzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOwotICAgIGJvb2wgRW1pdFhvckJsb2Nrcyh1aW50MzJfdCBuZXdfYmxvY2tfc3RhcnQsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplLCB1aW50MzJfdCBvbGRfYmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG9mZnNldCkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBFbWl0WmVyb0Jsb2Nrcyh1aW50NjRfdCBuZXdfYmxvY2tfc3RhcnQsIHVpbnQ2NF90IG51bV9ibG9ja3MpIG92ZXJyaWRlOwotICAgIGJvb2wgRW1pdExhYmVsKHVpbnQ2NF90IGxhYmVsKSBvdmVycmlkZTsKLSAgICBib29sIEVtaXRTZXF1ZW5jZURhdGEoc2l6ZV90IG51bV9vcHMsIGNvbnN0IHVpbnQzMl90KiBkYXRhKSBvdmVycmlkZTsKLQotICBwcml2YXRlOgotICAgIHN0ZDo6dW5pcXVlX3B0cjxDb3dSZWFkZXI+IE9wZW5Db3dSZWFkZXIoKSBjb25zdDsKLSAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgY293X2RldmljZV87Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q293V3JpdGVyPiBjb3dfOwotfTsKLQotLy8gV3JpdGUgZGlyZWN0bHkgdG8gYSBkbS1zbmFwc2hvdCBkZXZpY2UuCi1jbGFzcyBPbmxpbmVLZXJuZWxTbmFwc2hvdFdyaXRlciBmaW5hbCA6IHB1YmxpYyBJU25hcHNob3RXcml0ZXIgewotICBwdWJsaWM6Ci0gICAgT25saW5lS2VybmVsU25hcHNob3RXcml0ZXIoY29uc3QgQ293T3B0aW9ucyYgb3B0aW9ucyk7Ci0KLSAgICAvLyBTZXQgdGhlIGRldmljZSB1c2VkIGZvciBhbGwgd3JpdGVzLgotICAgIHZvaWQgU2V0U25hcHNob3REZXZpY2UoYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkJiYgc25hcHNob3RfZmQsIHVpbnQ2NF90IGNvd19zaXplKTsKLQotICAgIGJvb2wgSW5pdGlhbGl6ZSgpIG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KLSAgICBib29sIEluaXRpYWxpemVBcHBlbmQodWludDY0X3QpIG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KLQotICAgIGJvb2wgRmluYWxpemUoKSBvdmVycmlkZTsKLSAgICB1aW50NjRfdCBHZXRDb3dTaXplKCkgb3ZlcnJpZGUgeyByZXR1cm4gY293X3NpemVfOyB9Ci0gICAgc3RkOjp1bmlxdWVfcHRyPEZpbGVEZXNjcmlwdG9yPiBPcGVuUmVhZGVyKCkgb3ZlcnJpZGU7Ci0KLSAgICAvLyBPbmxpbmUga2VybmVsIHNuYXBzaG90IHdyaXRlciBkb2Vzbid0IGNhcmUgYWJvdXQgbWVyZ2Ugc2VxdWVuY2VzLgotICAgIC8vIFNvIGlnbm9yZS4KLSAgICBib29sIFZlcmlmeU1lcmdlT3BzKCkgY29uc3Qgbm9leGNlcHQgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQotCi0gIHByb3RlY3RlZDoKLSAgICBib29sIEVtaXRSYXdCbG9ja3ModWludDY0X3QgbmV3X2Jsb2NrX3N0YXJ0LCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBFbWl0WmVyb0Jsb2Nrcyh1aW50NjRfdCBuZXdfYmxvY2tfc3RhcnQsIHVpbnQ2NF90IG51bV9ibG9ja3MpIG92ZXJyaWRlOwotICAgIGJvb2wgRW1pdFhvckJsb2Nrcyh1aW50MzJfdCBuZXdfYmxvY2tfc3RhcnQsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplLCB1aW50MzJfdCBvbGRfYmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG9mZnNldCkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBFbWl0Q29weSh1aW50NjRfdCBuZXdfYmxvY2ssIHVpbnQ2NF90IG9sZF9ibG9jaywgdWludDY0X3QgbnVtX2Jsb2NrcyA9IDEpIG92ZXJyaWRlOwotICAgIGJvb2wgRW1pdExhYmVsKHVpbnQ2NF90IGxhYmVsKSBvdmVycmlkZTsKLSAgICBib29sIEVtaXRTZXF1ZW5jZURhdGEoc2l6ZV90IG51bV9vcHMsIGNvbnN0IHVpbnQzMl90KiBkYXRhKSBvdmVycmlkZTsKLQotICBwcml2YXRlOgotICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBzbmFwc2hvdF9mZF87Ci0gICAgdWludDY0X3QgY293X3NpemVfID0gMDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9pbmNsdWRlX3Rlc3QvbGlic25hcHNob3QvdGVzdF9oZWxwZXJzLmggYi9mc19tZ3IvbGlic25hcHNob3QvaW5jbHVkZV90ZXN0L2xpYnNuYXBzaG90L3Rlc3RfaGVscGVycy5oCmluZGV4IDI0YzkxYTguLjFjZDY2NTEgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9pbmNsdWRlX3Rlc3QvbGlic25hcHNob3QvdGVzdF9oZWxwZXJzLmgKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L2luY2x1ZGVfdGVzdC9saWJzbmFwc2hvdC90ZXN0X2hlbHBlcnMuaApAQCAtMzAsNiArMzAsOCBAQAogI2luY2x1ZGUgPHN0b3JhZ2VfbGl0ZXJhbHMvc3RvcmFnZV9saXRlcmFscy5oPgogI2luY2x1ZGUgPHVwZGF0ZV9lbmdpbmUvdXBkYXRlX21ldGFkYXRhLnBiLmg+CiAKKyNpbmNsdWRlICJ1dGlsaXR5LmgiCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBzbmFwc2hvdCB7CiAKQEAgLTc3LDcgKzc5LDcgQEAKICAgICAgICAgOiBUZXN0RGV2aWNlSW5mbyhmYWtlX3N1cGVyKSB7CiAgICAgICAgIHNldF9zbG90X3N1ZmZpeChzbG90X3N1ZmZpeCk7CiAgICAgfQotICAgIHN0ZDo6c3RyaW5nIEdldE1ldGFkYXRhRGlyKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gIi9tZXRhZGF0YS9vdGEvdGVzdCJzOyB9CisgICAgc3RkOjpzdHJpbmcgR2V0TWV0YWRhdGFEaXIoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtZXRhZGF0YV9kaXJfOyB9CiAgICAgc3RkOjpzdHJpbmcgR2V0U2xvdFN1ZmZpeCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHNsb3Rfc3VmZml4XzsgfQogICAgIHN0ZDo6c3RyaW5nIEdldE90aGVyU2xvdFN1ZmZpeCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHNsb3Rfc3VmZml4XyA9PSAiX2EiID8gIl9iIiA6ICJfYSI7IH0KICAgICBzdGQ6OnN0cmluZyBHZXRTdXBlckRldmljZShbW21heWJlX3VudXNlZF1dIHVpbnQzMl90IHNsb3QpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICJzdXBlciI7IH0KQEAgLTkwLDYgKzkyLDcgQEAKICAgICB9CiAgICAgYm9vbCBJc092ZXJsYXlmc1NldHVwKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KICAgICBib29sIElzUmVjb3ZlcnkoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiByZWNvdmVyeV87IH0KKyAgICBib29sIFNldEFjdGl2ZUJvb3RTbG90KFtbbWF5YmVfdW51c2VkXV0gdW5zaWduZWQgaW50IHNsb3QpIG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KICAgICBib29sIFNldFNsb3RBc1VuYm9vdGFibGUodW5zaWduZWQgaW50IHNsb3QpIG92ZXJyaWRlIHsKICAgICAgICAgdW5ib290YWJsZV9zbG90c18uaW5zZXJ0KHNsb3QpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTExNyw2ICsxMjAsNyBAQAogICAgIHZvaWQgc2V0X2RtKGFuZHJvaWQ6OmRtOjpJRGV2aWNlTWFwcGVyKiBkbSkgeyBkbV8gPSBkbTsgfQogCiAgICAgTWVyZ2VTdGF0dXMgbWVyZ2Vfc3RhdHVzKCkgY29uc3QgeyByZXR1cm4gbWVyZ2Vfc3RhdHVzXzsgfQorICAgIGJvb2wgSXNUZW1wTWV0YWRhdGEoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0ZW1wX21ldGFkYXRhXzsgfQogCiAgIHByaXZhdGU6CiAgICAgc3RkOjpzdHJpbmcgc2xvdF9zdWZmaXhfID0gIl9hIjsKQEAgLTEyNiw2ICsxMzAsOCBAQAogICAgIGJvb2wgZmlyc3Rfc3RhZ2VfaW5pdF8gPSBmYWxzZTsKICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8dWludDMyX3Q+IHVuYm9vdGFibGVfc2xvdHNfOwogICAgIGFuZHJvaWQ6OmRtOjpJRGV2aWNlTWFwcGVyKiBkbV8gPSBudWxscHRyOworICAgIHN0ZDo6c3RyaW5nIG1ldGFkYXRhX2Rpcl8gPSAiL21ldGFkYXRhL290YS90ZXN0IjsKKyAgICBib29sIHRlbXBfbWV0YWRhdGFfID0gZmFsc2U7CiB9OwogCiBjbGFzcyBEZXZpY2VNYXBwZXJXcmFwcGVyIDogcHVibGljIGFuZHJvaWQ6OmRtOjpJRGV2aWNlTWFwcGVyIHsKQEAgLTE1NSw2ICsxNjEsOSBAQAogICAgIHZpcnR1YWwgYm9vbCBHZXRUYWJsZVN0YXR1cyhjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgc3RkOjp2ZWN0b3I8VGFyZ2V0SW5mbz4qIHRhYmxlKSB7CiAgICAgICAgIHJldHVybiBpbXBsXy5HZXRUYWJsZVN0YXR1cyhuYW1lLCB0YWJsZSk7CiAgICAgfQorICAgIHZpcnR1YWwgYm9vbCBHZXRUYWJsZVN0YXR1c0ltYShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgc3RkOjp2ZWN0b3I8VGFyZ2V0SW5mbz4qIHRhYmxlKSB7CisgICAgICAgIHJldHVybiBpbXBsXy5HZXRUYWJsZVN0YXR1c0ltYShuYW1lLCB0YWJsZSk7CisgICAgfQogICAgIHZpcnR1YWwgYm9vbCBHZXREbURldmljZVBhdGhCeU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHN0ZDo6c3RyaW5nKiBwYXRoKSB7CiAgICAgICAgIHJldHVybiBpbXBsXy5HZXREbURldmljZVBhdGhCeU5hbWUobmFtZSwgcGF0aCk7CiAgICAgfQpAQCAtMTk4LDcgKzIwNyw3IEBACiAvLyBFeHBlY3Qgc3BhY2Ugb2YgfHBhdGh8IGlzIG11bHRpcGxlIG9mIDRLLgogYm9vbCBXcml0ZVJhbmRvbURhdGEoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHN0ZDo6b3B0aW9uYWw8c2l6ZV90PiBleHBlY3Rfc2l6ZSA9IHN0ZDo6bnVsbG9wdCwKICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBoYXNoID0gbnVsbHB0cik7Ci1zdGQ6OnN0cmluZyBIYXNoU25hcHNob3QoSVNuYXBzaG90V3JpdGVyKiB3cml0ZXIpOworc3RkOjpzdHJpbmcgSGFzaFNuYXBzaG90KElDb3dXcml0ZXI6OkZpbGVEZXNjcmlwdG9yKiB3cml0ZXIpOwogCiBzdGQ6OnN0cmluZyBUb0hleFN0cmluZyhjb25zdCB1aW50OF90KiBidWYsIHNpemVfdCBsZW4pOwogCkBAIC0yMTQsMjkgKzIyMyw2IEBACiAvLyBHZXQgcGFydGl0aW9uIHNpemUgZnJvbSB1cGRhdGUgcGFja2FnZSBtZXRhZGF0YS4KIHVpbnQ2NF90IEdldFNpemUoUGFydGl0aW9uVXBkYXRlKiBwYXJ0aXRpb25fdXBkYXRlKTsKIAotLy8gVXRpbCBjbGFzcyBmb3IgdGVzdCBjYXNlcyBvbiBsb3cgc3BhY2Ugc2NlbmFyaW8uIFRoZXNlIHRlc3RzIGFzc3VtZXMgaW1hZ2UgbWFuYWdlcgotLy8gdXNlcyAvZGF0YSBhcyBiYWNrdXAgZGV2aWNlLgotY2xhc3MgTG93U3BhY2VVc2VyZGF0YSB7Ci0gIHB1YmxpYzoKLSAgICAvLyBTZXQgdGhlIG1heGltdW0gZnJlZSBzcGFjZSBhbGxvd2VkIGZvciB0aGlzIHRlc3QuIElmIC91c2VyZGF0YSBoYXMgbW9yZSBzcGFjZSB0aGFuIHRoZSBnaXZlbgotICAgIC8vIG51bWJlciwgYSBmaWxlIGlzIGFsbG9jYXRlZCB0byBjb25zdW1lIHNwYWNlLgotICAgIEFzc2VydGlvblJlc3VsdCBJbml0KHVpbnQ2NF90IG1heF9mcmVlX3NwYWNlKTsKLQotICAgIHVpbnQ2NF90IGZyZWVfc3BhY2UoKSBjb25zdDsKLSAgICB1aW50NjRfdCBhdmFpbGFibGVfc3BhY2UoKSBjb25zdDsKLSAgICB1aW50NjRfdCBic2l6ZSgpIGNvbnN0OwotCi0gIHByaXZhdGU6Ci0gICAgQXNzZXJ0aW9uUmVzdWx0IFJlYWRVc2VyZGF0YVN0YXRzKCk7Ci0KLSAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIqIGtVc2VyRGF0YURldmljZSA9ICIvZGF0YSI7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFRlbXBvcmFyeUZpbGU+IGJpZ19maWxlXzsKLSAgICBib29sIGluaXRpYWxpemVkXyA9IGZhbHNlOwotICAgIHVpbnQ2NF90IGZyZWVfc3BhY2VfID0gMDsKLSAgICB1aW50NjRfdCBhdmFpbGFibGVfc3BhY2VfID0gMDsKLSAgICB1aW50NjRfdCBic2l6ZV8gPSAwOwotfTsKLQogYm9vbCBJc1ZpcnR1YWxBYkVuYWJsZWQoKTsKIAogI2RlZmluZSBTS0lQX0lGX05PTl9WSVJUVUFMX0FCKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTI1NCw1ICsyNDAsMjEgQEAKIAogI2RlZmluZSBSRVRVUk5fSUZfTk9OX1ZJUlRVQUxfQUIoKSBSRVRVUk5fSUZfTk9OX1ZJUlRVQUxfQUJfTVNHKCIiKQogCisjZGVmaW5lIFNLSVBfSUZfVkVORE9SX09OX0FORFJPSURfUygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoSXNWZW5kb3JGcm9tQW5kcm9pZDEyKCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBHVEVTVF9TS0lQKCkgPDwgIlNraXAgdGVzdCBhcyBWZW5kb3IgcGFydGl0aW9uIGlzIG9uIEFuZHJvaWQgUyI7IFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFJFVFVSTl9JRl9WRU5ET1JfT05fQU5EUk9JRF9TX01TRyhtc2cpIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoSXNWZW5kb3JGcm9tQW5kcm9pZDEyKCkpIHsgICAgICAgICBcCisgICAgICAgICAgICBzdGQ6OmNlcnIgPDwgKG1zZyk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBSRVRVUk5fSUZfVkVORE9SX09OX0FORFJPSURfUygpIFJFVFVSTl9JRl9WRU5ET1JfT05fQU5EUk9JRF9TX01TRygiIikKKwogfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90CiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9jb3dfYXBpX3Rlc3QuY3BwIGIvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9jb3dfYXBpX3Rlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjJjZTU1Li4wMDAwMDAwCi0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvY293X2FwaV90ZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0ODggKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaW5jbHVkZSA8Y3N0ZGlvPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzdHJpbmdfdmlldz4KLQotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPGxpYnNuYXBzaG90L2Nvd19yZWFkZXIuaD4KLSNpbmNsdWRlIDxsaWJzbmFwc2hvdC9jb3dfd3JpdGVyLmg+Ci0KLXVzaW5nIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmU7Ci11c2luZyB0ZXN0aW5nOjpBc3NlcnRpb25SZXN1bHQ7Ci11c2luZyB0ZXN0aW5nOjpBc3NlcnRpb25TdWNjZXNzOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2Ugc25hcHNob3QgewotCi1jbGFzcyBDb3dUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gIHByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgICAgIGNvd18gPSBzdGQ6Om1ha2VfdW5pcXVlPFRlbXBvcmFyeUZpbGU+KCk7Ci0gICAgICAgIEFTU0VSVF9HRShjb3dfLT5mZCwgMCkgPDwgc3RyZXJyb3IoZXJybm8pOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsgY293XyA9IG51bGxwdHI7IH0KLQotICAgIHN0ZDo6dW5pcXVlX3B0cjxUZW1wb3JhcnlGaWxlPiBjb3dfOwotfTsKLQotLy8gU2luayB0aGF0IGFsd2F5cyBhcHBlbmRzIHRvIHRoZSBlbmQgb2YgYSBzdHJpbmcuCi1jbGFzcyBTdHJpbmdTaW5rIDogcHVibGljIElCeXRlU2luayB7Ci0gIHB1YmxpYzoKLSAgICB2b2lkKiBHZXRCdWZmZXIoc2l6ZV90IHJlcXVlc3RlZCwgc2l6ZV90KiBhY3R1YWwpIG92ZXJyaWRlIHsKLSAgICAgICAgc2l6ZV90IG9sZF9zaXplID0gc3RyZWFtXy5zaXplKCk7Ci0gICAgICAgIHN0cmVhbV8ucmVzaXplKG9sZF9zaXplICsgcmVxdWVzdGVkLCAnXDAnKTsKLSAgICAgICAgKmFjdHVhbCA9IHJlcXVlc3RlZDsKLSAgICAgICAgcmV0dXJuIHN0cmVhbV8uZGF0YSgpICsgb2xkX3NpemU7Ci0gICAgfQotICAgIGJvb2wgUmV0dXJuRGF0YSh2b2lkKiwgc2l6ZV90KSBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9Ci0gICAgdm9pZCBSZXNldCgpIHsgc3RyZWFtXy5jbGVhcigpOyB9Ci0KLSAgICBzdGQ6OnN0cmluZyYgc3RyZWFtKCkgeyByZXR1cm4gc3RyZWFtXzsgfQotCi0gIHByaXZhdGU6Ci0gICAgc3RkOjpzdHJpbmcgc3RyZWFtXzsKLX07Ci0KLVRFU1RfRihDb3dUZXN0LCBDb3B5Q29udGlndW91cykgewotICAgIENvd09wdGlvbnMgb3B0aW9uczsKLSAgICBvcHRpb25zLmNsdXN0ZXJfb3BzID0gMDsKLSAgICBDb3dXcml0ZXIgd3JpdGVyKG9wdGlvbnMpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkluaXRpYWxpemUoY293Xy0+ZmQpKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRDb3B5KDEwLCAxMDAwLCAxMDApKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuRmluYWxpemUoKSk7Ci0gICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOwotCi0gICAgQ293UmVhZGVyIHJlYWRlcjsKLSAgICBDb3dIZWFkZXIgaGVhZGVyOwotICAgIENvd0Zvb3RlciBmb290ZXI7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLkdldEhlYWRlcigmaGVhZGVyKSk7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLkdldEZvb3RlcigmZm9vdGVyKSk7Ci0gICAgQVNTRVJUX0VRKGhlYWRlci5tYWdpYywga0Nvd01hZ2ljTnVtYmVyKTsKLSAgICBBU1NFUlRfRVEoaGVhZGVyLm1ham9yX3ZlcnNpb24sIGtDb3dWZXJzaW9uTWFqb3IpOwotICAgIEFTU0VSVF9FUShoZWFkZXIubWlub3JfdmVyc2lvbiwga0Nvd1ZlcnNpb25NaW5vcik7Ci0gICAgQVNTRVJUX0VRKGhlYWRlci5ibG9ja19zaXplLCBvcHRpb25zLmJsb2NrX3NpemUpOwotICAgIEFTU0VSVF9FUShmb290ZXIub3AubnVtX29wcywgMTAwKTsKLQotICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKLSAgICBBU1NFUlRfTkUoaXRlciwgbnVsbHB0cik7Ci0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0KLSAgICBzaXplX3QgaSA9IDA7Ci0gICAgd2hpbGUgKCFpdGVyLT5Eb25lKCkpIHsKLSAgICAgICAgYXV0byBvcCA9ICZpdGVyLT5HZXQoKTsKLSAgICAgICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293Q29weU9wKTsKLSAgICAgICAgQVNTRVJUX0VRKG9wLT5jb21wcmVzc2lvbiwga0Nvd0NvbXByZXNzTm9uZSk7Ci0gICAgICAgIEFTU0VSVF9FUShvcC0+ZGF0YV9sZW5ndGgsIDApOwotICAgICAgICBBU1NFUlRfRVEob3AtPm5ld19ibG9jaywgMTAgKyBpKTsKLSAgICAgICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UsIDEwMDAgKyBpKTsKLSAgICAgICAgaXRlci0+TmV4dCgpOwotICAgICAgICBpICs9IDE7Ci0gICAgfQotCi0gICAgQVNTRVJUX0VRKGksIDEwMCk7Ci19Ci0KLVRFU1RfRihDb3dUZXN0LCBSZWFkV3JpdGUpIHsKLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDA7Ci0gICAgQ293V3JpdGVyIHdyaXRlcihvcHRpb25zKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5Jbml0aWFsaXplKGNvd18tPmZkKSk7Ci0KLSAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlRoaXMgaXMgc29tZSBkYXRhLCBiZWxpZXZlIGl0IjsKLSAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoMTAsIDIwKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFJhd0Jsb2Nrcyg1MCwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFplcm9CbG9ja3MoNTEsIDIpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuRmluYWxpemUoKSk7Ci0KLSAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7Ci0KLSAgICBDb3dSZWFkZXIgcmVhZGVyOwotICAgIENvd0hlYWRlciBoZWFkZXI7Ci0gICAgQ293Rm9vdGVyIGZvb3RlcjsKLSAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKLSAgICBBU1NFUlRfVFJVRShyZWFkZXIuR2V0SGVhZGVyKCZoZWFkZXIpKTsKLSAgICBBU1NFUlRfVFJVRShyZWFkZXIuR2V0Rm9vdGVyKCZmb290ZXIpKTsKLSAgICBBU1NFUlRfRVEoaGVhZGVyLm1hZ2ljLCBrQ293TWFnaWNOdW1iZXIpOwotICAgIEFTU0VSVF9FUShoZWFkZXIubWFqb3JfdmVyc2lvbiwga0Nvd1ZlcnNpb25NYWpvcik7Ci0gICAgQVNTRVJUX0VRKGhlYWRlci5taW5vcl92ZXJzaW9uLCBrQ293VmVyc2lvbk1pbm9yKTsKLSAgICBBU1NFUlRfRVEoaGVhZGVyLmJsb2NrX3NpemUsIG9wdGlvbnMuYmxvY2tfc2l6ZSk7Ci0gICAgQVNTRVJUX0VRKGZvb3Rlci5vcC5udW1fb3BzLCA0KTsKLQotICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKLSAgICBBU1NFUlRfTkUoaXRlciwgbnVsbHB0cik7Ci0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0gICAgYXV0byBvcCA9ICZpdGVyLT5HZXQoKTsKLQotICAgIEFTU0VSVF9FUShvcC0+dHlwZSwga0Nvd0NvcHlPcCk7Ci0gICAgQVNTRVJUX0VRKG9wLT5jb21wcmVzc2lvbiwga0Nvd0NvbXByZXNzTm9uZSk7Ci0gICAgQVNTRVJUX0VRKG9wLT5kYXRhX2xlbmd0aCwgMCk7Ci0gICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssIDEwKTsKLSAgICBBU1NFUlRfRVEob3AtPnNvdXJjZSwgMjApOwotCi0gICAgU3RyaW5nU2luayBzaW5rOwotCi0gICAgaXRlci0+TmV4dCgpOwotICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgIG9wID0gJml0ZXItPkdldCgpOwotCi0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293UmVwbGFjZU9wKTsKLSAgICBBU1NFUlRfRVEob3AtPmNvbXByZXNzaW9uLCBrQ293Q29tcHJlc3NOb25lKTsKLSAgICBBU1NFUlRfRVEob3AtPmRhdGFfbGVuZ3RoLCA0MDk2KTsKLSAgICBBU1NFUlRfRVEob3AtPm5ld19ibG9jaywgNTApOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci5SZWFkRGF0YSgqb3AsICZzaW5rKSk7Ci0gICAgQVNTRVJUX0VRKHNpbmsuc3RyZWFtKCksIGRhdGEpOwotCi0gICAgaXRlci0+TmV4dCgpOwotICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgIG9wID0gJml0ZXItPkdldCgpOwotCi0gICAgLy8gTm90ZTogdGhlIHplcm8gb3BlcmF0aW9uIGdldHMgc3BsaXQgaW50byB0d28gYmxvY2tzLgotICAgIEFTU0VSVF9FUShvcC0+dHlwZSwga0Nvd1plcm9PcCk7Ci0gICAgQVNTRVJUX0VRKG9wLT5jb21wcmVzc2lvbiwga0Nvd0NvbXByZXNzTm9uZSk7Ci0gICAgQVNTRVJUX0VRKG9wLT5kYXRhX2xlbmd0aCwgMCk7Ci0gICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssIDUxKTsKLSAgICBBU1NFUlRfRVEob3AtPnNvdXJjZSwgMCk7Ci0KLSAgICBpdGVyLT5OZXh0KCk7Ci0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0gICAgb3AgPSAmaXRlci0+R2V0KCk7Ci0KLSAgICBBU1NFUlRfRVEob3AtPnR5cGUsIGtDb3daZXJvT3ApOwotICAgIEFTU0VSVF9FUShvcC0+Y29tcHJlc3Npb24sIGtDb3dDb21wcmVzc05vbmUpOwotICAgIEFTU0VSVF9FUShvcC0+ZGF0YV9sZW5ndGgsIDApOwotICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCA1Mik7Ci0gICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UsIDApOwotCi0gICAgaXRlci0+TmV4dCgpOwotICAgIEFTU0VSVF9UUlVFKGl0ZXItPkRvbmUoKSk7Ci19Ci0KLVRFU1RfRihDb3dUZXN0LCBSZWFkV3JpdGVYb3IpIHsKLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDA7Ci0gICAgQ293V3JpdGVyIHdyaXRlcihvcHRpb25zKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5Jbml0aWFsaXplKGNvd18tPmZkKSk7Ci0KLSAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlRoaXMgaXMgc29tZSBkYXRhLCBiZWxpZXZlIGl0IjsKLSAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoMTAsIDIwKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFhvckJsb2Nrcyg1MCwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpLCAyNCwgMTApKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWmVyb0Jsb2Nrcyg1MSwgMikpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5GaW5hbGl6ZSgpKTsKLQotICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKLQotICAgIENvd1JlYWRlciByZWFkZXI7Ci0gICAgQ293SGVhZGVyIGhlYWRlcjsKLSAgICBDb3dGb290ZXIgZm9vdGVyOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci5HZXRIZWFkZXIoJmhlYWRlcikpOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci5HZXRGb290ZXIoJmZvb3RlcikpOwotICAgIEFTU0VSVF9FUShoZWFkZXIubWFnaWMsIGtDb3dNYWdpY051bWJlcik7Ci0gICAgQVNTRVJUX0VRKGhlYWRlci5tYWpvcl92ZXJzaW9uLCBrQ293VmVyc2lvbk1ham9yKTsKLSAgICBBU1NFUlRfRVEoaGVhZGVyLm1pbm9yX3ZlcnNpb24sIGtDb3dWZXJzaW9uTWlub3IpOwotICAgIEFTU0VSVF9FUShoZWFkZXIuYmxvY2tfc2l6ZSwgb3B0aW9ucy5ibG9ja19zaXplKTsKLSAgICBBU1NFUlRfRVEoZm9vdGVyLm9wLm51bV9vcHMsIDQpOwotCi0gICAgYXV0byBpdGVyID0gcmVhZGVyLkdldE9wSXRlcigpOwotICAgIEFTU0VSVF9ORShpdGVyLCBudWxscHRyKTsKLSAgICBBU1NFUlRfRkFMU0UoaXRlci0+RG9uZSgpKTsKLSAgICBhdXRvIG9wID0gJml0ZXItPkdldCgpOwotCi0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293Q29weU9wKTsKLSAgICBBU1NFUlRfRVEob3AtPmNvbXByZXNzaW9uLCBrQ293Q29tcHJlc3NOb25lKTsKLSAgICBBU1NFUlRfRVEob3AtPmRhdGFfbGVuZ3RoLCAwKTsKLSAgICBBU1NFUlRfRVEob3AtPm5ld19ibG9jaywgMTApOwotICAgIEFTU0VSVF9FUShvcC0+c291cmNlLCAyMCk7Ci0KLSAgICBTdHJpbmdTaW5rIHNpbms7Ci0KLSAgICBpdGVyLT5OZXh0KCk7Ci0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0gICAgb3AgPSAmaXRlci0+R2V0KCk7Ci0KLSAgICBBU1NFUlRfRVEob3AtPnR5cGUsIGtDb3dYb3JPcCk7Ci0gICAgQVNTRVJUX0VRKG9wLT5jb21wcmVzc2lvbiwga0Nvd0NvbXByZXNzTm9uZSk7Ci0gICAgQVNTRVJUX0VRKG9wLT5kYXRhX2xlbmd0aCwgNDA5Nik7Ci0gICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssIDUwKTsKLSAgICBBU1NFUlRfRVEob3AtPnNvdXJjZSwgOTgzMTQpOyAgLy8gNDA5NiAqIDI0ICsgMTAKLSAgICBBU1NFUlRfVFJVRShyZWFkZXIuUmVhZERhdGEoKm9wLCAmc2luaykpOwotICAgIEFTU0VSVF9FUShzaW5rLnN0cmVhbSgpLCBkYXRhKTsKLQotICAgIGl0ZXItPk5leHQoKTsKLSAgICBBU1NFUlRfRkFMU0UoaXRlci0+RG9uZSgpKTsKLSAgICBvcCA9ICZpdGVyLT5HZXQoKTsKLQotICAgIC8vIE5vdGU6IHRoZSB6ZXJvIG9wZXJhdGlvbiBnZXRzIHNwbGl0IGludG8gdHdvIGJsb2Nrcy4KLSAgICBBU1NFUlRfRVEob3AtPnR5cGUsIGtDb3daZXJvT3ApOwotICAgIEFTU0VSVF9FUShvcC0+Y29tcHJlc3Npb24sIGtDb3dDb21wcmVzc05vbmUpOwotICAgIEFTU0VSVF9FUShvcC0+ZGF0YV9sZW5ndGgsIDApOwotICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCA1MSk7Ci0gICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UsIDApOwotCi0gICAgaXRlci0+TmV4dCgpOwotICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgIG9wID0gJml0ZXItPkdldCgpOwotCi0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293WmVyb09wKTsKLSAgICBBU1NFUlRfRVEob3AtPmNvbXByZXNzaW9uLCBrQ293Q29tcHJlc3NOb25lKTsKLSAgICBBU1NFUlRfRVEob3AtPmRhdGFfbGVuZ3RoLCAwKTsKLSAgICBBU1NFUlRfRVEob3AtPm5ld19ibG9jaywgNTIpOwotICAgIEFTU0VSVF9FUShvcC0+c291cmNlLCAwKTsKLQotICAgIGl0ZXItPk5leHQoKTsKLSAgICBBU1NFUlRfVFJVRShpdGVyLT5Eb25lKCkpOwotfQotCi1URVNUX0YoQ293VGVzdCwgQ29tcHJlc3NHeikgewotICAgIENvd09wdGlvbnMgb3B0aW9uczsKLSAgICBvcHRpb25zLmNsdXN0ZXJfb3BzID0gMDsKLSAgICBvcHRpb25zLmNvbXByZXNzaW9uID0gImd6IjsKLSAgICBDb3dXcml0ZXIgd3JpdGVyKG9wdGlvbnMpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkluaXRpYWxpemUoY293Xy0+ZmQpKTsKLQotICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSAiVGhpcyBpcyBzb21lIGRhdGEsIGJlbGlldmUgaXQiOwotICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkUmF3QmxvY2tzKDUwLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuRmluYWxpemUoKSk7Ci0KLSAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7Ci0KLSAgICBDb3dSZWFkZXIgcmVhZGVyOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOwotCi0gICAgYXV0byBpdGVyID0gcmVhZGVyLkdldE9wSXRlcigpOwotICAgIEFTU0VSVF9ORShpdGVyLCBudWxscHRyKTsKLSAgICBBU1NFUlRfRkFMU0UoaXRlci0+RG9uZSgpKTsKLSAgICBhdXRvIG9wID0gJml0ZXItPkdldCgpOwotCi0gICAgU3RyaW5nU2luayBzaW5rOwotCi0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293UmVwbGFjZU9wKTsKLSAgICBBU1NFUlRfRVEob3AtPmNvbXByZXNzaW9uLCBrQ293Q29tcHJlc3NHeik7Ci0gICAgQVNTRVJUX0VRKG9wLT5kYXRhX2xlbmd0aCwgNTYpOyAgLy8gY29tcHJlc3NlZCEKLSAgICBBU1NFUlRfRVEob3AtPm5ld19ibG9jaywgNTApOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci5SZWFkRGF0YSgqb3AsICZzaW5rKSk7Ci0gICAgQVNTRVJUX0VRKHNpbmsuc3RyZWFtKCksIGRhdGEpOwotCi0gICAgaXRlci0+TmV4dCgpOwotICAgIEFTU0VSVF9UUlVFKGl0ZXItPkRvbmUoKSk7Ci19Ci0KLWNsYXNzIENvbXByZXNzaW9uUldUZXN0IDogcHVibGljIENvd1Rlc3QsIHB1YmxpYyB0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8Y29uc3QgY2hhcio+IHt9OwotCi1URVNUX1AoQ29tcHJlc3Npb25SV1Rlc3QsIFRocmVhZGVkQmF0Y2hXcml0ZXMpIHsKLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5jb21wcmVzc2lvbiA9IEdldFBhcmFtKCk7Ci0gICAgb3B0aW9ucy5udW1fY29tcHJlc3NfdGhyZWFkcyA9IDI7Ci0KLSAgICBDb3dXcml0ZXIgd3JpdGVyKG9wdGlvbnMpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkluaXRpYWxpemUoY293Xy0+ZmQpKTsKLQotICAgIHN0ZDo6c3RyaW5nIHhvcl9kYXRhID0gIlRoaXMgaXMgdGVzdCBkYXRhLTEuIFRlc3RpbmcgeG9yIjsKLSAgICB4b3JfZGF0YS5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplLCAnXDAnKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWG9yQmxvY2tzKDUwLCB4b3JfZGF0YS5kYXRhKCksIHhvcl9kYXRhLnNpemUoKSwgMjQsIDEwKSk7Ci0KLSAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlRoaXMgaXMgdGVzdCBkYXRhLTIuIFRlc3RpbmcgcmVwbGFjZSBvcHMiOwotICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSAqIDIwNDgsICdcMCcpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRSYXdCbG9ja3MoMTAwLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpKTsKLQotICAgIHN0ZDo6c3RyaW5nIGRhdGEyID0gIlRoaXMgaXMgdGVzdCBkYXRhLTMuIFRlc3RpbmcgcmVwbGFjZSBvcHMiOwotICAgIGRhdGEyLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUgKiAyNTksICdcMCcpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRSYXdCbG9ja3MoNjAwMCwgZGF0YTIuZGF0YSgpLCBkYXRhMi5zaXplKCkpKTsKLQotICAgIHN0ZDo6c3RyaW5nIGRhdGEzID0gIlRoaXMgaXMgdGVzdCBkYXRhLTQuIFRlc3RpbmcgcmVwbGFjZSBvcHMiOwotICAgIGRhdGEzLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRSYXdCbG9ja3MoOTAwMCwgZGF0YTMuZGF0YSgpLCBkYXRhMy5zaXplKCkpKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5GaW5hbGl6ZSgpKTsKLQotICAgIGludCBleHBlY3RlZF9ibG9ja3MgPSAoMSArIDIwNDggKyAyNTkgKyAxKTsKLSAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7Ci0KLSAgICBDb3dSZWFkZXIgcmVhZGVyOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOwotCi0gICAgYXV0byBpdGVyID0gcmVhZGVyLkdldE9wSXRlcigpOwotICAgIEFTU0VSVF9ORShpdGVyLCBudWxscHRyKTsKLQotICAgIGludCB0b3RhbF9ibG9ja3MgPSAwOwotICAgIHdoaWxlICghaXRlci0+RG9uZSgpKSB7Ci0gICAgICAgIGF1dG8gb3AgPSAmaXRlci0+R2V0KCk7Ci0KLSAgICAgICAgaWYgKG9wLT50eXBlID09IGtDb3dYb3JPcCkgewotICAgICAgICAgICAgdG90YWxfYmxvY2tzICs9IDE7Ci0gICAgICAgICAgICBTdHJpbmdTaW5rIHNpbms7Ci0gICAgICAgICAgICBBU1NFUlRfRVEob3AtPm5ld19ibG9jaywgNTApOwotICAgICAgICAgICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UsIDk4MzE0KTsgIC8vIDQwOTYgKiAyNCArIDEwCi0gICAgICAgICAgICBBU1NFUlRfVFJVRShyZWFkZXIuUmVhZERhdGEoKm9wLCAmc2luaykpOwotICAgICAgICAgICAgQVNTRVJUX0VRKHNpbmsuc3RyZWFtKCksIHhvcl9kYXRhKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvcC0+dHlwZSA9PSBrQ293UmVwbGFjZU9wKSB7Ci0gICAgICAgICAgICB0b3RhbF9ibG9ja3MgKz0gMTsKLSAgICAgICAgICAgIGlmIChvcC0+bmV3X2Jsb2NrID09IDEwMCkgewotICAgICAgICAgICAgICAgIFN0cmluZ1Npbmsgc2luazsKLSAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShyZWFkZXIuUmVhZERhdGEoKm9wLCAmc2luaykpOwotICAgICAgICAgICAgICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgQVNTRVJUX0VRKHNpbmsuc3RyZWFtKCksIGRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG9wLT5uZXdfYmxvY2sgPT0gNjAwMCkgewotICAgICAgICAgICAgICAgIFN0cmluZ1Npbmsgc2luazsKLSAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShyZWFkZXIuUmVhZERhdGEoKm9wLCAmc2luaykpOwotICAgICAgICAgICAgICAgIGRhdGEyLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUpOwotICAgICAgICAgICAgICAgIEFTU0VSVF9FUShzaW5rLnN0cmVhbSgpLCBkYXRhMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob3AtPm5ld19ibG9jayA9PSA5MDAwKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nU2luayBzaW5rOwotICAgICAgICAgICAgICAgIEFTU0VSVF9UUlVFKHJlYWRlci5SZWFkRGF0YSgqb3AsICZzaW5rKSk7Ci0gICAgICAgICAgICAgICAgQVNTRVJUX0VRKHNpbmsuc3RyZWFtKCksIGRhdGEzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGl0ZXItPk5leHQoKTsKLSAgICB9Ci0KLSAgICBBU1NFUlRfRVEodG90YWxfYmxvY2tzLCBleHBlY3RlZF9ibG9ja3MpOwotfQotCi1URVNUX1AoQ29tcHJlc3Npb25SV1Rlc3QsIE5vQmF0Y2hXcml0ZXMpIHsKLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5jb21wcmVzc2lvbiA9IEdldFBhcmFtKCk7Ci0gICAgb3B0aW9ucy5udW1fY29tcHJlc3NfdGhyZWFkcyA9IDE7Ci0gICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDA7Ci0KLSAgICBDb3dXcml0ZXIgd3JpdGVyKG9wdGlvbnMpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkluaXRpYWxpemUoY293Xy0+ZmQpKTsKLQotICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSAiVGVzdGluZyByZXBsYWNlIG9wcyB3aXRob3V0IGJhdGNoIHdyaXRlcyI7Ci0gICAgZGF0YS5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplICogMTAyNCwgJ1wwJyk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFJhd0Jsb2Nrcyg1MCwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKSk7Ci0KLSAgICBzdGQ6OnN0cmluZyBkYXRhMiA9ICJUZXN0aW5nIG9kZCBibG9ja3Mgd2l0aG91dCBiYXRjaCB3cml0ZXMiOwotICAgIGRhdGEyLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUgKiAxMTEsICdcMCcpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRSYXdCbG9ja3MoMzAwMCwgZGF0YTIuZGF0YSgpLCBkYXRhMi5zaXplKCkpKTsKLQotICAgIHN0ZDo6c3RyaW5nIGRhdGEzID0gIlRlc3Rpbmcgc2luZ2xlIDRrIGJsb2NrIjsKLSAgICBkYXRhMy5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplLCAnXDAnKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkUmF3QmxvY2tzKDUwMDAsIGRhdGEzLmRhdGEoKSwgZGF0YTMuc2l6ZSgpKSk7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuRmluYWxpemUoKSk7Ci0KLSAgICBpbnQgZXhwZWN0ZWRfYmxvY2tzID0gKDEwMjQgKyAxMTEgKyAxKTsKLSAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7Ci0KLSAgICBDb3dSZWFkZXIgcmVhZGVyOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOwotCi0gICAgYXV0byBpdGVyID0gcmVhZGVyLkdldE9wSXRlcigpOwotICAgIEFTU0VSVF9ORShpdGVyLCBudWxscHRyKTsKLQotICAgIGludCB0b3RhbF9ibG9ja3MgPSAwOwotICAgIHdoaWxlICghaXRlci0+RG9uZSgpKSB7Ci0gICAgICAgIGF1dG8gb3AgPSAmaXRlci0+R2V0KCk7Ci0KLSAgICAgICAgaWYgKG9wLT50eXBlID09IGtDb3dSZXBsYWNlT3ApIHsKLSAgICAgICAgICAgIHRvdGFsX2Jsb2NrcyArPSAxOwotICAgICAgICAgICAgaWYgKG9wLT5uZXdfYmxvY2sgPT0gNTApIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdTaW5rIHNpbms7Ci0gICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUocmVhZGVyLlJlYWREYXRhKCpvcCwgJnNpbmspKTsKLSAgICAgICAgICAgICAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUpOwotICAgICAgICAgICAgICAgIEFTU0VSVF9FUShzaW5rLnN0cmVhbSgpLCBkYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvcC0+bmV3X2Jsb2NrID09IDMwMDApIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdTaW5rIHNpbms7Ci0gICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUocmVhZGVyLlJlYWREYXRhKCpvcCwgJnNpbmspKTsKLSAgICAgICAgICAgICAgICBkYXRhMi5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplKTsKLSAgICAgICAgICAgICAgICBBU1NFUlRfRVEoc2luay5zdHJlYW0oKSwgZGF0YTIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG9wLT5uZXdfYmxvY2sgPT0gNTAwMCkgewotICAgICAgICAgICAgICAgIFN0cmluZ1Npbmsgc2luazsKLSAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShyZWFkZXIuUmVhZERhdGEoKm9wLCAmc2luaykpOwotICAgICAgICAgICAgICAgIEFTU0VSVF9FUShzaW5rLnN0cmVhbSgpLCBkYXRhMyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpdGVyLT5OZXh0KCk7Ci0gICAgfQotCi0gICAgQVNTRVJUX0VRKHRvdGFsX2Jsb2NrcywgZXhwZWN0ZWRfYmxvY2tzKTsKLX0KLQotSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKENvd0FwaSwgQ29tcHJlc3Npb25SV1Rlc3QsIHRlc3Rpbmc6OlZhbHVlcygibm9uZSIsICJneiIsICJicm90bGkiLCAibHo0IikpOwotCi1URVNUX0YoQ293VGVzdCwgQ2x1c3RlckNvbXByZXNzR3opIHsKLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5jb21wcmVzc2lvbiA9ICJneiI7Ci0gICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDI7Ci0gICAgQ293V3JpdGVyIHdyaXRlcihvcHRpb25zKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5Jbml0aWFsaXplKGNvd18tPmZkKSk7Ci0KLSAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlRoaXMgaXMgc29tZSBkYXRhLCBiZWxpZXZlIGl0IjsKLSAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRSYXdCbG9ja3MoNTAsIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSkpOwotCi0gICAgc3RkOjpzdHJpbmcgZGF0YTIgPSAiTW9yZSBkYXRhISI7Ci0gICAgZGF0YTIucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFJhd0Jsb2Nrcyg1MSwgZGF0YTIuZGF0YSgpLCBkYXRhMi5zaXplKCkpKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5GaW5hbGl6ZSgpKTsKLQotICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKLQotICAgIENvd1JlYWRlciByZWFkZXI7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7Ci0KLSAgICBhdXRvIGl0ZXIgPSByZWFkZXIuR2V0T3BJdGVyKCk7Ci0gICAgQVNTRVJUX05FKGl0ZXIsIG51bGxwdHIpOwotICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgIGF1dG8gb3AgPSAmaXRlci0+R2V0KCk7Ci0KLSAgICBTdHJpbmdTaW5rIHNpbms7Ci0KLSAgICBBU1NFUlRfRVEob3AtPnR5cGUsIGtDb3dSZXBsYWNlT3ApOwotICAgIEFTU0VSVF9FUShvcC0+Y29tcHJlc3Npb24sIGtDb3dDb21wcmVzc0d6KTsKLSAgICBBU1NFUlRfRVEob3AtPmRhdGFfbGVuZ3RoLCA1Nik7ICAvLyBjb21wcmVzc2VkIQotICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCA1MCk7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlJlYWREYXRhKCpvcCwgJnNpbmspKTsKLSAgICBBU1NFUlRfRVEoc2luay5zdHJlYW0oKSwgZGF0YSk7Ci0KLSAgICBpdGVyLT5OZXh0KCk7Ci0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0gICAgb3AgPSAmaXRlci0+R2V0KCk7Ci0KLSAgICBBU1NFUlRfRVEob3AtPnR5cGUsIGtDb3dDbHVzdGVyT3ApOwotCi0gICAgaXRlci0+TmV4dCgpOwotICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgIG9wID0gJml0ZXItPkdldCgpOwotCi0gICAgc2luay5SZXNldCgpOwotICAgIEFTU0VSVF9FUShvcC0+Y29tcHJlc3Npb24sIGtDb3dDb21wcmVzc0d6KTsKLSAgICBBU1NFUlRfRVEob3AtPmRhdGFfbGVuZ3RoLCA0MSk7ICAvLyBjb21wcmVzc2VkIQotICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCA1MSk7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlJlYWREYXRhKCpvcCwgJnNpbmspKTsKLSAgICBBU1NFUlRfRVEoc2luay5zdHJlYW0oKSwgZGF0YTIpOwotCi0gICAgaXRlci0+TmV4dCgpOwotICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgIG9wID0gJml0ZXItPkdldCgpOwotCi0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293Q2x1c3Rlck9wKTsKLQotICAgIGl0ZXItPk5leHQoKTsKLSAgICBBU1NFUlRfVFJVRShpdGVyLT5Eb25lKCkpOwotfQotCi1URVNUX0YoQ293VGVzdCwgQ29tcHJlc3NUd29CbG9ja3MpIHsKLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5jb21wcmVzc2lvbiA9ICJneiI7Ci0gICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDA7Ci0gICAgQ293V3JpdGVyIHdyaXRlcihvcHRpb25zKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5Jbml0aWFsaXplKGNvd18tPmZkKSk7Ci0KLSAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlRoaXMgaXMgc29tZSBkYXRhLCBiZWxpZXZlIGl0IjsKLSAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUgKiAyLCAnXDAnKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRSYXdCbG9ja3MoNTAsIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5GaW5hbGl6ZSgpKTsKLQotICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKLQotICAgIENvd1JlYWRlciByZWFkZXI7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7Ci0KLSAgICBhdXRvIGl0ZXIgPSByZWFkZXIuR2V0T3BJdGVyKCk7Ci0gICAgQVNTRVJUX05FKGl0ZXIsIG51bGxwdHIpOwotICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgIGl0ZXItPk5leHQoKTsKLSAgICBBU1NFUlRfRkFMU0UoaXRlci0+RG9uZSgpKTsKLQotICAgIFN0cmluZ1Npbmsgc2luazsKLQotICAgIGF1dG8gb3AgPSAmaXRlci0+R2V0KCk7Ci0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293UmVwbGFjZU9wKTsKLSAgICBBU1NFUlRfRVEob3AtPmNvbXByZXNzaW9uLCBrQ293Q29tcHJlc3NHeik7Ci0gICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssIDUxKTsKLSAgICBBU1NFUlRfVFJVRShyZWFkZXIuUmVhZERhdGEoKm9wLCAmc2luaykpOwotfQotCi0vLyBPbmx5IHJldHVybiAxLWJ5dGUgYnVmZmVycywgdG8gc3RyZXNzIHRlc3QgdGhlIHBhcnRpYWwgcmVhZCBsb2dpYyBpbgotLy8gQ293UmVhZGVyLgotY2xhc3MgSG9ycmlibGVTdHJpbmdTaW5rIDogcHVibGljIFN0cmluZ1NpbmsgewotICBwdWJsaWM6Ci0gICAgdm9pZCogR2V0QnVmZmVyKHNpemVfdCwgc2l6ZV90KiBhY3R1YWwpIG92ZXJyaWRlIHsgcmV0dXJuIFN0cmluZ1Npbms6OkdldEJ1ZmZlcigxLCBhY3R1YWwpOyB9Ci19OwotCi1jbGFzcyBDb21wcmVzc2lvblRlc3QgOiBwdWJsaWMgQ293VGVzdCwgcHVibGljIHRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxjb25zdCBjaGFyKj4ge307Ci0KLVRFU1RfUChDb21wcmVzc2lvblRlc3QsIEhvcnJpYmxlU2luaykgewotICAgIENvd09wdGlvbnMgb3B0aW9uczsKLSAgICBvcHRpb25zLmNvbXByZXNzaW9uID0gR2V0UGFyYW0oKTsKLSAgICBvcHRpb25zLmNsdXN0ZXJfb3BzID0gMDsKLSAgICBDb3dXcml0ZXIgd3JpdGVyKG9wdGlvbnMpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkluaXRpYWxpemUoY293Xy0+ZmQpKTsKLQotICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSAiVGhpcyBpcyBzb21lIGRhdGEsIGJlbGlldmUgaXQiOwotICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkUmF3QmxvY2tzKDUwLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuRmluYWxpemUoKSk7Ci0KLSAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7Ci0KLSAgICBDb3dSZWFkZXIgcmVhZGVyOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOwotCi0gICAgYXV0byBpdGVyID0gcmVhZGVyLkdldE9wSXRlcigpOwotICAgIEFTU0VSVF9ORShpdGVyLCBudWxscHRyKTsKLSAgICBBU1NFUlRfRkFMU0UoaXRlci0+RG9uZSgpKTsKLQotICAgIEhvcnJpYmxlU3RyaW5nU2luayBzaW5rOwotICAgIGF1dG8gb3AgPSAmaXRlci0+R2V0KCk7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlJlYWREYXRhKCpvcCwgJnNpbmspKTsKLSAgICBBU1NFUlRfRVEoc2luay5zdHJlYW0oKSwgZGF0YSk7Ci19Ci0KLUlOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChDb3dBcGksIENvbXByZXNzaW9uVGVzdCwgdGVzdGluZzo6VmFsdWVzKCJub25lIiwgImd6IiwgImJyb3RsaSIpKTsKLQotVEVTVF9GKENvd1Rlc3QsIEdldFNpemUpIHsKLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDA7Ci0gICAgQ293V3JpdGVyIHdyaXRlcihvcHRpb25zKTsKLSAgICBpZiAoZnRydW5jYXRlKGNvd18tPmZkLCAwKSA8IDApIHsKLSAgICAgICAgcGVycm9yKCJGYWlscyB0byBzZXQgdGVtcCBmaWxlIHNpemUiKTsKLSAgICAgICAgRkFJTCgpOwotICAgIH0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuSW5pdGlhbGl6ZShjb3dfLT5mZCkpOwotCi0gICAgc3RkOjpzdHJpbmcgZGF0YSA9ICJUaGlzIGlzIHNvbWUgZGF0YSwgYmVsaWV2ZSBpdCI7Ci0gICAgZGF0YS5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplLCAnXDAnKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRDb3B5KDEwLCAyMCkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRSYXdCbG9ja3MoNTAsIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRaZXJvQmxvY2tzKDUxLCAyKSk7Ci0gICAgYXV0byBzaXplX2JlZm9yZSA9IHdyaXRlci5HZXRDb3dTaXplKCk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkZpbmFsaXplKCkpOwotICAgIGF1dG8gc2l6ZV9hZnRlciA9IHdyaXRlci5HZXRDb3dTaXplKCk7Ci0gICAgQVNTRVJUX0VRKHNpemVfYmVmb3JlLCBzaXplX2FmdGVyKTsKLSAgICBzdHJ1Y3Qgc3RhdCBidWY7Ci0KLSAgICBBU1NFUlRfR0UoZnN0YXQoY293Xy0+ZmQsICZidWYpLCAwKSA8PCBzdHJlcnJvcihlcnJubyk7Ci0gICAgQVNTRVJUX0VRKGJ1Zi5zdF9zaXplLCB3cml0ZXIuR2V0Q293U2l6ZSgpKTsKLX0KLQotVEVTVF9GKENvd1Rlc3QsIEFwcGVuZExhYmVsU21hbGwpIHsKLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDA7Ci0gICAgYXV0byB3cml0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1dyaXRlcj4ob3B0aW9ucyk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5Jbml0aWFsaXplKGNvd18tPmZkKSk7Ci0KLSAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlRoaXMgaXMgc29tZSBkYXRhLCBiZWxpZXZlIGl0IjsKLSAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkUmF3QmxvY2tzKDUwLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZExhYmVsKDMpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOwotCi0gICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOwotCi0gICAgd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXI+KG9wdGlvbnMpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZUFwcGVuZChjb3dfLT5mZCwgMykpOwotCi0gICAgc3RkOjpzdHJpbmcgZGF0YTIgPSAiTW9yZSBkYXRhISI7Ci0gICAgZGF0YTIucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRSYXdCbG9ja3MoNTEsIGRhdGEyLmRhdGEoKSwgZGF0YTIuc2l6ZSgpKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKLQotICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKLQotICAgIHN0cnVjdCBzdGF0IGJ1ZjsKLSAgICBBU1NFUlRfRVEoZnN0YXQoY293Xy0+ZmQsICZidWYpLCAwKTsKLSAgICBBU1NFUlRfRVEoYnVmLnN0X3NpemUsIHdyaXRlci0+R2V0Q293U2l6ZSgpKTsKLQotICAgIC8vIFJlYWQgYmFjayBib3RoIG9wZXJhdGlvbnMsIGFuZCBsYWJlbC4KLSAgICBDb3dSZWFkZXIgcmVhZGVyOwotICAgIHVpbnQ2NF90IGxhYmVsOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci5HZXRMYXN0TGFiZWwoJmxhYmVsKSk7Ci0gICAgQVNTRVJUX0VRKGxhYmVsLCAzKTsKLQotICAgIFN0cmluZ1Npbmsgc2luazsKLQotICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKLSAgICBBU1NFUlRfTkUoaXRlciwgbnVsbHB0cik7Ci0KLSAgICBBU1NFUlRfRkFMU0UoaXRlci0+RG9uZSgpKTsKLSAgICBhdXRvIG9wID0gJml0ZXItPkdldCgpOwotICAgIEFTU0VSVF9FUShvcC0+dHlwZSwga0Nvd1JlcGxhY2VPcCk7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlJlYWREYXRhKCpvcCwgJnNpbmspKTsKLSAgICBBU1NFUlRfRVEoc2luay5zdHJlYW0oKSwgZGF0YSk7Ci0KLSAgICBpdGVyLT5OZXh0KCk7Ci0gICAgc2luay5SZXNldCgpOwotCi0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0gICAgb3AgPSAmaXRlci0+R2V0KCk7Ci0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293TGFiZWxPcCk7Ci0gICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UsIDMpOwotCi0gICAgaXRlci0+TmV4dCgpOwotCi0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0gICAgb3AgPSAmaXRlci0+R2V0KCk7Ci0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293UmVwbGFjZU9wKTsKLSAgICBBU1NFUlRfVFJVRShyZWFkZXIuUmVhZERhdGEoKm9wLCAmc2luaykpOwotICAgIEFTU0VSVF9FUShzaW5rLnN0cmVhbSgpLCBkYXRhMik7Ci0KLSAgICBpdGVyLT5OZXh0KCk7Ci0gICAgQVNTRVJUX1RSVUUoaXRlci0+RG9uZSgpKTsKLX0KLQotVEVTVF9GKENvd1Rlc3QsIEFwcGVuZExhYmVsTWlzc2luZykgewotICAgIENvd09wdGlvbnMgb3B0aW9uczsKLSAgICBvcHRpb25zLmNsdXN0ZXJfb3BzID0gMDsKLSAgICBhdXRvIHdyaXRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293V3JpdGVyPihvcHRpb25zKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkluaXRpYWxpemUoY293Xy0+ZmQpKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoMCkpOwotICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSAiVGhpcyBpcyBzb21lIGRhdGEsIGJlbGlldmUgaXQiOwotICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRSYXdCbG9ja3MoNTAsIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoMSkpOwotICAgIC8vIERyb3AgdGhlIHRhaWwgZW5kIG9mIHRoZSBsYXN0IG9wIGhlYWRlciwgY29ycnVwdGluZyBpdC4KLSAgICBmdHJ1bmNhdGUoY293Xy0+ZmQsIHdyaXRlci0+R2V0Q293U2l6ZSgpIC0gc2l6ZW9mKENvd0Zvb3RlcikgLSAzKTsKLQotICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKLQotICAgIHdyaXRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293V3JpdGVyPihvcHRpb25zKTsKLSAgICBBU1NFUlRfRkFMU0Uod3JpdGVyLT5Jbml0aWFsaXplQXBwZW5kKGNvd18tPmZkLCAxKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5Jbml0aWFsaXplQXBwZW5kKGNvd18tPmZkLCAwKSk7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFplcm9CbG9ja3MoNTEsIDEpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOwotCi0gICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOwotCi0gICAgc3RydWN0IHN0YXQgYnVmOwotICAgIEFTU0VSVF9FUShmc3RhdChjb3dfLT5mZCwgJmJ1ZiksIDApOwotICAgIEFTU0VSVF9FUShidWYuc3Rfc2l6ZSwgd3JpdGVyLT5HZXRDb3dTaXplKCkpOwotCi0gICAgLy8gUmVhZCBiYWNrIGJvdGggb3BlcmF0aW9ucy4KLSAgICBDb3dSZWFkZXIgcmVhZGVyOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOwotCi0gICAgU3RyaW5nU2luayBzaW5rOwotCi0gICAgYXV0byBpdGVyID0gcmVhZGVyLkdldE9wSXRlcigpOwotICAgIEFTU0VSVF9ORShpdGVyLCBudWxscHRyKTsKLQotICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgIGF1dG8gb3AgPSAmaXRlci0+R2V0KCk7Ci0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293TGFiZWxPcCk7Ci0gICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UsIDApOwotCi0gICAgaXRlci0+TmV4dCgpOwotCi0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0gICAgb3AgPSAmaXRlci0+R2V0KCk7Ci0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293WmVyb09wKTsKLQotICAgIGl0ZXItPk5leHQoKTsKLQotICAgIEFTU0VSVF9UUlVFKGl0ZXItPkRvbmUoKSk7Ci19Ci0KLVRFU1RfRihDb3dUZXN0LCBBcHBlbmRFeHRlbmRlZENvcnJ1cHRlZCkgewotICAgIENvd09wdGlvbnMgb3B0aW9uczsKLSAgICBvcHRpb25zLmNsdXN0ZXJfb3BzID0gMDsKLSAgICBhdXRvIHdyaXRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293V3JpdGVyPihvcHRpb25zKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkluaXRpYWxpemUoY293Xy0+ZmQpKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoNSkpOwotCi0gICAgc3RkOjpzdHJpbmcgZGF0YSA9ICJUaGlzIGlzIHNvbWUgZGF0YSwgYmVsaWV2ZSBpdCI7Ci0gICAgZGF0YS5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplICogMiwgJ1wwJyk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRSYXdCbG9ja3MoNTAsIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoNikpOwotCi0gICAgLy8gZmFpbCB0byB3cml0ZSB0aGUgZm9vdGVyLiBDb3cgRm9ybWF0IGRvZXMgbm90IGtub3cgaWYgTGFiZWwgNiBpcyB2YWxpZAotCi0gICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOwotCi0gICAgLy8gR2V0IHRoZSBsYXN0IGtub3duIGdvb2QgbGFiZWwKLSAgICBDb3dSZWFkZXIgbGFiZWxfcmVhZGVyOwotICAgIHVpbnQ2NF90IGxhYmVsOwotICAgIEFTU0VSVF9UUlVFKGxhYmVsX3JlYWRlci5QYXJzZShjb3dfLT5mZCwgezV9KSk7Ci0gICAgQVNTRVJUX1RSVUUobGFiZWxfcmVhZGVyLkdldExhc3RMYWJlbCgmbGFiZWwpKTsKLSAgICBBU1NFUlRfRVEobGFiZWwsIDUpOwotCi0gICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOwotCi0gICAgd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXI+KG9wdGlvbnMpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZUFwcGVuZChjb3dfLT5mZCwgNSkpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKLQotICAgIHN0cnVjdCBzdGF0IGJ1ZjsKLSAgICBBU1NFUlRfRVEoZnN0YXQoY293Xy0+ZmQsICZidWYpLCAwKTsKLSAgICBBU1NFUlRfRVEoYnVmLnN0X3NpemUsIHdyaXRlci0+R2V0Q293U2l6ZSgpKTsKLQotICAgIC8vIFJlYWQgYmFjayBhbGwgdmFsaWQgb3BlcmF0aW9ucwotICAgIENvd1JlYWRlciByZWFkZXI7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7Ci0KLSAgICBTdHJpbmdTaW5rIHNpbms7Ci0KLSAgICBhdXRvIGl0ZXIgPSByZWFkZXIuR2V0T3BJdGVyKCk7Ci0gICAgQVNTRVJUX05FKGl0ZXIsIG51bGxwdHIpOwotCi0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0gICAgYXV0byBvcCA9ICZpdGVyLT5HZXQoKTsKLSAgICBBU1NFUlRfRVEob3AtPnR5cGUsIGtDb3dMYWJlbE9wKTsKLSAgICBBU1NFUlRfRVEob3AtPnNvdXJjZSwgNSk7Ci0KLSAgICBpdGVyLT5OZXh0KCk7Ci0gICAgQVNTRVJUX1RSVUUoaXRlci0+RG9uZSgpKTsKLX0KLQotVEVTVF9GKENvd1Rlc3QsIEFwcGVuZGJ5TGFiZWwpIHsKLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDA7Ci0gICAgYXV0byB3cml0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1dyaXRlcj4ob3B0aW9ucyk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5Jbml0aWFsaXplKGNvd18tPmZkKSk7Ci0KLSAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlRoaXMgaXMgc29tZSBkYXRhLCBiZWxpZXZlIGl0IjsKLSAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUgKiAyLCAnXDAnKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFJhd0Jsb2Nrcyg1MCwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKSk7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZExhYmVsKDQpKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWmVyb0Jsb2Nrcyg1MCwgMikpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRMYWJlbCg1KSk7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZENvcHkoNSwgNikpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRMYWJlbCg2KSk7Ci0KLSAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7Ci0KLSAgICB3cml0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1dyaXRlcj4ob3B0aW9ucyk7Ci0gICAgQVNTRVJUX0ZBTFNFKHdyaXRlci0+SW5pdGlhbGl6ZUFwcGVuZChjb3dfLT5mZCwgMTIpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkluaXRpYWxpemVBcHBlbmQoY293Xy0+ZmQsIDUpKTsKLQotICAgIC8vIFRoaXMgc2hvdWxkIGRyb3AgbGFiZWwgNgotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7Ci0KLSAgICBzdHJ1Y3Qgc3RhdCBidWY7Ci0gICAgQVNTRVJUX0VRKGZzdGF0KGNvd18tPmZkLCAmYnVmKSwgMCk7Ci0gICAgQVNTRVJUX0VRKGJ1Zi5zdF9zaXplLCB3cml0ZXItPkdldENvd1NpemUoKSk7Ci0KLSAgICAvLyBSZWFkIGJhY2sgYWxsIG9wcwotICAgIENvd1JlYWRlciByZWFkZXI7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7Ci0KLSAgICBTdHJpbmdTaW5rIHNpbms7Ci0KLSAgICBhdXRvIGl0ZXIgPSByZWFkZXIuR2V0T3BJdGVyKCk7Ci0gICAgQVNTRVJUX05FKGl0ZXIsIG51bGxwdHIpOwotCi0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0gICAgYXV0byBvcCA9ICZpdGVyLT5HZXQoKTsKLSAgICBBU1NFUlRfRVEob3AtPnR5cGUsIGtDb3dSZXBsYWNlT3ApOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci5SZWFkRGF0YSgqb3AsICZzaW5rKSk7Ci0gICAgQVNTRVJUX0VRKHNpbmsuc3RyZWFtKCksIGRhdGEuc3Vic3RyKDAsIG9wdGlvbnMuYmxvY2tfc2l6ZSkpOwotCi0gICAgaXRlci0+TmV4dCgpOwotICAgIHNpbmsuUmVzZXQoKTsKLQotICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgIG9wID0gJml0ZXItPkdldCgpOwotICAgIEFTU0VSVF9FUShvcC0+dHlwZSwga0Nvd1JlcGxhY2VPcCk7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlJlYWREYXRhKCpvcCwgJnNpbmspKTsKLSAgICBBU1NFUlRfRVEoc2luay5zdHJlYW0oKSwgZGF0YS5zdWJzdHIob3B0aW9ucy5ibG9ja19zaXplLCAyICogb3B0aW9ucy5ibG9ja19zaXplKSk7Ci0KLSAgICBpdGVyLT5OZXh0KCk7Ci0gICAgc2luay5SZXNldCgpOwotCi0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0gICAgb3AgPSAmaXRlci0+R2V0KCk7Ci0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293TGFiZWxPcCk7Ci0gICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UsIDQpOwotCi0gICAgaXRlci0+TmV4dCgpOwotCi0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0gICAgb3AgPSAmaXRlci0+R2V0KCk7Ci0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293WmVyb09wKTsKLQotICAgIGl0ZXItPk5leHQoKTsKLQotICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgIG9wID0gJml0ZXItPkdldCgpOwotICAgIEFTU0VSVF9FUShvcC0+dHlwZSwga0Nvd1plcm9PcCk7Ci0KLSAgICBpdGVyLT5OZXh0KCk7Ci0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0gICAgb3AgPSAmaXRlci0+R2V0KCk7Ci0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293TGFiZWxPcCk7Ci0gICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UsIDUpOwotCi0gICAgaXRlci0+TmV4dCgpOwotCi0gICAgQVNTRVJUX1RSVUUoaXRlci0+RG9uZSgpKTsKLX0KLQotVEVTVF9GKENvd1Rlc3QsIENsdXN0ZXJUZXN0KSB7Ci0gICAgQ293T3B0aW9ucyBvcHRpb25zOwotICAgIG9wdGlvbnMuY2x1c3Rlcl9vcHMgPSA0OwotICAgIGF1dG8gd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXI+KG9wdGlvbnMpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZShjb3dfLT5mZCkpOwotCi0gICAgc3RkOjpzdHJpbmcgZGF0YSA9ICJUaGlzIGlzIHNvbWUgZGF0YSwgYmVsaWV2ZSBpdCI7Ci0gICAgZGF0YS5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplLCAnXDAnKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFJhd0Jsb2Nrcyg1MCwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKSk7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZExhYmVsKDQpKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWmVyb0Jsb2Nrcyg1MCwgMikpOyAgLy8gQ2x1c3RlciBzcGxpdCBpbiBtaWRkbGUKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoNSkpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRDb3B5KDUsIDYpKTsKLQotICAgIC8vIENsdXN0ZXIgc3BsaXQKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoNikpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsgIC8vIE5vIGRhdGEgZm9yIGNsdXN0ZXIsIHNvIG5vIGNsdXN0ZXIgc3BsaXQgbmVlZGVkCi0KLSAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7Ci0KLSAgICAvLyBSZWFkIGJhY2sgYWxsIG9wcwotICAgIENvd1JlYWRlciByZWFkZXI7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7Ci0KLSAgICBTdHJpbmdTaW5rIHNpbms7Ci0KLSAgICBhdXRvIGl0ZXIgPSByZWFkZXIuR2V0T3BJdGVyKCk7Ci0gICAgQVNTRVJUX05FKGl0ZXIsIG51bGxwdHIpOwotCi0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0gICAgYXV0byBvcCA9ICZpdGVyLT5HZXQoKTsKLSAgICBBU1NFUlRfRVEob3AtPnR5cGUsIGtDb3dSZXBsYWNlT3ApOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci5SZWFkRGF0YSgqb3AsICZzaW5rKSk7Ci0gICAgQVNTRVJUX0VRKHNpbmsuc3RyZWFtKCksIGRhdGEuc3Vic3RyKDAsIG9wdGlvbnMuYmxvY2tfc2l6ZSkpOwotCi0gICAgaXRlci0+TmV4dCgpOwotICAgIHNpbmsuUmVzZXQoKTsKLQotICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgIG9wID0gJml0ZXItPkdldCgpOwotICAgIEFTU0VSVF9FUShvcC0+dHlwZSwga0Nvd0xhYmVsT3ApOwotICAgIEFTU0VSVF9FUShvcC0+c291cmNlLCA0KTsKLQotICAgIGl0ZXItPk5leHQoKTsKLQotICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgIG9wID0gJml0ZXItPkdldCgpOwotICAgIEFTU0VSVF9FUShvcC0+dHlwZSwga0Nvd1plcm9PcCk7Ci0KLSAgICBpdGVyLT5OZXh0KCk7Ci0KLSAgICBBU1NFUlRfRkFMU0UoaXRlci0+RG9uZSgpKTsKLSAgICBvcCA9ICZpdGVyLT5HZXQoKTsKLSAgICBBU1NFUlRfRVEob3AtPnR5cGUsIGtDb3dDbHVzdGVyT3ApOwotCi0gICAgaXRlci0+TmV4dCgpOwotCi0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0gICAgb3AgPSAmaXRlci0+R2V0KCk7Ci0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293WmVyb09wKTsKLQotICAgIGl0ZXItPk5leHQoKTsKLQotICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgIG9wID0gJml0ZXItPkdldCgpOwotICAgIEFTU0VSVF9FUShvcC0+dHlwZSwga0Nvd0xhYmVsT3ApOwotICAgIEFTU0VSVF9FUShvcC0+c291cmNlLCA1KTsKLQotICAgIGl0ZXItPk5leHQoKTsKLQotICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgIG9wID0gJml0ZXItPkdldCgpOwotICAgIEFTU0VSVF9FUShvcC0+dHlwZSwga0Nvd0NvcHlPcCk7Ci0KLSAgICBpdGVyLT5OZXh0KCk7Ci0KLSAgICBBU1NFUlRfRkFMU0UoaXRlci0+RG9uZSgpKTsKLSAgICBvcCA9ICZpdGVyLT5HZXQoKTsKLSAgICBBU1NFUlRfRVEob3AtPnR5cGUsIGtDb3dDbHVzdGVyT3ApOwotCi0gICAgaXRlci0+TmV4dCgpOwotCi0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0gICAgb3AgPSAmaXRlci0+R2V0KCk7Ci0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293TGFiZWxPcCk7Ci0gICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UsIDYpOwotCi0gICAgaXRlci0+TmV4dCgpOwotCi0gICAgQVNTRVJUX1RSVUUoaXRlci0+RG9uZSgpKTsKLX0KLQotVEVTVF9GKENvd1Rlc3QsIENsdXN0ZXJBcHBlbmRUZXN0KSB7Ci0gICAgQ293T3B0aW9ucyBvcHRpb25zOwotICAgIG9wdGlvbnMuY2x1c3Rlcl9vcHMgPSAzOwotICAgIGF1dG8gd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXI+KG9wdGlvbnMpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZShjb3dfLT5mZCkpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRMYWJlbCg1MCkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7ICAvLyBBZGRzIGEgY2x1c3RlciBvcCwgc2hvdWxkIGJlIGRyb3BwZWQgb24gYXBwZW5kCi0KLSAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7Ci0KLSAgICB3cml0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1dyaXRlcj4ob3B0aW9ucyk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5Jbml0aWFsaXplQXBwZW5kKGNvd18tPmZkLCA1MCkpOwotCi0gICAgc3RkOjpzdHJpbmcgZGF0YTIgPSAiTW9yZSBkYXRhISI7Ci0gICAgZGF0YTIucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRSYXdCbG9ja3MoNTEsIGRhdGEyLmRhdGEoKSwgZGF0YTIuc2l6ZSgpKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsgIC8vIEFkZHMgYSBjbHVzdGVyIG9wCi0KLSAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7Ci0KLSAgICBzdHJ1Y3Qgc3RhdCBidWY7Ci0gICAgQVNTRVJUX0VRKGZzdGF0KGNvd18tPmZkLCAmYnVmKSwgMCk7Ci0gICAgQVNTRVJUX0VRKGJ1Zi5zdF9zaXplLCB3cml0ZXItPkdldENvd1NpemUoKSk7Ci0KLSAgICAvLyBSZWFkIGJhY2sgYm90aCBvcGVyYXRpb25zLCBwbHVzIGNsdXN0ZXIgb3AgYXQgZW5kCi0gICAgQ293UmVhZGVyIHJlYWRlcjsKLSAgICB1aW50NjRfdCBsYWJlbDsKLSAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKLSAgICBBU1NFUlRfVFJVRShyZWFkZXIuR2V0TGFzdExhYmVsKCZsYWJlbCkpOwotICAgIEFTU0VSVF9FUShsYWJlbCwgNTApOwotCi0gICAgU3RyaW5nU2luayBzaW5rOwotCi0gICAgYXV0byBpdGVyID0gcmVhZGVyLkdldE9wSXRlcigpOwotICAgIEFTU0VSVF9ORShpdGVyLCBudWxscHRyKTsKLQotICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgIGF1dG8gb3AgPSAmaXRlci0+R2V0KCk7Ci0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293TGFiZWxPcCk7Ci0gICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UsIDUwKTsKLQotICAgIGl0ZXItPk5leHQoKTsKLQotICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgIG9wID0gJml0ZXItPkdldCgpOwotICAgIEFTU0VSVF9FUShvcC0+dHlwZSwga0Nvd1JlcGxhY2VPcCk7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlJlYWREYXRhKCpvcCwgJnNpbmspKTsKLSAgICBBU1NFUlRfRVEoc2luay5zdHJlYW0oKSwgZGF0YTIpOwotCi0gICAgaXRlci0+TmV4dCgpOwotCi0gICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkRvbmUoKSk7Ci0gICAgb3AgPSAmaXRlci0+R2V0KCk7Ci0gICAgQVNTRVJUX0VRKG9wLT50eXBlLCBrQ293Q2x1c3Rlck9wKTsKLQotICAgIGl0ZXItPk5leHQoKTsKLQotICAgIEFTU0VSVF9UUlVFKGl0ZXItPkRvbmUoKSk7Ci19Ci0KLVRFU1RfRihDb3dUZXN0LCBBcHBlbmRBZnRlckZpbmFsaXplKSB7Ci0gICAgQ293T3B0aW9ucyBvcHRpb25zOwotICAgIG9wdGlvbnMuY2x1c3Rlcl9vcHMgPSAwOwotICAgIGF1dG8gd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXI+KG9wdGlvbnMpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZShjb3dfLT5mZCkpOwotCi0gICAgc3RkOjpzdHJpbmcgZGF0YSA9ICJUaGlzIGlzIHNvbWUgZGF0YSwgYmVsaWV2ZSBpdCI7Ci0gICAgZGF0YS5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplLCAnXDAnKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFJhd0Jsb2Nrcyg1MCwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRMYWJlbCgzKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKLQotICAgIHN0ZDo6c3RyaW5nIGRhdGEyID0gIk1vcmUgZGF0YSEiOwotICAgIGRhdGEyLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkUmF3QmxvY2tzKDUxLCBkYXRhMi5kYXRhKCksIGRhdGEyLnNpemUoKSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7Ci0KLSAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7Ci0KLSAgICAvLyBDT1cgc2hvdWxkIGJlIHZhbGlkLgotICAgIENvd1JlYWRlciByZWFkZXI7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7Ci19Ci0KLUFzc2VydGlvblJlc3VsdCBXcml0ZURhdGFCbG9jayhDb3dXcml0ZXIqIHdyaXRlciwgdWludDY0X3QgbmV3X2Jsb2NrLCBzdGQ6OnN0cmluZyBkYXRhKSB7Ci0gICAgZGF0YS5yZXNpemUod3JpdGVyLT5vcHRpb25zKCkuYmxvY2tfc2l6ZSwgJ1wwJyk7Ci0gICAgaWYgKCF3cml0ZXItPkFkZFJhd0Jsb2NrcyhuZXdfYmxvY2ssIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSkpIHsKLSAgICAgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAiRmFpbGVkIHRvIGFkZCByYXcgYmxvY2siOwotICAgIH0KLSAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOwotfQotCi1Bc3NlcnRpb25SZXN1bHQgQ29tcGFyZURhdGFCbG9jayhDb3dSZWFkZXIqIHJlYWRlciwgY29uc3QgQ293T3BlcmF0aW9uJiBvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkYXRhKSB7Ci0gICAgQ293SGVhZGVyIGhlYWRlcjsKLSAgICByZWFkZXItPkdldEhlYWRlcigmaGVhZGVyKTsKLQotICAgIHN0ZDo6c3RyaW5nIGNtcCA9IGRhdGE7Ci0gICAgY21wLnJlc2l6ZShoZWFkZXIuYmxvY2tfc2l6ZSwgJ1wwJyk7Ci0KLSAgICBTdHJpbmdTaW5rIHNpbms7Ci0gICAgaWYgKCFyZWFkZXItPlJlYWREYXRhKG9wLCAmc2luaykpIHsKLSAgICAgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAiRmFpbGVkIHRvIHJlYWQgZGF0YSBibG9jayI7Ci0gICAgfQotICAgIGlmIChjbXAgIT0gc2luay5zdHJlYW0oKSkgewotICAgICAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8ICJEYXRhIGJsb2NrcyBkaWQgbm90IG1hdGNoLCBleHBlY3RlZCAiIDw8IGNtcCA8PCAiLCBnb3QgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHNpbmsuc3RyZWFtKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKLX0KLQotVEVTVF9GKENvd1Rlc3QsIFJlc3VtZU1pZENsdXN0ZXIpIHsKLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDc7Ci0gICAgYXV0byB3cml0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1dyaXRlcj4ob3B0aW9ucyk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5Jbml0aWFsaXplKGNvd18tPmZkKSk7Ci0KLSAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDEsICJCbG9jayAxIikpOwotICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgMiwgIkJsb2NrIDIiKSk7Ci0gICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCAzLCAiQmxvY2sgMyIpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZExhYmVsKDEpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOwotICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgNCwgIkJsb2NrIDQiKSk7Ci0gICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOwotCi0gICAgd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXI+KG9wdGlvbnMpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZUFwcGVuZChjb3dfLT5mZCwgMSkpOwotICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgNCwgIkJsb2NrIDQiKSk7Ci0gICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCA1LCAiQmxvY2sgNSIpKTsKLSAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDYsICJCbG9jayA2IikpOwotICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgNywgIkJsb2NrIDciKSk7Ci0gICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCA4LCAiQmxvY2sgOCIpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZExhYmVsKDIpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOwotICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKLQotICAgIENvd1JlYWRlciByZWFkZXI7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7Ci0KLSAgICBhdXRvIGl0ZXIgPSByZWFkZXIuR2V0T3BJdGVyKCk7Ci0gICAgc2l6ZV90IG51bV9yZXBsYWNlID0gMDsKLSAgICBzaXplX3QgbWF4X2luX2NsdXN0ZXIgPSAwOwotICAgIHNpemVfdCBudW1faW5fY2x1c3RlciA9IDA7Ci0gICAgc2l6ZV90IG51bV9jbHVzdGVycyA9IDA7Ci0gICAgd2hpbGUgKCFpdGVyLT5Eb25lKCkpIHsKLSAgICAgICAgY29uc3QgYXV0byYgb3AgPSBpdGVyLT5HZXQoKTsKLQotICAgICAgICBudW1faW5fY2x1c3RlcisrOwotICAgICAgICBtYXhfaW5fY2x1c3RlciA9IHN0ZDo6bWF4KG1heF9pbl9jbHVzdGVyLCBudW1faW5fY2x1c3Rlcik7Ci0KLSAgICAgICAgaWYgKG9wLnR5cGUgPT0ga0Nvd1JlcGxhY2VPcCkgewotICAgICAgICAgICAgbnVtX3JlcGxhY2UrKzsKLQotICAgICAgICAgICAgQVNTRVJUX0VRKG9wLm5ld19ibG9jaywgbnVtX3JlcGxhY2UpOwotICAgICAgICAgICAgQVNTRVJUX1RSVUUoQ29tcGFyZURhdGFCbG9jaygmcmVhZGVyLCBvcCwgIkJsb2NrICIgKyBzdGQ6OnRvX3N0cmluZyhudW1fcmVwbGFjZSkpKTsKLSAgICAgICAgfSBlbHNlIGlmIChvcC50eXBlID09IGtDb3dDbHVzdGVyT3ApIHsKLSAgICAgICAgICAgIG51bV9pbl9jbHVzdGVyID0gMDsKLSAgICAgICAgICAgIG51bV9jbHVzdGVycysrOwotICAgICAgICB9Ci0KLSAgICAgICAgaXRlci0+TmV4dCgpOwotICAgIH0KLSAgICBBU1NFUlRfRVEobnVtX3JlcGxhY2UsIDgpOwotICAgIEFTU0VSVF9FUShtYXhfaW5fY2x1c3RlciwgNyk7Ci0gICAgQVNTRVJUX0VRKG51bV9jbHVzdGVycywgMik7Ci19Ci0KLVRFU1RfRihDb3dUZXN0LCBSZXN1bWVFbmRDbHVzdGVyKSB7Ci0gICAgQ293T3B0aW9ucyBvcHRpb25zOwotICAgIGludCBjbHVzdGVyX29wcyA9IDU7Ci0gICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IGNsdXN0ZXJfb3BzOwotICAgIGF1dG8gd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXI+KG9wdGlvbnMpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZShjb3dfLT5mZCkpOwotCi0gICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCAxLCAiQmxvY2sgMSIpKTsKLSAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDIsICJCbG9jayAyIikpOwotICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgMywgIkJsb2NrIDMiKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRMYWJlbCgxKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKLSAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDQsICJCbG9jayA0IikpOwotICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgNSwgIkJsb2NrIDUiKSk7Ci0gICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCA2LCAiQmxvY2sgNiIpKTsKLSAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDcsICJCbG9jayA3IikpOwotICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgOCwgIkJsb2NrIDgiKSk7Ci0gICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOwotCi0gICAgd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXI+KG9wdGlvbnMpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZUFwcGVuZChjb3dfLT5mZCwgMSkpOwotICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgNCwgIkJsb2NrIDQiKSk7Ci0gICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCA1LCAiQmxvY2sgNSIpKTsKLSAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDYsICJCbG9jayA2IikpOwotICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgNywgIkJsb2NrIDciKSk7Ci0gICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCA4LCAiQmxvY2sgOCIpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZExhYmVsKDIpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOwotICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKLQotICAgIENvd1JlYWRlciByZWFkZXI7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7Ci0KLSAgICBhdXRvIGl0ZXIgPSByZWFkZXIuR2V0T3BJdGVyKCk7Ci0gICAgc2l6ZV90IG51bV9yZXBsYWNlID0gMDsKLSAgICBzaXplX3QgbWF4X2luX2NsdXN0ZXIgPSAwOwotICAgIHNpemVfdCBudW1faW5fY2x1c3RlciA9IDA7Ci0gICAgc2l6ZV90IG51bV9jbHVzdGVycyA9IDA7Ci0gICAgd2hpbGUgKCFpdGVyLT5Eb25lKCkpIHsKLSAgICAgICAgY29uc3QgYXV0byYgb3AgPSBpdGVyLT5HZXQoKTsKLQotICAgICAgICBudW1faW5fY2x1c3RlcisrOwotICAgICAgICBtYXhfaW5fY2x1c3RlciA9IHN0ZDo6bWF4KG1heF9pbl9jbHVzdGVyLCBudW1faW5fY2x1c3Rlcik7Ci0KLSAgICAgICAgaWYgKG9wLnR5cGUgPT0ga0Nvd1JlcGxhY2VPcCkgewotICAgICAgICAgICAgbnVtX3JlcGxhY2UrKzsKLQotICAgICAgICAgICAgQVNTRVJUX0VRKG9wLm5ld19ibG9jaywgbnVtX3JlcGxhY2UpOwotICAgICAgICAgICAgQVNTRVJUX1RSVUUoQ29tcGFyZURhdGFCbG9jaygmcmVhZGVyLCBvcCwgIkJsb2NrICIgKyBzdGQ6OnRvX3N0cmluZyhudW1fcmVwbGFjZSkpKTsKLSAgICAgICAgfSBlbHNlIGlmIChvcC50eXBlID09IGtDb3dDbHVzdGVyT3ApIHsKLSAgICAgICAgICAgIG51bV9pbl9jbHVzdGVyID0gMDsKLSAgICAgICAgICAgIG51bV9jbHVzdGVycysrOwotICAgICAgICB9Ci0KLSAgICAgICAgaXRlci0+TmV4dCgpOwotICAgIH0KLSAgICBBU1NFUlRfRVEobnVtX3JlcGxhY2UsIDgpOwotICAgIEFTU0VSVF9FUShtYXhfaW5fY2x1c3RlciwgY2x1c3Rlcl9vcHMpOwotICAgIEFTU0VSVF9FUShudW1fY2x1c3RlcnMsIDMpOwotfQotCi1URVNUX0YoQ293VGVzdCwgRGVsZXRlTWlkQ2x1c3RlcikgewotICAgIENvd09wdGlvbnMgb3B0aW9uczsKLSAgICBvcHRpb25zLmNsdXN0ZXJfb3BzID0gNzsKLSAgICBhdXRvIHdyaXRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293V3JpdGVyPihvcHRpb25zKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkluaXRpYWxpemUoY293Xy0+ZmQpKTsKLQotICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgMSwgIkJsb2NrIDEiKSk7Ci0gICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCAyLCAiQmxvY2sgMiIpKTsKLSAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDMsICJCbG9jayAzIikpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoMSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7Ci0gICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCA0LCAiQmxvY2sgNCIpKTsKLSAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDUsICJCbG9jayA1IikpOwotICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgNiwgIkJsb2NrIDYiKSk7Ci0gICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOwotCi0gICAgd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXI+KG9wdGlvbnMpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZUFwcGVuZChjb3dfLT5mZCwgMSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7Ci0gICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOwotCi0gICAgQ293UmVhZGVyIHJlYWRlcjsKLSAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKLQotICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKLSAgICBzaXplX3QgbnVtX3JlcGxhY2UgPSAwOwotICAgIHNpemVfdCBtYXhfaW5fY2x1c3RlciA9IDA7Ci0gICAgc2l6ZV90IG51bV9pbl9jbHVzdGVyID0gMDsKLSAgICBzaXplX3QgbnVtX2NsdXN0ZXJzID0gMDsKLSAgICB3aGlsZSAoIWl0ZXItPkRvbmUoKSkgewotICAgICAgICBjb25zdCBhdXRvJiBvcCA9IGl0ZXItPkdldCgpOwotCi0gICAgICAgIG51bV9pbl9jbHVzdGVyKys7Ci0gICAgICAgIG1heF9pbl9jbHVzdGVyID0gc3RkOjptYXgobWF4X2luX2NsdXN0ZXIsIG51bV9pbl9jbHVzdGVyKTsKLSAgICAgICAgaWYgKG9wLnR5cGUgPT0ga0Nvd1JlcGxhY2VPcCkgewotICAgICAgICAgICAgbnVtX3JlcGxhY2UrKzsKLQotICAgICAgICAgICAgQVNTRVJUX0VRKG9wLm5ld19ibG9jaywgbnVtX3JlcGxhY2UpOwotICAgICAgICAgICAgQVNTRVJUX1RSVUUoQ29tcGFyZURhdGFCbG9jaygmcmVhZGVyLCBvcCwgIkJsb2NrICIgKyBzdGQ6OnRvX3N0cmluZyhudW1fcmVwbGFjZSkpKTsKLSAgICAgICAgfSBlbHNlIGlmIChvcC50eXBlID09IGtDb3dDbHVzdGVyT3ApIHsKLSAgICAgICAgICAgIG51bV9pbl9jbHVzdGVyID0gMDsKLSAgICAgICAgICAgIG51bV9jbHVzdGVycysrOwotICAgICAgICB9Ci0KLSAgICAgICAgaXRlci0+TmV4dCgpOwotICAgIH0KLSAgICBBU1NFUlRfRVEobnVtX3JlcGxhY2UsIDMpOwotICAgIEFTU0VSVF9FUShtYXhfaW5fY2x1c3RlciwgNSk7ICAvLyAzIGRhdGEsIDEgbGFiZWwsIDEgY2x1c3RlciBvcAotICAgIEFTU0VSVF9FUShudW1fY2x1c3RlcnMsIDEpOwotfQotCi1URVNUX0YoQ293VGVzdCwgQmlnU2VxT3ApIHsKLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgQ293V3JpdGVyIHdyaXRlcihvcHRpb25zKTsKLSAgICBjb25zdCBpbnQgc2VxX2xlbiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDE2X3Q+OjptYXgoKSAvIHNpemVvZih1aW50MzJfdCkgKyAxOwotICAgIHVpbnQzMl90IHNlcXVlbmNlW3NlcV9sZW5dOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VxX2xlbjsgaSsrKSB7Ci0gICAgICAgIHNlcXVlbmNlW2ldID0gaSArIDE7Ci0gICAgfQotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkluaXRpYWxpemUoY293Xy0+ZmQpKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRTZXF1ZW5jZURhdGEoc2VxX2xlbiwgc2VxdWVuY2UpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWmVyb0Jsb2NrcygxLCBzZXFfbGVuKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkZpbmFsaXplKCkpOwotCi0gICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOwotCi0gICAgQ293UmVhZGVyIHJlYWRlcjsKLSAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKLSAgICBhdXRvIGl0ZXIgPSByZWFkZXIuR2V0UmV2TWVyZ2VPcEl0ZXIoKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VxX2xlbjsgaSsrKSB7Ci0gICAgICAgIEFTU0VSVF9UUlVFKCFpdGVyLT5Eb25lKCkpOwotICAgICAgICBjb25zdCBhdXRvJiBvcCA9IGl0ZXItPkdldCgpOwotCi0gICAgICAgIEFTU0VSVF9FUShvcC5uZXdfYmxvY2ssIHNlcV9sZW4gLSBpKTsKLQotICAgICAgICBpdGVyLT5OZXh0KCk7Ci0gICAgfQotICAgIEFTU0VSVF9UUlVFKGl0ZXItPkRvbmUoKSk7Ci19Ci0KLVRFU1RfRihDb3dUZXN0LCBNaXNzaW5nU2VxT3ApIHsKLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgQ293V3JpdGVyIHdyaXRlcihvcHRpb25zKTsKLSAgICBjb25zdCBpbnQgc2VxX2xlbiA9IDEwOwotICAgIHVpbnQzMl90IHNlcXVlbmNlW3NlcV9sZW5dOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VxX2xlbjsgaSsrKSB7Ci0gICAgICAgIHNlcXVlbmNlW2ldID0gaSArIDE7Ci0gICAgfQotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkluaXRpYWxpemUoY293Xy0+ZmQpKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRTZXF1ZW5jZURhdGEoc2VxX2xlbiwgc2VxdWVuY2UpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWmVyb0Jsb2NrcygxLCBzZXFfbGVuIC0gMSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5GaW5hbGl6ZSgpKTsKLQotICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKLQotICAgIENvd1JlYWRlciByZWFkZXI7Ci0gICAgQVNTRVJUX0ZBTFNFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOwotfQotCi1URVNUX0YoQ293VGVzdCwgUmVzdW1lU2VxT3ApIHsKLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgYXV0byB3cml0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1dyaXRlcj4ob3B0aW9ucyk7Ci0gICAgY29uc3QgaW50IHNlcV9sZW4gPSAxMDsKLSAgICB1aW50MzJfdCBzZXF1ZW5jZVtzZXFfbGVuXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcV9sZW47IGkrKykgewotICAgICAgICBzZXF1ZW5jZVtpXSA9IGkgKyAxOwotICAgIH0KLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZShjb3dfLT5mZCkpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRTZXF1ZW5jZURhdGEoc2VxX2xlbiwgc2VxdWVuY2UpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFplcm9CbG9ja3MoMSwgc2VxX2xlbiAvIDIpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZExhYmVsKDEpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFplcm9CbG9ja3MoMSArIHNlcV9sZW4gLyAyLCAxKSk7Ci0KLSAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7Ci0gICAgYXV0byByZWFkZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1JlYWRlcj4oKTsKLSAgICBBU1NFUlRfVFJVRShyZWFkZXItPlBhcnNlKGNvd18tPmZkLCAxKSk7Ci0gICAgYXV0byBpdHIgPSByZWFkZXItPkdldFJldk1lcmdlT3BJdGVyKCk7Ci0gICAgQVNTRVJUX1RSVUUoaXRyLT5Eb25lKCkpOwotCi0gICAgd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXI+KG9wdGlvbnMpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZUFwcGVuZChjb3dfLT5mZCwgMSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWmVyb0Jsb2NrcygxICsgc2VxX2xlbiAvIDIsIHNlcV9sZW4gLyAyKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKLQotICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKLQotICAgIHJlYWRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293UmVhZGVyPigpOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci0+UGFyc2UoY293Xy0+ZmQpKTsKLQotICAgIGF1dG8gaXRlciA9IHJlYWRlci0+R2V0UmV2TWVyZ2VPcEl0ZXIoKTsKLQotICAgIHVpbnQ2NF90IGV4cGVjdGVkX2Jsb2NrID0gMTA7Ci0gICAgd2hpbGUgKCFpdGVyLT5Eb25lKCkgJiYgZXhwZWN0ZWRfYmxvY2sgPiAwKSB7Ci0gICAgICAgIEFTU0VSVF9GQUxTRShpdGVyLT5Eb25lKCkpOwotICAgICAgICBjb25zdCBhdXRvJiBvcCA9IGl0ZXItPkdldCgpOwotCi0gICAgICAgIEFTU0VSVF9FUShvcC5uZXdfYmxvY2ssIGV4cGVjdGVkX2Jsb2NrKTsKLQotICAgICAgICBpdGVyLT5OZXh0KCk7Ci0gICAgICAgIGV4cGVjdGVkX2Jsb2NrLS07Ci0gICAgfQotICAgIEFTU0VSVF9FUShleHBlY3RlZF9ibG9jaywgMCk7Ci0gICAgQVNTRVJUX1RSVUUoaXRlci0+RG9uZSgpKTsKLX0KLQotVEVTVF9GKENvd1Rlc3QsIFJldk1lcmdlT3BJdHJUZXN0KSB7Ci0gICAgQ293T3B0aW9ucyBvcHRpb25zOwotICAgIG9wdGlvbnMuY2x1c3Rlcl9vcHMgPSA1OwotICAgIG9wdGlvbnMubnVtX21lcmdlX29wcyA9IDE7Ci0gICAgQ293V3JpdGVyIHdyaXRlcihvcHRpb25zKTsKLSAgICB1aW50MzJfdCBzZXF1ZW5jZVtdID0gezIsIDEwLCA2LCA3LCAzLCA1fTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5Jbml0aWFsaXplKGNvd18tPmZkKSk7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkU2VxdWVuY2VEYXRhKDYsIHNlcXVlbmNlKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoNiwgMTMpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWmVyb0Jsb2NrcygxMiwgMSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRaZXJvQmxvY2tzKDgsIDEpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWmVyb0Jsb2NrcygxMSwgMSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRDb3B5KDMsIDE1KSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoMiwgMTEpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWmVyb0Jsb2Nrcyg0LCAxKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFplcm9CbG9ja3MoOSwgMSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRDb3B5KDUsIDE2KSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFplcm9CbG9ja3MoMSwgMSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRDb3B5KDEwLCAxMikpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRDb3B5KDcsIDE0KSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkZpbmFsaXplKCkpOwotCi0gICAgLy8gTmV3IGJsb2NrIGluIGNvdyBvcmRlciBpcyA2LCAxMiwgOCwgMTEsIDMsIDIsIDQsIDksIDUsIDEsIDEwLCA3Ci0gICAgLy8gTmV3IGJsb2NrIGluIG1lcmdlIG9yZGVyIGlzIDIsIDEwLCA2LCA3LCAzLCA1LCAxMiwgMTEsIDksIDgsIDQsIDEKLSAgICAvLyBSZXZNZXJnZU9yZGVyIGlzIDEsIDQsIDgsIDksIDExLCAxMiwgNSwgMywgNywgNiwgMTAsIDIKLSAgICAvLyBuZXcgYmxvY2sgMiBpcyAiYWxyZWFkeSBtZXJnZWQiLCBzbyB3aWxsIGJlIGxlZnQgb3V0LgotCi0gICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IHJldk1lcmdlT3BTZXF1ZW5jZSA9IHsxLCA0LCA4LCA5LCAxMSwgMTIsIDUsIDMsIDcsIDYsIDEwfTsKLQotICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKLQotICAgIENvd1JlYWRlciByZWFkZXI7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7Ci0gICAgYXV0byBpdGVyID0gcmVhZGVyLkdldFJldk1lcmdlT3BJdGVyKCk7Ci0gICAgYXV0byBleHBlY3RlZF9uZXdfYmxvY2sgPSByZXZNZXJnZU9wU2VxdWVuY2UuYmVnaW4oKTsKLQotICAgIHdoaWxlICghaXRlci0+RG9uZSgpICYmIGV4cGVjdGVkX25ld19ibG9jayAhPSByZXZNZXJnZU9wU2VxdWVuY2UuZW5kKCkpIHsKLSAgICAgICAgY29uc3QgYXV0byYgb3AgPSBpdGVyLT5HZXQoKTsKLQotICAgICAgICBBU1NFUlRfRVEob3AubmV3X2Jsb2NrLCAqZXhwZWN0ZWRfbmV3X2Jsb2NrKTsKLQotICAgICAgICBpdGVyLT5OZXh0KCk7Ci0gICAgICAgIGV4cGVjdGVkX25ld19ibG9jaysrOwotICAgIH0KLSAgICBBU1NFUlRfRVEoZXhwZWN0ZWRfbmV3X2Jsb2NrLCByZXZNZXJnZU9wU2VxdWVuY2UuZW5kKCkpOwotICAgIEFTU0VSVF9UUlVFKGl0ZXItPkRvbmUoKSk7Ci19Ci0KLVRFU1RfRihDb3dUZXN0LCBMZWdhY3lSZXZNZXJnZU9wSXRyVGVzdCkgewotICAgIENvd09wdGlvbnMgb3B0aW9uczsKLSAgICBvcHRpb25zLmNsdXN0ZXJfb3BzID0gNTsKLSAgICBvcHRpb25zLm51bV9tZXJnZV9vcHMgPSAxOwotICAgIENvd1dyaXRlciB3cml0ZXIob3B0aW9ucyk7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuSW5pdGlhbGl6ZShjb3dfLT5mZCkpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoMiwgMTEpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weSgxMCwgMTIpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weSg2LCAxMykpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRDb3B5KDcsIDE0KSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoMywgMTUpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weSg1LCAxNikpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRaZXJvQmxvY2tzKDEyLCAxKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFplcm9CbG9ja3MoOCwgMSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRaZXJvQmxvY2tzKDExLCAxKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFplcm9CbG9ja3MoNCwgMSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRaZXJvQmxvY2tzKDksIDEpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWmVyb0Jsb2NrcygxLCAxKSk7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuRmluYWxpemUoKSk7Ci0KLSAgICAvLyBOZXcgYmxvY2sgaW4gY293IG9yZGVyIGlzIDIsIDEwLCA2LCA3LCAzLCA1LCAxMiwgOCwgMTEsIDQsIDksIDEKLSAgICAvLyBOZXcgYmxvY2sgaW4gbWVyZ2Ugb3JkZXIgaXMgMiwgMTAsIDYsIDcsIDMsIDUsIDEyLCAxMSwgOSwgOCwgNCwgMQotICAgIC8vIFJldk1lcmdlT3JkZXIgaXMgMSwgNCwgOCwgOSwgMTEsIDEyLCA1LCAzLCA3LCA2LCAxMCwgMgotICAgIC8vIG5ldyBibG9jayAyIGlzICJhbHJlYWR5IG1lcmdlZCIsIHNvIHdpbGwgYmUgbGVmdCBvdXQuCi0KLSAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gcmV2TWVyZ2VPcFNlcXVlbmNlID0gezEsIDQsIDgsIDksIDExLCAxMiwgNSwgMywgNywgNiwgMTB9OwotCi0gICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOwotCi0gICAgQ293UmVhZGVyIHJlYWRlcjsKLSAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKLSAgICBhdXRvIGl0ZXIgPSByZWFkZXIuR2V0UmV2TWVyZ2VPcEl0ZXIoKTsKLSAgICBhdXRvIGV4cGVjdGVkX25ld19ibG9jayA9IHJldk1lcmdlT3BTZXF1ZW5jZS5iZWdpbigpOwotCi0gICAgd2hpbGUgKCFpdGVyLT5Eb25lKCkgJiYgZXhwZWN0ZWRfbmV3X2Jsb2NrICE9IHJldk1lcmdlT3BTZXF1ZW5jZS5lbmQoKSkgewotICAgICAgICBjb25zdCBhdXRvJiBvcCA9IGl0ZXItPkdldCgpOwotCi0gICAgICAgIEFTU0VSVF9FUShvcC5uZXdfYmxvY2ssICpleHBlY3RlZF9uZXdfYmxvY2spOwotCi0gICAgICAgIGl0ZXItPk5leHQoKTsKLSAgICAgICAgZXhwZWN0ZWRfbmV3X2Jsb2NrKys7Ci0gICAgfQotICAgIEFTU0VSVF9FUShleHBlY3RlZF9uZXdfYmxvY2ssIHJldk1lcmdlT3BTZXF1ZW5jZS5lbmQoKSk7Ci0gICAgQVNTRVJUX1RSVUUoaXRlci0+RG9uZSgpKTsKLX0KLQotVEVTVF9GKENvd1Rlc3QsIEludmFsaWRNZXJnZU9yZGVyVGVzdCkgewotICAgIENvd09wdGlvbnMgb3B0aW9uczsKLSAgICBvcHRpb25zLmNsdXN0ZXJfb3BzID0gNTsKLSAgICBvcHRpb25zLm51bV9tZXJnZV9vcHMgPSAxOwotICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSAiVGhpcyBpcyBzb21lIGRhdGEsIGJlbGlldmUgaXQiOwotICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7Ci0gICAgYXV0byB3cml0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1dyaXRlcj4ob3B0aW9ucyk7Ci0gICAgQ293UmVhZGVyIHJlYWRlcjsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZShjb3dfLT5mZCkpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRDb3B5KDMsIDIpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZENvcHkoMiwgMSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoMSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7Ci0gICAgQVNTRVJUX1RSVUUocmVhZGVyLlZlcmlmeU1lcmdlT3BzKCkpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5Jbml0aWFsaXplQXBwZW5kKGNvd18tPmZkLCAxKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRDb3B5KDQsIDIpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOwotICAgIEFTU0VSVF9GQUxTRShyZWFkZXIuVmVyaWZ5TWVyZ2VPcHMoKSk7Ci0KLSAgICB3cml0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1dyaXRlcj4ob3B0aW9ucyk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5Jbml0aWFsaXplKGNvd18tPmZkKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRDb3B5KDIsIDEpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFhvckJsb2NrcygzLCAmZGF0YSwgZGF0YS5zaXplKCksIDEsIDEpKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOwotICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOwotICAgIEFTU0VSVF9GQUxTRShyZWFkZXIuVmVyaWZ5TWVyZ2VPcHMoKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7Ci0gICAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKLX0KZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvY293X2NvbXByZXNzLmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvY293X2NvbXByZXNzLmNwcAppbmRleCA5YjUwOTg2Li5iZmY1MjU3IDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L2Nvd19jb21wcmVzcy5jcHAKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9jb3dfY29tcHJlc3MuY3BwCkBAIC0xNywxMDggKzE3LDIxNSBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCisjaW5jbHVkZSA8Y3N0ZGludD4KICNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHF1ZXVlPgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcGFyc2VpbnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KICNpbmNsdWRlIDxicm90bGkvZW5jb2RlLmg+CisjaW5jbHVkZSA8bGlic25hcHNob3QvY293X2NvbXByZXNzLmg+CiAjaW5jbHVkZSA8bGlic25hcHNob3QvY293X2Zvcm1hdC5oPgogI2luY2x1ZGUgPGxpYnNuYXBzaG90L2Nvd19yZWFkZXIuaD4KICNpbmNsdWRlIDxsaWJzbmFwc2hvdC9jb3dfd3JpdGVyLmg+CiAjaW5jbHVkZSA8bHo0Lmg+CiAjaW5jbHVkZSA8emxpYi5oPgorI2luY2x1ZGUgPHpzdGQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHNuYXBzaG90IHsKLXN0ZDo6YmFzaWNfc3RyaW5nPHVpbnQ4X3Q+IENvbXByZXNzV29ya2VyOjpDb21wcmVzcyhjb25zdCB2b2lkKiBkYXRhLCBzaXplX3QgbGVuZ3RoKSB7Ci0gICAgcmV0dXJuIENvbXByZXNzKGNvbXByZXNzaW9uXywgZGF0YSwgbGVuZ3RoKTsKKworc3RkOjpvcHRpb25hbDxDb3dDb21wcmVzc2lvbkFsZ29yaXRobT4gQ29tcHJlc3Npb25BbGdvcml0aG1Gcm9tU3RyaW5nKHN0ZDo6c3RyaW5nX3ZpZXcgbmFtZSkgeworICAgIGlmIChuYW1lID09ICJneiIpIHsKKyAgICAgICAgcmV0dXJuIHtrQ293Q29tcHJlc3NHen07CisgICAgfSBlbHNlIGlmIChuYW1lID09ICJicm90bGkiKSB7CisgICAgICAgIHJldHVybiB7a0Nvd0NvbXByZXNzQnJvdGxpfTsKKyAgICB9IGVsc2UgaWYgKG5hbWUgPT0gImx6NCIpIHsKKyAgICAgICAgcmV0dXJuIHtrQ293Q29tcHJlc3NMejR9OworICAgIH0gZWxzZSBpZiAobmFtZSA9PSAienN0ZCIpIHsKKyAgICAgICAgcmV0dXJuIHtrQ293Q29tcHJlc3Nac3RkfTsKKyAgICB9IGVsc2UgaWYgKG5hbWUgPT0gIm5vbmUiIHx8IG5hbWUuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4ge2tDb3dDb21wcmVzc05vbmV9OworICAgIH0gZWxzZSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInVuYWJsZSB0byBkZXRlcm1pbmUgZGVmYXVsdCBjb21wcmVzc2lvbiBhbGdvcml0aG0gZm9yOiAiIDw8IG5hbWU7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CiB9CiAKLXN0ZDo6YmFzaWNfc3RyaW5nPHVpbnQ4X3Q+IENvbXByZXNzV29ya2VyOjpDb21wcmVzcyhDb3dDb21wcmVzc2lvbkFsZ29yaXRobSBjb21wcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3QgbGVuZ3RoKSB7CitzdGQ6OnVuaXF1ZV9wdHI8SUNvbXByZXNzb3I+IElDb21wcmVzc29yOjpDcmVhdGUoQ293Q29tcHJlc3Npb24gY29tcHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgYmxvY2tfc2l6ZSkgeworICAgIHN3aXRjaCAoY29tcHJlc3Npb24uYWxnb3JpdGhtKSB7CisgICAgICAgIGNhc2Uga0Nvd0NvbXByZXNzTHo0OgorICAgICAgICAgICAgcmV0dXJuIElDb21wcmVzc29yOjpMejQoY29tcHJlc3Npb24uY29tcHJlc3Npb25fbGV2ZWwsIGJsb2NrX3NpemUpOworICAgICAgICBjYXNlIGtDb3dDb21wcmVzc0Jyb3RsaToKKyAgICAgICAgICAgIHJldHVybiBJQ29tcHJlc3Nvcjo6QnJvdGxpKGNvbXByZXNzaW9uLmNvbXByZXNzaW9uX2xldmVsLCBibG9ja19zaXplKTsKKyAgICAgICAgY2FzZSBrQ293Q29tcHJlc3NHejoKKyAgICAgICAgICAgIHJldHVybiBJQ29tcHJlc3Nvcjo6R3ooY29tcHJlc3Npb24uY29tcHJlc3Npb25fbGV2ZWwsIGJsb2NrX3NpemUpOworICAgICAgICBjYXNlIGtDb3dDb21wcmVzc1pzdGQ6CisgICAgICAgICAgICByZXR1cm4gSUNvbXByZXNzb3I6OlpzdGQoY29tcHJlc3Npb24uY29tcHJlc3Npb25fbGV2ZWwsIGJsb2NrX3NpemUpOworICAgICAgICBjYXNlIGtDb3dDb21wcmVzc05vbmU6CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKKy8vIDEuIERlZmF1bHQgY29tcHJlc3Npb24gbGV2ZWwgaXMgZGV0ZXJtaW5lZCBieSBjb21wcmVzc2lvbiBhbGdvcml0aG0KKy8vIDIuIFRoZXJlIG1pZ2h0IGJlIGNvbXBhdGliaWxpdHkgaXNzdWVzIGlmIGEgdmFsdWUgaXMgY2hhbmdlZCBoZXJlLCBhcyAgc29tZSBvbGRlciB2ZXJzaW9ucyBvZgorLy8gQW5kcm9pZCB3aWxsIGFzc3VtZSBhIGRpZmZlcmVudCBjb21wcmVzc2lvbiBsZXZlbCwgY2F1c2luZyBjb3dfc2l6ZSBlc3RpbWF0aW9uIGRpZmZlcmVuY2VzIHRoYXQKKy8vIHdpbGwgbGVhZCB0byBPVEEgZmFpbHVyZS4gRW5zdXJlIHRoYXQgdGhlIGRldmljZSBhbmQgT1RBIHBhY2thZ2UgdXNlIHRoZSBzYW1lIGNvbXByZXNzaW9uIGxldmVsCisvLyBmb3IgT1RBIHRvIHN1Y2NlZWQuCit1aW50MzJfdCBDb21wcmVzc1dvcmtlcjo6R2V0RGVmYXVsdENvbXByZXNzaW9uTGV2ZWwoQ293Q29tcHJlc3Npb25BbGdvcml0aG0gY29tcHJlc3Npb24pIHsKICAgICBzd2l0Y2ggKGNvbXByZXNzaW9uKSB7CiAgICAgICAgIGNhc2Uga0Nvd0NvbXByZXNzR3o6IHsKLSAgICAgICAgICAgIGNvbnN0IGF1dG8gYm91bmQgPSBjb21wcmVzc0JvdW5kKGxlbmd0aCk7Ci0gICAgICAgICAgICBzdGQ6OmJhc2ljX3N0cmluZzx1aW50OF90PiBidWZmZXIoYm91bmQsICdcMCcpOwotCi0gICAgICAgICAgICB1TG9uZ2YgZGVzdF9sZW4gPSBib3VuZDsKLSAgICAgICAgICAgIGF1dG8gcnYgPSBjb21wcmVzczIoYnVmZmVyLmRhdGEoKSwgJmRlc3RfbGVuLCByZWludGVycHJldF9jYXN0PGNvbnN0IEJ5dGVmKj4oZGF0YSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwgWl9CRVNUX0NPTVBSRVNTSU9OKTsKLSAgICAgICAgICAgIGlmIChydiAhPSBaX09LKSB7Ci0gICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiY29tcHJlc3MyIHJldHVybmVkOiAiIDw8IHJ2OwotICAgICAgICAgICAgICAgIHJldHVybiB7fTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1ZmZlci5yZXNpemUoZGVzdF9sZW4pOwotICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICAgICAgICAgIHJldHVybiBaX0JFU1RfQ09NUFJFU1NJT047CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBrQ293Q29tcHJlc3NCcm90bGk6IHsKLSAgICAgICAgICAgIGNvbnN0IGF1dG8gYm91bmQgPSBCcm90bGlFbmNvZGVyTWF4Q29tcHJlc3NlZFNpemUobGVuZ3RoKTsKLSAgICAgICAgICAgIGlmICghYm91bmQpIHsKLSAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJCcm90bGlFbmNvZGVyTWF4Q29tcHJlc3NlZFNpemUgcmV0dXJuZWQgMCI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHt9OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RkOjpiYXNpY19zdHJpbmc8dWludDhfdD4gYnVmZmVyKGJvdW5kLCAnXDAnKTsKLQotICAgICAgICAgICAgc2l6ZV90IGVuY29kZWRfc2l6ZSA9IGJvdW5kOwotICAgICAgICAgICAgYXV0byBydiA9IEJyb3RsaUVuY29kZXJDb21wcmVzcygKLSAgICAgICAgICAgICAgICAgICAgQlJPVExJX0RFRkFVTFRfUVVBTElUWSwgQlJPVExJX0RFRkFVTFRfV0lORE9XLCBCUk9UTElfREVGQVVMVF9NT0RFLCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGRhdGEpLCAmZW5jb2RlZF9zaXplLCBidWZmZXIuZGF0YSgpKTsKLSAgICAgICAgICAgIGlmICghcnYpIHsKLSAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJCcm90bGlFbmNvZGVyQ29tcHJlc3MgZmFpbGVkIjsKLSAgICAgICAgICAgICAgICByZXR1cm4ge307Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWZmZXIucmVzaXplKGVuY29kZWRfc2l6ZSk7Ci0gICAgICAgICAgICByZXR1cm4gYnVmZmVyOworICAgICAgICAgICAgcmV0dXJuIEJST1RMSV9ERUZBVUxUX1FVQUxJVFk7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBrQ293Q29tcHJlc3NMejQ6IHsKLSAgICAgICAgICAgIGNvbnN0IGF1dG8gYm91bmQgPSBMWjRfY29tcHJlc3NCb3VuZChsZW5ndGgpOwotICAgICAgICAgICAgaWYgKCFib3VuZCkgewotICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkxaNF9jb21wcmVzc0JvdW5kIHJldHVybmVkIDAiOwotICAgICAgICAgICAgICAgIHJldHVybiB7fTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0ZDo6YmFzaWNfc3RyaW5nPHVpbnQ4X3Q+IGJ1ZmZlcihib3VuZCwgJ1wwJyk7Ci0KLSAgICAgICAgICAgIGNvbnN0IGF1dG8gY29tcHJlc3NlZF9zaXplID0gTFo0X2NvbXByZXNzX2RlZmF1bHQoCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihkYXRhKSwgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYnVmZmVyLmRhdGEoKSksIGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLnNpemUoKSk7Ci0gICAgICAgICAgICBpZiAoY29tcHJlc3NlZF9zaXplIDw9IDApIHsKLSAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJMWjRfY29tcHJlc3NfZGVmYXVsdCBmYWlsZWQsIGlucHV0IHNpemU6ICIgPDwgbGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBjb21wcmVzc2lvbiBib3VuZDogIiA8PCBib3VuZCA8PCAiLCByZXQ6ICIgPDwgY29tcHJlc3NlZF9zaXplOwotICAgICAgICAgICAgICAgIHJldHVybiB7fTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIERvbid0IHJ1biBjb21wcmVzc2lvbiBpZiB0aGUgY29tcHJlc3NlZCBvdXRwdXQgaXMgbGFyZ2VyCi0gICAgICAgICAgICBpZiAoY29tcHJlc3NlZF9zaXplID49IGxlbmd0aCkgewotICAgICAgICAgICAgICAgIGJ1ZmZlci5yZXNpemUobGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoYnVmZmVyLmRhdGEoKSwgZGF0YSwgbGVuZ3RoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLnJlc2l6ZShjb21wcmVzc2VkX3NpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAidW5oYW5kbGVkIGNvbXByZXNzaW9uIHR5cGU6ICIgPDwgY29tcHJlc3Npb247CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtDb3dDb21wcmVzc1pzdGQ6IHsKKyAgICAgICAgICAgIHJldHVybiBaU1REX2RlZmF1bHRDTGV2ZWwoKTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtDb3dDb21wcmVzc05vbmU6IHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiB7fTsKLX0KLWJvb2wgQ29tcHJlc3NXb3JrZXI6OkNvbXByZXNzQmxvY2tzKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IG51bV9ibG9ja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OmJhc2ljX3N0cmluZzx1aW50OF90Pj4qIGNvbXByZXNzZWRfZGF0YSkgewotICAgIHJldHVybiBDb21wcmVzc0Jsb2Nrcyhjb21wcmVzc2lvbl8sIGJsb2NrX3NpemVfLCBidWZmZXIsIG51bV9ibG9ja3MsIGNvbXByZXNzZWRfZGF0YSk7CisgICAgcmV0dXJuIDA7CiB9CiAKLWJvb2wgQ29tcHJlc3NXb3JrZXI6OkNvbXByZXNzQmxvY2tzKENvd0NvbXByZXNzaW9uQWxnb3JpdGhtIGNvbXByZXNzaW9uLCBzaXplX3QgYmxvY2tfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IG51bV9ibG9ja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OmJhc2ljX3N0cmluZzx1aW50OF90Pj4qIGNvbXByZXNzZWRfZGF0YSkgeworY2xhc3MgR3pDb21wcmVzc29yIGZpbmFsIDogcHVibGljIElDb21wcmVzc29yIHsKKyAgcHVibGljOgorICAgIEd6Q29tcHJlc3NvcihpbnQzMl90IGNvbXByZXNzaW9uX2xldmVsLCBjb25zdCB1aW50MzJfdCBibG9ja19zaXplKQorICAgICAgICA6IElDb21wcmVzc29yKGNvbXByZXNzaW9uX2xldmVsLCBibG9ja19zaXplKXt9OworCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gQ29tcHJlc3MoY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IGxlbmd0aCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBjb25zdCBhdXRvIGJvdW5kID0gY29tcHJlc3NCb3VuZChsZW5ndGgpOworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWZmZXIoYm91bmQsICdcMCcpOworCisgICAgICAgIHVMb25nZiBkZXN0X2xlbiA9IGJvdW5kOworICAgICAgICBhdXRvIHJ2ID0gY29tcHJlc3MyKGJ1ZmZlci5kYXRhKCksICZkZXN0X2xlbiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBCeXRlZio+KGRhdGEpLCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Q29tcHJlc3Npb25MZXZlbCgpKTsKKyAgICAgICAgaWYgKHJ2ICE9IFpfT0spIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgImNvbXByZXNzMiByZXR1cm5lZDogIiA8PCBydjsKKyAgICAgICAgICAgIHJldHVybiB7fTsKKyAgICAgICAgfQorICAgICAgICBidWZmZXIucmVzaXplKGRlc3RfbGVuKTsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICB9OworfTsKKworY2xhc3MgTHo0Q29tcHJlc3NvciBmaW5hbCA6IHB1YmxpYyBJQ29tcHJlc3NvciB7CisgIHB1YmxpYzoKKyAgICBMejRDb21wcmVzc29yKGludDMyX3QgY29tcHJlc3Npb25fbGV2ZWwsIGNvbnN0IHVpbnQzMl90IGJsb2NrX3NpemUpCisgICAgICAgIDogSUNvbXByZXNzb3IoY29tcHJlc3Npb25fbGV2ZWwsIGJsb2NrX3NpemUpe307CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBDb21wcmVzcyhjb25zdCB2b2lkKiBkYXRhLCBzaXplX3QgbGVuZ3RoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIGNvbnN0IGF1dG8gYm91bmQgPSBMWjRfY29tcHJlc3NCb3VuZChsZW5ndGgpOworICAgICAgICBpZiAoIWJvdW5kKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJMWjRfY29tcHJlc3NCb3VuZCByZXR1cm5lZCAwIjsKKyAgICAgICAgICAgIHJldHVybiB7fTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWZmZXIoYm91bmQsICdcMCcpOworCisgICAgICAgIGNvbnN0IGF1dG8gY29tcHJlc3NlZF9zaXplID0KKyAgICAgICAgICAgICAgICBMWjRfY29tcHJlc3NfZGVmYXVsdChzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYnVmZmVyLmRhdGEoKSksIGxlbmd0aCwgYnVmZmVyLnNpemUoKSk7CisgICAgICAgIGlmIChjb21wcmVzc2VkX3NpemUgPD0gMCkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTFo0X2NvbXByZXNzX2RlZmF1bHQgZmFpbGVkLCBpbnB1dCBzaXplOiAiIDw8IGxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBjb21wcmVzc2lvbiBib3VuZDogIiA8PCBib3VuZCA8PCAiLCByZXQ6ICIgPDwgY29tcHJlc3NlZF9zaXplOworICAgICAgICAgICAgcmV0dXJuIHt9OworICAgICAgICB9CisgICAgICAgIC8vIERvbid0IHJ1biBjb21wcmVzc2lvbiBpZiB0aGUgY29tcHJlc3NlZCBvdXRwdXQgaXMgbGFyZ2VyCisgICAgICAgIGlmIChjb21wcmVzc2VkX3NpemUgPj0gbGVuZ3RoKSB7CisgICAgICAgICAgICBidWZmZXIucmVzaXplKGxlbmd0aCk7CisgICAgICAgICAgICBtZW1jcHkoYnVmZmVyLmRhdGEoKSwgZGF0YSwgbGVuZ3RoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1ZmZlci5yZXNpemUoY29tcHJlc3NlZF9zaXplKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmZmVyOworICAgIH07Cit9OworCitjbGFzcyBCcm90bGlDb21wcmVzc29yIGZpbmFsIDogcHVibGljIElDb21wcmVzc29yIHsKKyAgcHVibGljOgorICAgIEJyb3RsaUNvbXByZXNzb3IoaW50MzJfdCBjb21wcmVzc2lvbl9sZXZlbCwgY29uc3QgdWludDMyX3QgYmxvY2tfc2l6ZSkKKyAgICAgICAgOiBJQ29tcHJlc3Nvcihjb21wcmVzc2lvbl9sZXZlbCwgYmxvY2tfc2l6ZSl7fTsKKworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IENvbXByZXNzKGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBsZW5ndGgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgY29uc3QgYXV0byBib3VuZCA9IEJyb3RsaUVuY29kZXJNYXhDb21wcmVzc2VkU2l6ZShsZW5ndGgpOworICAgICAgICBpZiAoIWJvdW5kKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJCcm90bGlFbmNvZGVyTWF4Q29tcHJlc3NlZFNpemUgcmV0dXJuZWQgMCI7CisgICAgICAgICAgICByZXR1cm4ge307CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmZmVyKGJvdW5kLCAnXDAnKTsKKworICAgICAgICBzaXplX3QgZW5jb2RlZF9zaXplID0gYm91bmQ7CisgICAgICAgIGF1dG8gcnYgPSBCcm90bGlFbmNvZGVyQ29tcHJlc3MoCisgICAgICAgICAgICAgICAgR2V0Q29tcHJlc3Npb25MZXZlbCgpLCBCUk9UTElfREVGQVVMVF9XSU5ET1csIEJST1RMSV9ERUZBVUxUX01PREUsIGxlbmd0aCwKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihkYXRhKSwgJmVuY29kZWRfc2l6ZSwgYnVmZmVyLmRhdGEoKSk7CisgICAgICAgIGlmICghcnYpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkJyb3RsaUVuY29kZXJDb21wcmVzcyBmYWlsZWQiOworICAgICAgICAgICAgcmV0dXJuIHt9OworICAgICAgICB9CisgICAgICAgIGJ1ZmZlci5yZXNpemUoZW5jb2RlZF9zaXplKTsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICB9OworfTsKKworY2xhc3MgWnN0ZENvbXByZXNzb3IgZmluYWwgOiBwdWJsaWMgSUNvbXByZXNzb3IgeworICBwdWJsaWM6CisgICAgWnN0ZENvbXByZXNzb3IoaW50MzJfdCBjb21wcmVzc2lvbl9sZXZlbCwgY29uc3QgdWludDMyX3QgYmxvY2tfc2l6ZSkKKyAgICAgICAgOiBJQ29tcHJlc3Nvcihjb21wcmVzc2lvbl9sZXZlbCwgYmxvY2tfc2l6ZSksCisgICAgICAgICAgenN0ZF9jb250ZXh0XyhaU1REX2NyZWF0ZUNDdHgoKSwgWlNURF9mcmVlQ0N0eCkgeworICAgICAgICBaU1REX0NDdHhfc2V0UGFyYW1ldGVyKHpzdGRfY29udGV4dF8uZ2V0KCksIFpTVERfY19jb21wcmVzc2lvbkxldmVsLCBjb21wcmVzc2lvbl9sZXZlbCk7CisgICAgICAgIFpTVERfQ0N0eF9zZXRQYXJhbWV0ZXIoenN0ZF9jb250ZXh0Xy5nZXQoKSwgWlNURF9jX3dpbmRvd0xvZywgbG9nMihHZXRCbG9ja1NpemUoKSkpOworICAgIH07CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBDb21wcmVzcyhjb25zdCB2b2lkKiBkYXRhLCBzaXplX3QgbGVuZ3RoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ1ZmZlcihaU1REX2NvbXByZXNzQm91bmQobGVuZ3RoKSwgJ1wwJyk7CisgICAgICAgIGNvbnN0IGF1dG8gY29tcHJlc3NlZF9zaXplID0KKyAgICAgICAgICAgICAgICBaU1REX2NvbXByZXNzMih6c3RkX2NvbnRleHRfLmdldCgpLCBidWZmZXIuZGF0YSgpLCBidWZmZXIuc2l6ZSgpLCBkYXRhLCBsZW5ndGgpOworICAgICAgICBpZiAoY29tcHJlc3NlZF9zaXplIDw9IDApIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlpTVEQgY29tcHJlc3Npb24gZmFpbGVkICIgPDwgY29tcHJlc3NlZF9zaXplOworICAgICAgICAgICAgcmV0dXJuIHt9OworICAgICAgICB9CisgICAgICAgIC8vIERvbid0IHJ1biBjb21wcmVzc2lvbiBpZiB0aGUgY29tcHJlc3NlZCBvdXRwdXQgaXMgbGFyZ2VyCisgICAgICAgIGlmIChjb21wcmVzc2VkX3NpemUgPj0gbGVuZ3RoKSB7CisgICAgICAgICAgICBidWZmZXIucmVzaXplKGxlbmd0aCk7CisgICAgICAgICAgICBtZW1jcHkoYnVmZmVyLmRhdGEoKSwgZGF0YSwgbGVuZ3RoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1ZmZlci5yZXNpemUoY29tcHJlc3NlZF9zaXplKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmZmVyOworICAgIH07CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8WlNURF9DQ3R4LCBkZWNsdHlwZSgmWlNURF9mcmVlQ0N0eCk+IHpzdGRfY29udGV4dF87Cit9OworCitib29sIENvbXByZXNzV29ya2VyOjpDb21wcmVzc0Jsb2Nrcyhjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBudW1fYmxvY2tzLCBzaXplX3QgYmxvY2tfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiogY29tcHJlc3NlZF9kYXRhKSB7CisgICAgcmV0dXJuIENvbXByZXNzQmxvY2tzKGNvbXByZXNzb3JfLmdldCgpLCBibG9ja19zaXplLCBidWZmZXIsIG51bV9ibG9ja3MsIGNvbXByZXNzZWRfZGF0YSk7Cit9CisKK2Jvb2wgQ29tcHJlc3NXb3JrZXI6OkNvbXByZXNzQmxvY2tzKElDb21wcmVzc29yKiBjb21wcmVzc29yLCBzaXplX3QgYmxvY2tfc2l6ZSwgY29uc3Qgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bV9ibG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4qIGNvbXByZXNzZWRfZGF0YSkgewogICAgIGNvbnN0IHVpbnQ4X3QqIGl0ZXIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihidWZmZXIpOwogICAgIHdoaWxlIChudW1fYmxvY2tzKSB7Ci0gICAgICAgIGF1dG8gZGF0YSA9IENvbXByZXNzKGNvbXByZXNzaW9uLCBpdGVyLCBibG9ja19zaXplKTsKKyAgICAgICAgYXV0byBkYXRhID0gY29tcHJlc3Nvci0+Q29tcHJlc3MoaXRlciwgYmxvY2tfc2l6ZSk7CiAgICAgICAgIGlmIChkYXRhLmVtcHR5KCkpIHsKICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJDb21wcmVzc0Jsb2NrczogQ29tcHJlc3Npb24gZmFpbGVkIjsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBpZiAoZGF0YS5zaXplKCkgPiBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQxNl90Pjo6bWF4KCkpIHsKKyAgICAgICAgaWYgKGRhdGEuc2l6ZSgpID4gc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpKSB7CiAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDb21wcmVzc2VkIGJsb2NrIGlzIHRvbyBsYXJnZTogIiA8PCBkYXRhLnNpemUoKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQpAQCAtMTQ5LDcgKzI1Niw4IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBDb21wcmVzcyBibG9ja3MKLSAgICAgICAgYm9vbCByZXQgPSBDb21wcmVzc0Jsb2NrcyhibG9ja3MuYnVmZmVyLCBibG9ja3MubnVtX2Jsb2NrcywgJmJsb2Nrcy5jb21wcmVzc2VkX2RhdGEpOworICAgICAgICBib29sIHJldCA9IENvbXByZXNzQmxvY2tzKGJsb2Nrcy5idWZmZXIsIGJsb2Nrcy5udW1fYmxvY2tzLCBibG9ja3MuYmxvY2tfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxvY2tzLmNvbXByZXNzZWRfZGF0YSk7CiAgICAgICAgIGJsb2Nrcy5jb21wcmVzc2lvbl9zdGF0dXMgPSByZXQ7CiAgICAgICAgIHsKICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGxvY2tfKTsKQEAgLTE2OCwzNSArMjc2LDMxIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgQ29tcHJlc3NXb3JrZXI6OkVucXVldWVDb21wcmVzc0Jsb2Nrcyhjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBudW1fYmxvY2tzKSB7Cit2b2lkIENvbXByZXNzV29ya2VyOjpFbnF1ZXVlQ29tcHJlc3NCbG9ja3MoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3QgYmxvY2tfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtX2Jsb2NrcykgewogICAgIHsKICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobG9ja18pOwogCiAgICAgICAgIENvbXByZXNzV29yayBibG9ja3MgPSB7fTsKICAgICAgICAgYmxvY2tzLmJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICAgICAgYmxvY2tzLmJsb2NrX3NpemUgPSBibG9ja19zaXplOwogICAgICAgICBibG9ja3MubnVtX2Jsb2NrcyA9IG51bV9ibG9ja3M7CiAgICAgICAgIHdvcmtfcXVldWVfLnB1c2goc3RkOjptb3ZlKGJsb2NrcykpOworICAgICAgICB0b3RhbF9zdWJtaXR0ZWRfICs9IDE7CiAgICAgfQogICAgIGN2Xy5ub3RpZnlfYWxsKCk7CiB9CiAKLWJvb2wgQ29tcHJlc3NXb3JrZXI6OkdldENvbXByZXNzZWRCdWZmZXJzKHN0ZDo6dmVjdG9yPHN0ZDo6YmFzaWNfc3RyaW5nPHVpbnQ4X3Q+PiogY29tcHJlc3NlZF9idWYpIHsKLSAgICB7Citib29sIENvbXByZXNzV29ya2VyOjpHZXRDb21wcmVzc2VkQnVmZmVycyhzdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4qIGNvbXByZXNzZWRfYnVmKSB7CisgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKGxvY2tfKTsKLSAgICAgICAgd2hpbGUgKGNvbXByZXNzZWRfcXVldWVfLmVtcHR5KCkgJiYgIXN0b3BwZWRfKSB7CisgICAgICAgIHdoaWxlICgodG90YWxfc3VibWl0dGVkXyAhPSB0b3RhbF9wcm9jZXNzZWRfKSAmJiBjb21wcmVzc2VkX3F1ZXVlXy5lbXB0eSgpICYmICFzdG9wcGVkXykgewogICAgICAgICAgICAgY3ZfLndhaXQobG9jayk7CiAgICAgICAgIH0KLQotICAgICAgICBpZiAoc3RvcHBlZF8pIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhsb2NrXyk7CiAgICAgICAgIHdoaWxlIChjb21wcmVzc2VkX3F1ZXVlXy5zaXplKCkgPiAwKSB7CiAgICAgICAgICAgICBDb21wcmVzc1dvcmsgYmxvY2tzID0gc3RkOjptb3ZlKGNvbXByZXNzZWRfcXVldWVfLmZyb250KCkpOwogICAgICAgICAgICAgY29tcHJlc3NlZF9xdWV1ZV8ucG9wKCk7CisgICAgICAgICAgICB0b3RhbF9wcm9jZXNzZWRfICs9IDE7CiAKICAgICAgICAgICAgIGlmIChibG9ja3MuY29tcHJlc3Npb25fc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgY29tcHJlc3NlZF9idWYtPmluc2VydChjb21wcmVzc2VkX2J1Zi0+ZW5kKCksCkBAIC0yMDcsOSArMzExLDMyIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGlmICgodG90YWxfc3VibWl0dGVkXyA9PSB0b3RhbF9wcm9jZXNzZWRfKSB8fCBzdG9wcGVkXykgeworICAgICAgICAgICAgdG90YWxfc3VibWl0dGVkXyA9IDA7CisgICAgICAgICAgICB0b3RhbF9wcm9jZXNzZWRfID0gMDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CiAgICAgfQorfQogCi0gICAgcmV0dXJuIHRydWU7CitzdGQ6OnVuaXF1ZV9wdHI8SUNvbXByZXNzb3I+IElDb21wcmVzc29yOjpCcm90bGkoY29uc3QgaW50MzJfdCBjb21wcmVzc2lvbl9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBibG9ja19zaXplKSB7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8QnJvdGxpQ29tcHJlc3Nvcj4oY29tcHJlc3Npb25fbGV2ZWwsIGJsb2NrX3NpemUpOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8SUNvbXByZXNzb3I+IElDb21wcmVzc29yOjpHeihjb25zdCBpbnQzMl90IGNvbXByZXNzaW9uX2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgYmxvY2tfc2l6ZSkgeworICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEd6Q29tcHJlc3Nvcj4oY29tcHJlc3Npb25fbGV2ZWwsIGJsb2NrX3NpemUpOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8SUNvbXByZXNzb3I+IElDb21wcmVzc29yOjpMejQoY29uc3QgaW50MzJfdCBjb21wcmVzc2lvbl9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBibG9ja19zaXplKSB7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8THo0Q29tcHJlc3Nvcj4oY29tcHJlc3Npb25fbGV2ZWwsIGJsb2NrX3NpemUpOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8SUNvbXByZXNzb3I+IElDb21wcmVzc29yOjpac3RkKGNvbnN0IGludDMyX3QgY29tcHJlc3Npb25fbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGJsb2NrX3NpemUpIHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxac3RkQ29tcHJlc3Nvcj4oY29tcHJlc3Npb25fbGV2ZWwsIGJsb2NrX3NpemUpOwogfQogCiB2b2lkIENvbXByZXNzV29ya2VyOjpGaW5hbGl6ZSgpIHsKQEAgLTIyMCw4ICszNDcsOCBAQAogICAgIGN2Xy5ub3RpZnlfYWxsKCk7CiB9CiAKLUNvbXByZXNzV29ya2VyOjpDb21wcmVzc1dvcmtlcihDb3dDb21wcmVzc2lvbkFsZ29yaXRobSBjb21wcmVzc2lvbiwgdWludDMyX3QgYmxvY2tfc2l6ZSkKLSAgICA6IGNvbXByZXNzaW9uXyhjb21wcmVzc2lvbiksIGJsb2NrX3NpemVfKGJsb2NrX3NpemUpIHt9CitDb21wcmVzc1dvcmtlcjo6Q29tcHJlc3NXb3JrZXIoc3RkOjp1bmlxdWVfcHRyPElDb21wcmVzc29yPiYmIGNvbXByZXNzb3IpCisgICAgOiBjb21wcmVzc29yXyhzdGQ6Om1vdmUoY29tcHJlc3NvcikpIHt9CiAKIH0gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvY293X2RlY29tcHJlc3MuY3BwIGIvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9jb3dfZGVjb21wcmVzcy5jcHAKaW5kZXggMTM5YTI5Zi4uMmFhZjM4OCAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9jb3dfZGVjb21wcmVzcy5jcHAKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9jb3dfZGVjb21wcmVzcy5jcHAKQEAgLTE2LDEyNCArMTYsMTI1IEBACiAKICNpbmNsdWRlICJjb3dfZGVjb21wcmVzcy5oIgogCisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGJyb3RsaS9kZWNvZGUuaD4KICNpbmNsdWRlIDxsejQuaD4KICNpbmNsdWRlIDx6bGliLmg+CisjaW5jbHVkZSA8enN0ZC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2Ugc25hcHNob3QgewogCi1jbGFzcyBOb0RlY29tcHJlc3NvciBmaW5hbCA6IHB1YmxpYyBJRGVjb21wcmVzc29yIHsKLSAgcHVibGljOgotICAgIGJvb2wgRGVjb21wcmVzcyhzaXplX3QpIG92ZXJyaWRlOwotfTsKK3NzaXplX3QgSUJ5dGVTdHJlYW06OlJlYWRGdWxseSh2b2lkKiBidWZmZXIsIHNpemVfdCBidWZmZXJfc2l6ZSkgeworICAgIHNpemVfdCBzdHJlYW1fcmVtYWluaW5nID0gU2l6ZSgpOwogCi1ib29sIE5vRGVjb21wcmVzc29yOjpEZWNvbXByZXNzKHNpemVfdCkgewotICAgIHNpemVfdCBzdHJlYW1fcmVtYWluaW5nID0gc3RyZWFtXy0+U2l6ZSgpOworICAgIGNoYXIqIGJ1ZmZlcl9zdGFydCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGJ1ZmZlcik7CisgICAgY2hhciogYnVmZmVyX3BvcyA9IGJ1ZmZlcl9zdGFydDsKKyAgICBzaXplX3QgYnVmZmVyX3JlbWFpbmluZyA9IGJ1ZmZlcl9zaXplOwogICAgIHdoaWxlIChzdHJlYW1fcmVtYWluaW5nKSB7Ci0gICAgICAgIHNpemVfdCBidWZmZXJfc2l6ZSA9IHN0cmVhbV9yZW1haW5pbmc7Ci0gICAgICAgIHVpbnQ4X3QqIGJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHNpbmtfLT5HZXRCdWZmZXIoYnVmZmVyX3NpemUsICZidWZmZXJfc2l6ZSkpOwotICAgICAgICBpZiAoIWJ1ZmZlcikgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IGFjcXVpcmUgYnVmZmVyIGZyb20gc2luayI7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGNvbnN0IHNpemVfdCB0b19yZWFkID0gc3RkOjptaW4oYnVmZmVyX3JlbWFpbmluZywgc3RyZWFtX3JlbWFpbmluZyk7CisgICAgICAgIGNvbnN0IHNzaXplX3QgYWN0dWFsX3JlYWQgPSBSZWFkKGJ1ZmZlcl9wb3MsIHRvX3JlYWQpOworICAgICAgICBpZiAoYWN0dWFsX3JlYWQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKCFhY3R1YWxfcmVhZCkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiU3RyZWFtIGVuZGVkIHByZW1hdHVyZWx5IjsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBDSEVDS19MRShhY3R1YWxfcmVhZCwgdG9fcmVhZCk7CiAKLSAgICAgICAgLy8gUmVhZCB1bnRpbCB3ZSBjYW4gZmlsbCB0aGUgYnVmZmVyLgotICAgICAgICB1aW50OF90KiBidWZmZXJfcG9zID0gYnVmZmVyOwotICAgICAgICBzaXplX3QgYnl0ZXNfdG9fcmVhZCA9IHN0ZDo6bWluKGJ1ZmZlcl9zaXplLCBzdHJlYW1fcmVtYWluaW5nKTsKLSAgICAgICAgd2hpbGUgKGJ5dGVzX3RvX3JlYWQpIHsKLSAgICAgICAgICAgIHNpemVfdCByZWFkOwotICAgICAgICAgICAgaWYgKCFzdHJlYW1fLT5SZWFkKGJ1ZmZlcl9wb3MsIGJ5dGVzX3RvX3JlYWQsICZyZWFkKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghcmVhZCkgewotICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlN0cmVhbSBlbmRlZCBwcmVtYXR1cmVseSI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFzaW5rXy0+UmV0dXJuRGF0YShidWZmZXJfcG9zLCByZWFkKSkgewotICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCByZXR1cm4gYnVmZmVyIHRvIHNpbmsiOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1ZmZlcl9wb3MgKz0gcmVhZDsKLSAgICAgICAgICAgIGJ5dGVzX3RvX3JlYWQgLT0gcmVhZDsKLSAgICAgICAgICAgIHN0cmVhbV9yZW1haW5pbmcgLT0gcmVhZDsKLSAgICAgICAgfQorICAgICAgICBzdHJlYW1fcmVtYWluaW5nIC09IGFjdHVhbF9yZWFkOworICAgICAgICBidWZmZXJfcG9zICs9IGFjdHVhbF9yZWFkOworICAgICAgICBidWZmZXJfcmVtYWluaW5nIC09IGFjdHVhbF9yZWFkOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gYnVmZmVyX3BvcyAtIGJ1ZmZlcl9zdGFydDsKIH0KIAotc3RkOjp1bmlxdWVfcHRyPElEZWNvbXByZXNzb3I+IElEZWNvbXByZXNzb3I6OlVuY29tcHJlc3NlZCgpIHsKLSAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPElEZWNvbXByZXNzb3I+KG5ldyBOb0RlY29tcHJlc3NvcigpKTsKK3N0ZDo6dW5pcXVlX3B0cjxJRGVjb21wcmVzc29yPiBJRGVjb21wcmVzc29yOjpGcm9tU3RyaW5nKHN0ZDo6c3RyaW5nX3ZpZXcgY29tcHJlc3NvcikgeworICAgIGlmIChjb21wcmVzc29yID09ICJsejQiKSB7CisgICAgICAgIHJldHVybiBJRGVjb21wcmVzc29yOjpMejQoKTsKKyAgICB9IGVsc2UgaWYgKGNvbXByZXNzb3IgPT0gImJyb3RsaSIpIHsKKyAgICAgICAgcmV0dXJuIElEZWNvbXByZXNzb3I6OkJyb3RsaSgpOworICAgIH0gZWxzZSBpZiAoY29tcHJlc3NvciA9PSAiZ3oiKSB7CisgICAgICAgIHJldHVybiBJRGVjb21wcmVzc29yOjpHeigpOworICAgIH0gZWxzZSBpZiAoY29tcHJlc3NvciA9PSAienN0ZCIpIHsKKyAgICAgICAgcmV0dXJuIElEZWNvbXByZXNzb3I6OlpzdGQoKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CiB9CiAKIC8vIFJlYWQgY2h1bmtzIG9mIHRoZSBDT1cgYW5kIGluY3JlbWVudGFsbHkgc3RyZWFtIHRoZW0gdG8gdGhlIGRlY29kZXIuCiBjbGFzcyBTdHJlYW1EZWNvbXByZXNzb3IgOiBwdWJsaWMgSURlY29tcHJlc3NvciB7CiAgIHB1YmxpYzoKLSAgICBib29sIERlY29tcHJlc3Moc2l6ZV90IG91dHB1dF9ieXRlcykgb3ZlcnJpZGU7CisgICAgc3NpemVfdCBEZWNvbXByZXNzKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9zaXplLCBzaXplX3QgZGVjb21wcmVzc2VkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpZ25vcmVfYnl0ZXMpIG92ZXJyaWRlOwogCiAgICAgdmlydHVhbCBib29sIEluaXQoKSA9IDA7Ci0gICAgdmlydHVhbCBib29sIERlY29tcHJlc3NJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuZ3RoKSA9IDA7Ci0gICAgdmlydHVhbCBib29sIERvbmUoKSA9IDA7CisgICAgdmlydHVhbCBib29sIFBhcnRpYWxEZWNvbXByZXNzKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW5ndGgpID0gMDsKKyAgICBib29sIE91dHB1dEZ1bGwoKSBjb25zdCB7IHJldHVybiAhaWdub3JlX2J5dGVzXyAmJiAhb3V0cHV0X2J1ZmZlcl9yZW1haW5pbmdfOyB9CiAKICAgcHJvdGVjdGVkOgotICAgIGJvb2wgR2V0RnJlc2hCdWZmZXIoKTsKLQotICAgIHNpemVfdCBvdXRwdXRfYnl0ZXNfOwogICAgIHNpemVfdCBzdHJlYW1fcmVtYWluaW5nXzsKICAgICB1aW50OF90KiBvdXRwdXRfYnVmZmVyXyA9IG51bGxwdHI7CiAgICAgc2l6ZV90IG91dHB1dF9idWZmZXJfcmVtYWluaW5nXyA9IDA7CisgICAgc2l6ZV90IGlnbm9yZV9ieXRlc18gPSAwOworICAgIGJvb2wgZGVjb21wcmVzc29yX2VuZGVkXyA9IGZhbHNlOwogfTsKIAogc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga0NodW5rU2l6ZSA9IDQwOTY7CiAKLWJvb2wgU3RyZWFtRGVjb21wcmVzc29yOjpEZWNvbXByZXNzKHNpemVfdCBvdXRwdXRfYnl0ZXMpIHsKK3NzaXplX3QgU3RyZWFtRGVjb21wcmVzc29yOjpEZWNvbXByZXNzKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9zaXplLCBzaXplX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaWdub3JlX2J5dGVzKSB7CiAgICAgaWYgKCFJbml0KCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIHN0cmVhbV9yZW1haW5pbmdfID0gc3RyZWFtXy0+U2l6ZSgpOwotICAgIG91dHB1dF9ieXRlc18gPSBvdXRwdXRfYnl0ZXM7CisgICAgb3V0cHV0X2J1ZmZlcl8gPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihidWZmZXIpOworICAgIG91dHB1dF9idWZmZXJfcmVtYWluaW5nXyA9IGJ1ZmZlcl9zaXplOworICAgIGlnbm9yZV9ieXRlc18gPSBpZ25vcmVfYnl0ZXM7CiAKICAgICB1aW50OF90IGNodW5rW2tDaHVua1NpemVdOwotICAgIHdoaWxlIChzdHJlYW1fcmVtYWluaW5nXykgewotICAgICAgICBzaXplX3QgcmVhZCA9IHN0ZDo6bWluKHN0cmVhbV9yZW1haW5pbmdfLCBzaXplb2YoY2h1bmspKTsKLSAgICAgICAgaWYgKCFzdHJlYW1fLT5SZWFkKGNodW5rLCByZWFkLCAmcmVhZCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB3aGlsZSAoc3RyZWFtX3JlbWFpbmluZ18gJiYgb3V0cHV0X2J1ZmZlcl9yZW1haW5pbmdfICYmICFkZWNvbXByZXNzb3JfZW5kZWRfKSB7CisgICAgICAgIHNpemVfdCBtYXhfcmVhZCA9IHN0ZDo6bWluKHN0cmVhbV9yZW1haW5pbmdfLCBzaXplb2YoY2h1bmspKTsKKyAgICAgICAgc3NpemVfdCByZWFkID0gc3RyZWFtXy0+UmVhZChjaHVuaywgbWF4X3JlYWQpOworICAgICAgICBpZiAocmVhZCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogICAgICAgICBpZiAoIXJlYWQpIHsKICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlN0cmVhbSBlbmRlZCBwcmVtYXR1cmVseSI7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFEZWNvbXByZXNzSW5wdXQoY2h1bmssIHJlYWQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghUGFydGlhbERlY29tcHJlc3MoY2h1bmssIHJlYWQpKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KLQogICAgICAgICBzdHJlYW1fcmVtYWluaW5nXyAtPSByZWFkOworICAgIH0KIAotICAgICAgICBpZiAoc3RyZWFtX3JlbWFpbmluZ18gJiYgRG9uZSgpKSB7CisgICAgaWYgKHN0cmVhbV9yZW1haW5pbmdfKSB7CisgICAgICAgIGlmIChkZWNvbXByZXNzb3JfZW5kZWRfICYmICFPdXRwdXRGdWxsKCkpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgbW9yZSBpbnB1dCBpbiB0aGUgc3RyZWFtLCBidXQgd2UgaGF2ZW4ndCBmaW5pc2hlZAorICAgICAgICAgICAgLy8gY29uc3VtaW5nIGlnbm9yZWQgYnl0ZXMgb3IgYXZhaWxhYmxlIG91dHB1dCBzcGFjZSB5ZXQsIHRoZW4KKyAgICAgICAgICAgIC8vIHNvbWV0aGluZyB3ZWlyZCBoYXBwZW5lZC4gUmVwb3J0IGl0IGFuZCBmYWlsLgogICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRGVjb21wcmVzc29yIHRlcm1pbmF0ZWQgZWFybHkiOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFkZWNvbXByZXNzb3JfZW5kZWRfICYmICFPdXRwdXRGdWxsKCkpIHsKKyAgICAgICAgICAgIC8vIFRoZSBzdHJlYW0gZW5kZWQsIGJ1dCB0aGUgZGVjb2RlciBkb2Vzbid0IHRoaW5rIHNvLCBhbmQgdGhlcmUgYXJlCisgICAgICAgICAgICAvLyBtb3JlIGJ5dGVzIGluIHRoZSBvdXRwdXQgYnVmZmVyLgorICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRGVjb21wcmVzc29yIGV4cGVjdGVkIG1vcmUgYnl0ZXMiOworICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAgICAgfQotICAgIGlmICghRG9uZSgpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkRlY29tcHJlc3NvciBleHBlY3RlZCBtb3JlIGJ5dGVzIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBTdHJlYW1EZWNvbXByZXNzb3I6OkdldEZyZXNoQnVmZmVyKCkgewotICAgIHNpemVfdCByZXF1ZXN0X3NpemUgPSBzdGQ6Om1pbihvdXRwdXRfYnl0ZXNfLCBrQ2h1bmtTaXplKTsKLSAgICBvdXRwdXRfYnVmZmVyXyA9Ci0gICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihzaW5rXy0+R2V0QnVmZmVyKHJlcXVlc3Rfc2l6ZSwgJm91dHB1dF9idWZmZXJfcmVtYWluaW5nXykpOwotICAgIGlmICghb3V0cHV0X2J1ZmZlcl8pIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IGFjcXVpcmUgYnVmZmVyIGZyb20gc2luayI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGJ1ZmZlcl9zaXplIC0gb3V0cHV0X2J1ZmZlcl9yZW1haW5pbmdfOwogfQogCiBjbGFzcyBHekRlY29tcHJlc3NvciBmaW5hbCA6IHB1YmxpYyBTdHJlYW1EZWNvbXByZXNzb3IgewpAQCAtMTQxLDEyICsxNDIsMTAgQEAKICAgICB+R3pEZWNvbXByZXNzb3IoKTsKIAogICAgIGJvb2wgSW5pdCgpIG92ZXJyaWRlOwotICAgIGJvb2wgRGVjb21wcmVzc0lucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW5ndGgpIG92ZXJyaWRlOwotICAgIGJvb2wgRG9uZSgpIG92ZXJyaWRlIHsgcmV0dXJuIGVuZGVkXzsgfQorICAgIGJvb2wgUGFydGlhbERlY29tcHJlc3MoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbmd0aCkgb3ZlcnJpZGU7CiAKICAgcHJpdmF0ZToKICAgICB6X3N0cmVhbSB6XyA9IHt9OwotICAgIGJvb2wgZW5kZWRfID0gZmFsc2U7CiB9OwogCiBib29sIEd6RGVjb21wcmVzc29yOjpJbml0KCkgewpAQCAtMTYxLDIzICsxNjAsMzkgQEAKICAgICBpbmZsYXRlRW5kKCZ6Xyk7CiB9CiAKLWJvb2wgR3pEZWNvbXByZXNzb3I6OkRlY29tcHJlc3NJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuZ3RoKSB7Citib29sIEd6RGVjb21wcmVzc29yOjpQYXJ0aWFsRGVjb21wcmVzcyhjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuZ3RoKSB7CiAgICAgel8ubmV4dF9pbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Qnl0ZWYqPihjb25zdF9jYXN0PHVpbnQ4X3QqPihkYXRhKSk7CiAgICAgel8uYXZhaWxfaW4gPSBsZW5ndGg7CiAKLSAgICB3aGlsZSAoel8uYXZhaWxfaW4pIHsKLSAgICAgICAgLy8gSWYgbm8gbW9yZSBvdXRwdXQgYnVmZmVyLCBncmFiIGEgbmV3IGJ1ZmZlci4KLSAgICAgICAgaWYgKHpfLmF2YWlsX291dCA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAoIUdldEZyZXNoQnVmZmVyKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB6Xy5uZXh0X291dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Qnl0ZWYqPihvdXRwdXRfYnVmZmVyXyk7Ci0gICAgICAgICAgICB6Xy5hdmFpbF9vdXQgPSBvdXRwdXRfYnVmZmVyX3JlbWFpbmluZ187CisgICAgLy8gSWYgd2UncmUgYXNrZWQgdG8gaWdub3JlIHN0YXJ0aW5nIGJ5dGVzLCB3ZSBzaW5rIHRob3NlIGludG8gdGhlIG91dHB1dAorICAgIC8vIHJlcGVhdGVkbHkgdW50aWwgdGhlcmUgaXMgbm90aGluZyBsZWZ0IHRvIGlnbm9yZS4KKyAgICB3aGlsZSAoaWdub3JlX2J5dGVzXyAmJiB6Xy5hdmFpbF9pbikgeworICAgICAgICBzdGQ6OmFycmF5PEJ5dGVmLCBrQ2h1bmtTaXplPiBpZ25vcmVfYnVmZmVyOworICAgICAgICBzaXplX3QgbWF4X2lnbm9yZSA9IHN0ZDo6bWluKGlnbm9yZV9ieXRlc18sIGlnbm9yZV9idWZmZXIuc2l6ZSgpKTsKKyAgICAgICAgel8ubmV4dF9vdXQgPSBpZ25vcmVfYnVmZmVyLmRhdGEoKTsKKyAgICAgICAgel8uYXZhaWxfb3V0ID0gbWF4X2lnbm9yZTsKKworICAgICAgICBpbnQgcnYgPSBpbmZsYXRlKCZ6XywgWl9OT19GTFVTSCk7CisgICAgICAgIGlmIChydiAhPSBaX09LICYmIHJ2ICE9IFpfU1RSRUFNX0VORCkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiaW5mbGF0ZSByZXR1cm5lZCBlcnJvciBjb2RlICIgPDwgcnY7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBSZW1lbWJlciB0aGUgcG9zaXRpb24gb2YgdGhlIG91dHB1dCBidWZmZXIgc28gd2UgY2FuIGNhbGwgUmV0dXJuRGF0YS4KLSAgICAgICAgYXV0byBhdmFpbF9vdXQgPSB6Xy5hdmFpbF9vdXQ7CisgICAgICAgIHNpemVfdCByZXR1cm5lZCA9IG1heF9pZ25vcmUgLSB6Xy5hdmFpbF9vdXQ7CisgICAgICAgIENIRUNLX0xFKHJldHVybmVkLCBpZ25vcmVfYnl0ZXNfKTsKIAorICAgICAgICBpZ25vcmVfYnl0ZXNfIC09IHJldHVybmVkOworCisgICAgICAgIGlmIChydiA9PSBaX1NUUkVBTV9FTkQpIHsKKyAgICAgICAgICAgIGRlY29tcHJlc3Nvcl9lbmRlZF8gPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB6Xy5uZXh0X291dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Qnl0ZWYqPihvdXRwdXRfYnVmZmVyXyk7CisgICAgel8uYXZhaWxfb3V0ID0gb3V0cHV0X2J1ZmZlcl9yZW1haW5pbmdfOworCisgICAgd2hpbGUgKHpfLmF2YWlsX2luICYmIHpfLmF2YWlsX291dCkgewogICAgICAgICAvLyBEZWNvbXByZXNzLgogICAgICAgICBpbnQgcnYgPSBpbmZsYXRlKCZ6XywgWl9OT19GTFVTSCk7CiAgICAgICAgIGlmIChydiAhPSBaX09LICYmIHJ2ICE9IFpfU1RSRUFNX0VORCkgewpAQCAtMTg1LDM3ICsyMDAsMjYgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCi0gICAgICAgIHNpemVfdCByZXR1cm5lZCA9IGF2YWlsX291dCAtIHpfLmF2YWlsX291dDsKLSAgICAgICAgaWYgKCFzaW5rXy0+UmV0dXJuRGF0YShvdXRwdXRfYnVmZmVyXywgcmV0dXJuZWQpKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgcmV0dXJuIGJ1ZmZlciB0byBzaW5rIjsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQorICAgICAgICBzaXplX3QgcmV0dXJuZWQgPSBvdXRwdXRfYnVmZmVyX3JlbWFpbmluZ18gLSB6Xy5hdmFpbF9vdXQ7CisgICAgICAgIENIRUNLX0xFKHJldHVybmVkLCBvdXRwdXRfYnVmZmVyX3JlbWFpbmluZ18pOworCiAgICAgICAgIG91dHB1dF9idWZmZXJfICs9IHJldHVybmVkOwogICAgICAgICBvdXRwdXRfYnVmZmVyX3JlbWFpbmluZ18gLT0gcmV0dXJuZWQ7CiAKICAgICAgICAgaWYgKHJ2ID09IFpfU1RSRUFNX0VORCkgewotICAgICAgICAgICAgaWYgKHpfLmF2YWlsX2luKSB7Ci0gICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiR3ogc3RyZWFtIGVuZGVkIHByZW1hdHVyZWx5IjsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbmRlZF8gPSB0cnVlOworICAgICAgICAgICAgZGVjb21wcmVzc29yX2VuZGVkXyA9IHRydWU7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotc3RkOjp1bmlxdWVfcHRyPElEZWNvbXByZXNzb3I+IElEZWNvbXByZXNzb3I6Okd6KCkgewotICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8SURlY29tcHJlc3Nvcj4obmV3IEd6RGVjb21wcmVzc29yKCkpOwotfQotCiBjbGFzcyBCcm90bGlEZWNvbXByZXNzb3IgZmluYWwgOiBwdWJsaWMgU3RyZWFtRGVjb21wcmVzc29yIHsKICAgcHVibGljOgogICAgIH5Ccm90bGlEZWNvbXByZXNzb3IoKTsKIAogICAgIGJvb2wgSW5pdCgpIG92ZXJyaWRlOwotICAgIGJvb2wgRGVjb21wcmVzc0lucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW5ndGgpIG92ZXJyaWRlOwotICAgIGJvb2wgRG9uZSgpIG92ZXJyaWRlIHsgcmV0dXJuIEJyb3RsaURlY29kZXJJc0ZpbmlzaGVkKGRlY29kZXJfKTsgfQorICAgIGJvb2wgUGFydGlhbERlY29tcHJlc3MoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbmd0aCkgb3ZlcnJpZGU7CiAKICAgcHJpdmF0ZToKICAgICBCcm90bGlEZWNvZGVyU3RhdGUqIGRlY29kZXJfID0gbnVsbHB0cjsKQEAgLTIzMiw4NCArMjM2LDE2MiBAQAogICAgIH0KIH0KIAotYm9vbCBCcm90bGlEZWNvbXByZXNzb3I6OkRlY29tcHJlc3NJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuZ3RoKSB7Citib29sIEJyb3RsaURlY29tcHJlc3Nvcjo6UGFydGlhbERlY29tcHJlc3MoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbmd0aCkgewogICAgIHNpemVfdCBhdmFpbGFibGVfaW4gPSBsZW5ndGg7CiAgICAgY29uc3QgdWludDhfdCogbmV4dF9pbiA9IGRhdGE7CiAKLSAgICBib29sIG5lZWRzX21vcmVfb3V0cHV0ID0gZmFsc2U7Ci0gICAgd2hpbGUgKGF2YWlsYWJsZV9pbiB8fCBuZWVkc19tb3JlX291dHB1dCkgewotICAgICAgICBpZiAoIW91dHB1dF9idWZmZXJfcmVtYWluaW5nXyAmJiAhR2V0RnJlc2hCdWZmZXIoKSkgeworICAgIHdoaWxlIChhdmFpbGFibGVfaW4gJiYgaWdub3JlX2J5dGVzXyAmJiAhQnJvdGxpRGVjb2RlcklzRmluaXNoZWQoZGVjb2Rlcl8pKSB7CisgICAgICAgIHN0ZDo6YXJyYXk8dWludDhfdCwga0NodW5rU2l6ZT4gaWdub3JlX2J1ZmZlcjsKKyAgICAgICAgc2l6ZV90IG1heF9pZ25vcmUgPSBzdGQ6Om1pbihpZ25vcmVfYnl0ZXNfLCBpZ25vcmVfYnVmZmVyLnNpemUoKSk7CisgICAgICAgIHNpemVfdCBpZ25vcmVfc2l6ZSA9IG1heF9pZ25vcmU7CisKKyAgICAgICAgdWludDhfdCogaWdub3JlX2J1ZmZlcl9wdHIgPSBpZ25vcmVfYnVmZmVyLmRhdGEoKTsKKyAgICAgICAgYXV0byByID0gQnJvdGxpRGVjb2RlckRlY29tcHJlc3NTdHJlYW0oZGVjb2Rlcl8sICZhdmFpbGFibGVfaW4sICZuZXh0X2luLCAmaWdub3JlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZ25vcmVfYnVmZmVyX3B0ciwgbnVsbHB0cik7CisgICAgICAgIGlmIChyID09IEJST1RMSV9ERUNPREVSX1JFU1VMVF9FUlJPUikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiYnJvdGxpIGRlY29kZSBmYWlsZWQiOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKHIgPT0gQlJPVExJX0RFQ09ERVJfUkVTVUxUX05FRURTX01PUkVfSU5QVVQgJiYgYXZhaWxhYmxlX2luKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJicm90bGkgdW5leHBlY3RlZCBuZWVkcyBtb3JlIGlucHV0IjsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQorICAgICAgICBpZ25vcmVfYnl0ZXNfIC09IG1heF9pZ25vcmUgLSBpZ25vcmVfc2l6ZTsKKyAgICB9CiAKLSAgICAgICAgYXV0byBvdXRwdXRfYnVmZmVyID0gb3V0cHV0X2J1ZmZlcl87CisgICAgd2hpbGUgKGF2YWlsYWJsZV9pbiAmJiAhQnJvdGxpRGVjb2RlcklzRmluaXNoZWQoZGVjb2Rlcl8pKSB7CiAgICAgICAgIGF1dG8gciA9IEJyb3RsaURlY29kZXJEZWNvbXByZXNzU3RyZWFtKGRlY29kZXJfLCAmYXZhaWxhYmxlX2luLCAmbmV4dF9pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dF9idWZmZXJfcmVtYWluaW5nXywgJm91dHB1dF9idWZmZXJfLCBudWxscHRyKTsKICAgICAgICAgaWYgKHIgPT0gQlJPVExJX0RFQ09ERVJfUkVTVUxUX0VSUk9SKSB7CiAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJicm90bGkgZGVjb2RlIGZhaWxlZCI7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFzaW5rXy0+UmV0dXJuRGF0YShvdXRwdXRfYnVmZmVyLCBvdXRwdXRfYnVmZmVyXyAtIG91dHB1dF9idWZmZXIpKSB7CisgICAgICAgIH0gZWxzZSBpZiAociA9PSBCUk9UTElfREVDT0RFUl9SRVNVTFRfTkVFRFNfTU9SRV9JTlBVVCAmJiBhdmFpbGFibGVfaW4pIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgImJyb3RsaSB1bmV4cGVjdGVkIG5lZWRzIG1vcmUgaW5wdXQiOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIG5lZWRzX21vcmVfb3V0cHV0ID0gKHIgPT0gQlJPVExJX0RFQ09ERVJfUkVTVUxUX05FRURTX01PUkVfT1VUUFVUKTsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19CiAKLXN0ZDo6dW5pcXVlX3B0cjxJRGVjb21wcmVzc29yPiBJRGVjb21wcmVzc29yOjpCcm90bGkoKSB7Ci0gICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxJRGVjb21wcmVzc29yPihuZXcgQnJvdGxpRGVjb21wcmVzc29yKCkpOworICAgIGRlY29tcHJlc3Nvcl9lbmRlZF8gPSBCcm90bGlEZWNvZGVySXNGaW5pc2hlZChkZWNvZGVyXyk7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIGNsYXNzIEx6NERlY29tcHJlc3NvciBmaW5hbCA6IHB1YmxpYyBJRGVjb21wcmVzc29yIHsKICAgcHVibGljOgogICAgIH5MejREZWNvbXByZXNzb3IoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CiAKLSAgICBib29sIERlY29tcHJlc3MoY29uc3Qgc2l6ZV90IG91dHB1dF9zaXplKSBvdmVycmlkZSB7Ci0gICAgICAgIHNpemVfdCBhY3R1YWxfYnVmZmVyX3NpemUgPSAwOwotICAgICAgICBhdXRvJiYgb3V0cHV0X2J1ZmZlciA9IHNpbmtfLT5HZXRCdWZmZXIob3V0cHV0X3NpemUsICZhY3R1YWxfYnVmZmVyX3NpemUpOwotICAgICAgICBpZiAoYWN0dWFsX2J1ZmZlcl9zaXplICE9IG91dHB1dF9zaXplKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIG9mIHNpemUgIiA8PCBvdXRwdXRfc2l6ZSA8PCAiIG9ubHkgZ290ICIKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgYWN0dWFsX2J1ZmZlcl9zaXplIDw8ICIgYnl0ZXMiOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHNzaXplX3QgRGVjb21wcmVzcyh2b2lkKiBidWZmZXIsIHNpemVfdCBidWZmZXJfc2l6ZSwgc2l6ZV90IGRlY29tcHJlc3NlZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaWdub3JlX2J5dGVzKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGlucHV0X2J1ZmZlcihzdHJlYW1fLT5TaXplKCksICdcMCcpOworICAgICAgICBzc2l6ZV90IHN0cmVhbWVkX2luID0gc3RyZWFtXy0+UmVhZEZ1bGx5KGlucHV0X2J1ZmZlci5kYXRhKCksIGlucHV0X2J1ZmZlci5zaXplKCkpOworICAgICAgICBpZiAoc3RyZWFtZWRfaW4gPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KLSAgICAgICAgLy8gSWYgaW5wdXQgc2l6ZSBpcyBzYW1lIGFzIG91dHB1dCBzaXplLCB0aGVuIGlucHV0IGlzIHVuY29tcHJlc3NlZC4KLSAgICAgICAgaWYgKHN0cmVhbV8tPlNpemUoKSA9PSBvdXRwdXRfc2l6ZSkgewotICAgICAgICAgICAgc2l6ZV90IGJ5dGVzX3JlYWQgPSAwOwotICAgICAgICAgICAgc3RyZWFtXy0+UmVhZChvdXRwdXRfYnVmZmVyLCBvdXRwdXRfc2l6ZSwgJmJ5dGVzX3JlYWQpOwotICAgICAgICAgICAgaWYgKGJ5dGVzX3JlYWQgIT0gb3V0cHV0X3NpemUpIHsKLSAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcmVhZCBhbGwgaW5wdXQgYXQgb25jZS4gRXhwZWN0ZWQ6ICIgPDwgb3V0cHV0X3NpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgYWN0dWFsOiAiIDw8IGJ5dGVzX3JlYWQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBDSEVDS19FUShzdHJlYW1lZF9pbiwgc3RyZWFtXy0+U2l6ZSgpKTsKKworICAgICAgICBjaGFyKiBkZWNvZGVfYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYnVmZmVyKTsKKyAgICAgICAgc2l6ZV90IGRlY29kZV9idWZmZXJfc2l6ZSA9IGJ1ZmZlcl9zaXplOworCisgICAgICAgIC8vIEl0J3MgdW5jbGVhciBpZiBMWjQgY2FuIGV4YWN0bHkgc2F0aXNmeSBhIHBhcnRpYWwgZGVjb2RlIHJlcXVlc3QsIHNvCisgICAgICAgIC8vIGlmIHdlIGdldCBvbmUsIGNyZWF0ZSBhIHRlbXBvcmFyeSBidWZmZXIuCisgICAgICAgIHN0ZDo6c3RyaW5nIHRlbXA7CisgICAgICAgIGlmIChidWZmZXJfc2l6ZSA8IGRlY29tcHJlc3NlZF9zaXplKSB7CisgICAgICAgICAgICB0ZW1wLnJlc2l6ZShkZWNvbXByZXNzZWRfc2l6ZSwgJ1wwJyk7CisgICAgICAgICAgICBkZWNvZGVfYnVmZmVyID0gdGVtcC5kYXRhKCk7CisgICAgICAgICAgICBkZWNvZGVfYnVmZmVyX3NpemUgPSB0ZW1wLnNpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IGludCBieXRlc19kZWNvbXByZXNzZWQgPSBMWjRfZGVjb21wcmVzc19zYWZlKGlucHV0X2J1ZmZlci5kYXRhKCksIGRlY29kZV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2J1ZmZlci5zaXplKCksIGRlY29kZV9idWZmZXJfc2l6ZSk7CisgICAgICAgIGlmIChieXRlc19kZWNvbXByZXNzZWQgPCAwKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZGVjb21wcmVzcyBMWjQgYmxvY2ssIGNvZGU6ICIgPDwgYnl0ZXNfZGVjb21wcmVzc2VkOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChieXRlc19kZWNvbXByZXNzZWQgIT0gZGVjb21wcmVzc2VkX3NpemUpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBkZWNvbXByZXNzIExaNCBibG9jaywgZXhwZWN0ZWQgb3V0cHV0IHNpemU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgYnl0ZXNfZGVjb21wcmVzc2VkIDw8ICIsIGFjdHVhbDogIiA8PCBieXRlc19kZWNvbXByZXNzZWQ7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgQ0hFQ0tfTEUoYnl0ZXNfZGVjb21wcmVzc2VkLCBkZWNvZGVfYnVmZmVyX3NpemUpOworCisgICAgICAgIGlmIChpZ25vcmVfYnl0ZXMgPiBieXRlc19kZWNvbXByZXNzZWQpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIklnbm9yaW5nIG1vcmUgYnl0ZXMgdGhhbiBleGlzdCBpbiBzdHJlYW0gKGlnbm9yaW5nICIgPDwgaWdub3JlX2J5dGVzCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGdvdCAiIDw8IGJ5dGVzX2RlY29tcHJlc3NlZCA8PCAiKSI7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGVtcC5lbXB0eSgpKSB7CisgICAgICAgICAgICAvLyBMWjQncyBBUEkgaGFzIG5vIHdheSB0byBzaW5rIG91dCB0aGUgZmlyc3QgTiBieXRlcyBvZiBkZWNvZGluZywKKyAgICAgICAgICAgIC8vIHNvIHdlIHJlYWQgdGhlbSBhbGwgaW4gYW5kIG1lbW1vdmUoKSB0byBkcm9wIHRoZSBwYXJ0aWFsIHJlYWQuCisgICAgICAgICAgICBpZiAoaWdub3JlX2J5dGVzKSB7CisgICAgICAgICAgICAgICAgbWVtbW92ZShkZWNvZGVfYnVmZmVyLCBkZWNvZGVfYnVmZmVyICsgaWdub3JlX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfZGVjb21wcmVzc2VkIC0gaWdub3JlX2J5dGVzKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNpbmtfLT5SZXR1cm5EYXRhKG91dHB1dF9idWZmZXIsIG91dHB1dF9zaXplKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIGJ5dGVzX2RlY29tcHJlc3NlZCAtIGlnbm9yZV9ieXRlczsKICAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBtYXhfY29weSA9IHN0ZDo6bWluKGJ5dGVzX2RlY29tcHJlc3NlZCAtIGlnbm9yZV9ieXRlcywgYnVmZmVyX3NpemUpOworICAgICAgICBtZW1jcHkoYnVmZmVyLCB0ZW1wLmRhdGEoKSArIGlnbm9yZV9ieXRlcywgbWF4X2NvcHkpOworICAgICAgICByZXR1cm4gbWF4X2NvcHk7CisgICAgfQorfTsKKworY2xhc3MgWnN0ZERlY29tcHJlc3NvciBmaW5hbCA6IHB1YmxpYyBJRGVjb21wcmVzc29yIHsKKyAgcHVibGljOgorICAgIHNzaXplX3QgRGVjb21wcmVzcyh2b2lkKiBidWZmZXIsIHNpemVfdCBidWZmZXJfc2l6ZSwgc2l6ZV90IGRlY29tcHJlc3NlZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaWdub3JlX2J5dGVzID0gMCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAoYnVmZmVyX3NpemUgPCBkZWNvbXByZXNzZWRfc2l6ZSAtIGlnbm9yZV9ieXRlcykgeworICAgICAgICAgICAgTE9HKElORk8pIDw8ICJidWZmZXIgc2l6ZSAiIDw8IGJ1ZmZlcl9zaXplCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiBpcyBub3QgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgZGVjb21wcmVzc2VkIGRhdGEuIERlY29tcHJlc3NlZCBzaXplICIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBkZWNvbXByZXNzZWRfc2l6ZSA8PCAiLCBpZ25vcmVfYnl0ZXMgIiA8PCBpZ25vcmVfYnl0ZXM7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlnbm9yZV9ieXRlcyA9PSAwKSB7CisgICAgICAgICAgICBpZiAoIURlY29tcHJlc3MoYnVmZmVyLCBkZWNvbXByZXNzZWRfc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZGVjb21wcmVzc2VkX3NpemU7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4gaWdub3JlX2J1ZihkZWNvbXByZXNzZWRfc2l6ZSk7CisgICAgICAgIGlmICghRGVjb21wcmVzcyhpZ25vcmVfYnVmLmRhdGEoKSwgZGVjb21wcmVzc2VkX3NpemUpKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGJ1ZmZlciwgaWdub3JlX2J1Zi5kYXRhKCkgKyBpZ25vcmVfYnl0ZXMsIGJ1ZmZlcl9zaXplKTsKKyAgICAgICAgcmV0dXJuIGRlY29tcHJlc3NlZF9zaXplOworICAgIH0KKyAgICBib29sIERlY29tcHJlc3Modm9pZCogb3V0cHV0X2J1ZmZlciwgY29uc3Qgc2l6ZV90IG91dHB1dF9zaXplKSB7CiAgICAgICAgIHN0ZDo6c3RyaW5nIGlucHV0X2J1ZmZlcjsKICAgICAgICAgaW5wdXRfYnVmZmVyLnJlc2l6ZShzdHJlYW1fLT5TaXplKCkpOwotICAgICAgICBzaXplX3QgYnl0ZXNfcmVhZCA9IDA7Ci0gICAgICAgIHN0cmVhbV8tPlJlYWQoaW5wdXRfYnVmZmVyLmRhdGEoKSwgaW5wdXRfYnVmZmVyLnNpemUoKSwgJmJ5dGVzX3JlYWQpOworICAgICAgICBzaXplX3QgYnl0ZXNfcmVhZCA9IHN0cmVhbV8tPlJlYWQoaW5wdXRfYnVmZmVyLmRhdGEoKSwgaW5wdXRfYnVmZmVyLnNpemUoKSk7CiAgICAgICAgIGlmIChieXRlc19yZWFkICE9IGlucHV0X2J1ZmZlci5zaXplKCkpIHsKICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byByZWFkIGFsbCBpbnB1dCBhdCBvbmNlLiBFeHBlY3RlZDogIiA8PCBpbnB1dF9idWZmZXIuc2l6ZSgpCiAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgYWN0dWFsOiAiIDw8IGJ5dGVzX3JlYWQ7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgY29uc3QgaW50IGJ5dGVzX2RlY29tcHJlc3NlZCA9Ci0gICAgICAgICAgICAgICAgTFo0X2RlY29tcHJlc3Nfc2FmZShpbnB1dF9idWZmZXIuZGF0YSgpLCBzdGF0aWNfY2FzdDxjaGFyKj4ob3V0cHV0X2J1ZmZlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9idWZmZXIuc2l6ZSgpLCBvdXRwdXRfc2l6ZSk7CisgICAgICAgIGNvbnN0IGF1dG8gYnl0ZXNfZGVjb21wcmVzc2VkID0gWlNURF9kZWNvbXByZXNzKG91dHB1dF9idWZmZXIsIG91dHB1dF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9idWZmZXIuZGF0YSgpLCBpbnB1dF9idWZmZXIuc2l6ZSgpKTsKICAgICAgICAgaWYgKGJ5dGVzX2RlY29tcHJlc3NlZCAhPSBvdXRwdXRfc2l6ZSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGRlY29tcHJlc3MgTFo0IGJsb2NrLCBleHBlY3RlZCBvdXRwdXQgc2l6ZTogIiA8PCBvdXRwdXRfc2l6ZQorICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGRlY29tcHJlc3MgWlNURCBibG9jaywgZXhwZWN0ZWQgb3V0cHV0IHNpemU6ICIgPDwgb3V0cHV0X3NpemUKICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgYWN0dWFsOiAiIDw8IGJ5dGVzX2RlY29tcHJlc3NlZDsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBzaW5rXy0+UmV0dXJuRGF0YShvdXRwdXRfYnVmZmVyLCBvdXRwdXRfc2l6ZSk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIH07CiAKK3N0ZDo6dW5pcXVlX3B0cjxJRGVjb21wcmVzc29yPiBJRGVjb21wcmVzc29yOjpCcm90bGkoKSB7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8QnJvdGxpRGVjb21wcmVzc29yPigpOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8SURlY29tcHJlc3Nvcj4gSURlY29tcHJlc3Nvcjo6R3ooKSB7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8R3pEZWNvbXByZXNzb3I+KCk7Cit9CisKIHN0ZDo6dW5pcXVlX3B0cjxJRGVjb21wcmVzc29yPiBJRGVjb21wcmVzc29yOjpMejQoKSB7CiAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8THo0RGVjb21wcmVzc29yPigpOwogfQogCitzdGQ6OnVuaXF1ZV9wdHI8SURlY29tcHJlc3Nvcj4gSURlY29tcHJlc3Nvcjo6WnN0ZCgpIHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxac3RkRGVjb21wcmVzc29yPigpOworfQorCiB9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L2Nvd19kZWNvbXByZXNzLmggYi9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L2Nvd19kZWNvbXByZXNzLmgKaW5kZXggN2Y3NGVkYS4uNTJiM2Q3NiAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9jb3dfZGVjb21wcmVzcy5oCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvY293X2RlY29tcHJlc3MuaApAQCAtMjYsMTEgKzI2LDE2IEBACiAgICAgdmlydHVhbCB+SUJ5dGVTdHJlYW0oKSB7fQogCiAgICAgLy8gUmVhZCB1cCB0byB8bGVuZ3RofCBieXRlcywgc3RvcmluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgaW4gdGhlIG91dC0KLSAgICAvLyBwYXJhbWV0ZXIuIElmIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLCAwIGlzIHJldHVybmVkLgotICAgIHZpcnR1YWwgYm9vbCBSZWFkKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwgc2l6ZV90KiByZWFkKSA9IDA7CisgICAgLy8gcGFyYW1ldGVyLiBJZiB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZCwgMCBpcyByZXR1cm5lZC4gT24gZXJyb3IsCisgICAgLy8gLTEgaXMgcmV0dXJuZWQuIGVycm5vIGlzIE5PVCBzZXQuCisgICAgdmlydHVhbCBzc2l6ZV90IFJlYWQodm9pZCogYnVmZmVyLCBzaXplX3QgbGVuZ3RoKSA9IDA7CiAKICAgICAvLyBTaXplIG9mIHRoZSBzdHJlYW0uCiAgICAgdmlydHVhbCBzaXplX3QgU2l6ZSgpIGNvbnN0ID0gMDsKKworICAgIC8vIEhlbHBlciBmb3IgUmVhZCgpLiBSZWFkIHRoZSBlbnRpcmUgc3RyZWFtIGludG8gfGJ1ZmZlcnwsIHVwIHRvIHxsZW5ndGh8CisgICAgLy8gYnl0ZXMuCisgICAgc3NpemVfdCBSZWFkRnVsbHkodm9pZCogYnVmZmVyLCBzaXplX3QgbGVuZ3RoKTsKIH07CiAKIGNsYXNzIElEZWNvbXByZXNzb3IgewpAQCAtNDIsMTYgKzQ3LDI0IEBACiAgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxJRGVjb21wcmVzc29yPiBHeigpOwogICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8SURlY29tcHJlc3Nvcj4gQnJvdGxpKCk7CiAgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxJRGVjb21wcmVzc29yPiBMejQoKTsKKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPElEZWNvbXByZXNzb3I+IFpzdGQoKTsKIAotICAgIC8vIHxvdXRwdXRfYnl0ZXN8IGlzIHRoZSBleHBlY3RlZCB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgdG8gc2luay4KLSAgICB2aXJ0dWFsIGJvb2wgRGVjb21wcmVzcyhzaXplX3Qgb3V0cHV0X2J5dGVzKSA9IDA7CisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxJRGVjb21wcmVzc29yPiBGcm9tU3RyaW5nKHN0ZDo6c3RyaW5nX3ZpZXcgY29tcHJlc3Nvcik7CisKKyAgICAvLyBEZWNvbXByZXNzIGF0IG1vc3QgfGJ1ZmZlcl9zaXplfCBieXRlcywgaWdub3JpbmcgdGhlIGZpcnN0IHxpZ25vcmVfYnl0ZXN8CisgICAgLy8gb2YgdGhlIGRlY29kZWQgc3RyZWFtLiB8YnVmZmVyX3NpemV8IG11c3QgYmUgYXQgbGVhc3Qgb25lIGJ5dGUuCisgICAgLy8gfGRlY29tcHJlc3NlZF9zaXplfCBpcyB0aGUgZXhwZWN0ZWQgdG90YWwgc2l6ZSBpZiB0aGUgZW50aXJlIHN0cmVhbSB3ZXJlCisgICAgLy8gZGVjb21wcmVzc2VkLgorICAgIC8vCisgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gfGJ1ZmZlcnwsIG9yIC0xIG9uIGVycm9yLiBlcnJubworICAgIC8vIGlzIE5PVCBzZXQuCisgICAgdmlydHVhbCBzc2l6ZV90IERlY29tcHJlc3Modm9pZCogYnVmZmVyLCBzaXplX3QgYnVmZmVyX3NpemUsIHNpemVfdCBkZWNvbXByZXNzZWRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaWdub3JlX2J5dGVzID0gMCkgPSAwOwogCiAgICAgdm9pZCBzZXRfc3RyZWFtKElCeXRlU3RyZWFtKiBzdHJlYW0pIHsgc3RyZWFtXyA9IHN0cmVhbTsgfQotICAgIHZvaWQgc2V0X3NpbmsoSUJ5dGVTaW5rKiBzaW5rKSB7IHNpbmtfID0gc2luazsgfQogCiAgIHByb3RlY3RlZDoKICAgICBJQnl0ZVN0cmVhbSogc3RyZWFtXyA9IG51bGxwdHI7Ci0gICAgSUJ5dGVTaW5rKiBzaW5rXyA9IG51bGxwdHI7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvY293X2Zvcm1hdC5jcHAgYi9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L2Nvd19mb3JtYXQuY3BwCmluZGV4IDk0YzQxMDkuLjE5MDE0YzAgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvY293X2Zvcm1hdC5jcHAKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9jb3dfZm9ybWF0LmNwcApAQCAtMTksNTEgKzE5LDk3IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKyNpbmNsdWRlIDxsaWJzbmFwc2hvdC9jb3dfZm9ybWF0Lmg+CisjaW5jbHVkZSA8c3RvcmFnZV9saXRlcmFscy9zdG9yYWdlX2xpdGVyYWxzLmg+CisjaW5jbHVkZSAid3JpdGVyX3YyLmgiCisjaW5jbHVkZSAid3JpdGVyX3YzLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBzbmFwc2hvdCB7CiAKLXN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBDb3dPcGVyYXRpb24gY29uc3QmIG9wKSB7Ci0gICAgb3MgPDwgIkNvd09wZXJhdGlvbih0eXBlOiI7Ci0gICAgaWYgKG9wLnR5cGUgPT0ga0Nvd0NvcHlPcCkKLSAgICAgICAgb3MgPDwgImtDb3dDb3B5T3AsICAgICI7Ci0gICAgZWxzZSBpZiAob3AudHlwZSA9PSBrQ293UmVwbGFjZU9wKQotICAgICAgICBvcyA8PCAia0Nvd1JlcGxhY2VPcCwgIjsKLSAgICBlbHNlIGlmIChvcC50eXBlID09IGtDb3daZXJvT3ApCi0gICAgICAgIG9zIDw8ICJrWmVyb09wLCAgICAgICAiOwotICAgIGVsc2UgaWYgKG9wLnR5cGUgPT0ga0Nvd0Zvb3Rlck9wKQotICAgICAgICBvcyA8PCAia0Nvd0Zvb3Rlck9wLCAgIjsKLSAgICBlbHNlIGlmIChvcC50eXBlID09IGtDb3dMYWJlbE9wKQotICAgICAgICBvcyA8PCAia0Nvd0xhYmVsT3AsICAgIjsKLSAgICBlbHNlIGlmIChvcC50eXBlID09IGtDb3dDbHVzdGVyT3ApCi0gICAgICAgIG9zIDw8ICJrQ293Q2x1c3Rlck9wICAiOwotICAgIGVsc2UgaWYgKG9wLnR5cGUgPT0ga0Nvd1hvck9wKQotICAgICAgICBvcyA8PCAia0Nvd1hvck9wICAgICAgIjsKLSAgICBlbHNlIGlmIChvcC50eXBlID09IGtDb3dTZXF1ZW5jZU9wKQotICAgICAgICBvcyA8PCAia0Nvd1NlcXVlbmNlT3AgIjsKLSAgICBlbHNlIGlmIChvcC50eXBlID09IGtDb3dGb290ZXJPcCkKLSAgICAgICAgb3MgPDwgImtDb3dGb290ZXJPcCAgIjsKLSAgICBlbHNlCi0gICAgICAgIG9zIDw8IChpbnQpb3AudHlwZSA8PCAiPywiOwotICAgIG9zIDw8ICJjb21wcmVzc2lvbjoiOwotICAgIGlmIChvcC5jb21wcmVzc2lvbiA9PSBrQ293Q29tcHJlc3NOb25lKQotICAgICAgICBvcyA8PCAia0Nvd0NvbXByZXNzTm9uZSwgICAiOwotICAgIGVsc2UgaWYgKG9wLmNvbXByZXNzaW9uID09IGtDb3dDb21wcmVzc0d6KQotICAgICAgICBvcyA8PCAia0Nvd0NvbXByZXNzR3osICAgICAiOwotICAgIGVsc2UgaWYgKG9wLmNvbXByZXNzaW9uID09IGtDb3dDb21wcmVzc0Jyb3RsaSkKLSAgICAgICAgb3MgPDwgImtDb3dDb21wcmVzc0Jyb3RsaSwgIjsKLSAgICBlbHNlCi0gICAgICAgIG9zIDw8IChpbnQpb3AuY29tcHJlc3Npb24gPDwgIj8sICI7Ci0gICAgb3MgPDwgImRhdGFfbGVuZ3RoOiIgPDwgb3AuZGF0YV9sZW5ndGggPDwgIixcdCI7Ci0gICAgb3MgPDwgIm5ld19ibG9jazoiIDw8IG9wLm5ld19ibG9jayA8PCAiLFx0IjsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpzdG9yYWdlX2xpdGVyYWxzOworCitzdGQ6Om9zdHJlYW0mIEVtaXRDb3dUeXBlU3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3MsIENvd09wZXJhdGlvblR5cGUgY293X3R5cGUpIHsKKyAgICBzd2l0Y2ggKGNvd190eXBlKSB7CisgICAgICAgIGNhc2Uga0Nvd0NvcHlPcDoKKyAgICAgICAgICAgIHJldHVybiBvcyA8PCAia0Nvd0NvcHlPcCI7CisgICAgICAgIGNhc2Uga0Nvd1JlcGxhY2VPcDoKKyAgICAgICAgICAgIHJldHVybiBvcyA8PCAia0Nvd1JlcGxhY2VPcCI7CisgICAgICAgIGNhc2Uga0Nvd1plcm9PcDoKKyAgICAgICAgICAgIHJldHVybiBvcyA8PCAia1plcm9PcCI7CisgICAgICAgIGNhc2Uga0Nvd0Zvb3Rlck9wOgorICAgICAgICAgICAgcmV0dXJuIG9zIDw8ICJrQ293Rm9vdGVyT3AiOworICAgICAgICBjYXNlIGtDb3dMYWJlbE9wOgorICAgICAgICAgICAgcmV0dXJuIG9zIDw8ICJrQ293TGFiZWxPcCI7CisgICAgICAgIGNhc2Uga0Nvd0NsdXN0ZXJPcDoKKyAgICAgICAgICAgIHJldHVybiBvcyA8PCAia0Nvd0NsdXN0ZXJPcCI7CisgICAgICAgIGNhc2Uga0Nvd1hvck9wOgorICAgICAgICAgICAgcmV0dXJuIG9zIDw8ICJrQ293WG9yT3AiOworICAgICAgICBjYXNlIGtDb3dTZXF1ZW5jZU9wOgorICAgICAgICAgICAgcmV0dXJuIG9zIDw8ICJrQ293U2VxdWVuY2VPcCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gb3MgPDwgKGludCljb3dfdHlwZSA8PCAidW5rbm93biI7CisgICAgfQorfQorCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgQ293T3BlcmF0aW9uVHlwZSBjb3dfdHlwZSkgeworICAgIHJldHVybiBFbWl0Q293VHlwZVN0cmluZyhvcywgY293X3R5cGUpOworfQorCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgQ293T3BlcmF0aW9uVjIgY29uc3QmIG9wKSB7CisgICAgb3MgPDwgIkNvd09wZXJhdGlvblYyKCI7CisgICAgRW1pdENvd1R5cGVTdHJpbmcob3MsIG9wLnR5cGUpIDw8ICIsICI7CisgICAgc3dpdGNoIChvcC5jb21wcmVzc2lvbikgeworICAgICAgICBjYXNlIGtDb3dDb21wcmVzc05vbmU6CisgICAgICAgICAgICBvcyA8PCAidW5jb21wcmVzc2VkLCAiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga0Nvd0NvbXByZXNzR3o6CisgICAgICAgICAgICBvcyA8PCAiZ3osICI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrQ293Q29tcHJlc3NCcm90bGk6CisgICAgICAgICAgICBvcyA8PCAiYnJvdGxpLCAiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga0Nvd0NvbXByZXNzTHo0OgorICAgICAgICAgICAgb3MgPDwgImx6NCwgIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtDb3dDb21wcmVzc1pzdGQ6CisgICAgICAgICAgICBvcyA8PCAienN0ZCwgIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBvcyA8PCAiZGF0YV9sZW5ndGg6IiA8PCBvcC5kYXRhX2xlbmd0aCA8PCAiLCAiOworICAgIG9zIDw8ICJuZXdfYmxvY2s6IiA8PCBvcC5uZXdfYmxvY2sgPDwgIiwgIjsKICAgICBvcyA8PCAic291cmNlOiIgPDwgb3Auc291cmNlOwotICAgIGlmIChvcC50eXBlID09IGtDb3dYb3JPcCkKLSAgICAgICAgb3MgPDwgIiAoYmxvY2s6IiA8PCBvcC5zb3VyY2UgLyBCTE9DS19TWiA8PCAiIG9mZnNldDoiIDw8IG9wLnNvdXJjZSAlIEJMT0NLX1NaIDw8ICIpIjsKICAgICBvcyA8PCAiKSI7CiAgICAgcmV0dXJuIG9zOwogfQogCi1pbnQ2NF90IEdldE5leHRPcE9mZnNldChjb25zdCBDb3dPcGVyYXRpb24mIG9wLCB1aW50MzJfdCBjbHVzdGVyX29wcykgeworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIENvd09wZXJhdGlvblYzIGNvbnN0JiBvcCkgeworICAgIG9zIDw8ICJDb3dPcGVyYXRpb24oIjsKKyAgICBFbWl0Q293VHlwZVN0cmluZyhvcywgb3AudHlwZSgpKTsKKyAgICBpZiAob3AudHlwZSgpID09IGtDb3dSZXBsYWNlT3AgfHwgb3AudHlwZSgpID09IGtDb3dYb3JPcCB8fCBvcC50eXBlKCkgPT0ga0Nvd1NlcXVlbmNlT3ApIHsKKyAgICAgICAgb3MgPDwgIiwgZGF0YV9sZW5ndGg6IiA8PCBvcC5kYXRhX2xlbmd0aDsKKyAgICB9CisgICAgaWYgKG9wLnR5cGUoKSAhPSBrQ293Q2x1c3Rlck9wICYmIG9wLnR5cGUoKSAhPSBrQ293U2VxdWVuY2VPcCAmJiBvcC50eXBlKCkgIT0ga0Nvd0xhYmVsT3ApIHsKKyAgICAgICAgb3MgPDwgIiwgbmV3X2Jsb2NrOiIgPDwgb3AubmV3X2Jsb2NrOworICAgIH0KKyAgICBpZiAob3AudHlwZSgpID09IGtDb3dYb3JPcCB8fCBvcC50eXBlKCkgPT0ga0Nvd1JlcGxhY2VPcCB8fCBvcC50eXBlKCkgPT0ga0Nvd0NvcHlPcCkgeworICAgICAgICBvcyA8PCAiLCBzb3VyY2U6IiA8PCBvcC5zb3VyY2UoKTsKKyAgICB9IGVsc2UgaWYgKG9wLnR5cGUoKSA9PSBrQ293Q2x1c3Rlck9wKSB7CisgICAgICAgIG9zIDw8ICIsIGNsdXN0ZXJfZGF0YToiIDw8IG9wLnNvdXJjZSgpOworICAgIH0KKyAgICAvLyBWMyBvcCBzdG9yZXMgcmVzdW1lIHBvaW50cyBpbiBoZWFkZXIsIHNvIENvd09wIGNhbiBuZXZlciBiZSBMYWJlbC4KKyAgICBvcyA8PCAiKSI7CisgICAgcmV0dXJuIG9zOworfQorCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgUmVzdW1lUG9pbnQgY29uc3QmIHJlc3VtZV9wb2ludCkgeworICAgIG9zIDw8ICJSZXN1bWVQb2ludCgiIDw8IHJlc3VtZV9wb2ludC5sYWJlbCA8PCAiICwgIiA8PCByZXN1bWVfcG9pbnQub3BfaW5kZXggPDwgIikiOworICAgIHJldHVybiBvczsKK30KKworaW50NjRfdCBHZXROZXh0T3BPZmZzZXQoY29uc3QgQ293T3BlcmF0aW9uVjImIG9wLCB1aW50MzJfdCBjbHVzdGVyX29wcykgewogICAgIGlmIChvcC50eXBlID09IGtDb3dDbHVzdGVyT3ApIHsKICAgICAgICAgcmV0dXJuIG9wLnNvdXJjZTsKICAgICB9IGVsc2UgaWYgKChvcC50eXBlID09IGtDb3dSZXBsYWNlT3AgfHwgb3AudHlwZSA9PSBrQ293WG9yT3ApICYmIGNsdXN0ZXJfb3BzID09IDApIHsKQEAgLTczLDE4ICsxMTksMTggQEAKICAgICB9CiB9CiAKLWludDY0X3QgR2V0TmV4dERhdGFPZmZzZXQoY29uc3QgQ293T3BlcmF0aW9uJiBvcCwgdWludDMyX3QgY2x1c3Rlcl9vcHMpIHsKK2ludDY0X3QgR2V0TmV4dERhdGFPZmZzZXQoY29uc3QgQ293T3BlcmF0aW9uVjImIG9wLCB1aW50MzJfdCBjbHVzdGVyX29wcykgewogICAgIGlmIChvcC50eXBlID09IGtDb3dDbHVzdGVyT3ApIHsKLSAgICAgICAgcmV0dXJuIGNsdXN0ZXJfb3BzICogc2l6ZW9mKENvd09wZXJhdGlvbik7CisgICAgICAgIHJldHVybiBjbHVzdGVyX29wcyAqIHNpemVvZihDb3dPcGVyYXRpb25WMik7CiAgICAgfSBlbHNlIGlmIChjbHVzdGVyX29wcyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBzaXplb2YoQ293T3BlcmF0aW9uKTsKKyAgICAgICAgcmV0dXJuIHNpemVvZihDb3dPcGVyYXRpb25WMik7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogfQogCiBib29sIElzTWV0YWRhdGFPcChjb25zdCBDb3dPcGVyYXRpb24mIG9wKSB7Ci0gICAgc3dpdGNoIChvcC50eXBlKSB7CisgICAgc3dpdGNoIChvcC50eXBlKCkpIHsKICAgICAgICAgY2FzZSBrQ293TGFiZWxPcDoKICAgICAgICAgY2FzZSBrQ293Q2x1c3Rlck9wOgogICAgICAgICBjYXNlIGtDb3dGb290ZXJPcDoKQEAgLTk2LDcgKzE0Miw3IEBACiB9CiAKIGJvb2wgSXNPcmRlcmVkT3AoY29uc3QgQ293T3BlcmF0aW9uJiBvcCkgewotICAgIHN3aXRjaCAob3AudHlwZSkgeworICAgIHN3aXRjaCAob3AudHlwZSgpKSB7CiAgICAgICAgIGNhc2Uga0Nvd0NvcHlPcDoKICAgICAgICAgY2FzZSBrQ293WG9yT3A6CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTEwNSw1ICsxNTEsNjEgQEAKICAgICB9CiB9CiAKK3N0ZDo6dW5pcXVlX3B0cjxJQ293V3JpdGVyPiBDcmVhdGVDb3dXcml0ZXIodWludDMyX3QgdmVyc2lvbiwgY29uc3QgQ293T3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlX2ZkJiYgZmQsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGxhYmVsKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPENvd1dyaXRlckJhc2U+IGJhc2U7CisgICAgc3dpdGNoICh2ZXJzaW9uKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgYmFzZSA9IHN0ZDo6bWFrZV91bmlxdWU8Q293V3JpdGVyVjI+KG9wdGlvbnMsIHN0ZDo6bW92ZShmZCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGJhc2UgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1dyaXRlclYzPihvcHRpb25zLCBzdGQ6Om1vdmUoZmQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IGNyZWF0ZSB1bmtub3duIGNvdyB2ZXJzaW9uOiAiIDw8IHZlcnNpb247CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKCFiYXNlLT5Jbml0aWFsaXplKGxhYmVsKSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIGJhc2U7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxJQ293V3JpdGVyPiBDcmVhdGVDb3dFc3RpbWF0b3IodWludDMyX3QgdmVyc2lvbiwgY29uc3QgQ293T3B0aW9ucyYgb3B0aW9ucykgeworICAgIHJldHVybiBDcmVhdGVDb3dXcml0ZXIodmVyc2lvbiwgb3B0aW9ucywgdW5pcXVlX2Zkey0xfSwgc3RkOjpudWxsb3B0KTsKK30KKworc2l6ZV90IENvd09wQ29tcHJlc3Npb25TaXplKGNvbnN0IENvd09wZXJhdGlvbiogb3AsIHNpemVfdCBibG9ja19zaXplKSB7CisgICAgdWludDhfdCBjb21wcmVzc2lvbl9iaXRzID0gb3AtPmNvbXByZXNzaW9uX2JpdHMoKTsKKyAgICByZXR1cm4gKGJsb2NrX3NpemUgPDwgY29tcHJlc3Npb25fYml0cyk7Cit9CisKK2Jvb2wgR2V0QmxvY2tPZmZzZXQoY29uc3QgQ293T3BlcmF0aW9uKiBvcCwgdWludDY0X3QgaW9fYmxvY2ssIHNpemVfdCBibG9ja19zaXplLCBvZmZfdCogb2Zmc2V0KSB7CisgICAgY29uc3QgdWludDY0X3QgbmV3X2Jsb2NrID0gb3AtPm5ld19ibG9jazsKKworICAgIGlmIChvcC0+dHlwZSgpICE9IGtDb3dSZXBsYWNlT3AgfHwgaW9fYmxvY2sgPCBuZXdfYmxvY2spIHsKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJJbnZhbGlkIElPIHJlcXVlc3QgZm9yIGJsb2NrOiAiIDw8IGlvX2Jsb2NrCisgICAgICAgICAgICAgICAgICAgICA8PCAiIENvd09wZXJhdGlvbjogbmV3X2Jsb2NrOiAiIDw8IG5ld19ibG9jazsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIEdldCB0aGUgYWN0dWFsIGNvbXByZXNzaW9uIHNpemUKKyAgICBjb25zdCBzaXplX3QgY29tcHJlc3Npb25fc2l6ZSA9IENvd09wQ29tcHJlc3Npb25TaXplKG9wLCBibG9ja19zaXplKTsKKyAgICAvLyBGaW5kIHRoZSBudW1iZXIgb2YgYmxvY2tzIHNwYW5uZWQKKyAgICBjb25zdCBzaXplX3QgbnVtX2Jsb2NrcyA9IGNvbXByZXNzaW9uX3NpemUgLyBibG9ja19zaXplOworICAgIC8vIEZpbmQgdGhlIGRpc3RhbmNlIG9mIHRoZSBJL08gYmxvY2sgd2hpY2ggdGhpcworICAgIC8vIENvd09wZXJhdGlvbiBlbmNvbXBhc3NlcworICAgIGNvbnN0IHNpemVfdCBibG9ja19kaXN0YW5jZSA9IGlvX2Jsb2NrIC0gbmV3X2Jsb2NrOworICAgIC8vIENoZWNrIGlmIHRoaXMgYmxvY2sgaXMgd2l0aGluIHRoaXMgcmFuZ2U7CisgICAgLy8gaWYgc28sIHJldHVybiB0aGUgcmVsYXRpdmUgb2Zmc2V0CisgICAgaWYgKGJsb2NrX2Rpc3RhbmNlIDwgbnVtX2Jsb2NrcykgeworICAgICAgICAqb2Zmc2V0ID0gYmxvY2tfZGlzdGFuY2UgKiBibG9ja19zaXplOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvY293X3JlYWRlci5jcHAgYi9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L2Nvd19yZWFkZXIuY3BwCmluZGV4IDQ1YmUxOTEuLjY1MTY0OTkgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvY293X3JlYWRlci5jcHAKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9jb3dfcmVhZGVyLmNwcApAQCAtMTcsMjMgKzE3LDU2IEBACiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKLSNpbmNsdWRlIDxsaW1pdHM+CiAjaW5jbHVkZSA8b3B0aW9uYWw+Ci0jaW5jbHVkZSA8c2V0PgogI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CiAjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8bGlic25hcHNob3QvY293X2Zvcm1hdC5oPgogI2luY2x1ZGUgPGxpYnNuYXBzaG90L2Nvd19yZWFkZXIuaD4KKyNpbmNsdWRlIDxzdG9yYWdlX2xpdGVyYWxzL3N0b3JhZ2VfbGl0ZXJhbHMuaD4KICNpbmNsdWRlIDx6bGliLmg+CiAKICNpbmNsdWRlICJjb3dfZGVjb21wcmVzcy5oIgorI2luY2x1ZGUgInBhcnNlcl92Mi5oIgorI2luY2x1ZGUgInBhcnNlcl92My5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2Ugc25hcHNob3QgewogCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6c3RvcmFnZV9saXRlcmFsczsKKworYm9vbCBSZWFkQ293SGVhZGVyKGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIGZkLCBDb3dIZWFkZXJWMyogaGVhZGVyKSB7CisgICAgaWYgKGxzZWVrKGZkLmdldCgpLCAwLCBTRUVLX1NFVCkgPCAwKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJsc2VlayBoZWFkZXIgZmFpbGVkIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1lbXNldChoZWFkZXIsIDAsIHNpemVvZigqaGVhZGVyKSk7CisKKyAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseShmZCwgJmhlYWRlci0+cHJlZml4LCBzaXplb2YoaGVhZGVyLT5wcmVmaXgpKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChoZWFkZXItPnByZWZpeC5tYWdpYyAhPSBrQ293TWFnaWNOdW1iZXIpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSGVhZGVyIE1hZ2ljIGNvcnJ1cHRlZC4gTWFnaWM6ICIgPDwgaGVhZGVyLT5wcmVmaXgubWFnaWMKKyAgICAgICAgICAgICAgICAgICA8PCAiRXhwZWN0ZWQ6ICIgPDwga0Nvd01hZ2ljTnVtYmVyOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChoZWFkZXItPnByZWZpeC5oZWFkZXJfc2l6ZSA+IHNpemVvZihDb3dIZWFkZXJWMykpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5rbm93biBDb3dIZWFkZXIgc2l6ZSAoZ290ICIgPDwgaGVhZGVyLT5wcmVmaXguaGVhZGVyX3NpemUKKyAgICAgICAgICAgICAgICAgICA8PCAiIGJ5dGVzLCBleHBlY3RlZCBhdCBtb3N0ICIgPDwgc2l6ZW9mKENvd0hlYWRlclYzKSA8PCAiIGJ5dGVzKSI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobHNlZWsoZmQuZ2V0KCksIDAsIFNFRUtfU0VUKSA8IDApIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgImxzZWVrIGhlYWRlciBmYWlsZWQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHkoZmQsIGhlYWRlciwgaGVhZGVyLT5wcmVmaXguaGVhZGVyX3NpemUpOworfQorCiBDb3dSZWFkZXI6OkNvd1JlYWRlcihSZWFkZXJGbGFncyByZWFkZXJfZmxhZywgYm9vbCBpc19tZXJnZSkKICAgICA6IGZkXygtMSksCiAgICAgICBoZWFkZXJfKCksCkBAIC00MiwxNSArNzUsNiBAQAogICAgICAgcmVhZGVyX2ZsYWdfKHJlYWRlcl9mbGFnKSwKICAgICAgIGlzX21lcmdlXyhpc19tZXJnZSkge30KIAotc3RhdGljIHZvaWQgU0hBMjU2KGNvbnN0IHZvaWQqLCBzaXplX3QsIHVpbnQ4X3RbXSkgewotI2lmIDAKLSAgICBTSEEyNTZfQ1RYIGM7Ci0gICAgU0hBMjU2X0luaXQoJmMpOwotICAgIFNIQTI1Nl9VcGRhdGUoJmMsIGRhdGEsIGxlbmd0aCk7Ci0gICAgU0hBMjU2X0ZpbmFsKG91dCwgJmMpOwotI2VuZGlmCi19Ci0KIHN0ZDo6dW5pcXVlX3B0cjxDb3dSZWFkZXI+IENvd1JlYWRlcjo6Q2xvbmVDb3dSZWFkZXIoKSB7CiAgICAgYXV0byBjb3cgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1JlYWRlcj4oKTsKICAgICBjb3ctPm93bmVkX2ZkXy5yZXNldCgpOwpAQCAtNjIsOCArODYsNyBAQAogICAgIGNvdy0+bWVyZ2Vfb3Bfc3RhcnRfID0gbWVyZ2Vfb3Bfc3RhcnRfOwogICAgIGNvdy0+bnVtX3RvdGFsX2RhdGFfb3BzXyA9IG51bV90b3RhbF9kYXRhX29wc187CiAgICAgY293LT5udW1fb3JkZXJlZF9vcHNfdG9fbWVyZ2VfID0gbnVtX29yZGVyZWRfb3BzX3RvX21lcmdlXzsKLSAgICBjb3ctPmhhc19zZXFfb3BzXyA9IGhhc19zZXFfb3BzXzsKLSAgICBjb3ctPmRhdGFfbG9jXyA9IGRhdGFfbG9jXzsKKyAgICBjb3ctPnhvcl9kYXRhX2xvY18gPSB4b3JfZGF0YV9sb2NfOwogICAgIGNvdy0+YmxvY2tfcG9zX2luZGV4XyA9IGJsb2NrX3Bvc19pbmRleF87CiAgICAgY293LT5pc19tZXJnZV8gPSBpc19tZXJnZV87CiAgICAgcmV0dXJuIGNvdzsKQEAgLTg0LDExICsxMDcsMTQgQEAKICAgICAgICAgUExPRyhFUlJPUikgPDwgImxzZWVrIGhlYWRlciBmYWlsZWQiOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhZEZ1bGx5KGZkXywgJmhlYWRlcl8sIHNpemVvZihoZWFkZXJfKSkpIHsKKworICAgIENIRUNLX0dFKGhlYWRlcl8ucHJlZml4LmhlYWRlcl9zaXplLCBzaXplb2YoQ293SGVhZGVyKSk7CisgICAgQ0hFQ0tfTEUoaGVhZGVyXy5wcmVmaXguaGVhZGVyX3NpemUsIHNpemVvZihoZWFkZXJfKSk7CisKKyAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseShmZF8sICZoZWFkZXJfLCBoZWFkZXJfLnByZWZpeC5oZWFkZXJfc2l6ZSkpIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgInJlYWQgaGVhZGVyIGZhaWxlZCI7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0KICAgICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtMTAwLDIxNSArMTI2LDU3IEBACiBib29sIENvd1JlYWRlcjo6UGFyc2UoYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgZmQsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGxhYmVsKSB7CiAgICAgZmRfID0gZmQ7CiAKLSAgICBhdXRvIHBvcyA9IGxzZWVrKGZkXy5nZXQoKSwgMCwgU0VFS19FTkQpOwotICAgIGlmIChwb3MgPCAwKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJsc2VlayBlbmQgZmFpbGVkIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBmZF9zaXplXyA9IHBvczsKLQotICAgIGlmIChsc2VlayhmZF8uZ2V0KCksIDAsIFNFRUtfU0VUKSA8IDApIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgImxzZWVrIGhlYWRlciBmYWlsZWQiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhZEZ1bGx5KGZkXywgJmhlYWRlcl8sIHNpemVvZihoZWFkZXJfKSkpIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgInJlYWQgaGVhZGVyIGZhaWxlZCI7CisgICAgaWYgKCFSZWFkQ293SGVhZGVyKGZkLCAmaGVhZGVyXykpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmIChoZWFkZXJfLm1hZ2ljICE9IGtDb3dNYWdpY051bWJlcikgewotICAgICAgICBMT0coRVJST1IpIDw8ICJIZWFkZXIgTWFnaWMgY29ycnVwdGVkLiBNYWdpYzogIiA8PCBoZWFkZXJfLm1hZ2ljCi0gICAgICAgICAgICAgICAgICAgPDwgIkV4cGVjdGVkOiAiIDw8IGtDb3dNYWdpY051bWJlcjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDb3dQYXJzZXJCYXNlPiBwYXJzZXI7CisgICAgc3dpdGNoIChoZWFkZXJfLnByZWZpeC5tYWpvcl92ZXJzaW9uKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgcGFyc2VyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dQYXJzZXJWMj4oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBwYXJzZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1BhcnNlclYzPigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmtub3duIHZlcnNpb246ICIgPDwgaGVhZGVyXy5wcmVmaXgubWFqb3JfdmVyc2lvbjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgaWYgKGhlYWRlcl8uZm9vdGVyX3NpemUgIT0gc2l6ZW9mKENvd0Zvb3RlcikpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiRm9vdGVyIHNpemUgdW5rbm93biwgcmVhZCAiIDw8IGhlYWRlcl8uZm9vdGVyX3NpemUgPDwgIiwgZXhwZWN0ZWQgIgotICAgICAgICAgICAgICAgICAgIDw8IHNpemVvZihDb3dGb290ZXIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChoZWFkZXJfLm9wX3NpemUgIT0gc2l6ZW9mKENvd09wZXJhdGlvbikpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiT3BlcmF0aW9uIHNpemUgdW5rbm93biwgcmVhZCAiIDw8IGhlYWRlcl8ub3Bfc2l6ZSA8PCAiLCBleHBlY3RlZCAiCi0gICAgICAgICAgICAgICAgICAgPDwgc2l6ZW9mKENvd09wZXJhdGlvbik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKGhlYWRlcl8uY2x1c3Rlcl9vcHMgPT0gMSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJDbHVzdGVycyBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgdHdvIG9wZXJhdGlvbnMgdG8gZnVuY3Rpb24uIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoaGVhZGVyXy5vcF9zaXplICE9IHNpemVvZihDb3dPcGVyYXRpb24pKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIk9wZXJhdGlvbiBzaXplIHVua25vd24sIHJlYWQgIiA8PCBoZWFkZXJfLm9wX3NpemUgPDwgIiwgZXhwZWN0ZWQgIgotICAgICAgICAgICAgICAgICAgIDw8IHNpemVvZihDb3dPcGVyYXRpb24pOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChoZWFkZXJfLmNsdXN0ZXJfb3BzID09IDEpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2x1c3RlcnMgbXVzdCBjb250YWluIGF0IGxlYXN0IHR3byBvcGVyYXRpb25zIHRvIGZ1bmN0aW9uLiI7CisgICAgaWYgKCFwYXJzZXItPlBhcnNlKGZkLCBoZWFkZXJfLCBsYWJlbCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmICgoaGVhZGVyXy5tYWpvcl92ZXJzaW9uID4ga0Nvd1ZlcnNpb25NYWpvcikgfHwgKGhlYWRlcl8ubWlub3JfdmVyc2lvbiAhPSBrQ293VmVyc2lvbk1pbm9yKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJIZWFkZXIgdmVyc2lvbiBtaXNtYXRjaCI7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIk1ham9yIHZlcnNpb246ICIgPDwgaGVhZGVyXy5tYWpvcl92ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgPDwgIkV4cGVjdGVkOiAiIDw8IGtDb3dWZXJzaW9uTWFqb3I7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIk1pbm9yIHZlcnNpb246ICIgPDwgaGVhZGVyXy5taW5vcl92ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgPDwgIkV4cGVjdGVkOiAiIDw8IGtDb3dWZXJzaW9uTWlub3I7CisgICAgVHJhbnNsYXRlZENvd09wcyBvcHNfaW5mbzsKKyAgICBpZiAoIXBhcnNlci0+VHJhbnNsYXRlKCZvcHNfaW5mbykpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmICghUGFyc2VPcHMobGFiZWwpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9CisgICAgaGVhZGVyXyA9IG9wc19pbmZvLmhlYWRlcjsKKyAgICBvcHNfID0gc3RkOjptb3ZlKG9wc19pbmZvLm9wcyk7CisgICAgZm9vdGVyXyA9IHBhcnNlci0+Zm9vdGVyKCk7CisgICAgZmRfc2l6ZV8gPSBwYXJzZXItPmZkX3NpemUoKTsKKyAgICBsYXN0X2xhYmVsXyA9IHBhcnNlci0+bGFzdF9sYWJlbCgpOworICAgIHhvcl9kYXRhX2xvY18gPSBwYXJzZXItPnhvcl9kYXRhX2xvYygpOworCiAgICAgLy8gSWYgd2UncmUgcmVzdW1pbmcgYSB3cml0ZSwgd2UncmUgbm90IHJlYWR5IHRvIG1lcmdlCiAgICAgaWYgKGxhYmVsLmhhc192YWx1ZSgpKSByZXR1cm4gdHJ1ZTsKICAgICByZXR1cm4gUHJlcE1lcmdlT3BzKCk7CiB9CiAKLWJvb2wgQ293UmVhZGVyOjpQYXJzZU9wcyhzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBsYWJlbCkgewotICAgIHVpbnQ2NF90IHBvczsKLSAgICBhdXRvIGRhdGFfbG9jID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnVub3JkZXJlZF9tYXA8dWludDY0X3QsIHVpbnQ2NF90Pj4oKTsKLQotICAgIC8vIFNraXAgdGhlIHNjcmF0Y2ggc3BhY2UKLSAgICBpZiAoaGVhZGVyXy5tYWpvcl92ZXJzaW9uID49IDIgJiYgKGhlYWRlcl8uYnVmZmVyX3NpemUgPiAwKSkgewotICAgICAgICBMT0coREVCVUcpIDw8ICIgU2NyYXRjaCBzcGFjZSBmb3VuZCBvZiBzaXplOiAiIDw8IGhlYWRlcl8uYnVmZmVyX3NpemU7Ci0gICAgICAgIHNpemVfdCBpbml0X29mZnNldCA9IGhlYWRlcl8uaGVhZGVyX3NpemUgKyBoZWFkZXJfLmJ1ZmZlcl9zaXplOwotICAgICAgICBwb3MgPSBsc2VlayhmZF8uZ2V0KCksIGluaXRfb2Zmc2V0LCBTRUVLX1NFVCk7Ci0gICAgICAgIGlmIChwb3MgIT0gaW5pdF9vZmZzZXQpIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJsc2VlayBvcHMgZmFpbGVkIjsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBvcyA9IGxzZWVrKGZkXy5nZXQoKSwgaGVhZGVyXy5oZWFkZXJfc2l6ZSwgU0VFS19TRVQpOwotICAgICAgICBpZiAocG9zICE9IGhlYWRlcl8uaGVhZGVyX3NpemUpIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJsc2VlayBvcHMgZmFpbGVkIjsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAvLyBSZWFkaW5nIGEgdjEgdmVyc2lvbiBvZiBDT1cgd2hpY2ggZG9lc24ndCBoYXZlIGJ1ZmZlcl9zaXplLgotICAgICAgICBoZWFkZXJfLmJ1ZmZlcl9zaXplID0gMDsKK3VpbnQzMl90IENvd1JlYWRlcjo6R2V0TWF4Q29tcHJlc3Npb25TaXplKCkgeworICAgIHN3aXRjaCAoaGVhZGVyXy5wcmVmaXgubWFqb3JfdmVyc2lvbikgeworICAgICAgICBjYXNlIDE6CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIC8vIE9sZCB2ZXJzaW9ucyBzdXBwb3J0cyBvbmx5IDRLQiBjb21wcmVzc2lvbi4KKyAgICAgICAgICAgIHJldHVybiBoZWFkZXJfLmJsb2NrX3NpemU7CisgICAgICAgICAgICA7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHJldHVybiBoZWFkZXJfLm1heF9jb21wcmVzc2lvbl9zaXplOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5rbm93biB2ZXJzaW9uOiAiIDw8IGhlYWRlcl8ucHJlZml4Lm1ham9yX3ZlcnNpb247CisgICAgICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgdWludDY0X3QgZGF0YV9wb3MgPSAwOwotCi0gICAgaWYgKGhlYWRlcl8uY2x1c3Rlcl9vcHMpIHsKLSAgICAgICAgZGF0YV9wb3MgPSBwb3MgKyBoZWFkZXJfLmNsdXN0ZXJfb3BzICogc2l6ZW9mKENvd09wZXJhdGlvbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZGF0YV9wb3MgPSBwb3MgKyBzaXplb2YoQ293T3BlcmF0aW9uKTsKLSAgICB9Ci0KLSAgICBhdXRvIG9wc19idWZmZXIgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPENvd09wZXJhdGlvbj4+KCk7Ci0gICAgdWludDY0X3QgY3VycmVudF9vcF9udW0gPSAwOwotICAgIHVpbnQ2NF90IGNsdXN0ZXJfb3BzID0gaGVhZGVyXy5jbHVzdGVyX29wcyA/OiAxOwotICAgIGJvb2wgZG9uZSA9IGZhbHNlOwotCi0gICAgLy8gQWx0ZXJuYXRpbmcgb3AgY2x1c3RlcnMgYW5kIGRhdGEKLSAgICB3aGlsZSAoIWRvbmUpIHsKLSAgICAgICAgdWludDY0X3QgdG9fYWRkID0gc3RkOjptaW4oY2x1c3Rlcl9vcHMsIChmZF9zaXplXyAtIHBvcykgLyBzaXplb2YoQ293T3BlcmF0aW9uKSk7Ci0gICAgICAgIGlmICh0b19hZGQgPT0gMCkgYnJlYWs7Ci0gICAgICAgIG9wc19idWZmZXItPnJlc2l6ZShjdXJyZW50X29wX251bSArIHRvX2FkZCk7Ci0gICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhZEZ1bGx5KGZkXywgJm9wc19idWZmZXItPmRhdGEoKVtjdXJyZW50X29wX251bV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvX2FkZCAqIHNpemVvZihDb3dPcGVyYXRpb24pKSkgewotICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgInJlYWQgb3AgZmFpbGVkIjsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAvLyBQYXJzZSBjdXJyZW50IGNsdXN0ZXIgdG8gZmluZCBzdGFydCBvZiBuZXh0IGNsdXN0ZXIKLSAgICAgICAgd2hpbGUgKGN1cnJlbnRfb3BfbnVtIDwgb3BzX2J1ZmZlci0+c2l6ZSgpKSB7Ci0gICAgICAgICAgICBhdXRvJiBjdXJyZW50X29wID0gb3BzX2J1ZmZlci0+ZGF0YSgpW2N1cnJlbnRfb3BfbnVtXTsKLSAgICAgICAgICAgIGN1cnJlbnRfb3BfbnVtKys7Ci0gICAgICAgICAgICBpZiAoY3VycmVudF9vcC50eXBlID09IGtDb3dYb3JPcCkgewotICAgICAgICAgICAgICAgIGRhdGFfbG9jLT5pbnNlcnQoe2N1cnJlbnRfb3AubmV3X2Jsb2NrLCBkYXRhX3Bvc30pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcG9zICs9IHNpemVvZihDb3dPcGVyYXRpb24pICsgR2V0TmV4dE9wT2Zmc2V0KGN1cnJlbnRfb3AsIGhlYWRlcl8uY2x1c3Rlcl9vcHMpOwotICAgICAgICAgICAgZGF0YV9wb3MgKz0gY3VycmVudF9vcC5kYXRhX2xlbmd0aCArIEdldE5leHREYXRhT2Zmc2V0KGN1cnJlbnRfb3AsIGhlYWRlcl8uY2x1c3Rlcl9vcHMpOwotCi0gICAgICAgICAgICBpZiAoY3VycmVudF9vcC50eXBlID09IGtDb3dDbHVzdGVyT3ApIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudF9vcC50eXBlID09IGtDb3dMYWJlbE9wKSB7Ci0gICAgICAgICAgICAgICAgbGFzdF9sYWJlbF8gPSB7Y3VycmVudF9vcC5zb3VyY2V9OwotCi0gICAgICAgICAgICAgICAgLy8gSWYgd2UgcmVhY2ggdGhlIHJlcXVlc3RlZCBsYWJlbCwgc3RvcCByZWFkaW5nLgotICAgICAgICAgICAgICAgIGlmIChsYWJlbCAmJiBsYWJlbC52YWx1ZSgpID09IGN1cnJlbnRfb3Auc291cmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRfb3AudHlwZSA9PSBrQ293Rm9vdGVyT3ApIHsKLSAgICAgICAgICAgICAgICBmb290ZXJfLmVtcGxhY2UoKTsKLSAgICAgICAgICAgICAgICBDb3dGb290ZXIqIGZvb3RlciA9ICZmb290ZXJfLnZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCZmb290ZXJfLT5vcCwgJmN1cnJlbnRfb3AsIHNpemVvZihmb290ZXItPm9wKSk7Ci0gICAgICAgICAgICAgICAgb2ZmX3Qgb2ZmcyA9IGxzZWVrKGZkXy5nZXQoKSwgcG9zLCBTRUVLX1NFVCk7Ci0gICAgICAgICAgICAgICAgaWYgKG9mZnMgPCAwIHx8IHBvcyAhPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4ob2ZmcykpIHsKLSAgICAgICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgImxzZWVrIG5leHQgb3AgZmFpbGVkICIgPDwgb2ZmczsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseShmZF8sICZmb290ZXItPmRhdGEsIHNpemVvZihmb290ZXItPmRhdGEpKSkgewotICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgcmVhZCBDT1cgZm9vdGVyIjsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIERyb3AgdGhlIGZvb3RlciBmcm9tIHRoZSBvcCBzdHJlYW0uCi0gICAgICAgICAgICAgICAgY3VycmVudF9vcF9udW0tLTsKLSAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudF9vcC50eXBlID09IGtDb3dTZXF1ZW5jZU9wKSB7Ci0gICAgICAgICAgICAgICAgaGFzX3NlcV9vcHNfID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFBvc2l0aW9uIGZvciBuZXh0IGNsdXN0ZXIgcmVhZAotICAgICAgICBvZmZfdCBvZmZzID0gbHNlZWsoZmRfLmdldCgpLCBwb3MsIFNFRUtfU0VUKTsKLSAgICAgICAgaWYgKG9mZnMgPCAwIHx8IHBvcyAhPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4ob2ZmcykpIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJsc2VlayBuZXh0IG9wIGZhaWxlZCAiIDw8IG9mZnM7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgb3BzX2J1ZmZlci0+cmVzaXplKGN1cnJlbnRfb3BfbnVtKTsKLSAgICB9Ci0KLSAgICBMT0coREVCVUcpIDw8ICJDT1cgZmlsZSByZWFkIGNvbXBsZXRlLiBUb3RhbCBvcHM6ICIgPDwgb3BzX2J1ZmZlci0+c2l6ZSgpOwotICAgIC8vIFRvIHN1Y2Nlc3NmdWxseSBwYXJzZSBhIENPVyBmaWxlLCB3ZSBuZWVkIGVpdGhlcjoKLSAgICAvLyAgKDEpIGEgbGFiZWwgdG8gcmVhZCB1cCB0bywgYW5kIGZvciB0aGF0IGxhYmVsIHRvIGJlIGZvdW5kLCBvcgotICAgIC8vICAoMikgYSB2YWxpZCBmb290ZXIuCi0gICAgaWYgKGxhYmVsKSB7Ci0gICAgICAgIGlmICghbGFzdF9sYWJlbF8pIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkRpZCBub3QgZmluZCBsYWJlbCAiIDw8IGxhYmVsLnZhbHVlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIiB3aGlsZSByZWFkaW5nIENPVyAobm8gbGFiZWxzIGZvdW5kKSI7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxhc3RfbGFiZWxfLnZhbHVlKCkgIT0gbGFiZWwudmFsdWUoKSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRGlkIG5vdCBmaW5kIGxhYmVsICIgPDwgbGFiZWwudmFsdWUoKQotICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBsYXN0IGxhYmVsPSIgPDwgbGFzdF9sYWJlbF8udmFsdWUoKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoIWZvb3Rlcl8pIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiTm8gQ09XIGZvb3RlciBmb3VuZCI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB1aW50OF90IGNzdW1bMzJdOwotICAgIG1lbXNldChjc3VtLCAwLCBzaXplb2YodWludDhfdCkgKiAzMik7Ci0KLSAgICBpZiAoZm9vdGVyXykgewotICAgICAgICBpZiAob3BzX2J1ZmZlci0+c2l6ZSgpICE9IGZvb3Rlcl8tPm9wLm51bV9vcHMpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIm51bSBvcHMgZG9lcyBub3QgbWF0Y2gsIGV4cGVjdGVkICIgPDwgZm9vdGVyXy0+b3AubnVtX29wcyA8PCAiLCBmb3VuZCAiCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IG9wc19idWZmZXItPnNpemUoKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAob3BzX2J1ZmZlci0+c2l6ZSgpICogc2l6ZW9mKENvd09wZXJhdGlvbikgIT0gZm9vdGVyXy0+b3Aub3BzX3NpemUpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIm9wcyBzaXplIGRvZXMgbm90IG1hdGNoICI7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgU0hBMjU2KCZmb290ZXJfLT5vcCwgc2l6ZW9mKGZvb3Rlcl8tPm9wKSwgZm9vdGVyXy0+ZGF0YS5mb290ZXJfY2hlY2tzdW0pOwotICAgICAgICBpZiAobWVtY21wKGNzdW0sIGZvb3Rlcl8tPmRhdGEub3BzX2NoZWNrc3VtLCBzaXplb2YoY3N1bSkpICE9IDApIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIm9wcyBjaGVja3N1bSBkb2VzIG5vdCBtYXRjaCI7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgU0hBMjU2KG9wc19idWZmZXItPmRhdGEoKSwgZm9vdGVyXy0+b3Aub3BzX3NpemUsIGNzdW0pOwotICAgICAgICBpZiAobWVtY21wKGNzdW0sIGZvb3Rlcl8tPmRhdGEub3BzX2NoZWNrc3VtLCBzaXplb2YoY3N1bSkpICE9IDApIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIm9wcyBjaGVja3N1bSBkb2VzIG5vdCBtYXRjaCI7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBvcHNfID0gb3BzX2J1ZmZlcjsKLSAgICBvcHNfLT5zaHJpbmtfdG9fZml0KCk7Ci0gICAgZGF0YV9sb2NfID0gZGF0YV9sb2M7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKIH0KIAogLy8KQEAgLTQxNiw1MSArMjg0LDMxIEBACiAvLyAgICAgICAgICAgICAgICAgICAgICAgIFJlcGxhY2Utb3AtNCwgWmVyby1vcC05LCBSZXBsYWNlLW9wLTUgfQogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogYm9vbCBDb3dSZWFkZXI6OlByZXBNZXJnZU9wcygpIHsKLSAgICBhdXRvIG1lcmdlX29wX2Jsb2NrcyA9IHN0ZDo6bWFrZV91bmlxdWU8c3RkOjp2ZWN0b3I8dWludDMyX3Q+PigpOwogICAgIHN0ZDo6dmVjdG9yPGludD4gb3RoZXJfb3BzOwotICAgIGF1dG8gc2VxX29wc19zZXQgPSBzdGQ6OnVub3JkZXJlZF9zZXQ8dWludDMyX3Q+KCk7Ci0gICAgYXV0byBibG9ja19tYXAgPSBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50MzJfdCwgaW50Pj4oKTsKLSAgICBzaXplX3QgbnVtX3NlcXMgPSAwOwotICAgIHNpemVfdCByZWFkOworICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBtZXJnZV9vcF9ibG9ja3M7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQzMl90LCBpbnQ+IGJsb2NrX21hcDsKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3BzXy0+c2l6ZSgpOyBpKyspIHsKLSAgICAgICAgYXV0byYgY3VycmVudF9vcCA9IG9wc18tPmRhdGEoKVtpXTsKLQotICAgICAgICBpZiAoY3VycmVudF9vcC50eXBlID09IGtDb3dTZXF1ZW5jZU9wKSB7Ci0gICAgICAgICAgICBzaXplX3Qgc2VxX2xlbiA9IGN1cnJlbnRfb3AuZGF0YV9sZW5ndGggLyBzaXplb2YodWludDMyX3QpOwotCi0gICAgICAgICAgICBtZXJnZV9vcF9ibG9ja3MtPnJlc2l6ZShtZXJnZV9vcF9ibG9ja3MtPnNpemUoKSArIHNlcV9sZW4pOwotICAgICAgICAgICAgaWYgKCFHZXRSYXdCeXRlcyhjdXJyZW50X29wLnNvdXJjZSwgJm1lcmdlX29wX2Jsb2Nrcy0+ZGF0YSgpW251bV9zZXFzXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9vcC5kYXRhX2xlbmd0aCwgJnJlYWQpKSB7Ci0gICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byByZWFkIHNlcXVlbmNlIG9wISI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IG51bV9zZXFzOyBqIDwgbnVtX3NlcXMgKyBzZXFfbGVuOyBqKyspIHsKLSAgICAgICAgICAgICAgICBzZXFfb3BzX3NldC5pbnNlcnQobWVyZ2Vfb3BfYmxvY2tzLT5kYXRhKClbal0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbnVtX3NlcXMgKz0gc2VxX2xlbjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChJc01ldGFkYXRhT3AoY3VycmVudF9vcCkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFoYXNfc2VxX29wc18gJiYgSXNPcmRlcmVkT3AoY3VycmVudF9vcCkpIHsKLSAgICAgICAgICAgIG1lcmdlX29wX2Jsb2Nrcy0+ZW1wbGFjZV9iYWNrKGN1cnJlbnRfb3AubmV3X2Jsb2NrKTsKLSAgICAgICAgfSBlbHNlIGlmIChzZXFfb3BzX3NldC5jb3VudChjdXJyZW50X29wLm5ld19ibG9jaykgPT0gMCkgewotICAgICAgICAgICAgb3RoZXJfb3BzLnB1c2hfYmFjayhjdXJyZW50X29wLm5ld19ibG9jayk7Ci0gICAgICAgIH0KLSAgICAgICAgYmxvY2tfbWFwLT5pbnNlcnQoe2N1cnJlbnRfb3AubmV3X2Jsb2NrLCBpfSk7CisgICAgc3dpdGNoIChoZWFkZXJfLnByZWZpeC5tYWpvcl92ZXJzaW9uKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgR2V0U2VxdWVuY2VEYXRhVjIoJm1lcmdlX29wX2Jsb2NrcywgJm90aGVyX29wcywgJmJsb2NrX21hcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgR2V0U2VxdWVuY2VEYXRhKCZtZXJnZV9vcF9ibG9ja3MsICZvdGhlcl9vcHMsICZibG9ja19tYXApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKICAgICB9Ci0gICAgZm9yIChhdXRvIGJsb2NrIDogKm1lcmdlX29wX2Jsb2NrcykgewotICAgICAgICBpZiAoYmxvY2tfbWFwLT5jb3VudChibG9jaykgPT0gMCkgeworCisgICAgZm9yIChhdXRvIGJsb2NrIDogbWVyZ2Vfb3BfYmxvY2tzKSB7CisgICAgICAgIGlmIChibG9ja19tYXAuY291bnQoYmxvY2spID09IDApIHsKICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgU2VxdWVuY2UgT3BzLiBDb3VsZCBub3QgZmluZCBDb3cgT3AgZm9yIG5ldyBibG9jayAiIDw8IGJsb2NrOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKG1lcmdlX29wX2Jsb2Nrcy0+c2l6ZSgpID4gaGVhZGVyXy5udW1fbWVyZ2Vfb3BzKSB7Ci0gICAgICAgIG51bV9vcmRlcmVkX29wc190b19tZXJnZV8gPSBtZXJnZV9vcF9ibG9ja3MtPnNpemUoKSAtIGhlYWRlcl8ubnVtX21lcmdlX29wczsKKyAgICBpZiAobWVyZ2Vfb3BfYmxvY2tzLnNpemUoKSA+IGhlYWRlcl8ubnVtX21lcmdlX29wcykgeworICAgICAgICBudW1fb3JkZXJlZF9vcHNfdG9fbWVyZ2VfID0gbWVyZ2Vfb3BfYmxvY2tzLnNpemUoKSAtIGhlYWRlcl8ubnVtX21lcmdlX29wczsKICAgICB9IGVsc2UgewogICAgICAgICBudW1fb3JkZXJlZF9vcHNfdG9fbWVyZ2VfID0gMDsKICAgICB9CkBAIC00NzYsOSArMzI0LDkgQEAKICAgICAgICAgc3RkOjpzb3J0KG90aGVyX29wcy5iZWdpbigpLCBvdGhlcl9vcHMuZW5kKCksIHN0ZDo6Z3JlYXRlcjxpbnQ+KCkpOwogICAgIH0KIAotICAgIG1lcmdlX29wX2Jsb2Nrcy0+aW5zZXJ0KG1lcmdlX29wX2Jsb2Nrcy0+ZW5kKCksIG90aGVyX29wcy5iZWdpbigpLCBvdGhlcl9vcHMuZW5kKCkpOworICAgIG1lcmdlX29wX2Jsb2Nrcy5pbnNlcnQobWVyZ2Vfb3BfYmxvY2tzLmVuZCgpLCBvdGhlcl9vcHMuYmVnaW4oKSwgb3RoZXJfb3BzLmVuZCgpKTsKIAotICAgIG51bV90b3RhbF9kYXRhX29wc18gPSBtZXJnZV9vcF9ibG9ja3MtPnNpemUoKTsKKyAgICBudW1fdG90YWxfZGF0YV9vcHNfID0gbWVyZ2Vfb3BfYmxvY2tzLnNpemUoKTsKICAgICBpZiAoaGVhZGVyXy5udW1fbWVyZ2Vfb3BzID4gMCkgewogICAgICAgICBtZXJnZV9vcF9zdGFydF8gPSBoZWFkZXJfLm51bV9tZXJnZV9vcHM7CiAgICAgfQpAQCAtNDg4LDY3ICszMzYsMTUzIEBACiAgICAgICAgIC8vIHRoZSBvcHMgdmVjdG9yIGFzIHJlcXVpcmVkIGZvciBtZXJnZSBvcGVyYXRpb25zLgogICAgICAgICBhdXRvIG1lcmdlX29wc19idWZmZXIgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPENvd09wZXJhdGlvbj4+KCk7CiAgICAgICAgIG1lcmdlX29wc19idWZmZXItPnJlc2VydmUobnVtX3RvdGFsX2RhdGFfb3BzXyk7Ci0gICAgICAgIGZvciAoYXV0byBibG9jayA6ICptZXJnZV9vcF9ibG9ja3MpIHsKLSAgICAgICAgICAgIG1lcmdlX29wc19idWZmZXItPmVtcGxhY2VfYmFjayhvcHNfLT5kYXRhKClbYmxvY2tfbWFwLT5hdChibG9jayldKTsKKyAgICAgICAgZm9yIChhdXRvIGJsb2NrIDogbWVyZ2Vfb3BfYmxvY2tzKSB7CisgICAgICAgICAgICBtZXJnZV9vcHNfYnVmZmVyLT5lbXBsYWNlX2JhY2sob3BzXy0+ZGF0YSgpW2Jsb2NrX21hcC5hdChibG9jayldKTsKICAgICAgICAgfQogICAgICAgICBvcHNfLT5jbGVhcigpOwogICAgICAgICBvcHNfID0gbWVyZ2Vfb3BzX2J1ZmZlcjsKICAgICAgICAgb3BzXy0+c2hyaW5rX3RvX2ZpdCgpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoYXV0byBibG9jayA6ICptZXJnZV9vcF9ibG9ja3MpIHsKLSAgICAgICAgICAgIGJsb2NrX3Bvc19pbmRleF8tPnB1c2hfYmFjayhibG9ja19tYXAtPmF0KGJsb2NrKSk7CisgICAgICAgIGZvciAoYXV0byBibG9jayA6IG1lcmdlX29wX2Jsb2NrcykgeworICAgICAgICAgICAgYmxvY2tfcG9zX2luZGV4Xy0+cHVzaF9iYWNrKGJsb2NrX21hcC5hdChibG9jaykpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgYmxvY2tfbWFwLT5jbGVhcigpOwotICAgIG1lcmdlX29wX2Jsb2Nrcy0+Y2xlYXIoKTsKKyAgICBibG9ja19tYXAuY2xlYXIoKTsKKyAgICBtZXJnZV9vcF9ibG9ja3MuY2xlYXIoKTsKIAogICAgIHJldHVybiB0cnVlOwogfQogCitib29sIENvd1JlYWRlcjo6R2V0U2VxdWVuY2VEYXRhVjIoc3RkOjp2ZWN0b3I8dWludDMyX3Q+KiBtZXJnZV9vcF9ibG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50Piogb3RoZXJfb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50MzJfdCwgaW50PiogYmxvY2tfbWFwKSB7CisgICAgYXV0byBzZXFfb3BzX3NldCA9IHN0ZDo6dW5vcmRlcmVkX3NldDx1aW50MzJfdD4oKTsKKyAgICBzaXplX3QgbnVtX3NlcXMgPSAwOworICAgIHNpemVfdCByZWFkOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3BzXy0+c2l6ZSgpOyBpKyspIHsKKyAgICAgICAgYXV0byYgY3VycmVudF9vcCA9IG9wc18tPmRhdGEoKVtpXTsKKworICAgICAgICBpZiAoY3VycmVudF9vcC50eXBlKCkgPT0ga0Nvd1NlcXVlbmNlT3ApIHsKKyAgICAgICAgICAgIHNpemVfdCBzZXFfbGVuID0gY3VycmVudF9vcC5kYXRhX2xlbmd0aCAvIHNpemVvZih1aW50MzJfdCk7CisKKyAgICAgICAgICAgIG1lcmdlX29wX2Jsb2Nrcy0+cmVzaXplKG1lcmdlX29wX2Jsb2Nrcy0+c2l6ZSgpICsgc2VxX2xlbik7CisgICAgICAgICAgICBpZiAoIUdldFJhd0J5dGVzKCZjdXJyZW50X29wLCAmbWVyZ2Vfb3BfYmxvY2tzLT5kYXRhKClbbnVtX3NlcXNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X29wLmRhdGFfbGVuZ3RoLCAmcmVhZCkpIHsKKyAgICAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlYWQgc2VxdWVuY2Ugb3AhIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gbnVtX3NlcXM7IGogPCBudW1fc2VxcyArIHNlcV9sZW47IGorKykgeworICAgICAgICAgICAgICAgIHNlcV9vcHNfc2V0Lmluc2VydChtZXJnZV9vcF9ibG9ja3MtPmF0KGopKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG51bV9zZXFzICs9IHNlcV9sZW47CisgICAgICAgIH0KKworICAgICAgICBpZiAoSXNNZXRhZGF0YU9wKGN1cnJlbnRfb3ApKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNlcXVlbmNlIG9wcyBtdXN0IGJlIHRoZSBmaXJzdCBvcHMgaW4gdGhlIHN0cmVhbS4KKyAgICAgICAgaWYgKHNlcV9vcHNfc2V0LmVtcHR5KCkgJiYgSXNPcmRlcmVkT3AoY3VycmVudF9vcCkpIHsKKyAgICAgICAgICAgIG1lcmdlX29wX2Jsb2Nrcy0+ZW1wbGFjZV9iYWNrKGN1cnJlbnRfb3AubmV3X2Jsb2NrKTsKKyAgICAgICAgfSBlbHNlIGlmIChzZXFfb3BzX3NldC5jb3VudChjdXJyZW50X29wLm5ld19ibG9jaykgPT0gMCkgeworICAgICAgICAgICAgb3RoZXJfb3BzLT5wdXNoX2JhY2soY3VycmVudF9vcC5uZXdfYmxvY2spOworICAgICAgICB9CisgICAgICAgIGJsb2NrX21hcC0+aW5zZXJ0KHtjdXJyZW50X29wLm5ld19ibG9jaywgaX0pOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ293UmVhZGVyOjpHZXRTZXF1ZW5jZURhdGEoc3RkOjp2ZWN0b3I8dWludDMyX3Q+KiBtZXJnZV9vcF9ibG9ja3MsIHN0ZDo6dmVjdG9yPGludD4qIG90aGVyX29wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQzMl90LCBpbnQ+KiBibG9ja19tYXApIHsKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8dWludDMyX3Q+IHNlcV9vcHNfc2V0OworICAgIC8vIHJlYWQgc2VxdWVuY2Ugb3BzIGRhdGEKKyAgICBtZXJnZV9vcF9ibG9ja3MtPnJlc2l6ZShoZWFkZXJfLnNlcXVlbmNlX2RhdGFfY291bnQpOworICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhZEZ1bGx5QXRPZmZzZXQoCisgICAgICAgICAgICAgICAgZmRfLCBtZXJnZV9vcF9ibG9ja3MtPmRhdGEoKSwKKyAgICAgICAgICAgICAgICBoZWFkZXJfLnNlcXVlbmNlX2RhdGFfY291bnQgKiBzaXplb2YobWVyZ2Vfb3BfYmxvY2tzLT5hdCgwKSksCisgICAgICAgICAgICAgICAgR2V0U2VxdWVuY2VPZmZzZXQoaGVhZGVyXykpKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJmYWlsZWQgdG8gcmVhZCBzZXF1ZW5jZSBidWZmZXIuIHNlcV9kYXRhX2NvdW50OiAiCisgICAgICAgICAgICAgICAgICAgIDw8IGhlYWRlcl8uc2VxdWVuY2VfZGF0YV9jb3VudCA8PCAiIGF0IG9mZnNldDogIiA8PCBHZXRTZXF1ZW5jZU9mZnNldChoZWFkZXJfKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzZXFfb3BzX3NldC5yZXNlcnZlKG1lcmdlX29wX2Jsb2Nrcy0+c2l6ZSgpKTsKKyAgICBmb3IgKGF1dG8mIGkgOiAqbWVyZ2Vfb3BfYmxvY2tzKSB7CisgICAgICAgIHNlcV9vcHNfc2V0Lmluc2VydChpKTsKKyAgICB9CisgICAgLy8gcmVhZCBvcmRlcmVkIG9wIGRhdGEKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG9wc18tPnNpemUoKTsgaSsrKSB7CisgICAgICAgIGF1dG8mIGN1cnJlbnRfb3AgPSBvcHNfLT5kYXRhKClbaV07CisgICAgICAgIC8vIFNlcXVlbmNlIG9wcyBtdXN0IGJlIHRoZSBmaXJzdCBvcHMgaW4gdGhlIHN0cmVhbS4KKyAgICAgICAgaWYgKHNlcV9vcHNfc2V0LmVtcHR5KCkpIHsKKyAgICAgICAgICAgIG1lcmdlX29wX2Jsb2Nrcy0+ZW1wbGFjZV9iYWNrKGN1cnJlbnRfb3AubmV3X2Jsb2NrKTsKKyAgICAgICAgfSBlbHNlIGlmIChzZXFfb3BzX3NldC5jb3VudChjdXJyZW50X29wLm5ld19ibG9jaykgPT0gMCkgeworICAgICAgICAgICAgb3RoZXJfb3BzLT5wdXNoX2JhY2soY3VycmVudF9vcC5uZXdfYmxvY2spOworICAgICAgICB9CisgICAgICAgIGJsb2NrX21hcC0+aW5zZXJ0KHtjdXJyZW50X29wLm5ld19ibG9jaywgaX0pOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogYm9vbCBDb3dSZWFkZXI6OlZlcmlmeU1lcmdlT3BzKCkgewogICAgIGF1dG8gaXRyID0gR2V0TWVyZ2VPcEl0ZXIodHJ1ZSk7Ci0gICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCBDb3dPcGVyYXRpb24+IG92ZXJ3cml0dGVuX2Jsb2NrczsKLSAgICB3aGlsZSAoIWl0ci0+RG9uZSgpKSB7Ci0gICAgICAgIENvd09wZXJhdGlvbiBvcCA9IGl0ci0+R2V0KCk7Ci0gICAgICAgIHVpbnQ2NF90IGJsb2NrOwotICAgICAgICBib29sIG9mZnNldDsKLSAgICAgICAgaWYgKG9wLnR5cGUgPT0ga0Nvd0NvcHlPcCkgewotICAgICAgICAgICAgYmxvY2sgPSBvcC5zb3VyY2U7Ci0gICAgICAgICAgICBvZmZzZXQgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmIChvcC50eXBlID09IGtDb3dYb3JPcCkgewotICAgICAgICAgICAgYmxvY2sgPSBvcC5zb3VyY2UgLyBCTE9DS19TWjsKLSAgICAgICAgICAgIG9mZnNldCA9IChvcC5zb3VyY2UgJSBCTE9DS19TWikgIT0gMDsKLSAgICAgICAgfSBlbHNlIHsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDY0X3QsIGNvbnN0IENvd09wZXJhdGlvbio+IG92ZXJ3cml0dGVuX2Jsb2NrczsKKyAgICBib29sIG5vbl9vcmRlcmVkX29wX2ZvdW5kID0gZmFsc2U7CisKKyAgICB3aGlsZSAoIWl0ci0+QXRFbmQoKSkgeworICAgICAgICBjb25zdCBhdXRvJiBvcCA9IGl0ci0+R2V0KCk7CisgICAgICAgIHVpbnQ2NF90IG9mZnNldDsKKworICAgICAgICAvLyBPcCBzaG91bGQgbm90IGJlIGEgbWV0YWRhdGEKKyAgICAgICAgaWYgKElzTWV0YWRhdGFPcCgqb3ApKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJNZXRhZGF0YSBvcDogIiA8PCBvcCA8PCAiIGZvdW5kIGR1cmluZyBtZXJnZSBzZXF1ZW5jZSI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXF1ZW5jZSBvcHMgc2hvdWxkIGNvbnRhaW4gYWxsIHRoZSBvcmRlcmVkIG9wcyBmb2xsb3dlZAorICAgICAgICAvLyBieSBSZXBsYWNlIGFuZCBaZXJvIG9wcy4gSWYgd2UgZmluZCB0aGUgZmlyc3Qgb3Agd2hpY2gKKyAgICAgICAgLy8gaXMgbm90IG9yZGVyZWQsIHRoYXQgbWVhbnMgYWxsIG9yZGVyZWQgb3BzIHByb2Nlc3NpbmcKKyAgICAgICAgLy8gaGFzIGJlZW4gY29tcGxldGVkLgorICAgICAgICBpZiAoIUlzT3JkZXJlZE9wKCpvcCkpIHsKKyAgICAgICAgICAgIG5vbl9vcmRlcmVkX29wX2ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNpbmNlLCBhbGwgb3JkZXJlZCBvcHMgcHJvY2Vzc2luZyBoYXMgYmVlbiBjb21wbGV0ZWQsCisgICAgICAgIC8vIGNoZWNrIHRoYXQgdGhlIHN1YnNlcXVlbnQgb3BzIGFyZSBub3Qgb3JkZXJlZC4KKyAgICAgICAgaWYgKG5vbl9vcmRlcmVkX29wX2ZvdW5kICYmIElzT3JkZXJlZE9wKCpvcCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgc2VxdWVuY2UgLSBub24tb3JkZXJlZCBhbmQgb3JkZXJlZCBvcHMiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgY2Fubm90IGJlIG1peGVkIGR1cmluZyBzZXF1ZW5jZSBnZW5lcmF0aW9uIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghR2V0U291cmNlT2Zmc2V0KG9wLCAmb2Zmc2V0KSkgewogICAgICAgICAgICAgaXRyLT5OZXh0KCk7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIENvd09wZXJhdGlvbiogb3ZlcndyaXRlID0gbnVsbHB0cjsKKyAgICAgICAgdWludDY0X3QgYmxvY2sgPSBHZXRCbG9ja0Zyb21PZmZzZXQoaGVhZGVyXywgb2Zmc2V0KTsKKyAgICAgICAgYm9vbCBtaXNhbGlnbmVkID0gKEdldEJsb2NrUmVsYXRpdmVPZmZzZXQoaGVhZGVyXywgb2Zmc2V0KSAhPSAwKTsKKworICAgICAgICBjb25zdCBDb3dPcGVyYXRpb24qIG92ZXJ3cml0ZSA9IG51bGxwdHI7CiAgICAgICAgIGlmIChvdmVyd3JpdHRlbl9ibG9ja3MuY291bnQoYmxvY2spKSB7Ci0gICAgICAgICAgICBvdmVyd3JpdGUgPSAmb3ZlcndyaXR0ZW5fYmxvY2tzW2Jsb2NrXTsKKyAgICAgICAgICAgIG92ZXJ3cml0ZSA9IG92ZXJ3cml0dGVuX2Jsb2Nrc1tibG9ja107CiAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFNlcXVlbmNlISBCbG9jayBuZWVkZWQgZm9yIG9wOlxuIgogICAgICAgICAgICAgICAgICAgICAgICA8PCBvcCA8PCAiXG5vdmVyd3JpdHRlbiBieSBwcmV2aW91c2x5IG1lcmdlZCBvcDpcbiIKICAgICAgICAgICAgICAgICAgICAgICAgPDwgKm92ZXJ3cml0ZTsKICAgICAgICAgfQotICAgICAgICBpZiAob2Zmc2V0ICYmIG92ZXJ3cml0dGVuX2Jsb2Nrcy5jb3VudChibG9jayArIDEpKSB7Ci0gICAgICAgICAgICBvdmVyd3JpdGUgPSAmb3ZlcndyaXR0ZW5fYmxvY2tzW2Jsb2NrICsgMV07CisgICAgICAgIGlmIChtaXNhbGlnbmVkICYmIG92ZXJ3cml0dGVuX2Jsb2Nrcy5jb3VudChibG9jayArIDEpKSB7CisgICAgICAgICAgICBvdmVyd3JpdGUgPSBvdmVyd3JpdHRlbl9ibG9ja3NbYmxvY2sgKyAxXTsKICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgU2VxdWVuY2UhIEJsb2NrIG5lZWRlZCBmb3Igb3A6XG4iCiAgICAgICAgICAgICAgICAgICAgICAgIDw8IG9wIDw8ICJcbm92ZXJ3cml0dGVuIGJ5IHByZXZpb3VzbHkgbWVyZ2VkIG9wOlxuIgogICAgICAgICAgICAgICAgICAgICAgICA8PCAqb3ZlcndyaXRlOwogICAgICAgICB9CiAgICAgICAgIGlmIChvdmVyd3JpdGUgIT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOwotICAgICAgICBvdmVyd3JpdHRlbl9ibG9ja3Nbb3AubmV3X2Jsb2NrXSA9IG9wOworICAgICAgICBvdmVyd3JpdHRlbl9ibG9ja3Nbb3AtPm5ld19ibG9ja10gPSBvcDsKICAgICAgICAgaXRyLT5OZXh0KCk7CiAgICAgfQogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIENvd1JlYWRlcjo6R2V0SGVhZGVyKENvd0hlYWRlciogaGVhZGVyKSB7Ci0gICAgKmhlYWRlciA9IGhlYWRlcl87Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KIGJvb2wgQ293UmVhZGVyOjpHZXRGb290ZXIoQ293Rm9vdGVyKiBmb290ZXIpIHsKICAgICBpZiAoIWZvb3Rlcl8pIHJldHVybiBmYWxzZTsKICAgICAqZm9vdGVyID0gZm9vdGVyXy52YWx1ZSgpOwpAQCAtNTY1LDEyICs0OTksMTIgQEAKICAgcHVibGljOgogICAgIENvd09wSXRlcihzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8Q293T3BlcmF0aW9uPj4mIG9wcywgdWludDY0X3Qgc3RhcnQpOwogCi0gICAgYm9vbCBEb25lKCkgb3ZlcnJpZGU7Ci0gICAgY29uc3QgQ293T3BlcmF0aW9uJiBHZXQoKSBvdmVycmlkZTsKKyAgICBib29sIEF0RW5kKCkgb3ZlcnJpZGU7CisgICAgY29uc3QgQ293T3BlcmF0aW9uKiBHZXQoKSBvdmVycmlkZTsKICAgICB2b2lkIE5leHQoKSBvdmVycmlkZTsKIAogICAgIHZvaWQgUHJldigpIG92ZXJyaWRlOwotICAgIGJvb2wgUkRvbmUoKSBvdmVycmlkZTsKKyAgICBib29sIEF0QmVnaW4oKSBvdmVycmlkZTsKIAogICBwcml2YXRlOgogICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3RvcjxDb3dPcGVyYXRpb24+PiBvcHNfOwpAQCAtNTgyLDI3ICs1MTYsMjcgQEAKICAgICBvcF9pdGVyXyA9IG9wc18tPmJlZ2luKCkgKyBzdGFydDsKIH0KIAotYm9vbCBDb3dPcEl0ZXI6OlJEb25lKCkgeworYm9vbCBDb3dPcEl0ZXI6OkF0QmVnaW4oKSB7CiAgICAgcmV0dXJuIG9wX2l0ZXJfID09IG9wc18tPmJlZ2luKCk7CiB9CiAKIHZvaWQgQ293T3BJdGVyOjpQcmV2KCkgewotICAgIENIRUNLKCFSRG9uZSgpKTsKKyAgICBDSEVDSyghQXRCZWdpbigpKTsKICAgICBvcF9pdGVyXy0tOwogfQogCi1ib29sIENvd09wSXRlcjo6RG9uZSgpIHsKK2Jvb2wgQ293T3BJdGVyOjpBdEVuZCgpIHsKICAgICByZXR1cm4gb3BfaXRlcl8gPT0gb3BzXy0+ZW5kKCk7CiB9CiAKIHZvaWQgQ293T3BJdGVyOjpOZXh0KCkgewotICAgIENIRUNLKCFEb25lKCkpOworICAgIENIRUNLKCFBdEVuZCgpKTsKICAgICBvcF9pdGVyXysrOwogfQogCi1jb25zdCBDb3dPcGVyYXRpb24mIENvd09wSXRlcjo6R2V0KCkgewotICAgIENIRUNLKCFEb25lKCkpOwotICAgIHJldHVybiAoKm9wX2l0ZXJfKTsKK2NvbnN0IENvd09wZXJhdGlvbiogQ293T3BJdGVyOjpHZXQoKSB7CisgICAgQ0hFQ0soIUF0RW5kKCkpOworICAgIHJldHVybiAmKCpvcF9pdGVyXyk7CiB9CiAKIGNsYXNzIENvd1Jldk1lcmdlT3BJdGVyIGZpbmFsIDogcHVibGljIElDb3dPcEl0ZXIgewpAQCAtNjEwLDEyICs1NDQsMTIgQEAKICAgICBleHBsaWNpdCBDb3dSZXZNZXJnZU9wSXRlcihzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8Q293T3BlcmF0aW9uPj4gb3BzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3RvcjxpbnQ+PiBibG9ja19wb3NfaW5kZXgsIHVpbnQ2NF90IHN0YXJ0KTsKIAotICAgIGJvb2wgRG9uZSgpIG92ZXJyaWRlOwotICAgIGNvbnN0IENvd09wZXJhdGlvbiYgR2V0KCkgb3ZlcnJpZGU7CisgICAgYm9vbCBBdEVuZCgpIG92ZXJyaWRlOworICAgIGNvbnN0IENvd09wZXJhdGlvbiogR2V0KCkgb3ZlcnJpZGU7CiAgICAgdm9pZCBOZXh0KCkgb3ZlcnJpZGU7CiAKICAgICB2b2lkIFByZXYoKSBvdmVycmlkZTsKLSAgICBib29sIFJEb25lKCkgb3ZlcnJpZGU7CisgICAgYm9vbCBBdEJlZ2luKCkgb3ZlcnJpZGU7CiAKICAgcHJpdmF0ZToKICAgICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8Q293T3BlcmF0aW9uPj4gb3BzXzsKQEAgLTYyOSwxMiArNTYzLDEyIEBACiAgICAgZXhwbGljaXQgQ293TWVyZ2VPcEl0ZXIoc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPENvd09wZXJhdGlvbj4+IG9wcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8aW50Pj4gYmxvY2tfcG9zX2luZGV4LCB1aW50NjRfdCBzdGFydCk7CiAKLSAgICBib29sIERvbmUoKSBvdmVycmlkZTsKLSAgICBjb25zdCBDb3dPcGVyYXRpb24mIEdldCgpIG92ZXJyaWRlOworICAgIGJvb2wgQXRFbmQoKSBvdmVycmlkZTsKKyAgICBjb25zdCBDb3dPcGVyYXRpb24qIEdldCgpIG92ZXJyaWRlOwogICAgIHZvaWQgTmV4dCgpIG92ZXJyaWRlOwogCiAgICAgdm9pZCBQcmV2KCkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBSRG9uZSgpIG92ZXJyaWRlOworICAgIGJvb2wgQXRCZWdpbigpIG92ZXJyaWRlOwogCiAgIHByaXZhdGU6CiAgICAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPENvd09wZXJhdGlvbj4+IG9wc187CkBAIC02NTEsMjcgKzU4NSwyNyBAQAogICAgIGJsb2NrX2l0ZXJfID0gY293X29wX2luZGV4X3ZlY18tPmJlZ2luKCkgKyBzdGFydDsKIH0KIAotYm9vbCBDb3dNZXJnZU9wSXRlcjo6UkRvbmUoKSB7Citib29sIENvd01lcmdlT3BJdGVyOjpBdEJlZ2luKCkgewogICAgIHJldHVybiBibG9ja19pdGVyXyA9PSBjb3dfb3BfaW5kZXhfdmVjXy0+YmVnaW4oKTsKIH0KIAogdm9pZCBDb3dNZXJnZU9wSXRlcjo6UHJldigpIHsKLSAgICBDSEVDSyghUkRvbmUoKSk7CisgICAgQ0hFQ0soIUF0QmVnaW4oKSk7CiAgICAgYmxvY2tfaXRlcl8tLTsKIH0KIAotYm9vbCBDb3dNZXJnZU9wSXRlcjo6RG9uZSgpIHsKK2Jvb2wgQ293TWVyZ2VPcEl0ZXI6OkF0RW5kKCkgewogICAgIHJldHVybiBibG9ja19pdGVyXyA9PSBjb3dfb3BfaW5kZXhfdmVjXy0+ZW5kKCk7CiB9CiAKIHZvaWQgQ293TWVyZ2VPcEl0ZXI6Ok5leHQoKSB7Ci0gICAgQ0hFQ0soIURvbmUoKSk7CisgICAgQ0hFQ0soIUF0RW5kKCkpOwogICAgIGJsb2NrX2l0ZXJfKys7CiB9CiAKLWNvbnN0IENvd09wZXJhdGlvbiYgQ293TWVyZ2VPcEl0ZXI6OkdldCgpIHsKLSAgICBDSEVDSyghRG9uZSgpKTsKLSAgICByZXR1cm4gb3BzXy0+ZGF0YSgpWypibG9ja19pdGVyX107Citjb25zdCBDb3dPcGVyYXRpb24qIENvd01lcmdlT3BJdGVyOjpHZXQoKSB7CisgICAgQ0hFQ0soIUF0RW5kKCkpOworICAgIHJldHVybiAmb3BzXy0+ZGF0YSgpWypibG9ja19pdGVyX107CiB9CiAKIENvd1Jldk1lcmdlT3BJdGVyOjpDb3dSZXZNZXJnZU9wSXRlcihzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8Q293T3BlcmF0aW9uPj4gb3BzLApAQCAtNjgzLDI3ICs2MTcsMjcgQEAKICAgICBibG9ja19yaXRlcl8gPSBjb3dfb3BfaW5kZXhfdmVjXy0+cmJlZ2luKCk7CiB9CiAKLWJvb2wgQ293UmV2TWVyZ2VPcEl0ZXI6OlJEb25lKCkgeworYm9vbCBDb3dSZXZNZXJnZU9wSXRlcjo6QXRCZWdpbigpIHsKICAgICByZXR1cm4gYmxvY2tfcml0ZXJfID09IGNvd19vcF9pbmRleF92ZWNfLT5yYmVnaW4oKTsKIH0KIAogdm9pZCBDb3dSZXZNZXJnZU9wSXRlcjo6UHJldigpIHsKLSAgICBDSEVDSyghUkRvbmUoKSk7CisgICAgQ0hFQ0soIUF0QmVnaW4oKSk7CiAgICAgYmxvY2tfcml0ZXJfLS07CiB9CiAKLWJvb2wgQ293UmV2TWVyZ2VPcEl0ZXI6OkRvbmUoKSB7Citib29sIENvd1Jldk1lcmdlT3BJdGVyOjpBdEVuZCgpIHsKICAgICByZXR1cm4gYmxvY2tfcml0ZXJfID09IGNvd19vcF9pbmRleF92ZWNfLT5yZW5kKCkgLSBzdGFydF87CiB9CiAKIHZvaWQgQ293UmV2TWVyZ2VPcEl0ZXI6Ok5leHQoKSB7Ci0gICAgQ0hFQ0soIURvbmUoKSk7CisgICAgQ0hFQ0soIUF0RW5kKCkpOwogICAgIGJsb2NrX3JpdGVyXysrOwogfQogCi1jb25zdCBDb3dPcGVyYXRpb24mIENvd1Jldk1lcmdlT3BJdGVyOjpHZXQoKSB7Ci0gICAgQ0hFQ0soIURvbmUoKSk7Ci0gICAgcmV0dXJuIG9wc18tPmRhdGEoKVsqYmxvY2tfcml0ZXJfXTsKK2NvbnN0IENvd09wZXJhdGlvbiogQ293UmV2TWVyZ2VPcEl0ZXI6OkdldCgpIHsKKyAgICBDSEVDSyghQXRFbmQoKSk7CisgICAgcmV0dXJuICZvcHNfLT5kYXRhKClbKmJsb2NrX3JpdGVyX107CiB9CiAKIHN0ZDo6dW5pcXVlX3B0cjxJQ293T3BJdGVyPiBDb3dSZWFkZXI6OkdldE9wSXRlcihib29sIG1lcmdlX3Byb2dyZXNzKSB7CkBAIC03MjAsMTAgKzY1NCwyMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVfcHJvZ3Jlc3MgPyAwIDogbWVyZ2Vfb3Bfc3RhcnRfKTsKIH0KIAorYm9vbCBDb3dSZWFkZXI6OkdldFJhd0J5dGVzKGNvbnN0IENvd09wZXJhdGlvbiogb3AsIHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGxlbiwgc2l6ZV90KiByZWFkKSB7CisgICAgc3dpdGNoIChvcC0+dHlwZSgpKSB7CisgICAgICAgIGNhc2Uga0Nvd1NlcXVlbmNlT3A6CisgICAgICAgIGNhc2Uga0Nvd1JlcGxhY2VPcDoKKyAgICAgICAgY2FzZSBrQ293WG9yT3A6CisgICAgICAgICAgICByZXR1cm4gR2V0UmF3Qnl0ZXMob3AtPnNvdXJjZSgpLCBidWZmZXIsIGxlbiwgcmVhZCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgZ2V0IHJhdyBieXRlcyBvZiBub24tZGF0YSBvcDogIiA8PCAqb3A7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCiBib29sIENvd1JlYWRlcjo6R2V0UmF3Qnl0ZXModWludDY0X3Qgb2Zmc2V0LCB2b2lkKiBidWZmZXIsIHNpemVfdCBsZW4sIHNpemVfdCogcmVhZCkgewogICAgIC8vIFZhbGlkYXRlIHRoZSBvZmZzZXQsIHRha2luZyBjYXJlIHRvIGFja25vd2xlZGdlIHBvc3NpYmxlIG92ZXJmbG93IG9mIG9mZnNldCtsZW4uCi0gICAgaWYgKG9mZnNldCA8IGhlYWRlcl8uaGVhZGVyX3NpemUgfHwgb2Zmc2V0ID49IGZkX3NpemVfIC0gc2l6ZW9mKENvd0Zvb3RlcikgfHwgbGVuID49IGZkX3NpemVfIHx8Ci0gICAgICAgIG9mZnNldCArIGxlbiA+IGZkX3NpemVfIC0gc2l6ZW9mKENvd0Zvb3RlcikpIHsKKyAgICBpZiAob2Zmc2V0IDwgaGVhZGVyXy5wcmVmaXguaGVhZGVyX3NpemUgfHwgb2Zmc2V0ID49IGZkX3NpemVfIHx8IG9mZnNldCArIGxlbiA+IGZkX3NpemVfIHx8CisgICAgICAgIGxlbiA+PSBmZF9zaXplXykgewogICAgICAgICBMT0coRVJST1IpIDw8ICJpbnZhbGlkIGRhdGEgb2Zmc2V0OiAiIDw8IG9mZnNldCA8PCAiLCAiIDw8IGxlbiA8PCAiIGJ5dGVzIjsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTc0NywxOCArNjkzLDE4IEBACiAgICAgICAgIHJlbWFpbmluZ18gPSBkYXRhX2xlbmd0aF87CiAgICAgfQogCi0gICAgYm9vbCBSZWFkKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwgc2l6ZV90KiByZWFkKSBvdmVycmlkZSB7CisgICAgc3NpemVfdCBSZWFkKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgb3ZlcnJpZGUgewogICAgICAgICBzaXplX3QgdG9fcmVhZCA9IHN0ZDo6bWluKGxlbmd0aCwgcmVtYWluaW5nXyk7CiAgICAgICAgIGlmICghdG9fcmVhZCkgewotICAgICAgICAgICAgKnJlYWQgPSAwOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQotICAgICAgICBpZiAoIXJlYWRlcl8tPkdldFJhd0J5dGVzKG9mZnNldF8sIGJ1ZmZlciwgdG9fcmVhZCwgcmVhZCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgc2l6ZV90IHJlYWQ7CisgICAgICAgIGlmICghcmVhZGVyXy0+R2V0UmF3Qnl0ZXMob2Zmc2V0XywgYnVmZmVyLCB0b19yZWFkLCAmcmVhZCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQotICAgICAgICBvZmZzZXRfICs9ICpyZWFkOwotICAgICAgICByZW1haW5pbmdfIC09ICpyZWFkOwotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgb2Zmc2V0XyArPSByZWFkOworICAgICAgICByZW1haW5pbmdfIC09IHJlYWQ7CisgICAgICAgIHJldHVybiByZWFkOwogICAgIH0KIAogICAgIHNpemVfdCBTaXplKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZGF0YV9sZW5ndGhfOyB9CkBAIC03NzAsMTEgKzcxNiwyMCBAQAogICAgIHNpemVfdCByZW1haW5pbmdfOwogfTsKIAotYm9vbCBDb3dSZWFkZXI6OlJlYWREYXRhKGNvbnN0IENvd09wZXJhdGlvbiYgb3AsIElCeXRlU2luayogc2luaykgewordWludDhfdCBDb3dSZWFkZXI6OkdldENvbXByZXNzaW9uVHlwZSgpIHsKKyAgICByZXR1cm4gaGVhZGVyXy5jb21wcmVzc2lvbl9hbGdvcml0aG07Cit9CisKK3NzaXplX3QgQ293UmVhZGVyOjpSZWFkRGF0YShjb25zdCBDb3dPcGVyYXRpb24qIG9wLCB2b2lkKiBidWZmZXIsIHNpemVfdCBidWZmZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaWdub3JlX2J5dGVzKSB7CiAgICAgc3RkOjp1bmlxdWVfcHRyPElEZWNvbXByZXNzb3I+IGRlY29tcHJlc3NvcjsKLSAgICBzd2l0Y2ggKG9wLmNvbXByZXNzaW9uKSB7CisgICAgY29uc3Qgc2l6ZV90IG9wX2J1Zl9zaXplID0gQ293T3BDb21wcmVzc2lvblNpemUob3AsIGhlYWRlcl8uYmxvY2tfc2l6ZSk7CisgICAgaWYgKCFvcF9idWZfc2l6ZSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDb21wcmVzc2lvbiBzaXplIGlzIHplcm8uIG9wOiAiIDw8ICpvcDsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBzd2l0Y2ggKEdldENvbXByZXNzaW9uVHlwZSgpKSB7CiAgICAgICAgIGNhc2Uga0Nvd0NvbXByZXNzTm9uZToKLSAgICAgICAgICAgIGRlY29tcHJlc3NvciA9IElEZWNvbXByZXNzb3I6OlVuY29tcHJlc3NlZCgpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2Uga0Nvd0NvbXByZXNzR3o6CiAgICAgICAgICAgICBkZWNvbXByZXNzb3IgPSBJRGVjb21wcmVzc29yOjpHeigpOwpAQCAtNzgyLDI0ICs3MzcsNDkgQEAKICAgICAgICAgY2FzZSBrQ293Q29tcHJlc3NCcm90bGk6CiAgICAgICAgICAgICBkZWNvbXByZXNzb3IgPSBJRGVjb21wcmVzc29yOjpCcm90bGkoKTsKICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtDb3dDb21wcmVzc1pzdGQ6CisgICAgICAgICAgICBpZiAob3BfYnVmX3NpemUgIT0gb3AtPmRhdGFfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgZGVjb21wcmVzc29yID0gSURlY29tcHJlc3Nvcjo6WnN0ZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2Uga0Nvd0NvbXByZXNzTHo0OgotICAgICAgICAgICAgZGVjb21wcmVzc29yID0gSURlY29tcHJlc3Nvcjo6THo0KCk7CisgICAgICAgICAgICBpZiAob3BfYnVmX3NpemUgIT0gb3AtPmRhdGFfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgZGVjb21wcmVzc29yID0gSURlY29tcHJlc3Nvcjo6THo0KCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlVua25vd24gY29tcHJlc3Npb24gdHlwZTogIiA8PCBvcC5jb21wcmVzc2lvbjsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlVua25vd24gY29tcHJlc3Npb24gdHlwZTogIiA8PCBHZXRDb21wcmVzc2lvblR5cGUoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKICAgICB1aW50NjRfdCBvZmZzZXQ7Ci0gICAgaWYgKG9wLnR5cGUgPT0ga0Nvd1hvck9wKSB7Ci0gICAgICAgIG9mZnNldCA9IGRhdGFfbG9jXy0+YXQob3AubmV3X2Jsb2NrKTsKKyAgICBpZiAob3AtPnR5cGUoKSA9PSBrQ293WG9yT3ApIHsKKyAgICAgICAgb2Zmc2V0ID0geG9yX2RhdGFfbG9jXy0+YXQob3AtPm5ld19ibG9jayk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgb2Zmc2V0ID0gb3Auc291cmNlOworICAgICAgICBvZmZzZXQgPSBvcC0+c291cmNlKCk7CiAgICAgfQotICAgIENvd0RhdGFTdHJlYW0gc3RyZWFtKHRoaXMsIG9mZnNldCwgb3AuZGF0YV9sZW5ndGgpOworICAgIGlmICghZGVjb21wcmVzc29yIHx8CisgICAgICAgICgob3AtPmRhdGFfbGVuZ3RoID09IG9wX2J1Zl9zaXplKSAmJiAoaGVhZGVyXy5wcmVmaXgubWFqb3JfdmVyc2lvbiA9PSAzKSkpIHsKKyAgICAgICAgQ293RGF0YVN0cmVhbSBzdHJlYW0odGhpcywgb2Zmc2V0ICsgaWdub3JlX2J5dGVzLCBvcC0+ZGF0YV9sZW5ndGggLSBpZ25vcmVfYnl0ZXMpOworICAgICAgICByZXR1cm4gc3RyZWFtLlJlYWRGdWxseShidWZmZXIsIGJ1ZmZlcl9zaXplKTsKKyAgICB9CisKKyAgICBDb3dEYXRhU3RyZWFtIHN0cmVhbSh0aGlzLCBvZmZzZXQsIG9wLT5kYXRhX2xlbmd0aCk7CiAgICAgZGVjb21wcmVzc29yLT5zZXRfc3RyZWFtKCZzdHJlYW0pOwotICAgIGRlY29tcHJlc3Nvci0+c2V0X3Npbmsoc2luayk7Ci0gICAgcmV0dXJuIGRlY29tcHJlc3Nvci0+RGVjb21wcmVzcyhoZWFkZXJfLmJsb2NrX3NpemUpOworICAgIHJldHVybiBkZWNvbXByZXNzb3ItPkRlY29tcHJlc3MoYnVmZmVyLCBidWZmZXJfc2l6ZSwgb3BfYnVmX3NpemUsIGlnbm9yZV9ieXRlcyk7Cit9CisKK2Jvb2wgQ293UmVhZGVyOjpHZXRTb3VyY2VPZmZzZXQoY29uc3QgQ293T3BlcmF0aW9uKiBvcCwgdWludDY0X3QqIHNvdXJjZV9vZmZzZXQpIHsKKyAgICBzd2l0Y2ggKG9wLT50eXBlKCkpIHsKKyAgICAgICAgY2FzZSBrQ293Q29weU9wOgorICAgICAgICAgICAgKnNvdXJjZV9vZmZzZXQgPSBvcC0+c291cmNlKCkgKiBoZWFkZXJfLmJsb2NrX3NpemU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBrQ293WG9yT3A6CisgICAgICAgICAgICAqc291cmNlX29mZnNldCA9IG9wLT5zb3VyY2UoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIH0KIAogfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90CmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L2NyZWF0ZV9jb3cuY3BwIGIvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9jcmVhdGVfY293LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDk3YjcyCi0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9jcmVhdGVfY293LmNwcApAQCAtMCwwICsxLDUwOSBAQAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGZ1dHVyZT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgorI2luY2x1ZGUgPGV4dDRfdXRpbHMvZXh0NF91dGlscy5oPgorI2luY2x1ZGUgPHN0b3JhZ2VfbGl0ZXJhbHMvc3RvcmFnZV9saXRlcmFscy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2Nocm9ub191dGlscy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zY29wZWd1YXJkLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KKworI2luY2x1ZGUgPGdmbGFncy9nZmxhZ3MuaD4KKyNpbmNsdWRlIDxsaWJzbmFwc2hvdC9jb3dfd3JpdGVyLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL3NoYS5oPgorCitERUZJTkVfc3RyaW5nKHNvdXJjZSwgIiIsICJTb3VyY2UgcGFydGl0aW9uIGltYWdlIik7CitERUZJTkVfc3RyaW5nKHRhcmdldCwgIiIsICJUYXJnZXQgcGFydGl0aW9uIGltYWdlIik7CitERUZJTkVfc3RyaW5nKGNvbXByZXNzaW9uLCAibHo0IiwKKyAgICAgICAgICAgICAgIkNvbXByZXNzaW9uIGFsZ29yaXRobS4gRGVmYXVsdCBpcyBzZXQgdG8gbHo0LiBBdmFpbGFibGUgb3B0aW9uczogbHo0LCB6c3RkLCBneiIpOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugc25hcHNob3QgeworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6c3RvcmFnZV9saXRlcmFsczsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOworCit1c2luZyBhbmRyb2lkOjpzbmFwc2hvdDo6Q3JlYXRlQ293V3JpdGVyOwordXNpbmcgYW5kcm9pZDo6c25hcHNob3Q6OklDb3dXcml0ZXI7CisKK2NsYXNzIENyZWF0ZVNuYXBzaG90IHsKKyAgcHVibGljOgorICAgIENyZWF0ZVNuYXBzaG90KGNvbnN0IHN0ZDo6c3RyaW5nJiBzcmNfZmlsZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldF9maWxlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRjaF9maWxlLCBjb25zdCBzdGQ6OnN0cmluZyYgY29tcHJlc3Npb24pOworICAgIGJvb2wgQ3JlYXRlU25hcHNob3RQYXRjaCgpOworCisgIHByaXZhdGU6CisgICAgLyogc291cmNlLmltZyAqLworICAgIHN0ZDo6c3RyaW5nIHNyY19maWxlXzsKKyAgICAvKiB0YXJnZXQuaW1nICovCisgICAgc3RkOjpzdHJpbmcgdGFyZ2V0X2ZpbGVfOworICAgIC8qIHNuYXBzaG90LXBhdGNoIGdlbmVyYXRlZCAqLworICAgIHN0ZDo6c3RyaW5nIHBhdGNoX2ZpbGVfOworCisgICAgLyoKKyAgICAgKiBBY3RpdmUgZmlsZSB3aGljaCBpcyBiZWluZyBwYXJzZWQgYnkgdGhpcyBpbnN0YW5jZS4KKyAgICAgKiBJdCB3aWxsIGVpdGhlciBiZSBzb3VyY2UuaW1nIG9yIHRhcmdldC5pbWcuCisgICAgICovCisgICAgc3RkOjpzdHJpbmcgcGFyc2luZ19maWxlXzsKKyAgICBib29sIGNyZWF0ZV9zbmFwc2hvdF9wYXRjaF8gPSBmYWxzZTsKKworICAgIGNvbnN0IGludCBrTnVtVGhyZWFkcyA9IDY7CisgICAgY29uc3Qgc2l6ZV90IGtCbG9ja1NpemVUb1JlYWQgPSAxX01pQjsKKyAgICBjb25zdCBzaXplX3QgY29tcHJlc3Npb25fZmFjdG9yXyA9IDY0X0tpQjsKKyAgICBzaXplX3QgcmVwbGFjZV9vcHNfID0gMCwgY29weV9vcHNfID0gMCwgemVyb19vcHNfID0gMCwgaW5fcGxhY2Vfb3BzXyA9IDA7CisKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIGludD4gc291cmNlX2Jsb2NrX2hhc2hfOworICAgIHN0ZDo6bXV0ZXggc291cmNlX2Jsb2NrX2hhc2hfbG9ja187CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SUNvd1dyaXRlcj4gd3JpdGVyXzsKKyAgICBzdGQ6Om11dGV4IHdyaXRlX2xvY2tfOworCisgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gemJsb2NrXzsKKworICAgIHN0ZDo6c3RyaW5nIGNvbXByZXNzaW9uXyA9ICJsejQiOworICAgIHVuaXF1ZV9mZCBjb3dfZmRfOworICAgIHVuaXF1ZV9mZCB0YXJnZXRfZmRfOworCisgICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IHplcm9fYmxvY2tzXzsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gcmVwbGFjZV9ibG9ja3NfOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50NjRfdCwgdWludDY0X3Q+IGNvcHlfYmxvY2tzXzsKKworICAgIGNvbnN0IGludCBCTE9DS19TWiA9IDRfS2lCOworICAgIHZvaWQgU0hBMjU2KGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBsZW5ndGgsIHVpbnQ4X3Qgb3V0WzMyXSk7CisgICAgYm9vbCBJc0Jsb2NrQWxpZ25lZCh1aW50NjRfdCByZWFkX3NpemUpIHsgcmV0dXJuICgocmVhZF9zaXplICYgKEJMT0NLX1NaIC0gMSkpID09IDApOyB9CisgICAgYm9vbCBSZWFkQmxvY2tzKG9mZl90IG9mZnNldCwgY29uc3QgaW50IHNraXBfYmxvY2tzLCBjb25zdCB1aW50NjRfdCBkZXZfc3opOworICAgIHN0ZDo6c3RyaW5nIFRvSGV4U3RyaW5nKGNvbnN0IHVpbnQ4X3QqIGJ1Ziwgc2l6ZV90IGxlbik7CisKKyAgICBib29sIENyZWF0ZVNuYXBzaG90RmlsZSgpOworICAgIGJvb2wgRmluZFNvdXJjZUJsb2NrSGFzaCgpOworICAgIGJvb2wgUHJlcGFyZVBhcnNlKHN0ZDo6c3RyaW5nJiBwYXJzaW5nX2ZpbGUsIGNvbnN0IGJvb2wgY3JlYXRlU25hcHNob3QpOworICAgIGJvb2wgUGFyc2VQYXJ0aXRpb24oKTsKKyAgICB2b2lkIFByZXBhcmVNZXJnZUJsb2NrKGNvbnN0IHZvaWQqIGJ1ZmZlciwgdWludDY0X3QgYmxvY2ssIHN0ZDo6c3RyaW5nJiBibG9ja19oYXNoKTsKKyAgICBib29sIFdyaXRlVjNTbmFwc2hvdHMoKTsKKyAgICBzaXplX3QgUHJlcGFyZVdyaXRlKHNpemVfdCogcGVuZGluZ19vcHMsIHNpemVfdCBzdGFydF9pbmRleCk7CisKKyAgICBib29sIENyZWF0ZVNuYXBzaG90V3JpdGVyKCk7CisgICAgYm9vbCBXcml0ZU9yZGVyZWRTbmFwc2hvdHMoKTsKKyAgICBib29sIFdyaXRlTm9uT3JkZXJlZFNuYXBzaG90cygpOworICAgIGJvb2wgVmVyaWZ5TWVyZ2VPcmRlcigpOworfTsKKwordm9pZCBDcmVhdGVTbmFwc2hvdExvZ2dlcihhbmRyb2lkOjpiYXNlOjpMb2dJZCwgYW5kcm9pZDo6YmFzZTo6TG9nU2V2ZXJpdHkgc2V2ZXJpdHksIGNvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwgdW5zaWduZWQgaW50LCBjb25zdCBjaGFyKiBtZXNzYWdlKSB7CisgICAgaWYgKHNldmVyaXR5ID09IGFuZHJvaWQ6OmJhc2U6OkVSUk9SKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIG1lc3NhZ2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiJXNcbiIsIG1lc3NhZ2UpOworICAgIH0KK30KKworQ3JlYXRlU25hcHNob3Q6OkNyZWF0ZVNuYXBzaG90KGNvbnN0IHN0ZDo6c3RyaW5nJiBzcmNfZmlsZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRjaF9maWxlLCBjb25zdCBzdGQ6OnN0cmluZyYgY29tcHJlc3Npb24pCisgICAgOiBzcmNfZmlsZV8oc3JjX2ZpbGUpLCB0YXJnZXRfZmlsZV8odGFyZ2V0X2ZpbGUpLCBwYXRjaF9maWxlXyhwYXRjaF9maWxlKSB7CisgICAgaWYgKCFjb21wcmVzc2lvbi5lbXB0eSgpKSB7CisgICAgICAgIGNvbXByZXNzaW9uXyA9IGNvbXByZXNzaW9uOworICAgIH0KK30KKworYm9vbCBDcmVhdGVTbmFwc2hvdDo6UHJlcGFyZVBhcnNlKHN0ZDo6c3RyaW5nJiBwYXJzaW5nX2ZpbGUsIGNvbnN0IGJvb2wgY3JlYXRlU25hcHNob3QpIHsKKyAgICBwYXJzaW5nX2ZpbGVfID0gcGFyc2luZ19maWxlOworICAgIGNyZWF0ZV9zbmFwc2hvdF9wYXRjaF8gPSBjcmVhdGVTbmFwc2hvdDsKKworICAgIGlmIChjcmVhdGVTbmFwc2hvdCkgeworICAgICAgICBjb3dfZmRfLnJlc2V0KG9wZW4ocGF0Y2hfZmlsZV8uY19zdHIoKSwgT19SRFdSIHwgT19DUkVBVCB8IE9fVFJVTkMsIDA2NjYpKTsKKyAgICAgICAgaWYgKGNvd19mZF8gPCAwKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG9wZW4gdGhlIHNuYXBzaG90LXBhdGNoIGZpbGU6ICIgPDwgcGF0Y2hfZmlsZV87CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB0YXJnZXRfZmRfLnJlc2V0KChvcGVuKHBhcnNpbmdfZmlsZV8uY19zdHIoKSwgT19SRE9OTFkpKSk7CisgICAgICAgIGlmICh0YXJnZXRfZmRfIDwgMCkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAib3BlbiBmYWlsZWQ6ICIgPDwgcGFyc2luZ19maWxlXzsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB6YmxvY2tfID0gc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KEJMT0NLX1NaKTsKKyAgICAgICAgc3RkOjptZW1zZXQoemJsb2NrXy5nZXQoKSwgMCwgQkxPQ0tfU1opOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIENyZWF0ZSBwZXItYmxvY2sgc2hhMjU2IGhhc2ggb2Ygc291cmNlIHBhcnRpdGlvbgorICovCitib29sIENyZWF0ZVNuYXBzaG90OjpGaW5kU291cmNlQmxvY2tIYXNoKCkgeworICAgIGlmICghUHJlcGFyZVBhcnNlKHNyY19maWxlXywgZmFsc2UpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIFBhcnNlUGFydGl0aW9uKCk7Cit9CisKKy8qCisgKiBDcmVhdGUgc25hcHNob3QgZmlsZSBieSBjb21wYXJpbmcgc2hhMjU2IHBlciBibG9jaworICogb2YgdGFyZ2V0LmltZyB3aXRoIHRoZSBjb25zdHJ1Y3RlZCBwZXItYmxvY2sgc2hhMjU2IGhhc2gKKyAqIG9mIHNvdXJjZSBwYXJ0aXRpb24uCisgKi8KK2Jvb2wgQ3JlYXRlU25hcHNob3Q6OkNyZWF0ZVNuYXBzaG90RmlsZSgpIHsKKyAgICBpZiAoIVByZXBhcmVQYXJzZSh0YXJnZXRfZmlsZV8sIHRydWUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIFBhcnNlUGFydGl0aW9uKCk7Cit9CisKKy8qCisgKiBDcmVhdGVzIHNuYXBzaG90IHBhdGNoIGZpbGUgYnkgY29tcGFyaW5nIHNvdXJjZS5pbWcgYW5kIHRhcmdldC5pbWcKKyAqLworYm9vbCBDcmVhdGVTbmFwc2hvdDo6Q3JlYXRlU25hcHNob3RQYXRjaCgpIHsKKyAgICBpZiAoIUZpbmRTb3VyY2VCbG9ja0hhc2goKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBDcmVhdGVTbmFwc2hvdEZpbGUoKTsKK30KKwordm9pZCBDcmVhdGVTbmFwc2hvdDo6U0hBMjU2KGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBsZW5ndGgsIHVpbnQ4X3Qgb3V0WzMyXSkgeworICAgIFNIQTI1Nl9DVFggYzsKKyAgICBTSEEyNTZfSW5pdCgmYyk7CisgICAgU0hBMjU2X1VwZGF0ZSgmYywgZGF0YSwgbGVuZ3RoKTsKKyAgICBTSEEyNTZfRmluYWwob3V0LCAmYyk7Cit9CisKK3N0ZDo6c3RyaW5nIENyZWF0ZVNuYXBzaG90OjpUb0hleFN0cmluZyhjb25zdCB1aW50OF90KiBidWYsIHNpemVfdCBsZW4pIHsKKyAgICBjaGFyIGxvb2t1cFtdID0gIjAxMjM0NTY3ODlhYmNkZWYiOworICAgIHN0ZDo6c3RyaW5nIG91dChsZW4gKiAyICsgMSwgJ1wwJyk7CisgICAgY2hhciogb3V0cCA9IG91dC5kYXRhKCk7CisgICAgZm9yICg7IGxlbiA+IDA7IGxlbi0tLCBidWYrKykgeworICAgICAgICAqb3V0cCsrID0gKGNoYXIpbG9va3VwWypidWYgPj4gNF07CisgICAgICAgICpvdXRwKysgPSAoY2hhcilsb29rdXBbKmJ1ZiAmIDB4Zl07CisgICAgfQorICAgIHJldHVybiBvdXQ7Cit9CisKK3ZvaWQgQ3JlYXRlU25hcHNob3Q6OlByZXBhcmVNZXJnZUJsb2NrKGNvbnN0IHZvaWQqIGJ1ZmZlciwgdWludDY0X3QgYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyYgYmxvY2tfaGFzaCkgeworICAgIGlmIChzdGQ6Om1lbWNtcCh6YmxvY2tfLmdldCgpLCBidWZmZXIsIEJMT0NLX1NaKSA9PSAwKSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHdyaXRlX2xvY2tfKTsKKyAgICAgICAgemVyb19ibG9ja3NfLnB1c2hfYmFjayhibG9jayk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvIGl0ZXIgPSBzb3VyY2VfYmxvY2tfaGFzaF8uZmluZChibG9ja19oYXNoKTsKKyAgICBpZiAoaXRlciAhPSBzb3VyY2VfYmxvY2tfaGFzaF8uZW5kKCkpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sod3JpdGVfbG9ja18pOworICAgICAgICAvLyBJbi1wbGFjZSBjb3B5IGlzIHNraXBwZWQKKyAgICAgICAgaWYgKGJsb2NrICE9IGl0ZXItPnNlY29uZCkgeworICAgICAgICAgICAgY29weV9ibG9ja3NfW2Jsb2NrXSA9IGl0ZXItPnNlY29uZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGluX3BsYWNlX29wc18gKz0gMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHdyaXRlX2xvY2tfKTsKKyAgICByZXBsYWNlX2Jsb2Nrc18ucHVzaF9iYWNrKGJsb2NrKTsKK30KKworc2l6ZV90IENyZWF0ZVNuYXBzaG90OjpQcmVwYXJlV3JpdGUoc2l6ZV90KiBwZW5kaW5nX29wcywgc2l6ZV90IHN0YXJ0X2luZGV4KSB7CisgICAgc2l6ZV90IG51bV9vcHMgPSAqcGVuZGluZ19vcHM7CisgICAgdWludDY0X3Qgc3RhcnRfYmxvY2sgPSByZXBsYWNlX2Jsb2Nrc19bc3RhcnRfaW5kZXhdOworICAgIHNpemVfdCBucl9jb25zZWN1dGl2ZSA9IDE7CisgICAgbnVtX29wcyAtPSAxOworICAgIHdoaWxlIChudW1fb3BzKSB7CisgICAgICAgIHVpbnQ2NF90IG5leHRfYmxvY2sgPSByZXBsYWNlX2Jsb2Nrc19bc3RhcnRfaW5kZXggKyBucl9jb25zZWN1dGl2ZV07CisgICAgICAgIGlmIChuZXh0X2Jsb2NrICE9IHN0YXJ0X2Jsb2NrICsgbnJfY29uc2VjdXRpdmUpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG5yX2NvbnNlY3V0aXZlICs9IDE7CisgICAgICAgIG51bV9vcHMgLT0gMTsKKyAgICB9CisgICAgcmV0dXJuIG5yX2NvbnNlY3V0aXZlOworfQorCitib29sIENyZWF0ZVNuYXBzaG90OjpDcmVhdGVTbmFwc2hvdFdyaXRlcigpIHsKKyAgICB1aW50NjRfdCBkZXZfc3ogPSBsc2Vlayh0YXJnZXRfZmRfLmdldCgpLCAwLCBTRUVLX0VORCk7CisgICAgQ293T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMuY29tcHJlc3Npb24gPSBjb21wcmVzc2lvbl87CisgICAgb3B0aW9ucy5udW1fY29tcHJlc3NfdGhyZWFkcyA9IDI7CisgICAgb3B0aW9ucy5iYXRjaF93cml0ZSA9IHRydWU7CisgICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDYwMDsKKyAgICBvcHRpb25zLmNvbXByZXNzaW9uX2ZhY3RvciA9IGNvbXByZXNzaW9uX2ZhY3Rvcl87CisgICAgb3B0aW9ucy5tYXhfYmxvY2tzID0ge2Rldl9zeiAvIG9wdGlvbnMuYmxvY2tfc2l6ZX07CisgICAgd3JpdGVyXyA9IENyZWF0ZUNvd1dyaXRlcigzLCBvcHRpb25zLCBzdGQ6Om1vdmUoY293X2ZkXykpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIENyZWF0ZVNuYXBzaG90OjpXcml0ZU5vbk9yZGVyZWRTbmFwc2hvdHMoKSB7CisgICAgemVyb19vcHNfID0gemVyb19ibG9ja3NfLnNpemUoKTsKKyAgICBmb3IgKGF1dG8gaXQgPSB6ZXJvX2Jsb2Nrc18uYmVnaW4oKTsgaXQgIT0gemVyb19ibG9ja3NfLmVuZCgpOyBpdCsrKSB7CisgICAgICAgIGlmICghd3JpdGVyXy0+QWRkWmVyb0Jsb2NrcygqaXQsIDEpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RkOjpzdHJpbmcgYnVmZmVyKGNvbXByZXNzaW9uX2ZhY3Rvcl8sICdcMCcpOworCisgICAgcmVwbGFjZV9vcHNfID0gcmVwbGFjZV9ibG9ja3NfLnNpemUoKTsKKyAgICBzaXplX3QgYmxvY2tzX3RvX2NvbXByZXNzID0gcmVwbGFjZV9ibG9ja3NfLnNpemUoKTsKKyAgICBzaXplX3QgbnVtX29wcyA9IDA7CisgICAgc2l6ZV90IGJsb2NrX2luZGV4ID0gMDsKKyAgICB3aGlsZSAoYmxvY2tzX3RvX2NvbXByZXNzKSB7CisgICAgICAgIG51bV9vcHMgPSBzdGQ6Om1pbigoY29tcHJlc3Npb25fZmFjdG9yXyAvIEJMT0NLX1NaKSwgYmxvY2tzX3RvX2NvbXByZXNzKTsKKyAgICAgICAgYXV0byBsaW5lYXJfYmxvY2tzID0gUHJlcGFyZVdyaXRlKCZudW1fb3BzLCBibG9ja19pbmRleCk7CisgICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhZEZ1bGx5QXRPZmZzZXQodGFyZ2V0X2ZkXy5nZXQoKSwgYnVmZmVyLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGluZWFyX2Jsb2NrcyAqIEJMT0NLX1NaKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlX2Jsb2Nrc19bYmxvY2tfaW5kZXhdICogQkxPQ0tfU1opKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcmVhZCBhdCBvZmZzZXQ6ICIgPDwgcmVwbGFjZV9ibG9ja3NfW2Jsb2NrX2luZGV4XSAqIEJMT0NLX1NaCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgc2l6ZTogIiA8PCBsaW5lYXJfYmxvY2tzICogQkxPQ0tfU1o7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF3cml0ZXJfLT5BZGRSYXdCbG9ja3MocmVwbGFjZV9ibG9ja3NfW2Jsb2NrX2luZGV4XSwgYnVmZmVyLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWFyX2Jsb2NrcyAqIEJMT0NLX1NaKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQWRkUmF3QmxvY2tzIGZhaWxlZCI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBibG9ja19pbmRleCArPSBsaW5lYXJfYmxvY2tzOworICAgICAgICBibG9ja3NfdG9fY29tcHJlc3MgLT0gbGluZWFyX2Jsb2NrczsKKyAgICB9CisgICAgaWYgKCF3cml0ZXJfLT5GaW5hbGl6ZSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ3JlYXRlU25hcHNob3Q6OldyaXRlT3JkZXJlZFNuYXBzaG90cygpIHsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDY0X3QsIHVpbnQ2NF90PiBvdmVyd3JpdHRlbl9ibG9ja3M7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHVpbnQ2NF90LCB1aW50NjRfdD4+IG1lcmdlX3NlcXVlbmNlOworICAgIGZvciAoYXV0byBpdCA9IGNvcHlfYmxvY2tzXy5iZWdpbigpOyBpdCAhPSBjb3B5X2Jsb2Nrc18uZW5kKCk7IGl0KyspIHsKKyAgICAgICAgaWYgKG92ZXJ3cml0dGVuX2Jsb2Nrcy5jb3VudChpdC0+c2Vjb25kKSkgeworICAgICAgICAgICAgcmVwbGFjZV9ibG9ja3NfLnB1c2hfYmFjayhpdC0+Zmlyc3QpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgb3ZlcndyaXR0ZW5fYmxvY2tzW2l0LT5maXJzdF0gPSBpdC0+c2Vjb25kOworICAgICAgICBtZXJnZV9zZXF1ZW5jZS5lbXBsYWNlX2JhY2soc3RkOjptYWtlX3BhaXIoaXQtPmZpcnN0LCBpdC0+c2Vjb25kKSk7CisgICAgfQorICAgIC8vIFNvcnQgdGhlIGJsb2NrcyBzbyB0aGF0IGlmIHRoZSBibG9ja3MgYXJlIGNvbnRpZ3VvdXMsIGl0IHdvdWxkIGhlbHAKKyAgICAvLyBjb21wcmVzcyBtdWx0aXBsZSBibG9ja3MgaW4gb25lIHNob3QgYmFzZWQgb24gdGhlIGNvbXByZXNzaW9uIGZhY3Rvci4KKyAgICBzdGQ6OnNvcnQocmVwbGFjZV9ibG9ja3NfLmJlZ2luKCksIHJlcGxhY2VfYmxvY2tzXy5lbmQoKSk7CisKKyAgICBjb3B5X29wc18gPSBtZXJnZV9zZXF1ZW5jZS5zaXplKCk7CisgICAgZm9yIChhdXRvIGl0ID0gbWVyZ2Vfc2VxdWVuY2UuYmVnaW4oKTsgaXQgIT0gbWVyZ2Vfc2VxdWVuY2UuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgaWYgKCF3cml0ZXJfLT5BZGRDb3B5KGl0LT5maXJzdCwgaXQtPnNlY29uZCwgMSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIENyZWF0ZVNuYXBzaG90OjpWZXJpZnlNZXJnZU9yZGVyKCkgeworICAgIHVuaXF1ZV9mZCByZWFkX2ZkOworICAgIHJlYWRfZmQucmVzZXQob3BlbihwYXRjaF9maWxlXy5jX3N0cigpLCBPX1JET05MWSkpOworICAgIGlmIChyZWFkX2ZkIDwgMCkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG9wZW4gdGhlIHNuYXBzaG90LXBhdGNoIGZpbGU6ICIgPDwgcGF0Y2hfZmlsZV87CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQ293UmVhZGVyIHJlYWRlcjsKKyAgICBpZiAoIXJlYWRlci5QYXJzZShyZWFkX2ZkKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJQYXJzZSBmYWlsZWQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFyZWFkZXIuVmVyaWZ5TWVyZ2VPcHMoKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJNZXJnZU9wcyBPcmRlciBpcyB3cm9uZyI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ3JlYXRlU25hcHNob3Q6OldyaXRlVjNTbmFwc2hvdHMoKSB7CisgICAgaWYgKCFDcmVhdGVTbmFwc2hvdFdyaXRlcigpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFXcml0ZU9yZGVyZWRTbmFwc2hvdHMoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghV3JpdGVOb25PcmRlcmVkU25hcHNob3RzKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIVZlcmlmeU1lcmdlT3JkZXIoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgTE9HKElORk8pIDw8ICJJbi1wbGFjZTogIiA8PCBpbl9wbGFjZV9vcHNfIDw8ICIgWmVybzogIiA8PCB6ZXJvX29wc18KKyAgICAgICAgICAgICAgPDwgIiBSZXBsYWNlOiAiIDw8IHJlcGxhY2Vfb3BzXyA8PCAiIGNvcHk6ICIgPDwgY29weV9vcHNfOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIENyZWF0ZVNuYXBzaG90OjpSZWFkQmxvY2tzKG9mZl90IG9mZnNldCwgY29uc3QgaW50IHNraXBfYmxvY2tzLCBjb25zdCB1aW50NjRfdCBkZXZfc3opIHsKKyAgICB1bmlxdWVfZmQgZmQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4ocGFyc2luZ19maWxlXy5jX3N0cigpLCBPX1JET05MWSkpKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIm9wZW4gZmFpbGVkOiAiIDw8IHBhcnNpbmdfZmlsZV87CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBsb2ZmX3QgZmlsZV9vZmZzZXQgPSBvZmZzZXQ7CisgICAgY29uc3QgdWludDY0X3QgcmVhZF9zeiA9IGtCbG9ja1NpemVUb1JlYWQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gYnVmZmVyID0gc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KHJlYWRfc3opOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgc2l6ZV90IHRvX3JlYWQgPSBzdGQ6Om1pbigoZGV2X3N6IC0gZmlsZV9vZmZzZXQpLCByZWFkX3N6KTsKKworICAgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseUF0T2Zmc2V0KGZkLmdldCgpLCBidWZmZXIuZ2V0KCksIHRvX3JlYWQsIGZpbGVfb2Zmc2V0KSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlYWQgYmxvY2sgZnJvbSBibG9jayBkZXZpY2U6ICIgPDwgcGFyc2luZ19maWxlXworICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGF0IG9mZnNldDogIiA8PCBmaWxlX29mZnNldCA8PCAiIHJlYWQtc2l6ZTogIiA8PCB0b19yZWFkCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgYmxvY2stc2l6ZTogIiA8PCBkZXZfc3o7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIUlzQmxvY2tBbGlnbmVkKHRvX3JlYWQpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJ1bmFibGUgdG8gcGFyc2UgdGhlIHVuLWFsaWduZWQgcmVxdWVzdDogIiA8PCB0b19yZWFkOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IG51bV9ibG9ja3MgPSB0b19yZWFkIC8gQkxPQ0tfU1o7CisgICAgICAgIHVpbnQ2NF90IGJ1ZmZlcl9vZmZzZXQgPSAwOworICAgICAgICBvZmZfdCBmb2Zmc2V0ID0gZmlsZV9vZmZzZXQ7CisKKyAgICAgICAgd2hpbGUgKG51bV9ibG9ja3MpIHsKKyAgICAgICAgICAgIGNvbnN0IHZvaWQqIGJ1ZnB0ciA9IChjaGFyKilidWZmZXIuZ2V0KCkgKyBidWZmZXJfb2Zmc2V0OworICAgICAgICAgICAgdWludDY0X3QgYmxraW5kZXggPSBmb2Zmc2V0IC8gQkxPQ0tfU1o7CisKKyAgICAgICAgICAgIHVpbnQ4X3QgY2hlY2tzdW1bMzJdOworICAgICAgICAgICAgU0hBMjU2KGJ1ZnB0ciwgQkxPQ0tfU1osIGNoZWNrc3VtKTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGhhc2ggPSBUb0hleFN0cmluZyhjaGVja3N1bSwgc2l6ZW9mKGNoZWNrc3VtKSk7CisKKyAgICAgICAgICAgIGlmIChjcmVhdGVfc25hcHNob3RfcGF0Y2hfKSB7CisgICAgICAgICAgICAgICAgUHJlcGFyZU1lcmdlQmxvY2soYnVmcHRyLCBibGtpbmRleCwgaGFzaCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHNvdXJjZV9ibG9ja19oYXNoX2xvY2tfKTsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VfYmxvY2tfaGFzaF8uY291bnQoaGFzaCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlX2Jsb2NrX2hhc2hfW2hhc2hdID0gYmxraW5kZXg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXJfb2Zmc2V0ICs9IEJMT0NLX1NaOworICAgICAgICAgICAgZm9mZnNldCArPSBCTE9DS19TWjsKKyAgICAgICAgICAgIG51bV9ibG9ja3MgLT0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbGVfb2Zmc2V0ICs9IChza2lwX2Jsb2NrcyAqIHRvX3JlYWQpOworICAgICAgICBpZiAoZmlsZV9vZmZzZXQgPj0gZGV2X3N6KSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIENyZWF0ZVNuYXBzaG90OjpQYXJzZVBhcnRpdGlvbigpIHsKKyAgICB1bmlxdWVfZmQgZmQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4ocGFyc2luZ19maWxlXy5jX3N0cigpLCBPX1JET05MWSkpKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIm9wZW4gZmFpbGVkOiAiIDw8IHBhcnNpbmdfZmlsZV87CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1aW50NjRfdCBkZXZfc3ogPSBsc2VlayhmZC5nZXQoKSwgMCwgU0VFS19FTkQpOworICAgIGlmICghZGV2X3N6KSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBkZXRlcm1pbmUgYmxvY2sgZGV2aWNlIHNpemU6ICIgPDwgcGFyc2luZ19maWxlXzsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghSXNCbG9ja0FsaWduZWQoZGV2X3N6KSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJkZXZfc3o6ICIgPDwgZGV2X3N6IDw8ICIgaXMgbm90IGJsb2NrIGFsaWduZWQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50IG51bV90aHJlYWRzID0ga051bVRocmVhZHM7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OmZ1dHVyZTxib29sPj4gdGhyZWFkczsKKyAgICBvZmZfdCBzdGFydF9vZmZzZXQgPSAwOworICAgIGNvbnN0IGludCBza2lwX2Jsb2NrcyA9IG51bV90aHJlYWRzOworCisgICAgd2hpbGUgKG51bV90aHJlYWRzKSB7CisgICAgICAgIHRocmVhZHMuZW1wbGFjZV9iYWNrKHN0ZDo6YXN5bmMoc3RkOjpsYXVuY2g6OmFzeW5jLCAmQ3JlYXRlU25hcHNob3Q6OlJlYWRCbG9ja3MsIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfb2Zmc2V0LCBza2lwX2Jsb2NrcywgZGV2X3N6KSk7CisgICAgICAgIHN0YXJ0X29mZnNldCArPSBrQmxvY2tTaXplVG9SZWFkOworICAgICAgICBudW1fdGhyZWFkcyAtPSAxOworICAgICAgICBpZiAoc3RhcnRfb2Zmc2V0ID49IGRldl9zeikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIHJldCA9IHRydWU7CisgICAgZm9yIChhdXRvJiB0IDogdGhyZWFkcykgeworICAgICAgICByZXQgPSB0LmdldCgpICYmIHJldDsKKyAgICB9CisKKyAgICBpZiAocmV0ICYmIGNyZWF0ZV9zbmFwc2hvdF9wYXRjaF8gJiYgIVdyaXRlVjNTbmFwc2hvdHMoKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJTbmFwc2hvdCBXcml0ZSBmYWlsZWQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitjb25zdGV4cHIgY2hhciBrVXNhZ2VbXSA9IFIiKAorTkFNRQorICAgIGNyZWF0ZV9zbmFwc2hvdCAtIENyZWF0ZSBzbmFwc2hvdCBwYXRjaGVzIGJ5IGNvbXBhcmluZyB0d28gcGFydGl0aW9uIGltYWdlcworCitTWU5PUFNJUworICAgIGNyZWF0ZV9zbmFwc2hvdCAtLXNvdXJjZT08c291cmNlLmltZz4gLS10YXJnZXQ9PHRhcmdldC5pbWc+IC0tY29tcHJlc3Npb249Ijxjb21wcmVzc2lvbi1hbGdvcml0aG0iCisKKyAgICBzb3VyY2UuaW1nIC0+IFNvdXJjZSBwYXJ0aXRpb24gaW1hZ2UKKyAgICB0YXJnZXQuaW1nIC0+IFRhcmdldCBwYXJ0aXRpb24gaW1hZ2UKKyAgICBjb21wcmVzc29pbiAtPiBjb21wcmVzc2lvbiBhbGdvcml0aG0uIERlZmF1bHQgc2V0IHRvIGx6NC4gU3VwcG9ydGVkIHR5cGVzIGFyZSBneiwgbHo0LCB6c3RkLgorCitFWEFNUExFUworCisgICAkIGNyZWF0ZV9zbmFwc2hvdCAkU09VUkNFX0JVSUxEL3N5c3RlbS5pbWcgJFRBUkdFVF9CVUlMRC9zeXN0ZW0uaW1nCisgICAkIGNyZWF0ZV9zbmFwc2hvdCAkU09VUkNFX0JVSUxEL3Byb2R1Y3QuaW1nICRUQVJHRVRfQlVJTEQvcHJvZHVjdC5pbWcgLS1jb21wcmVzc2lvbj0ienN0ZCIKKworKSI7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgICBhbmRyb2lkOjpiYXNlOjpJbml0TG9nZ2luZyhhcmd2LCAmYW5kcm9pZDo6c25hcHNob3Q6OkNyZWF0ZVNuYXBzaG90TG9nZ2VyKTsKKyAgICA6OmdmbGFnczo6U2V0VXNhZ2VNZXNzYWdlKGtVc2FnZSk7CisgICAgOjpnZmxhZ3M6OlBhcnNlQ29tbWFuZExpbmVGbGFncygmYXJnYywgJmFyZ3YsIHRydWUpOworCisgICAgaWYgKEZMQUdTX3NvdXJjZS5lbXB0eSgpIHx8IEZMQUdTX3RhcmdldC5lbXB0eSgpKSB7CisgICAgICAgIExPRyhJTkZPKSA8PCBrVXNhZ2U7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGZuYW1lID0gYW5kcm9pZDo6YmFzZTo6QmFzZW5hbWUoRkxBR1NfdGFyZ2V0LmNfc3RyKCkpOworICAgIGF1dG8gcGFydHMgPSBhbmRyb2lkOjpiYXNlOjpTcGxpdChmbmFtZSwgIi4iKTsKKyAgICBzdGQ6OnN0cmluZyBzbmFwc2hvdGZpbGUgPSBwYXJ0c1swXSArICIucGF0Y2giOworICAgIGFuZHJvaWQ6OnNuYXBzaG90OjpDcmVhdGVTbmFwc2hvdCBzbmFwc2hvdChGTEFHU19zb3VyY2UsIEZMQUdTX3RhcmdldCwgc25hcHNob3RmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTEFHU19jb21wcmVzc2lvbik7CisKKyAgICBpZiAoIXNuYXBzaG90LkNyZWF0ZVNuYXBzaG90UGF0Y2goKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJTbmFwc2hvdCBjcmVhdGlvbiBmYWlsZWQiOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgTE9HKElORk8pIDw8ICJTbmFwc2hvdCBwYXRjaDogIiA8PCBzbmFwc2hvdGZpbGUgPDwgIiBjcmVhdGVkIHN1Y2Nlc3NmdWxseSI7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L2luc3BlY3RfY293LmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvaW5zcGVjdF9jb3cuY3BwCmluZGV4IDE2N2ZmOGMuLjM3MTg4NTEgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvaW5zcGVjdF9jb3cuY3BwCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvaW5zcGVjdF9jb3cuY3BwCkBAIC0xNiwxOCArMTYsMzcgQEAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCisjaW5jbHVkZSA8Y2hyb25vPgogI2luY2x1ZGUgPGlvbWFuaXA+CiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CisjaW5jbHVkZSA8Z2ZsYWdzL2dmbGFncy5oPgogI2luY2x1ZGUgPGxpYnNuYXBzaG90L2Nvd19yZWFkZXIuaD4KKyNpbmNsdWRlICJwYXJzZXJfdjIuaCIKKworREVGSU5FX2Jvb2woc2lsZW50LCBmYWxzZSwgIlJ1biBzaWxlbnRseSIpOworREVGSU5FX2Jvb2woZGVjb21wcmVzcywgZmFsc2UsICJBdHRlbXB0IHRvIGRlY29tcHJlc3MgZGF0YSBvcHMiKTsKK0RFRklORV9ib29sKHNob3dfYmFkX2RhdGEsIGZhbHNlLCAiSWYgYW4gb3AgZmFpbHMgdG8gZGVjb21wcmVzcywgc2hvdyBpdHMgZGF3IGRhdGEiKTsKK0RFRklORV9ib29sKHNob3dfb3BzLCBmYWxzZSwgIlByaW50IGFsbCBvcGNvZGUgaW5mb3JtYXRpb24iKTsKK0RFRklORV9zdHJpbmcob3JkZXIsICIiLCAiSWYgc2hvd19vcHMgaXMgdHJ1ZSwgY2hhbmdlIHRoZSBvcmRlciAoZWl0aGVyIG1lcmdlIG9yIHJldmVyc2UtbWVyZ2UpIik7CitERUZJTkVfYm9vbChzaG93X21lcmdlZCwgZmFsc2UsCisgICAgICAgICAgICAiSWYgc2hvd19vcHMgaXMgdHJ1ZSwgYW5kIG9yZGVyIGlzIG1lcmdlIG9yIHJldmVyc2UtbWVyZ2UsIGluY2x1ZGUgbWVyZ2VkIG9wcyIpOworREVGSU5FX2Jvb2wodmVyaWZ5X21lcmdlX3NlcXVlbmNlLCBmYWxzZSwgIlZlcmlmeSBtZXJnZSBvcmRlciBzZXF1ZW5jaW5nIik7CitERUZJTkVfYm9vbChzaG93X21lcmdlX3NlcXVlbmNlLCBmYWxzZSwgIlNob3cgbWVyZ2Ugb3JkZXIgc2VxdWVuY2UiKTsKK0RFRklORV9ib29sKHNob3dfcmF3X29wcywgZmFsc2UsICJTaG93IHJhdyBvcHMgZGlyZWN0bHkgZnJvbSB0aGUgdW5kZXJseWluZyBwYXJzZXIiKTsKK0RFRklORV9zdHJpbmcoZXh0cmFjdF90bywgIiIsICJFeHRyYWN0IHRoZSBDT1cgY29udGVudHMgdG8gdGhlIGdpdmVuIGZpbGUiKTsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHNuYXBzaG90IHsKIAordXNpbmcgYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQ7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQ7CisKIHZvaWQgTXlMb2dnZXIoYW5kcm9pZDo6YmFzZTo6TG9nSWQsIGFuZHJvaWQ6OmJhc2U6OkxvZ1NldmVyaXR5IHNldmVyaXR5LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosCiAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCwgY29uc3QgY2hhciogbWVzc2FnZSkgewogICAgIGlmIChzZXZlcml0eSA9PSBhbmRyb2lkOjpiYXNlOjpFUlJPUikgewpAQCAtMzcsMTA3ICs1NiwxMDkgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIHVzYWdlKHZvaWQpIHsKLSAgICBMT0coRVJST1IpIDw8ICJVc2FnZTogaW5zcGVjdF9jb3cgWy1zZF0gPENPV19GSUxFPiI7Ci0gICAgTE9HKEVSUk9SKSA8PCAiXHQgLXMgUnVuIFNpbGVudCI7Ci0gICAgTE9HKEVSUk9SKSA8PCAiXHQgLWQgQXR0ZW1wdCB0byBkZWNvbXByZXNzIjsKLSAgICBMT0coRVJST1IpIDw8ICJcdCAtYiBTaG93IGRhdGEgZm9yIGZhaWxlZCBkZWNvbXByZXNzIjsKLSAgICBMT0coRVJST1IpIDw8ICJcdCAtbCBTaG93IG9wcyI7Ci0gICAgTE9HKEVSUk9SKSA8PCAiXHQgLW0gU2hvdyBvcHMgaW4gcmV2ZXJzZSBtZXJnZSBvcmRlciI7Ci0gICAgTE9HKEVSUk9SKSA8PCAiXHQgLW4gU2hvdyBvcHMgaW4gbWVyZ2Ugb3JkZXIiOwotICAgIExPRyhFUlJPUikgPDwgIlx0IC1hIEluY2x1ZGUgbWVyZ2VkIG9wcyBpbiBhbnkgbWVyZ2Ugb3JkZXIgbGlzdGluZyI7Ci0gICAgTE9HKEVSUk9SKSA8PCAiXHQgLW8gU2hvd3Mgc2VxdWVuY2Ugb3AgYmxvY2sgb3JkZXIiOwotICAgIExPRyhFUlJPUikgPDwgIlx0IC12IFZlcmlmaWVzIG1lcmdlIG9yZGVyIGhhcyBubyBjb25mbGljdHNcbiI7Ci19Ci0KLWVudW0gT3BJdGVyIHsgTm9ybWFsLCBSZXZNZXJnZSwgTWVyZ2UgfTsKLQotc3RydWN0IE9wdGlvbnMgewotICAgIGJvb2wgc2lsZW50OwotICAgIGJvb2wgZGVjb21wcmVzczsKLSAgICBib29sIHNob3dfb3BzOwotICAgIGJvb2wgc2hvd19iYWQ7Ci0gICAgYm9vbCBzaG93X3NlcTsKLSAgICBib29sIHZlcmlmeV9zZXF1ZW5jZTsKLSAgICBPcEl0ZXIgaXRlcl90eXBlOwotICAgIGJvb2wgaW5jbHVkZV9tZXJnZWQ7Ci19OwotCi0vLyBTaW5rIHRoYXQgYWx3YXlzIGFwcGVuZHMgdG8gdGhlIGVuZCBvZiBhIHN0cmluZy4KLWNsYXNzIFN0cmluZ1NpbmsgOiBwdWJsaWMgSUJ5dGVTaW5rIHsKLSAgcHVibGljOgotICAgIHZvaWQqIEdldEJ1ZmZlcihzaXplX3QgcmVxdWVzdGVkLCBzaXplX3QqIGFjdHVhbCkgb3ZlcnJpZGUgewotICAgICAgICBzaXplX3Qgb2xkX3NpemUgPSBzdHJlYW1fLnNpemUoKTsKLSAgICAgICAgc3RyZWFtXy5yZXNpemUob2xkX3NpemUgKyByZXF1ZXN0ZWQsICdcMCcpOwotICAgICAgICAqYWN0dWFsID0gcmVxdWVzdGVkOwotICAgICAgICByZXR1cm4gc3RyZWFtXy5kYXRhKCkgKyBvbGRfc2l6ZTsKLSAgICB9Ci0gICAgYm9vbCBSZXR1cm5EYXRhKHZvaWQqLCBzaXplX3QpIG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KLSAgICB2b2lkIFJlc2V0KCkgeyBzdHJlYW1fLmNsZWFyKCk7IH0KLQotICAgIHN0ZDo6c3RyaW5nJiBzdHJlYW0oKSB7IHJldHVybiBzdHJlYW1fOyB9Ci0KLSAgcHJpdmF0ZToKLSAgICBzdGQ6OnN0cmluZyBzdHJlYW1fOwotfTsKLQotc3RhdGljIHZvaWQgU2hvd0JhZChDb3dSZWFkZXImIHJlYWRlciwgY29uc3Qgc3RydWN0IENvd09wZXJhdGlvbiYgb3ApIHsKK3N0YXRpYyB2b2lkIFNob3dCYWQoQ293UmVhZGVyJiByZWFkZXIsIGNvbnN0IENvd09wZXJhdGlvbiogb3ApIHsKICAgICBzaXplX3QgY291bnQ7Ci0gICAgYXV0byBidWZmZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPHVpbnQ4X3RbXT4ob3AuZGF0YV9sZW5ndGgpOworICAgIGF1dG8gYnVmZmVyID0gc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KG9wLT5kYXRhX2xlbmd0aCk7CiAKLSAgICBpZiAoIXJlYWRlci5HZXRSYXdCeXRlcyhvcC5zb3VyY2UsIGJ1ZmZlci5nZXQoKSwgb3AuZGF0YV9sZW5ndGgsICZjb3VudCkpIHsKKyAgICBpZiAoIXJlYWRlci5HZXRSYXdCeXRlcyhvcCwgYnVmZmVyLmdldCgpLCBvcC0+ZGF0YV9sZW5ndGgsICZjb3VudCkpIHsKICAgICAgICAgc3RkOjpjZXJyIDw8ICJGYWlsZWQgdG8gcmVhZCBhdCBhbGwhXG4iOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHN0ZDo6Y291dCA8PCAiVGhlIEJsb2NrIGRhdGEgaXM6XG4iOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9wLmRhdGFfbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcC0+ZGF0YV9sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6aGV4IDw8IChpbnQpYnVmZmVyW2ldOwogICAgICAgICB9CiAgICAgICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmRlYyA8PCAiXG5cbiI7Ci0gICAgICAgIGlmIChvcC5kYXRhX2xlbmd0aCA+PSBzaXplb2YoQ293T3BlcmF0aW9uKSkgeworICAgICAgICBpZiAob3AtPmRhdGFfbGVuZ3RoID49IHNpemVvZihDb3dPcGVyYXRpb24pKSB7CiAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlRoZSBzdGFydCwgYXMgYW4gb3AsIHdvdWxkIGJlICIgPDwgKihDb3dPcGVyYXRpb24qKWJ1ZmZlci5nZXQoKSA8PCAiXG4iOwogICAgICAgICB9CiAgICAgfQogfQogCi1zdGF0aWMgYm9vbCBJbnNwZWN0KGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBPcHRpb25zIG9wdCkgewotICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBmZChvcGVuKHBhdGguY19zdHIoKSwgT19SRE9OTFkpKTsKK3N0YXRpYyBib29sIFNob3dSYXdPcFN0cmVhbVYyKGJvcnJvd2VkX2ZkIGZkLCBjb25zdCBDb3dIZWFkZXJWMyYgaGVhZGVyKSB7CisgICAgQ293UGFyc2VyVjIgcGFyc2VyOworICAgIGlmICghcGFyc2VyLlBhcnNlKGZkLCBoZWFkZXIpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInYyIHBhcnNlciBmYWlsZWQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYgb3AgOiAqcGFyc2VyLmdldF92Mm9wcygpKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCBvcCA8PCAiXG4iOworICAgICAgICBpZiAoYXV0byBpdGVyID0gcGFyc2VyLnhvcl9kYXRhX2xvYygpLT5maW5kKG9wLm5ld19ibG9jayk7CisgICAgICAgICAgICBpdGVyICE9IHBhcnNlci54b3JfZGF0YV9sb2MoKS0+ZW5kKCkpIHsKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiICAgIGRhdGEgbG9jOiAiIDw8IGl0ZXItPnNlY29uZCA8PCAiXG4iOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBTaG93UmF3T3BTdHJlYW0oYm9ycm93ZWRfZmQgZmQpIHsKKyAgICBDb3dIZWFkZXJWMyBoZWFkZXI7CisgICAgaWYgKCFSZWFkQ293SGVhZGVyKGZkLCAmaGVhZGVyKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJwYXJzZSBoZWFkZXIgZmFpbGVkIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN3aXRjaCAoaGVhZGVyLnByZWZpeC5tYWpvcl92ZXJzaW9uKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgcmV0dXJuIFNob3dSYXdPcFN0cmVhbVYyKGZkLCBoZWFkZXIpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAidW5rbm93biBDT1cgdmVyc2lvbjogIiA8PCBoZWFkZXIucHJlZml4Lm1ham9yX3ZlcnNpb247CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitzdGF0aWMgYm9vbCBJbnNwZWN0KGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7CisgICAgdW5pcXVlX2ZkIGZkKG9wZW4ocGF0aC5jX3N0cigpLCBPX1JET05MWSkpOwogICAgIGlmIChmZCA8IDApIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIm9wZW4gZmFpbGVkOiAiIDw8IHBhdGg7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICB1bmlxdWVfZmQgZXh0cmFjdF90bzsKKyAgICBpZiAoIUZMQUdTX2V4dHJhY3RfdG8uZW1wdHkoKSkgeworICAgICAgICBleHRyYWN0X3RvLnJlc2V0KG9wZW4oRkxBR1NfZXh0cmFjdF90by5jX3N0cigpLCBPX1JEV1IgfCBPX0NSRUFUIHwgT19UUlVOQywgMDY2NCkpOworICAgICAgICBpZiAoZXh0cmFjdF90byA8IDApIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJjb3VsZCBub3Qgb3BlbiAiIDw8IEZMQUdTX2V4dHJhY3RfdG8gPDwgIiBmb3Igd3JpdGluZyI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKICAgICBDb3dSZWFkZXIgcmVhZGVyOworCisgICAgYXV0byBzdGFydF90aW1lID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CiAgICAgaWYgKCFyZWFkZXIuUGFyc2UoZmQpKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgInBhcnNlIGZhaWxlZDogIiA8PCBwYXRoOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQorICAgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGU+IHBhcnNlX3RpbWUgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKSAtIHN0YXJ0X3RpbWU7CiAKLSAgICBDb3dIZWFkZXIgaGVhZGVyOwotICAgIGlmICghcmVhZGVyLkdldEhlYWRlcigmaGVhZGVyKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJjb3VsZCBub3QgZ2V0IGhlYWRlcjogIiA8PCBwYXRoOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQorICAgIGNvbnN0IENvd0hlYWRlciYgaGVhZGVyID0gcmVhZGVyLkdldEhlYWRlcigpOwogICAgIENvd0Zvb3RlciBmb290ZXI7CiAgICAgYm9vbCBoYXNfZm9vdGVyID0gZmFsc2U7CiAgICAgaWYgKHJlYWRlci5HZXRGb290ZXIoJmZvb3RlcikpIGhhc19mb290ZXIgPSB0cnVlOwogCi0gICAgaWYgKCFvcHQuc2lsZW50KSB7Ci0gICAgICAgIHN0ZDo6Y291dCA8PCAiTWFqb3IgdmVyc2lvbjogIiA8PCBoZWFkZXIubWFqb3JfdmVyc2lvbiA8PCAiXG4iOwotICAgICAgICBzdGQ6OmNvdXQgPDwgIk1pbm9yIHZlcnNpb246ICIgPDwgaGVhZGVyLm1pbm9yX3ZlcnNpb24gPDwgIlxuIjsKLSAgICAgICAgc3RkOjpjb3V0IDw8ICJIZWFkZXIgc2l6ZTogIiA8PCBoZWFkZXIuaGVhZGVyX3NpemUgPDwgIlxuIjsKKyAgICBpZiAoIUZMQUdTX3NpbGVudCkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlZlcnNpb246ICIgPDwgaGVhZGVyLnByZWZpeC5tYWpvcl92ZXJzaW9uIDw8ICIuIgorICAgICAgICAgICAgICAgICAgPDwgaGVhZGVyLnByZWZpeC5taW5vcl92ZXJzaW9uIDw8ICJcbiI7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiSGVhZGVyIHNpemU6ICIgPDwgaGVhZGVyLnByZWZpeC5oZWFkZXJfc2l6ZSA8PCAiXG4iOwogICAgICAgICBzdGQ6OmNvdXQgPDwgIkZvb3RlciBzaXplOiAiIDw8IGhlYWRlci5mb290ZXJfc2l6ZSA8PCAiXG4iOwogICAgICAgICBzdGQ6OmNvdXQgPDwgIkJsb2NrIHNpemU6ICIgPDwgaGVhZGVyLmJsb2NrX3NpemUgPDwgIlxuIjsKLSAgICAgICAgc3RkOjpjb3V0IDw8ICJOdW0gbWVyZ2Ugb3BzOiAiIDw8IGhlYWRlci5udW1fbWVyZ2Vfb3BzIDw8ICJcbiI7Ci0gICAgICAgIHN0ZDo6Y291dCA8PCAiUkEgYnVmZmVyIHNpemU6ICIgPDwgaGVhZGVyLmJ1ZmZlcl9zaXplIDw8ICJcbiI7Ci0gICAgICAgIHN0ZDo6Y291dCA8PCAiXG4iOworICAgICAgICBzdGQ6OmNvdXQgPDwgIk1lcmdlIG9wczogIiA8PCBoZWFkZXIubnVtX21lcmdlX29wcyA8PCAiXG4iOworICAgICAgICBzdGQ6OmNvdXQgPDwgIlJlYWRhaGVhZCBidWZmZXI6ICIgPDwgaGVhZGVyLmJ1ZmZlcl9zaXplIDw8ICIgYnl0ZXNcbiI7CiAgICAgICAgIGlmIChoYXNfZm9vdGVyKSB7Ci0gICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlRvdGFsIE9wcyBzaXplOiAiIDw8IGZvb3Rlci5vcC5vcHNfc2l6ZSA8PCAiXG4iOwotICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJOdW1iZXIgb2YgT3BzOiAiIDw8IGZvb3Rlci5vcC5udW1fb3BzIDw8ICJcbiI7Ci0gICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlxuIjsKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiRm9vdGVyOiBvcHMgdXNhZ2U6ICIgPDwgZm9vdGVyLm9wLm9wc19zaXplIDw8ICIgYnl0ZXNcbiI7CisgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIkZvb3Rlcjogb3AgY291bnQ6ICIgPDwgZm9vdGVyLm9wLm51bV9vcHMgPDwgIlxuIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiRm9vdGVyOiBub25lXG4iOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKG9wdC52ZXJpZnlfc2VxdWVuY2UpIHsKKyAgICBpZiAoIUZMQUdTX3NpbGVudCkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlBhcnNlIHRpbWU6ICIgPDwgKHBhcnNlX3RpbWUuY291bnQoKSAqIDEwMDApIDw8ICJtc1xuIjsKKyAgICB9CisKKyAgICBpZiAoRkxBR1NfdmVyaWZ5X21lcmdlX3NlcXVlbmNlKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiXG4iOwogICAgICAgICBpZiAocmVhZGVyLlZlcmlmeU1lcmdlT3BzKCkpIHsKICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiXG5NZXJnZSBzZXF1ZW5jZSBpcyBjb25zaXN0ZW50LlxuIjsKICAgICAgICAgfSBlbHNlIHsKQEAgLTE0Niw0MSArMTY3LDY4IEBACiAgICAgfQogCiAgICAgc3RkOjp1bmlxdWVfcHRyPElDb3dPcEl0ZXI+IGl0ZXI7Ci0gICAgaWYgKG9wdC5pdGVyX3R5cGUgPT0gTm9ybWFsKSB7CisgICAgaWYgKEZMQUdTX29yZGVyLmVtcHR5KCkpIHsKICAgICAgICAgaXRlciA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKLSAgICB9IGVsc2UgaWYgKG9wdC5pdGVyX3R5cGUgPT0gUmV2TWVyZ2UpIHsKLSAgICAgICAgaXRlciA9IHJlYWRlci5HZXRSZXZNZXJnZU9wSXRlcihvcHQuaW5jbHVkZV9tZXJnZWQpOwotICAgIH0gZWxzZSBpZiAob3B0Lml0ZXJfdHlwZSA9PSBNZXJnZSkgewotICAgICAgICBpdGVyID0gcmVhZGVyLkdldE1lcmdlT3BJdGVyKG9wdC5pbmNsdWRlX21lcmdlZCk7CisgICAgfSBlbHNlIGlmIChGTEFHU19vcmRlciA9PSAicmV2ZXJzZS1tZXJnZSIpIHsKKyAgICAgICAgaXRlciA9IHJlYWRlci5HZXRSZXZNZXJnZU9wSXRlcihGTEFHU19zaG93X21lcmdlZCk7CisgICAgfSBlbHNlIGlmIChGTEFHU19vcmRlciA9PSAibWVyZ2UiKSB7CisgICAgICAgIGl0ZXIgPSByZWFkZXIuR2V0TWVyZ2VPcEl0ZXIoRkxBR1Nfc2hvd19tZXJnZWQpOwogICAgIH0KLSAgICBTdHJpbmdTaW5rIHNpbms7CisKKyAgICBzdGQ6OnN0cmluZyBidWZmZXIoaGVhZGVyLmJsb2NrX3NpemUsICdcMCcpOworCisgICAgaWYgKCFGTEFHU19zaWxlbnQgJiYgRkxBR1Nfc2hvd19yYXdfb3BzKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiXG4iOworICAgICAgICBzdGQ6OmNvdXQgPDwgIkxpc3RpbmcgcmF3IG9wIHN0cmVhbTpcbiI7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKKyAgICAgICAgaWYgKCFTaG93UmF3T3BTdHJlYW0oZmQpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIUZMQUdTX3NpbGVudCAmJiBGTEFHU19zaG93X29wcykgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlxuIjsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJMaXN0aW5nIG9wIHN0cmVhbTpcbiI7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiLS0tLS0tLS0tLS0tLS0tLS0tXG4iOworICAgIH0KKwogICAgIGJvb2wgc3VjY2VzcyA9IHRydWU7CiAgICAgdWludDY0X3QgeG9yX29wcyA9IDAsIGNvcHlfb3BzID0gMCwgcmVwbGFjZV9vcHMgPSAwLCB6ZXJvX29wcyA9IDA7Ci0gICAgd2hpbGUgKCFpdGVyLT5Eb25lKCkpIHsKLSAgICAgICAgY29uc3QgQ293T3BlcmF0aW9uJiBvcCA9IGl0ZXItPkdldCgpOworICAgIHdoaWxlICghaXRlci0+QXRFbmQoKSkgeworICAgICAgICBjb25zdCBDb3dPcGVyYXRpb24qIG9wID0gaXRlci0+R2V0KCk7CiAKLSAgICAgICAgaWYgKCFvcHQuc2lsZW50ICYmIG9wdC5zaG93X29wcykgc3RkOjpjb3V0IDw8IG9wIDw8ICJcbiI7CisgICAgICAgIGlmICghRkxBR1Nfc2lsZW50ICYmIEZMQUdTX3Nob3dfb3BzKSBzdGQ6OmNvdXQgPDwgKm9wIDw8ICJcbiI7CiAKLSAgICAgICAgaWYgKG9wdC5kZWNvbXByZXNzICYmIG9wLnR5cGUgPT0ga0Nvd1JlcGxhY2VPcCAmJiBvcC5jb21wcmVzc2lvbiAhPSBrQ293Q29tcHJlc3NOb25lKSB7Ci0gICAgICAgICAgICBpZiAoIXJlYWRlci5SZWFkRGF0YShvcCwgJnNpbmspKSB7Ci0gICAgICAgICAgICAgICAgc3RkOjpjZXJyIDw8ICJGYWlsZWQgdG8gZGVjb21wcmVzcyBmb3IgOiIgPDwgb3AgPDwgIlxuIjsKKyAgICAgICAgaWYgKChGTEFHU19kZWNvbXByZXNzIHx8IGV4dHJhY3RfdG8gPj0gMCkgJiYgb3AtPnR5cGUoKSA9PSBrQ293UmVwbGFjZU9wKSB7CisgICAgICAgICAgICBpZiAocmVhZGVyLlJlYWREYXRhKG9wLCBidWZmZXIuZGF0YSgpLCBidWZmZXIuc2l6ZSgpKSA8IDApIHsKKyAgICAgICAgICAgICAgICBzdGQ6OmNlcnIgPDwgIkZhaWxlZCB0byBkZWNvbXByZXNzIGZvciA6IiA8PCAqb3AgPDwgIlxuIjsKICAgICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKG9wdC5zaG93X2JhZCkgU2hvd0JhZChyZWFkZXIsIG9wKTsKKyAgICAgICAgICAgICAgICBpZiAoRkxBR1Nfc2hvd19iYWRfZGF0YSkgU2hvd0JhZChyZWFkZXIsIG9wKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNpbmsuUmVzZXQoKTsKKyAgICAgICAgICAgIGlmIChleHRyYWN0X3RvID49IDApIHsKKyAgICAgICAgICAgICAgICBvZmZfdCBvZmZzZXQgPSB1aW50NjRfdChvcC0+bmV3X2Jsb2NrKSAqIGhlYWRlci5ibG9ja19zaXplOworICAgICAgICAgICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6V3JpdGVGdWxseUF0T2Zmc2V0KGV4dHJhY3RfdG8sIGJ1ZmZlci5kYXRhKCksIGJ1ZmZlci5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KSkgeworICAgICAgICAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiZmFpbGVkIHRvIHdyaXRlIGJsb2NrICIgPDwgb3AtPm5ld19ibG9jazsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChleHRyYWN0X3RvID49IDAgJiYgIUlzTWV0YWRhdGFPcCgqb3ApICYmIG9wLT50eXBlKCkgIT0ga0Nvd1plcm9PcCkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkNhbm5vdCBleHRyYWN0IG9wIHlldDogIiA8PCAqb3A7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAob3AudHlwZSA9PSBrQ293U2VxdWVuY2VPcCAmJiBvcHQuc2hvd19zZXEpIHsKKyAgICAgICAgaWYgKG9wLT50eXBlKCkgPT0ga0Nvd1NlcXVlbmNlT3AgJiYgRkxBR1Nfc2hvd19tZXJnZV9zZXF1ZW5jZSkgewogICAgICAgICAgICAgc2l6ZV90IHJlYWQ7CiAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gbWVyZ2Vfb3BfYmxvY2tzOwotICAgICAgICAgICAgc2l6ZV90IHNlcV9sZW4gPSBvcC5kYXRhX2xlbmd0aCAvIHNpemVvZih1aW50MzJfdCk7CisgICAgICAgICAgICBzaXplX3Qgc2VxX2xlbiA9IG9wLT5kYXRhX2xlbmd0aCAvIHNpemVvZih1aW50MzJfdCk7CiAgICAgICAgICAgICBtZXJnZV9vcF9ibG9ja3MucmVzaXplKHNlcV9sZW4pOwotICAgICAgICAgICAgaWYgKCFyZWFkZXIuR2V0UmF3Qnl0ZXMob3Auc291cmNlLCBtZXJnZV9vcF9ibG9ja3MuZGF0YSgpLCBvcC5kYXRhX2xlbmd0aCwgJnJlYWQpKSB7CisgICAgICAgICAgICBpZiAoIXJlYWRlci5HZXRSYXdCeXRlcyhvcCwgbWVyZ2Vfb3BfYmxvY2tzLmRhdGEoKSwgb3AtPmRhdGFfbGVuZ3RoLCAmcmVhZCkpIHsKICAgICAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlYWQgc2VxdWVuY2Ugb3AhIjsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW9wdC5zaWxlbnQpIHsKLSAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlNlcXVlbmNlIGZvciAiIDw8IG9wIDw8ICIgaXMgOlxuIjsKKyAgICAgICAgICAgIGlmICghRkxBR1Nfc2lsZW50KSB7CisgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJTZXF1ZW5jZSBmb3IgIiA8PCAqb3AgPDwgIiBpcyA6XG4iOwogICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2VxX2xlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OnNldHcoNikgPDwgbWVyZ2Vfb3BfYmxvY2tzW2ldIDw8ICIsICI7CiAgICAgICAgICAgICAgICAgICAgIGlmICgoaSArIDEpICUgMTAgPT0gMCB8fCBpICsgMSA9PSBzZXFfbGVuKSBzdGQ6OmNvdXQgPDwgIlxuIjsKQEAgLTE4OCwyNCArMjM2LDI2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpZiAob3AudHlwZSA9PSBrQ293Q29weU9wKSB7CisgICAgICAgIGlmIChvcC0+dHlwZSgpID09IGtDb3dDb3B5T3ApIHsKICAgICAgICAgICAgIGNvcHlfb3BzKys7Ci0gICAgICAgIH0gZWxzZSBpZiAob3AudHlwZSA9PSBrQ293UmVwbGFjZU9wKSB7CisgICAgICAgIH0gZWxzZSBpZiAob3AtPnR5cGUoKSA9PSBrQ293UmVwbGFjZU9wKSB7CiAgICAgICAgICAgICByZXBsYWNlX29wcysrOwotICAgICAgICB9IGVsc2UgaWYgKG9wLnR5cGUgPT0ga0Nvd1plcm9PcCkgeworICAgICAgICB9IGVsc2UgaWYgKG9wLT50eXBlKCkgPT0ga0Nvd1plcm9PcCkgewogICAgICAgICAgICAgemVyb19vcHMrKzsKLSAgICAgICAgfSBlbHNlIGlmIChvcC50eXBlID09IGtDb3dYb3JPcCkgeworICAgICAgICB9IGVsc2UgaWYgKG9wLT50eXBlKCkgPT0ga0Nvd1hvck9wKSB7CiAgICAgICAgICAgICB4b3Jfb3BzKys7CiAgICAgICAgIH0KIAogICAgICAgICBpdGVyLT5OZXh0KCk7CiAgICAgfQogCi0gICAgaWYgKCFvcHQuc2lsZW50KSB7CisgICAgaWYgKCFGTEFHU19zaWxlbnQpIHsKICAgICAgICAgYXV0byB0b3RhbF9vcHMgPSByZXBsYWNlX29wcyArIHplcm9fb3BzICsgY29weV9vcHMgKyB4b3Jfb3BzOwotICAgICAgICBzdGQ6OmNvdXQgPDwgIlRvdGFsLWRhdGEtb3BzOiAiIDw8IHRvdGFsX29wcyA8PCAiUmVwbGFjZS1vcHM6ICIgPDwgcmVwbGFjZV9vcHMKLSAgICAgICAgICAgICAgICAgIDw8ICIgWmVyby1vcHM6ICIgPDwgemVyb19vcHMgPDwgIiBDb3B5LW9wczogIiA8PCBjb3B5X29wcwotICAgICAgICAgICAgICAgICAgPDwgIiBYb3Jfb3BzOiAiIDw8IHhvcl9vcHMgPDwgc3RkOjplbmRsOworICAgICAgICBzdGQ6OmNvdXQgPDwgIkRhdGEgb3BzOiAiIDw8IHRvdGFsX29wcyA8PCAiXG4iOworICAgICAgICBzdGQ6OmNvdXQgPDwgIlJlcGxhY2Ugb3BzOiAiIDw8IHJlcGxhY2Vfb3BzIDw8ICJcbiI7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiWmVybyBvcHM6ICIgPDwgemVyb19vcHMgPDwgIlxuIjsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJDb3B5IG9wczogIiA8PCBjb3B5X29wcyA8PCAiXG4iOworICAgICAgICBzdGQ6OmNvdXQgPDwgIlhvciBvcHM6ICIgPDwgeG9yX29wcyA8PCAiXG4iOwogICAgIH0KIAogICAgIHJldHVybiBzdWNjZXNzOwpAQCAtMjE1LDU1ICsyNjUsMjAgQEAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICAgIGludCBjaDsKLSAgICBzdHJ1Y3QgYW5kcm9pZDo6c25hcHNob3Q6Ok9wdGlvbnMgb3B0OwotICAgIG9wdC5zaWxlbnQgPSBmYWxzZTsKLSAgICBvcHQuZGVjb21wcmVzcyA9IGZhbHNlOwotICAgIG9wdC5zaG93X2JhZCA9IGZhbHNlOwotICAgIG9wdC5pdGVyX3R5cGUgPSBhbmRyb2lkOjpzbmFwc2hvdDo6Tm9ybWFsOwotICAgIG9wdC52ZXJpZnlfc2VxdWVuY2UgPSBmYWxzZTsKLSAgICBvcHQuaW5jbHVkZV9tZXJnZWQgPSBmYWxzZTsKLSAgICB3aGlsZSAoKGNoID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJzZGJtbm9sdmEiKSkgIT0gLTEpIHsKLSAgICAgICAgc3dpdGNoIChjaCkgewotICAgICAgICAgICAgY2FzZSAncyc6Ci0gICAgICAgICAgICAgICAgb3B0LnNpbGVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdkJzoKLSAgICAgICAgICAgICAgICBvcHQuZGVjb21wcmVzcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdiJzoKLSAgICAgICAgICAgICAgICBvcHQuc2hvd19iYWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnbSc6Ci0gICAgICAgICAgICAgICAgb3B0Lml0ZXJfdHlwZSA9IGFuZHJvaWQ6OnNuYXBzaG90OjpSZXZNZXJnZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ24nOgotICAgICAgICAgICAgICAgIG9wdC5pdGVyX3R5cGUgPSBhbmRyb2lkOjpzbmFwc2hvdDo6TWVyZ2U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdvJzoKLSAgICAgICAgICAgICAgICBvcHQuc2hvd19zZXEgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnbCc6Ci0gICAgICAgICAgICAgICAgb3B0LnNob3dfb3BzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ3YnOgotICAgICAgICAgICAgICAgIG9wdC52ZXJpZnlfc2VxdWVuY2UgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnYSc6Ci0gICAgICAgICAgICAgICAgb3B0LmluY2x1ZGVfbWVyZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDo6c25hcHNob3Q6OnVzYWdlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgYW5kcm9pZDo6YmFzZTo6SW5pdExvZ2dpbmcoYXJndiwgYW5kcm9pZDo6c25hcHNob3Q6Ok15TG9nZ2VyKTsKKyAgICBnZmxhZ3M6OlBhcnNlQ29tbWFuZExpbmVGbGFncygmYXJnYywgJmFyZ3YsIHRydWUpOwogCi0gICAgaWYgKGFyZ2MgPCBvcHRpbmQgKyAxKSB7Ci0gICAgICAgIGFuZHJvaWQ6OnNuYXBzaG90Ojp1c2FnZSgpOworICAgIGlmIChhcmdjIDwgMikgeworICAgICAgICBnZmxhZ3M6OlNob3dVc2FnZVdpdGhGbGFncyhhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChGTEFHU19vcmRlciAhPSAiIiAmJiBGTEFHU19vcmRlciAhPSAibWVyZ2UiICYmIEZMQUdTX29yZGVyICE9ICJyZXZlcnNlLW1lcmdlIikgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIk9yZGVyIG11c3QgZWl0aGVyIGJlIFwibWVyZ2VcIiBvciBcInJldmVyc2UtbWVyZ2VcIi5cbiI7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KIAotICAgIGlmICghYW5kcm9pZDo6c25hcHNob3Q6Okluc3BlY3QoYXJndltvcHRpbmRdLCBvcHQpKSB7CisgICAgYW5kcm9pZDo6YmFzZTo6SW5pdExvZ2dpbmcoYXJndiwgYW5kcm9pZDo6c25hcHNob3Q6Ok15TG9nZ2VyKTsKKworICAgIGlmICghYW5kcm9pZDo6c25hcHNob3Q6Okluc3BlY3QoYXJndlsxXSkpIHsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9wYXJzZXJfYmFzZS5oIGIvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9wYXJzZXJfYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzN2IzM2UKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L3BhcnNlcl9iYXNlLmgKQEAgLTAsMCArMSw1NiBAQAorLy8KKy8vIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxvcHRpb25hbD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgorI2luY2x1ZGUgPGxpYnNuYXBzaG90L2Nvd19mb3JtYXQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHNuYXBzaG90IHsKKworc3RydWN0IFRyYW5zbGF0ZWRDb3dPcHMgeworICAgIENvd0hlYWRlclYzIGhlYWRlcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8Q293T3BlcmF0aW9uVjM+PiBvcHM7Cit9OworCitjbGFzcyBDb3dQYXJzZXJCYXNlIHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgfkNvd1BhcnNlckJhc2UoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIGJvb2wgUGFyc2UoYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgZmQsIGNvbnN0IENvd0hlYWRlclYzJiBoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGxhYmVsID0ge30pID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgVHJhbnNsYXRlKFRyYW5zbGF0ZWRDb3dPcHMqIG91dCkgPSAwOworICAgIHZpcnR1YWwgc3RkOjpvcHRpb25hbDxDb3dGb290ZXI+IGZvb3RlcigpIGNvbnN0IHsgcmV0dXJuIHN0ZDo6bnVsbG9wdDsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnVub3JkZXJlZF9tYXA8dWludDY0X3QsIHVpbnQ2NF90Pj4geG9yX2RhdGFfbG9jKCkgeworICAgICAgICByZXR1cm4geG9yX2RhdGFfbG9jXzsKKyAgICB9OworCisgICAgdWludDY0X3QgZmRfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGZkX3NpemVfOyB9CisgICAgY29uc3Qgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4mIGxhc3RfbGFiZWwoKSBjb25zdCB7IHJldHVybiBsYXN0X2xhYmVsXzsgfQorCisgIHByb3RlY3RlZDoKKyAgICBDb3dIZWFkZXJWMyBoZWFkZXJfID0ge307CisgICAgdWludDY0X3QgZmRfc2l6ZV87CisgICAgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gbGFzdF9sYWJlbF87CisgICAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50NjRfdCwgdWludDY0X3Q+PiB4b3JfZGF0YV9sb2NfID0ge307Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L3BhcnNlcl92Mi5jcHAgYi9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L3BhcnNlcl92Mi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM1YjYxNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvcGFyc2VyX3YyLmNwcApAQCAtMCwwICsxLDI0NSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjaW5jbHVkZSAicGFyc2VyX3YyLmgiCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPGxpYnNuYXBzaG90L2Nvd19mb3JtYXQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHNuYXBzaG90IHsKKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQ7CisKK2Jvb2wgQ293UGFyc2VyVjI6OlBhcnNlKGJvcnJvd2VkX2ZkIGZkLCBjb25zdCBDb3dIZWFkZXJWMyYgaGVhZGVyLCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBsYWJlbCkgeworICAgIGF1dG8gcG9zID0gbHNlZWsoZmQuZ2V0KCksIDAsIFNFRUtfRU5EKTsKKyAgICBpZiAocG9zIDwgMCkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAibHNlZWsgZW5kIGZhaWxlZCI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZmRfc2l6ZV8gPSBwb3M7CisgICAgaGVhZGVyXyA9IGhlYWRlcjsKKworICAgIGlmIChoZWFkZXJfLmZvb3Rlcl9zaXplICE9IHNpemVvZihDb3dGb290ZXIpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkZvb3RlciBzaXplIHVua25vd24sIHJlYWQgIiA8PCBoZWFkZXJfLmZvb3Rlcl9zaXplIDw8ICIsIGV4cGVjdGVkICIKKyAgICAgICAgICAgICAgICAgICA8PCBzaXplb2YoQ293Rm9vdGVyKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoaGVhZGVyXy5vcF9zaXplICE9IHNpemVvZihDb3dPcGVyYXRpb25WMikpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiT3BlcmF0aW9uIHNpemUgdW5rbm93biwgcmVhZCAiIDw8IGhlYWRlcl8ub3Bfc2l6ZSA8PCAiLCBleHBlY3RlZCAiCisgICAgICAgICAgICAgICAgICAgPDwgc2l6ZW9mKENvd09wZXJhdGlvblYyKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoaGVhZGVyXy5jbHVzdGVyX29wcyA9PSAxKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNsdXN0ZXJzIG11c3QgY29udGFpbiBhdCBsZWFzdCB0d28gb3BlcmF0aW9ucyB0byBmdW5jdGlvbi4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGhlYWRlcl8ucHJlZml4Lm1ham9yX3ZlcnNpb24gPiAyIHx8IGhlYWRlcl8ucHJlZml4Lm1pbm9yX3ZlcnNpb24gIT0gMCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJIZWFkZXIgdmVyc2lvbiBtaXNtYXRjaCwgIgorICAgICAgICAgICAgICAgICAgIDw8ICJtYWpvciB2ZXJzaW9uOiAiIDw8IGhlYWRlcl8ucHJlZml4Lm1ham9yX3ZlcnNpb24KKyAgICAgICAgICAgICAgICAgICA8PCAiLCBleHBlY3RlZDogIiA8PCBrQ293VmVyc2lvbk1ham9yCisgICAgICAgICAgICAgICAgICAgPDwgIiwgbWlub3IgdmVyc2lvbjogIiA8PCBoZWFkZXJfLnByZWZpeC5taW5vcl92ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgPDwgIiwgZXhwZWN0ZWQ6ICIgPDwga0Nvd1ZlcnNpb25NaW5vcjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiBQYXJzZU9wcyhmZCwgbGFiZWwpOworfQorCitib29sIENvd1BhcnNlclYyOjpQYXJzZU9wcyhib3Jyb3dlZF9mZCBmZCwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gbGFiZWwpIHsKKyAgICB1aW50NjRfdCBwb3M7CisgICAgYXV0byB4b3JfZGF0YV9sb2MgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50NjRfdCwgdWludDY0X3Q+PigpOworCisgICAgLy8gU2tpcCB0aGUgc2NyYXRjaCBzcGFjZQorICAgIGlmIChoZWFkZXJfLnByZWZpeC5tYWpvcl92ZXJzaW9uID49IDIgJiYgKGhlYWRlcl8uYnVmZmVyX3NpemUgPiAwKSkgeworICAgICAgICBMT0coREVCVUcpIDw8ICIgU2NyYXRjaCBzcGFjZSBmb3VuZCBvZiBzaXplOiAiIDw8IGhlYWRlcl8uYnVmZmVyX3NpemU7CisgICAgICAgIHNpemVfdCBpbml0X29mZnNldCA9IGhlYWRlcl8ucHJlZml4LmhlYWRlcl9zaXplICsgaGVhZGVyXy5idWZmZXJfc2l6ZTsKKyAgICAgICAgcG9zID0gbHNlZWsoZmQuZ2V0KCksIGluaXRfb2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgICAgIGlmIChwb3MgIT0gaW5pdF9vZmZzZXQpIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJsc2VlayBvcHMgZmFpbGVkIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHBvcyA9IGxzZWVrKGZkLmdldCgpLCBoZWFkZXJfLnByZWZpeC5oZWFkZXJfc2l6ZSwgU0VFS19TRVQpOworICAgICAgICBpZiAocG9zICE9IGhlYWRlcl8ucHJlZml4LmhlYWRlcl9zaXplKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAibHNlZWsgb3BzIGZhaWxlZCI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gUmVhZGluZyBhIHYxIHZlcnNpb24gb2YgQ09XIHdoaWNoIGRvZXNuJ3QgaGF2ZSBidWZmZXJfc2l6ZS4KKyAgICAgICAgaGVhZGVyXy5idWZmZXJfc2l6ZSA9IDA7CisgICAgfQorICAgIHVpbnQ2NF90IGRhdGFfcG9zID0gMDsKKworICAgIGlmIChoZWFkZXJfLmNsdXN0ZXJfb3BzKSB7CisgICAgICAgIGRhdGFfcG9zID0gcG9zICsgaGVhZGVyXy5jbHVzdGVyX29wcyAqIHNpemVvZihDb3dPcGVyYXRpb25WMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGF0YV9wb3MgPSBwb3MgKyBzaXplb2YoQ293T3BlcmF0aW9uVjIpOworICAgIH0KKworICAgIGF1dG8gb3BzX2J1ZmZlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8Q293T3BlcmF0aW9uVjI+PigpOworICAgIHVpbnQ2NF90IGN1cnJlbnRfb3BfbnVtID0gMDsKKyAgICB1aW50NjRfdCBjbHVzdGVyX29wcyA9IGhlYWRlcl8uY2x1c3Rlcl9vcHMgPzogMTsKKyAgICBib29sIGRvbmUgPSBmYWxzZTsKKworICAgIC8vIEFsdGVybmF0aW5nIG9wIGNsdXN0ZXJzIGFuZCBkYXRhCisgICAgd2hpbGUgKCFkb25lKSB7CisgICAgICAgIHVpbnQ2NF90IHRvX2FkZCA9IHN0ZDo6bWluKGNsdXN0ZXJfb3BzLCAoZmRfc2l6ZV8gLSBwb3MpIC8gc2l6ZW9mKENvd09wZXJhdGlvblYyKSk7CisgICAgICAgIGlmICh0b19hZGQgPT0gMCkgYnJlYWs7CisgICAgICAgIG9wc19idWZmZXItPnJlc2l6ZShjdXJyZW50X29wX251bSArIHRvX2FkZCk7CisgICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhZEZ1bGx5KGZkLCAmb3BzX2J1ZmZlci0+ZGF0YSgpW2N1cnJlbnRfb3BfbnVtXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9fYWRkICogc2l6ZW9mKENvd09wZXJhdGlvblYyKSkpIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJyZWFkIG9wIGZhaWxlZCI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gUGFyc2UgY3VycmVudCBjbHVzdGVyIHRvIGZpbmQgc3RhcnQgb2YgbmV4dCBjbHVzdGVyCisgICAgICAgIHdoaWxlIChjdXJyZW50X29wX251bSA8IG9wc19idWZmZXItPnNpemUoKSkgeworICAgICAgICAgICAgYXV0byYgY3VycmVudF9vcCA9IG9wc19idWZmZXItPmRhdGEoKVtjdXJyZW50X29wX251bV07CisgICAgICAgICAgICBjdXJyZW50X29wX251bSsrOworICAgICAgICAgICAgaWYgKGN1cnJlbnRfb3AudHlwZSA9PSBrQ293WG9yT3ApIHsKKyAgICAgICAgICAgICAgICB4b3JfZGF0YV9sb2MtPmluc2VydCh7Y3VycmVudF9vcC5uZXdfYmxvY2ssIGRhdGFfcG9zfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwb3MgKz0gc2l6ZW9mKENvd09wZXJhdGlvblYyKSArIEdldE5leHRPcE9mZnNldChjdXJyZW50X29wLCBoZWFkZXJfLmNsdXN0ZXJfb3BzKTsKKyAgICAgICAgICAgIGRhdGFfcG9zICs9IGN1cnJlbnRfb3AuZGF0YV9sZW5ndGggKyBHZXROZXh0RGF0YU9mZnNldChjdXJyZW50X29wLCBoZWFkZXJfLmNsdXN0ZXJfb3BzKTsKKworICAgICAgICAgICAgaWYgKGN1cnJlbnRfb3AudHlwZSA9PSBrQ293Q2x1c3Rlck9wKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRfb3AudHlwZSA9PSBrQ293TGFiZWxPcCkgeworICAgICAgICAgICAgICAgIGxhc3RfbGFiZWxfID0ge2N1cnJlbnRfb3Auc291cmNlfTsKKworICAgICAgICAgICAgICAgIC8vIElmIHdlIHJlYWNoIHRoZSByZXF1ZXN0ZWQgbGFiZWwsIHN0b3AgcmVhZGluZy4KKyAgICAgICAgICAgICAgICBpZiAobGFiZWwgJiYgbGFiZWwudmFsdWUoKSA9PSBjdXJyZW50X29wLnNvdXJjZSkgeworICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50X29wLnR5cGUgPT0ga0Nvd0Zvb3Rlck9wKSB7CisgICAgICAgICAgICAgICAgZm9vdGVyXy5lbXBsYWNlKCk7CisgICAgICAgICAgICAgICAgQ293Rm9vdGVyKiBmb290ZXIgPSAmZm9vdGVyXy52YWx1ZSgpOworICAgICAgICAgICAgICAgIG1lbWNweSgmZm9vdGVyXy0+b3AsICZjdXJyZW50X29wLCBzaXplb2YoZm9vdGVyLT5vcCkpOworICAgICAgICAgICAgICAgIG9mZl90IG9mZnMgPSBsc2VlayhmZC5nZXQoKSwgcG9zLCBTRUVLX1NFVCk7CisgICAgICAgICAgICAgICAgaWYgKG9mZnMgPCAwIHx8IHBvcyAhPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4ob2ZmcykpIHsKKyAgICAgICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgImxzZWVrIG5leHQgb3AgZmFpbGVkICIgPDwgb2ZmczsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseShmZCwgJmZvb3Rlci0+dW51c2VkLCBzaXplb2YoZm9vdGVyLT51bnVzZWQpKSkgeworICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgcmVhZCBDT1cgZm9vdGVyIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIERyb3AgdGhlIGZvb3RlciBmcm9tIHRoZSBvcCBzdHJlYW0uCisgICAgICAgICAgICAgICAgY3VycmVudF9vcF9udW0tLTsKKyAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFBvc2l0aW9uIGZvciBuZXh0IGNsdXN0ZXIgcmVhZAorICAgICAgICBvZmZfdCBvZmZzID0gbHNlZWsoZmQuZ2V0KCksIHBvcywgU0VFS19TRVQpOworICAgICAgICBpZiAob2ZmcyA8IDAgfHwgcG9zICE9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihvZmZzKSkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgImxzZWVrIG5leHQgb3AgZmFpbGVkICIgPDwgb2ZmczsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBvcHNfYnVmZmVyLT5yZXNpemUoY3VycmVudF9vcF9udW0pOworICAgIH0KKworICAgIExPRyhERUJVRykgPDwgIkNPVyBmaWxlIHJlYWQgY29tcGxldGUuIFRvdGFsIG9wczogIiA8PCBvcHNfYnVmZmVyLT5zaXplKCk7CisgICAgLy8gVG8gc3VjY2Vzc2Z1bGx5IHBhcnNlIGEgQ09XIGZpbGUsIHdlIG5lZWQgZWl0aGVyOgorICAgIC8vICAoMSkgYSBsYWJlbCB0byByZWFkIHVwIHRvLCBhbmQgZm9yIHRoYXQgbGFiZWwgdG8gYmUgZm91bmQsIG9yCisgICAgLy8gICgyKSBhIHZhbGlkIGZvb3Rlci4KKyAgICBpZiAobGFiZWwpIHsKKyAgICAgICAgaWYgKCFsYXN0X2xhYmVsXykgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRGlkIG5vdCBmaW5kIGxhYmVsICIgPDwgbGFiZWwudmFsdWUoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHdoaWxlIHJlYWRpbmcgQ09XIChubyBsYWJlbHMgZm91bmQpIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGFzdF9sYWJlbF8udmFsdWUoKSAhPSBsYWJlbC52YWx1ZSgpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJEaWQgbm90IGZpbmQgbGFiZWwgIiA8PCBsYWJlbC52YWx1ZSgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGxhc3QgbGFiZWw9IiA8PCBsYXN0X2xhYmVsXy52YWx1ZSgpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghZm9vdGVyXykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJObyBDT1cgZm9vdGVyIGZvdW5kIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVpbnQ4X3QgY3N1bVszMl07CisgICAgbWVtc2V0KGNzdW0sIDAsIHNpemVvZih1aW50OF90KSAqIDMyKTsKKworICAgIGlmIChmb290ZXJfKSB7CisgICAgICAgIGlmIChvcHNfYnVmZmVyLT5zaXplKCkgIT0gZm9vdGVyXy0+b3AubnVtX29wcykgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAibnVtIG9wcyBkb2VzIG5vdCBtYXRjaCwgZXhwZWN0ZWQgIiA8PCBmb290ZXJfLT5vcC5udW1fb3BzIDw8ICIsIGZvdW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgb3BzX2J1ZmZlci0+c2l6ZSgpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChvcHNfYnVmZmVyLT5zaXplKCkgKiBzaXplb2YoQ293T3BlcmF0aW9uVjIpICE9IGZvb3Rlcl8tPm9wLm9wc19zaXplKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJvcHMgc2l6ZSBkb2VzIG5vdCBtYXRjaCAiOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgdjJfb3BzXyA9IG9wc19idWZmZXI7CisgICAgdjJfb3BzXy0+c2hyaW5rX3RvX2ZpdCgpOworICAgIHhvcl9kYXRhX2xvY18gPSB4b3JfZGF0YV9sb2M7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ293UGFyc2VyVjI6OlRyYW5zbGF0ZShUcmFuc2xhdGVkQ293T3BzKiBvdXQpIHsKKyAgICBvdXQtPm9wcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8Q293T3BlcmF0aW9uVjM+Pih2Ml9vcHNfLT5zaXplKCkpOworCisgICAgLy8gVHJhbnNsYXRlIHRoZSBvcGVyYXRpb24gYnVmZmVyIGZyb20gb24gZGlzayB0byBpbiBtZW1vcnkKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dC0+b3BzLT5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBhdXRvJiB2Ml9vcCA9IHYyX29wc18tPmF0KGkpOworCisgICAgICAgIGF1dG8mIG5ld19vcCA9IG91dC0+b3BzLT5hdChpKTsKKyAgICAgICAgbmV3X29wLnNldF90eXBlKHYyX29wLnR5cGUpOworICAgICAgICAvLyB2MiBvcHMgYWx3YXlzIGhhdmUgNGsgY29tcHJlc3Npb24KKyAgICAgICAgbmV3X29wLnNldF9jb21wcmVzc2lvbl9iaXRzKDApOworICAgICAgICBuZXdfb3AuZGF0YV9sZW5ndGggPSB2Ml9vcC5kYXRhX2xlbmd0aDsKKworICAgICAgICBpZiAodjJfb3AubmV3X2Jsb2NrID4gc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJPdXQtb2YtcmFuZ2UgbmV3IGJsb2NrIGluIENPVyBvcDogIiA8PCB2Ml9vcDsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBuZXdfb3AubmV3X2Jsb2NrID0gdjJfb3AubmV3X2Jsb2NrOworCisgICAgICAgIHVpbnQ2NF90IHNvdXJjZV9pbmZvID0gdjJfb3Auc291cmNlOworICAgICAgICBpZiAobmV3X29wLnR5cGUoKSAhPSBrQ293TGFiZWxPcCkgeworICAgICAgICAgICAgc291cmNlX2luZm8gJj0ga0Nvd09wU291cmNlSW5mb0RhdGFNYXNrOworICAgICAgICAgICAgaWYgKHNvdXJjZV9pbmZvICE9IHYyX29wLnNvdXJjZSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk91dC1vZi1yYW5nZSBzb3VyY2UgdmFsdWUgaW4gQ09XIG9wOiAiIDw8IHYyX29wOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodjJfb3AuY29tcHJlc3Npb24gIT0ga0Nvd0NvbXByZXNzTm9uZSkgeworICAgICAgICAgICAgaWYgKGhlYWRlcl8uY29tcHJlc3Npb25fYWxnb3JpdGhtID09IGtDb3dDb21wcmVzc05vbmUpIHsKKyAgICAgICAgICAgICAgICBoZWFkZXJfLmNvbXByZXNzaW9uX2FsZ29yaXRobSA9IHYyX29wLmNvbXByZXNzaW9uOworICAgICAgICAgICAgfSBlbHNlIGlmIChoZWFkZXJfLmNvbXByZXNzaW9uX2FsZ29yaXRobSAhPSB2Ml9vcC5jb21wcmVzc2lvbikgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNPVyBoYXMgbWl4ZWQgY29tcHJlc3Npb24gdHlwZXMgd2hpY2ggaXMgbm90IHN1cHBvcnRlZDsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHByZXZpb3VzbHkgc2F3ICIgPDwgaGVhZGVyXy5jb21wcmVzc2lvbl9hbGdvcml0aG0gPDwgIiwgZ290ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHYyX29wLmNvbXByZXNzaW9uIDw8ICIsIG9wOiAiIDw8IHYyX29wOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBuZXdfb3Auc2V0X3NvdXJjZShzb3VyY2VfaW5mbyk7CisgICAgfQorCisgICAgb3V0LT5oZWFkZXIgPSBoZWFkZXJfOworICAgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L3BhcnNlcl92Mi5oIGIvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9wYXJzZXJfdjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWVlMmU1Ci0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9wYXJzZXJfdjIuaApAQCAtMCwwICsxLDQ2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8b3B0aW9uYWw+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgorI2luY2x1ZGUgPGxpYnNuYXBzaG90L2Nvd19mb3JtYXQuaD4KKyNpbmNsdWRlIDxsaWJzbmFwc2hvdF9jb3cvcGFyc2VyX2Jhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHNuYXBzaG90IHsKKworY2xhc3MgQ293UGFyc2VyVjIgZmluYWwgOiBwdWJsaWMgQ293UGFyc2VyQmFzZSB7CisgIHB1YmxpYzoKKyAgICBib29sIFBhcnNlKGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIGZkLCBjb25zdCBDb3dIZWFkZXJWMyYgaGVhZGVyLAorICAgICAgICAgICAgICAgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gbGFiZWwgPSB7fSkgb3ZlcnJpZGU7CisgICAgYm9vbCBUcmFuc2xhdGUoVHJhbnNsYXRlZENvd09wcyogb3V0KSBvdmVycmlkZTsKKyAgICBzdGQ6Om9wdGlvbmFsPENvd0Zvb3Rlcj4gZm9vdGVyKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZm9vdGVyXzsgfQorCisgICAgY29uc3QgQ293SGVhZGVyJiBoZWFkZXIoKSBjb25zdCB7IHJldHVybiBoZWFkZXJfOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPENvd09wZXJhdGlvblYyPj4gZ2V0X3Yyb3BzKCkgeyByZXR1cm4gdjJfb3BzXzsgfQorCisgIHByaXZhdGU6CisgICAgYm9vbCBQYXJzZU9wcyhhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBmZCwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gbGFiZWwpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3RvcjxDb3dPcGVyYXRpb25WMj4+IHYyX29wc187CisgICAgc3RkOjpvcHRpb25hbDxDb3dGb290ZXI+IGZvb3Rlcl87Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L3BhcnNlcl92My5jcHAgYi9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L3BhcnNlcl92My5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM2ZDMzNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvcGFyc2VyX3YzLmNwcApAQCAtMCwwICsxLDE0MiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjaW5jbHVkZSAicGFyc2VyX3YzLmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KKworI2luY2x1ZGUgPGxpYnNuYXBzaG90L2Nvd19mb3JtYXQuaD4KKyNpbmNsdWRlIDxsaWJzbmFwc2hvdC9jb3dfcmVhZGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBzbmFwc2hvdCB7CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkOworCitib29sIENvd1BhcnNlclYzOjpQYXJzZShib3Jyb3dlZF9mZCBmZCwgY29uc3QgQ293SGVhZGVyVjMmIGhlYWRlciwgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gbGFiZWwpIHsKKyAgICBhdXRvIHBvcyA9IGxzZWVrKGZkLmdldCgpLCAwLCBTRUVLX0VORCk7CisgICAgaWYgKHBvcyA8IDApIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgImxzZWVrIGVuZCBmYWlsZWQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZkX3NpemVfID0gcG9zOworICAgIGhlYWRlcl8gPSBoZWFkZXI7CisKKyAgICBpZiAoaGVhZGVyXy5mb290ZXJfc2l6ZSAhPSAwKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkZvb3RlciBzaXplIGlzbid0IDAsIHJlYWQgIiA8PCBoZWFkZXJfLmZvb3Rlcl9zaXplOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGhlYWRlcl8ub3Bfc2l6ZSAhPSBzaXplb2YoQ293T3BlcmF0aW9uVjMpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIk9wZXJhdGlvbiBzaXplIHVua25vd24sIHJlYWQgIiA8PCBoZWFkZXJfLm9wX3NpemUgPDwgIiwgZXhwZWN0ZWQgIgorICAgICAgICAgICAgICAgICAgIDw8IHNpemVvZihDb3dPcGVyYXRpb25WMyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGhlYWRlcl8uY2x1c3Rlcl9vcHMgIT0gMCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDbHVzdGVyIG9wcyBub3Qgc3VwcG9ydGVkIGluIHYzIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChoZWFkZXJfLnByZWZpeC5tYWpvcl92ZXJzaW9uICE9IDMgfHwgaGVhZGVyXy5wcmVmaXgubWlub3JfdmVyc2lvbiAhPSAwKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkhlYWRlciB2ZXJzaW9uIG1pc21hdGNoLCAiCisgICAgICAgICAgICAgICAgICAgPDwgIm1ham9yIHZlcnNpb246ICIgPDwgaGVhZGVyXy5wcmVmaXgubWFqb3JfdmVyc2lvbgorICAgICAgICAgICAgICAgICAgIDw8ICIsIGV4cGVjdGVkOiAiIDw8IGtDb3dWZXJzaW9uTWFqb3IKKyAgICAgICAgICAgICAgICAgICA8PCAiLCBtaW5vciB2ZXJzaW9uOiAiIDw8IGhlYWRlcl8ucHJlZml4Lm1pbm9yX3ZlcnNpb24KKyAgICAgICAgICAgICAgICAgICA8PCAiLCBleHBlY3RlZDogIiA8PCBrQ293VmVyc2lvbk1pbm9yOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjpvcHRpb25hbDx1aW50MzJfdD4gb3BfaW5kZXggPSBoZWFkZXJfLm9wX2NvdW50OworICAgIGlmIChsYWJlbCkgeworICAgICAgICBpZiAoIVJlYWRSZXN1bWVCdWZmZXIoZmQpKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlYWQgcmVzdW1lIGJ1ZmZlciI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgb3BfaW5kZXggPSBGaW5kUmVzdW1lT3AobGFiZWwudmFsdWUoKSk7CisgICAgICAgIGlmIChvcF9pbmRleCA9PSBzdGQ6Om51bGxvcHQpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgImZhaWxlZCB0byBnZXQgb3AgaW5kZXggZnJvbSBnaXZlbiBsYWJlbDogIiA8PCBsYWJlbC52YWx1ZSgpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFBhcnNlT3BzKGZkLCBvcF9pbmRleC52YWx1ZSgpKTsKK30KKworYm9vbCBDb3dQYXJzZXJWMzo6UmVhZFJlc3VtZUJ1ZmZlcihib3Jyb3dlZF9mZCBmZCkgeworICAgIHJlc3VtZV9wb2ludHNfID0gc3RkOjptYWtlX3NoYXJlZDxzdGQ6OnZlY3RvcjxSZXN1bWVQb2ludD4+KGhlYWRlcl8ucmVzdW1lX3BvaW50X2NvdW50KTsKKworICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHlBdE9mZnNldChmZCwgcmVzdW1lX3BvaW50c18tPmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyXy5yZXN1bWVfcG9pbnRfY291bnQgKiBzaXplb2YoUmVzdW1lUG9pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRSZXN1bWVPZmZzZXQoaGVhZGVyXykpOworfQorCitzdGQ6Om9wdGlvbmFsPHVpbnQzMl90PiBDb3dQYXJzZXJWMzo6RmluZFJlc3VtZU9wKGNvbnN0IHVpbnQ2NF90IGxhYmVsKSB7CisgICAgZm9yIChhdXRvJiByZXN1bWVfcG9pbnQgOiAqcmVzdW1lX3BvaW50c18pIHsKKyAgICAgICAgaWYgKHJlc3VtZV9wb2ludC5sYWJlbCA9PSBsYWJlbCkgeworICAgICAgICAgICAgcmV0dXJuIHJlc3VtZV9wb2ludC5vcF9pbmRleDsKKyAgICAgICAgfQorICAgIH0KKyAgICBMT0coRVJST1IpIDw8ICJmYWlsZWQgdG8gZmluZCBsYWJlbDogIiA8PCBsYWJlbCA8PCAiZnJvbSBmb2xsb3dpbmcgbGFiZWxzIjsKKyAgICBMT0coRVJST1IpIDw8IGFuZHJvaWQ6OmJhc2U6OkpvaW4oKnJlc3VtZV9wb2ludHNfLCAiICIpOworCisgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKK30KKworYm9vbCBDb3dQYXJzZXJWMzo6UGFyc2VPcHMoYm9ycm93ZWRfZmQgZmQsIGNvbnN0IHVpbnQzMl90IG9wX2luZGV4KSB7CisgICAgb3BzXyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp2ZWN0b3I8Q293T3BlcmF0aW9uVjM+PigpOworICAgIG9wc18tPnJlc2l6ZShvcF9pbmRleCk7CisKKyAgICAvLyByZWFkIGJlZ2lubmluZyBvZiBvcGVyYXRpb24gYnVmZmVyIC0+IHNvIG9wX2luZGV4ID0gMAorICAgIGNvbnN0IG9mZl90IG9mZnNldCA9IEdldE9wT2Zmc2V0KDAsIGhlYWRlcl8pOworICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhZEZ1bGx5QXRPZmZzZXQoZmQsIG9wc18tPmRhdGEoKSwgb3BzXy0+c2l6ZSgpICogc2l6ZW9mKENvd09wZXJhdGlvblYzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCkpIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgInJlYWQgb3BzIGZhaWxlZCI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBmaWxsIG91dCBtYXBwaW5nIG9mIFhPUiBvcCBkYXRhIGxvY2F0aW9uCisgICAgdWludDY0X3QgZGF0YV9wb3MgPSBHZXREYXRhT2Zmc2V0KGhlYWRlcl8pOworCisgICAgeG9yX2RhdGFfbG9jXyA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCB1aW50NjRfdD4+KCk7CisKKyAgICBmb3IgKGF1dG8gb3AgOiAqb3BzXykgeworICAgICAgICBpZiAob3AudHlwZSgpID09IGtDb3dYb3JPcCkgeworICAgICAgICAgICAgeG9yX2RhdGFfbG9jXy0+aW5zZXJ0KHtvcC5uZXdfYmxvY2ssIGRhdGFfcG9zfSk7CisgICAgICAgIH0gZWxzZSBpZiAob3AudHlwZSgpID09IGtDb3dSZXBsYWNlT3ApIHsKKyAgICAgICAgICAgIGlmIChkYXRhX3BvcyAhPSBvcC5zb3VyY2UoKSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgZGF0YSBsb2NhdGlvbiBmb3Igb3BlcmF0aW9uICIgPDwgb3AKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGV4cGVjdGVkOiAiIDw8IGRhdGFfcG9zOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkYXRhX3BvcyArPSBvcC5kYXRhX2xlbmd0aDsKKyAgICB9CisgICAgLy8gOlRPRE86IHNlcXVlbmNlIGJ1ZmZlciAmIHJlc3VtZSBidWZmZXIgZm9sbG93CisgICAgLy8gT25jZSB3ZSBpbXBsZW1lbnQgbGFiZWxzLCB3ZSdsbCBoYXZlIHRvIGRpc2NhcmQgdW51c2VkIG9wcyBhbmQgYWRqdXN0CisgICAgLy8gdGhlIGhlYWRlciBhcyBuZWVkZWQuCisKKyAgICBvcHNfLT5zaHJpbmtfdG9fZml0KCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb3dQYXJzZXJWMzo6VHJhbnNsYXRlKFRyYW5zbGF0ZWRDb3dPcHMqIG91dCkgeworICAgIG91dC0+b3BzID0gb3BzXzsKKyAgICBvdXQtPmhlYWRlciA9IGhlYWRlcl87CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvcGFyc2VyX3YzLmggYi9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L3BhcnNlcl92My5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYzAxYWYKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L3BhcnNlcl92My5oCkBAIC0wLDAgKzEsNjAgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG9wdGlvbmFsPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgorI2luY2x1ZGUgPGxpYnNuYXBzaG90L2Nvd19mb3JtYXQuaD4KKyNpbmNsdWRlIDxsaWJzbmFwc2hvdF9jb3cvcGFyc2VyX2Jhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHNuYXBzaG90IHsKKworY2xhc3MgQ293UGFyc2VyVjMgZmluYWwgOiBwdWJsaWMgQ293UGFyc2VyQmFzZSB7CisgIHB1YmxpYzoKKyAgICBib29sIFBhcnNlKGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIGZkLCBjb25zdCBDb3dIZWFkZXJWMyYgaGVhZGVyLAorICAgICAgICAgICAgICAgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gbGFiZWwgPSB7fSkgb3ZlcnJpZGU7CisgICAgYm9vbCBUcmFuc2xhdGUoVHJhbnNsYXRlZENvd09wcyogb3V0KSBvdmVycmlkZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8UmVzdW1lUG9pbnQ+PiByZXN1bWVfcG9pbnRzKCkgY29uc3QgeyByZXR1cm4gcmVzdW1lX3BvaW50c187IH0KKworICBwcml2YXRlOgorICAgIGJvb2wgUGFyc2VPcHMoYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgZmQsIGNvbnN0IHVpbnQzMl90IG9wX2luZGV4KTsKKyAgICBzdGQ6Om9wdGlvbmFsPHVpbnQzMl90PiBGaW5kUmVzdW1lT3AoY29uc3QgdWludDY0X3QgbGFiZWwpOworICAgIENvd0hlYWRlclYzIGhlYWRlcl8gPSB7fTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8Q293T3BlcmF0aW9uVjM+PiBvcHNfOworICAgIGJvb2wgUmVhZFJlc3VtZUJ1ZmZlcihhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBmZCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPFJlc3VtZVBvaW50Pj4gcmVzdW1lX3BvaW50c187Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L3NuYXBzaG90X3JlYWRlci5jcHAgYi9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L3NuYXBzaG90X3JlYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIwNzNmYwotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvc25hcHNob3RfcmVhZGVyLmNwcApAQCAtMCwwICsxLDI4MiBAQAorLy8KKy8vIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8KKworI2luY2x1ZGUgInNuYXBzaG90X3JlYWRlci5oIgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugc25hcHNob3QgeworCit1c2luZyBhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZDsKKworQ29tcHJlc3NlZFNuYXBzaG90UmVhZGVyOjpDb21wcmVzc2VkU25hcHNob3RSZWFkZXIoc3RkOjp1bmlxdWVfcHRyPElDb3dSZWFkZXI+JiYgY293LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4mIHNvdXJjZV9kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBibG9ja19kZXZfc2l6ZSkKKyAgICA6IGNvd18oc3RkOjptb3ZlKGNvdykpLAorICAgICAgYmxvY2tfc2l6ZV8oY293Xy0+R2V0SGVhZGVyKCkuYmxvY2tfc2l6ZSksCisgICAgICBzb3VyY2VfZGV2aWNlXyhzb3VyY2VfZGV2aWNlKSwKKyAgICAgIGJsb2NrX2RldmljZV9zaXplXyhibG9ja19kZXZfc2l6ZS52YWx1ZV9vcigwKSkgeworICAgIGNvbnN0IGF1dG8mIGhlYWRlciA9IGNvd18tPkdldEhlYWRlcigpOworICAgIGJsb2NrX3NpemVfID0gaGVhZGVyLmJsb2NrX3NpemU7CisKKyAgICAvLyBQb3B1bGF0ZSB0aGUgb3BlcmF0aW9uIG1hcC4KKyAgICBvcF9pdGVyXyA9IGNvd18tPkdldE9wSXRlcihmYWxzZSk7CisgICAgd2hpbGUgKCFvcF9pdGVyXy0+QXRFbmQoKSkgeworICAgICAgICBjb25zdCBDb3dPcGVyYXRpb24qIG9wID0gb3BfaXRlcl8tPkdldCgpOworICAgICAgICBpZiAoSXNNZXRhZGF0YU9wKCpvcCkpIHsKKyAgICAgICAgICAgIG9wX2l0ZXJfLT5OZXh0KCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBudW1fYmxvY2tzID0gMTsKKyAgICAgICAgaWYgKG9wLT50eXBlKCkgPT0ga0Nvd1JlcGxhY2VPcCkgeworICAgICAgICAgICAgbnVtX2Jsb2NrcyA9IChDb3dPcENvbXByZXNzaW9uU2l6ZShvcCwgYmxvY2tfc2l6ZV8pIC8gYmxvY2tfc2l6ZV8pOworICAgICAgICB9CisgICAgICAgIGlmIChvcC0+bmV3X2Jsb2NrID49IG9wc18uc2l6ZSgpKSB7CisgICAgICAgICAgICBvcHNfLnJlc2l6ZShvcC0+bmV3X2Jsb2NrICsgbnVtX2Jsb2NrcywgbnVsbHB0cik7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgdmVjX2luZGV4ID0gb3AtPm5ld19ibG9jazsKKyAgICAgICAgd2hpbGUgKG51bV9ibG9ja3MpIHsKKyAgICAgICAgICAgIG9wc19bdmVjX2luZGV4XSA9IG9wOworICAgICAgICAgICAgbnVtX2Jsb2NrcyAtPSAxOworICAgICAgICAgICAgdmVjX2luZGV4ICs9IDE7CisgICAgICAgIH0KKyAgICAgICAgb3BfaXRlcl8tPk5leHQoKTsKKyAgICB9Cit9CisKKy8vIE5vdCBzdXBwb3J0ZWQuCitib29sIENvbXByZXNzZWRTbmFwc2hvdFJlYWRlcjo6T3Blbihjb25zdCBjaGFyKiwgaW50LCBtb2RlX3QpIHsKKyAgICBlcnJubyA9IEVJTlZBTDsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ29tcHJlc3NlZFNuYXBzaG90UmVhZGVyOjpPcGVuKGNvbnN0IGNoYXIqLCBpbnQpIHsKKyAgICBlcnJubyA9IEVJTlZBTDsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3NzaXplX3QgQ29tcHJlc3NlZFNuYXBzaG90UmVhZGVyOjpXcml0ZShjb25zdCB2b2lkKiwgc2l6ZV90KSB7CisgICAgZXJybm8gPSBFSU5WQUw7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENvbXByZXNzZWRTbmFwc2hvdFJlYWRlcjo6QmxrSW9jdGwoaW50LCB1aW50NjRfdCwgdWludDY0X3QsIGludCopIHsKKyAgICBlcnJubyA9IEVJTlZBTDsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2JvcnJvd2VkX2ZkIENvbXByZXNzZWRTbmFwc2hvdFJlYWRlcjo6R2V0U291cmNlRmQoKSB7CisgICAgaWYgKHNvdXJjZV9mZF8gPCAwKSB7CisgICAgICAgIGlmICghc291cmNlX2RldmljZV8pIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNvbXByZXNzZWRTbmFwc2hvdFJlYWRlciBuZWVkcyBzb3VyY2UgZGV2aWNlLCBidXQgbm9uZSB3YXMgc2V0IjsKKyAgICAgICAgICAgIGVycm5vID0gRUlOVkFMOworICAgICAgICAgICAgcmV0dXJuIHstMX07CisgICAgICAgIH0KKyAgICAgICAgc291cmNlX2ZkXy5yZXNldChvcGVuKHNvdXJjZV9kZXZpY2VfLT5jX3N0cigpLCBPX1JET05MWSB8IE9fQ0xPRVhFQykpOworICAgICAgICBpZiAoc291cmNlX2ZkXyA8IDApIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJvcGVuICIgPDwgKnNvdXJjZV9kZXZpY2VfOworICAgICAgICAgICAgcmV0dXJuIHstMX07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNvdXJjZV9mZF87Cit9CisKK3NzaXplX3QgQ29tcHJlc3NlZFNuYXBzaG90UmVhZGVyOjpSZWFkKHZvaWQqIGJ1Ziwgc2l6ZV90IGNvdW50KSB7CisgICAgLy8gRmluZCB0aGUgc3RhcnQgYW5kIGVuZCBjaHVua3MsIGluY2x1c2l2ZS4KKyAgICB1aW50NjRfdCBzdGFydF9jaHVuayA9IG9mZnNldF8gLyBibG9ja19zaXplXzsKKyAgICB1aW50NjRfdCBlbmRfY2h1bmsgPSAob2Zmc2V0XyArIGNvdW50IC0gMSkgLyBibG9ja19zaXplXzsKKworICAgIC8vIENob3Agb2ZmIHRoZSBmaXJzdCBOIGJ5dGVzIGlmIHRoZSBwb3NpdGlvbiBpcyBub3QgYmxvY2stYWxpZ25lZC4KKyAgICBzaXplX3Qgc3RhcnRfb2Zmc2V0ID0gb2Zmc2V0XyAlIGJsb2NrX3NpemVfOworCisgICAgdWludDhfdCogYnVmX3BvcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGJ1Zik7CisgICAgc2l6ZV90IGJ1Zl9yZW1haW5pbmcgPSBjb3VudDsKKworICAgIHNpemVfdCBpbml0aWFsX2J5dGVzID0gc3RkOjptaW4oYmxvY2tfc2l6ZV8gLSBzdGFydF9vZmZzZXQsIGJ1Zl9yZW1haW5pbmcpOworICAgIHNzaXplX3QgcnYgPSBSZWFkQmxvY2soc3RhcnRfY2h1bmssIHN0YXJ0X29mZnNldCwgYnVmX3BvcywgaW5pdGlhbF9ieXRlcyk7CisgICAgaWYgKHJ2IDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG9mZnNldF8gKz0gcnY7CisgICAgYnVmX3BvcyArPSBydjsKKyAgICBidWZfcmVtYWluaW5nIC09IHJ2OworCisgICAgZm9yICh1aW50NjRfdCBjaHVuayA9IHN0YXJ0X2NodW5rICsgMTsgY2h1bmsgPCBlbmRfY2h1bms7IGNodW5rKyspIHsKKyAgICAgICAgc3NpemVfdCBydiA9IFJlYWRCbG9jayhjaHVuaywgMCwgYnVmX3BvcywgYnVmX3JlbWFpbmluZyk7CisgICAgICAgIGlmIChydiA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXRfICs9IHJ2OworICAgICAgICBidWZfcG9zICs9IHJ2OworICAgICAgICBidWZfcmVtYWluaW5nIC09IHJ2OworICAgIH0KKworICAgIGlmIChidWZfcmVtYWluaW5nKSB7CisgICAgICAgIHNzaXplX3QgcnYgPSBSZWFkQmxvY2soZW5kX2NodW5rLCAwLCBidWZfcG9zLCBidWZfcmVtYWluaW5nKTsKKyAgICAgICAgaWYgKHJ2IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIG9mZnNldF8gKz0gcnY7CisgICAgICAgIGJ1Zl9wb3MgKz0gcnY7CisgICAgICAgIGJ1Zl9yZW1haW5pbmcgLT0gcnY7CisgICAgfQorCisgICAgQ0hFQ0tfRVEoYnVmX3BvcyAtIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGJ1ZiksIGNvdW50KTsKKyAgICBDSEVDS19FUShidWZfcmVtYWluaW5nLCAwKTsKKworICAgIGVycm5vID0gMDsKKyAgICByZXR1cm4gY291bnQ7Cit9CisKK3NzaXplX3QgQ29tcHJlc3NlZFNuYXBzaG90UmVhZGVyOjpSZWFkQmxvY2sodWludDY0X3QgY2h1bmssIHNpemVfdCBzdGFydF9vZmZzZXQsIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlcl9zaXplKSB7CisgICAgc2l6ZV90IGJ5dGVzX3RvX3JlYWQgPSBzdGQ6Om1pbihzdGF0aWNfY2FzdDxzaXplX3Q+KGJsb2NrX3NpemVfKSwgYnVmZmVyX3NpemUpOworCisgICAgLy8gVGhlIG9mZnNldCBpcyByZWxhdGl2ZSB0byB0aGUgY2h1bms7IHdlIHNob3VsZCBiZSByZWFkaW5nIG5vIG1vcmUgdGhhbgorICAgIC8vIG9uZSBjaHVuay4KKyAgICBDSEVDSyhzdGFydF9vZmZzZXQgKyBieXRlc190b19yZWFkIDw9IGJsb2NrX3NpemVfKTsKKworICAgIGNvbnN0IENvd09wZXJhdGlvbiogb3AgPSBudWxscHRyOworICAgIGlmIChjaHVuayA8IG9wc18uc2l6ZSgpKSB7CisgICAgICAgIG9wID0gb3BzX1tjaHVua107CisgICAgfQorCisgICAgaWYgKCFvcCB8fCBvcC0+dHlwZSgpID09IGtDb3dDb3B5T3ApIHsKKyAgICAgICAgYm9ycm93ZWRfZmQgZmQgPSBHZXRTb3VyY2VGZCgpOworICAgICAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgICAgICAvLyBHZXRTb3VyY2VGZCBzZXRzIGVycm5vLgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9wKSB7CisgICAgICAgICAgICB1aW50NjRfdCBzb3VyY2Vfb2Zmc2V0OworICAgICAgICAgICAgaWYgKCFjb3dfLT5HZXRTb3VyY2VPZmZzZXQob3AsICZzb3VyY2Vfb2Zmc2V0KSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkdldFNvdXJjZU9mZnNldCBmYWlsZWQgaW4gQ29tcHJlc3NlZFNuYXBzaG90UmVhZGVyIGZvciBvcDogIiA8PCAqb3A7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2h1bmsgPSBHZXRCbG9ja0Zyb21PZmZzZXQoY293Xy0+R2V0SGVhZGVyKCksIHNvdXJjZV9vZmZzZXQpOworICAgICAgICB9CisKKyAgICAgICAgb2ZmNjRfdCBvZmZzZXQgPSAoY2h1bmsgKiBibG9ja19zaXplXykgKyBzdGFydF9vZmZzZXQ7CisgICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhZEZ1bGx5QXRPZmZzZXQoZmQsIGJ1ZmZlciwgYnl0ZXNfdG9fcmVhZCwgb2Zmc2V0KSkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgInJlYWQgIiA8PCAqc291cmNlX2RldmljZV87CisgICAgICAgICAgICAvLyBSZWFkRnVsbHlBdE9mZnNldCBzZXRzIGVycm5vLgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChvcC0+dHlwZSgpID09IGtDb3daZXJvT3ApIHsKKyAgICAgICAgbWVtc2V0KGJ1ZmZlciwgMCwgYnl0ZXNfdG9fcmVhZCk7CisgICAgfSBlbHNlIGlmIChvcC0+dHlwZSgpID09IGtDb3dSZXBsYWNlT3ApIHsKKyAgICAgICAgc2l6ZV90IGJ1ZmZlcl9zaXplID0gQ293T3BDb21wcmVzc2lvblNpemUob3AsIGJsb2NrX3NpemVfKTsKKyAgICAgICAgdWludDhfdCB0ZW1wX2J1ZmZlcltidWZmZXJfc2l6ZV07CisgICAgICAgIGlmIChjb3dfLT5SZWFkRGF0YShvcCwgdGVtcF9idWZmZXIsIGJ1ZmZlcl9zaXplLCAwKSA8IGJ1ZmZlcl9zaXplKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDb21wcmVzc2VkU25hcHNob3RSZWFkZXIgZmFpbGVkIHRvIHJlYWQgcmVwbGFjZSBvcDogYnVmZmVyX3NpemU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgYnVmZmVyX3NpemUgPDwgInN0YXJ0X29mZnNldDogIiA8PCBzdGFydF9vZmZzZXQ7CisgICAgICAgICAgICBlcnJubyA9IEVJTzsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBvZmZfdCBibG9ja19vZmZzZXR7fTsKKyAgICAgICAgaWYgKCFHZXRCbG9ja09mZnNldChvcCwgY2h1bmssIGJsb2NrX3NpemVfLCAmYmxvY2tfb2Zmc2V0KSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiR2V0QmxvY2tPZmZzZXQgZmFpbGVkIjsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6Om1lbWNweShidWZmZXIsIChjaGFyKil0ZW1wX2J1ZmZlciArIGJsb2NrX29mZnNldCArIHN0YXJ0X29mZnNldCwgYnl0ZXNfdG9fcmVhZCk7CisgICAgfSBlbHNlIGlmIChvcC0+dHlwZSgpID09IGtDb3dYb3JPcCkgeworICAgICAgICBib3Jyb3dlZF9mZCBmZCA9IEdldFNvdXJjZUZkKCk7CisgICAgICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgICAgIC8vIEdldFNvdXJjZUZkIHNldHMgZXJybm8uCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICB1aW50NjRfdCBzb3VyY2Vfb2Zmc2V0OworICAgICAgICBpZiAoIWNvd18tPkdldFNvdXJjZU9mZnNldChvcCwgJnNvdXJjZV9vZmZzZXQpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJHZXRTb3VyY2VPZmZzZXQgZmFpbGVkIGluIENvbXByZXNzZWRTbmFwc2hvdFJlYWRlciBmb3Igb3A6ICIgPDwgKm9wOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIG9mZjY0X3Qgb2Zmc2V0ID0gc291cmNlX29mZnNldCArIHN0YXJ0X29mZnNldDsKKworICAgICAgICBzdGQ6OnN0cmluZyBkYXRhKGJ5dGVzX3RvX3JlYWQsICdcMCcpOworICAgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseUF0T2Zmc2V0KGZkLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCksIG9mZnNldCkpIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJyZWFkICIgPDwgKnNvdXJjZV9kZXZpY2VfOworICAgICAgICAgICAgLy8gUmVhZEZ1bGx5QXRPZmZzZXQgc2V0cyBlcnJuby4KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb3dfLT5SZWFkRGF0YShvcCwgYnVmZmVyLCBieXRlc190b19yZWFkLCBzdGFydF9vZmZzZXQpIDwgYnl0ZXNfdG9fcmVhZCkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ29tcHJlc3NlZFNuYXBzaG90UmVhZGVyIGZhaWxlZCB0byByZWFkIHhvciBvcCI7CisgICAgICAgICAgICBlcnJubyA9IEVJTzsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYnl0ZXNfdG9fcmVhZDsgaSsrKSB7CisgICAgICAgICAgICAoKGNoYXIqKWJ1ZmZlcilbaV0gXj0gZGF0YVtpXTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNvbXByZXNzZWRTbmFwc2hvdFJlYWRlciB1bmtub3duIG9wIHR5cGU6ICIgPDwgdWludDMyX3Qob3AtPnR5cGUoKSk7CisgICAgICAgIGVycm5vID0gRUlOVkFMOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8gTWVtb3J5Qnl0ZVNpbmsgZG9lc24ndCBkbyBhbnl0aGluZyBpbiBSZXR1cm5CdWZmZXIsIHNvIGRvbid0IGJvdGhlciBjYWxsaW5nIGl0LgorICAgIHJldHVybiBieXRlc190b19yZWFkOworfQorCitvZmY2NF90IENvbXByZXNzZWRTbmFwc2hvdFJlYWRlcjo6U2VlayhvZmY2NF90IG9mZnNldCwgaW50IHdoZW5jZSkgeworICAgIHN3aXRjaCAod2hlbmNlKSB7CisgICAgICAgIGNhc2UgU0VFS19TRVQ6CisgICAgICAgICAgICBvZmZzZXRfID0gb2Zmc2V0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0VFS19FTkQ6CisgICAgICAgICAgICBvZmZzZXRfID0gc3RhdGljX2Nhc3Q8b2ZmNjRfdD4oYmxvY2tfZGV2aWNlX3NpemVfKSArIG9mZnNldDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNFRUtfQ1VSOgorICAgICAgICAgICAgb2Zmc2V0XyArPSBvZmZzZXQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlVucmVjb2duaXplZCBzZWVrIHdoZW5jZTogIiA8PCB3aGVuY2U7CisgICAgICAgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIG9mZnNldF87Cit9CisKK3VpbnQ2NF90IENvbXByZXNzZWRTbmFwc2hvdFJlYWRlcjo6QmxvY2tEZXZTaXplKCkgeworICAgIHJldHVybiBibG9ja19kZXZpY2Vfc2l6ZV87Cit9CisKK2Jvb2wgQ29tcHJlc3NlZFNuYXBzaG90UmVhZGVyOjpDbG9zZSgpIHsKKyAgICBjb3dfID0gbnVsbHB0cjsKKyAgICBzb3VyY2VfZmRfID0ge307CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29tcHJlc3NlZFNuYXBzaG90UmVhZGVyOjpJc1NldHRpbmdFcnJubygpIHsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb21wcmVzc2VkU25hcHNob3RSZWFkZXI6OklzT3BlbigpIHsKKyAgICByZXR1cm4gY293XyAhPSBudWxscHRyOworfQorCitib29sIENvbXByZXNzZWRTbmFwc2hvdFJlYWRlcjo6Rmx1c2goKSB7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwc2hvdF9yZWFkZXIuaCBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvc25hcHNob3RfcmVhZGVyLmgKc2ltaWxhcml0eSBpbmRleCA2NCUKcmVuYW1lIGZyb20gZnNfbWdyL2xpYnNuYXBzaG90L3NuYXBzaG90X3JlYWRlci5oCnJlbmFtZSB0byBmc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L3NuYXBzaG90X3JlYWRlci5oCmluZGV4IGEzZTdlMjIuLjNkZTYzZWQgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwc2hvdF9yZWFkZXIuaAorKysgYi9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L3NuYXBzaG90X3JlYWRlci5oCkBAIC0yNiwxOCArMjYsMTYgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBzbmFwc2hvdCB7CiAKLWNsYXNzIFJlYWRPbmx5RmlsZURlc2NyaXB0b3IgOiBwdWJsaWMgY2hyb21lb3NfdXBkYXRlX2VuZ2luZTo6RmlsZURlc2NyaXB0b3IgeworY2xhc3MgQ29tcHJlc3NlZFNuYXBzaG90UmVhZGVyIDogcHVibGljIGNocm9tZW9zX3VwZGF0ZV9lbmdpbmU6OkZpbGVEZXNjcmlwdG9yIHsKICAgcHVibGljOgorICAgIENvbXByZXNzZWRTbmFwc2hvdFJlYWRlcihzdGQ6OnVuaXF1ZV9wdHI8SUNvd1JlYWRlcj4mJiBjb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+JiBzb3VyY2VfZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBibG9ja19kZXZfc2l6ZSk7CisKICAgICBib29sIE9wZW4oY29uc3QgY2hhciogcGF0aCwgaW50IGZsYWdzLCBtb2RlX3QgbW9kZSkgb3ZlcnJpZGU7CiAgICAgYm9vbCBPcGVuKGNvbnN0IGNoYXIqIHBhdGgsIGludCBmbGFncykgb3ZlcnJpZGU7CiAgICAgc3NpemVfdCBXcml0ZShjb25zdCB2b2lkKiBidWYsIHNpemVfdCBjb3VudCkgb3ZlcnJpZGU7CiAgICAgYm9vbCBCbGtJb2N0bChpbnQgcmVxdWVzdCwgdWludDY0X3Qgc3RhcnQsIHVpbnQ2NF90IGxlbmd0aCwgaW50KiByZXN1bHQpIG92ZXJyaWRlOwotfTsKLQotY2xhc3MgUmVhZEZkRmlsZURlc2NyaXB0b3IgOiBwdWJsaWMgUmVhZE9ubHlGaWxlRGVzY3JpcHRvciB7Ci0gIHB1YmxpYzoKLSAgICBleHBsaWNpdCBSZWFkRmRGaWxlRGVzY3JpcHRvcihhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQmJiBmZCk7Ci0KICAgICBzc2l6ZV90IFJlYWQodm9pZCogYnVmLCBzaXplX3QgY291bnQpIG92ZXJyaWRlOwogICAgIG9mZjY0X3QgU2VlayhvZmY2NF90IG9mZnNldCwgaW50IHdoZW5jZSkgb3ZlcnJpZGU7CiAgICAgdWludDY0X3QgQmxvY2tEZXZTaXplKCkgb3ZlcnJpZGU7CkBAIC00NywyOSArNDUsMTAgQEAKICAgICBib29sIEZsdXNoKCkgb3ZlcnJpZGU7CiAKICAgcHJpdmF0ZToKLSAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgZmRfOwotfTsKLQotY2xhc3MgQ29tcHJlc3NlZFNuYXBzaG90UmVhZGVyIDogcHVibGljIFJlYWRPbmx5RmlsZURlc2NyaXB0b3IgewotICBwdWJsaWM6Ci0gICAgYm9vbCBTZXRDb3coc3RkOjp1bmlxdWVfcHRyPENvd1JlYWRlcj4mJiBjb3cpOwotICAgIHZvaWQgU2V0U291cmNlRGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VfZGV2aWNlKTsKLSAgICB2b2lkIFNldEJsb2NrRGV2aWNlU2l6ZSh1aW50NjRfdCBibG9ja19kZXZpY2Vfc2l6ZSk7Ci0KLSAgICBzc2l6ZV90IFJlYWQodm9pZCogYnVmLCBzaXplX3QgY291bnQpIG92ZXJyaWRlOwotICAgIG9mZjY0X3QgU2VlayhvZmY2NF90IG9mZnNldCwgaW50IHdoZW5jZSkgb3ZlcnJpZGU7Ci0gICAgdWludDY0X3QgQmxvY2tEZXZTaXplKCkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBDbG9zZSgpIG92ZXJyaWRlOwotICAgIGJvb2wgSXNTZXR0aW5nRXJybm8oKSBvdmVycmlkZTsKLSAgICBib29sIElzT3BlbigpIG92ZXJyaWRlOwotICAgIGJvb2wgRmx1c2goKSBvdmVycmlkZTsKLQotICBwcml2YXRlOgotICAgIHNzaXplX3QgUmVhZEJsb2NrKHVpbnQ2NF90IGNodW5rLCBJQnl0ZVNpbmsqIHNpbmssIHNpemVfdCBzdGFydF9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4mIG1heF9ieXRlcyA9IHt9KTsKKyAgICBzc2l6ZV90IFJlYWRCbG9jayh1aW50NjRfdCBjaHVuaywgc2l6ZV90IHN0YXJ0X29mZnNldCwgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CiAgICAgYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgR2V0U291cmNlRmQoKTsKIAotICAgIHN0ZDo6dW5pcXVlX3B0cjxDb3dSZWFkZXI+IGNvd187CisgICAgc3RkOjp1bmlxdWVfcHRyPElDb3dSZWFkZXI+IGNvd187CiAgICAgc3RkOjp1bmlxdWVfcHRyPElDb3dPcEl0ZXI+IG9wX2l0ZXJfOwogICAgIHVpbnQzMl90IGJsb2NrX3NpemVfID0gMDsKIApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXBzaG90X3JlYWRlcl90ZXN0LmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvc25hcHNob3RfcmVhZGVyX3Rlc3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggODglCnJlbmFtZSBmcm9tIGZzX21nci9saWJzbmFwc2hvdC9zbmFwc2hvdF9yZWFkZXJfdGVzdC5jcHAKcmVuYW1lIHRvIGZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvc25hcHNob3RfcmVhZGVyX3Rlc3QuY3BwCmluZGV4IDlhZGM2NTUuLmYwMGYyMzYgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwc2hvdF9yZWFkZXJfdGVzdC5jcHAKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9zbmFwc2hvdF9yZWFkZXJfdGVzdC5jcHAKQEAgLTEyLDggKzEyLDYgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0jaW5jbHVkZSA8bGlic25hcHNob3Qvc25hcHNob3QuaD4KLQogI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgpAQCAtNjEsNyArNTksNyBAQAogICAgICAgICBBU1NFUlRfRVEoZnN5bmMoYmFzZV8tPmZkKSwgMCk7CiAgICAgfQogCi0gICAgdm9pZCBXcml0ZUNvdyhJU25hcHNob3RXcml0ZXIqIHdyaXRlcikgeworICAgIHZvaWQgV3JpdGVDb3coSUNvd1dyaXRlciogd3JpdGVyKSB7CiAgICAgICAgIHN0ZDo6c3RyaW5nIG5ld19ibG9jayA9IE1ha2VOZXdCbG9ja1N0cmluZygpOwogICAgICAgICBzdGQ6OnN0cmluZyB4b3JfYmxvY2sgPSBNYWtlWG9yQmxvY2tTdHJpbmcoKTsKIApAQCAtNzIsOCArNzAsOCBAQAogICAgICAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOwogICAgIH0KIAotICAgIHZvaWQgVGVzdEJsb2NrUmVhZHMoSVNuYXBzaG90V3JpdGVyKiB3cml0ZXIpIHsKLSAgICAgICAgYXV0byByZWFkZXIgPSB3cml0ZXItPk9wZW5SZWFkZXIoKTsKKyAgICB2b2lkIFRlc3RCbG9ja1JlYWRzKElDb3dXcml0ZXIqIHdyaXRlcikgeworICAgICAgICBhdXRvIHJlYWRlciA9IHdyaXRlci0+T3BlbkZpbGVEZXNjcmlwdG9yKGJhc2VfLT5wYXRoKTsKICAgICAgICAgQVNTRVJUX05FKHJlYWRlciwgbnVsbHB0cik7CiAKICAgICAgICAgLy8gVGVzdCB0aGF0IHVuY2hhbmdlZCBibG9ja3MgYXJlIG5vdCBtb2RpZmllZC4KQEAgLTExNyw4ICsxMTUsOCBAQAogICAgICAgICBBU1NFUlRfRVEodHdvX2Jsb2NrcywgemVyb2VzKTsKICAgICB9CiAKLSAgICB2b2lkIFRlc3RCeXRlUmVhZHMoSVNuYXBzaG90V3JpdGVyKiB3cml0ZXIpIHsKLSAgICAgICAgYXV0byByZWFkZXIgPSB3cml0ZXItPk9wZW5SZWFkZXIoKTsKKyAgICB2b2lkIFRlc3RCeXRlUmVhZHMoSUNvd1dyaXRlciogd3JpdGVyKSB7CisgICAgICAgIGF1dG8gcmVhZGVyID0gd3JpdGVyLT5PcGVuRmlsZURlc2NyaXB0b3IoYmFzZV8tPnBhdGgpOwogICAgICAgICBBU1NFUlRfTkUocmVhZGVyLCBudWxscHRyKTsKIAogICAgICAgICBzdGQ6OnN0cmluZyBibG9iKGtCbG9ja1NpemUgKiAzLCAneCcpOwpAQCAtMTQwLDkgKzEzOCwyMSBAQAogICAgICAgICBBU1NFUlRfRVEocmVhZGVyLT5TZWVrKG9mZnNldCwgU0VFS19TRVQpLCBvZmZzZXQpOwogICAgICAgICBBU1NFUlRfRVEocmVhZGVyLT5SZWFkKCZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSksIHNpemVvZih2YWx1ZSkpOwogICAgICAgICBBU1NFUlRfRVEodmFsdWUsIE1ha2VOZXdCbG9ja1N0cmluZygpWzEwMDBdKTsKKworICAgICAgICAvLyBUZXN0IGEgc2VxdWVuY2Ugb2Ygb25lIGJ5dGUgcmVhZHMuCisgICAgICAgIG9mZnNldCA9IDUgKiBrQmxvY2tTaXplICsgMTA7CisgICAgICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkID0gTWFrZU5ld0Jsb2NrU3RyaW5nKCkuc3Vic3RyKDEwLCAyMCk7CisgICAgICAgIEFTU0VSVF9FUShyZWFkZXItPlNlZWsob2Zmc2V0LCBTRUVLX1NFVCksIG9mZnNldCk7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgZ290OworICAgICAgICB3aGlsZSAoZ290LnNpemUoKSA8IGV4cGVjdGVkLnNpemUoKSkgeworICAgICAgICAgICAgQVNTRVJUX0VRKHJlYWRlci0+UmVhZCgmdmFsdWUsIHNpemVvZih2YWx1ZSkpLCBzaXplb2YodmFsdWUpKTsKKyAgICAgICAgICAgIGdvdC5wdXNoX2JhY2sodmFsdWUpOworICAgICAgICB9CisgICAgICAgIEFTU0VSVF9FUShnb3QsIGV4cGVjdGVkKTsKICAgICB9CiAKLSAgICB2b2lkIFRlc3RSZWFkcyhJU25hcHNob3RXcml0ZXIqIHdyaXRlcikgeworICAgIHZvaWQgVGVzdFJlYWRzKElDb3dXcml0ZXIqIHdyaXRlcikgewogICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShUZXN0QmxvY2tSZWFkcyh3cml0ZXIpKTsKICAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoVGVzdEJ5dGVSZWFkcyh3cml0ZXIpKTsKICAgICB9CkBAIC0xNzQsMTAgKzE4NCw3IEBACiAgICAgdW5pcXVlX2ZkIGNvd19mZChkdXAoY293Xy0+ZmQpKTsKICAgICBBU1NFUlRfR0UoY293X2ZkLCAwKTsKIAotICAgIGF1dG8gd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb21wcmVzc2VkU25hcHNob3RXcml0ZXI+KG9wdGlvbnMpOwotICAgIHdyaXRlci0+U2V0U291cmNlRGV2aWNlKGJhc2VfLT5wYXRoKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPlNldENvd0RldmljZShzdGQ6Om1vdmUoY293X2ZkKSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZSgpKTsKKyAgICBhdXRvIHdyaXRlciA9IENyZWF0ZUNvd1dyaXRlcigyLCBvcHRpb25zLCBzdGQ6Om1vdmUoY293X2ZkKSk7CiAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoV3JpdGVDb3cod3JpdGVyLmdldCgpKSk7CiAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoVGVzdFJlYWRzKHdyaXRlci5nZXQoKSkpOwogfQpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy90ZXN0X3YyLmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvdGVzdF92Mi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdiYzJjOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvdGVzdF92Mi5jcHAKQEAgLTAsMCArMSwxNTY0IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZ192aWV3PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGxpYnNuYXBzaG90L2Nvd19yZWFkZXIuaD4KKyNpbmNsdWRlIDxsaWJzbmFwc2hvdC9jb3dfd3JpdGVyLmg+CisjaW5jbHVkZSAiY293X2RlY29tcHJlc3MuaCIKKyNpbmNsdWRlICJ3cml0ZXJfdjIuaCIKKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOwordXNpbmcgdGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZTsKK3VzaW5nIHRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdDsKK3VzaW5nIHRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3M7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBzbmFwc2hvdCB7CisKK2NsYXNzIENvd1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyAgcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgY293XyA9IHN0ZDo6bWFrZV91bmlxdWU8VGVtcG9yYXJ5RmlsZT4oKTsKKyAgICAgICAgQVNTRVJUX0dFKGNvd18tPmZkLCAwKSA8PCBzdHJlcnJvcihlcnJubyk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeyBjb3dfID0gbnVsbHB0cjsgfQorCisgICAgdW5pcXVlX2ZkIEdldENvd0ZkKCkgeyByZXR1cm4gdW5pcXVlX2Zke2R1cChjb3dfLT5mZCl9OyB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VGVtcG9yYXJ5RmlsZT4gY293XzsKK307CisKKy8vIEhlbHBlciB0byBjaGVjayByZWFkIHNpemVzLgorc3RhdGljIGlubGluZSBib29sIFJlYWREYXRhKENvd1JlYWRlciYgcmVhZGVyLCBjb25zdCBDb3dPcGVyYXRpb24qIG9wLCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKSB7CisgICAgcmV0dXJuIHJlYWRlci5SZWFkRGF0YShvcCwgYnVmZmVyLCBzaXplKSA9PSBzaXplOworfQorCitURVNUX0YoQ293VGVzdCwgQ29weUNvbnRpZ3VvdXMpIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDA7CisgICAgQ293V3JpdGVyVjIgd3JpdGVyKG9wdGlvbnMsIEdldENvd0ZkKCkpOworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkluaXRpYWxpemUoKSk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weSgxMCwgMTAwMCwgMTAwKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkZpbmFsaXplKCkpOworICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKKworICAgIENvd1JlYWRlciByZWFkZXI7CisgICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7CisKKyAgICBjb25zdCBhdXRvJiBoZWFkZXIgPSByZWFkZXIuR2V0SGVhZGVyKCk7CisgICAgQVNTRVJUX0VRKGhlYWRlci5wcmVmaXgubWFnaWMsIGtDb3dNYWdpY051bWJlcik7CisgICAgQVNTRVJUX0VRKGhlYWRlci5wcmVmaXgubWFqb3JfdmVyc2lvbiwga0Nvd1ZlcnNpb25NYWpvcik7CisgICAgQVNTRVJUX0VRKGhlYWRlci5wcmVmaXgubWlub3JfdmVyc2lvbiwga0Nvd1ZlcnNpb25NaW5vcik7CisgICAgQVNTRVJUX0VRKGhlYWRlci5ibG9ja19zaXplLCBvcHRpb25zLmJsb2NrX3NpemUpOworCisgICAgQ293Rm9vdGVyIGZvb3RlcjsKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuR2V0Rm9vdGVyKCZmb290ZXIpKTsKKyAgICBBU1NFUlRfRVEoZm9vdGVyLm9wLm51bV9vcHMsIDEwMCk7CisKKyAgICBhdXRvIGl0ZXIgPSByZWFkZXIuR2V0T3BJdGVyKCk7CisgICAgQVNTRVJUX05FKGl0ZXIsIG51bGxwdHIpOworICAgIEFTU0VSVF9GQUxTRShpdGVyLT5BdEVuZCgpKTsKKworICAgIHNpemVfdCBpID0gMDsKKyAgICB3aGlsZSAoIWl0ZXItPkF0RW5kKCkpIHsKKyAgICAgICAgYXV0byBvcCA9IGl0ZXItPkdldCgpOworICAgICAgICBBU1NFUlRfRVEob3AtPnR5cGUoKSwga0Nvd0NvcHlPcCk7CisgICAgICAgIEFTU0VSVF9FUShvcC0+ZGF0YV9sZW5ndGgsIDApOworICAgICAgICBBU1NFUlRfRVEob3AtPm5ld19ibG9jaywgMTAgKyBpKTsKKyAgICAgICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UoKSwgMTAwMCArIGkpOworICAgICAgICBpdGVyLT5OZXh0KCk7CisgICAgICAgIGkgKz0gMTsKKyAgICB9CisKKyAgICBBU1NFUlRfRVEoaSwgMTAwKTsKK30KKworVEVTVF9GKENvd1Rlc3QsIFJlYWRXcml0ZSkgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBvcHRpb25zLmNsdXN0ZXJfb3BzID0gMDsKKyAgICBDb3dXcml0ZXJWMiB3cml0ZXIob3B0aW9ucywgR2V0Q293RmQoKSk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuSW5pdGlhbGl6ZSgpKTsKKworICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSAiVGhpcyBpcyBzb21lIGRhdGEsIGJlbGlldmUgaXQiOworICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weSgxMCwgMjApKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkUmF3QmxvY2tzKDUwLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWmVyb0Jsb2Nrcyg1MSwgMikpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5GaW5hbGl6ZSgpKTsKKworICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKKworICAgIENvd1JlYWRlciByZWFkZXI7CisgICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7CisKKyAgICBjb25zdCBhdXRvJiBoZWFkZXIgPSByZWFkZXIuR2V0SGVhZGVyKCk7CisgICAgQVNTRVJUX0VRKGhlYWRlci5wcmVmaXgubWFnaWMsIGtDb3dNYWdpY051bWJlcik7CisgICAgQVNTRVJUX0VRKGhlYWRlci5wcmVmaXgubWFqb3JfdmVyc2lvbiwga0Nvd1ZlcnNpb25NYWpvcik7CisgICAgQVNTRVJUX0VRKGhlYWRlci5wcmVmaXgubWlub3JfdmVyc2lvbiwga0Nvd1ZlcnNpb25NaW5vcik7CisgICAgQVNTRVJUX0VRKGhlYWRlci5ibG9ja19zaXplLCBvcHRpb25zLmJsb2NrX3NpemUpOworCisgICAgQ293Rm9vdGVyIGZvb3RlcjsKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuR2V0Rm9vdGVyKCZmb290ZXIpKTsKKyAgICBBU1NFUlRfRVEoZm9vdGVyLm9wLm51bV9vcHMsIDQpOworCisgICAgYXV0byBpdGVyID0gcmVhZGVyLkdldE9wSXRlcigpOworICAgIEFTU0VSVF9ORShpdGVyLCBudWxscHRyKTsKKyAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisgICAgYXV0byBvcCA9IGl0ZXItPkdldCgpOworCisgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3dDb3B5T3ApOworICAgIEFTU0VSVF9FUShvcC0+ZGF0YV9sZW5ndGgsIDApOworICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCAxMCk7CisgICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UoKSwgMjApOworCisgICAgc3RkOjpzdHJpbmcgc2luayhkYXRhLnNpemUoKSwgJ1wwJyk7CisKKyAgICBpdGVyLT5OZXh0KCk7CisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIG9wID0gaXRlci0+R2V0KCk7CisKKyAgICBBU1NFUlRfRVEob3AtPnR5cGUoKSwga0Nvd1JlcGxhY2VPcCk7CisgICAgQVNTRVJUX0VRKG9wLT5kYXRhX2xlbmd0aCwgNDA5Nik7CisgICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssIDUwKTsKKyAgICBBU1NFUlRfVFJVRShSZWFkRGF0YShyZWFkZXIsIG9wLCBzaW5rLmRhdGEoKSwgc2luay5zaXplKCkpKTsKKyAgICBBU1NFUlRfRVEoc2luaywgZGF0YSk7CisKKyAgICBpdGVyLT5OZXh0KCk7CisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIG9wID0gaXRlci0+R2V0KCk7CisKKyAgICAvLyBOb3RlOiB0aGUgemVybyBvcGVyYXRpb24gZ2V0cyBzcGxpdCBpbnRvIHR3byBibG9ja3MuCisgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3daZXJvT3ApOworICAgIEFTU0VSVF9FUShvcC0+ZGF0YV9sZW5ndGgsIDApOworICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCA1MSk7CisgICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UoKSwgMCk7CisKKyAgICBpdGVyLT5OZXh0KCk7CisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIG9wID0gaXRlci0+R2V0KCk7CisKKyAgICBBU1NFUlRfRVEob3AtPnR5cGUoKSwga0Nvd1plcm9PcCk7CisgICAgQVNTRVJUX0VRKG9wLT5kYXRhX2xlbmd0aCwgMCk7CisgICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssIDUyKTsKKyAgICBBU1NFUlRfRVEob3AtPnNvdXJjZSgpLCAwKTsKKworICAgIGl0ZXItPk5leHQoKTsKKyAgICBBU1NFUlRfVFJVRShpdGVyLT5BdEVuZCgpKTsKK30KKworVEVTVF9GKENvd1Rlc3QsIFJlYWRXcml0ZVhvcikgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBvcHRpb25zLmNsdXN0ZXJfb3BzID0gMDsKKyAgICBDb3dXcml0ZXJWMiB3cml0ZXIob3B0aW9ucywgR2V0Q293RmQoKSk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuSW5pdGlhbGl6ZSgpKTsKKworICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSAiVGhpcyBpcyBzb21lIGRhdGEsIGJlbGlldmUgaXQiOworICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weSgxMCwgMjApKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWG9yQmxvY2tzKDUwLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCksIDI0LCAxMCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRaZXJvQmxvY2tzKDUxLCAyKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkZpbmFsaXplKCkpOworCisgICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOworCisgICAgQ293UmVhZGVyIHJlYWRlcjsKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKKworICAgIGNvbnN0IGF1dG8mIGhlYWRlciA9IHJlYWRlci5HZXRIZWFkZXIoKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLnByZWZpeC5tYWdpYywga0Nvd01hZ2ljTnVtYmVyKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLnByZWZpeC5tYWpvcl92ZXJzaW9uLCBrQ293VmVyc2lvbk1ham9yKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLnByZWZpeC5taW5vcl92ZXJzaW9uLCBrQ293VmVyc2lvbk1pbm9yKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLmJsb2NrX3NpemUsIG9wdGlvbnMuYmxvY2tfc2l6ZSk7CisKKyAgICBDb3dGb290ZXIgZm9vdGVyOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci5HZXRGb290ZXIoJmZvb3RlcikpOworICAgIEFTU0VSVF9FUShmb290ZXIub3AubnVtX29wcywgNCk7CisKKyAgICBhdXRvIGl0ZXIgPSByZWFkZXIuR2V0T3BJdGVyKCk7CisgICAgQVNTRVJUX05FKGl0ZXIsIG51bGxwdHIpOworICAgIEFTU0VSVF9GQUxTRShpdGVyLT5BdEVuZCgpKTsKKyAgICBhdXRvIG9wID0gaXRlci0+R2V0KCk7CisKKyAgICBBU1NFUlRfRVEob3AtPnR5cGUoKSwga0Nvd0NvcHlPcCk7CisgICAgQVNTRVJUX0VRKG9wLT5kYXRhX2xlbmd0aCwgMCk7CisgICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssIDEwKTsKKyAgICBBU1NFUlRfRVEob3AtPnNvdXJjZSgpLCAyMCk7CisKKyAgICBzdGQ6OnN0cmluZyBzaW5rKGRhdGEuc2l6ZSgpLCAnXDAnKTsKKworICAgIGl0ZXItPk5leHQoKTsKKyAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisgICAgb3AgPSBpdGVyLT5HZXQoKTsKKworICAgIEFTU0VSVF9FUShvcC0+dHlwZSgpLCBrQ293WG9yT3ApOworICAgIEFTU0VSVF9FUShvcC0+ZGF0YV9sZW5ndGgsIDQwOTYpOworICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCA1MCk7CisgICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UoKSwgOTgzMTQpOyAgLy8gNDA5NiAqIDI0ICsgMTAKKyAgICBBU1NFUlRfVFJVRShSZWFkRGF0YShyZWFkZXIsIG9wLCBzaW5rLmRhdGEoKSwgc2luay5zaXplKCkpKTsKKyAgICBBU1NFUlRfRVEoc2luaywgZGF0YSk7CisKKyAgICBpdGVyLT5OZXh0KCk7CisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIG9wID0gaXRlci0+R2V0KCk7CisKKyAgICAvLyBOb3RlOiB0aGUgemVybyBvcGVyYXRpb24gZ2V0cyBzcGxpdCBpbnRvIHR3byBibG9ja3MuCisgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3daZXJvT3ApOworICAgIEFTU0VSVF9FUShvcC0+ZGF0YV9sZW5ndGgsIDApOworICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCA1MSk7CisgICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UoKSwgMCk7CisKKyAgICBpdGVyLT5OZXh0KCk7CisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIG9wID0gaXRlci0+R2V0KCk7CisKKyAgICBBU1NFUlRfRVEob3AtPnR5cGUoKSwga0Nvd1plcm9PcCk7CisgICAgQVNTRVJUX0VRKG9wLT5kYXRhX2xlbmd0aCwgMCk7CisgICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssIDUyKTsKKyAgICBBU1NFUlRfRVEob3AtPnNvdXJjZSgpLCAwKTsKKworICAgIGl0ZXItPk5leHQoKTsKKyAgICBBU1NFUlRfVFJVRShpdGVyLT5BdEVuZCgpKTsKK30KKworVEVTVF9GKENvd1Rlc3QsIENvbXByZXNzR3opIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDA7CisgICAgb3B0aW9ucy5jb21wcmVzc2lvbiA9ICJneiI7CisgICAgQ293V3JpdGVyVjIgd3JpdGVyKG9wdGlvbnMsIEdldENvd0ZkKCkpOworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkluaXRpYWxpemUoKSk7CisKKyAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlRoaXMgaXMgc29tZSBkYXRhLCBiZWxpZXZlIGl0IjsKKyAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFJhd0Jsb2Nrcyg1MCwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkZpbmFsaXplKCkpOworCisgICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOworCisgICAgQ293UmVhZGVyIHJlYWRlcjsKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKKworICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKKyAgICBBU1NFUlRfTkUoaXRlciwgbnVsbHB0cik7CisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIGF1dG8gb3AgPSBpdGVyLT5HZXQoKTsKKworICAgIHN0ZDo6c3RyaW5nIHNpbmsoZGF0YS5zaXplKCksICdcMCcpOworCisgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3dSZXBsYWNlT3ApOworICAgIEFTU0VSVF9FUShvcC0+ZGF0YV9sZW5ndGgsIDU2KTsgIC8vIGNvbXByZXNzZWQhCisgICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssIDUwKTsKKyAgICBBU1NFUlRfVFJVRShSZWFkRGF0YShyZWFkZXIsIG9wLCBzaW5rLmRhdGEoKSwgc2luay5zaXplKCkpKTsKKyAgICBBU1NFUlRfRVEoc2luaywgZGF0YSk7CisKKyAgICBpdGVyLT5OZXh0KCk7CisgICAgQVNTRVJUX1RSVUUoaXRlci0+QXRFbmQoKSk7Cit9CisKK2NsYXNzIENvbXByZXNzaW9uVGVzdCA6IHB1YmxpYyBDb3dUZXN0LCBwdWJsaWMgdGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPGNvbnN0IGNoYXIqPiB7fTsKKworVEVTVF9QKENvbXByZXNzaW9uVGVzdCwgVGhyZWFkZWRCYXRjaFdyaXRlcykgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBvcHRpb25zLmNvbXByZXNzaW9uID0gR2V0UGFyYW0oKTsKKyAgICBvcHRpb25zLm51bV9jb21wcmVzc190aHJlYWRzID0gMjsKKworICAgIENvd1dyaXRlclYyIHdyaXRlcihvcHRpb25zLCBHZXRDb3dGZCgpKTsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5Jbml0aWFsaXplKCkpOworCisgICAgc3RkOjpzdHJpbmcgeG9yX2RhdGEgPSAiVGhpcyBpcyB0ZXN0IGRhdGEtMS4gVGVzdGluZyB4b3IiOworICAgIHhvcl9kYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRYb3JCbG9ja3MoNTAsIHhvcl9kYXRhLmRhdGEoKSwgeG9yX2RhdGEuc2l6ZSgpLCAyNCwgMTApKTsKKworICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSAiVGhpcyBpcyB0ZXN0IGRhdGEtMi4gVGVzdGluZyByZXBsYWNlIG9wcyI7CisgICAgZGF0YS5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplICogMjA0OCwgJ1wwJyk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFJhd0Jsb2NrcygxMDAsIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSkpOworCisgICAgc3RkOjpzdHJpbmcgZGF0YTIgPSAiVGhpcyBpcyB0ZXN0IGRhdGEtMy4gVGVzdGluZyByZXBsYWNlIG9wcyI7CisgICAgZGF0YTIucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSAqIDI1OSwgJ1wwJyk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFJhd0Jsb2Nrcyg2MDAwLCBkYXRhMi5kYXRhKCksIGRhdGEyLnNpemUoKSkpOworCisgICAgc3RkOjpzdHJpbmcgZGF0YTMgPSAiVGhpcyBpcyB0ZXN0IGRhdGEtNC4gVGVzdGluZyByZXBsYWNlIG9wcyI7CisgICAgZGF0YTMucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFJhd0Jsb2Nrcyg5MDAwLCBkYXRhMy5kYXRhKCksIGRhdGEzLnNpemUoKSkpOworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkZpbmFsaXplKCkpOworCisgICAgaW50IGV4cGVjdGVkX2Jsb2NrcyA9ICgxICsgMjA0OCArIDI1OSArIDEpOworICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKKworICAgIENvd1JlYWRlciByZWFkZXI7CisgICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7CisKKyAgICBhdXRvIGl0ZXIgPSByZWFkZXIuR2V0T3BJdGVyKCk7CisgICAgQVNTRVJUX05FKGl0ZXIsIG51bGxwdHIpOworCisgICAgaW50IHRvdGFsX2Jsb2NrcyA9IDA7CisgICAgd2hpbGUgKCFpdGVyLT5BdEVuZCgpKSB7CisgICAgICAgIGF1dG8gb3AgPSBpdGVyLT5HZXQoKTsKKworICAgICAgICBpZiAob3AtPnR5cGUoKSA9PSBrQ293WG9yT3ApIHsKKyAgICAgICAgICAgIHRvdGFsX2Jsb2NrcyArPSAxOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgc2luayh4b3JfZGF0YS5zaXplKCksICdcMCcpOworICAgICAgICAgICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssIDUwKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShvcC0+c291cmNlKCksIDk4MzE0KTsgIC8vIDQwOTYgKiAyNCArIDEwCisgICAgICAgICAgICBBU1NFUlRfVFJVRShSZWFkRGF0YShyZWFkZXIsIG9wLCBzaW5rLmRhdGEoKSwgc2luay5zaXplKCkpKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShzaW5rLCB4b3JfZGF0YSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAob3AtPnR5cGUoKSA9PSBrQ293UmVwbGFjZU9wKSB7CisgICAgICAgICAgICB0b3RhbF9ibG9ja3MgKz0gMTsKKyAgICAgICAgICAgIGlmIChvcC0+bmV3X2Jsb2NrID09IDEwMCkgeworICAgICAgICAgICAgICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSk7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc2luayhkYXRhLnNpemUoKSwgJ1wwJyk7CisgICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUoUmVhZERhdGEocmVhZGVyLCBvcCwgc2luay5kYXRhKCksIHNpbmsuc2l6ZSgpKSk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKHNpbmsuc2l6ZSgpLCBkYXRhLnNpemUoKSk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKHNpbmssIGRhdGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9wLT5uZXdfYmxvY2sgPT0gNjAwMCkgeworICAgICAgICAgICAgICAgIGRhdGEyLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUpOworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNpbmsoZGF0YTIuc2l6ZSgpLCAnXDAnKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShSZWFkRGF0YShyZWFkZXIsIG9wLCBzaW5rLmRhdGEoKSwgc2luay5zaXplKCkpKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoc2luaywgZGF0YTIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9wLT5uZXdfYmxvY2sgPT0gOTAwMCkgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNpbmsoZGF0YTMuc2l6ZSgpLCAnXDAnKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShSZWFkRGF0YShyZWFkZXIsIG9wLCBzaW5rLmRhdGEoKSwgc2luay5zaXplKCkpKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoc2luaywgZGF0YTMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaXRlci0+TmV4dCgpOworICAgIH0KKworICAgIEFTU0VSVF9FUSh0b3RhbF9ibG9ja3MsIGV4cGVjdGVkX2Jsb2Nrcyk7Cit9CisKK1RFU1RfUChDb21wcmVzc2lvblRlc3QsIE5vQmF0Y2hXcml0ZXMpIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5jb21wcmVzc2lvbiA9IEdldFBhcmFtKCk7CisgICAgb3B0aW9ucy5udW1fY29tcHJlc3NfdGhyZWFkcyA9IDE7CisgICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDA7CisKKyAgICBDb3dXcml0ZXJWMiB3cml0ZXIob3B0aW9ucywgR2V0Q293RmQoKSk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuSW5pdGlhbGl6ZSgpKTsKKworICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSAiVGVzdGluZyByZXBsYWNlIG9wcyB3aXRob3V0IGJhdGNoIHdyaXRlcyI7CisgICAgZGF0YS5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplICogMTAyNCwgJ1wwJyk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFJhd0Jsb2Nrcyg1MCwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKSk7CisKKyAgICBzdGQ6OnN0cmluZyBkYXRhMiA9ICJUZXN0aW5nIG9kZCBibG9ja3Mgd2l0aG91dCBiYXRjaCB3cml0ZXMiOworICAgIGRhdGEyLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUgKiAxMTEsICdcMCcpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRSYXdCbG9ja3MoMzAwMCwgZGF0YTIuZGF0YSgpLCBkYXRhMi5zaXplKCkpKTsKKworICAgIHN0ZDo6c3RyaW5nIGRhdGEzID0gIlRlc3Rpbmcgc2luZ2xlIDRrIGJsb2NrIjsKKyAgICBkYXRhMy5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplLCAnXDAnKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkUmF3QmxvY2tzKDUwMDAsIGRhdGEzLmRhdGEoKSwgZGF0YTMuc2l6ZSgpKSk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuRmluYWxpemUoKSk7CisKKyAgICBpbnQgZXhwZWN0ZWRfYmxvY2tzID0gKDEwMjQgKyAxMTEgKyAxKTsKKyAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7CisKKyAgICBDb3dSZWFkZXIgcmVhZGVyOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOworCisgICAgYXV0byBpdGVyID0gcmVhZGVyLkdldE9wSXRlcigpOworICAgIEFTU0VSVF9ORShpdGVyLCBudWxscHRyKTsKKworICAgIGludCB0b3RhbF9ibG9ja3MgPSAwOworICAgIHdoaWxlICghaXRlci0+QXRFbmQoKSkgeworICAgICAgICBhdXRvIG9wID0gaXRlci0+R2V0KCk7CisKKyAgICAgICAgaWYgKG9wLT50eXBlKCkgPT0ga0Nvd1JlcGxhY2VPcCkgeworICAgICAgICAgICAgdG90YWxfYmxvY2tzICs9IDE7CisgICAgICAgICAgICBpZiAob3AtPm5ld19ibG9jayA9PSA1MCkgeworICAgICAgICAgICAgICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSk7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc2luayhkYXRhLnNpemUoKSwgJ1wwJyk7CisgICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUoUmVhZERhdGEocmVhZGVyLCBvcCwgc2luay5kYXRhKCksIHNpbmsuc2l6ZSgpKSk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKHNpbmssIGRhdGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9wLT5uZXdfYmxvY2sgPT0gMzAwMCkgeworICAgICAgICAgICAgICAgIGRhdGEyLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUpOworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNpbmsoZGF0YTIuc2l6ZSgpLCAnXDAnKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShSZWFkRGF0YShyZWFkZXIsIG9wLCBzaW5rLmRhdGEoKSwgc2luay5zaXplKCkpKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoc2luaywgZGF0YTIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9wLT5uZXdfYmxvY2sgPT0gNTAwMCkgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNpbmsoZGF0YTMuc2l6ZSgpLCAnXDAnKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShSZWFkRGF0YShyZWFkZXIsIG9wLCBzaW5rLmRhdGEoKSwgc2luay5zaXplKCkpKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoc2luaywgZGF0YTMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaXRlci0+TmV4dCgpOworICAgIH0KKworICAgIEFTU0VSVF9FUSh0b3RhbF9ibG9ja3MsIGV4cGVjdGVkX2Jsb2Nrcyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgSG9ycmlibGVTdHJlYW0gOiBwdWJsaWMgSUJ5dGVTdHJlYW0geworICBwdWJsaWM6CisgICAgSG9ycmlibGVTdHJlYW0oY29uc3Qgc3RkOjp2ZWN0b3I8VD4mIGlucHV0KSA6IGlucHV0XyhpbnB1dCkge30KKworICAgIHNzaXplX3QgUmVhZCh2b2lkKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKHBvc18gPj0gaW5wdXRfLnNpemUoKSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxlbmd0aCkgeworICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGJ1ZmZlcikgPSBpbnB1dF9bcG9zX107CisgICAgICAgIH0KKyAgICAgICAgcG9zXysrOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgc2l6ZV90IFNpemUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBpbnB1dF8uc2l6ZSgpOyB9CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnZlY3RvcjxUPiBpbnB1dF87CisgICAgc2l6ZV90IHBvc18gPSAwOworfTsKKworVEVTVChIb3JyaWJsZVN0cmVhbSwgUmVhZEZ1bGx5KSB7CisgICAgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfc3RyID0gInRoaXMgaXMgc29tZSBkYXRhIjsKKyAgICBzdGQ6OnZlY3RvcjxjaGFyPiBleHBlY3RlZHtleHBlY3RlZF9zdHIuYmVnaW4oKSwgZXhwZWN0ZWRfc3RyLmVuZCgpfTsKKworICAgIEhvcnJpYmxlU3RyZWFtPGNoYXI+IHN0cmVhbShleHBlY3RlZCk7CisKKyAgICBzdGQ6OnZlY3RvcjxjaGFyPiBidWZmZXIoZXhwZWN0ZWQuc2l6ZSgpLCAnXDAnKTsKKyAgICBBU1NFUlRfVFJVRShzdHJlYW0uUmVhZEZ1bGx5KGJ1ZmZlci5kYXRhKCksIGJ1ZmZlci5zaXplKCkpKTsKKyAgICBBU1NFUlRfRVEoYnVmZmVyLCBleHBlY3RlZCk7Cit9CisKK1RFU1RfUChDb21wcmVzc2lvblRlc3QsIEhvcnJpYmxlU3RyZWFtKSB7CisgICAgaWYgKHN0cmNtcChHZXRQYXJhbSgpLCAibm9uZSIpID09IDApIHsKKyAgICAgICAgR1RFU1RfU0tJUCgpOworICAgIH0KKyAgICBDb3dDb21wcmVzc2lvbiBjb21wcmVzc2lvbjsKKyAgICBhdXRvIGFsZ29yaXRobSA9IENvbXByZXNzaW9uQWxnb3JpdGhtRnJvbVN0cmluZyhHZXRQYXJhbSgpKTsKKyAgICBBU1NFUlRfVFJVRShhbGdvcml0aG0uaGFzX3ZhbHVlKCkpOworICAgIGNvbXByZXNzaW9uLmFsZ29yaXRobSA9IGFsZ29yaXRobS52YWx1ZSgpOworCisgICAgc3RkOjpzdHJpbmcgZXhwZWN0ZWQgPSAiVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZy4iOworICAgIGV4cGVjdGVkLnJlc2l6ZSg0MDk2LCAnXDAnKTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxJQ29tcHJlc3Nvcj4gY29tcHJlc3NvciA9IElDb21wcmVzc29yOjpDcmVhdGUoY29tcHJlc3Npb24sIDQwOTYpOworICAgIGF1dG8gcmVzdWx0ID0gY29tcHJlc3Nvci0+Q29tcHJlc3MoZXhwZWN0ZWQuZGF0YSgpLCBleHBlY3RlZC5zaXplKCkpOworICAgIEFTU0VSVF9GQUxTRShyZXN1bHQuZW1wdHkoKSk7CisKKyAgICBIb3JyaWJsZVN0cmVhbTx1aW50OF90PiBzdHJlYW0ocmVzdWx0KTsKKyAgICBhdXRvIGRlY29tcCA9IElEZWNvbXByZXNzb3I6OkZyb21TdHJpbmcoR2V0UGFyYW0oKSk7CisgICAgQVNTRVJUX05FKGRlY29tcCwgbnVsbHB0cik7CisgICAgZGVjb21wLT5zZXRfc3RyZWFtKCZzdHJlYW0pOworCisgICAgZXhwZWN0ZWQgPSBleHBlY3RlZC5zdWJzdHIoMTAsIDUwMCk7CisKKyAgICBzdGQ6OnN0cmluZyBidWZmZXIoZXhwZWN0ZWQuc2l6ZSgpLCAnXDAnKTsKKyAgICBBU1NFUlRfRVEoZGVjb21wLT5EZWNvbXByZXNzKGJ1ZmZlci5kYXRhKCksIDUwMCwgNDA5NiwgMTApLCA1MDApOworICAgIEFTU0VSVF9FUShidWZmZXIsIGV4cGVjdGVkKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKEFsbENvbXByZXNzb3JzLCBDb21wcmVzc2lvblRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGluZzo6VmFsdWVzKCJub25lIiwgImd6IiwgImJyb3RsaSIsICJsejQiKSk7CisKK1RFU1RfRihDb3dUZXN0LCBDbHVzdGVyQ29tcHJlc3NHeikgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBvcHRpb25zLmNvbXByZXNzaW9uID0gImd6IjsKKyAgICBvcHRpb25zLmNsdXN0ZXJfb3BzID0gMjsKKyAgICBDb3dXcml0ZXJWMiB3cml0ZXIob3B0aW9ucywgR2V0Q293RmQoKSk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuSW5pdGlhbGl6ZSgpKTsKKworICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSAiVGhpcyBpcyBzb21lIGRhdGEsIGJlbGlldmUgaXQiOworICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFJhd0Jsb2Nrcyg1MCwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKSk7CisKKyAgICBzdGQ6OnN0cmluZyBkYXRhMiA9ICJNb3JlIGRhdGEhIjsKKyAgICBkYXRhMi5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplLCAnXDAnKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkUmF3QmxvY2tzKDUxLCBkYXRhMi5kYXRhKCksIGRhdGEyLnNpemUoKSkpOworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkZpbmFsaXplKCkpOworCisgICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOworCisgICAgQ293UmVhZGVyIHJlYWRlcjsKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKKworICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKKyAgICBBU1NFUlRfTkUoaXRlciwgbnVsbHB0cik7CisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIGF1dG8gb3AgPSBpdGVyLT5HZXQoKTsKKworICAgIHN0ZDo6c3RyaW5nIHNpbmsoZGF0YS5zaXplKCksICdcMCcpOworCisgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3dSZXBsYWNlT3ApOworICAgIEFTU0VSVF9FUShvcC0+ZGF0YV9sZW5ndGgsIDU2KTsgIC8vIGNvbXByZXNzZWQhCisgICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssIDUwKTsKKyAgICBBU1NFUlRfVFJVRShSZWFkRGF0YShyZWFkZXIsIG9wLCBzaW5rLmRhdGEoKSwgc2luay5zaXplKCkpKTsKKyAgICBBU1NFUlRfRVEoc2luaywgZGF0YSk7CisKKyAgICBpdGVyLT5OZXh0KCk7CisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIG9wID0gaXRlci0+R2V0KCk7CisKKyAgICBBU1NFUlRfRVEob3AtPnR5cGUoKSwga0Nvd0NsdXN0ZXJPcCk7CisKKyAgICBpdGVyLT5OZXh0KCk7CisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIG9wID0gaXRlci0+R2V0KCk7CisKKyAgICBzaW5rID0ge307CisgICAgc2luay5yZXNpemUoZGF0YTIuc2l6ZSgpLCAnXDAnKTsKKyAgICBBU1NFUlRfRVEob3AtPmRhdGFfbGVuZ3RoLCA0MSk7ICAvLyBjb21wcmVzc2VkIQorICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCA1MSk7CisgICAgQVNTRVJUX1RSVUUoUmVhZERhdGEocmVhZGVyLCBvcCwgc2luay5kYXRhKCksIHNpbmsuc2l6ZSgpKSk7CisgICAgQVNTRVJUX0VRKHNpbmssIGRhdGEyKTsKKworICAgIGl0ZXItPk5leHQoKTsKKyAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisgICAgb3AgPSBpdGVyLT5HZXQoKTsKKworICAgIEFTU0VSVF9FUShvcC0+dHlwZSgpLCBrQ293Q2x1c3Rlck9wKTsKKworICAgIGl0ZXItPk5leHQoKTsKKyAgICBBU1NFUlRfVFJVRShpdGVyLT5BdEVuZCgpKTsKK30KKworVEVTVF9GKENvd1Rlc3QsIENvbXByZXNzVHdvQmxvY2tzKSB7CisgICAgQ293T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMuY29tcHJlc3Npb24gPSAiZ3oiOworICAgIG9wdGlvbnMuY2x1c3Rlcl9vcHMgPSAwOworICAgIENvd1dyaXRlclYyIHdyaXRlcihvcHRpb25zLCBHZXRDb3dGZCgpKTsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5Jbml0aWFsaXplKCkpOworCisgICAgc3RkOjpzdHJpbmcgZGF0YSA9ICJUaGlzIGlzIHNvbWUgZGF0YSwgYmVsaWV2ZSBpdCI7CisgICAgZGF0YS5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplICogMiwgJ1wwJyk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkUmF3QmxvY2tzKDUwLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuRmluYWxpemUoKSk7CisKKyAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7CisKKyAgICBDb3dSZWFkZXIgcmVhZGVyOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOworCisgICAgYXV0byBpdGVyID0gcmVhZGVyLkdldE9wSXRlcigpOworICAgIEFTU0VSVF9ORShpdGVyLCBudWxscHRyKTsKKyAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisgICAgaXRlci0+TmV4dCgpOworICAgIEFTU0VSVF9GQUxTRShpdGVyLT5BdEVuZCgpKTsKKworICAgIHN0ZDo6c3RyaW5nIHNpbmsob3B0aW9ucy5ibG9ja19zaXplLCAnXDAnKTsKKworICAgIGF1dG8gb3AgPSBpdGVyLT5HZXQoKTsKKyAgICBBU1NFUlRfRVEob3AtPnR5cGUoKSwga0Nvd1JlcGxhY2VPcCk7CisgICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssIDUxKTsKKyAgICBBU1NFUlRfVFJVRShSZWFkRGF0YShyZWFkZXIsIG9wLCBzaW5rLmRhdGEoKSwgc2luay5zaXplKCkpKTsKK30KKworVEVTVF9GKENvd1Rlc3QsIEdldFNpemUpIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDA7CisgICAgQ293V3JpdGVyVjIgd3JpdGVyKG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgIGlmIChmdHJ1bmNhdGUoY293Xy0+ZmQsIDApIDwgMCkgeworICAgICAgICBwZXJyb3IoIkZhaWxzIHRvIHNldCB0ZW1wIGZpbGUgc2l6ZSIpOworICAgICAgICBGQUlMKCk7CisgICAgfQorICAgIEFTU0VSVF9UUlVFKHdyaXRlci5Jbml0aWFsaXplKCkpOworCisgICAgc3RkOjpzdHJpbmcgZGF0YSA9ICJUaGlzIGlzIHNvbWUgZGF0YSwgYmVsaWV2ZSBpdCI7CisgICAgZGF0YS5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplLCAnXDAnKTsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRDb3B5KDEwLCAyMCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRSYXdCbG9ja3MoNTAsIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRaZXJvQmxvY2tzKDUxLCAyKSk7CisgICAgYXV0byBzaXplX2JlZm9yZSA9IHdyaXRlci5HZXRDb3dTaXplSW5mbygpLmNvd19zaXplOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5GaW5hbGl6ZSgpKTsKKyAgICBhdXRvIHNpemVfYWZ0ZXIgPSB3cml0ZXIuR2V0Q293U2l6ZUluZm8oKS5jb3dfc2l6ZTsKKyAgICBBU1NFUlRfRVEoc2l6ZV9iZWZvcmUsIHNpemVfYWZ0ZXIpOworICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKworICAgIEFTU0VSVF9HRShmc3RhdChjb3dfLT5mZCwgJmJ1ZiksIDApIDw8IHN0cmVycm9yKGVycm5vKTsKKyAgICBBU1NFUlRfRVEoYnVmLnN0X3NpemUsIHdyaXRlci5HZXRDb3dTaXplSW5mbygpLmNvd19zaXplKTsKK30KKworVEVTVF9GKENvd1Rlc3QsIEFwcGVuZExhYmVsU21hbGwpIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDA7CisgICAgYXV0byB3cml0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1dyaXRlclYyPihvcHRpb25zLCBHZXRDb3dGZCgpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkluaXRpYWxpemUoKSk7CisKKyAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlRoaXMgaXMgc29tZSBkYXRhLCBiZWxpZXZlIGl0IjsKKyAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkUmF3QmxvY2tzKDUwLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZExhYmVsKDMpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOworCisgICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOworCisgICAgd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXJWMj4ob3B0aW9ucywgR2V0Q293RmQoKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5Jbml0aWFsaXplKHszfSkpOworCisgICAgc3RkOjpzdHJpbmcgZGF0YTIgPSAiTW9yZSBkYXRhISI7CisgICAgZGF0YTIucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRSYXdCbG9ja3MoNTEsIGRhdGEyLmRhdGEoKSwgZGF0YTIuc2l6ZSgpKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKKworICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKKworICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICBBU1NFUlRfRVEoZnN0YXQoY293Xy0+ZmQsICZidWYpLCAwKTsKKyAgICBBU1NFUlRfRVEoYnVmLnN0X3NpemUsIHdyaXRlci0+R2V0Q293U2l6ZUluZm8oKS5jb3dfc2l6ZSk7CisKKyAgICAvLyBSZWFkIGJhY2sgYm90aCBvcGVyYXRpb25zLCBhbmQgbGFiZWwuCisgICAgQ293UmVhZGVyIHJlYWRlcjsKKyAgICB1aW50NjRfdCBsYWJlbDsKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuR2V0TGFzdExhYmVsKCZsYWJlbCkpOworICAgIEFTU0VSVF9FUShsYWJlbCwgMyk7CisKKyAgICBzdGQ6OnN0cmluZyBzaW5rKGRhdGEuc2l6ZSgpLCAnXDAnKTsKKworICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKKyAgICBBU1NFUlRfTkUoaXRlciwgbnVsbHB0cik7CisKKyAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisgICAgYXV0byBvcCA9IGl0ZXItPkdldCgpOworICAgIEFTU0VSVF9FUShvcC0+dHlwZSgpLCBrQ293UmVwbGFjZU9wKTsKKyAgICBBU1NFUlRfVFJVRShSZWFkRGF0YShyZWFkZXIsIG9wLCBzaW5rLmRhdGEoKSwgc2luay5zaXplKCkpKTsKKyAgICBBU1NFUlRfRVEoc2luaywgZGF0YSk7CisKKyAgICBpdGVyLT5OZXh0KCk7CisgICAgc2luayA9IHt9OworICAgIHNpbmsucmVzaXplKGRhdGEyLnNpemUoKSwgJ1wwJyk7CisKKyAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisgICAgb3AgPSBpdGVyLT5HZXQoKTsKKyAgICBBU1NFUlRfRVEob3AtPnR5cGUoKSwga0Nvd0xhYmVsT3ApOworICAgIEFTU0VSVF9FUShvcC0+c291cmNlKCksIDMpOworCisgICAgaXRlci0+TmV4dCgpOworCisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIG9wID0gaXRlci0+R2V0KCk7CisgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3dSZXBsYWNlT3ApOworICAgIEFTU0VSVF9UUlVFKFJlYWREYXRhKHJlYWRlciwgb3AsIHNpbmsuZGF0YSgpLCBzaW5rLnNpemUoKSkpOworICAgIEFTU0VSVF9FUShzaW5rLCBkYXRhMik7CisKKyAgICBpdGVyLT5OZXh0KCk7CisgICAgQVNTRVJUX1RSVUUoaXRlci0+QXRFbmQoKSk7Cit9CisKK1RFU1RfRihDb3dUZXN0LCBBcHBlbmRMYWJlbE1pc3NpbmcpIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDA7CisgICAgYXV0byB3cml0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1dyaXRlclYyPihvcHRpb25zLCBHZXRDb3dGZCgpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkluaXRpYWxpemUoKSk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZExhYmVsKDApKTsKKyAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlRoaXMgaXMgc29tZSBkYXRhLCBiZWxpZXZlIGl0IjsKKyAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkUmF3QmxvY2tzKDUwLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZExhYmVsKDEpKTsKKyAgICAvLyBEcm9wIHRoZSB0YWlsIGVuZCBvZiB0aGUgbGFzdCBvcCBoZWFkZXIsIGNvcnJ1cHRpbmcgaXQuCisgICAgZnRydW5jYXRlKGNvd18tPmZkLCB3cml0ZXItPkdldENvd1NpemVJbmZvKCkuY293X3NpemUgLSBzaXplb2YoQ293Rm9vdGVyKSAtIDMpOworCisgICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOworCisgICAgd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXJWMj4ob3B0aW9ucywgR2V0Q293RmQoKSk7CisgICAgQVNTRVJUX0ZBTFNFKHdyaXRlci0+SW5pdGlhbGl6ZSh7MX0pKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkluaXRpYWxpemUoezB9KSk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFplcm9CbG9ja3MoNTEsIDEpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOworCisgICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOworCisgICAgc3RydWN0IHN0YXQgYnVmOworICAgIEFTU0VSVF9FUShmc3RhdChjb3dfLT5mZCwgJmJ1ZiksIDApOworICAgIEFTU0VSVF9FUShidWYuc3Rfc2l6ZSwgd3JpdGVyLT5HZXRDb3dTaXplSW5mbygpLmNvd19zaXplKTsKKworICAgIC8vIFJlYWQgYmFjayBib3RoIG9wZXJhdGlvbnMuCisgICAgQ293UmVhZGVyIHJlYWRlcjsKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKKworICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKKyAgICBBU1NFUlRfTkUoaXRlciwgbnVsbHB0cik7CisKKyAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisgICAgYXV0byBvcCA9IGl0ZXItPkdldCgpOworICAgIEFTU0VSVF9FUShvcC0+dHlwZSgpLCBrQ293TGFiZWxPcCk7CisgICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UoKSwgMCk7CisKKyAgICBpdGVyLT5OZXh0KCk7CisKKyAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisgICAgb3AgPSBpdGVyLT5HZXQoKTsKKyAgICBBU1NFUlRfRVEob3AtPnR5cGUoKSwga0Nvd1plcm9PcCk7CisKKyAgICBpdGVyLT5OZXh0KCk7CisKKyAgICBBU1NFUlRfVFJVRShpdGVyLT5BdEVuZCgpKTsKK30KKworVEVTVF9GKENvd1Rlc3QsIEFwcGVuZEV4dGVuZGVkQ29ycnVwdGVkKSB7CisgICAgQ293T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMuY2x1c3Rlcl9vcHMgPSAwOworICAgIGF1dG8gd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXJWMj4ob3B0aW9ucywgR2V0Q293RmQoKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5Jbml0aWFsaXplKCkpOworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRMYWJlbCg1KSk7CisKKyAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlRoaXMgaXMgc29tZSBkYXRhLCBiZWxpZXZlIGl0IjsKKyAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUgKiAyLCAnXDAnKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFJhd0Jsb2Nrcyg1MCwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRMYWJlbCg2KSk7CisKKyAgICAvLyBmYWlsIHRvIHdyaXRlIHRoZSBmb290ZXIuIENvdyBGb3JtYXQgZG9lcyBub3Qga25vdyBpZiBMYWJlbCA2IGlzIHZhbGlkCisKKyAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7CisKKyAgICAvLyBHZXQgdGhlIGxhc3Qga25vd24gZ29vZCBsYWJlbAorICAgIENvd1JlYWRlciBsYWJlbF9yZWFkZXI7CisgICAgdWludDY0X3QgbGFiZWw7CisgICAgQVNTRVJUX1RSVUUobGFiZWxfcmVhZGVyLlBhcnNlKGNvd18tPmZkLCB7NX0pKTsKKyAgICBBU1NFUlRfVFJVRShsYWJlbF9yZWFkZXIuR2V0TGFzdExhYmVsKCZsYWJlbCkpOworICAgIEFTU0VSVF9FUShsYWJlbCwgNSk7CisKKyAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7CisKKyAgICB3cml0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1dyaXRlclYyPihvcHRpb25zLCBHZXRDb3dGZCgpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkluaXRpYWxpemUoezV9KSk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOworCisgICAgc3RydWN0IHN0YXQgYnVmOworICAgIEFTU0VSVF9FUShmc3RhdChjb3dfLT5mZCwgJmJ1ZiksIDApOworICAgIEFTU0VSVF9FUShidWYuc3Rfc2l6ZSwgd3JpdGVyLT5HZXRDb3dTaXplSW5mbygpLmNvd19zaXplKTsKKworICAgIC8vIFJlYWQgYmFjayBhbGwgdmFsaWQgb3BlcmF0aW9ucworICAgIENvd1JlYWRlciByZWFkZXI7CisgICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7CisKKyAgICBhdXRvIGl0ZXIgPSByZWFkZXIuR2V0T3BJdGVyKCk7CisgICAgQVNTRVJUX05FKGl0ZXIsIG51bGxwdHIpOworCisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIGF1dG8gb3AgPSBpdGVyLT5HZXQoKTsKKyAgICBBU1NFUlRfRVEob3AtPnR5cGUoKSwga0Nvd0xhYmVsT3ApOworICAgIEFTU0VSVF9FUShvcC0+c291cmNlKCksIDUpOworCisgICAgaXRlci0+TmV4dCgpOworICAgIEFTU0VSVF9UUlVFKGl0ZXItPkF0RW5kKCkpOworfQorCitURVNUX0YoQ293VGVzdCwgQXBwZW5kYnlMYWJlbCkgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBvcHRpb25zLmNsdXN0ZXJfb3BzID0gMDsKKyAgICBhdXRvIHdyaXRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293V3JpdGVyVjI+KG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZSgpKTsKKworICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSAiVGhpcyBpcyBzb21lIGRhdGEsIGJlbGlldmUgaXQiOworICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSAqIDIsICdcMCcpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkUmF3QmxvY2tzKDUwLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpKTsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoNCkpOworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRaZXJvQmxvY2tzKDUwLCAyKSk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZExhYmVsKDUpKTsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkQ29weSg1LCA2KSk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZExhYmVsKDYpKTsKKworICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKKworICAgIHdyaXRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293V3JpdGVyVjI+KG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgIEFTU0VSVF9GQUxTRSh3cml0ZXItPkluaXRpYWxpemUoezEyfSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZSh7NX0pKTsKKworICAgIC8vIFRoaXMgc2hvdWxkIGRyb3AgbGFiZWwgNgorICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7CisKKyAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgQVNTRVJUX0VRKGZzdGF0KGNvd18tPmZkLCAmYnVmKSwgMCk7CisgICAgQVNTRVJUX0VRKGJ1Zi5zdF9zaXplLCB3cml0ZXItPkdldENvd1NpemVJbmZvKCkuY293X3NpemUpOworCisgICAgLy8gUmVhZCBiYWNrIGFsbCBvcHMKKyAgICBDb3dSZWFkZXIgcmVhZGVyOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOworCisgICAgc3RkOjpzdHJpbmcgc2luayhvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOworCisgICAgYXV0byBpdGVyID0gcmVhZGVyLkdldE9wSXRlcigpOworICAgIEFTU0VSVF9ORShpdGVyLCBudWxscHRyKTsKKworICAgIEFTU0VSVF9GQUxTRShpdGVyLT5BdEVuZCgpKTsKKyAgICBhdXRvIG9wID0gaXRlci0+R2V0KCk7CisgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3dSZXBsYWNlT3ApOworICAgIEFTU0VSVF9UUlVFKFJlYWREYXRhKHJlYWRlciwgb3AsIHNpbmsuZGF0YSgpLCBzaW5rLnNpemUoKSkpOworICAgIEFTU0VSVF9FUShzaW5rLCBkYXRhLnN1YnN0cigwLCBvcHRpb25zLmJsb2NrX3NpemUpKTsKKworICAgIGl0ZXItPk5leHQoKTsKKyAgICBzaW5rID0ge307CisgICAgc2luay5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplLCAnXDAnKTsKKworICAgIEFTU0VSVF9GQUxTRShpdGVyLT5BdEVuZCgpKTsKKyAgICBvcCA9IGl0ZXItPkdldCgpOworICAgIEFTU0VSVF9FUShvcC0+dHlwZSgpLCBrQ293UmVwbGFjZU9wKTsKKyAgICBBU1NFUlRfVFJVRShSZWFkRGF0YShyZWFkZXIsIG9wLCBzaW5rLmRhdGEoKSwgc2luay5zaXplKCkpKTsKKyAgICBBU1NFUlRfRVEoc2luaywgZGF0YS5zdWJzdHIob3B0aW9ucy5ibG9ja19zaXplLCAyICogb3B0aW9ucy5ibG9ja19zaXplKSk7CisKKyAgICBpdGVyLT5OZXh0KCk7CisKKyAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisgICAgb3AgPSBpdGVyLT5HZXQoKTsKKyAgICBBU1NFUlRfRVEob3AtPnR5cGUoKSwga0Nvd0xhYmVsT3ApOworICAgIEFTU0VSVF9FUShvcC0+c291cmNlKCksIDQpOworCisgICAgaXRlci0+TmV4dCgpOworCisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIG9wID0gaXRlci0+R2V0KCk7CisgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3daZXJvT3ApOworCisgICAgaXRlci0+TmV4dCgpOworCisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIG9wID0gaXRlci0+R2V0KCk7CisgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3daZXJvT3ApOworCisgICAgaXRlci0+TmV4dCgpOworICAgIEFTU0VSVF9GQUxTRShpdGVyLT5BdEVuZCgpKTsKKyAgICBvcCA9IGl0ZXItPkdldCgpOworICAgIEFTU0VSVF9FUShvcC0+dHlwZSgpLCBrQ293TGFiZWxPcCk7CisgICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UoKSwgNSk7CisKKyAgICBpdGVyLT5OZXh0KCk7CisKKyAgICBBU1NFUlRfVFJVRShpdGVyLT5BdEVuZCgpKTsKK30KKworVEVTVF9GKENvd1Rlc3QsIENsdXN0ZXJUZXN0KSB7CisgICAgQ293T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMuY2x1c3Rlcl9vcHMgPSA0OworICAgIGF1dG8gd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXJWMj4ob3B0aW9ucywgR2V0Q293RmQoKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5Jbml0aWFsaXplKCkpOworCisgICAgc3RkOjpzdHJpbmcgZGF0YSA9ICJUaGlzIGlzIHNvbWUgZGF0YSwgYmVsaWV2ZSBpdCI7CisgICAgZGF0YS5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplLCAnXDAnKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFJhd0Jsb2Nrcyg1MCwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKSk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZExhYmVsKDQpKTsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWmVyb0Jsb2Nrcyg1MCwgMikpOyAgLy8gQ2x1c3RlciBzcGxpdCBpbiBtaWRkbGUKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoNSkpOworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRDb3B5KDUsIDYpKTsKKworICAgIC8vIENsdXN0ZXIgc3BsaXQKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoNikpOworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsgIC8vIE5vIGRhdGEgZm9yIGNsdXN0ZXIsIHNvIG5vIGNsdXN0ZXIgc3BsaXQgbmVlZGVkCisKKyAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7CisKKyAgICAvLyBSZWFkIGJhY2sgYWxsIG9wcworICAgIENvd1JlYWRlciByZWFkZXI7CisgICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7CisKKyAgICBzdGQ6OnN0cmluZyBzaW5rKGRhdGEuc2l6ZSgpLCAnXDAnKTsKKworICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKKyAgICBBU1NFUlRfTkUoaXRlciwgbnVsbHB0cik7CisKKyAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisgICAgYXV0byBvcCA9IGl0ZXItPkdldCgpOworICAgIEFTU0VSVF9FUShvcC0+dHlwZSgpLCBrQ293UmVwbGFjZU9wKTsKKyAgICBBU1NFUlRfVFJVRShSZWFkRGF0YShyZWFkZXIsIG9wLCBzaW5rLmRhdGEoKSwgc2luay5zaXplKCkpKTsKKyAgICBBU1NFUlRfRVEoc2luaywgZGF0YS5zdWJzdHIoMCwgb3B0aW9ucy5ibG9ja19zaXplKSk7CisKKyAgICBpdGVyLT5OZXh0KCk7CisKKyAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisgICAgb3AgPSBpdGVyLT5HZXQoKTsKKyAgICBBU1NFUlRfRVEob3AtPnR5cGUoKSwga0Nvd0xhYmVsT3ApOworICAgIEFTU0VSVF9FUShvcC0+c291cmNlKCksIDQpOworCisgICAgaXRlci0+TmV4dCgpOworCisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIG9wID0gaXRlci0+R2V0KCk7CisgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3daZXJvT3ApOworCisgICAgaXRlci0+TmV4dCgpOworCisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIG9wID0gaXRlci0+R2V0KCk7CisgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3dDbHVzdGVyT3ApOworCisgICAgaXRlci0+TmV4dCgpOworCisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIG9wID0gaXRlci0+R2V0KCk7CisgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3daZXJvT3ApOworCisgICAgaXRlci0+TmV4dCgpOworCisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIG9wID0gaXRlci0+R2V0KCk7CisgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3dMYWJlbE9wKTsKKyAgICBBU1NFUlRfRVEob3AtPnNvdXJjZSgpLCA1KTsKKworICAgIGl0ZXItPk5leHQoKTsKKworICAgIEFTU0VSVF9GQUxTRShpdGVyLT5BdEVuZCgpKTsKKyAgICBvcCA9IGl0ZXItPkdldCgpOworICAgIEFTU0VSVF9FUShvcC0+dHlwZSgpLCBrQ293Q29weU9wKTsKKworICAgIGl0ZXItPk5leHQoKTsKKworICAgIEFTU0VSVF9GQUxTRShpdGVyLT5BdEVuZCgpKTsKKyAgICBvcCA9IGl0ZXItPkdldCgpOworICAgIEFTU0VSVF9FUShvcC0+dHlwZSgpLCBrQ293Q2x1c3Rlck9wKTsKKworICAgIGl0ZXItPk5leHQoKTsKKworICAgIEFTU0VSVF9GQUxTRShpdGVyLT5BdEVuZCgpKTsKKyAgICBvcCA9IGl0ZXItPkdldCgpOworICAgIEFTU0VSVF9FUShvcC0+dHlwZSgpLCBrQ293TGFiZWxPcCk7CisgICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UoKSwgNik7CisKKyAgICBpdGVyLT5OZXh0KCk7CisKKyAgICBBU1NFUlRfVFJVRShpdGVyLT5BdEVuZCgpKTsKK30KKworVEVTVF9GKENvd1Rlc3QsIENsdXN0ZXJBcHBlbmRUZXN0KSB7CisgICAgQ293T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMuY2x1c3Rlcl9vcHMgPSAzOworICAgIGF1dG8gd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXJWMj4ob3B0aW9ucywgR2V0Q293RmQoKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5Jbml0aWFsaXplKCkpOworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRMYWJlbCg1MCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7ICAvLyBBZGRzIGEgY2x1c3RlciBvcCwgc2hvdWxkIGJlIGRyb3BwZWQgb24gYXBwZW5kCisKKyAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7CisKKyAgICB3cml0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1dyaXRlclYyPihvcHRpb25zLCBHZXRDb3dGZCgpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkluaXRpYWxpemUoezUwfSkpOworCisgICAgc3RkOjpzdHJpbmcgZGF0YTIgPSAiTW9yZSBkYXRhISI7CisgICAgZGF0YTIucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRSYXdCbG9ja3MoNTEsIGRhdGEyLmRhdGEoKSwgZGF0YTIuc2l6ZSgpKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsgIC8vIEFkZHMgYSBjbHVzdGVyIG9wCisKKyAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7CisKKyAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgQVNTRVJUX0VRKGZzdGF0KGNvd18tPmZkLCAmYnVmKSwgMCk7CisgICAgQVNTRVJUX0VRKGJ1Zi5zdF9zaXplLCB3cml0ZXItPkdldENvd1NpemVJbmZvKCkuY293X3NpemUpOworCisgICAgLy8gUmVhZCBiYWNrIGJvdGggb3BlcmF0aW9ucywgcGx1cyBjbHVzdGVyIG9wIGF0IGVuZAorICAgIENvd1JlYWRlciByZWFkZXI7CisgICAgdWludDY0X3QgbGFiZWw7CisgICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7CisgICAgQVNTRVJUX1RSVUUocmVhZGVyLkdldExhc3RMYWJlbCgmbGFiZWwpKTsKKyAgICBBU1NFUlRfRVEobGFiZWwsIDUwKTsKKworICAgIHN0ZDo6c3RyaW5nIHNpbmsoZGF0YTIuc2l6ZSgpLCAnXDAnKTsKKworICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKKyAgICBBU1NFUlRfTkUoaXRlciwgbnVsbHB0cik7CisKKyAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisgICAgYXV0byBvcCA9IGl0ZXItPkdldCgpOworICAgIEFTU0VSVF9FUShvcC0+dHlwZSgpLCBrQ293TGFiZWxPcCk7CisgICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UoKSwgNTApOworCisgICAgaXRlci0+TmV4dCgpOworCisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIG9wID0gaXRlci0+R2V0KCk7CisgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3dSZXBsYWNlT3ApOworICAgIEFTU0VSVF9UUlVFKFJlYWREYXRhKHJlYWRlciwgb3AsIHNpbmsuZGF0YSgpLCBzaW5rLnNpemUoKSkpOworICAgIEFTU0VSVF9FUShzaW5rLCBkYXRhMik7CisKKyAgICBpdGVyLT5OZXh0KCk7CisKKyAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisgICAgb3AgPSBpdGVyLT5HZXQoKTsKKyAgICBBU1NFUlRfRVEob3AtPnR5cGUoKSwga0Nvd0NsdXN0ZXJPcCk7CisKKyAgICBpdGVyLT5OZXh0KCk7CisKKyAgICBBU1NFUlRfVFJVRShpdGVyLT5BdEVuZCgpKTsKK30KKworVEVTVF9GKENvd1Rlc3QsIEFwcGVuZEFmdGVyRmluYWxpemUpIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDA7CisgICAgYXV0byB3cml0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1dyaXRlclYyPihvcHRpb25zLCBHZXRDb3dGZCgpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkluaXRpYWxpemUoKSk7CisKKyAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlRoaXMgaXMgc29tZSBkYXRhLCBiZWxpZXZlIGl0IjsKKyAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkUmF3QmxvY2tzKDUwLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZExhYmVsKDMpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOworCisgICAgc3RkOjpzdHJpbmcgZGF0YTIgPSAiTW9yZSBkYXRhISI7CisgICAgZGF0YTIucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRSYXdCbG9ja3MoNTEsIGRhdGEyLmRhdGEoKSwgZGF0YTIuc2l6ZSgpKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKKworICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKKworICAgIC8vIENPVyBzaG91bGQgYmUgdmFsaWQuCisgICAgQ293UmVhZGVyIHJlYWRlcjsKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKK30KKworQXNzZXJ0aW9uUmVzdWx0IFdyaXRlRGF0YUJsb2NrKElDb3dXcml0ZXIqIHdyaXRlciwgdWludDY0X3QgbmV3X2Jsb2NrLCBzdGQ6OnN0cmluZyBkYXRhKSB7CisgICAgZGF0YS5yZXNpemUod3JpdGVyLT5HZXRCbG9ja1NpemUoKSwgJ1wwJyk7CisgICAgaWYgKCF3cml0ZXItPkFkZFJhd0Jsb2NrcyhuZXdfYmxvY2ssIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSkpIHsKKyAgICAgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAiRmFpbGVkIHRvIGFkZCByYXcgYmxvY2siOworICAgIH0KKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworfQorCitBc3NlcnRpb25SZXN1bHQgQ29tcGFyZURhdGFCbG9jayhDb3dSZWFkZXIqIHJlYWRlciwgY29uc3QgQ293T3BlcmF0aW9uKiBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkYXRhKSB7CisgICAgY29uc3QgYXV0byYgaGVhZGVyID0gcmVhZGVyLT5HZXRIZWFkZXIoKTsKKworICAgIHN0ZDo6c3RyaW5nIGNtcCA9IGRhdGE7CisgICAgY21wLnJlc2l6ZShoZWFkZXIuYmxvY2tfc2l6ZSwgJ1wwJyk7CisKKyAgICBzdGQ6OnN0cmluZyBzaW5rKGNtcC5zaXplKCksICdcMCcpOworICAgIGlmICghcmVhZGVyLT5SZWFkRGF0YShvcCwgc2luay5kYXRhKCksIHNpbmsuc2l6ZSgpKSkgeworICAgICAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8ICJGYWlsZWQgdG8gcmVhZCBkYXRhIGJsb2NrIjsKKyAgICB9CisgICAgaWYgKGNtcCAhPSBzaW5rKSB7CisgICAgICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgIkRhdGEgYmxvY2tzIGRpZCBub3QgbWF0Y2gsIGV4cGVjdGVkICIgPDwgY21wIDw8ICIsIGdvdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc2luazsKKyAgICB9CisKKyAgICByZXR1cm4gQXNzZXJ0aW9uU3VjY2VzcygpOworfQorCitURVNUX0YoQ293VGVzdCwgUmVzdW1lTWlkQ2x1c3RlcikgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBvcHRpb25zLmNsdXN0ZXJfb3BzID0gNzsKKyAgICBhdXRvIHdyaXRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293V3JpdGVyVjI+KG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZSgpKTsKKworICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgMSwgIkJsb2NrIDEiKSk7CisgICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCAyLCAiQmxvY2sgMiIpKTsKKyAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDMsICJCbG9jayAzIikpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoMSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7CisgICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCA0LCAiQmxvY2sgNCIpKTsKKyAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7CisKKyAgICB3cml0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1dyaXRlclYyPihvcHRpb25zLCBHZXRDb3dGZCgpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkluaXRpYWxpemUoezF9KSk7CisgICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCA0LCAiQmxvY2sgNCIpKTsKKyAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDUsICJCbG9jayA1IikpOworICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgNiwgIkJsb2NrIDYiKSk7CisgICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCA3LCAiQmxvY2sgNyIpKTsKKyAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDgsICJCbG9jayA4IikpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoMikpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7CisgICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOworCisgICAgQ293UmVhZGVyIHJlYWRlcjsKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKKworICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKKyAgICBzaXplX3QgbnVtX3JlcGxhY2UgPSAwOworICAgIHNpemVfdCBtYXhfaW5fY2x1c3RlciA9IDA7CisgICAgc2l6ZV90IG51bV9pbl9jbHVzdGVyID0gMDsKKyAgICBzaXplX3QgbnVtX2NsdXN0ZXJzID0gMDsKKyAgICB3aGlsZSAoIWl0ZXItPkF0RW5kKCkpIHsKKyAgICAgICAgY29uc3QgYXV0byYgb3AgPSBpdGVyLT5HZXQoKTsKKworICAgICAgICBudW1faW5fY2x1c3RlcisrOworICAgICAgICBtYXhfaW5fY2x1c3RlciA9IHN0ZDo6bWF4KG1heF9pbl9jbHVzdGVyLCBudW1faW5fY2x1c3Rlcik7CisKKyAgICAgICAgaWYgKG9wLT50eXBlKCkgPT0ga0Nvd1JlcGxhY2VPcCkgeworICAgICAgICAgICAgbnVtX3JlcGxhY2UrKzsKKworICAgICAgICAgICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssIG51bV9yZXBsYWNlKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKENvbXBhcmVEYXRhQmxvY2soJnJlYWRlciwgb3AsICJCbG9jayAiICsgc3RkOjp0b19zdHJpbmcobnVtX3JlcGxhY2UpKSk7CisgICAgICAgIH0gZWxzZSBpZiAob3AtPnR5cGUoKSA9PSBrQ293Q2x1c3Rlck9wKSB7CisgICAgICAgICAgICBudW1faW5fY2x1c3RlciA9IDA7CisgICAgICAgICAgICBudW1fY2x1c3RlcnMrKzsKKyAgICAgICAgfQorCisgICAgICAgIGl0ZXItPk5leHQoKTsKKyAgICB9CisgICAgQVNTRVJUX0VRKG51bV9yZXBsYWNlLCA4KTsKKyAgICBBU1NFUlRfRVEobWF4X2luX2NsdXN0ZXIsIDcpOworICAgIEFTU0VSVF9FUShudW1fY2x1c3RlcnMsIDIpOworfQorCitURVNUX0YoQ293VGVzdCwgUmVzdW1lRW5kQ2x1c3RlcikgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBpbnQgY2x1c3Rlcl9vcHMgPSA1OworICAgIG9wdGlvbnMuY2x1c3Rlcl9vcHMgPSBjbHVzdGVyX29wczsKKyAgICBhdXRvIHdyaXRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293V3JpdGVyVjI+KG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZSgpKTsKKworICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgMSwgIkJsb2NrIDEiKSk7CisgICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCAyLCAiQmxvY2sgMiIpKTsKKyAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDMsICJCbG9jayAzIikpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoMSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7CisgICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCA0LCAiQmxvY2sgNCIpKTsKKyAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDUsICJCbG9jayA1IikpOworICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgNiwgIkJsb2NrIDYiKSk7CisgICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCA3LCAiQmxvY2sgNyIpKTsKKyAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDgsICJCbG9jayA4IikpOworICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKKworICAgIHdyaXRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293V3JpdGVyVjI+KG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZSh7MX0pKTsKKyAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDQsICJCbG9jayA0IikpOworICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgNSwgIkJsb2NrIDUiKSk7CisgICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCA2LCAiQmxvY2sgNiIpKTsKKyAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDcsICJCbG9jayA3IikpOworICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgOCwgIkJsb2NrIDgiKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRMYWJlbCgyKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKKyAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7CisKKyAgICBDb3dSZWFkZXIgcmVhZGVyOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOworCisgICAgYXV0byBpdGVyID0gcmVhZGVyLkdldE9wSXRlcigpOworICAgIHNpemVfdCBudW1fcmVwbGFjZSA9IDA7CisgICAgc2l6ZV90IG1heF9pbl9jbHVzdGVyID0gMDsKKyAgICBzaXplX3QgbnVtX2luX2NsdXN0ZXIgPSAwOworICAgIHNpemVfdCBudW1fY2x1c3RlcnMgPSAwOworICAgIHdoaWxlICghaXRlci0+QXRFbmQoKSkgeworICAgICAgICBjb25zdCBhdXRvJiBvcCA9IGl0ZXItPkdldCgpOworCisgICAgICAgIG51bV9pbl9jbHVzdGVyKys7CisgICAgICAgIG1heF9pbl9jbHVzdGVyID0gc3RkOjptYXgobWF4X2luX2NsdXN0ZXIsIG51bV9pbl9jbHVzdGVyKTsKKworICAgICAgICBpZiAob3AtPnR5cGUoKSA9PSBrQ293UmVwbGFjZU9wKSB7CisgICAgICAgICAgICBudW1fcmVwbGFjZSsrOworCisgICAgICAgICAgICBBU1NFUlRfRVEob3AtPm5ld19ibG9jaywgbnVtX3JlcGxhY2UpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoQ29tcGFyZURhdGFCbG9jaygmcmVhZGVyLCBvcCwgIkJsb2NrICIgKyBzdGQ6OnRvX3N0cmluZyhudW1fcmVwbGFjZSkpKTsKKyAgICAgICAgfSBlbHNlIGlmIChvcC0+dHlwZSgpID09IGtDb3dDbHVzdGVyT3ApIHsKKyAgICAgICAgICAgIG51bV9pbl9jbHVzdGVyID0gMDsKKyAgICAgICAgICAgIG51bV9jbHVzdGVycysrOworICAgICAgICB9CisKKyAgICAgICAgaXRlci0+TmV4dCgpOworICAgIH0KKyAgICBBU1NFUlRfRVEobnVtX3JlcGxhY2UsIDgpOworICAgIEFTU0VSVF9FUShtYXhfaW5fY2x1c3RlciwgY2x1c3Rlcl9vcHMpOworICAgIEFTU0VSVF9FUShudW1fY2x1c3RlcnMsIDMpOworfQorCitURVNUX0YoQ293VGVzdCwgRGVsZXRlTWlkQ2x1c3RlcikgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBvcHRpb25zLmNsdXN0ZXJfb3BzID0gNzsKKyAgICBhdXRvIHdyaXRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293V3JpdGVyVjI+KG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZSgpKTsKKworICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgMSwgIkJsb2NrIDEiKSk7CisgICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCAyLCAiQmxvY2sgMiIpKTsKKyAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDMsICJCbG9jayAzIikpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoMSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7CisgICAgQVNTRVJUX1RSVUUoV3JpdGVEYXRhQmxvY2sod3JpdGVyLmdldCgpLCA0LCAiQmxvY2sgNCIpKTsKKyAgICBBU1NFUlRfVFJVRShXcml0ZURhdGFCbG9jayh3cml0ZXIuZ2V0KCksIDUsICJCbG9jayA1IikpOworICAgIEFTU0VSVF9UUlVFKFdyaXRlRGF0YUJsb2NrKHdyaXRlci5nZXQoKSwgNiwgIkJsb2NrIDYiKSk7CisgICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOworCisgICAgd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXJWMj4ob3B0aW9ucywgR2V0Q293RmQoKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5Jbml0aWFsaXplKHsxfSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7CisgICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOworCisgICAgQ293UmVhZGVyIHJlYWRlcjsKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKKworICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKKyAgICBzaXplX3QgbnVtX3JlcGxhY2UgPSAwOworICAgIHNpemVfdCBtYXhfaW5fY2x1c3RlciA9IDA7CisgICAgc2l6ZV90IG51bV9pbl9jbHVzdGVyID0gMDsKKyAgICBzaXplX3QgbnVtX2NsdXN0ZXJzID0gMDsKKyAgICB3aGlsZSAoIWl0ZXItPkF0RW5kKCkpIHsKKyAgICAgICAgY29uc3QgYXV0byYgb3AgPSBpdGVyLT5HZXQoKTsKKworICAgICAgICBudW1faW5fY2x1c3RlcisrOworICAgICAgICBtYXhfaW5fY2x1c3RlciA9IHN0ZDo6bWF4KG1heF9pbl9jbHVzdGVyLCBudW1faW5fY2x1c3Rlcik7CisgICAgICAgIGlmIChvcC0+dHlwZSgpID09IGtDb3dSZXBsYWNlT3ApIHsKKyAgICAgICAgICAgIG51bV9yZXBsYWNlKys7CisKKyAgICAgICAgICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCBudW1fcmVwbGFjZSk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShDb21wYXJlRGF0YUJsb2NrKCZyZWFkZXIsIG9wLCAiQmxvY2sgIiArIHN0ZDo6dG9fc3RyaW5nKG51bV9yZXBsYWNlKSkpOworICAgICAgICB9IGVsc2UgaWYgKG9wLT50eXBlKCkgPT0ga0Nvd0NsdXN0ZXJPcCkgeworICAgICAgICAgICAgbnVtX2luX2NsdXN0ZXIgPSAwOworICAgICAgICAgICAgbnVtX2NsdXN0ZXJzKys7CisgICAgICAgIH0KKworICAgICAgICBpdGVyLT5OZXh0KCk7CisgICAgfQorICAgIEFTU0VSVF9FUShudW1fcmVwbGFjZSwgMyk7CisgICAgQVNTRVJUX0VRKG1heF9pbl9jbHVzdGVyLCA1KTsgIC8vIDMgZGF0YSwgMSBsYWJlbCwgMSBjbHVzdGVyIG9wCisgICAgQVNTRVJUX0VRKG51bV9jbHVzdGVycywgMSk7Cit9CisKK1RFU1RfRihDb3dUZXN0LCBCaWdTZXFPcCkgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBDb3dXcml0ZXJWMiB3cml0ZXIob3B0aW9ucywgR2V0Q293RmQoKSk7CisgICAgY29uc3QgaW50IHNlcV9sZW4gPSBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQxNl90Pjo6bWF4KCkgLyBzaXplb2YodWludDMyX3QpICsgMTsKKyAgICB1aW50MzJfdCBzZXF1ZW5jZVtzZXFfbGVuXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcV9sZW47IGkrKykgeworICAgICAgICBzZXF1ZW5jZVtpXSA9IGkgKyAxOworICAgIH0KKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5Jbml0aWFsaXplKCkpOworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFNlcXVlbmNlRGF0YShzZXFfbGVuLCBzZXF1ZW5jZSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRaZXJvQmxvY2tzKDEsIHNlcV9sZW4pKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuRmluYWxpemUoKSk7CisKKyAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7CisKKyAgICBDb3dSZWFkZXIgcmVhZGVyOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOworICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRSZXZNZXJnZU9wSXRlcigpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXFfbGVuOyBpKyspIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoIWl0ZXItPkF0RW5kKCkpOworICAgICAgICBjb25zdCBhdXRvJiBvcCA9IGl0ZXItPkdldCgpOworCisgICAgICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCBzZXFfbGVuIC0gaSk7CisKKyAgICAgICAgaXRlci0+TmV4dCgpOworICAgIH0KKyAgICBBU1NFUlRfVFJVRShpdGVyLT5BdEVuZCgpKTsKK30KKworVEVTVF9GKENvd1Rlc3QsIE1pc3NpbmdTZXFPcCkgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBDb3dXcml0ZXJWMiB3cml0ZXIob3B0aW9ucywgR2V0Q293RmQoKSk7CisgICAgY29uc3QgaW50IHNlcV9sZW4gPSAxMDsKKyAgICB1aW50MzJfdCBzZXF1ZW5jZVtzZXFfbGVuXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcV9sZW47IGkrKykgeworICAgICAgICBzZXF1ZW5jZVtpXSA9IGkgKyAxOworICAgIH0KKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5Jbml0aWFsaXplKCkpOworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFNlcXVlbmNlRGF0YShzZXFfbGVuLCBzZXF1ZW5jZSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRaZXJvQmxvY2tzKDEsIHNlcV9sZW4gLSAxKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkZpbmFsaXplKCkpOworCisgICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOworCisgICAgQ293UmVhZGVyIHJlYWRlcjsKKyAgICBBU1NFUlRfRkFMU0UocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7Cit9CisKK1RFU1RfRihDb3dUZXN0LCBSZXN1bWVTZXFPcCkgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBhdXRvIHdyaXRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293V3JpdGVyVjI+KG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgIGNvbnN0IGludCBzZXFfbGVuID0gMTA7CisgICAgdWludDMyX3Qgc2VxdWVuY2Vbc2VxX2xlbl07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXFfbGVuOyBpKyspIHsKKyAgICAgICAgc2VxdWVuY2VbaV0gPSBpICsgMTsKKyAgICB9CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkluaXRpYWxpemUoKSk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFNlcXVlbmNlRGF0YShzZXFfbGVuLCBzZXF1ZW5jZSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWmVyb0Jsb2NrcygxLCBzZXFfbGVuIC8gMikpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkTGFiZWwoMSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWmVyb0Jsb2NrcygxICsgc2VxX2xlbiAvIDIsIDEpKTsKKworICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKKyAgICBhdXRvIHJlYWRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293UmVhZGVyPigpOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci0+UGFyc2UoY293Xy0+ZmQsIDEpKTsKKyAgICBhdXRvIGl0ciA9IHJlYWRlci0+R2V0UmV2TWVyZ2VPcEl0ZXIoKTsKKyAgICBBU1NFUlRfVFJVRShpdHItPkF0RW5kKCkpOworCisgICAgd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXJWMj4ob3B0aW9ucywgR2V0Q293RmQoKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5Jbml0aWFsaXplKHsxfSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWmVyb0Jsb2NrcygxICsgc2VxX2xlbiAvIDIsIHNlcV9sZW4gLyAyKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKKworICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKKworICAgIHJlYWRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293UmVhZGVyPigpOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci0+UGFyc2UoY293Xy0+ZmQpKTsKKworICAgIGF1dG8gaXRlciA9IHJlYWRlci0+R2V0UmV2TWVyZ2VPcEl0ZXIoKTsKKworICAgIHVpbnQ2NF90IGV4cGVjdGVkX2Jsb2NrID0gMTA7CisgICAgd2hpbGUgKCFpdGVyLT5BdEVuZCgpICYmIGV4cGVjdGVkX2Jsb2NrID4gMCkgeworICAgICAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisgICAgICAgIGNvbnN0IGF1dG8mIG9wID0gaXRlci0+R2V0KCk7CisKKyAgICAgICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssIGV4cGVjdGVkX2Jsb2NrKTsKKworICAgICAgICBpdGVyLT5OZXh0KCk7CisgICAgICAgIGV4cGVjdGVkX2Jsb2NrLS07CisgICAgfQorICAgIEFTU0VSVF9FUShleHBlY3RlZF9ibG9jaywgMCk7CisgICAgQVNTRVJUX1RSVUUoaXRlci0+QXRFbmQoKSk7Cit9CisKK1RFU1RfRihDb3dUZXN0LCBSZXZNZXJnZU9wSXRyVGVzdCkgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBvcHRpb25zLmNsdXN0ZXJfb3BzID0gNTsKKyAgICBvcHRpb25zLm51bV9tZXJnZV9vcHMgPSAxOworICAgIENvd1dyaXRlclYyIHdyaXRlcihvcHRpb25zLCBHZXRDb3dGZCgpKTsKKyAgICB1aW50MzJfdCBzZXF1ZW5jZVtdID0gezIsIDEwLCA2LCA3LCAzLCA1fTsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5Jbml0aWFsaXplKCkpOworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFNlcXVlbmNlRGF0YSg2LCBzZXF1ZW5jZSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRDb3B5KDYsIDEzKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFplcm9CbG9ja3MoMTIsIDEpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWmVyb0Jsb2Nrcyg4LCAxKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFplcm9CbG9ja3MoMTEsIDEpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weSgzLCAxNSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRDb3B5KDIsIDExKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFplcm9CbG9ja3MoNCwgMSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRaZXJvQmxvY2tzKDksIDEpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weSg1LCAxNikpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRaZXJvQmxvY2tzKDEsIDEpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weSgxMCwgMTIpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weSg3LCAxNCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5GaW5hbGl6ZSgpKTsKKworICAgIC8vIE5ldyBibG9jayBpbiBjb3cgb3JkZXIgaXMgNiwgMTIsIDgsIDExLCAzLCAyLCA0LCA5LCA1LCAxLCAxMCwgNworICAgIC8vIE5ldyBibG9jayBpbiBtZXJnZSBvcmRlciBpcyAyLCAxMCwgNiwgNywgMywgNSwgMTIsIDExLCA5LCA4LCA0LCAxCisgICAgLy8gUmV2TWVyZ2VPcmRlciBpcyAxLCA0LCA4LCA5LCAxMSwgMTIsIDUsIDMsIDcsIDYsIDEwLCAyCisgICAgLy8gbmV3IGJsb2NrIDIgaXMgImFscmVhZHkgbWVyZ2VkIiwgc28gd2lsbCBiZSBsZWZ0IG91dC4KKworICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiByZXZNZXJnZU9wU2VxdWVuY2UgPSB7MSwgNCwgOCwgOSwgMTEsIDEyLCA1LCAzLCA3LCA2LCAxMH07CisKKyAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7CisKKyAgICBDb3dSZWFkZXIgcmVhZGVyOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOworICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRSZXZNZXJnZU9wSXRlcigpOworICAgIGF1dG8gZXhwZWN0ZWRfbmV3X2Jsb2NrID0gcmV2TWVyZ2VPcFNlcXVlbmNlLmJlZ2luKCk7CisKKyAgICB3aGlsZSAoIWl0ZXItPkF0RW5kKCkgJiYgZXhwZWN0ZWRfbmV3X2Jsb2NrICE9IHJldk1lcmdlT3BTZXF1ZW5jZS5lbmQoKSkgeworICAgICAgICBjb25zdCBhdXRvJiBvcCA9IGl0ZXItPkdldCgpOworCisgICAgICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCAqZXhwZWN0ZWRfbmV3X2Jsb2NrKTsKKworICAgICAgICBpdGVyLT5OZXh0KCk7CisgICAgICAgIGV4cGVjdGVkX25ld19ibG9jaysrOworICAgIH0KKyAgICBBU1NFUlRfRVEoZXhwZWN0ZWRfbmV3X2Jsb2NrLCByZXZNZXJnZU9wU2VxdWVuY2UuZW5kKCkpOworICAgIEFTU0VSVF9UUlVFKGl0ZXItPkF0RW5kKCkpOworfQorCitURVNUX0YoQ293VGVzdCwgUGFyc2VPcHRpb25zVGVzdCkgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGJvb2w+PiB0ZXN0Y2FzZXMgPSB7CisgICAgICAgICAgICB7Imd6LDQiLCB0cnVlfSwgICB7Imd6LDQsNCIsIGZhbHNlfSwgeyJsejQsNCIsIHRydWV9LCB7ImJyb3RsaSw0IiwgdHJ1ZX0sCisgICAgICAgICAgICB7InpzdGQsNCIsIHRydWV9LCB7InpzdGQseCIsIGZhbHNlfSwgeyJ6cyw0IiwgZmFsc2V9LCB7InpzdGQuNCIsIGZhbHNlfX07CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0ZXN0Y2FzZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgb3B0aW9ucy5jb21wcmVzc2lvbiA9IHRlc3RjYXNlc1tpXS5maXJzdDsKKyAgICAgICAgQ293V3JpdGVyVjIgd3JpdGVyKG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgICAgICBBU1NFUlRfRVEod3JpdGVyLkluaXRpYWxpemUoKSwgdGVzdGNhc2VzW2ldLnNlY29uZCk7CisgICAgfQorfQorCitURVNUX0YoQ293VGVzdCwgTGVnYWN5UmV2TWVyZ2VPcEl0clRlc3QpIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDU7CisgICAgb3B0aW9ucy5udW1fbWVyZ2Vfb3BzID0gMTsKKyAgICBDb3dXcml0ZXJWMiB3cml0ZXIob3B0aW9ucywgR2V0Q293RmQoKSk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuSW5pdGlhbGl6ZSgpKTsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRDb3B5KDIsIDExKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoMTAsIDEyKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoNiwgMTMpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weSg3LCAxNCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRDb3B5KDMsIDE1KSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoNSwgMTYpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWmVyb0Jsb2NrcygxMiwgMSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRaZXJvQmxvY2tzKDgsIDEpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWmVyb0Jsb2NrcygxMSwgMSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRaZXJvQmxvY2tzKDQsIDEpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWmVyb0Jsb2Nrcyg5LCAxKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFplcm9CbG9ja3MoMSwgMSkpOworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkZpbmFsaXplKCkpOworCisgICAgLy8gTmV3IGJsb2NrIGluIGNvdyBvcmRlciBpcyAyLCAxMCwgNiwgNywgMywgNSwgMTIsIDgsIDExLCA0LCA5LCAxCisgICAgLy8gTmV3IGJsb2NrIGluIG1lcmdlIG9yZGVyIGlzIDIsIDEwLCA2LCA3LCAzLCA1LCAxMiwgMTEsIDksIDgsIDQsIDEKKyAgICAvLyBSZXZNZXJnZU9yZGVyIGlzIDEsIDQsIDgsIDksIDExLCAxMiwgNSwgMywgNywgNiwgMTAsIDIKKyAgICAvLyBuZXcgYmxvY2sgMiBpcyAiYWxyZWFkeSBtZXJnZWQiLCBzbyB3aWxsIGJlIGxlZnQgb3V0LgorCisgICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IHJldk1lcmdlT3BTZXF1ZW5jZSA9IHsxLCA0LCA4LCA5LCAxMSwgMTIsIDUsIDMsIDcsIDYsIDEwfTsKKworICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKKworICAgIENvd1JlYWRlciByZWFkZXI7CisgICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7CisgICAgYXV0byBpdGVyID0gcmVhZGVyLkdldFJldk1lcmdlT3BJdGVyKCk7CisgICAgYXV0byBleHBlY3RlZF9uZXdfYmxvY2sgPSByZXZNZXJnZU9wU2VxdWVuY2UuYmVnaW4oKTsKKworICAgIHdoaWxlICghaXRlci0+QXRFbmQoKSAmJiBleHBlY3RlZF9uZXdfYmxvY2sgIT0gcmV2TWVyZ2VPcFNlcXVlbmNlLmVuZCgpKSB7CisgICAgICAgIGNvbnN0IGF1dG8mIG9wID0gaXRlci0+R2V0KCk7CisKKyAgICAgICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssICpleHBlY3RlZF9uZXdfYmxvY2spOworCisgICAgICAgIGl0ZXItPk5leHQoKTsKKyAgICAgICAgZXhwZWN0ZWRfbmV3X2Jsb2NrKys7CisgICAgfQorICAgIEFTU0VSVF9FUShleHBlY3RlZF9uZXdfYmxvY2ssIHJldk1lcmdlT3BTZXF1ZW5jZS5lbmQoKSk7CisgICAgQVNTRVJUX1RSVUUoaXRlci0+QXRFbmQoKSk7Cit9CisKK1RFU1RfRihDb3dUZXN0LCBJbnZhbGlkTWVyZ2VPcmRlclRlc3QpIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDU7CisgICAgb3B0aW9ucy5udW1fbWVyZ2Vfb3BzID0gMTsKKyAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlRoaXMgaXMgc29tZSBkYXRhLCBiZWxpZXZlIGl0IjsKKyAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOworICAgIGF1dG8gd3JpdGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dXcml0ZXJWMj4ob3B0aW9ucywgR2V0Q293RmQoKSk7CisgICAgQ293UmVhZGVyIHJlYWRlcjsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZSgpKTsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkQ29weSgzLCAyKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRDb3B5KDIsIDEpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZExhYmVsKDEpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci5WZXJpZnlNZXJnZU9wcygpKTsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZSh7MX0pKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZENvcHkoNCwgMikpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7CisgICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7CisgICAgQVNTRVJUX0ZBTFNFKHJlYWRlci5WZXJpZnlNZXJnZU9wcygpKTsKKworICAgIHdyaXRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293V3JpdGVyVjI+KG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZSgpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZENvcHkoMiwgMSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWG9yQmxvY2tzKDMsIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSwgMSwgMSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7CisgICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7CisgICAgQVNTRVJUX0ZBTFNFKHJlYWRlci5WZXJpZnlNZXJnZU9wcygpKTsKK30KKwordW5pcXVlX2ZkIE9wZW5UZXN0RmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZSwgaW50IGZsYWdzKSB7CisgICAgc3RkOjpzdHJpbmcgcGF0aCA9ICJ0b29scy90ZXN0ZGF0YS8iICsgZmlsZTsKKworICAgIHVuaXF1ZV9mZCBmZChvcGVuKHBhdGguY19zdHIoKSwgZmxhZ3MpKTsKKyAgICBpZiAoZmQgPj0gMCkgeworICAgICAgICByZXR1cm4gZmQ7CisgICAgfQorCisgICAgcGF0aCA9IGFuZHJvaWQ6OmJhc2U6OkdldEV4ZWN1dGFibGVEaXJlY3RvcnkoKSArICIvIiArIHBhdGg7CisgICAgcmV0dXJuIHVuaXF1ZV9mZHtvcGVuKHBhdGguY19zdHIoKSwgZmxhZ3MpfTsKK30KKworVEVTVF9GKENvd1Rlc3QsIENvbXBhdGliaWxpdHlUZXN0KSB7CisgICAgc3RkOjpzdHJpbmcgZmlsZW5hbWUgPSAiY293X3YyIjsKKyAgICBhdXRvIGZkID0gT3BlblRlc3RGaWxlKGZpbGVuYW1lLCBPX1JET05MWSk7CisgICAgaWYgKGZkLmdldCgpID09IC0xKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgZmlsZW5hbWUgPDwgIiBub3QgZm91bmQiOworICAgICAgICBHVEVTVF9TS0lQKCk7CisgICAgfQorICAgIENvd1JlYWRlciByZWFkZXI7CisgICAgcmVhZGVyLlBhcnNlKGZkKTsKKworICAgIGNvbnN0IGF1dG8mIGhlYWRlciA9IHJlYWRlci5HZXRIZWFkZXIoKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLnByZWZpeC5tYWdpYywga0Nvd01hZ2ljTnVtYmVyKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLnByZWZpeC5tYWpvcl92ZXJzaW9uLCBrQ293VmVyc2lvbk1ham9yKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLnByZWZpeC5taW5vcl92ZXJzaW9uLCBrQ293VmVyc2lvbk1pbm9yKTsKKworICAgIENvd0Zvb3RlciBmb290ZXI7CisgICAgQVNTRVJUX1RSVUUocmVhZGVyLkdldEZvb3RlcigmZm9vdGVyKSk7Cit9CisKK1RFU1RfRihDb3dUZXN0LCBEZWNvbXByZXNzSW5jb21wcmVzc2libGVCbG9jaykgeworICAgIGF1dG8gZmQgPSBPcGVuVGVzdEZpbGUoImluY29tcHJlc3NpYmxlX2Jsb2NrIiwgT19SRE9OTFkpOworICAgIEFTU0VSVF9HRShmZCwgMCk7CisKKyAgICBzdGQ6OnN0cmluZyBvcmlnaW5hbDsKKyAgICBBU1NFUlRfVFJVRShhbmRyb2lkOjpiYXNlOjpSZWFkRmRUb1N0cmluZyhmZCwgJm9yaWdpbmFsKSkgPDwgc3RyZXJyb3IoZXJybm8pOworICAgIEFTU0VSVF9FUShvcmlnaW5hbC5zaXplKCksIDQwOTYpOworCisgICAgQ293T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMuY29tcHJlc3Npb24gPSAiZ3oiOworICAgIGF1dG8gd3JpdGVyID0gQ3JlYXRlQ293V3JpdGVyKDIsIG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgIEFTU0VSVF9ORSh3cml0ZXIsIG51bGxwdHIpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkUmF3QmxvY2tzKDAsIG9yaWdpbmFsLmRhdGEoKSwgb3JpZ2luYWwuc2l6ZSgpKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKKworICAgIENvd1JlYWRlciByZWFkZXI7CisgICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7CisKKyAgICBhdXRvIGl0ZXIgPSByZWFkZXIuR2V0T3BJdGVyKCk7CisgICAgQVNTRVJUX05FKGl0ZXIsIG51bGxwdHIpOworICAgIEFTU0VSVF9GQUxTRShpdGVyLT5BdEVuZCgpKTsKKworICAgIHN0ZDo6c3RyaW5nIGJsb2NrKG9yaWdpbmFsLnNpemUoKSwgJ1wwJyk7CisgICAgQVNTRVJUX0VRKGl0ZXItPkdldCgpLT5kYXRhX2xlbmd0aCwgNDA5Nik7CisgICAgQVNTRVJUX1RSVUUoUmVhZERhdGEocmVhZGVyLCBpdGVyLT5HZXQoKSwgYmxvY2suZGF0YSgpLCBibG9jay5zaXplKCkpKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYmxvY2suc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQVNTRVJUX0VRKGJsb2NrW2ldLCBvcmlnaW5hbFtpXSkgPDwgIm1pc21hdGNoIGF0IGJ5dGUgIiA8PCBpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICByZXR1cm4gUlVOX0FMTF9URVNUUygpOworfQpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy90ZXN0X3YzLmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvdGVzdF92My5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ1NmIyNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvdGVzdF92My5jcHAKQEAgLTAsMCArMSw5NjcgQEAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxsaWJzbmFwc2hvdC9jb3dfZm9ybWF0Lmg+CisjaW5jbHVkZSA8bGlic25hcHNob3QvY293X3JlYWRlci5oPgorI2luY2x1ZGUgPGxpYnNuYXBzaG90L2Nvd193cml0ZXIuaD4KKyNpbmNsdWRlIDxzdG9yYWdlX2xpdGVyYWxzL3N0b3JhZ2VfbGl0ZXJhbHMuaD4KKyNpbmNsdWRlICJ3cml0ZXJfdjIuaCIKKyNpbmNsdWRlICJ3cml0ZXJfdjMuaCIKKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOwordXNpbmcgdGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZTsKK3VzaW5nIHRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdDsKK3VzaW5nIHRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3M7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBzbmFwc2hvdCB7CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpzdG9yYWdlX2xpdGVyYWxzOwordXNpbmcgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtOworCitjbGFzcyBDb3dUZXN0VjMgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyAgcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgY293XyA9IHN0ZDo6bWFrZV91bmlxdWU8VGVtcG9yYXJ5RmlsZT4oKTsKKyAgICAgICAgQVNTRVJUX0dFKGNvd18tPmZkLCAwKSA8PCBzdHJlcnJvcihlcnJubyk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeyBjb3dfID0gbnVsbHB0cjsgfQorCisgICAgdW5pcXVlX2ZkIEdldENvd0ZkKCkgeyByZXR1cm4gdW5pcXVlX2Zke2R1cChjb3dfLT5mZCl9OyB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VGVtcG9yYXJ5RmlsZT4gY293XzsKK307CisKKy8vIEhlbHBlciB0byBjaGVjayByZWFkIHNpemVzLgorc3RhdGljIGlubGluZSBib29sIFJlYWREYXRhKENvd1JlYWRlciYgcmVhZGVyLCBjb25zdCBDb3dPcGVyYXRpb24qIG9wLCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKSB7CisgICAgcmV0dXJuIHJlYWRlci5SZWFkRGF0YShvcCwgYnVmZmVyLCBzaXplKSA9PSBzaXplOworfQorCitURVNUX0YoQ293VGVzdFYzLCBDb3dIZWFkZXJWMlRlc3QpIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDU7CisgICAgb3B0aW9ucy5udW1fbWVyZ2Vfb3BzID0gMTsKKyAgICBvcHRpb25zLmJsb2NrX3NpemUgPSA0MDk2OworICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSAiVGhpcyBpcyBzb21lIGRhdGEsIGJlbGlldmUgaXQiOworICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7CisgICAgYXV0byB3cml0ZXJfdjIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1dyaXRlclYyPihvcHRpb25zLCBHZXRDb3dGZCgpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXJfdjItPkluaXRpYWxpemUoKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyX3YyLT5GaW5hbGl6ZSgpKTsKKworICAgIENvd1JlYWRlciByZWFkZXI7CisgICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7CisKKyAgICBjb25zdCBhdXRvJiBoZWFkZXIgPSByZWFkZXIuR2V0SGVhZGVyKCk7CisgICAgQVNTRVJUX0VRKGhlYWRlci5wcmVmaXgubWFnaWMsIGtDb3dNYWdpY051bWJlcik7CisgICAgQVNTRVJUX0VRKGhlYWRlci5wcmVmaXgubWFqb3JfdmVyc2lvbiwgMik7CisgICAgQVNTRVJUX0VRKGhlYWRlci5wcmVmaXgubWlub3JfdmVyc2lvbiwgMCk7CisgICAgQVNTRVJUX0VRKGhlYWRlci5ibG9ja19zaXplLCBvcHRpb25zLmJsb2NrX3NpemUpOworICAgIEFTU0VSVF9FUShoZWFkZXIuY2x1c3Rlcl9vcHMsIG9wdGlvbnMuY2x1c3Rlcl9vcHMpOworfQorCitURVNUX0YoQ293VGVzdFYzLCBIZWFkZXIpIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5vcF9jb3VudF9tYXggPSAxNTsKKyAgICBhdXRvIHdyaXRlciA9IENyZWF0ZUNvd1dyaXRlcigzLCBvcHRpb25zLCBHZXRDb3dGZCgpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOworCisgICAgQ293UmVhZGVyIHJlYWRlcjsKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKKworICAgIGNvbnN0IGF1dG8mIGhlYWRlciA9IHJlYWRlci5HZXRIZWFkZXIoKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLnByZWZpeC5tYWdpYywga0Nvd01hZ2ljTnVtYmVyKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLnByZWZpeC5tYWpvcl92ZXJzaW9uLCAzKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLnByZWZpeC5taW5vcl92ZXJzaW9uLCAwKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLmJsb2NrX3NpemUsIG9wdGlvbnMuYmxvY2tfc2l6ZSk7CisgICAgQVNTRVJUX0VRKGhlYWRlci5jbHVzdGVyX29wcywgMCk7Cit9CisKK1RFU1RfRihDb3dUZXN0VjMsIE1heE9wKSB7CisgICAgQ293T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMub3BfY291bnRfbWF4ID0gMjA7CisgICAgYXV0byB3cml0ZXIgPSBDcmVhdGVDb3dXcml0ZXIoMywgb3B0aW9ucywgR2V0Q293RmQoKSk7CisgICAgQVNTRVJUX0ZBTFNFKHdyaXRlci0+QWRkWmVyb0Jsb2NrcygxLCAyMSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWmVyb0Jsb2NrcygxLCAyMCkpOworICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSAiVGhpcyBpcyBzb21lIGRhdGEsIGJlbGlldmUgaXQiOworICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7CisKKyAgICBBU1NFUlRfRkFMU0Uod3JpdGVyLT5BZGRSYXdCbG9ja3MoNSwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKSk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOworCisgICAgQ293UmVhZGVyIHJlYWRlcjsKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKKyAgICBBU1NFUlRfRVEocmVhZGVyLmhlYWRlcl92MygpLm9wX2NvdW50LCAyMCk7Cit9CisKK1RFU1RfRihDb3dUZXN0VjMsIE1heE9wU2luZ2xlVGhyZWFkQ29tcHJlc3Npb24pIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5vcF9jb3VudF9tYXggPSAyMDsKKyAgICBvcHRpb25zLm51bV9jb21wcmVzc190aHJlYWRzID0gMTsKKyAgICBvcHRpb25zLmNvbXByZXNzaW9uX2ZhY3RvciA9IDQwOTYgKiA4OworICAgIG9wdGlvbnMuY29tcHJlc3Npb24gPSAibHo0IjsKKworICAgIGF1dG8gd3JpdGVyID0gQ3JlYXRlQ293V3JpdGVyKDMsIG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWmVyb0Jsb2NrcygxLCAyMCkpOworICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSAiVGhpcyBpcyBzb21lIGRhdGEsIGJlbGlldmUgaXQiOworICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7CisKKyAgICBBU1NFUlRfRkFMU0Uod3JpdGVyLT5BZGRSYXdCbG9ja3MoNSwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKSk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOworfQorCitURVNUX0YoQ293VGVzdFYzLCBNYXhPcE11bHRpVGhyZWFkQ29tcHJlc3Npb24pIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5vcF9jb3VudF9tYXggPSAyMDsKKyAgICBvcHRpb25zLm51bV9jb21wcmVzc190aHJlYWRzID0gMjsKKyAgICBvcHRpb25zLmNvbXByZXNzaW9uX2ZhY3RvciA9IDQwOTYgKiA4OworICAgIG9wdGlvbnMuY29tcHJlc3Npb24gPSAibHo0IjsKKworICAgIGF1dG8gd3JpdGVyID0gQ3JlYXRlQ293V3JpdGVyKDMsIG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWmVyb0Jsb2NrcygxLCAyMCkpOworICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSAiVGhpcyBpcyBzb21lIGRhdGEsIGJlbGlldmUgaXQiOworICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7CisKKyAgICBBU1NFUlRfRkFMU0Uod3JpdGVyLT5BZGRSYXdCbG9ja3MoNSwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKSk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOworfQorCitURVNUX0YoQ293VGVzdFYzLCBaZXJvT3ApIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5vcF9jb3VudF9tYXggPSAyMDsKKyAgICBhdXRvIHdyaXRlciA9IENyZWF0ZUNvd1dyaXRlcigzLCBvcHRpb25zLCBHZXRDb3dGZCgpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFplcm9CbG9ja3MoMSwgMikpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7CisKKyAgICBDb3dSZWFkZXIgcmVhZGVyOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOworICAgIEFTU0VSVF9FUShyZWFkZXIuaGVhZGVyX3YzKCkub3BfY291bnQsIDIpOworCisgICAgYXV0byBpdGVyID0gcmVhZGVyLkdldE9wSXRlcigpOworICAgIEFTU0VSVF9ORShpdGVyLCBudWxscHRyKTsKKyAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisKKyAgICBhdXRvIG9wID0gaXRlci0+R2V0KCk7CisgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3daZXJvT3ApOworICAgIEFTU0VSVF9FUShvcC0+ZGF0YV9sZW5ndGgsIDApOworICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCAxKTsKKyAgICBBU1NFUlRfRVEob3AtPnNvdXJjZSgpLCAwKTsKKworICAgIGl0ZXItPk5leHQoKTsKKyAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisgICAgb3AgPSBpdGVyLT5HZXQoKTsKKworICAgIEFTU0VSVF9FUShvcC0+dHlwZSgpLCBrQ293WmVyb09wKTsKKyAgICBBU1NFUlRfRVEob3AtPmRhdGFfbGVuZ3RoLCAwKTsKKyAgICBBU1NFUlRfRVEob3AtPm5ld19ibG9jaywgMik7CisgICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UoKSwgMCk7Cit9CisKK1RFU1RfRihDb3dUZXN0VjMsIFJlcGxhY2VPcCkgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBvcHRpb25zLm9wX2NvdW50X21heCA9IDIwOworICAgIG9wdGlvbnMuc2NyYXRjaF9zcGFjZSA9IGZhbHNlOworICAgIGF1dG8gd3JpdGVyID0gQ3JlYXRlQ293V3JpdGVyKDMsIG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSAiVGhpcyBpcyBzb21lIGRhdGEsIGJlbGlldmUgaXQiOworICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFJhd0Jsb2Nrcyg1LCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOworCisgICAgQ293UmVhZGVyIHJlYWRlcjsKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKKworICAgIGNvbnN0IGF1dG8mIGhlYWRlciA9IHJlYWRlci5oZWFkZXJfdjMoKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLnByZWZpeC5tYWdpYywga0Nvd01hZ2ljTnVtYmVyKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLnByZWZpeC5tYWpvcl92ZXJzaW9uLCAzKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLnByZWZpeC5taW5vcl92ZXJzaW9uLCBrQ293VmVyc2lvbk1pbm9yKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLmJsb2NrX3NpemUsIG9wdGlvbnMuYmxvY2tfc2l6ZSk7CisgICAgQVNTRVJUX0VRKGhlYWRlci5vcF9jb3VudCwgMSk7CisKKyAgICBhdXRvIGl0ZXIgPSByZWFkZXIuR2V0T3BJdGVyKCk7CisgICAgQVNTRVJUX05FKGl0ZXIsIG51bGxwdHIpOworICAgIEFTU0VSVF9GQUxTRShpdGVyLT5BdEVuZCgpKTsKKworICAgIGF1dG8gb3AgPSBpdGVyLT5HZXQoKTsKKyAgICBzdGQ6OnN0cmluZyBzaW5rKGRhdGEuc2l6ZSgpLCAnXDAnKTsKKworICAgIEFTU0VSVF9FUShvcC0+dHlwZSgpLCBrQ293UmVwbGFjZU9wKTsKKyAgICBBU1NFUlRfRVEob3AtPmRhdGFfbGVuZ3RoLCA0MDk2KTsKKyAgICBBU1NFUlRfRVEob3AtPm5ld19ibG9jaywgNSk7CisgICAgQVNTRVJUX1RSVUUoUmVhZERhdGEocmVhZGVyLCBvcCwgc2luay5kYXRhKCksIHNpbmsuc2l6ZSgpKSk7CisgICAgQVNTRVJUX0VRKHNpbmssIGRhdGEpOworfQorCitURVNUX0YoQ293VGVzdFYzLCBCaWdSZXBsYWNlT3ApIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5vcF9jb3VudF9tYXggPSAxMDAwMDsKKyAgICBvcHRpb25zLmJhdGNoX3dyaXRlID0gdHJ1ZTsKKyAgICBvcHRpb25zLmNsdXN0ZXJfb3BzID0gMjA0ODsKKworICAgIGF1dG8gd3JpdGVyID0gQ3JlYXRlQ293V3JpdGVyKDMsIG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSAiVGhpcyBpcyBzb21lIGRhdGEsIGJlbGlldmUgaXQiOworICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSAqIDQwOTYsICdcMCcpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5zaXplKCk7IGkrKykgeworICAgICAgICBkYXRhW2ldID0gc3RhdGljX2Nhc3Q8Y2hhcj4oJ0EnICsgaSAvIG9wdGlvbnMuYmxvY2tfc2l6ZSk7CisgICAgfQorICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkUmF3QmxvY2tzKDUsIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7CisKKyAgICBDb3dSZWFkZXIgcmVhZGVyOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOworCisgICAgY29uc3QgYXV0byYgaGVhZGVyID0gcmVhZGVyLmhlYWRlcl92MygpOworICAgIEFTU0VSVF9FUShoZWFkZXIub3BfY291bnQsIDQwOTYpOworCisgICAgYXV0byBpdGVyID0gcmVhZGVyLkdldE9wSXRlcigpOworICAgIEFTU0VSVF9ORShpdGVyLCBudWxscHRyKTsKKyAgICBBU1NFUlRfRkFMU0UoaXRlci0+QXRFbmQoKSk7CisKKyAgICBzaXplX3QgaSA9IDA7CisKKyAgICB3aGlsZSAoIWl0ZXItPkF0RW5kKCkpIHsKKyAgICAgICAgYXV0byBvcCA9IGl0ZXItPkdldCgpOworICAgICAgICBzdGQ6OnN0cmluZyBzaW5rKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7CisgICAgICAgIEFTU0VSVF9FUShvcC0+dHlwZSgpLCBrQ293UmVwbGFjZU9wKTsKKyAgICAgICAgQVNTRVJUX0VRKG9wLT5kYXRhX2xlbmd0aCwgb3B0aW9ucy5ibG9ja19zaXplKTsKKyAgICAgICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssIDUgKyBpKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoUmVhZERhdGEocmVhZGVyLCBvcCwgc2luay5kYXRhKCksIG9wdGlvbnMuYmxvY2tfc2l6ZSkpOworICAgICAgICBBU1NFUlRfRVEoc3RkOjpzdHJpbmdfdmlldyhzaW5rKSwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nX3ZpZXcoZGF0YSkuc3Vic3RyKGkgKiBvcHRpb25zLmJsb2NrX3NpemUsIG9wdGlvbnMuYmxvY2tfc2l6ZSkpCisgICAgICAgICAgICAgICAgPDwgIiByZWFkYmFjayBkYXRhIGZvciAiIDw8IGkgPDwgInRoIGJsb2NrIGRvZXMgbm90IG1hdGNoIjsKKyAgICAgICAgaXRlci0+TmV4dCgpOworICAgICAgICBpKys7CisgICAgfQorfQorCitURVNUX0YoQ293VGVzdFYzLCBDb25zZWN1dGl2ZVJlcGxhY2VPcCkgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBvcHRpb25zLm9wX2NvdW50X21heCA9IDIwOworICAgIG9wdGlvbnMuc2NyYXRjaF9zcGFjZSA9IGZhbHNlOworICAgIGF1dG8gd3JpdGVyID0gQ3JlYXRlQ293V3JpdGVyKDMsIG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgIHN0ZDo6c3RyaW5nIGRhdGE7CisgICAgZGF0YS5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplICogNSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGRhdGFbaV0gPSBzdGF0aWNfY2FzdDxjaGFyPignQScgKyBpIC8gb3B0aW9ucy5ibG9ja19zaXplKTsKKyAgICB9CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFJhd0Jsb2Nrcyg1LCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOworCisgICAgQ293UmVhZGVyIHJlYWRlcjsKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKKworICAgIGNvbnN0IGF1dG8mIGhlYWRlciA9IHJlYWRlci5oZWFkZXJfdjMoKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLnByZWZpeC5tYWdpYywga0Nvd01hZ2ljTnVtYmVyKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLnByZWZpeC5tYWpvcl92ZXJzaW9uLCAzKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLnByZWZpeC5taW5vcl92ZXJzaW9uLCBrQ293VmVyc2lvbk1pbm9yKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLmJsb2NrX3NpemUsIG9wdGlvbnMuYmxvY2tfc2l6ZSk7CisgICAgQVNTRVJUX0VRKGhlYWRlci5vcF9jb3VudCwgNSk7CisKKyAgICBhdXRvIGl0ZXIgPSByZWFkZXIuR2V0T3BJdGVyKCk7CisgICAgQVNTRVJUX05FKGl0ZXIsIG51bGxwdHIpOworICAgIEFTU0VSVF9GQUxTRShpdGVyLT5BdEVuZCgpKTsKKworICAgIHNpemVfdCBpID0gMDsKKworICAgIHdoaWxlICghaXRlci0+QXRFbmQoKSkgeworICAgICAgICBhdXRvIG9wID0gaXRlci0+R2V0KCk7CisgICAgICAgIHN0ZDo6c3RyaW5nIHNpbmsob3B0aW9ucy5ibG9ja19zaXplLCAnXDAnKTsKKyAgICAgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3dSZXBsYWNlT3ApOworICAgICAgICBBU1NFUlRfRVEob3AtPmRhdGFfbGVuZ3RoLCBvcHRpb25zLmJsb2NrX3NpemUpOworICAgICAgICBBU1NFUlRfRVEob3AtPm5ld19ibG9jaywgNSArIGkpOworICAgICAgICBBU1NFUlRfVFJVRShSZWFkRGF0YShyZWFkZXIsIG9wLCBzaW5rLmRhdGEoKSwgb3B0aW9ucy5ibG9ja19zaXplKSk7CisgICAgICAgIEFTU0VSVF9FUShzdGQ6OnN0cmluZ192aWV3KHNpbmspLAorICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmdfdmlldyhkYXRhKS5zdWJzdHIoaSAqIG9wdGlvbnMuYmxvY2tfc2l6ZSwgb3B0aW9ucy5ibG9ja19zaXplKSkKKyAgICAgICAgICAgICAgICA8PCAiIHJlYWRiYWNrIGRhdGEgZm9yICIgPDwgaSA8PCAidGggYmxvY2sgZG9lcyBub3QgbWF0Y2giOworICAgICAgICBpdGVyLT5OZXh0KCk7CisgICAgICAgIGkrKzsKKyAgICB9CisKKyAgICBBU1NFUlRfRVEoaSwgNSk7Cit9CisKK1RFU1RfRihDb3dUZXN0VjMsIENvcHlPcCkgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBvcHRpb25zLm9wX2NvdW50X21heCA9IDEwMDsKKyAgICBhdXRvIHdyaXRlciA9IENyZWF0ZUNvd1dyaXRlcigzLCBvcHRpb25zLCBHZXRDb3dGZCgpKTsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkQ29weSgxMCwgMTAwMCwgMTAwKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKKyAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7CisKKyAgICBDb3dSZWFkZXIgcmVhZGVyOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOworCisgICAgY29uc3QgYXV0byYgaGVhZGVyID0gcmVhZGVyLmhlYWRlcl92MygpOworICAgIEFTU0VSVF9FUShoZWFkZXIucHJlZml4Lm1hZ2ljLCBrQ293TWFnaWNOdW1iZXIpOworICAgIEFTU0VSVF9FUShoZWFkZXIucHJlZml4Lm1ham9yX3ZlcnNpb24sIDMpOworICAgIEFTU0VSVF9FUShoZWFkZXIucHJlZml4Lm1pbm9yX3ZlcnNpb24sIGtDb3dWZXJzaW9uTWlub3IpOworICAgIEFTU0VSVF9FUShoZWFkZXIuYmxvY2tfc2l6ZSwgb3B0aW9ucy5ibG9ja19zaXplKTsKKworICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKKyAgICBBU1NFUlRfTkUoaXRlciwgbnVsbHB0cik7CisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworCisgICAgc2l6ZV90IGkgPSAwOworICAgIHdoaWxlICghaXRlci0+QXRFbmQoKSkgeworICAgICAgICBhdXRvIG9wID0gaXRlci0+R2V0KCk7CisgICAgICAgIEFTU0VSVF9FUShvcC0+dHlwZSgpLCBrQ293Q29weU9wKTsKKyAgICAgICAgQVNTRVJUX0VRKG9wLT5kYXRhX2xlbmd0aCwgMCk7CisgICAgICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCAxMCArIGkpOworICAgICAgICBBU1NFUlRfRVEob3AtPnNvdXJjZSgpLCAxMDAwICsgaSk7CisgICAgICAgIGl0ZXItPk5leHQoKTsKKyAgICAgICAgaSArPSAxOworICAgIH0KKworICAgIEFTU0VSVF9FUShpLCAxMDApOworfQorCitURVNUX0YoQ293VGVzdFYzLCBYb3JPcCkgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBvcHRpb25zLm9wX2NvdW50X21heCA9IDEwMDsKKyAgICBhdXRvIHdyaXRlciA9IENyZWF0ZUNvd1dyaXRlcigzLCBvcHRpb25zLCBHZXRDb3dGZCgpKTsKKworICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSAiVGhpcyBpcyB0ZXN0IGRhdGEtMS4gVGVzdGluZyB4b3IiOworICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRYb3JCbG9ja3MoNTAsIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSwgMjQsIDEwKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKKworICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKKworICAgIENvd1JlYWRlciByZWFkZXI7CisKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKKworICAgIGNvbnN0IGF1dG8mIGhlYWRlciA9IHJlYWRlci5oZWFkZXJfdjMoKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLm9wX2NvdW50LCAxKTsKKworICAgIGF1dG8gaXRlciA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKKyAgICBBU1NFUlRfTkUoaXRlciwgbnVsbHB0cik7CisgICAgQVNTRVJUX0ZBTFNFKGl0ZXItPkF0RW5kKCkpOworICAgIGF1dG8gb3AgPSBpdGVyLT5HZXQoKTsKKyAgICBzdGQ6OnN0cmluZyBzaW5rKGRhdGEuc2l6ZSgpLCAnXDAnKTsKKworICAgIEFTU0VSVF9FUShvcC0+dHlwZSgpLCBrQ293WG9yT3ApOworICAgIEFTU0VSVF9FUShvcC0+ZGF0YV9sZW5ndGgsIDQwOTYpOworICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCA1MCk7CisgICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UoKSwgOTgzMTQpOyAgLy8gNDA5NiAqIDI0ICsgMTAKKyAgICBBU1NFUlRfVFJVRShSZWFkRGF0YShyZWFkZXIsIG9wLCBzaW5rLmRhdGEoKSwgc2luay5zaXplKCkpKTsKKyAgICBBU1NFUlRfRVEoc2luaywgZGF0YSk7Cit9CisKK1RFU1RfRihDb3dUZXN0VjMsIENvbnNlY3V0aXZlWG9yT3ApIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5vcF9jb3VudF9tYXggPSAxMDA7CisgICAgYXV0byB3cml0ZXIgPSBDcmVhdGVDb3dXcml0ZXIoMywgb3B0aW9ucywgR2V0Q293RmQoKSk7CisKKyAgICBzdGQ6OnN0cmluZyBkYXRhOworICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSAqIDUpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5zaXplKCk7IGkrKykgeworICAgICAgICBkYXRhW2ldID0gY2hhcihyYW5kKCkgJSAyNTYpOworICAgIH0KKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWG9yQmxvY2tzKDUwLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCksIDI0LCAxMCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7CisKKyAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7CisKKyAgICBDb3dSZWFkZXIgcmVhZGVyOworCisgICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7CisKKyAgICBjb25zdCBhdXRvJiBoZWFkZXIgPSByZWFkZXIuaGVhZGVyX3YzKCk7CisgICAgQVNTRVJUX0VRKGhlYWRlci5vcF9jb3VudCwgNSk7CisKKyAgICBhdXRvIGl0ZXIgPSByZWFkZXIuR2V0T3BJdGVyKCk7CisgICAgQVNTRVJUX05FKGl0ZXIsIG51bGxwdHIpOworICAgIEFTU0VSVF9GQUxTRShpdGVyLT5BdEVuZCgpKTsKKworICAgIHN0ZDo6c3RyaW5nIHNpbmsoZGF0YS5zaXplKCksICdcMCcpOworICAgIHNpemVfdCBpID0gMDsKKworICAgIHdoaWxlICghaXRlci0+QXRFbmQoKSkgeworICAgICAgICBhdXRvIG9wID0gaXRlci0+R2V0KCk7CisgICAgICAgIEFTU0VSVF9FUShvcC0+dHlwZSgpLCBrQ293WG9yT3ApOworICAgICAgICBBU1NFUlRfRVEob3AtPmRhdGFfbGVuZ3RoLCA0MDk2KTsKKyAgICAgICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssIDUwICsgaSk7CisgICAgICAgIEFTU0VSVF9FUShvcC0+c291cmNlKCksIDk4MzE0ICsgKGkgKiBvcHRpb25zLmJsb2NrX3NpemUpKTsgIC8vIDQwOTYgKiAyNCArIDEwCisgICAgICAgIEFTU0VSVF9UUlVFKAorICAgICAgICAgICAgICAgIFJlYWREYXRhKHJlYWRlciwgb3AsIHNpbmsuZGF0YSgpICsgKGkgKiBvcHRpb25zLmJsb2NrX3NpemUpLCBvcHRpb25zLmJsb2NrX3NpemUpKTsKKyAgICAgICAgaXRlci0+TmV4dCgpOworICAgICAgICBpKys7CisgICAgfQorICAgIEFTU0VSVF9FUShzaW5rLCBkYXRhKTsKKworICAgIEFTU0VSVF9FUShpLCA1KTsKK30KKworVEVTVF9GKENvd1Rlc3RWMywgQWxsT3BzV2l0aENvbXByZXNzaW9uKSB7CisgICAgQ293T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMuY29tcHJlc3Npb24gPSAiZ3oiOworICAgIG9wdGlvbnMub3BfY291bnRfbWF4ID0gMTAwOworICAgIGF1dG8gd3JpdGVyID0gQ3JlYXRlQ293V3JpdGVyKDMsIG9wdGlvbnMsIEdldENvd0ZkKCkpOworCisgICAgc3RkOjpzdHJpbmcgZGF0YTsKKyAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUgKiA1KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGEuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZGF0YVtpXSA9IGNoYXIocmFuZCgpICUgNCk7CisgICAgfQorCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRaZXJvQmxvY2tzKDEwLCA1KSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRDb3B5KDE1LCAzLCA1KSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRSYXdCbG9ja3MoMTgsIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWG9yQmxvY2tzKDUwLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCksIDI0LCAxMCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7CisKKyAgICBDb3dSZWFkZXIgcmVhZGVyOworCisgICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7CisKKyAgICBjb25zdCBhdXRvJiBoZWFkZXIgPSByZWFkZXIuaGVhZGVyX3YzKCk7CisgICAgQVNTRVJUX0VRKGhlYWRlci5wcmVmaXgubWFnaWMsIGtDb3dNYWdpY051bWJlcik7CisgICAgQVNTRVJUX0VRKGhlYWRlci5wcmVmaXgubWFqb3JfdmVyc2lvbiwgMyk7CisgICAgQVNTRVJUX0VRKGhlYWRlci5wcmVmaXgubWlub3JfdmVyc2lvbiwga0Nvd1ZlcnNpb25NaW5vcik7CisgICAgQVNTRVJUX0VRKGhlYWRlci5ibG9ja19zaXplLCBvcHRpb25zLmJsb2NrX3NpemUpOworICAgIEFTU0VSVF9FUShoZWFkZXIuYnVmZmVyX3NpemUsIEJVRkZFUl9SRUdJT05fREVGQVVMVF9TSVpFKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLm9wX2NvdW50LCAyMCk7CisgICAgQVNTRVJUX0VRKGhlYWRlci5vcF9jb3VudF9tYXgsIDEwMCk7CisKKyAgICBhdXRvIGl0ZXIgPSByZWFkZXIuR2V0T3BJdGVyKCk7CisgICAgQVNTRVJUX05FKGl0ZXIsIG51bGxwdHIpOworICAgIEFTU0VSVF9GQUxTRShpdGVyLT5BdEVuZCgpKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICAgIGF1dG8gb3AgPSBpdGVyLT5HZXQoKTsKKyAgICAgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3daZXJvT3ApOworICAgICAgICBBU1NFUlRfRVEob3AtPm5ld19ibG9jaywgMTAgKyBpKTsKKyAgICAgICAgaXRlci0+TmV4dCgpOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgICBhdXRvIG9wID0gaXRlci0+R2V0KCk7CisgICAgICAgIEFTU0VSVF9FUShvcC0+dHlwZSgpLCBrQ293Q29weU9wKTsKKyAgICAgICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssIDE1ICsgaSk7CisgICAgICAgIEFTU0VSVF9FUShvcC0+c291cmNlKCksIDMgKyBpKTsKKyAgICAgICAgaXRlci0+TmV4dCgpOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBzaW5rKGRhdGEuc2l6ZSgpLCAnXDAnKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICAgIGF1dG8gb3AgPSBpdGVyLT5HZXQoKTsKKyAgICAgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3dSZXBsYWNlT3ApOworICAgICAgICBBU1NFUlRfRVEob3AtPm5ld19ibG9jaywgMTggKyBpKTsKKyAgICAgICAgQVNTRVJUX0VRKHJlYWRlci5SZWFkRGF0YShvcCwgc2luay5kYXRhKCkgKyAoaSAqIG9wdGlvbnMuYmxvY2tfc2l6ZSksIG9wdGlvbnMuYmxvY2tfc2l6ZSksCisgICAgICAgICAgICAgICAgICBvcHRpb25zLmJsb2NrX3NpemUpOworICAgICAgICBpdGVyLT5OZXh0KCk7CisgICAgfQorICAgIEFTU0VSVF9FUShzaW5rLCBkYXRhKTsKKworICAgIHN0ZDo6ZmlsbChzaW5rLmJlZ2luKCksIHNpbmsuZW5kKCksICdcMCcpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICAgIGF1dG8gb3AgPSBpdGVyLT5HZXQoKTsKKyAgICAgICAgQVNTRVJUX0VRKG9wLT50eXBlKCksIGtDb3dYb3JPcCk7CisgICAgICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCA1MCArIGkpOworICAgICAgICBBU1NFUlRfRVEob3AtPnNvdXJjZSgpLCA5ODMxNCArIChpICogb3B0aW9ucy5ibG9ja19zaXplKSk7ICAvLyA0MDk2ICogMjQgKyAxMAorICAgICAgICBBU1NFUlRfVFJVRSgKKyAgICAgICAgICAgICAgICBSZWFkRGF0YShyZWFkZXIsIG9wLCBzaW5rLmRhdGEoKSArIChpICogb3B0aW9ucy5ibG9ja19zaXplKSwgb3B0aW9ucy5ibG9ja19zaXplKSk7CisgICAgICAgIGl0ZXItPk5leHQoKTsKKyAgICB9CisgICAgQVNTRVJUX0VRKHNpbmssIGRhdGEpOworfQorCitURVNUX0YoQ293VGVzdFYzLCBHekNvbXByZXNzaW9uKSB7CisgICAgQ293T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMub3BfY291bnRfbWF4ID0gMTAwOworICAgIG9wdGlvbnMuY29tcHJlc3Npb24gPSAiZ3oiOworICAgIGF1dG8gd3JpdGVyID0gQ3JlYXRlQ293V3JpdGVyKDMsIG9wdGlvbnMsIEdldENvd0ZkKCkpOworCisgICAgc3RkOjpzdHJpbmcgZGF0YSA9ICJUaGlzIGlzIHNvbWUgZGF0YSwgYmVsaWV2ZSBpdCI7CisgICAgZGF0YS5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplLCAnXDAnKTsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkUmF3QmxvY2tzKDUwLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOworCisgICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOworCisgICAgQ293UmVhZGVyIHJlYWRlcjsKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKKworICAgIGF1dG8gaGVhZGVyID0gcmVhZGVyLmhlYWRlcl92MygpOworICAgIEFTU0VSVF9FUShoZWFkZXIuY29tcHJlc3Npb25fYWxnb3JpdGhtLCBrQ293Q29tcHJlc3NHeik7CisKKyAgICBhdXRvIGl0ZXIgPSByZWFkZXIuR2V0T3BJdGVyKCk7CisgICAgQVNTRVJUX05FKGl0ZXIsIG51bGxwdHIpOworICAgIEFTU0VSVF9GQUxTRShpdGVyLT5BdEVuZCgpKTsKKyAgICBhdXRvIG9wID0gaXRlci0+R2V0KCk7CisKKyAgICBzdGQ6OnN0cmluZyBzaW5rKGRhdGEuc2l6ZSgpLCAnXDAnKTsKKworICAgIEFTU0VSVF9FUShvcC0+dHlwZSgpLCBrQ293UmVwbGFjZU9wKTsKKyAgICBBU1NFUlRfRVEob3AtPmRhdGFfbGVuZ3RoLCA1Nik7ICAvLyBjb21wcmVzc2VkIQorICAgIEFTU0VSVF9FUShvcC0+bmV3X2Jsb2NrLCA1MCk7CisgICAgQVNTRVJUX1RSVUUoUmVhZERhdGEocmVhZGVyLCBvcCwgc2luay5kYXRhKCksIHNpbmsuc2l6ZSgpKSk7CisgICAgQVNTRVJUX0VRKHNpbmssIGRhdGEpOworCisgICAgaXRlci0+TmV4dCgpOworICAgIEFTU0VSVF9UUlVFKGl0ZXItPkF0RW5kKCkpOworfQorCitURVNUX0YoQ293VGVzdFYzLCBSZXN1bWVQb2ludFRlc3QpIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5vcF9jb3VudF9tYXggPSAxMDA7CisgICAgYXV0byB3cml0ZXIgPSBDcmVhdGVDb3dXcml0ZXIoMywgb3B0aW9ucywgR2V0Q293RmQoKSk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFplcm9CbG9ja3MoMCwgMTUpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZExhYmVsKDApKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFplcm9CbG9ja3MoMTUsIDE1KSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKKworICAgIENvd1JlYWRlciByZWFkZXI7CisgICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7CisKKyAgICBhdXRvIGhlYWRlciA9IHJlYWRlci5oZWFkZXJfdjMoKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLm9wX2NvdW50LCAzMCk7CisKKyAgICBDb3dXcml0ZXJWMyBzZWNvbmRfd3JpdGVyKG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgIEFTU0VSVF9UUlVFKHNlY29uZF93cml0ZXIuSW5pdGlhbGl6ZSgwKSk7CisgICAgQVNTRVJUX1RSVUUoc2Vjb25kX3dyaXRlci5GaW5hbGl6ZSgpKTsKKworICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOworICAgIGhlYWRlciA9IHJlYWRlci5oZWFkZXJfdjMoKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLm9wX2NvdW50LCAxNSk7Cit9CisKK1RFU1RfRihDb3dUZXN0VjMsIEJ1ZmZlck1ldGFkYXRhU3luY1Rlc3QpIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5vcF9jb3VudF9tYXggPSAxMDA7CisgICAgYXV0byB3cml0ZXIgPSBDcmVhdGVDb3dXcml0ZXIoMywgb3B0aW9ucywgR2V0Q293RmQoKSk7CisgICAgLyoKKyAgICBIZWFkZXIgbWV0YWRhZmllbGRzCisgICAgc2VxdWVuY2VfZGF0YV9jb3VudCA9IDA7CisgICAgcmVzdW1lX3BvaW50X2NvdW50ID0gMDsKKyAgICByZXN1bWVfcG9pbnRfbWF4ID0gNDsKKyAgICAqLworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7CisKKyAgICBDb3dSZWFkZXIgcmVhZGVyOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOworCisgICAgYXV0byBoZWFkZXIgPSByZWFkZXIuaGVhZGVyX3YzKCk7CisgICAgQVNTRVJUX0VRKGhlYWRlci5zZXF1ZW5jZV9kYXRhX2NvdW50LCBzdGF0aWNfY2FzdDx1aW50NjRfdD4oMCkpOworICAgIEFTU0VSVF9FUShoZWFkZXIucmVzdW1lX3BvaW50X2NvdW50LCAwKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLnJlc3VtZV9wb2ludF9tYXgsIDQpOworCisgICAgd3JpdGVyLT5BZGRMYWJlbCgwKTsKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKKyAgICBoZWFkZXIgPSByZWFkZXIuaGVhZGVyX3YzKCk7CisgICAgQVNTRVJUX0VRKGhlYWRlci5zZXF1ZW5jZV9kYXRhX2NvdW50LCBzdGF0aWNfY2FzdDx1aW50NjRfdD4oMCkpOworICAgIEFTU0VSVF9FUShoZWFkZXIucmVzdW1lX3BvaW50X2NvdW50LCAxKTsKKyAgICBBU1NFUlRfRVEoaGVhZGVyLnJlc3VtZV9wb2ludF9tYXgsIDQpOworCisgICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7CisgICAgaGVhZGVyID0gcmVhZGVyLmhlYWRlcl92MygpOworCisgICAgLyoKKyAgICBIZWFkZXIgbWV0YWRhZmllbGRzCisgICAgc2VxdWVuY2VfZGF0YV9jb3VudCA9IDE7CisgICAgcmVzdW1lX3BvaW50X2NvdW50ID0gMDsKKyAgICByZXN1bWVfcG9pbnRfbWF4ID0gNDsKKyAgICAqLworfQorCitURVNUX0YoQ293VGVzdFYzLCBTZXF1ZW5jZVRlc3QpIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgY29uc3RleHByIGludCBzZXFfbGVuID0gc3RkOjpudW1lcmljX2xpbWl0czx1aW50MTZfdD46Om1heCgpIC8gc2l6ZW9mKHVpbnQzMl90KSArIDE7CisgICAgb3B0aW9ucy5vcF9jb3VudF9tYXggPSBzZXFfbGVuOworICAgIGF1dG8gd3JpdGVyID0gQ3JlYXRlQ293V3JpdGVyKDMsIG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgIC8vIHNlcXVlbmNlIGRhdGEuIFRoaXMganVzdCBhbiBhcmJpdHJhcnkgc2V0IG9mIGludGVnZXJzIHRoYXQgc3BlY2lmeSB0aGUgbWVyZ2Ugb3JkZXIuIFRoZQorICAgIC8vIGFjdHVhbCBjYWxjdWxhdGlvbiBpcyBkb25lIGJ5IHVwZGF0ZV9lbmdpbmUgYW5kIHBhc3NlZCB0byB3cml0ZXIuIEFsbCB3ZSBjYXJlIGFib3V0IGhlcmUgaXMKKyAgICAvLyB3cml0aW5nIHRoYXQgZGF0YSBjb3JyZWN0bHkKKyAgICB1aW50MzJfdCBzZXF1ZW5jZVtzZXFfbGVuXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcV9sZW47IGkrKykgeworICAgICAgICBzZXF1ZW5jZVtpXSA9IGkgKyAxOworICAgIH0KKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkU2VxdWVuY2VEYXRhKHNlcV9sZW4sIHNlcXVlbmNlKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRaZXJvQmxvY2tzKDEsIHNlcV9sZW4gLSAxKSk7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YSh3cml0ZXItPkdldEJsb2NrU2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRhdGEuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZGF0YVtpXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGkgJiAweEZGKTsKKyAgICB9CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRSYXdCbG9ja3Moc2VxX2xlbiwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKKworICAgIEFTU0VSVF9FUShsc2Vlayhjb3dfLT5mZCwgMCwgU0VFS19TRVQpLCAwKTsKKworICAgIENvd1JlYWRlciByZWFkZXI7CisgICAgQVNTRVJUX1RSVUUocmVhZGVyLlBhcnNlKGNvd18tPmZkKSk7CisgICAgYXV0byBpdGVyID0gcmVhZGVyLkdldFJldk1lcmdlT3BJdGVyKCk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcV9sZW47IGkrKykgeworICAgICAgICBBU1NFUlRfVFJVRSghaXRlci0+QXRFbmQoKSk7CisgICAgICAgIGNvbnN0IGF1dG8mIG9wID0gaXRlci0+R2V0KCk7CisKKyAgICAgICAgQVNTRVJUX0VRKG9wLT5uZXdfYmxvY2ssIHNlcV9sZW4gLSBpKTsKKyAgICAgICAgaWYgKG9wLT5uZXdfYmxvY2sgPT0gc2VxX2xlbikgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVhZF9iYWNrKHdyaXRlci0+R2V0QmxvY2tTaXplKCkpOworICAgICAgICAgICAgQVNTRVJUX0VRKHJlYWRlci5SZWFkRGF0YShvcCwgcmVhZF9iYWNrLmRhdGEoKSwgcmVhZF9iYWNrLnNpemUoKSksCisgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3NpemVfdD4ocmVhZF9iYWNrLnNpemUoKSkpOworICAgICAgICAgICAgQVNTRVJUX0VRKHJlYWRfYmFjaywgZGF0YSk7CisgICAgICAgIH0KKworICAgICAgICBpdGVyLT5OZXh0KCk7CisgICAgfQorICAgIEFTU0VSVF9UUlVFKGl0ZXItPkF0RW5kKCkpOworfQorCitURVNUX0YoQ293VGVzdFYzLCBNaXNzaW5nU2VxT3ApIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5vcF9jb3VudF9tYXggPSBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCk7CisgICAgYXV0byB3cml0ZXIgPSBDcmVhdGVDb3dXcml0ZXIoMywgb3B0aW9ucywgR2V0Q293RmQoKSk7CisgICAgY29uc3QgaW50IHNlcV9sZW4gPSAxMDsKKyAgICB1aW50MzJfdCBzZXF1ZW5jZVtzZXFfbGVuXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcV9sZW47IGkrKykgeworICAgICAgICBzZXF1ZW5jZVtpXSA9IGkgKyAxOworICAgIH0KKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFNlcXVlbmNlRGF0YShzZXFfbGVuLCBzZXF1ZW5jZSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWmVyb0Jsb2NrcygxLCBzZXFfbGVuIC0gMSkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7CisKKyAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7CisKKyAgICBDb3dSZWFkZXIgcmVhZGVyOworICAgIEFTU0VSVF9GQUxTRShyZWFkZXIuUGFyc2UoY293Xy0+ZmQpKTsKK30KKworVEVTVF9GKENvd1Rlc3RWMywgUmVzdW1lU2VxT3ApIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5vcF9jb3VudF9tYXggPSBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCk7CisgICAgYXV0byB3cml0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1dyaXRlclYzPihvcHRpb25zLCBHZXRDb3dGZCgpKTsKKyAgICBjb25zdCBpbnQgc2VxX2xlbiA9IDEwOworICAgIHVpbnQzMl90IHNlcXVlbmNlW3NlcV9sZW5dOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VxX2xlbjsgaSsrKSB7CisgICAgICAgIHNlcXVlbmNlW2ldID0gaSArIDE7CisgICAgfQorICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+SW5pdGlhbGl6ZSgpKTsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkU2VxdWVuY2VEYXRhKHNlcV9sZW4sIHNlcXVlbmNlKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRaZXJvQmxvY2tzKDEsIHNlcV9sZW4gLyAyKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRMYWJlbCgxKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRaZXJvQmxvY2tzKDEgKyBzZXFfbGVuIC8gMiwgMSkpOworCisgICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOworICAgIGF1dG8gcmVhZGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dSZWFkZXI+KCk7CisgICAgQVNTRVJUX1RSVUUocmVhZGVyLT5QYXJzZShjb3dfLT5mZCwgMSkpOworICAgIGF1dG8gaXRyID0gcmVhZGVyLT5HZXRSZXZNZXJnZU9wSXRlcigpOworICAgIEFTU0VSVF9UUlVFKGl0ci0+QXRFbmQoKSk7CisKKyAgICB3cml0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1dyaXRlclYzPihvcHRpb25zLCBHZXRDb3dGZCgpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkluaXRpYWxpemUoezF9KSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRaZXJvQmxvY2tzKDEgKyBzZXFfbGVuIC8gMiwgc2VxX2xlbiAvIDIpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOworCisgICAgQVNTRVJUX0VRKGxzZWVrKGNvd18tPmZkLCAwLCBTRUVLX1NFVCksIDApOworCisgICAgcmVhZGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dSZWFkZXI+KCk7CisgICAgQVNTRVJUX1RSVUUocmVhZGVyLT5QYXJzZShjb3dfLT5mZCkpOworCisgICAgYXV0byBpdGVyID0gcmVhZGVyLT5HZXRSZXZNZXJnZU9wSXRlcigpOworCisgICAgdWludDY0X3QgZXhwZWN0ZWRfYmxvY2sgPSAxMDsKKyAgICB3aGlsZSAoIWl0ZXItPkF0RW5kKCkgJiYgZXhwZWN0ZWRfYmxvY2sgPiAwKSB7CisgICAgICAgIEFTU0VSVF9GQUxTRShpdGVyLT5BdEVuZCgpKTsKKyAgICAgICAgY29uc3QgYXV0byYgb3AgPSBpdGVyLT5HZXQoKTsKKworICAgICAgICBBU1NFUlRfRVEob3AtPm5ld19ibG9jaywgZXhwZWN0ZWRfYmxvY2spOworCisgICAgICAgIGl0ZXItPk5leHQoKTsKKyAgICAgICAgZXhwZWN0ZWRfYmxvY2stLTsKKyAgICB9CisgICAgQVNTRVJUX0VRKGV4cGVjdGVkX2Jsb2NrLCAwKTsKKyAgICBBU1NFUlRfVFJVRShpdGVyLT5BdEVuZCgpKTsKK30KKworVEVTVF9GKENvd1Rlc3RWMywgU2V0U291cmNlTWFueVRpbWVzKSB7CisgICAgQ293T3BlcmF0aW9uVjMgb3B7fTsKKyAgICBvcC5zZXRfc291cmNlKDEpOworICAgIEFTU0VSVF9FUShvcC5zb3VyY2UoKSwgMSk7CisgICAgb3Auc2V0X3NvdXJjZSgyKTsKKyAgICBBU1NFUlRfRVEob3Auc291cmNlKCksIDIpOworICAgIG9wLnNldF9zb3VyY2UoNCk7CisgICAgQVNTRVJUX0VRKG9wLnNvdXJjZSgpLCA0KTsKKyAgICBvcC5zZXRfc291cmNlKDgpOworICAgIEFTU0VSVF9FUShvcC5zb3VyY2UoKSwgOCk7Cit9CisKK1RFU1RfRihDb3dUZXN0VjMsIFNldFR5cGVNYW55VGltZXMpIHsKKyAgICBDb3dPcGVyYXRpb25WMyBvcHt9OworICAgIG9wLnNldF90eXBlKGtDb3dDb3B5T3ApOworICAgIEFTU0VSVF9FUShvcC50eXBlKCksIGtDb3dDb3B5T3ApOworICAgIG9wLnNldF90eXBlKGtDb3dSZXBsYWNlT3ApOworICAgIEFTU0VSVF9FUShvcC50eXBlKCksIGtDb3dSZXBsYWNlT3ApOworICAgIG9wLnNldF90eXBlKGtDb3daZXJvT3ApOworICAgIEFTU0VSVF9FUShvcC50eXBlKCksIGtDb3daZXJvT3ApOworICAgIG9wLnNldF90eXBlKGtDb3dYb3JPcCk7CisgICAgQVNTRVJUX0VRKG9wLnR5cGUoKSwga0Nvd1hvck9wKTsKK30KKworVEVTVF9GKENvd1Rlc3RWMywgU2V0VHlwZVNvdXJjZUludmVybGVhdmUpIHsKKyAgICBDb3dPcGVyYXRpb25WMyBvcHt9OworICAgIG9wLnNldF90eXBlKGtDb3dDb3B5T3ApOworICAgIEFTU0VSVF9FUShvcC50eXBlKCksIGtDb3dDb3B5T3ApOworICAgIG9wLnNldF9zb3VyY2UoMHgwMTAyMDMwNDA1MDYpOworICAgIEFTU0VSVF9FUShvcC5zb3VyY2UoKSwgMHgwMTAyMDMwNDA1MDYpOworICAgIEFTU0VSVF9FUShvcC50eXBlKCksIGtDb3dDb3B5T3ApOworICAgIG9wLnNldF90eXBlKGtDb3dSZXBsYWNlT3ApOworICAgIEFTU0VSVF9FUShvcC5zb3VyY2UoKSwgMHgwMTAyMDMwNDA1MDYpOworICAgIEFTU0VSVF9FUShvcC50eXBlKCksIGtDb3dSZXBsYWNlT3ApOworfQorCitURVNUX0YoQ293VGVzdFYzLCBDb3dTaXplRXN0aW1hdGUpIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnN7fTsKKyAgICBvcHRpb25zLmNvbXByZXNzaW9uID0gIm5vbmUiOworICAgIGF1dG8gZXN0aW1hdG9yID0gYW5kcm9pZDo6c25hcHNob3Q6OkNyZWF0ZUNvd0VzdGltYXRvcigzLCBvcHRpb25zKTsKKyAgICBBU1NFUlRfVFJVRShlc3RpbWF0b3ItPkFkZFplcm9CbG9ja3MoMCwgMTAyNCAqIDEwMjQpKTsKKyAgICBjb25zdCBhdXRvIGNvd19zaXplID0gZXN0aW1hdG9yLT5HZXRDb3dTaXplSW5mbygpLmNvd19zaXplOworICAgIG9wdGlvbnMub3BfY291bnRfbWF4ID0gMTAyNCAqIDEwMjQ7CisgICAgb3B0aW9ucy5tYXhfYmxvY2tzID0gMTAyNCAqIDEwMjQ7CisgICAgQ293V3JpdGVyVjMgd3JpdGVyKG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5Jbml0aWFsaXplKCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRaZXJvQmxvY2tzKDAsIDEwMjQgKiAxMDI0KSk7CisKKyAgICBBU1NFUlRfTEUod3JpdGVyLkdldENvd1NpemVJbmZvKCkuY293X3NpemUsIGNvd19zaXplKTsKK30KKworVEVTVF9GKENvd1Rlc3RWMywgQ29weU9wTWFueSkgeworICAgIENvd09wdGlvbnMgb3B0aW9uczsKKyAgICBvcHRpb25zLm9wX2NvdW50X21heCA9IDEwMDsKKyAgICBDb3dXcml0ZXJWMyB3cml0ZXIob3B0aW9ucywgR2V0Q293RmQoKSk7CisgICAgd3JpdGVyLkluaXRpYWxpemUoKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weSgxMDAsIDUwLCA1MCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRDb3B5KDE1MCwgMTAwLCA1MCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5GaW5hbGl6ZSgpKTsKKyAgICBDb3dSZWFkZXIgcmVhZGVyOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShHZXRDb3dGZCgpKSk7CisgICAgYXV0byBpdCA9IHJlYWRlci5HZXRPcEl0ZXIoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisgICAgICAgIEFTU0VSVF9GQUxTRShpdC0+QXRFbmQoKSkgPDwgIiBvcCBpdGVyYXRvciBlbmRlZCBhdCAiIDw8IGk7CisgICAgICAgIGNvbnN0IGF1dG8gb3AgPSAqaXQtPkdldCgpOworICAgICAgICBBU1NFUlRfRVEob3AudHlwZSgpLCBrQ293Q29weU9wKTsKKyAgICAgICAgQVNTRVJUX0VRKG9wLm5ld19ibG9jaywgMTAwICsgaSk7CisgICAgICAgIGl0LT5OZXh0KCk7CisgICAgfQorfQorCitURVNUX0YoQ293VGVzdFYzLCBDaGVja09wQ291bnQpIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5vcF9jb3VudF9tYXggPSAyMDsKKyAgICBvcHRpb25zLmJhdGNoX3dyaXRlID0gdHJ1ZTsKKyAgICBvcHRpb25zLmNsdXN0ZXJfb3BzID0gMjAwOworICAgIGF1dG8gd3JpdGVyID0gQ3JlYXRlQ293V3JpdGVyKDMsIG9wdGlvbnMsIEdldENvd0ZkKCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWmVyb0Jsb2NrcygwLCAxOSkpOworICAgIEFTU0VSVF9GQUxTRSh3cml0ZXItPkFkZFplcm9CbG9ja3MoMCwgMTkpKTsKK30KKworc3RydWN0IFRlc3RQYXJhbSB7CisgICAgc3RkOjpzdHJpbmcgY29tcHJlc3Npb247CisgICAgaW50IGJsb2NrX3NpemU7CisgICAgaW50IG51bV90aHJlYWRzOworICAgIHNpemVfdCBjbHVzdGVyX29wczsKK307CisKK2NsYXNzIFZhcmlhYmxlQmxvY2tUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxUZXN0UGFyYW0+IHsKKyAgcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgY293XyA9IHN0ZDo6bWFrZV91bmlxdWU8VGVtcG9yYXJ5RmlsZT4oKTsKKyAgICAgICAgQVNTRVJUX0dFKGNvd18tPmZkLCAwKSA8PCBzdHJlcnJvcihlcnJubyk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeyBjb3dfID0gbnVsbHB0cjsgfQorCisgICAgdW5pcXVlX2ZkIEdldENvd0ZkKCkgeyByZXR1cm4gdW5pcXVlX2Zke2R1cChjb3dfLT5mZCl9OyB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VGVtcG9yYXJ5RmlsZT4gY293XzsKK307CisKKy8vIEhlbHBlciB0byBjaGVjayByZWFkIHNpemVzLgorc3RhdGljIGlubGluZSB2b2lkIFJlYWRCbG9ja0RhdGEoQ293UmVhZGVyJiByZWFkZXIsIGNvbnN0IENvd09wZXJhdGlvbiogb3AsIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKSB7CisgICAgc2l6ZV90IGJsb2NrX3NpemUgPSBDb3dPcENvbXByZXNzaW9uU2l6ZShvcCwgNDA5Nik7CisgICAgc3RkOjpzdHJpbmcgZGF0YShibG9ja19zaXplLCAnXDAnKTsKKyAgICBzaXplX3QgdmFsdWUgPSByZWFkZXIuUmVhZERhdGEob3AsIGRhdGEuZGF0YSgpLCBibG9ja19zaXplKTsKKyAgICBBU1NFUlRfVFJVRSh2YWx1ZSA9PSBibG9ja19zaXplKTsKKyAgICBzdGQ6Om1lbWNweShidWZmZXIsIGRhdGEuZGF0YSgpLCBzaXplKTsKK30KKworVEVTVF9QKFZhcmlhYmxlQmxvY2tUZXN0LCBWYXJpYWJsZUJsb2NrQ29tcHJlc3Npb25UZXN0KSB7CisgICAgY29uc3QgVGVzdFBhcmFtIHBhcmFtcyA9IEdldFBhcmFtKCk7CisKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5vcF9jb3VudF9tYXggPSAxMDAwMDA7CisgICAgb3B0aW9ucy5jb21wcmVzc2lvbiA9IHBhcmFtcy5jb21wcmVzc2lvbjsKKyAgICBvcHRpb25zLm51bV9jb21wcmVzc190aHJlYWRzID0gcGFyYW1zLm51bV90aHJlYWRzOworICAgIG9wdGlvbnMuYmF0Y2hfd3JpdGUgPSB0cnVlOworICAgIG9wdGlvbnMuY29tcHJlc3Npb25fZmFjdG9yID0gcGFyYW1zLmJsb2NrX3NpemU7CisgICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IHBhcmFtcy5jbHVzdGVyX29wczsKKworICAgIENvd1dyaXRlclYzIHdyaXRlcihvcHRpb25zLCBHZXRDb3dGZCgpKTsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5Jbml0aWFsaXplKCkpOworCisgICAgc3RkOjpzdHJpbmcgeG9yX2RhdGEgPSAiVGhpcyBpcyB0ZXN0IGRhdGEtMS4gVGVzdGluZyB4b3IiOworICAgIHhvcl9kYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRYb3JCbG9ja3MoNTAsIHhvcl9kYXRhLmRhdGEoKSwgeG9yX2RhdGEuc2l6ZSgpLCAyNCwgMTApKTsKKworICAgIC8vIExhcmdlIG51bWJlciBvZiBibG9ja3MKKyAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlRoaXMgaXMgdGVzdCBkYXRhLTIuIFRlc3RpbmcgcmVwbGFjZSBvcHMiOworICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSAqIDIwNDgsICdcMCcpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRSYXdCbG9ja3MoMTAwLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpKTsKKworICAgIHN0ZDo6c3RyaW5nIGRhdGEyID0gIlRoaXMgaXMgdGVzdCBkYXRhLTMuIFRlc3RpbmcgcmVwbGFjZSBvcHMiOworICAgIGRhdGEyLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUgKiAyNTksICdcMCcpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRSYXdCbG9ja3MoNjAwMCwgZGF0YTIuZGF0YSgpLCBkYXRhMi5zaXplKCkpKTsKKworICAgIC8vIFRlc3QgZGF0YSBzaXplIGlzIHNtYWxsZXIgdGhhbiBibG9jayBzaXplCisKKyAgICAvLyA0ayBibG9jaworICAgIHN0ZDo6c3RyaW5nIGRhdGEzID0gIlRoaXMgaXMgdGVzdCBkYXRhLTQuIFRlc3RpbmcgcmVwbGFjZSBvcHMiOworICAgIGRhdGEzLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRSYXdCbG9ja3MoOTAwMCwgZGF0YTMuZGF0YSgpLCBkYXRhMy5zaXplKCkpKTsKKworICAgIC8vIDhrIGJsb2NrCisgICAgc3RkOjpzdHJpbmcgZGF0YTQ7CisgICAgZGF0YTQucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSAqIDIsICdcMCcpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGF0YTQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZGF0YTRbaV0gPSBzdGF0aWNfY2FzdDxjaGFyPignQScgKyBpIC8gb3B0aW9ucy5ibG9ja19zaXplKTsKKyAgICB9CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFJhd0Jsb2NrcygxMDAwMCwgZGF0YTQuZGF0YSgpLCBkYXRhNC5zaXplKCkpKTsKKworICAgIC8vIDE2ayBibG9jaworICAgIHN0ZDo6c3RyaW5nIGRhdGE1OworICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSAqIDQsICdcMCcpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YTUuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZGF0YTVbaV0gPSBzdGF0aWNfY2FzdDxjaGFyPignQycgKyBpIC8gb3B0aW9ucy5ibG9ja19zaXplKTsKKyAgICB9CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFJhd0Jsb2NrcygxMTAwMCwgZGF0YTUuZGF0YSgpLCBkYXRhNS5zaXplKCkpKTsKKworICAgIC8vIDY0ayBSYW5kb20gYnVmZmVyIHdoaWNoIGNhbm5vdCBiZSBjb21wcmVzc2VkCisgICAgdW5pcXVlX2ZkIHJuZF9mZChvcGVuKCIvZGV2L3JhbmRvbSIsIE9fUkRPTkxZKSk7CisgICAgQVNTRVJUX0dFKHJuZF9mZCwgMCk7CisgICAgc3RkOjpzdHJpbmcgcmFuZG9tX2J1ZmZlcjsKKyAgICByYW5kb21fYnVmZmVyLnJlc2l6ZSg2NTUzNiwgJ1wwJyk7CisgICAgQVNTRVJUX0VRKGFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseUF0T2Zmc2V0KHJuZF9mZCwgcmFuZG9tX2J1ZmZlci5kYXRhKCksIDY1NTM2LCAwKSwgdHJ1ZSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFJhd0Jsb2NrcygxMjAwMCwgcmFuZG9tX2J1ZmZlci5kYXRhKCksIDY1NTM2KSk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXIuRmluYWxpemUoKSk7CisKKyAgICBBU1NFUlRfRVEobHNlZWsoY293Xy0+ZmQsIDAsIFNFRUtfU0VUKSwgMCk7CisKKyAgICBDb3dSZWFkZXIgcmVhZGVyOworICAgIEFTU0VSVF9UUlVFKHJlYWRlci5QYXJzZShjb3dfLT5mZCkpOworCisgICAgYXV0byBpdGVyID0gcmVhZGVyLkdldE9wSXRlcigpOworICAgIEFTU0VSVF9ORShpdGVyLCBudWxscHRyKTsKKworICAgIHdoaWxlICghaXRlci0+QXRFbmQoKSkgeworICAgICAgICBhdXRvIG9wID0gaXRlci0+R2V0KCk7CisKKyAgICAgICAgaWYgKG9wLT50eXBlKCkgPT0ga0Nvd1hvck9wKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBzaW5rKHhvcl9kYXRhLnNpemUoKSwgJ1wwJyk7CisgICAgICAgICAgICBBU1NFUlRfRVEob3AtPm5ld19ibG9jaywgNTApOworICAgICAgICAgICAgQVNTRVJUX0VRKG9wLT5zb3VyY2UoKSwgOTgzMTQpOyAgLy8gNDA5NiAqIDI0ICsgMTAKKyAgICAgICAgICAgIFJlYWRCbG9ja0RhdGEocmVhZGVyLCBvcCwgc2luay5kYXRhKCksIHNpbmsuc2l6ZSgpKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShzaW5rLCB4b3JfZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9wLT50eXBlKCkgPT0ga0Nvd1JlcGxhY2VPcCkgeworICAgICAgICAgICAgaWYgKG9wLT5uZXdfYmxvY2sgPT0gMTAwKSB7CisgICAgICAgICAgICAgICAgZGF0YS5yZXNpemUob3B0aW9ucy5ibG9ja19zaXplKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzaW5rKGRhdGEuc2l6ZSgpLCAnXDAnKTsKKyAgICAgICAgICAgICAgICBSZWFkQmxvY2tEYXRhKHJlYWRlciwgb3AsIHNpbmsuZGF0YSgpLCBzaW5rLnNpemUoKSk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKHNpbmsuc2l6ZSgpLCBkYXRhLnNpemUoKSk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKHNpbmssIGRhdGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9wLT5uZXdfYmxvY2sgPT0gNjAwMCkgeworICAgICAgICAgICAgICAgIGRhdGEyLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUpOworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNpbmsoZGF0YTIuc2l6ZSgpLCAnXDAnKTsKKyAgICAgICAgICAgICAgICBSZWFkQmxvY2tEYXRhKHJlYWRlciwgb3AsIHNpbmsuZGF0YSgpLCBzaW5rLnNpemUoKSk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKHNpbmssIGRhdGEyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvcC0+bmV3X2Jsb2NrID09IDkwMDApIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzaW5rKGRhdGEzLnNpemUoKSwgJ1wwJyk7CisgICAgICAgICAgICAgICAgUmVhZEJsb2NrRGF0YShyZWFkZXIsIG9wLCBzaW5rLmRhdGEoKSwgc2luay5zaXplKCkpOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShzaW5rLCBkYXRhMyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3AtPm5ld19ibG9jayA9PSAxMDAwMCkgeworICAgICAgICAgICAgICAgIGRhdGE0LnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUpOworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNpbmsob3B0aW9ucy5ibG9ja19zaXplLCAnXDAnKTsKKyAgICAgICAgICAgICAgICBSZWFkQmxvY2tEYXRhKHJlYWRlciwgb3AsIHNpbmsuZGF0YSgpLCBzaW5rLnNpemUoKSk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKHNpbmssIGRhdGE0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvcC0+bmV3X2Jsb2NrID09IDExMDAwKSB7CisgICAgICAgICAgICAgICAgZGF0YTUucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSk7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc2luayhvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOworICAgICAgICAgICAgICAgIFJlYWRCbG9ja0RhdGEocmVhZGVyLCBvcCwgc2luay5kYXRhKCksIHNpbmsuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoc2luaywgZGF0YTUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9wLT5uZXdfYmxvY2sgPT0gMTIwMDApIHsKKyAgICAgICAgICAgICAgICByYW5kb21fYnVmZmVyLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUpOworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNpbmsob3B0aW9ucy5ibG9ja19zaXplLCAnXDAnKTsKKyAgICAgICAgICAgICAgICBSZWFkQmxvY2tEYXRhKHJlYWRlciwgb3AsIHNpbmsuZGF0YSgpLCBzaW5rLnNpemUoKSk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKHNpbmssIHJhbmRvbV9idWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaXRlci0+TmV4dCgpOworICAgIH0KK30KKworc3RkOjp2ZWN0b3I8VGVzdFBhcmFtPiBHZXRUZXN0Q29uZmlncygpIHsKKyAgICBzdGQ6OnZlY3RvcjxUZXN0UGFyYW0+IHRlc3RQYXJhbXM7CisKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IGJsb2NrX3NpemVzID0gezRfS2lCLCA4X0tpQiwgMTZfS2lCLCAzMl9LaUIsIDY0X0tpQiwgMTI4X0tpQiwgMjU2X0tpQn07CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbXByZXNzaW9uX2FsZ28gPSB7Im5vbmUiLCAibHo0IiwgInpzdGQiLCAiZ3oifTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IHRocmVhZHMgPSB7MSwgMn07CisgICAgLy8gVGhpcyB3aWxsIGFsc28gdGVzdCBiYXRjaCBzaXplCisgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiBjbHVzdGVyX29wcyA9IHsxLCAyNTZ9OworCisgICAgLy8gVGhpcyBzaG91bGQgdGVzdCAxMTIgY29tYmluYXRpb24KKyAgICBmb3IgKGF1dG8gYmxvY2sgOiBibG9ja19zaXplcykgeworICAgICAgICBmb3IgKGF1dG8gY29tcHJlc3Npb24gOiBjb21wcmVzc2lvbl9hbGdvKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8gdGhyZWFkIDogdGhyZWFkcykgeworICAgICAgICAgICAgICAgIGZvciAoYXV0byBjbHVzdGVyIDogY2x1c3Rlcl9vcHMpIHsKKyAgICAgICAgICAgICAgICAgICAgVGVzdFBhcmFtIHBhcmFtOworICAgICAgICAgICAgICAgICAgICBwYXJhbS5ibG9ja19zaXplID0gYmxvY2s7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtLmNvbXByZXNzaW9uID0gY29tcHJlc3Npb247CisgICAgICAgICAgICAgICAgICAgIHBhcmFtLm51bV90aHJlYWRzID0gdGhyZWFkOworICAgICAgICAgICAgICAgICAgICBwYXJhbS5jbHVzdGVyX29wcyA9IGNsdXN0ZXI7CisgICAgICAgICAgICAgICAgICAgIHRlc3RQYXJhbXMucHVzaF9iYWNrKHN0ZDo6bW92ZShwYXJhbSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0ZXN0UGFyYW1zOworfQorCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoQ29tcHJlc3NvcnNXaXRoVmFyaWFibGVCbG9ja3MsIFZhcmlhYmxlQmxvY2tUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzSW4oR2V0VGVzdENvbmZpZ3MoKSkpOworCit9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L3dyaXRlcl9iYXNlLmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvd3JpdGVyX2Jhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZmMzN2IKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L3dyaXRlcl9iYXNlLmNwcApAQCAtMCwwICsxLDIwNiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJ3cml0ZXJfYmFzZS5oIgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgInNuYXBzaG90X3JlYWRlci5oIgorCisvLyBUaGUgaW5mbyBtZXNzYWdlcyBoZXJlIGFyZSBzcGFtbXksIGJ1dCBhcyB1c2VmdWwgZm9yIHVwZGF0ZV9lbmdpbmUuIERpc2FibGUKKy8vIHRoZW0gd2hlbiBydW5uaW5nIG9uIHRoZSBob3N0LgorI2lmZGVmIF9fQU5EUk9JRF9fCisjZGVmaW5lIExPR19JTkZPIExPRyhJTkZPKQorI2Vsc2UKKyNkZWZpbmUgTE9HX0lORk8gTE9HKFZFUkJPU0UpCisjZW5kaWYKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHNuYXBzaG90IHsKKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQ7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQ7CisKK25hbWVzcGFjZSB7CitzdGQ6OnN0cmluZyBHZXRGZFBhdGgoYm9ycm93ZWRfZmQgZmQpIHsKKyAgICBjb25zdCBhdXRvIGZkX3BhdGggPSAiL3Byb2Mvc2VsZi9mZC8iICsgc3RkOjp0b19zdHJpbmcoZmQuZ2V0KCkpOworICAgIHN0ZDo6c3RyaW5nIGZpbGVfcGF0aCg1MTIsICdcMCcpOworICAgIGNvbnN0IGF1dG8gZXJyID0gcmVhZGxpbmsoZmRfcGF0aC5jX3N0cigpLCBmaWxlX3BhdGguZGF0YSgpLCBmaWxlX3BhdGguc2l6ZSgpKTsKKyAgICBpZiAoZXJyIDw9IDApIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBkZXRlcm1pbmUgcGF0aCBmb3IgZmQgIiA8PCBmZC5nZXQoKTsKKyAgICAgICAgZmlsZV9wYXRoLmNsZWFyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmlsZV9wYXRoLnJlc2l6ZShlcnIpOworICAgIH0KKyAgICByZXR1cm4gZmlsZV9wYXRoOworfQorfSAgLy8gbmFtZXNwYWNlCisKK0Nvd1dyaXRlckJhc2U6OkNvd1dyaXRlckJhc2UoY29uc3QgQ293T3B0aW9ucyYgb3B0aW9ucywgdW5pcXVlX2ZkJiYgZmQpCisgICAgOiBvcHRpb25zXyhvcHRpb25zKSwgZmRfKHN0ZDo6bW92ZShmZCkpIHt9CisKK2Jvb2wgQ293V3JpdGVyQmFzZTo6SW5pdEZkKCkgeworICAgIGlmIChmZF8uZ2V0KCkgPCAwKSB7CisgICAgICAgIGZkXy5yZXNldChvcGVuKCIvZGV2L251bGwiLCBPX1JEV1IgfCBPX0NMT0VYRUMpKTsKKyAgICAgICAgaWYgKGZkXyA8IDApIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJvcGVuIC9kZXYvbnVsbCBmYWlsZWQiOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlzX2Rldl9udWxsXyA9IHRydWU7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHN0cnVjdCBzdGF0IHN0YXQge307CisgICAgaWYgKGZzdGF0KGZkXy5nZXQoKSwgJnN0YXQpIDwgMCkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiZnN0YXQgZmFpbGVkIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjb25zdCBhdXRvIGZpbGVfcGF0aCA9IEdldEZkUGF0aChmZF8pOworICAgIGlzX2Jsb2NrX2RldmljZV8gPSBTX0lTQkxLKHN0YXQuc3RfbW9kZSk7CisgICAgaWYgKGlzX2Jsb2NrX2RldmljZV8pIHsKKyAgICAgICAgdWludDY0X3Qgc2l6ZV9pbl9ieXRlcyA9IDA7CisgICAgICAgIGlmIChpb2N0bChmZF8uZ2V0KCksIEJMS0dFVFNJWkU2NCwgJnNpemVfaW5fYnl0ZXMpKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGdldCB0b3RhbCBzaXplIGZvcjogIiA8PCBmZF8uZ2V0KCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgY293X2ltYWdlX3NpemVfID0gc2l6ZV9pbl9ieXRlczsKKyAgICAgICAgTE9HX0lORk8gPDwgIkNPVyBpbWFnZSAiIDw8IGZpbGVfcGF0aCA8PCAiIGhhcyBzaXplICIgPDwgc2l6ZV9pbl9ieXRlczsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dfSU5GTyA8PCAiQ09XIGltYWdlICIgPDwgZmlsZV9wYXRoCisgICAgICAgICAgICAgICAgIDw8ICIgaXMgbm90IGEgYmxvY2sgZGV2aWNlLCBhc3N1bWluZyB1bmxpbWl0ZWQgc3BhY2UuIjsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ293V3JpdGVyQmFzZTo6QWRkQ29weSh1aW50NjRfdCBuZXdfYmxvY2ssIHVpbnQ2NF90IG9sZF9ibG9jaywgdWludDY0X3QgbnVtX2Jsb2NrcykgeworICAgIENIRUNLKG51bV9ibG9ja3MgIT0gMCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bV9ibG9ja3M7IGkrKykgeworICAgICAgICBpZiAoIVZhbGlkYXRlTmV3QmxvY2sobmV3X2Jsb2NrICsgaSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBFbWl0Q29weShuZXdfYmxvY2ssIG9sZF9ibG9jaywgbnVtX2Jsb2Nrcyk7Cit9CisKK2Jvb2wgQ293V3JpdGVyQmFzZTo6QWRkUmF3QmxvY2tzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoc2l6ZSAlIG9wdGlvbnNfLmJsb2NrX3NpemUgIT0gMCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJBZGRSYXdCbG9ja3M6IHNpemUgIiA8PCBzaXplIDw8ICIgaXMgbm90IGEgbXVsdGlwbGUgb2YgIgorICAgICAgICAgICAgICAgICAgIDw8IG9wdGlvbnNfLmJsb2NrX3NpemU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1aW50NjRfdCBudW1fYmxvY2tzID0gc2l6ZSAvIG9wdGlvbnNfLmJsb2NrX3NpemU7CisgICAgdWludDY0X3QgbGFzdF9ibG9jayA9IG5ld19ibG9ja19zdGFydCArIG51bV9ibG9ja3MgLSAxOworICAgIGlmICghVmFsaWRhdGVOZXdCbG9jayhsYXN0X2Jsb2NrKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBFbWl0UmF3QmxvY2tzKG5ld19ibG9ja19zdGFydCwgZGF0YSwgc2l6ZSk7Cit9CisKK2Jvb2wgQ293V3JpdGVyQmFzZTo6QWRkWG9yQmxvY2tzKHVpbnQzMl90IG5ld19ibG9ja19zdGFydCwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBvbGRfYmxvY2ssIHVpbnQxNl90IG9mZnNldCkgeworICAgIGlmIChzaXplICUgb3B0aW9uc18uYmxvY2tfc2l6ZSAhPSAwKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkFkZFJhd0Jsb2Nrczogc2l6ZSAiIDw8IHNpemUgPDwgIiBpcyBub3QgYSBtdWx0aXBsZSBvZiAiCisgICAgICAgICAgICAgICAgICAgPDwgb3B0aW9uc18uYmxvY2tfc2l6ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVpbnQ2NF90IG51bV9ibG9ja3MgPSBzaXplIC8gb3B0aW9uc18uYmxvY2tfc2l6ZTsKKyAgICB1aW50NjRfdCBsYXN0X2Jsb2NrID0gbmV3X2Jsb2NrX3N0YXJ0ICsgbnVtX2Jsb2NrcyAtIDE7CisgICAgaWYgKCFWYWxpZGF0ZU5ld0Jsb2NrKGxhc3RfYmxvY2spKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKG9mZnNldCA+PSBvcHRpb25zXy5ibG9ja19zaXplKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkFkZFhvckJsb2Nrczogb2Zmc2V0ICIgPDwgb2Zmc2V0IDw8ICIgaXMgbm90IGxlc3MgdGhhbiAiCisgICAgICAgICAgICAgICAgICAgPDwgb3B0aW9uc18uYmxvY2tfc2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIEVtaXRYb3JCbG9ja3MobmV3X2Jsb2NrX3N0YXJ0LCBkYXRhLCBzaXplLCBvbGRfYmxvY2ssIG9mZnNldCk7Cit9CisKK2Jvb2wgQ293V3JpdGVyQmFzZTo6QWRkWmVyb0Jsb2Nrcyh1aW50NjRfdCBuZXdfYmxvY2tfc3RhcnQsIHVpbnQ2NF90IG51bV9ibG9ja3MpIHsKKyAgICB1aW50NjRfdCBsYXN0X2Jsb2NrID0gbmV3X2Jsb2NrX3N0YXJ0ICsgbnVtX2Jsb2NrcyAtIDE7CisgICAgaWYgKCFWYWxpZGF0ZU5ld0Jsb2NrKGxhc3RfYmxvY2spKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIEVtaXRaZXJvQmxvY2tzKG5ld19ibG9ja19zdGFydCwgbnVtX2Jsb2Nrcyk7Cit9CisKK2Jvb2wgQ293V3JpdGVyQmFzZTo6QWRkTGFiZWwodWludDY0X3QgbGFiZWwpIHsKKyAgICByZXR1cm4gRW1pdExhYmVsKGxhYmVsKTsKK30KKworYm9vbCBDb3dXcml0ZXJCYXNlOjpBZGRTZXF1ZW5jZURhdGEoc2l6ZV90IG51bV9vcHMsIGNvbnN0IHVpbnQzMl90KiBkYXRhKSB7CisgICAgcmV0dXJuIEVtaXRTZXF1ZW5jZURhdGEobnVtX29wcywgZGF0YSk7Cit9CisKK2Jvb2wgQ293V3JpdGVyQmFzZTo6VmFsaWRhdGVOZXdCbG9jayh1aW50NjRfdCBuZXdfYmxvY2spIHsKKyAgICBpZiAob3B0aW9uc18ubWF4X2Jsb2NrcyAmJiBuZXdfYmxvY2sgPj0gb3B0aW9uc18ubWF4X2Jsb2Nrcy52YWx1ZSgpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIk5ldyBibG9jayAiIDw8IG5ld19ibG9jayA8PCAiIGV4Y2VlZHMgbWF4aW11bSBibG9jayBjb3VudCAiCisgICAgICAgICAgICAgICAgICAgPDwgb3B0aW9uc18ubWF4X2Jsb2Nrcy52YWx1ZSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8SUNvd1JlYWRlcj4gQ293V3JpdGVyQmFzZTo6T3BlblJlYWRlcigpIHsKKyAgICB1bmlxdWVfZmQgY293X2ZkKGZjbnRsKGZkXy5nZXQoKSwgRl9EVVBGRCB8IEZfRFVQRkRfQ0xPRVhFQywgMCkpOworICAgIGlmIChjb3dfZmQgPCAwKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJDb3dXcml0ZXJWMjo6T3BlblJlYW5kZXI6IGR1cCBDT1cgZGV2aWNlIjsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgYXV0byBjb3cgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1JlYWRlcj4oKTsKKyAgICBpZiAoIWNvdy0+UGFyc2Uoc3RkOjptb3ZlKGNvd19mZCkpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNvd1dyaXRlclYyOjpPcGVuUmVhZGVyOiB1bmFibGUgdG8gcmVhZCBDT1ciOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIGNvdzsKK30KKworc3RkOjp1bmlxdWVfcHRyPGNocm9tZW9zX3VwZGF0ZV9lbmdpbmU6OkZpbGVEZXNjcmlwdG9yPiBDb3dXcml0ZXJCYXNlOjpPcGVuRmlsZURlc2NyaXB0b3IoCisgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+JiBzb3VyY2VfZGV2aWNlKSB7CisgICAgYXV0byByZWFkZXIgPSBPcGVuUmVhZGVyKCk7CisgICAgaWYgKCFyZWFkZXIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gYmxvY2tfZGV2X3NpemU7CisgICAgaWYgKG9wdGlvbnNfLm1heF9ibG9ja3MpIHsKKyAgICAgICAgYmxvY2tfZGV2X3NpemUgPSB7Km9wdGlvbnNfLm1heF9ibG9ja3MgKiBvcHRpb25zXy5ibG9ja19zaXplfTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxDb21wcmVzc2VkU25hcHNob3RSZWFkZXI+KHN0ZDo6bW92ZShyZWFkZXIpLCBzb3VyY2VfZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfZGV2X3NpemUpOworfQorCitib29sIENvd1dyaXRlckJhc2U6OlN5bmMoKSB7CisgICAgaWYgKGlzX2Rldl9udWxsXykgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGZzeW5jKGZkXy5nZXQoKSkgPCAwKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJmc3luYyBmYWlsZWQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L3dyaXRlcl9iYXNlLmggYi9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L3dyaXRlcl9iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI3NDQ1NgotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvd3JpdGVyX2Jhc2UuaApAQCAtMCwwICsxLDc2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxsaWJzbmFwc2hvdC9jb3dfd3JpdGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBzbmFwc2hvdCB7CisKK2NsYXNzIENvd1dyaXRlckJhc2UgOiBwdWJsaWMgSUNvd1dyaXRlciB7CisgIHB1YmxpYzoKKyAgICBDb3dXcml0ZXJCYXNlKGNvbnN0IENvd09wdGlvbnMmIG9wdGlvbnMsIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCYmIGZkKTsKKyAgICB2aXJ0dWFsIH5Db3dXcml0ZXJCYXNlKCkge30KKworICAgIC8vIFNldCB1cCB0aGUgd3JpdGVyLgorICAgIC8vIFRoZSBmaWxlIHN0YXJ0cyBmcm9tIHRoZSBiZWdpbm5pbmcuCisgICAgLy8KKyAgICAvLyBJZiBmZCBpcyA8IDAsIHRoZSBDb3dXcml0ZXIgd2lsbCBiZSBvcGVuZWQgYWdhaW5zdCAvZGV2L251bGwuIFRoaXMgaXMgZm9yCisgICAgLy8gY29tcHV0aW5nIENPVyBzaXplcyB3aXRob3V0IHVzaW5nIHN0b3JhZ2Ugc3BhY2UuCisgICAgLy8KKyAgICAvLyBJZiBhIGxhYmVsIGlzIGdpdmVuLCBhbnkgb3BlcmF0aW9ucyBhZnRlciB0aGUgZ2l2ZW4gbGFiZWwgd2lsbCBiZSBkcm9wcGVkLgorICAgIC8vIElmIHRoZSBnaXZlbiBsYWJlbCBpcyBub3QgZm91bmQsIEluaXRpYWxpemUgd2lsbCBmYWlsLgorICAgIHZpcnR1YWwgYm9vbCBJbml0aWFsaXplKHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IGxhYmVsID0ge30pID0gMDsKKworICAgIGJvb2wgU3luYygpOworICAgIGJvb2wgQWRkQ29weSh1aW50NjRfdCBuZXdfYmxvY2ssIHVpbnQ2NF90IG9sZF9ibG9jaywgdWludDY0X3QgbnVtX2Jsb2NrcyA9IDEpIG92ZXJyaWRlOworICAgIGJvb2wgQWRkUmF3QmxvY2tzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIGJvb2wgQWRkWG9yQmxvY2tzKHVpbnQzMl90IG5ld19ibG9ja19zdGFydCwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUsIHVpbnQzMl90IG9sZF9ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBvZmZzZXQpIG92ZXJyaWRlOworICAgIGJvb2wgQWRkWmVyb0Jsb2Nrcyh1aW50NjRfdCBuZXdfYmxvY2tfc3RhcnQsIHVpbnQ2NF90IG51bV9ibG9ja3MpIG92ZXJyaWRlOworICAgIGJvb2wgQWRkTGFiZWwodWludDY0X3QgbGFiZWwpIG92ZXJyaWRlOworICAgIGJvb2wgQWRkU2VxdWVuY2VEYXRhKHNpemVfdCBudW1fb3BzLCBjb25zdCB1aW50MzJfdCogZGF0YSkgb3ZlcnJpZGU7CisgICAgdWludDMyX3QgR2V0QmxvY2tTaXplKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gb3B0aW9uc18uYmxvY2tfc2l6ZTsgfQorICAgIHN0ZDo6b3B0aW9uYWw8dWludDMyX3Q+IEdldE1heEJsb2NrcygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG9wdGlvbnNfLm1heF9ibG9ja3M7IH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SUNvd1JlYWRlcj4gT3BlblJlYWRlcigpIG92ZXJyaWRlOworICAgIHN0ZDo6dW5pcXVlX3B0cjxGaWxlRGVzY3JpcHRvcj4gT3BlbkZpbGVEZXNjcmlwdG9yKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4mIHNvdXJjZV9kZXZpY2UpIG92ZXJyaWRlOworCisgICAgY29uc3QgQ293T3B0aW9ucyYgb3B0aW9ucygpIGNvbnN0IHsgcmV0dXJuIG9wdGlvbnNfOyB9CisKKyAgcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgYm9vbCBFbWl0Q29weSh1aW50NjRfdCBuZXdfYmxvY2ssIHVpbnQ2NF90IG9sZF9ibG9jaywgdWludDY0X3QgbnVtX2Jsb2NrcyA9IDEpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgRW1pdFJhd0Jsb2Nrcyh1aW50NjRfdCBuZXdfYmxvY2tfc3RhcnQsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKSA9IDA7CisgICAgdmlydHVhbCBib29sIEVtaXRYb3JCbG9ja3ModWludDMyX3QgbmV3X2Jsb2NrX3N0YXJ0LCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBvbGRfYmxvY2ssIHVpbnQxNl90IG9mZnNldCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBFbWl0WmVyb0Jsb2Nrcyh1aW50NjRfdCBuZXdfYmxvY2tfc3RhcnQsIHVpbnQ2NF90IG51bV9ibG9ja3MpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgRW1pdExhYmVsKHVpbnQ2NF90IGxhYmVsKSA9IDA7CisgICAgdmlydHVhbCBib29sIEVtaXRTZXF1ZW5jZURhdGEoc2l6ZV90IG51bV9vcHMsIGNvbnN0IHVpbnQzMl90KiBkYXRhKSA9IDA7CisKKyAgICBib29sIEluaXRGZCgpOworICAgIGJvb2wgVmFsaWRhdGVOZXdCbG9jayh1aW50NjRfdCBuZXdfYmxvY2spOworCisgICAgYm9vbCBJc0VzdGltYXRpbmcoKSBjb25zdCB7IHJldHVybiBpc19kZXZfbnVsbF87IH0KKworICAgIENvd09wdGlvbnMgb3B0aW9uc187CisKKyAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgZmRfOworICAgIGJvb2wgaXNfZGV2X251bGxfID0gZmFsc2U7CisgICAgYm9vbCBpc19ibG9ja19kZXZpY2VfID0gZmFsc2U7CisgICAgdWludDY0X3QgY293X2ltYWdlX3NpemVfID0gSU5UNjRfTUFYOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9jb3dfd3JpdGVyLmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvd3JpdGVyX3YyLmNwcApzaW1pbGFyaXR5IGluZGV4IDYxJQpyZW5hbWUgZnJvbSBmc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L2Nvd193cml0ZXIuY3BwCnJlbmFtZSB0byBmc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L3dyaXRlcl92Mi5jcHAKaW5kZXggNTZiNDhmMC4uMDk5M2RiYSAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy9jb3dfd3JpdGVyLmNwcAorKysgYi9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L3dyaXRlcl92Mi5jcHAKQEAgLTE0LDEyICsxNCwxNCBAQAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAvLwogCisjaW5jbHVkZSAid3JpdGVyX3YyLmgiCisKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvdWlvLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKKyNpbmNsdWRlIDxmdXR1cmU+CiAjaW5jbHVkZSA8bGltaXRzPgotI2luY2x1ZGUgPHF1ZXVlPgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgpAQCAtMzcsMTA3ICszOSwzMiBAQAogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCisjaW5jbHVkZSAiYW5kcm9pZC1iYXNlL3BhcnNlaW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC1iYXNlL3N0cmluZ3MuaCIKKyNpbmNsdWRlICJwYXJzZXJfdjIuaCIKKworLy8gVGhlIGluZm8gbWVzc2FnZXMgaGVyZSBhcmUgc3BhbW15LCBidXQgYXMgdXNlZnVsIGZvciB1cGRhdGVfZW5naW5lLiBEaXNhYmxlCisvLyB0aGVtIHdoZW4gcnVubmluZyBvbiB0aGUgaG9zdC4KKyNpZmRlZiBfX0FORFJPSURfXworI2RlZmluZSBMT0dfSU5GTyBMT0coSU5GTykKKyNlbHNlCisjZGVmaW5lIExPR19JTkZPIExPRyhWRVJCT1NFKQorI2VuZGlmCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBzbmFwc2hvdCB7CiAKLW5hbWVzcGFjZSB7Ci1zdGQ6OnN0cmluZyBHZXRGZFBhdGgoaW50IGZkKSB7Ci0gICAgY29uc3QgYXV0byBmZF9wYXRoID0gIi9wcm9jL3NlbGYvZmQvIiArIHN0ZDo6dG9fc3RyaW5nKGZkKTsKLSAgICBzdGQ6OnN0cmluZyBmaWxlX3BhdGgoNTEyLCAnXDAnKTsKLSAgICBjb25zdCBhdXRvIGVyciA9IHJlYWRsaW5rKGZkX3BhdGguY19zdHIoKSwgZmlsZV9wYXRoLmRhdGEoKSwgZmlsZV9wYXRoLnNpemUoKSk7Ci0gICAgaWYgKGVyciA8PSAwKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZGV0ZXJtaW5lIHBhdGggZm9yIGZkICIgPDwgZmQ7Ci0gICAgICAgIGZpbGVfcGF0aC5jbGVhcigpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZpbGVfcGF0aC5yZXNpemUoZXJyKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZpbGVfcGF0aDsKLX0KLX0gIC8vIG5hbWVzcGFjZQotCiBzdGF0aWNfYXNzZXJ0KHNpemVvZihvZmZfdCkgPT0gc2l6ZW9mKHVpbnQ2NF90KSk7CiAKLXVzaW5nIGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkOwogdXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOwogCi1ib29sIElDb3dXcml0ZXI6OkFkZENvcHkodWludDY0X3QgbmV3X2Jsb2NrLCB1aW50NjRfdCBvbGRfYmxvY2ssIHVpbnQ2NF90IG51bV9ibG9ja3MpIHsKLSAgICBDSEVDSyhudW1fYmxvY2tzICE9IDApOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspIHsKLSAgICAgICAgaWYgKCFWYWxpZGF0ZU5ld0Jsb2NrKG5ld19ibG9jayArIGkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gRW1pdENvcHkobmV3X2Jsb2NrLCBvbGRfYmxvY2ssIG51bV9ibG9ja3MpOwotfQotCi1ib29sIElDb3dXcml0ZXI6OkFkZFJhd0Jsb2Nrcyh1aW50NjRfdCBuZXdfYmxvY2tfc3RhcnQsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKHNpemUgJSBvcHRpb25zXy5ibG9ja19zaXplICE9IDApIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiQWRkUmF3QmxvY2tzOiBzaXplICIgPDwgc2l6ZSA8PCAiIGlzIG5vdCBhIG11bHRpcGxlIG9mICIKLSAgICAgICAgICAgICAgICAgICA8PCBvcHRpb25zXy5ibG9ja19zaXplOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdWludDY0X3QgbnVtX2Jsb2NrcyA9IHNpemUgLyBvcHRpb25zXy5ibG9ja19zaXplOwotICAgIHVpbnQ2NF90IGxhc3RfYmxvY2sgPSBuZXdfYmxvY2tfc3RhcnQgKyBudW1fYmxvY2tzIC0gMTsKLSAgICBpZiAoIVZhbGlkYXRlTmV3QmxvY2sobGFzdF9ibG9jaykpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gRW1pdFJhd0Jsb2NrcyhuZXdfYmxvY2tfc3RhcnQsIGRhdGEsIHNpemUpOwotfQotCi1ib29sIElDb3dXcml0ZXI6OkFkZFhvckJsb2Nrcyh1aW50MzJfdCBuZXdfYmxvY2tfc3RhcnQsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2xkX2Jsb2NrLCB1aW50MTZfdCBvZmZzZXQpIHsKLSAgICBpZiAoc2l6ZSAlIG9wdGlvbnNfLmJsb2NrX3NpemUgIT0gMCkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJBZGRSYXdCbG9ja3M6IHNpemUgIiA8PCBzaXplIDw8ICIgaXMgbm90IGEgbXVsdGlwbGUgb2YgIgotICAgICAgICAgICAgICAgICAgIDw8IG9wdGlvbnNfLmJsb2NrX3NpemU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB1aW50NjRfdCBudW1fYmxvY2tzID0gc2l6ZSAvIG9wdGlvbnNfLmJsb2NrX3NpemU7Ci0gICAgdWludDY0X3QgbGFzdF9ibG9jayA9IG5ld19ibG9ja19zdGFydCArIG51bV9ibG9ja3MgLSAxOwotICAgIGlmICghVmFsaWRhdGVOZXdCbG9jayhsYXN0X2Jsb2NrKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChvZmZzZXQgPj0gb3B0aW9uc18uYmxvY2tfc2l6ZSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJBZGRYb3JCbG9ja3M6IG9mZnNldCAiIDw8IG9mZnNldCA8PCAiIGlzIG5vdCBsZXNzIHRoYW4gIgotICAgICAgICAgICAgICAgICAgIDw8IG9wdGlvbnNfLmJsb2NrX3NpemU7Ci0gICAgfQotICAgIHJldHVybiBFbWl0WG9yQmxvY2tzKG5ld19ibG9ja19zdGFydCwgZGF0YSwgc2l6ZSwgb2xkX2Jsb2NrLCBvZmZzZXQpOwotfQotCi1ib29sIElDb3dXcml0ZXI6OkFkZFplcm9CbG9ja3ModWludDY0X3QgbmV3X2Jsb2NrX3N0YXJ0LCB1aW50NjRfdCBudW1fYmxvY2tzKSB7Ci0gICAgdWludDY0X3QgbGFzdF9ibG9jayA9IG5ld19ibG9ja19zdGFydCArIG51bV9ibG9ja3MgLSAxOwotICAgIGlmICghVmFsaWRhdGVOZXdCbG9jayhsYXN0X2Jsb2NrKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBFbWl0WmVyb0Jsb2NrcyhuZXdfYmxvY2tfc3RhcnQsIG51bV9ibG9ja3MpOwotfQotCi1ib29sIElDb3dXcml0ZXI6OkFkZExhYmVsKHVpbnQ2NF90IGxhYmVsKSB7Ci0gICAgcmV0dXJuIEVtaXRMYWJlbChsYWJlbCk7Ci19Ci0KLWJvb2wgSUNvd1dyaXRlcjo6QWRkU2VxdWVuY2VEYXRhKHNpemVfdCBudW1fb3BzLCBjb25zdCB1aW50MzJfdCogZGF0YSkgewotICAgIHJldHVybiBFbWl0U2VxdWVuY2VEYXRhKG51bV9vcHMsIGRhdGEpOwotfQotCi1ib29sIElDb3dXcml0ZXI6OlZhbGlkYXRlTmV3QmxvY2sodWludDY0X3QgbmV3X2Jsb2NrKSB7Ci0gICAgaWYgKG9wdGlvbnNfLm1heF9ibG9ja3MgJiYgbmV3X2Jsb2NrID49IG9wdGlvbnNfLm1heF9ibG9ja3MudmFsdWUoKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJOZXcgYmxvY2sgIiA8PCBuZXdfYmxvY2sgPDwgIiBleGNlZWRzIG1heGltdW0gYmxvY2sgY291bnQgIgotICAgICAgICAgICAgICAgICAgIDw8IG9wdGlvbnNfLm1heF9ibG9ja3MudmFsdWUoKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotQ293V3JpdGVyOjpDb3dXcml0ZXIoY29uc3QgQ293T3B0aW9ucyYgb3B0aW9ucykgOiBJQ293V3JpdGVyKG9wdGlvbnMpLCBmZF8oLTEpIHsKK0Nvd1dyaXRlclYyOjpDb3dXcml0ZXJWMihjb25zdCBDb3dPcHRpb25zJiBvcHRpb25zLCB1bmlxdWVfZmQmJiBmZCkKKyAgICA6IENvd1dyaXRlckJhc2Uob3B0aW9ucywgc3RkOjptb3ZlKGZkKSkgewogICAgIFNldHVwSGVhZGVycygpOwogICAgIFNldHVwV3JpdGVPcHRpb25zKCk7CiB9CiAKLUNvd1dyaXRlcjo6fkNvd1dyaXRlcigpIHsKK0Nvd1dyaXRlclYyOjp+Q293V3JpdGVyVjIoKSB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb21wcmVzc190aHJlYWRzXy5zaXplKCk7IGkrKykgewogICAgICAgICBDb21wcmVzc1dvcmtlciogd29ya2VyID0gY29tcHJlc3NfdGhyZWFkc19baV0uZ2V0KCk7CiAgICAgICAgIGlmICh3b3JrZXIpIHsKQEAgLTE1Niw3ICs4Myw3IEBACiAgICAgY29tcHJlc3NfdGhyZWFkc18uY2xlYXIoKTsKIH0KIAotdm9pZCBDb3dXcml0ZXI6OlNldHVwV3JpdGVPcHRpb25zKCkgewordm9pZCBDb3dXcml0ZXJWMjo6U2V0dXBXcml0ZU9wdGlvbnMoKSB7CiAgICAgbnVtX2NvbXByZXNzX3RocmVhZHNfID0gb3B0aW9uc18ubnVtX2NvbXByZXNzX3RocmVhZHM7CiAKICAgICBpZiAoIW51bV9jb21wcmVzc190aHJlYWRzXykgewpAQCAtMTc2LDE0ICsxMDMsMTQgQEAKICAgICB9CiB9CiAKLXZvaWQgQ293V3JpdGVyOjpTZXR1cEhlYWRlcnMoKSB7Cit2b2lkIENvd1dyaXRlclYyOjpTZXR1cEhlYWRlcnMoKSB7CiAgICAgaGVhZGVyXyA9IHt9OwotICAgIGhlYWRlcl8ubWFnaWMgPSBrQ293TWFnaWNOdW1iZXI7Ci0gICAgaGVhZGVyXy5tYWpvcl92ZXJzaW9uID0ga0Nvd1ZlcnNpb25NYWpvcjsKLSAgICBoZWFkZXJfLm1pbm9yX3ZlcnNpb24gPSBrQ293VmVyc2lvbk1pbm9yOwotICAgIGhlYWRlcl8uaGVhZGVyX3NpemUgPSBzaXplb2YoQ293SGVhZGVyKTsKKyAgICBoZWFkZXJfLnByZWZpeC5tYWdpYyA9IGtDb3dNYWdpY051bWJlcjsKKyAgICBoZWFkZXJfLnByZWZpeC5tYWpvcl92ZXJzaW9uID0ga0Nvd1ZlcnNpb25NYWpvcjsKKyAgICBoZWFkZXJfLnByZWZpeC5taW5vcl92ZXJzaW9uID0ga0Nvd1ZlcnNpb25NaW5vcjsKKyAgICBoZWFkZXJfLnByZWZpeC5oZWFkZXJfc2l6ZSA9IHNpemVvZihDb3dIZWFkZXIpOwogICAgIGhlYWRlcl8uZm9vdGVyX3NpemUgPSBzaXplb2YoQ293Rm9vdGVyKTsKLSAgICBoZWFkZXJfLm9wX3NpemUgPSBzaXplb2YoQ293T3BlcmF0aW9uKTsKKyAgICBoZWFkZXJfLm9wX3NpemUgPSBzaXplb2YoQ293T3BlcmF0aW9uVjIpOwogICAgIGhlYWRlcl8uYmxvY2tfc2l6ZSA9IG9wdGlvbnNfLmJsb2NrX3NpemU7CiAgICAgaGVhZGVyXy5udW1fbWVyZ2Vfb3BzID0gb3B0aW9uc18ubnVtX21lcmdlX29wczsKICAgICBoZWFkZXJfLmNsdXN0ZXJfb3BzID0gb3B0aW9uc18uY2x1c3Rlcl9vcHM7CkBAIC0xOTMsMTkgKzEyMCwzMSBAQAogICAgIGZvb3Rlcl8ub3AudHlwZSA9IGtDb3dGb290ZXJPcDsKIH0KIAotYm9vbCBDb3dXcml0ZXI6OlBhcnNlT3B0aW9ucygpIHsKLSAgICBpZiAob3B0aW9uc18uY29tcHJlc3Npb24gPT0gImd6IikgewotICAgICAgICBjb21wcmVzc2lvbl8gPSBrQ293Q29tcHJlc3NHejsKLSAgICB9IGVsc2UgaWYgKG9wdGlvbnNfLmNvbXByZXNzaW9uID09ICJicm90bGkiKSB7Ci0gICAgICAgIGNvbXByZXNzaW9uXyA9IGtDb3dDb21wcmVzc0Jyb3RsaTsKLSAgICB9IGVsc2UgaWYgKG9wdGlvbnNfLmNvbXByZXNzaW9uID09ICJsejQiKSB7Ci0gICAgICAgIGNvbXByZXNzaW9uXyA9IGtDb3dDb21wcmVzc0x6NDsKLSAgICB9IGVsc2UgaWYgKG9wdGlvbnNfLmNvbXByZXNzaW9uID09ICJub25lIikgewotICAgICAgICBjb21wcmVzc2lvbl8gPSBrQ293Q29tcHJlc3NOb25lOwotICAgIH0gZWxzZSBpZiAoIW9wdGlvbnNfLmNvbXByZXNzaW9uLmVtcHR5KCkpIHsKK2Jvb2wgQ293V3JpdGVyVjI6OlBhcnNlT3B0aW9ucygpIHsKKyAgICBhdXRvIHBhcnRzID0gYW5kcm9pZDo6YmFzZTo6U3BsaXQob3B0aW9uc18uY29tcHJlc3Npb24sICIsIik7CisKKyAgICBpZiAocGFydHMuc2l6ZSgpID4gMikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJmYWlsZWQgdG8gcGFyc2UgY29tcHJlc3Npb24gcGFyYW1ldGVyczogaW52YWxpZCBhcmd1bWVudCBjb3VudDogIgorICAgICAgICAgICAgICAgICAgIDw8IHBhcnRzLnNpemUoKSA8PCAiICIgPDwgb3B0aW9uc18uY29tcHJlc3Npb247CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgYXV0byBhbGdvcml0aG0gPSBDb21wcmVzc2lvbkFsZ29yaXRobUZyb21TdHJpbmcocGFydHNbMF0pOworICAgIGlmICghYWxnb3JpdGhtKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgInVucmVjb2duaXplZCBjb21wcmVzc2lvbjogIiA8PCBvcHRpb25zXy5jb21wcmVzc2lvbjsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KKyAgICBpZiAocGFydHMuc2l6ZSgpID4gMSkgeworICAgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlBhcnNlSW50KHBhcnRzWzFdLCAmY29tcHJlc3Npb25fLmNvbXByZXNzaW9uX2xldmVsKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiZmFpbGVkIHRvIHBhcnNlIGNvbXByZXNzaW9uIGxldmVsIGludmFsaWQgdHlwZTogIiA8PCBwYXJ0c1sxXTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNvbXByZXNzaW9uXy5jb21wcmVzc2lvbl9sZXZlbCA9CisgICAgICAgICAgICAgICAgQ29tcHJlc3NXb3JrZXI6OkdldERlZmF1bHRDb21wcmVzc2lvbkxldmVsKGFsZ29yaXRobS52YWx1ZSgpKTsKKyAgICB9CisKKyAgICBjb21wcmVzc2lvbl8uYWxnb3JpdGhtID0gKmFsZ29yaXRobTsKKwogICAgIGlmIChvcHRpb25zXy5jbHVzdGVyX29wcyA9PSAxKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgIkNsdXN0ZXJzIG11c3QgY29udGFpbiBhdCBsZWFzdCB0d28gb3BlcmF0aW9ucyB0byBmdW5jdGlvbi4iOwogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0yMTMsNTEgKzE1MiwxNiBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIENvd1dyaXRlcjo6U2V0RmQoYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgZmQpIHsKLSAgICBpZiAoZmQuZ2V0KCkgPCAwKSB7Ci0gICAgICAgIG93bmVkX2ZkXy5yZXNldChvcGVuKCIvZGV2L251bGwiLCBPX1JEV1IgfCBPX0NMT0VYRUMpKTsKLSAgICAgICAgaWYgKG93bmVkX2ZkXyA8IDApIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJvcGVuIC9kZXYvbnVsbCBmYWlsZWQiOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGZkXyA9IG93bmVkX2ZkXzsKLSAgICAgICAgaXNfZGV2X251bGxfID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBmZF8gPSBmZDsKLQotICAgICAgICBzdHJ1Y3Qgc3RhdCBzdGF0IHt9OwotICAgICAgICBpZiAoZnN0YXQoZmQuZ2V0KCksICZzdGF0KSA8IDApIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJmc3RhdCBmYWlsZWQiOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IGF1dG8gZmlsZV9wYXRoID0gR2V0RmRQYXRoKGZkLmdldCgpKTsKLSAgICAgICAgaXNfYmxvY2tfZGV2aWNlXyA9IFNfSVNCTEsoc3RhdC5zdF9tb2RlKTsKLSAgICAgICAgaWYgKGlzX2Jsb2NrX2RldmljZV8pIHsKLSAgICAgICAgICAgIHVpbnQ2NF90IHNpemVfaW5fYnl0ZXMgPSAwOwotICAgICAgICAgICAgaWYgKGlvY3RsKGZkLmdldCgpLCBCTEtHRVRTSVpFNjQsICZzaXplX2luX2J5dGVzKSkgewotICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZ2V0IHRvdGFsIHNpemUgZm9yOiAiIDw8IGZkLmdldCgpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvd19pbWFnZV9zaXplXyA9IHNpemVfaW5fYnl0ZXM7Ci0gICAgICAgICAgICBMT0coSU5GTykgPDwgIkNPVyBpbWFnZSAiIDw8IGZpbGVfcGF0aCA8PCAiIGhhcyBzaXplICIgPDwgc2l6ZV9pbl9ieXRlczsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiQ09XIGltYWdlICIgPDwgZmlsZV9wYXRoCi0gICAgICAgICAgICAgICAgICAgICAgPDwgIiBpcyBub3QgYSBibG9jayBkZXZpY2UsIGFzc3VtaW5nIHVubGltaXRlZCBzcGFjZS4iOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIENvd1dyaXRlcjo6SW5pdEJhdGNoV3JpdGVzKCkgewordm9pZCBDb3dXcml0ZXJWMjo6SW5pdEJhdGNoV3JpdGVzKCkgewogICAgIGlmIChiYXRjaF93cml0ZV8pIHsKICAgICAgICAgY293b3BfdmVjXyA9IHN0ZDo6bWFrZV91bmlxdWU8c3RydWN0IGlvdmVjW10+KGhlYWRlcl8uY2x1c3Rlcl9vcHMpOwogICAgICAgICBkYXRhX3ZlY18gPSBzdGQ6Om1ha2VfdW5pcXVlPHN0cnVjdCBpb3ZlY1tdPihoZWFkZXJfLmNsdXN0ZXJfb3BzKTsKICAgICAgICAgc3RydWN0IGlvdmVjKiBjb3dvcF9wdHIgPSBjb3dvcF92ZWNfLmdldCgpOwogICAgICAgICBzdHJ1Y3QgaW92ZWMqIGRhdGFfcHRyID0gZGF0YV92ZWNfLmdldCgpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlYWRlcl8uY2x1c3Rlcl9vcHM7IGkrKykgewotICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENvd09wZXJhdGlvbj4gb3AgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd09wZXJhdGlvbj4oKTsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDb3dPcGVyYXRpb25WMj4gb3AgPSBzdGQ6Om1ha2VfdW5pcXVlPENvd09wZXJhdGlvblYyPigpOwogICAgICAgICAgICAgY293b3BfcHRyW2ldLmlvdl9iYXNlID0gb3AuZ2V0KCk7Ci0gICAgICAgICAgICBjb3dvcF9wdHJbaV0uaW92X2xlbiA9IHNpemVvZihDb3dPcGVyYXRpb24pOworICAgICAgICAgICAgY293b3BfcHRyW2ldLmlvdl9sZW4gPSBzaXplb2YoQ293T3BlcmF0aW9uVjIpOwogICAgICAgICAgICAgb3BidWZmZXJfdmVjXy5wdXNoX2JhY2soc3RkOjptb3ZlKG9wKSk7CiAKICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IGJ1ZmZlciA9IHN0ZDo6bWFrZV91bmlxdWU8dWludDhfdFtdPihoZWFkZXJfLmJsb2NrX3NpemUgKiAyKTsKQEAgLTI3MCw3NSArMTc0LDU5IEBACiAgICAgICAgIGN1cnJlbnRfZGF0YV9wb3NfID0gbmV4dF9kYXRhX3Bvc187CiAgICAgfQogCi0gICAgc3RkOjpzdHJpbmcgYmF0Y2hfd3JpdGUgPSBiYXRjaF93cml0ZV8gPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiOwotICAgIExPRyhJTkZPKSA8PCAiQmF0Y2ggd3JpdGVzOiAiIDw8IGJhdGNoX3dyaXRlOworICAgIExPR19JTkZPIDw8ICJCYXRjaCB3cml0ZXM6ICIgPDwgKGJhdGNoX3dyaXRlXyA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwogfQogCi12b2lkIENvd1dyaXRlcjo6SW5pdFdvcmtlcnMoKSB7Cit2b2lkIENvd1dyaXRlclYyOjpJbml0V29ya2VycygpIHsKICAgICBpZiAobnVtX2NvbXByZXNzX3RocmVhZHNfIDw9IDEpIHsKLSAgICAgICAgTE9HKElORk8pIDw8ICJOb3QgY3JlYXRpbmcgbmV3IHRocmVhZHMgZm9yIGNvbXByZXNzaW9uLiI7CisgICAgICAgIExPR19JTkZPIDw8ICJOb3QgY3JlYXRpbmcgbmV3IHRocmVhZHMgZm9yIGNvbXByZXNzaW9uLiI7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fY29tcHJlc3NfdGhyZWFkc187IGkrKykgewotICAgICAgICBhdXRvIHd0ID0gc3RkOjptYWtlX3VuaXF1ZTxDb21wcmVzc1dvcmtlcj4oY29tcHJlc3Npb25fLCBoZWFkZXJfLmJsb2NrX3NpemUpOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SUNvbXByZXNzb3I+IGNvbXByZXNzb3IgPQorICAgICAgICAgICAgICAgIElDb21wcmVzc29yOjpDcmVhdGUoY29tcHJlc3Npb25fLCBoZWFkZXJfLmJsb2NrX3NpemUpOworICAgICAgICBhdXRvIHd0ID0gc3RkOjptYWtlX3VuaXF1ZTxDb21wcmVzc1dvcmtlcj4oc3RkOjptb3ZlKGNvbXByZXNzb3IpKTsKICAgICAgICAgdGhyZWFkc18uZW1wbGFjZV9iYWNrKHN0ZDo6YXN5bmMoc3RkOjpsYXVuY2g6OmFzeW5jLCAmQ29tcHJlc3NXb3JrZXI6OlJ1blRocmVhZCwgd3QuZ2V0KCkpKTsKICAgICAgICAgY29tcHJlc3NfdGhyZWFkc18ucHVzaF9iYWNrKHN0ZDo6bW92ZSh3dCkpOwogICAgIH0KIAotICAgIExPRyhJTkZPKSA8PCBudW1fY29tcHJlc3NfdGhyZWFkc18gPDwgIiB0aHJlYWQgdXNlZCBmb3IgY29tcHJlc3Npb24iOworICAgIExPR19JTkZPIDw8IG51bV9jb21wcmVzc190aHJlYWRzXyA8PCAiIHRocmVhZCB1c2VkIGZvciBjb21wcmVzc2lvbiI7CiB9CiAKLWJvb2wgQ293V3JpdGVyOjpJbml0aWFsaXplKHVuaXF1ZV9mZCYmIGZkKSB7Ci0gICAgb3duZWRfZmRfID0gc3RkOjptb3ZlKGZkKTsKLSAgICByZXR1cm4gSW5pdGlhbGl6ZShib3Jyb3dlZF9mZHtvd25lZF9mZF99KTsKLX0KLQotYm9vbCBDb3dXcml0ZXI6OkluaXRpYWxpemUoYm9ycm93ZWRfZmQgZmQpIHsKLSAgICBpZiAoIVNldEZkKGZkKSB8fCAhUGFyc2VPcHRpb25zKCkpIHsKK2Jvb2wgQ293V3JpdGVyVjI6OkluaXRpYWxpemUoc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gbGFiZWwpIHsKKyAgICBpZiAoIUluaXRGZCgpIHx8ICFQYXJzZU9wdGlvbnMoKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotCi0gICAgaWYgKCFPcGVuRm9yV3JpdGUoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFsYWJlbCkgeworICAgICAgICBpZiAoIU9wZW5Gb3JXcml0ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIU9wZW5Gb3JBcHBlbmQoKmxhYmVsKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CiAgICAgfQogCi0gICAgSW5pdFdvcmtlcnMoKTsKKyAgICBpZiAoIWNvbXByZXNzX3RocmVhZHNfLnNpemUoKSkgeworICAgICAgICBJbml0V29ya2VycygpOworICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBDb3dXcml0ZXI6OkluaXRpYWxpemVBcHBlbmQoYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkJiYgZmQsIHVpbnQ2NF90IGxhYmVsKSB7Ci0gICAgb3duZWRfZmRfID0gc3RkOjptb3ZlKGZkKTsKLSAgICByZXR1cm4gSW5pdGlhbGl6ZUFwcGVuZChhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZHtvd25lZF9mZF99LCBsYWJlbCk7Ci19Ci0KLWJvb2wgQ293V3JpdGVyOjpJbml0aWFsaXplQXBwZW5kKGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIGZkLCB1aW50NjRfdCBsYWJlbCkgewotICAgIGlmICghU2V0RmQoZmQpIHx8ICFQYXJzZU9wdGlvbnMoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbCByZXQgPSBPcGVuRm9yQXBwZW5kKGxhYmVsKTsKLQotICAgIGlmIChyZXQgJiYgIWNvbXByZXNzX3RocmVhZHNfLnNpemUoKSkgewotICAgICAgICBJbml0V29ya2VycygpOwotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXZvaWQgQ293V3JpdGVyOjpJbml0UG9zKCkgewotICAgIG5leHRfb3BfcG9zXyA9IHNpemVvZihoZWFkZXJfKSArIGhlYWRlcl8uYnVmZmVyX3NpemU7Ci0gICAgY2x1c3Rlcl9zaXplXyA9IGhlYWRlcl8uY2x1c3Rlcl9vcHMgKiBzaXplb2YoQ293T3BlcmF0aW9uKTsKK3ZvaWQgQ293V3JpdGVyVjI6OkluaXRQb3MoKSB7CisgICAgbmV4dF9vcF9wb3NfID0gc2l6ZW9mKENvd0hlYWRlcikgKyBoZWFkZXJfLmJ1ZmZlcl9zaXplOworICAgIGNsdXN0ZXJfc2l6ZV8gPSBoZWFkZXJfLmNsdXN0ZXJfb3BzICogc2l6ZW9mKENvd09wZXJhdGlvblYyKTsKICAgICBpZiAoaGVhZGVyXy5jbHVzdGVyX29wcykgewogICAgICAgICBuZXh0X2RhdGFfcG9zXyA9IG5leHRfb3BfcG9zXyArIGNsdXN0ZXJfc2l6ZV87CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbmV4dF9kYXRhX3Bvc18gPSBuZXh0X29wX3Bvc18gKyBzaXplb2YoQ293T3BlcmF0aW9uKTsKKyAgICAgICAgbmV4dF9kYXRhX3Bvc18gPSBuZXh0X29wX3Bvc18gKyBzaXplb2YoQ293T3BlcmF0aW9uVjIpOwogICAgIH0KICAgICBjdXJyZW50X2NsdXN0ZXJfc2l6ZV8gPSAwOwogICAgIGN1cnJlbnRfZGF0YV9zaXplXyA9IDA7CiB9CiAKLWJvb2wgQ293V3JpdGVyOjpPcGVuRm9yV3JpdGUoKSB7Ci0gICAgLy8gVGhpcyBsaW1pdGF0aW9uIGlzIHRpZWQgdG8gdGhlIGRhdGEgZmllbGQgc2l6ZSBpbiBDb3dPcGVyYXRpb24uCitib29sIENvd1dyaXRlclYyOjpPcGVuRm9yV3JpdGUoKSB7CisgICAgLy8gVGhpcyBsaW1pdGF0aW9uIGlzIHRpZWQgdG8gdGhlIGRhdGEgZmllbGQgc2l6ZSBpbiBDb3dPcGVyYXRpb25WMi4KICAgICBpZiAoaGVhZGVyXy5ibG9ja19zaXplID4gc3RkOjpudW1lcmljX2xpbWl0czx1aW50MTZfdD46Om1heCgpKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgIkJsb2NrIHNpemUgaXMgdG9vIGxhcmdlIjsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMzU1LDcgKzI0Myw3IEBACiAKICAgICAvLyBIZWFkZXJzIGFyZSBub3QgY29tcGxldGUsIGJ1dCB0aGlzIGVuc3VyZXMgdGhlIGZpbGUgaXMgYXQgdGhlIHJpZ2h0CiAgICAgLy8gcG9zaXRpb24uCi0gICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpXcml0ZUZ1bGx5KGZkXywgJmhlYWRlcl8sIHNpemVvZihoZWFkZXJfKSkpIHsKKyAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OldyaXRlRnVsbHkoZmRfLCAmaGVhZGVyXywgc2l6ZW9mKENvd0hlYWRlcikpKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJ3cml0ZSBmYWlsZWQiOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtMzc0LDIyICsyNjIsMjcgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmIChsc2VlayhmZF8uZ2V0KCksIHNpemVvZihoZWFkZXJfKSArIGhlYWRlcl8uYnVmZmVyX3NpemUsIFNFRUtfU0VUKSA8IDApIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgImxzZWVrIGZhaWxlZCI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KICAgICBJbml0UG9zKCk7CiAgICAgSW5pdEJhdGNoV3JpdGVzKCk7CiAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBDb3dXcml0ZXI6Ok9wZW5Gb3JBcHBlbmQodWludDY0X3QgbGFiZWwpIHsKLSAgICBhdXRvIHJlYWRlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q293UmVhZGVyPigpOwotICAgIHN0ZDo6cXVldWU8Q293T3BlcmF0aW9uPiB0b0FkZDsKK2Jvb2wgQ293V3JpdGVyVjI6Ok9wZW5Gb3JBcHBlbmQodWludDY0X3QgbGFiZWwpIHsKKyAgICBDb3dIZWFkZXJWMyBoZWFkZXJfdjM7CisgICAgaWYgKCFSZWFkQ293SGVhZGVyKGZkXywgJmhlYWRlcl92MykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAotICAgIGlmICghcmVhZGVyLT5QYXJzZShmZF8sIHtsYWJlbH0pIHx8ICFyZWFkZXItPkdldEhlYWRlcigmaGVhZGVyXykpIHsKKyAgICBoZWFkZXJfID0gaGVhZGVyX3YzOworCisgICAgQ293UGFyc2VyVjIgcGFyc2VyOworICAgIGlmICghcGFyc2VyLlBhcnNlKGZkXywgaGVhZGVyX3YzLCB7bGFiZWx9KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChoZWFkZXJfLnByZWZpeC5tYWpvcl92ZXJzaW9uID4gMikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDb3dXcml0ZXJWMiB0cmllZCB0byBvcGVuIGluY29tcGF0aWJsZSB2ZXJzaW9uICIKKyAgICAgICAgICAgICAgICAgICA8PCBoZWFkZXJfLnByZWZpeC5tYWpvcl92ZXJzaW9uOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkBAIC00MDAsMTYgKzI5MywxMCBAQAogICAgIGZvb3Rlcl8ub3AubnVtX29wcyA9IDA7CiAgICAgSW5pdFBvcygpOwogCi0gICAgYXV0byBpdGVyID0gcmVhZGVyLT5HZXRPcEl0ZXIoKTsKLQotICAgIHdoaWxlICghaXRlci0+RG9uZSgpKSB7Ci0gICAgICAgIEFkZE9wZXJhdGlvbihpdGVyLT5HZXQoKSk7Ci0gICAgICAgIGl0ZXItPk5leHQoKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIG9wIDogKnBhcnNlci5nZXRfdjJvcHMoKSkgeworICAgICAgICBBZGRPcGVyYXRpb24ob3ApOwogICAgIH0KIAotICAgIC8vIEZyZWUgcmVhZGVyIHNvIHdlIG93biB0aGUgZGVzY3JpcHRvciBwb3NpdGlvbiBhZ2Fpbi4KLSAgICByZWFkZXIgPSBudWxscHRyOwotCiAgICAgaWYgKGxzZWVrKGZkXy5nZXQoKSwgbmV4dF9vcF9wb3NfLCBTRUVLX1NFVCkgPCAwKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJsc2VlayBmYWlsZWQiOwogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC00MjAsMTEgKzMwNywxMSBAQAogICAgIHJldHVybiBFbWl0Q2x1c3RlcklmTmVlZGVkKCk7CiB9CiAKLWJvb2wgQ293V3JpdGVyOjpFbWl0Q29weSh1aW50NjRfdCBuZXdfYmxvY2ssIHVpbnQ2NF90IG9sZF9ibG9jaywgdWludDY0X3QgbnVtX2Jsb2NrcykgeworYm9vbCBDb3dXcml0ZXJWMjo6RW1pdENvcHkodWludDY0X3QgbmV3X2Jsb2NrLCB1aW50NjRfdCBvbGRfYmxvY2ssIHVpbnQ2NF90IG51bV9ibG9ja3MpIHsKICAgICBDSEVDSyghbWVyZ2VfaW5fcHJvZ3Jlc3NfKTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtX2Jsb2NrczsgaSsrKSB7Ci0gICAgICAgIENvd09wZXJhdGlvbiBvcCA9IHt9OworICAgICAgICBDb3dPcGVyYXRpb25WMiBvcCA9IHt9OwogICAgICAgICBvcC50eXBlID0ga0Nvd0NvcHlPcDsKICAgICAgICAgb3AubmV3X2Jsb2NrID0gbmV3X2Jsb2NrICsgaTsKICAgICAgICAgb3Auc291cmNlID0gb2xkX2Jsb2NrICsgaTsKQEAgLTQzNiwyNSArMzIzLDI3IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgQ293V3JpdGVyOjpFbWl0UmF3QmxvY2tzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIHsKK2Jvb2wgQ293V3JpdGVyVjI6OkVtaXRSYXdCbG9ja3ModWludDY0X3QgbmV3X2Jsb2NrX3N0YXJ0LCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgewogICAgIHJldHVybiBFbWl0QmxvY2tzKG5ld19ibG9ja19zdGFydCwgZGF0YSwgc2l6ZSwgMCwgMCwga0Nvd1JlcGxhY2VPcCk7CiB9CiAKLWJvb2wgQ293V3JpdGVyOjpFbWl0WG9yQmxvY2tzKHVpbnQzMl90IG5ld19ibG9ja19zdGFydCwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBvbGRfYmxvY2ssIHVpbnQxNl90IG9mZnNldCkgeworYm9vbCBDb3dXcml0ZXJWMjo6RW1pdFhvckJsb2Nrcyh1aW50MzJfdCBuZXdfYmxvY2tfc3RhcnQsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBvbGRfYmxvY2ssIHVpbnQxNl90IG9mZnNldCkgewogICAgIHJldHVybiBFbWl0QmxvY2tzKG5ld19ibG9ja19zdGFydCwgZGF0YSwgc2l6ZSwgb2xkX2Jsb2NrLCBvZmZzZXQsIGtDb3dYb3JPcCk7CiB9CiAKLWJvb2wgQ293V3JpdGVyOjpDb21wcmVzc0Jsb2NrcyhzaXplX3QgbnVtX2Jsb2NrcywgY29uc3Qgdm9pZCogZGF0YSkgeworYm9vbCBDb3dXcml0ZXJWMjo6Q29tcHJlc3NCbG9ja3Moc2l6ZV90IG51bV9ibG9ja3MsIGNvbnN0IHZvaWQqIGRhdGEpIHsKICAgICBzaXplX3QgbnVtX3RocmVhZHMgPSAobnVtX2Jsb2NrcyA9PSAxKSA/IDEgOiBudW1fY29tcHJlc3NfdGhyZWFkc187CiAgICAgc2l6ZV90IG51bV9ibG9ja3NfcGVyX3RocmVhZCA9IG51bV9ibG9ja3MgLyBudW1fdGhyZWFkczsKICAgICBjb25zdCB1aW50OF90KiBpdGVyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oZGF0YSk7CiAgICAgY29tcHJlc3NlZF9idWZfLmNsZWFyKCk7CiAgICAgaWYgKG51bV90aHJlYWRzIDw9IDEpIHsKLSAgICAgICAgcmV0dXJuIENvbXByZXNzV29ya2VyOjpDb21wcmVzc0Jsb2Nrcyhjb21wcmVzc2lvbl8sIG9wdGlvbnNfLmJsb2NrX3NpemUsIGRhdGEsIG51bV9ibG9ja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzZWRfYnVmXyk7CisgICAgICAgIGlmICghY29tcHJlc3Nvcl8pIHsKKyAgICAgICAgICAgIGNvbXByZXNzb3JfID0gSUNvbXByZXNzb3I6OkNyZWF0ZShjb21wcmVzc2lvbl8sIGhlYWRlcl8uYmxvY2tfc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIENvbXByZXNzV29ya2VyOjpDb21wcmVzc0Jsb2Nrcyhjb21wcmVzc29yXy5nZXQoKSwgb3B0aW9uc18uYmxvY2tfc2l6ZSwgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fYmxvY2tzLCAmY29tcHJlc3NlZF9idWZfKTsKICAgICB9Ci0KICAgICAvLyBTdWJtaXQgdGhlIGJsb2NrcyBwZXIgdGhyZWFkLiBUaGUgcmV0cmlldmFsIG9mCiAgICAgLy8gY29tcHJlc3NlZCBidWZmZXJzIGhhcyB0byBiZSBkb25lIGluIHRoZSBzYW1lIG9yZGVyLgogICAgIC8vIFdlIHNob3VsZCBub3QgcG9sbCBmb3IgY29tcGxldGVkIGJ1ZmZlcnMgaW4gYSBkaWZmZXJlbnQgb3JkZXIgYXMgdGhlCkBAIC00NjQsNyArMzUzLDcgQEAKICAgICAgICAgaWYgKGkgPT0gbnVtX3RocmVhZHMgLSAxKSB7CiAgICAgICAgICAgICBudW1fYmxvY2tzX3Blcl90aHJlYWQgPSBudW1fYmxvY2tzOwogICAgICAgICB9Ci0gICAgICAgIHdvcmtlci0+RW5xdWV1ZUNvbXByZXNzQmxvY2tzKGl0ZXIsIG51bV9ibG9ja3NfcGVyX3RocmVhZCk7CisgICAgICAgIHdvcmtlci0+RW5xdWV1ZUNvbXByZXNzQmxvY2tzKGl0ZXIsIGhlYWRlcl8uYmxvY2tfc2l6ZSwgbnVtX2Jsb2Nrc19wZXJfdGhyZWFkKTsKICAgICAgICAgaXRlciArPSAobnVtX2Jsb2Nrc19wZXJfdGhyZWFkICogaGVhZGVyXy5ibG9ja19zaXplKTsKICAgICAgICAgbnVtX2Jsb2NrcyAtPSBudW1fYmxvY2tzX3Blcl90aHJlYWQ7CiAgICAgfQpAQCAtNDc5LDggKzM2OCw4IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgQ293V3JpdGVyOjpFbWl0QmxvY2tzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBvbGRfYmxvY2ssIHVpbnQxNl90IG9mZnNldCwgdWludDhfdCB0eXBlKSB7Citib29sIENvd1dyaXRlclYyOjpFbWl0QmxvY2tzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IG9sZF9ibG9jaywgdWludDE2X3Qgb2Zmc2V0LCBDb3dPcGVyYXRpb25UeXBlIHR5cGUpIHsKICAgICBDSEVDSyghbWVyZ2VfaW5fcHJvZ3Jlc3NfKTsKICAgICBjb25zdCB1aW50OF90KiBpdGVyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oZGF0YSk7CiAKQEAgLTQ5Nyw3ICszODYsNyBAQAogICAgIHdoaWxlIChudW1fYmxvY2tzKSB7CiAgICAgICAgIHNpemVfdCBwZW5kaW5nX2Jsb2NrcyA9IChzdGQ6Om1pbihrUHJvY2Vzc2luZ0Jsb2NrcywgbnVtX2Jsb2NrcykpOwogCi0gICAgICAgIGlmIChjb21wcmVzc2lvbl8gJiYgbnVtX2NvbXByZXNzX3RocmVhZHNfID4gMSkgeworICAgICAgICBpZiAoY29tcHJlc3Npb25fLmFsZ29yaXRobSAmJiBudW1fY29tcHJlc3NfdGhyZWFkc18gPiAxKSB7CiAgICAgICAgICAgICBpZiAoIUNvbXByZXNzQmxvY2tzKHBlbmRpbmdfYmxvY2tzLCBpdGVyKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KQEAgLTUwOCw3ICszOTcsNyBAQAogICAgICAgICBudW1fYmxvY2tzIC09IHBlbmRpbmdfYmxvY2tzOwogCiAgICAgICAgIHdoaWxlIChpIDwgc2l6ZSAvIGhlYWRlcl8uYmxvY2tfc2l6ZSAmJiBwZW5kaW5nX2Jsb2NrcykgewotICAgICAgICAgICAgQ293T3BlcmF0aW9uIG9wID0ge307CisgICAgICAgICAgICBDb3dPcGVyYXRpb25WMiBvcCA9IHt9OwogICAgICAgICAgICAgb3AubmV3X2Jsb2NrID0gbmV3X2Jsb2NrX3N0YXJ0ICsgaTsKICAgICAgICAgICAgIG9wLnR5cGUgPSB0eXBlOwogICAgICAgICAgICAgaWYgKHR5cGUgPT0ga0Nvd1hvck9wKSB7CkBAIC01MTcsMTkgKzQwNiwyMiBAQAogICAgICAgICAgICAgICAgIG9wLnNvdXJjZSA9IG5leHRfZGF0YV9wb3NfOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoY29tcHJlc3Npb25fKSB7CisgICAgICAgICAgICBpZiAoY29tcHJlc3Npb25fLmFsZ29yaXRobSkgewogICAgICAgICAgICAgICAgIGF1dG8gZGF0YSA9IFsmLCB0aGlzXSgpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG51bV9jb21wcmVzc190aHJlYWRzXyA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gZGF0YSA9IHN0ZDo6bW92ZSgqYnVmX2l0ZXJfKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9pdGVyXysrOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGRhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc1dvcmtlcjo6Q29tcHJlc3MoY29tcHJlc3Npb25fLCBpdGVyLCBoZWFkZXJfLmJsb2NrX3NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb21wcmVzc29yXykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzb3JfID0gSUNvbXByZXNzb3I6OkNyZWF0ZShjb21wcmVzc2lvbl8sIGhlYWRlcl8uYmxvY2tfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gZGF0YSA9IGNvbXByZXNzb3JfLT5Db21wcmVzcyhpdGVyLCBoZWFkZXJfLmJsb2NrX3NpemUpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9KCk7Ci0gICAgICAgICAgICAgICAgb3AuY29tcHJlc3Npb24gPSBjb21wcmVzc2lvbl87CisgICAgICAgICAgICAgICAgb3AuY29tcHJlc3Npb24gPSBjb21wcmVzc2lvbl8uYWxnb3JpdGhtOwogICAgICAgICAgICAgICAgIG9wLmRhdGFfbGVuZ3RoID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGRhdGEuc2l6ZSgpKTsKIAogICAgICAgICAgICAgICAgIGlmICghV3JpdGVPcGVyYXRpb24ob3AsIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSkpIHsKQEAgLTU1NCwxMCArNDQ2LDEwIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgQ293V3JpdGVyOjpFbWl0WmVyb0Jsb2Nrcyh1aW50NjRfdCBuZXdfYmxvY2tfc3RhcnQsIHVpbnQ2NF90IG51bV9ibG9ja3MpIHsKK2Jvb2wgQ293V3JpdGVyVjI6OkVtaXRaZXJvQmxvY2tzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgdWludDY0X3QgbnVtX2Jsb2NrcykgewogICAgIENIRUNLKCFtZXJnZV9pbl9wcm9ncmVzc18pOwogICAgIGZvciAodWludDY0X3QgaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspIHsKLSAgICAgICAgQ293T3BlcmF0aW9uIG9wID0ge307CisgICAgICAgIENvd09wZXJhdGlvblYyIG9wID0ge307CiAgICAgICAgIG9wLnR5cGUgPSBrQ293WmVyb09wOwogICAgICAgICBvcC5uZXdfYmxvY2sgPSBuZXdfYmxvY2tfc3RhcnQgKyBpOwogICAgICAgICBvcC5zb3VyY2UgPSAwOwpAQCAtNTY2LDIwICs0NTgsMjAgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBDb3dXcml0ZXI6OkVtaXRMYWJlbCh1aW50NjRfdCBsYWJlbCkgeworYm9vbCBDb3dXcml0ZXJWMjo6RW1pdExhYmVsKHVpbnQ2NF90IGxhYmVsKSB7CiAgICAgQ0hFQ0soIW1lcmdlX2luX3Byb2dyZXNzXyk7Ci0gICAgQ293T3BlcmF0aW9uIG9wID0ge307CisgICAgQ293T3BlcmF0aW9uVjIgb3AgPSB7fTsKICAgICBvcC50eXBlID0ga0Nvd0xhYmVsT3A7CiAgICAgb3Auc291cmNlID0gbGFiZWw7CiAgICAgcmV0dXJuIFdyaXRlT3BlcmF0aW9uKG9wKSAmJiBTeW5jKCk7CiB9CiAKLWJvb2wgQ293V3JpdGVyOjpFbWl0U2VxdWVuY2VEYXRhKHNpemVfdCBudW1fb3BzLCBjb25zdCB1aW50MzJfdCogZGF0YSkgeworYm9vbCBDb3dXcml0ZXJWMjo6RW1pdFNlcXVlbmNlRGF0YShzaXplX3QgbnVtX29wcywgY29uc3QgdWludDMyX3QqIGRhdGEpIHsKICAgICBDSEVDSyghbWVyZ2VfaW5fcHJvZ3Jlc3NfKTsKICAgICBzaXplX3QgdG9fYWRkID0gMDsKICAgICBzaXplX3QgbWF4X29wcyA9IChoZWFkZXJfLmJsb2NrX3NpemUgKiAyKSAvIHNpemVvZih1aW50MzJfdCk7CiAgICAgd2hpbGUgKG51bV9vcHMgPiAwKSB7Ci0gICAgICAgIENvd09wZXJhdGlvbiBvcCA9IHt9OworICAgICAgICBDb3dPcGVyYXRpb25WMiBvcCA9IHt9OwogICAgICAgICBvcC50eXBlID0ga0Nvd1NlcXVlbmNlT3A7CiAgICAgICAgIG9wLnNvdXJjZSA9IG5leHRfZGF0YV9wb3NfOwogICAgICAgICB0b19hZGQgPSBzdGQ6Om1pbihudW1fb3BzLCBtYXhfb3BzKTsKQEAgLTU5NCwzNCArNDg2LDIzIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgQ293V3JpdGVyOjpFbWl0Q2x1c3RlcigpIHsKLSAgICBDb3dPcGVyYXRpb24gb3AgPSB7fTsKK2Jvb2wgQ293V3JpdGVyVjI6OkVtaXRDbHVzdGVyKCkgeworICAgIENvd09wZXJhdGlvblYyIG9wID0ge307CiAgICAgb3AudHlwZSA9IGtDb3dDbHVzdGVyT3A7CiAgICAgLy8gTmV4dCBjbHVzdGVyIHN0YXJ0cyBhZnRlciByZW1haW5kZXIgb2YgY3VycmVudCBjbHVzdGVyIGFuZCB0aGUgbmV4dCBkYXRhIGJsb2NrLgotICAgIG9wLnNvdXJjZSA9IGN1cnJlbnRfZGF0YV9zaXplXyArIGNsdXN0ZXJfc2l6ZV8gLSBjdXJyZW50X2NsdXN0ZXJfc2l6ZV8gLSBzaXplb2YoQ293T3BlcmF0aW9uKTsKKyAgICBvcC5zb3VyY2UgPSBjdXJyZW50X2RhdGFfc2l6ZV8gKyBjbHVzdGVyX3NpemVfIC0gY3VycmVudF9jbHVzdGVyX3NpemVfIC0gc2l6ZW9mKENvd09wZXJhdGlvblYyKTsKICAgICByZXR1cm4gV3JpdGVPcGVyYXRpb24ob3ApOwogfQogCi1ib29sIENvd1dyaXRlcjo6RW1pdENsdXN0ZXJJZk5lZWRlZCgpIHsKK2Jvb2wgQ293V3JpdGVyVjI6OkVtaXRDbHVzdGVySWZOZWVkZWQoKSB7CiAgICAgLy8gSWYgdGhlcmUgaXNuJ3Qgcm9vbSBmb3IgYW5vdGhlciBvcCBhbmQgdGhlIGNsdXN0ZXIgZW5kIG9wLCBlbmQgdGhlIGN1cnJlbnQgY2x1c3RlcgotICAgIGlmIChjbHVzdGVyX3NpemVfICYmIGNsdXN0ZXJfc2l6ZV8gPCBjdXJyZW50X2NsdXN0ZXJfc2l6ZV8gKyAyICogc2l6ZW9mKENvd09wZXJhdGlvbikpIHsKKyAgICBpZiAoY2x1c3Rlcl9zaXplXyAmJiBjbHVzdGVyX3NpemVfIDwgY3VycmVudF9jbHVzdGVyX3NpemVfICsgMiAqIHNpemVvZihDb3dPcGVyYXRpb25WMikpIHsKICAgICAgICAgaWYgKCFFbWl0Q2x1c3RlcigpKSByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiB0cnVlOwogfQogCi0vLyBUT0RPOiBGaXggY29tcGlsYXRpb24gaXNzdWVzIHdoZW4gbGlua2luZyBsaWJjcnlwdG8gbGlicmFyeQotLy8gd2hlbiBzbmFwdXNlcmQgaXMgY29tcGlsZWQgYXMgcGFydCBvZiByYW1kaXNrLgotc3RhdGljIHZvaWQgU0hBMjU2KGNvbnN0IHZvaWQqLCBzaXplX3QsIHVpbnQ4X3RbXSkgewotI2lmIDAKLSAgICBTSEEyNTZfQ1RYIGM7Ci0gICAgU0hBMjU2X0luaXQoJmMpOwotICAgIFNIQTI1Nl9VcGRhdGUoJmMsIGRhdGEsIGxlbmd0aCk7Ci0gICAgU0hBMjU2X0ZpbmFsKG91dCwgJmMpOwotI2VuZGlmCi19Ci0KLWJvb2wgQ293V3JpdGVyOjpGaW5hbGl6ZSgpIHsKK2Jvb2wgQ293V3JpdGVyVjI6OkZpbmFsaXplKCkgewogICAgIGlmICghRmx1c2hDbHVzdGVyKCkpIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmluYWxpemU6IEZsdXNoQ2x1c3RlcigpIGZhaWxlZCI7CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTY0OSwyMiArNTMwLDIwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBGb290ZXIgc2hvdWxkIGJlIGF0IHRoZSBlbmQgb2YgYSBmaWxlLCBzbyBpZiB0aGVyZSBpcyBkYXRhIGFmdGVyIHRoZSBjdXJyZW50IGJsb2NrLCBlbmQgaXQKLSAgICAvLyBhbmQgc3RhcnQgYSBuZXcgY2x1c3Rlci4KKyAgICAvLyBGb290ZXIgc2hvdWxkIGJlIGF0IHRoZSBlbmQgb2YgYSBmaWxlLCBzbyBpZiB0aGVyZSBpcyBkYXRhIGFmdGVyIHRoZSBjdXJyZW50IGJsb2NrLCBlbmQKKyAgICAvLyBpdCBhbmQgc3RhcnQgYSBuZXcgY2x1c3Rlci4KICAgICBpZiAoY2x1c3Rlcl9zaXplXyAmJiBjdXJyZW50X2RhdGFfc2l6ZV8gPiAwKSB7CiAgICAgICAgIEVtaXRDbHVzdGVyKCk7CiAgICAgICAgIGV4dHJhX2NsdXN0ZXIgPSB0cnVlOwogICAgIH0KIAotICAgIGZvb3Rlcl8ub3Aub3BzX3NpemUgPSBmb290ZXJfLm9wLm51bV9vcHMgKiBzaXplb2YoQ293T3BlcmF0aW9uKTsKKyAgICBmb290ZXJfLm9wLm9wc19zaXplID0gZm9vdGVyXy5vcC5udW1fb3BzICogc2l6ZW9mKENvd09wZXJhdGlvblYyKTsKICAgICBpZiAobHNlZWsoZmRfLmdldCgpLCBuZXh0X29wX3Bvc18sIFNFRUtfU0VUKSA8IDApIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBzZWVrIHRvIGZvb3RlciBwb3NpdGlvbi4iOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIG1lbXNldCgmZm9vdGVyXy5kYXRhLm9wc19jaGVja3N1bSwgMCwgc2l6ZW9mKHVpbnQ4X3QpICogMzIpOwotICAgIG1lbXNldCgmZm9vdGVyXy5kYXRhLmZvb3Rlcl9jaGVja3N1bSwgMCwgc2l6ZW9mKHVpbnQ4X3QpICogMzIpOworICAgIG1lbXNldCgmZm9vdGVyXy51bnVzZWQsIDAsIHNpemVvZihmb290ZXJfLnVudXNlZCkpOwogCi0gICAgU0hBMjU2KCZmb290ZXJfLm9wLCBzaXplb2YoZm9vdGVyXy5vcCksIGZvb3Rlcl8uZGF0YS5mb290ZXJfY2hlY2tzdW0pOwogICAgIC8vIFdyaXRlIG91dCBmb290ZXIgYXQgZW5kIG9mIGZpbGUKICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OldyaXRlRnVsbHkoZmRfLCByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPigmZm9vdGVyXyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihmb290ZXJfKSkpIHsKQEAgLTY5NywxNSArNTc2LDE3IEBACiAgICAgcmV0dXJuIFN5bmMoKTsKIH0KIAotdWludDY0X3QgQ293V3JpdGVyOjpHZXRDb3dTaXplKCkgeworQ293U2l6ZUluZm8gQ293V3JpdGVyVjI6OkdldENvd1NpemVJbmZvKCkgY29uc3QgeworICAgIENvd1NpemVJbmZvIGluZm87CiAgICAgaWYgKGN1cnJlbnRfZGF0YV9zaXplXyA+IDApIHsKLSAgICAgICAgcmV0dXJuIG5leHRfZGF0YV9wb3NfICsgc2l6ZW9mKGZvb3Rlcl8pOworICAgICAgICBpbmZvLmNvd19zaXplID0gbmV4dF9kYXRhX3Bvc18gKyBzaXplb2YoZm9vdGVyXyk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG5leHRfb3BfcG9zXyArIHNpemVvZihmb290ZXJfKTsKKyAgICAgICAgaW5mby5jb3dfc2l6ZSA9IG5leHRfb3BfcG9zXyArIHNpemVvZihmb290ZXJfKTsKICAgICB9CisgICAgcmV0dXJuIGluZm87CiB9CiAKLWJvb2wgQ293V3JpdGVyOjpHZXREYXRhUG9zKHVpbnQ2NF90KiBwb3MpIHsKK2Jvb2wgQ293V3JpdGVyVjI6OkdldERhdGFQb3ModWludDY0X3QqIHBvcykgewogICAgIG9mZl90IG9mZnMgPSBsc2VlayhmZF8uZ2V0KCksIDAsIFNFRUtfQ1VSKTsKICAgICBpZiAob2ZmcyA8IDApIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgImxzZWVrIGZhaWxlZCI7CkBAIC03MTUsNyArNTk2LDcgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBDb3dXcml0ZXI6OkVuc3VyZVNwYWNlQXZhaWxhYmxlKGNvbnN0IHVpbnQ2NF90IGJ5dGVzX25lZWRlZCkgY29uc3QgeworYm9vbCBDb3dXcml0ZXJWMjo6RW5zdXJlU3BhY2VBdmFpbGFibGUoY29uc3QgdWludDY0X3QgYnl0ZXNfbmVlZGVkKSBjb25zdCB7CiAgICAgaWYgKGJ5dGVzX25lZWRlZCA+IGNvd19pbWFnZV9zaXplXykgewogICAgICAgICBMT0coRVJST1IpIDw8ICJObyBzcGFjZSBsZWZ0IG9uIENPVyBkZXZpY2UuIFJlcXVpcmVkOiAiIDw8IGJ5dGVzX25lZWRlZAogICAgICAgICAgICAgICAgICAgIDw8ICIsIGF2YWlsYWJsZTogIiA8PCBjb3dfaW1hZ2Vfc2l6ZV87CkBAIC03MjUsMTQgKzYwNiwxNCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIENvd1dyaXRlcjo6Rmx1c2hDbHVzdGVyKCkgeworYm9vbCBDb3dXcml0ZXJWMjo6Rmx1c2hDbHVzdGVyKCkgewogICAgIHNzaXplX3QgcmV0OwogCiAgICAgaWYgKG9wX3ZlY19pbmRleF8pIHsKICAgICAgICAgcmV0ID0gcHdyaXRldihmZF8uZ2V0KCksIGNvd29wX3ZlY18uZ2V0KCksIG9wX3ZlY19pbmRleF8sIGN1cnJlbnRfb3BfcG9zXyk7Ci0gICAgICAgIGlmIChyZXQgIT0gKG9wX3ZlY19pbmRleF8gKiBzaXplb2YoQ293T3BlcmF0aW9uKSkpIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJwd3JpdGV2IGZhaWxlZCBmb3IgQ293T3BlcmF0aW9uLiBFeHBlY3RlZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgPDwgKG9wX3ZlY19pbmRleF8gKiBzaXplb2YoQ293T3BlcmF0aW9uKSk7CisgICAgICAgIGlmIChyZXQgIT0gKG9wX3ZlY19pbmRleF8gKiBzaXplb2YoQ293T3BlcmF0aW9uVjIpKSkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgInB3cml0ZXYgZmFpbGVkIGZvciBDb3dPcGVyYXRpb25WMi4gRXhwZWN0ZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IChvcF92ZWNfaW5kZXhfICogc2l6ZW9mKENvd09wZXJhdGlvblYyKSk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CkBAIC03NTQsMTcgKzYzNSwxNiBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIENvd1dyaXRlcjo6V3JpdGVPcGVyYXRpb24oY29uc3QgQ293T3BlcmF0aW9uJiBvcCwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBpZiAoIUVuc3VyZVNwYWNlQXZhaWxhYmxlKG5leHRfb3BfcG9zXyArIHNpemVvZihvcCkpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKCFFbnN1cmVTcGFjZUF2YWlsYWJsZShuZXh0X2RhdGFfcG9zXyArIHNpemUpKSB7Citib29sIENvd1dyaXRlclYyOjpXcml0ZU9wZXJhdGlvbihjb25zdCBDb3dPcGVyYXRpb25WMiYgb3AsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKCFFbnN1cmVTcGFjZUF2YWlsYWJsZShuZXh0X29wX3Bvc18gKyBzaXplb2Yob3ApKSB8fAorICAgICAgICAhRW5zdXJlU3BhY2VBdmFpbGFibGUobmV4dF9kYXRhX3Bvc18gKyBzaXplKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgaWYgKGJhdGNoX3dyaXRlXykgewotICAgICAgICBDb3dPcGVyYXRpb24qIGNvd19vcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q293T3BlcmF0aW9uKj4oY293b3BfdmVjX1tvcF92ZWNfaW5kZXhfXS5pb3ZfYmFzZSk7Ci0gICAgICAgIHN0ZDo6bWVtY3B5KGNvd19vcCwgJm9wLCBzaXplb2YoQ293T3BlcmF0aW9uKSk7CisgICAgICAgIENvd09wZXJhdGlvblYyKiBjb3dfb3AgPQorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Q293T3BlcmF0aW9uVjIqPihjb3dvcF92ZWNfW29wX3ZlY19pbmRleF9dLmlvdl9iYXNlKTsKKyAgICAgICAgc3RkOjptZW1jcHkoY293X29wLCAmb3AsIHNpemVvZihDb3dPcGVyYXRpb25WMikpOwogICAgICAgICBvcF92ZWNfaW5kZXhfICs9IDE7CiAKICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbHB0ciAmJiBzaXplID4gMCkgewpAQCAtODAyLDcgKzY4Miw3IEBACiAgICAgcmV0dXJuIEVtaXRDbHVzdGVySWZOZWVkZWQoKTsKIH0KIAotdm9pZCBDb3dXcml0ZXI6OkFkZE9wZXJhdGlvbihjb25zdCBDb3dPcGVyYXRpb24mIG9wKSB7Cit2b2lkIENvd1dyaXRlclYyOjpBZGRPcGVyYXRpb24oY29uc3QgQ293T3BlcmF0aW9uVjImIG9wKSB7CiAgICAgZm9vdGVyXy5vcC5udW1fb3BzKys7CiAKICAgICBpZiAob3AudHlwZSA9PSBrQ293Q2x1c3Rlck9wKSB7CkBAIC04MTQsMjggKzY5NCwxNyBAQAogICAgIH0KIAogICAgIG5leHRfZGF0YV9wb3NfICs9IG9wLmRhdGFfbGVuZ3RoICsgR2V0TmV4dERhdGFPZmZzZXQob3AsIGhlYWRlcl8uY2x1c3Rlcl9vcHMpOwotICAgIG5leHRfb3BfcG9zXyArPSBzaXplb2YoQ293T3BlcmF0aW9uKSArIEdldE5leHRPcE9mZnNldChvcCwgaGVhZGVyXy5jbHVzdGVyX29wcyk7CisgICAgbmV4dF9vcF9wb3NfICs9IHNpemVvZihDb3dPcGVyYXRpb25WMikgKyBHZXROZXh0T3BPZmZzZXQob3AsIGhlYWRlcl8uY2x1c3Rlcl9vcHMpOwogfQogCi1ib29sIENvd1dyaXRlcjo6V3JpdGVSYXdEYXRhKGNvbnN0IHZvaWQqIGRhdGEsIGNvbnN0IHNpemVfdCBzaXplKSB7Citib29sIENvd1dyaXRlclYyOjpXcml0ZVJhd0RhdGEoY29uc3Qgdm9pZCogZGF0YSwgY29uc3Qgc2l6ZV90IHNpemUpIHsKICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OldyaXRlRnVsbHlBdE9mZnNldChmZF8sIGRhdGEsIHNpemUsIG5leHRfZGF0YV9wb3NfKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIENvd1dyaXRlcjo6U3luYygpIHsKLSAgICBpZiAoaXNfZGV2X251bGxfKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpZiAoZnN5bmMoZmRfLmdldCgpKSA8IDApIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgImZzeW5jIGZhaWxlZCI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ293V3JpdGVyOjpUcnVuY2F0ZShvZmZfdCBsZW5ndGgpIHsKK2Jvb2wgQ293V3JpdGVyVjI6OlRydW5jYXRlKG9mZl90IGxlbmd0aCkgewogICAgIGlmIChpc19kZXZfbnVsbF8gfHwgaXNfYmxvY2tfZGV2aWNlXykgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L3dyaXRlcl92Mi5oIGIvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy93cml0ZXJfdjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTM3YWE3Ci0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy93cml0ZXJfdjIuaApAQCAtMCwwICsxLDk4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxmdXR1cmU+CisjaW5jbHVkZSAid3JpdGVyX2Jhc2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHNuYXBzaG90IHsKKworY2xhc3MgQ293V3JpdGVyVjIgOiBwdWJsaWMgQ293V3JpdGVyQmFzZSB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBDb3dXcml0ZXJWMihjb25zdCBDb3dPcHRpb25zJiBvcHRpb25zLCBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQmJiBmZCk7CisgICAgfkNvd1dyaXRlclYyKCkgb3ZlcnJpZGU7CisKKyAgICBib29sIEluaXRpYWxpemUoc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gbGFiZWwgPSB7fSkgb3ZlcnJpZGU7CisgICAgYm9vbCBGaW5hbGl6ZSgpIG92ZXJyaWRlOworICAgIENvd1NpemVJbmZvIEdldENvd1NpemVJbmZvKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgYm9vbCBFbWl0Q29weSh1aW50NjRfdCBuZXdfYmxvY2ssIHVpbnQ2NF90IG9sZF9ibG9jaywgdWludDY0X3QgbnVtX2Jsb2NrcyA9IDEpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBFbWl0UmF3QmxvY2tzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBFbWl0WG9yQmxvY2tzKHVpbnQzMl90IG5ld19ibG9ja19zdGFydCwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2xkX2Jsb2NrLCB1aW50MTZfdCBvZmZzZXQpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBFbWl0WmVyb0Jsb2Nrcyh1aW50NjRfdCBuZXdfYmxvY2tfc3RhcnQsIHVpbnQ2NF90IG51bV9ibG9ja3MpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBFbWl0TGFiZWwodWludDY0X3QgbGFiZWwpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBFbWl0U2VxdWVuY2VEYXRhKHNpemVfdCBudW1fb3BzLCBjb25zdCB1aW50MzJfdCogZGF0YSkgb3ZlcnJpZGU7CisKKyAgcHJpdmF0ZToKKyAgICBib29sIEVtaXRDbHVzdGVyKCk7CisgICAgYm9vbCBFbWl0Q2x1c3RlcklmTmVlZGVkKCk7CisgICAgYm9vbCBFbWl0QmxvY2tzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUsIHVpbnQ2NF90IG9sZF9ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgb2Zmc2V0LCBDb3dPcGVyYXRpb25UeXBlIHR5cGUpOworICAgIHZvaWQgU2V0dXBIZWFkZXJzKCk7CisgICAgdm9pZCBTZXR1cFdyaXRlT3B0aW9ucygpOworICAgIGJvb2wgUGFyc2VPcHRpb25zKCk7CisgICAgYm9vbCBPcGVuRm9yV3JpdGUoKTsKKyAgICBib29sIE9wZW5Gb3JBcHBlbmQodWludDY0X3QgbGFiZWwpOworICAgIGJvb2wgR2V0RGF0YVBvcyh1aW50NjRfdCogcG9zKTsKKyAgICBib29sIFdyaXRlUmF3RGF0YShjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgYm9vbCBXcml0ZU9wZXJhdGlvbihjb25zdCBDb3dPcGVyYXRpb25WMiYgb3AsIGNvbnN0IHZvaWQqIGRhdGEgPSBudWxscHRyLCBzaXplX3Qgc2l6ZSA9IDApOworICAgIHZvaWQgQWRkT3BlcmF0aW9uKGNvbnN0IENvd09wZXJhdGlvblYyJiBvcCk7CisgICAgdm9pZCBJbml0UG9zKCk7CisgICAgdm9pZCBJbml0QmF0Y2hXcml0ZXMoKTsKKyAgICB2b2lkIEluaXRXb3JrZXJzKCk7CisgICAgYm9vbCBGbHVzaENsdXN0ZXIoKTsKKworICAgIGJvb2wgQ29tcHJlc3NCbG9ja3Moc2l6ZV90IG51bV9ibG9ja3MsIGNvbnN0IHZvaWQqIGRhdGEpOworICAgIGJvb2wgVHJ1bmNhdGUob2ZmX3QgbGVuZ3RoKTsKKyAgICBib29sIEVuc3VyZVNwYWNlQXZhaWxhYmxlKGNvbnN0IHVpbnQ2NF90IGJ5dGVzX25lZWRlZCkgY29uc3Q7CisKKyAgcHJpdmF0ZToKKyAgICBDb3dGb290ZXIgZm9vdGVyX3t9OworICAgIENvd0hlYWRlciBoZWFkZXJfe307CisgICAgQ293Q29tcHJlc3Npb24gY29tcHJlc3Npb25fOworICAgIC8vIGluIHRoZSBjYXNlIHRoYXQgd2UgYXJlIHVzaW5nIG9uZSB0aHJlYWQgZm9yIGNvbXByZXNzaW9uLCB3ZSBjYW4gc3RvcmUgYW5kIHJlLXVzZSB0aGUgc2FtZQorICAgIC8vIGNvbXByZXNzb3IKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SUNvbXByZXNzb3I+IGNvbXByZXNzb3JfOworICAgIHVpbnQ2NF90IGN1cnJlbnRfb3BfcG9zXyA9IDA7CisgICAgdWludDY0X3QgbmV4dF9vcF9wb3NfID0gMDsKKyAgICB1aW50NjRfdCBuZXh0X2RhdGFfcG9zXyA9IDA7CisgICAgdWludDY0X3QgY3VycmVudF9kYXRhX3Bvc18gPSAwOworICAgIHNzaXplX3QgdG90YWxfZGF0YV93cml0dGVuXyA9IDA7CisgICAgdWludDMyX3QgY2x1c3Rlcl9zaXplXyA9IDA7CisgICAgdWludDMyX3QgY3VycmVudF9jbHVzdGVyX3NpemVfID0gMDsKKyAgICB1aW50NjRfdCBjdXJyZW50X2RhdGFfc2l6ZV8gPSAwOworICAgIGJvb2wgbWVyZ2VfaW5fcHJvZ3Jlc3NfID0gZmFsc2U7CisKKyAgICBpbnQgbnVtX2NvbXByZXNzX3RocmVhZHNfID0gMTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q29tcHJlc3NXb3JrZXI+PiBjb21wcmVzc190aHJlYWRzXzsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OmZ1dHVyZTxib29sPj4gdGhyZWFkc187CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8dWludDhfdD4+IGNvbXByZXNzZWRfYnVmXzsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj46Oml0ZXJhdG9yIGJ1Zl9pdGVyXzsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDb3dPcGVyYXRpb25WMj4+IG9wYnVmZmVyX3ZlY187CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4+IGRhdGFidWZmZXJfdmVjXzsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8c3RydWN0IGlvdmVjW10+IGNvd29wX3ZlY187CisgICAgaW50IG9wX3ZlY19pbmRleF8gPSAwOworCisgICAgc3RkOjp1bmlxdWVfcHRyPHN0cnVjdCBpb3ZlY1tdPiBkYXRhX3ZlY187CisgICAgaW50IGRhdGFfdmVjX2luZGV4XyA9IDA7CisgICAgYm9vbCBiYXRjaF93cml0ZV8gPSBmYWxzZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvd3JpdGVyX3YzLmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvd3JpdGVyX3YzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTE3ZWM5Ci0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy93cml0ZXJfdjMuY3BwCkBAIC0wLDAgKzEsNzY4IEBACisvLworLy8gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlX2luZm8gUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy8vCisKKyNpbmNsdWRlICJ3cml0ZXJfdjMuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcGFyc2VpbnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgorI2luY2x1ZGUgPGJyb3RsaS9lbmNvZGUuaD4KKyNpbmNsdWRlIDxsaWJzbmFwc2hvdC9jb3dfZm9ybWF0Lmg+CisjaW5jbHVkZSA8bGlic25hcHNob3QvY293X3JlYWRlci5oPgorI2luY2x1ZGUgPGxpYnNuYXBzaG90L2Nvd193cml0ZXIuaD4KKyNpbmNsdWRlIDxsejQuaD4KKyNpbmNsdWRlIDx6bGliLmg+CisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGxpYnNuYXBzaG90L2Nvd19jb21wcmVzcy5oPgorI2luY2x1ZGUgPGxpYnNuYXBzaG90X2Nvdy9wYXJzZXJfdjMuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPHN0b3JhZ2VfbGl0ZXJhbHMvc3RvcmFnZV9saXRlcmFscy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPG51bWVyaWM+CisKKy8vIFRoZSBpbmZvIG1lc3NhZ2VzIGhlcmUgYXJlIHNwYW1teSwgYnV0IGFzIHVzZWZ1bCBmb3IgdXBkYXRlX2VuZ2luZS4gRGlzYWJsZQorLy8gdGhlbSB3aGVuIHJ1bm5pbmcgb24gdGhlIGhvc3QuCisjaWZkZWYgX19BTkRST0lEX18KKyNkZWZpbmUgTE9HX0lORk8gTE9HKElORk8pCisjZWxzZQorI2RlZmluZSBMT0dfSU5GTyBMT0coVkVSQk9TRSkKKyNlbmRpZgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugc25hcHNob3QgeworCitzdGF0aWNfYXNzZXJ0KHNpemVvZihvZmZfdCkgPT0gc2l6ZW9mKHVpbnQ2NF90KSk7CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpzdG9yYWdlX2xpdGVyYWxzOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOworCisvLyBEaXZpZGUgfHh8IGJ5IHx5fCBhbmQgcm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci4KK2NvbnN0ZXhwciB1aW50NjRfdCBEaXZSb3VuZFVwKHVpbnQ2NF90IHgsIHVpbnQ2NF90IHkpIHsKKyAgICByZXR1cm4gKHggKyB5IC0gMSkgLyB5OworfQorCitDb3dXcml0ZXJWMzo6Q293V3JpdGVyVjMoY29uc3QgQ293T3B0aW9ucyYgb3B0aW9ucywgdW5pcXVlX2ZkJiYgZmQpCisgICAgOiBDb3dXcml0ZXJCYXNlKG9wdGlvbnMsIHN0ZDo6bW92ZShmZCkpLCBiYXRjaF9zaXplXyhzdGQ6Om1heDxzaXplX3Q+KG9wdGlvbnMuY2x1c3Rlcl9vcHMsIDEpKSB7CisgICAgU2V0dXBIZWFkZXJzKCk7Cit9CisKK3ZvaWQgQ293V3JpdGVyVjM6OkluaXRXb3JrZXJzKCkgeworICAgIGlmIChudW1fY29tcHJlc3NfdGhyZWFkc18gPD0gMSkgeworICAgICAgICBMT0dfSU5GTyA8PCAiTm90IGNyZWF0aW5nIG5ldyB0aHJlYWRzIGZvciBjb21wcmVzc2lvbi4iOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNvbXByZXNzX3RocmVhZHNfLnJlc2VydmUobnVtX2NvbXByZXNzX3RocmVhZHNfKTsKKyAgICBjb21wcmVzc190aHJlYWRzXy5jbGVhcigpOworICAgIHRocmVhZHNfLnJlc2VydmUobnVtX2NvbXByZXNzX3RocmVhZHNfKTsKKyAgICB0aHJlYWRzXy5jbGVhcigpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtX2NvbXByZXNzX3RocmVhZHNfOyBpKyspIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElDb21wcmVzc29yPiBjb21wcmVzc29yID0KKyAgICAgICAgICAgICAgICBJQ29tcHJlc3Nvcjo6Q3JlYXRlKGNvbXByZXNzaW9uXywgaGVhZGVyXy5tYXhfY29tcHJlc3Npb25fc2l6ZSk7CisgICAgICAgIGF1dG8mJiB3dCA9IGNvbXByZXNzX3RocmVhZHNfLmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPENvbXByZXNzV29ya2VyPihzdGQ6Om1vdmUoY29tcHJlc3NvcikpKTsKKyAgICAgICAgdGhyZWFkc18uZW1wbGFjZV9iYWNrKHN0ZDo6dGhyZWFkKFt3dCA9IHd0LmdldCgpXSgpIHsgd3QtPlJ1blRocmVhZCgpOyB9KSk7CisgICAgfQorICAgIExPRyhJTkZPKSA8PCBudW1fY29tcHJlc3NfdGhyZWFkc18gPDwgIiB0aHJlYWQgdXNlZCBmb3IgY29tcHJlc3Npb24iOworfQorCit2b2lkIENvd1dyaXRlclYzOjpTZXR1cEhlYWRlcnMoKSB7CisgICAgaGVhZGVyXyA9IHt9OworICAgIGhlYWRlcl8ucHJlZml4Lm1hZ2ljID0ga0Nvd01hZ2ljTnVtYmVyOworICAgIGhlYWRlcl8ucHJlZml4Lm1ham9yX3ZlcnNpb24gPSAzOworICAgIGhlYWRlcl8ucHJlZml4Lm1pbm9yX3ZlcnNpb24gPSAwOworICAgIGhlYWRlcl8ucHJlZml4LmhlYWRlcl9zaXplID0gc2l6ZW9mKENvd0hlYWRlclYzKTsKKyAgICBoZWFkZXJfLmZvb3Rlcl9zaXplID0gMDsKKyAgICBoZWFkZXJfLm9wX3NpemUgPSBzaXplb2YoQ293T3BlcmF0aW9uVjMpOworICAgIGhlYWRlcl8uYmxvY2tfc2l6ZSA9IG9wdGlvbnNfLmJsb2NrX3NpemU7CisgICAgaGVhZGVyXy5udW1fbWVyZ2Vfb3BzID0gb3B0aW9uc18ubnVtX21lcmdlX29wczsKKyAgICBoZWFkZXJfLmNsdXN0ZXJfb3BzID0gMDsKKyAgICBpZiAob3B0aW9uc18uc2NyYXRjaF9zcGFjZSkgeworICAgICAgICBoZWFkZXJfLmJ1ZmZlcl9zaXplID0gQlVGRkVSX1JFR0lPTl9ERUZBVUxUX1NJWkU7CisgICAgfQorCisgICAgLy8gdjMgc3BlY2lmaWMgZmllbGRzCisgICAgLy8gV0lQOiBub3QgcXVpdGUgc3VyZSBob3cgc29tZSBvZiB0aGVzZSBhcmUgY2FsY3VsYXRlZCB5ZXQsIGFzc3VtaW5nIGJ1ZmZlcl9zaXplIGlzIGRldGVybWluZWQKKyAgICAvLyBkdXJpbmcgQ09XIHNpemUgZXN0aW1hdGlvbgorICAgIGhlYWRlcl8uc2VxdWVuY2VfZGF0YV9jb3VudCA9IDA7CisKKyAgICBoZWFkZXJfLnJlc3VtZV9wb2ludF9jb3VudCA9IDA7CisgICAgaGVhZGVyXy5yZXN1bWVfcG9pbnRfbWF4ID0ga051bVJlc3VtZVBvaW50czsKKyAgICBoZWFkZXJfLm9wX2NvdW50ID0gMDsKKyAgICBoZWFkZXJfLm9wX2NvdW50X21heCA9IDA7CisgICAgaGVhZGVyXy5jb21wcmVzc2lvbl9hbGdvcml0aG0gPSBrQ293Q29tcHJlc3NOb25lOworICAgIGhlYWRlcl8ubWF4X2NvbXByZXNzaW9uX3NpemUgPSBvcHRpb25zXy5jb21wcmVzc2lvbl9mYWN0b3I7Cit9CisKK2Jvb2wgQ293V3JpdGVyVjM6OlBhcnNlT3B0aW9ucygpIHsKKyAgICBpZiAoIWhlYWRlcl8ubWF4X2NvbXByZXNzaW9uX3NpemUgfHwgIUlzQmxvY2tBbGlnbmVkKGhlYWRlcl8ubWF4X2NvbXByZXNzaW9uX3NpemUpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgY29tcHJlc3Npb24gZmFjdG9yOiAiIDw8IGhlYWRlcl8ubWF4X2NvbXByZXNzaW9uX3NpemU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBudW1fY29tcHJlc3NfdGhyZWFkc18gPSBzdGQ6Om1heChpbnQob3B0aW9uc18ubnVtX2NvbXByZXNzX3RocmVhZHMpLCAxKTsKKyAgICBhdXRvIHBhcnRzID0gYW5kcm9pZDo6YmFzZTo6U3BsaXQob3B0aW9uc18uY29tcHJlc3Npb24sICIsIik7CisgICAgaWYgKHBhcnRzLnNpemUoKSA+IDIpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiZmFpbGVkIHRvIHBhcnNlIGNvbXByZXNzaW9uIHBhcmFtZXRlcnM6IGludmFsaWQgYXJndW1lbnQgY291bnQ6ICIKKyAgICAgICAgICAgICAgICAgICA8PCBwYXJ0cy5zaXplKCkgPDwgIiAiIDw8IG9wdGlvbnNfLmNvbXByZXNzaW9uOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGF1dG8gYWxnb3JpdGhtID0gQ29tcHJlc3Npb25BbGdvcml0aG1Gcm9tU3RyaW5nKHBhcnRzWzBdKTsKKyAgICBpZiAoIWFsZ29yaXRobSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJ1bnJlY29nbml6ZWQgY29tcHJlc3Npb246ICIgPDwgb3B0aW9uc18uY29tcHJlc3Npb247CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaGVhZGVyXy5jb21wcmVzc2lvbl9hbGdvcml0aG0gPSAqYWxnb3JpdGhtOworICAgIGhlYWRlcl8ub3BfY291bnRfbWF4ID0gb3B0aW9uc18ub3BfY291bnRfbWF4OworCisgICAgaWYgKCFJc0VzdGltYXRpbmcoKSAmJiBoZWFkZXJfLm9wX2NvdW50X21heCA9PSAwKSB7CisgICAgICAgIGlmICghb3B0aW9uc18ubWF4X2Jsb2Nrcy5oYXNfdmFsdWUoKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiY2FuJ3Qgc2l6ZSBvcCBidWZmZXIgc2l6ZSBzaW5jZSBvcF9jb3VudF9tYXggaXMgMCBhbmQgbWF4X2Jsb2NrcyBpcyBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0LiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgTE9HKElORk8pIDw8ICJvcCBjb3VudCBtYXggaXMgcmVhZCBpbiBhcyAwLiBTZXR0aW5nIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICJudW0gYmxvY2tzIGluIHBhcnRpdGlvbiAiCisgICAgICAgICAgICAgICAgICA8PCBvcHRpb25zXy5tYXhfYmxvY2tzLnZhbHVlKCk7CisgICAgICAgIGhlYWRlcl8ub3BfY291bnRfbWF4ID0gb3B0aW9uc18ubWF4X2Jsb2Nrcy52YWx1ZSgpOworICAgIH0KKworICAgIGlmIChwYXJ0cy5zaXplKCkgPiAxKSB7CisgICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UGFyc2VJbnQocGFydHNbMV0sICZjb21wcmVzc2lvbl8uY29tcHJlc3Npb25fbGV2ZWwpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJmYWlsZWQgdG8gcGFyc2UgY29tcHJlc3Npb24gbGV2ZWwgaW52YWxpZCB0eXBlOiAiIDw8IHBhcnRzWzFdOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29tcHJlc3Npb25fLmNvbXByZXNzaW9uX2xldmVsID0KKyAgICAgICAgICAgICAgICBDb21wcmVzc1dvcmtlcjo6R2V0RGVmYXVsdENvbXByZXNzaW9uTGV2ZWwoYWxnb3JpdGhtLnZhbHVlKCkpOworICAgIH0KKworICAgIGNvbXByZXNzaW9uXy5hbGdvcml0aG0gPSAqYWxnb3JpdGhtOworICAgIGlmIChjb21wcmVzc2lvbl8uYWxnb3JpdGhtICE9IGtDb3dDb21wcmVzc05vbmUpIHsKKyAgICAgICAgY29tcHJlc3Nvcl8gPSBJQ29tcHJlc3Nvcjo6Q3JlYXRlKGNvbXByZXNzaW9uXywgaGVhZGVyXy5tYXhfY29tcHJlc3Npb25fc2l6ZSk7CisgICAgICAgIGlmIChjb21wcmVzc29yXyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIGNvbXByZXNzb3IgZm9yICIgPDwgY29tcHJlc3Npb25fLmFsZ29yaXRobTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvcHRpb25zXy5jbHVzdGVyX29wcyAmJgorICAgICAgICAoYW5kcm9pZDo6YmFzZTo6R2V0Qm9vbFByb3BlcnR5KCJyby52aXJ0dWFsX2FiLmJhdGNoX3dyaXRlcyIsIGZhbHNlKSB8fAorICAgICAgICAgb3B0aW9uc18uYmF0Y2hfd3JpdGUpKSB7CisgICAgICAgIGJhdGNoX3NpemVfID0gc3RkOjptYXg8c2l6ZV90PihvcHRpb25zXy5jbHVzdGVyX29wcywgMSk7CisgICAgICAgIGRhdGFfdmVjXy5yZXNlcnZlKGJhdGNoX3NpemVfKTsKKyAgICAgICAgY2FjaGVkX2RhdGFfLnJlc2VydmUoYmF0Y2hfc2l6ZV8pOworICAgICAgICBjYWNoZWRfb3BzXy5yZXNlcnZlKGJhdGNoX3NpemVfICoga05vbkRhdGFPcEJ1ZmZlclNpemUpOworICAgIH0KKworICAgIGlmIChiYXRjaF9zaXplXyA+IDEpIHsKKyAgICAgICAgTE9HKElORk8pIDw8ICJCYXRjaCB3cml0ZXM6IGVuYWJsZWQgd2l0aCBiYXRjaCBzaXplICIgPDwgYmF0Y2hfc2l6ZV87CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HKElORk8pIDw8ICJCYXRjaCB3cml0ZXM6IGRpc2FibGVkIjsKKyAgICB9CisgICAgaWYgKGFuZHJvaWQ6OmJhc2U6OkdldEJvb2xQcm9wZXJ0eSgicm8udmlydHVhbF9hYi5jb21wcmVzc2lvbi50aHJlYWRzIiwgZmFsc2UpICYmCisgICAgICAgIG9wdGlvbnNfLm51bV9jb21wcmVzc190aHJlYWRzKSB7CisgICAgICAgIG51bV9jb21wcmVzc190aHJlYWRzXyA9IG9wdGlvbnNfLm51bV9jb21wcmVzc190aHJlYWRzOworICAgIH0KKyAgICBJbml0V29ya2VycygpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK0Nvd1dyaXRlclYzOjp+Q293V3JpdGVyVjMoKSB7CisgICAgZm9yIChjb25zdCBhdXRvJiB0IDogY29tcHJlc3NfdGhyZWFkc18pIHsKKyAgICAgICAgdC0+RmluYWxpemUoKTsKKyAgICB9CisgICAgZm9yIChhdXRvJiB0IDogdGhyZWFkc18pIHsKKyAgICAgICAgaWYgKHQuam9pbmFibGUoKSkgeworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgQ293V3JpdGVyVjM6OkluaXRpYWxpemUoc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gbGFiZWwpIHsKKyAgICBpZiAoIUluaXRGZCgpIHx8ICFQYXJzZU9wdGlvbnMoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghbGFiZWwpIHsKKyAgICAgICAgaWYgKCFPcGVuRm9yV3JpdGUoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFPcGVuRm9yQXBwZW5kKCpsYWJlbCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb3dXcml0ZXJWMzo6T3BlbkZvcldyaXRlKCkgeworICAgIC8vIFRoaXMgbGltaXRhdGlvbiBpcyB0aWVkIHRvIHRoZSBkYXRhIGZpZWxkIHNpemUgaW4gQ293T3BlcmF0aW9uVjIuCisgICAgLy8gS2VlcGluZyB0aGlzIGZvciBWMyB3cml0ZXIgPC0gYWx0aG91Z2ggd2UKKyAgICBpZiAoaGVhZGVyXy5ibG9ja19zaXplID4gc3RkOjpudW1lcmljX2xpbWl0czx1aW50MTZfdD46Om1heCgpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkJsb2NrIHNpemUgaXMgdG9vIGxhcmdlIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChsc2VlayhmZF8uZ2V0KCksIDAsIFNFRUtfU0VUKSA8IDApIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgImxzZWVrIGZhaWxlZCI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBIZWFkZXJzIGFyZSBub3QgY29tcGxldGUsIGJ1dCB0aGlzIGVuc3VyZXMgdGhlIGZpbGUgaXMgYXQgdGhlIHJpZ2h0CisgICAgLy8gcG9zaXRpb24uCisgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpXcml0ZUZ1bGx5KGZkXywgJmhlYWRlcl8sIHNpemVvZihoZWFkZXJfKSkpIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIndyaXRlIGZhaWxlZCI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAob3B0aW9uc18uc2NyYXRjaF9zcGFjZSkgeworICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBzY3JhdGNoIHNwYWNlCisgICAgICAgIHN0ZDo6c3RyaW5nIGRhdGEoaGVhZGVyXy5idWZmZXJfc2l6ZSwgMCk7CisgICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6V3JpdGVGdWxseShmZF8sIGRhdGEuZGF0YSgpLCBoZWFkZXJfLmJ1ZmZlcl9zaXplKSkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIndyaXRpbmcgc2NyYXRjaCBzcGFjZSBmYWlsZWQiOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzdW1lX3BvaW50c18gPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6dmVjdG9yPFJlc3VtZVBvaW50Pj4oKTsKKworICAgIGlmICghU3luYygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkhlYWRlciBzeW5jIGZhaWxlZCI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbmV4dF9kYXRhX3Bvc18gPSBHZXREYXRhT2Zmc2V0KGhlYWRlcl8pOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIENvd1dyaXRlclYzOjpPcGVuRm9yQXBwZW5kKHVpbnQ2NF90IGxhYmVsKSB7CisgICAgQ293SGVhZGVyVjMgaGVhZGVyX3Yze307CisgICAgaWYgKCFSZWFkQ293SGVhZGVyKGZkXywgJmhlYWRlcl92MykpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGRuJ3QgcmVhZCBDb3cgSGVhZGVyIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGhlYWRlcl8gPSBoZWFkZXJfdjM7CisKKyAgICBDSEVDSyhsYWJlbCA+PSAwKTsKKyAgICBDb3dQYXJzZXJWMyBwYXJzZXI7CisgICAgaWYgKCFwYXJzZXIuUGFyc2UoZmRfLCBoZWFkZXJfLCBsYWJlbCkpIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgInVuYWJsZSB0byBwYXJzZSB3aXRoIGdpdmVuIGxhYmVsOiAiIDw8IGxhYmVsOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmVzdW1lX3BvaW50c18gPSBwYXJzZXIucmVzdW1lX3BvaW50cygpOworICAgIG9wdGlvbnNfLmJsb2NrX3NpemUgPSBoZWFkZXJfLmJsb2NrX3NpemU7CisgICAgbmV4dF9kYXRhX3Bvc18gPSBHZXREYXRhT2Zmc2V0KGhlYWRlcl8pOworCisgICAgVHJhbnNsYXRlZENvd09wcyBvcHM7CisgICAgcGFyc2VyLlRyYW5zbGF0ZSgmb3BzKTsKKyAgICBoZWFkZXJfLm9wX2NvdW50ID0gb3BzLm9wcy0+c2l6ZSgpOworCisgICAgZm9yIChjb25zdCBhdXRvJiBvcCA6ICpvcHMub3BzKSB7CisgICAgICAgIG5leHRfZGF0YV9wb3NfICs9IG9wLmRhdGFfbGVuZ3RoOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIENvd1dyaXRlclYzOjpDaGVja09wQ291bnQoc2l6ZV90IG9wX2NvdW50KSB7CisgICAgaWYgKElzRXN0aW1hdGluZygpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoaGVhZGVyXy5vcF9jb3VudCArIGNhY2hlZF9vcHNfLnNpemUoKSArIG9wX2NvdW50ID4gaGVhZGVyXy5vcF9jb3VudF9tYXgpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ3VycmVudCBudW1iZXIgb2Ygb3BzIG9uIGRpc2s6ICIgPDwgaGVhZGVyXy5vcF9jb3VudAorICAgICAgICAgICAgICAgICAgIDw8ICIsIG51bWJlciBvZiBvcHMgY2FjaGVkIGluIG1lbW9yeTogIiA8PCBjYWNoZWRfb3BzXy5zaXplKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiLCBudW1iZXIgb2Ygb3BzIGF0dGVtcHRpbmcgdG8gd3JpdGU6ICIgPDwgb3BfY291bnQKKyAgICAgICAgICAgICAgICAgICA8PCAiLCB0aGlzIHdpbGwgZXhjZWVkIG1heCBvcCBjb3VudCAiIDw8IGhlYWRlcl8ub3BfY291bnRfbWF4OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitzaXplX3QgQ293V3JpdGVyVjM6OkNhY2hlZERhdGFTaXplKCkgY29uc3QgeworICAgIHNpemVfdCBzaXplID0gMDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGkgOiBjYWNoZWRfZGF0YV8pIHsKKyAgICAgICAgc2l6ZSArPSBpLnNpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIHNpemU7Cit9CisKK2Jvb2wgQ293V3JpdGVyVjM6OkVtaXRDb3B5KHVpbnQ2NF90IG5ld19ibG9jaywgdWludDY0X3Qgb2xkX2Jsb2NrLCB1aW50NjRfdCBudW1fYmxvY2tzKSB7CisgICAgaWYgKCFDaGVja09wQ291bnQobnVtX2Jsb2NrcykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bV9ibG9ja3M7IGkrKykgeworICAgICAgICBDb3dPcGVyYXRpb25WMyYgb3AgPSBjYWNoZWRfb3BzXy5lbXBsYWNlX2JhY2soKTsKKyAgICAgICAgb3Auc2V0X3R5cGUoa0Nvd0NvcHlPcCk7CisgICAgICAgIG9wLm5ld19ibG9jayA9IG5ld19ibG9jayArIGk7CisgICAgICAgIG9wLnNldF9zb3VyY2Uob2xkX2Jsb2NrICsgaSk7CisgICAgfQorCisgICAgaWYgKE5lZWRzRmx1c2goKSkgeworICAgICAgICBpZiAoIUZsdXNoQ2FjaGVPcHMoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIENvd1dyaXRlclYzOjpFbWl0UmF3QmxvY2tzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICByZXR1cm4gRW1pdEJsb2NrcyhuZXdfYmxvY2tfc3RhcnQsIGRhdGEsIHNpemUsIDAsIDAsIGtDb3dSZXBsYWNlT3ApOworfQorCitib29sIENvd1dyaXRlclYzOjpFbWl0WG9yQmxvY2tzKHVpbnQzMl90IG5ld19ibG9ja19zdGFydCwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9sZF9ibG9jaywgdWludDE2X3Qgb2Zmc2V0KSB7CisgICAgcmV0dXJuIEVtaXRCbG9ja3MobmV3X2Jsb2NrX3N0YXJ0LCBkYXRhLCBzaXplLCBvbGRfYmxvY2ssIG9mZnNldCwga0Nvd1hvck9wKTsKK30KKworYm9vbCBDb3dXcml0ZXJWMzo6TmVlZHNGbHVzaCgpIGNvbnN0IHsKKyAgICAvLyBBbGxvdyBiaWdnZXIgYmF0Y2ggc2l6ZXMgZm9yIG9wcyB3aXRob3V0IGRhdGEuIEEgc2luZ2xlIENvd09wZXJhdGlvblYzCisgICAgLy8gc3RydWN0IHVzZXMgMTQgYnl0ZXMgb2YgbWVtb3J5LCBldmVuIGlmIHdlIGNhY2hlIDIwMCAqIDE2IG9wcyBpbiBtZW1vcnksCisgICAgLy8gaXQncyBvbmx5IH40NEsuCisgICAgcmV0dXJuIENhY2hlZERhdGFTaXplKCkgPj0gYmF0Y2hfc2l6ZV8gKiBoZWFkZXJfLmJsb2NrX3NpemUgfHwKKyAgICAgICAgICAgY2FjaGVkX29wc18uc2l6ZSgpID49IGJhdGNoX3NpemVfICoga05vbkRhdGFPcEJ1ZmZlclNpemU7Cit9CisKK2Jvb2wgQ293V3JpdGVyVjM6OkNvbnN0cnVjdENvd09wQ29tcHJlc3NlZEJ1ZmZlcnModWludDY0X3QgbmV3X2Jsb2NrX3N0YXJ0LCBjb25zdCB2b2lkKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBvbGRfYmxvY2ssIHVpbnQxNl90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ293T3BlcmF0aW9uVHlwZSB0eXBlLCBzaXplX3QgYmxvY2tzX3RvX3dyaXRlKSB7CisgICAgc2l6ZV90IGNvbXByZXNzZWRfYnl0ZXMgPSAwOworICAgIGF1dG8mJiBibG9ja3MgPSBDb21wcmVzc0Jsb2NrcyhibG9ja3NfdG9fd3JpdGUsIGRhdGEsIHR5cGUpOworICAgIGlmIChibG9ja3MuZW1wdHkoKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gY29tcHJlc3MgYmxvY2tzICIgPDwgbmV3X2Jsb2NrX3N0YXJ0IDw8ICIsICIgPDwgYmxvY2tzX3RvX3dyaXRlCisgICAgICAgICAgICAgICAgICAgPDwgIiwgYWN0dWFsIG51bWJlciBvZiBibG9ja3MgcmVjZWl2ZWQgZnJvbSBjb21wcmVzc29yICIgPDwgYmxvY2tzLnNpemUoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIUNoZWNrT3BDb3VudChibG9ja3Muc2l6ZSgpKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHNpemVfdCBibG9ja3Nfd3JpdHRlbiA9IDA7CisgICAgZm9yIChzaXplX3QgYmxrX2luZGV4ID0gMDsgYmxrX2luZGV4IDwgYmxvY2tzLnNpemUoKTsgYmxrX2luZGV4KyspIHsKKyAgICAgICAgQ293T3BlcmF0aW9uJiBvcCA9IGNhY2hlZF9vcHNfLmVtcGxhY2VfYmFjaygpOworICAgICAgICBhdXRvJiB2ZWMgPSBkYXRhX3ZlY18uZW1wbGFjZV9iYWNrKCk7CisgICAgICAgIENvbXByZXNzZWRCdWZmZXIgYnVmZmVyID0gc3RkOjptb3ZlKGJsb2Nrc1tibGtfaW5kZXhdKTsKKyAgICAgICAgYXV0byYgY29tcHJlc3NlZF9kYXRhID0gY2FjaGVkX2RhdGFfLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoYnVmZmVyLmNvbXByZXNzZWRfZGF0YSkpOworICAgICAgICBvcC5uZXdfYmxvY2sgPSBuZXdfYmxvY2tfc3RhcnQgKyBibG9ja3Nfd3JpdHRlbjsKKworICAgICAgICBvcC5zZXRfdHlwZSh0eXBlKTsKKyAgICAgICAgb3Auc2V0X2NvbXByZXNzaW9uX2JpdHMoc3RkOjpsb2cyKGJ1ZmZlci5jb21wcmVzc2lvbl9mYWN0b3IgLyBoZWFkZXJfLmJsb2NrX3NpemUpKTsKKworICAgICAgICBpZiAodHlwZSA9PSBrQ293WG9yT3ApIHsKKyAgICAgICAgICAgIG9wLnNldF9zb3VyY2UoKG9sZF9ibG9jayArIGJsb2Nrc193cml0dGVuKSAqIGhlYWRlcl8uYmxvY2tfc2l6ZSArIG9mZnNldCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvcC5zZXRfc291cmNlKG5leHRfZGF0YV9wb3NfICsgY29tcHJlc3NlZF9ieXRlcyk7CisgICAgICAgIH0KKworICAgICAgICB2ZWMgPSB7Lmlvdl9iYXNlID0gY29tcHJlc3NlZF9kYXRhLmRhdGEoKSwgLmlvdl9sZW4gPSBjb21wcmVzc2VkX2RhdGEuc2l6ZSgpfTsKKyAgICAgICAgb3AuZGF0YV9sZW5ndGggPSB2ZWMuaW92X2xlbjsKKyAgICAgICAgY29tcHJlc3NlZF9ieXRlcyArPSBvcC5kYXRhX2xlbmd0aDsKKyAgICAgICAgYmxvY2tzX3dyaXR0ZW4gKz0gKGJ1ZmZlci5jb21wcmVzc2lvbl9mYWN0b3IgLyBoZWFkZXJfLmJsb2NrX3NpemUpOworICAgIH0KKyAgICBpZiAoYmxvY2tzX3dyaXR0ZW4gIT0gYmxvY2tzX3RvX3dyaXRlKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlRvdGFsIGNvbXByZXNzZWQgYmxvY2tzOiAiIDw8IGJsb2Nrc193cml0dGVuCisgICAgICAgICAgICAgICAgICAgPDwgIiBFeHBlY3RlZDogIiA8PCBibG9ja3NfdG9fd3JpdGU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ293V3JpdGVyVjM6OkVtaXRCbG9ja3ModWludDY0X3QgbmV3X2Jsb2NrX3N0YXJ0LCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgb2xkX2Jsb2NrLCB1aW50MTZfdCBvZmZzZXQsIENvd09wZXJhdGlvblR5cGUgdHlwZSkgeworICAgIGlmIChjb21wcmVzc2lvbl8uYWxnb3JpdGhtICE9IGtDb3dDb21wcmVzc05vbmUgJiYgY29tcHJlc3Nvcl8gPT0gbnVsbHB0cikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDb21wcmVzc2lvbiBhbGdvcml0aG0gaXMgIiA8PCBjb21wcmVzc2lvbl8uYWxnb3JpdGhtCisgICAgICAgICAgICAgICAgICAgPDwgIiBidXQgY29tcHJlc3NvciBpcyB1bmluaXRpYWxpemVkLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY29uc3QgYXV0byBieXRlcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGRhdGEpOworICAgIHNpemVfdCBudW1fYmxvY2tzID0gKHNpemUgLyBoZWFkZXJfLmJsb2NrX3NpemUpOworICAgIHNpemVfdCB0b3RhbF93cml0dGVuID0gMDsKKyAgICB3aGlsZSAodG90YWxfd3JpdHRlbiA8IG51bV9ibG9ja3MpIHsKKyAgICAgICAgc2l6ZV90IGNodW5rID0gc3RkOjptaW4obnVtX2Jsb2NrcyAtIHRvdGFsX3dyaXR0ZW4sIGJhdGNoX3NpemVfKTsKKyAgICAgICAgaWYgKCFDb25zdHJ1Y3RDb3dPcENvbXByZXNzZWRCdWZmZXJzKG5ld19ibG9ja19zdGFydCArIHRvdGFsX3dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcyArIGhlYWRlcl8uYmxvY2tfc2l6ZSAqIHRvdGFsX3dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfYmxvY2sgKyB0b3RhbF93cml0dGVuLCBvZmZzZXQsIHR5cGUsIGNodW5rKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKE5lZWRzRmx1c2goKSAmJiAhRmx1c2hDYWNoZU9wcygpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJFbWl0QmxvY2tzIHdpdGggY29tcHJlc3Npb246IHdyaXRlIGZhaWxlZC4gbmV3IGJsb2NrOiAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IG5ld19ibG9ja19zdGFydCA8PCAiIGNvbXByZXNzaW9uOiAiIDw8IGNvbXByZXNzaW9uXy5hbGdvcml0aG0KKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgb3AgdHlwZTogIiA8PCB0eXBlOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRvdGFsX3dyaXR0ZW4gKz0gY2h1bms7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ293V3JpdGVyVjM6OkVtaXRaZXJvQmxvY2tzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgY29uc3QgdWludDY0X3QgbnVtX2Jsb2NrcykgeworICAgIGlmICghQ2hlY2tPcENvdW50KG51bV9ibG9ja3MpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yICh1aW50NjRfdCBpID0gMDsgaSA8IG51bV9ibG9ja3M7IGkrKykgeworICAgICAgICBhdXRvJiBvcCA9IGNhY2hlZF9vcHNfLmVtcGxhY2VfYmFjaygpOworICAgICAgICBvcC5zZXRfdHlwZShrQ293WmVyb09wKTsKKyAgICAgICAgb3AubmV3X2Jsb2NrID0gbmV3X2Jsb2NrX3N0YXJ0ICsgaTsKKyAgICB9CisgICAgaWYgKE5lZWRzRmx1c2goKSkgeworICAgICAgICBpZiAoIUZsdXNoQ2FjaGVPcHMoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIENvd1dyaXRlclYzOjpFbWl0TGFiZWwodWludDY0X3QgbGFiZWwpIHsKKyAgICAvLyByZW1vdmUgYWxsIGxhYmVscyBncmVhdGVyIHRoYW4gdGhpcyBjdXJyZW50IG9uZS4gd2Ugd2FudCB0byBhdm9pZCB0aGUgc2l0dWF0aW9uIG9mIGFkZGluZworICAgIC8vIGluCisgICAgLy8gZHVwbGljYXRlIGxhYmVscyB3aXRoIGRpZmZlcmluZyBvcCB2YWx1ZXMKKyAgICBpZiAoIUZsdXNoQ2FjaGVPcHMoKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZmx1c2ggY2FjaGVkIG9wcyBiZWZvcmUgZW1pdHRpbmcgbGFiZWwgIiA8PCBsYWJlbDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBhdXRvIHJlbW92ZV9pZl9jYWxsYmFjayA9IFsmXShjb25zdCBhdXRvJiByZXN1bWVfcG9pbnQpIC0+IGJvb2wgeworICAgICAgICBpZiAocmVzdW1lX3BvaW50LmxhYmVsID49IGxhYmVsKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH07CisgICAgcmVzdW1lX3BvaW50c18tPmVyYXNlKAorICAgICAgICAgICAgc3RkOjpyZW1vdmVfaWYocmVzdW1lX3BvaW50c18tPmJlZ2luKCksIHJlc3VtZV9wb2ludHNfLT5lbmQoKSwgcmVtb3ZlX2lmX2NhbGxiYWNrKSwKKyAgICAgICAgICAgIHJlc3VtZV9wb2ludHNfLT5lbmQoKSk7CisKKyAgICByZXN1bWVfcG9pbnRzXy0+cHVzaF9iYWNrKHtsYWJlbCwgaGVhZGVyXy5vcF9jb3VudH0pOworICAgIGhlYWRlcl8ucmVzdW1lX3BvaW50X2NvdW50Kys7CisgICAgLy8gcmVtb3ZlIHRoZSBvbGRlc3QgcmVzdW1lIHBvaW50IGlmIHJlc3VtZV9idWZmZXIgaXMgZnVsbAorICAgIHdoaWxlIChyZXN1bWVfcG9pbnRzXy0+c2l6ZSgpID4gaGVhZGVyXy5yZXN1bWVfcG9pbnRfbWF4KSB7CisgICAgICAgIHJlc3VtZV9wb2ludHNfLT5lcmFzZShyZXN1bWVfcG9pbnRzXy0+YmVnaW4oKSk7CisgICAgfQorCisgICAgQ0hFQ0tfTEUocmVzdW1lX3BvaW50c18tPnNpemUoKSwgaGVhZGVyXy5yZXN1bWVfcG9pbnRfbWF4KTsKKworICAgIGlmICghYW5kcm9pZDo6YmFzZTo6V3JpdGVGdWxseUF0T2Zmc2V0KGZkXywgcmVzdW1lX3BvaW50c18tPmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVfcG9pbnRzXy0+c2l6ZSgpICogc2l6ZW9mKFJlc3VtZVBvaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRSZXN1bWVPZmZzZXQoaGVhZGVyXykpKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJ3cml0aW5nIHJlc3VtZSBidWZmZXIgZmFpbGVkIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gRmluYWxpemUoKTsKK30KKworYm9vbCBDb3dXcml0ZXJWMzo6RW1pdFNlcXVlbmNlRGF0YShzaXplX3QgbnVtX29wcywgY29uc3QgdWludDMyX3QqIGRhdGEpIHsKKyAgICBpZiAoaGVhZGVyXy5vcF9jb3VudCA+IDAgfHwgIWNhY2hlZF9vcHNfLmVtcHR5KCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVGhlcmUncyAiIDw8IGhlYWRlcl8ub3BfY291bnQgPDwgIiBvcGVyYXRpb25zIHdyaXR0ZW4gdG8gZGlzayBhbmQgIgorICAgICAgICAgICAgICAgICAgIDw8IGNhY2hlZF9vcHNfLnNpemUoKQorICAgICAgICAgICAgICAgICAgIDw8ICIgb3BzIGNhY2hlZCBpbiBtZW1vcnkuIFdyaXRpbmcgc2VxdWVuY2UgZGF0YSBpcyBvbmx5IGFsbG93ZWQgYmVmb3JlIGFsbCAiCisgICAgICAgICAgICAgICAgICAgICAgIm9wZXJhdGlvbiB3cml0ZXMuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGhlYWRlcl8uc2VxdWVuY2VfZGF0YV9jb3VudCA9IG51bV9vcHM7CisKKyAgICAvLyBFbnN1cmUgbmV4dF9kYXRhX3Bvc18gaXMgdXBkYXRlZCBhcyBwcmV2aW91c2x5IGluaXRpYWxpemVkICsgdGhlIG5ld2x5IGFkZGVkIHNlcXVlbmNlCisgICAgLy8gYnVmZmVyLgorICAgIENIRUNLX0VRKG5leHRfZGF0YV9wb3NfICsgaGVhZGVyXy5zZXF1ZW5jZV9kYXRhX2NvdW50ICogc2l6ZW9mKHVpbnQzMl90KSwKKyAgICAgICAgICAgICBHZXREYXRhT2Zmc2V0KGhlYWRlcl8pKTsKKyAgICBuZXh0X2RhdGFfcG9zXyA9IEdldERhdGFPZmZzZXQoaGVhZGVyXyk7CisKKyAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OldyaXRlRnVsbHlBdE9mZnNldChmZF8sIGRhdGEsIHNpemVvZihkYXRhWzBdKSAqIG51bV9vcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0U2VxdWVuY2VPZmZzZXQoaGVhZGVyXykpKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJ3cml0aW5nIHNlcXVlbmNlIGJ1ZmZlciBmYWlsZWQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIENvd1dyaXRlclYzOjpGbHVzaENhY2hlT3BzKCkgeworICAgIGlmIChjYWNoZWRfb3BzXy5lbXB0eSgpKSB7CisgICAgICAgIGlmICghZGF0YV92ZWNfLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNhY2hlZCBvcHMgaXMgZW1wdHksIGJ1dCBkYXRhIGlvdmVjIGhhcyBzaXplOiAiIDw8IGRhdGFfdmVjXy5zaXplKCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiB0aGlzIGlzIGRlZmluaXRlbHkgYSBidWcuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgc2l6ZV90IGJ5dGVzX3dyaXR0ZW4gPSAwOworCisgICAgZm9yIChhdXRvJiBvcCA6IGNhY2hlZF9vcHNfKSB7CisgICAgICAgIGlmIChvcC50eXBlKCkgPT0ga0Nvd1JlcGxhY2VPcCkgeworICAgICAgICAgICAgb3Auc2V0X3NvdXJjZShuZXh0X2RhdGFfcG9zXyArIGJ5dGVzX3dyaXR0ZW4pOworICAgICAgICB9CisgICAgICAgIGJ5dGVzX3dyaXR0ZW4gKz0gb3AuZGF0YV9sZW5ndGg7CisgICAgfQorICAgIGlmICghV3JpdGVPcGVyYXRpb24oY2FjaGVkX29wc18sIGRhdGFfdmVjXykpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGZsdXNoICIgPDwgY2FjaGVkX29wc18uc2l6ZSgpIDw8ICIgb3BzIHRvIGRpc2siOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNhY2hlZF9vcHNfLmNsZWFyKCk7CisgICAgY2FjaGVkX2RhdGFfLmNsZWFyKCk7CisgICAgZGF0YV92ZWNfLmNsZWFyKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3NpemVfdCBDb3dXcml0ZXJWMzo6R2V0Q29tcHJlc3Npb25GYWN0b3IoY29uc3Qgc2l6ZV90IGJsb2Nrc190b19jb21wcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ293T3BlcmF0aW9uVHlwZSB0eXBlKSBjb25zdCB7CisgICAgLy8gRm9yIFhPUiBvcHMsIHdlIGRvbid0IHN1cHBvcnQgYmlnZ2VyIGJsb2NrIHNpemUgY29tcHJlc3Npb24geWV0LgorICAgIC8vIEZvciBiaWdnZXIgYmxvY2sgc2l6ZSBzdXBwb3J0LCBzbmFwc2hvdC1tZXJnZSBhbHNvIGhhcyB0byBjaGFuZ2VkLiBXZQorICAgIC8vIGFyZW4ndCB0aGVyZSB5ZXQ7IGhlbmNlLCBqdXN0IHN0aWNrIHRvIDRrIGZvciBub3cgdW50aWwKKyAgICAvLyBzbmFwc2hvdC1tZXJnZSBpcyByZWFkeSBmb3IgWE9SIG9wZXJhdGlvbi4KKyAgICBpZiAodHlwZSA9PSBrQ293WG9yT3ApIHsKKyAgICAgICAgcmV0dXJuIGhlYWRlcl8uYmxvY2tfc2l6ZTsKKyAgICB9CisKKyAgICBzaXplX3QgY29tcHJlc3Npb25fZmFjdG9yID0gaGVhZGVyXy5tYXhfY29tcHJlc3Npb25fc2l6ZTsKKyAgICB3aGlsZSAoY29tcHJlc3Npb25fZmFjdG9yID4gaGVhZGVyXy5ibG9ja19zaXplKSB7CisgICAgICAgIHNpemVfdCBudW1fYmxvY2tzID0gY29tcHJlc3Npb25fZmFjdG9yIC8gaGVhZGVyXy5ibG9ja19zaXplOworICAgICAgICBpZiAoYmxvY2tzX3RvX2NvbXByZXNzID49IG51bV9ibG9ja3MpIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wcmVzc2lvbl9mYWN0b3I7CisgICAgICAgIH0KKyAgICAgICAgY29tcHJlc3Npb25fZmFjdG9yID4+PSAxOworICAgIH0KKyAgICByZXR1cm4gaGVhZGVyXy5ibG9ja19zaXplOworfQorCitzdGQ6OnZlY3RvcjxDb3dXcml0ZXJWMzo6Q29tcHJlc3NlZEJ1ZmZlcj4gQ293V3JpdGVyVjM6OlByb2Nlc3NCbG9ja3NXaXRoTm9Db21wcmVzc2lvbigKKyAgICAgICAgY29uc3Qgc2l6ZV90IG51bV9ibG9ja3MsIGNvbnN0IHZvaWQqIGRhdGEsIENvd09wZXJhdGlvblR5cGUgdHlwZSkgeworICAgIHNpemVfdCBibG9ja3NfdG9fY29tcHJlc3MgPSBudW1fYmxvY2tzOworICAgIGNvbnN0IHVpbnQ4X3QqIGl0ZXIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihkYXRhKTsKKyAgICBzdGQ6OnZlY3RvcjxDb21wcmVzc2VkQnVmZmVyPiBjb21wcmVzc2VkX3ZlYzsKKworICAgIHdoaWxlIChibG9ja3NfdG9fY29tcHJlc3MpIHsKKyAgICAgICAgQ29tcHJlc3NlZEJ1ZmZlciBidWZmZXI7CisKKyAgICAgICAgY29uc3Qgc2l6ZV90IGNvbXByZXNzaW9uX2ZhY3RvciA9IEdldENvbXByZXNzaW9uRmFjdG9yKGJsb2Nrc190b19jb21wcmVzcywgdHlwZSk7CisgICAgICAgIHNpemVfdCBudW1fYmxvY2tzID0gY29tcHJlc3Npb25fZmFjdG9yIC8gaGVhZGVyXy5ibG9ja19zaXplOworCisgICAgICAgIGJ1ZmZlci5jb21wcmVzc2lvbl9mYWN0b3IgPSBjb21wcmVzc2lvbl9mYWN0b3I7CisgICAgICAgIGJ1ZmZlci5jb21wcmVzc2VkX2RhdGEucmVzaXplKGNvbXByZXNzaW9uX2ZhY3Rvcik7CisKKyAgICAgICAgLy8gTm8gY29tcHJlc3Npb24uIEp1c3QgY29weSB0aGUgZGF0YSBhcy1pcy4KKyAgICAgICAgc3RkOjptZW1jcHkoYnVmZmVyLmNvbXByZXNzZWRfZGF0YS5kYXRhKCksIGl0ZXIsIGNvbXByZXNzaW9uX2ZhY3Rvcik7CisKKyAgICAgICAgY29tcHJlc3NlZF92ZWMucHVzaF9iYWNrKHN0ZDo6bW92ZShidWZmZXIpKTsKKyAgICAgICAgYmxvY2tzX3RvX2NvbXByZXNzIC09IG51bV9ibG9ja3M7CisgICAgICAgIGl0ZXIgKz0gY29tcHJlc3Npb25fZmFjdG9yOworICAgIH0KKyAgICByZXR1cm4gY29tcHJlc3NlZF92ZWM7Cit9CisKK3N0ZDo6dmVjdG9yPENvd1dyaXRlclYzOjpDb21wcmVzc2VkQnVmZmVyPiBDb3dXcml0ZXJWMzo6UHJvY2Vzc0Jsb2Nrc1dpdGhDb21wcmVzc2lvbigKKyAgICAgICAgY29uc3Qgc2l6ZV90IG51bV9ibG9ja3MsIGNvbnN0IHZvaWQqIGRhdGEsIENvd09wZXJhdGlvblR5cGUgdHlwZSkgeworICAgIHNpemVfdCBibG9ja3NfdG9fY29tcHJlc3MgPSBudW1fYmxvY2tzOworICAgIGNvbnN0IHVpbnQ4X3QqIGl0ZXIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihkYXRhKTsKKyAgICBzdGQ6OnZlY3RvcjxDb21wcmVzc2VkQnVmZmVyPiBjb21wcmVzc2VkX3ZlYzsKKworICAgIHdoaWxlIChibG9ja3NfdG9fY29tcHJlc3MpIHsKKyAgICAgICAgQ29tcHJlc3NlZEJ1ZmZlciBidWZmZXI7CisKKyAgICAgICAgY29uc3Qgc2l6ZV90IGNvbXByZXNzaW9uX2ZhY3RvciA9IEdldENvbXByZXNzaW9uRmFjdG9yKGJsb2Nrc190b19jb21wcmVzcywgdHlwZSk7CisgICAgICAgIHNpemVfdCBudW1fYmxvY2tzID0gY29tcHJlc3Npb25fZmFjdG9yIC8gaGVhZGVyXy5ibG9ja19zaXplOworCisgICAgICAgIGJ1ZmZlci5jb21wcmVzc2lvbl9mYWN0b3IgPSBjb21wcmVzc2lvbl9mYWN0b3I7CisgICAgICAgIC8vIENvbXByZXNzIHRoZSBibG9ja3MKKyAgICAgICAgYnVmZmVyLmNvbXByZXNzZWRfZGF0YSA9IGNvbXByZXNzb3JfLT5Db21wcmVzcyhpdGVyLCBjb21wcmVzc2lvbl9mYWN0b3IpOworICAgICAgICBpZiAoYnVmZmVyLmNvbXByZXNzZWRfZGF0YS5lbXB0eSgpKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiQ29tcHJlc3Npb24gZmFpbGVkIjsKKyAgICAgICAgICAgIHJldHVybiB7fTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBidWZmZXIgd2FzIGluZGVlZCBjb21wcmVzc2VkCisgICAgICAgIGlmIChidWZmZXIuY29tcHJlc3NlZF9kYXRhLnNpemUoKSA+PSBjb21wcmVzc2lvbl9mYWN0b3IpIHsKKyAgICAgICAgICAgIGJ1ZmZlci5jb21wcmVzc2VkX2RhdGEucmVzaXplKGNvbXByZXNzaW9uX2ZhY3Rvcik7CisgICAgICAgICAgICBzdGQ6Om1lbWNweShidWZmZXIuY29tcHJlc3NlZF9kYXRhLmRhdGEoKSwgaXRlciwgY29tcHJlc3Npb25fZmFjdG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbXByZXNzZWRfdmVjLnB1c2hfYmFjayhzdGQ6Om1vdmUoYnVmZmVyKSk7CisgICAgICAgIGJsb2Nrc190b19jb21wcmVzcyAtPSBudW1fYmxvY2tzOworICAgICAgICBpdGVyICs9IGNvbXByZXNzaW9uX2ZhY3RvcjsKKyAgICB9CisgICAgcmV0dXJuIGNvbXByZXNzZWRfdmVjOworfQorCitzdGQ6OnZlY3RvcjxDb3dXcml0ZXJWMzo6Q29tcHJlc3NlZEJ1ZmZlcj4gQ293V3JpdGVyVjM6OlByb2Nlc3NCbG9ja3NXaXRoVGhyZWFkZWRDb21wcmVzc2lvbigKKyAgICAgICAgY29uc3Qgc2l6ZV90IG51bV9ibG9ja3MsIGNvbnN0IHZvaWQqIGRhdGEsIENvd09wZXJhdGlvblR5cGUgdHlwZSkgeworICAgIGNvbnN0IHNpemVfdCBudW1fdGhyZWFkcyA9IG51bV9jb21wcmVzc190aHJlYWRzXzsKKyAgICBjb25zdCB1aW50OF90KiBpdGVyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oZGF0YSk7CisKKyAgICAvLyBXZSB3aWxsIGFsdGVybmF0ZSB3aGljaCB0aHJlYWQgdG8gc2VuZCBjb21wcmVzcyB3b3JrIHRvLiBFLmcuIGFsdGVybmF0ZSBiZXR3ZWVuIFQxIGFuZCBUMgorICAgIC8vIHVudGlsIGFsbCBibG9ja3MgYXJlIHByb2Nlc3NlZAorICAgIHN0ZDo6dmVjdG9yPENvbXByZXNzZWRCdWZmZXI+IGNvbXByZXNzZWRfdmVjOworICAgIGludCBpdGVyYXRpb24gPSAwOworICAgIGludCBibG9ja3NfdG9fY29tcHJlc3MgPSBzdGF0aWNfY2FzdDxpbnQ+KG51bV9ibG9ja3MpOworICAgIHdoaWxlIChibG9ja3NfdG9fY29tcHJlc3MpIHsKKyAgICAgICAgQ29tcHJlc3NlZEJ1ZmZlciBidWZmZXI7CisgICAgICAgIENvbXByZXNzV29ya2VyKiB3b3JrZXIgPSBjb21wcmVzc190aHJlYWRzX1tpdGVyYXRpb24gJSBudW1fdGhyZWFkc10uZ2V0KCk7CisKKyAgICAgICAgY29uc3Qgc2l6ZV90IGNvbXByZXNzaW9uX2ZhY3RvciA9IEdldENvbXByZXNzaW9uRmFjdG9yKGJsb2Nrc190b19jb21wcmVzcywgdHlwZSk7CisgICAgICAgIHNpemVfdCBudW1fYmxvY2tzID0gY29tcHJlc3Npb25fZmFjdG9yIC8gaGVhZGVyXy5ibG9ja19zaXplOworCisgICAgICAgIHdvcmtlci0+RW5xdWV1ZUNvbXByZXNzQmxvY2tzKGl0ZXIsIGNvbXByZXNzaW9uX2ZhY3RvciwgMSk7CisgICAgICAgIGJ1ZmZlci5jb21wcmVzc2lvbl9mYWN0b3IgPSBjb21wcmVzc2lvbl9mYWN0b3I7CisgICAgICAgIGNvbXByZXNzZWRfdmVjLnB1c2hfYmFjayhzdGQ6Om1vdmUoYnVmZmVyKSk7CisKKyAgICAgICAgaXRlcmF0aW9uKys7CisgICAgICAgIGl0ZXIgKz0gY29tcHJlc3Npb25fZmFjdG9yOworICAgICAgICBibG9ja3NfdG9fY29tcHJlc3MgLT0gbnVtX2Jsb2NrczsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gY29tcHJlc3NlZF9idWY7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8dWludDhfdD4+PiB3b3JrZXJfYnVmZmVycyhudW1fdGhyZWFkcyk7CisgICAgY29tcHJlc3NlZF9idWYuY2xlYXIoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bV90aHJlYWRzOyBpKyspIHsKKyAgICAgICAgQ29tcHJlc3NXb3JrZXIqIHdvcmtlciA9IGNvbXByZXNzX3RocmVhZHNfW2ldLmdldCgpOworICAgICAgICBpZiAoIXdvcmtlci0+R2V0Q29tcHJlc3NlZEJ1ZmZlcnMoJndvcmtlcl9idWZmZXJzW2ldKSkgeworICAgICAgICAgICAgcmV0dXJuIHt9OworICAgICAgICB9CisgICAgfQorICAgIC8vIGNvbXByZXNzZWRfdmVjIHwgQ0IgMSB8IENCIDIgfCBDQiAzIHwgQ0IgNCB8IDwtY29tcHJlc3NlZCBidWZmZXJzCisgICAgLy8gICAgICAgICAgICAgICAgICAgdDEgICAgIHQyICAgICB0MSAgICAgdDIgICAgPC0gcHJvY2Vzc2VkIGJ5IHRoZXNlIHRocmVhZHMKKyAgICAvLyBPcmRlcmluZyBpcyBpbXBvcnRhbnQgaGVyZS4gV2UgbmVlZCB0byByZXRyaWV2ZSB0aGUgY29tcHJlc3NlZCBkYXRhIGluIHRoZSBzYW1lIG9yZGVyIHdlCisgICAgLy8gcHJvY2Vzc2VkIGl0IGFuZCBhc3N1bWUgdGhhdCB0aGF0IHdlIHN1Ym1pdCBkYXRhIGJlZ2lubmluZyB3aXRoIHRoZSBmaXJzdCB0aHJlYWQgYW5kIHRoZW4KKyAgICAvLyByb3VuZCByb2JpbiB0aGUgY29uc2VjdXRpdmUgZGF0YSBjYWxscy4gV2UgbmVlZCB0byBGZXRjaCBjb21wcmVzc2VkIGJ1ZmZlcnMgZnJvbSB0aGUKKyAgICAvLyB0aHJlYWRzIHZpYSB0aGUgc2FtZSBvcmRlcmluZworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29tcHJlc3NlZF92ZWMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29tcHJlc3NlZF9idWYuZW1wbGFjZV9iYWNrKHdvcmtlcl9idWZmZXJzW2kgJSBudW1fdGhyZWFkc11baSAvIG51bV90aHJlYWRzXSk7CisgICAgfQorCisgICAgaWYgKGNvbXByZXNzZWRfdmVjLnNpemUoKSAhPSBjb21wcmVzc2VkX2J1Zi5zaXplKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ29tcHJlc3NlZCBidWZmZXIgc2l6ZTogIiA8PCBjb21wcmVzc2VkX2J1Zi5zaXplKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiIC0gRXhwZWN0ZWQ6ICIgPDwgY29tcHJlc3NlZF92ZWMuc2l6ZSgpOworICAgICAgICByZXR1cm4ge307CisgICAgfQorCisgICAgaXRlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGRhdGEpOworICAgIC8vIFdhbGsgdGhyb3VnaCBhbGwgdGhlIGNvbXByZXNzZWQgYnVmZmVycworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29tcHJlc3NlZF9idWYuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgYXV0byYgYnVmZmVyID0gY29tcHJlc3NlZF92ZWNbaV07CisgICAgICAgIGF1dG8mIGJsb2NrID0gY29tcHJlc3NlZF9idWZbaV07CisgICAgICAgIHNpemVfdCBibG9ja19zaXplID0gYnVmZmVyLmNvbXByZXNzaW9uX2ZhY3RvcjsKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGJsb2NrcyB3YXMgaW5kZWVkIGNvbXByZXNzZWQKKyAgICAgICAgaWYgKGJsb2NrLnNpemUoKSA+PSBibG9ja19zaXplKSB7CisgICAgICAgICAgICBidWZmZXIuY29tcHJlc3NlZF9kYXRhLnJlc2l6ZShibG9ja19zaXplKTsKKyAgICAgICAgICAgIHN0ZDo6bWVtY3B5KGJ1ZmZlci5jb21wcmVzc2VkX2RhdGEuZGF0YSgpLCBpdGVyLCBibG9ja19zaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIENvbXByZXNzZWQgYmxvY2sKKyAgICAgICAgICAgIGJ1ZmZlci5jb21wcmVzc2VkX2RhdGEucmVzaXplKGJsb2NrLnNpemUoKSk7CisgICAgICAgICAgICBzdGQ6Om1lbWNweShidWZmZXIuY29tcHJlc3NlZF9kYXRhLmRhdGEoKSwgYmxvY2suZGF0YSgpLCBibG9jay5zaXplKCkpOworICAgICAgICB9CisgICAgICAgIGl0ZXIgKz0gYmxvY2tfc2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIGNvbXByZXNzZWRfdmVjOworfQorCitzdGQ6OnZlY3RvcjxDb3dXcml0ZXJWMzo6Q29tcHJlc3NlZEJ1ZmZlcj4gQ293V3JpdGVyVjM6OkNvbXByZXNzQmxvY2tzKGNvbnN0IHNpemVfdCBudW1fYmxvY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3dPcGVyYXRpb25UeXBlIHR5cGUpIHsKKyAgICBpZiAoY29tcHJlc3Npb25fLmFsZ29yaXRobSA9PSBrQ293Q29tcHJlc3NOb25lKSB7CisgICAgICAgIHJldHVybiBQcm9jZXNzQmxvY2tzV2l0aE5vQ29tcHJlc3Npb24obnVtX2Jsb2NrcywgZGF0YSwgdHlwZSk7CisgICAgfQorCisgICAgY29uc3Qgc2l6ZV90IG51bV90aHJlYWRzID0gKG51bV9ibG9ja3MgPT0gMSkgPyAxIDogbnVtX2NvbXByZXNzX3RocmVhZHNfOworCisgICAgLy8gSWYgbm8gdGhyZWFkcyBhcmUgcmVxdWlyZWQsIGp1c3QgY29tcHJlc3MgdGhlIGJsb2NrcyBpbmxpbmUuCisgICAgaWYgKG51bV90aHJlYWRzIDw9IDEpIHsKKyAgICAgICAgcmV0dXJuIFByb2Nlc3NCbG9ja3NXaXRoQ29tcHJlc3Npb24obnVtX2Jsb2NrcywgZGF0YSwgdHlwZSk7CisgICAgfQorCisgICAgcmV0dXJuIFByb2Nlc3NCbG9ja3NXaXRoVGhyZWFkZWRDb21wcmVzc2lvbihudW1fYmxvY2tzLCBkYXRhLCB0eXBlKTsKK30KKworYm9vbCBDb3dXcml0ZXJWMzo6V3JpdGVPcGVyYXRpb24oc3RkOjpzcGFuPGNvbnN0IENvd09wZXJhdGlvblYzPiBvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNwYW48Y29uc3Qgc3RydWN0IGlvdmVjPiBkYXRhKSB7CisgICAgY29uc3QgYXV0byB0b3RhbF9kYXRhX3NpemUgPQorICAgICAgICAgICAgc3RkOjp0cmFuc2Zvcm1fcmVkdWNlKGRhdGEuYmVnaW4oKSwgZGF0YS5lbmQoKSwgMCwgc3RkOjpwbHVzPHNpemVfdD57fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBzdHJ1Y3QgaW92ZWMmIGEpIHsgcmV0dXJuIGEuaW92X2xlbjsgfSk7CisgICAgaWYgKElzRXN0aW1hdGluZygpKSB7CisgICAgICAgIGhlYWRlcl8ub3BfY291bnQgKz0gb3BzLnNpemUoKTsKKyAgICAgICAgaWYgKGhlYWRlcl8ub3BfY291bnQgPiBoZWFkZXJfLm9wX2NvdW50X21heCkgeworICAgICAgICAgICAgLy8gSWYgd2UgaW5jcmVtZW50IG9wX2NvdW50X21heCwgdGhlIG9mZnNldCBvZiBkYXRhIHNlY3Rpb24gd291bGQKKyAgICAgICAgICAgIC8vIGNoYW5nZS4gU28gbmVlZCB0byB1cGRhdGUgfG5leHRfZGF0YV9wb3NffAorICAgICAgICAgICAgbmV4dF9kYXRhX3Bvc18gKz0gKGhlYWRlcl8ub3BfY291bnQgLSBoZWFkZXJfLm9wX2NvdW50X21heCkgKiBzaXplb2YoQ293T3BlcmF0aW9uVjMpOworICAgICAgICAgICAgaGVhZGVyXy5vcF9jb3VudF9tYXggPSBoZWFkZXJfLm9wX2NvdW50OworICAgICAgICB9CisgICAgICAgIG5leHRfZGF0YV9wb3NfICs9IHRvdGFsX2RhdGFfc2l6ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKGhlYWRlcl8ub3BfY291bnQgKyBvcHMuc2l6ZSgpID4gaGVhZGVyXy5vcF9jb3VudF9tYXgpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ3VycmVudCBvcCBjb3VudCAiIDw8IGhlYWRlcl8ub3BfY291bnQgPDwgIiwgYXR0ZW1wdGluZyB0byB3cml0ZSAiCisgICAgICAgICAgICAgICAgICAgPDwgb3BzLnNpemUoKSA8PCAiIG9wcyB3aWxsIGV4Y2VlZCB0aGUgbWF4IG9mICIgPDwgaGVhZGVyXy5vcF9jb3VudF9tYXg7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY29uc3Qgb2ZmX3Qgb2Zmc2V0ID0gR2V0T3BPZmZzZXQoaGVhZGVyXy5vcF9jb3VudCwgaGVhZGVyXyk7CisgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpXcml0ZUZ1bGx5QXRPZmZzZXQoZmRfLCBvcHMuZGF0YSgpLCBvcHMuc2l6ZSgpICogc2l6ZW9mKG9wc1swXSksIG9mZnNldCkpIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIldyaXRlIGZhaWxlZCBmb3IgIiA8PCBvcHMuc2l6ZSgpIDw8ICIgb3BzIGF0ICIgPDwgb2Zmc2V0OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghZGF0YS5lbXB0eSgpKSB7CisgICAgICAgIGludCB0b3RhbF93cml0dGVuID0gMDsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICB3aGlsZSAoaSA8IGRhdGEuc2l6ZSgpKSB7CisgICAgICAgICAgICBpbnQgY2h1bmsgPSBzdGQ6Om1pbihzdGF0aWNfY2FzdDxpbnQ+KGRhdGEuc2l6ZSgpIC0gaSksIElPVl9NQVgpOworCisgICAgICAgICAgICBjb25zdCBhdXRvIHJldCA9IHB3cml0ZXYoZmRfLCBkYXRhLmRhdGEoKSArIGksIGNodW5rLCBuZXh0X2RhdGFfcG9zXyArIHRvdGFsX3dyaXR0ZW4pOworICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAid3JpdGUgZmFpbGVkIGNodW5rIHNpemUgb2Y6ICIgPDwgY2h1bmsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGF0IG9mZnNldDogIiA8PCBuZXh0X2RhdGFfcG9zXyArIHRvdGFsX3dyaXR0ZW4gPDwgIiAiIDw8IGVycm5vOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRvdGFsX3dyaXR0ZW4gKz0gcmV0OworICAgICAgICAgICAgaSArPSBjaHVuazsKKyAgICAgICAgfQorICAgICAgICBpZiAodG90YWxfd3JpdHRlbiAhPSB0b3RhbF9kYXRhX3NpemUpIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJ3cml0ZSBmYWlsZWQgZm9yIGRhdGEgdmVjdG9yIG9mIHNpemU6ICIgPDwgZGF0YS5zaXplKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgYW5kIHRvdGFsIGRhdGEgbGVuZ3RoOiAiIDw8IHRvdGFsX2RhdGFfc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBhdCBvZmZzZXQ6ICIgPDwgbmV4dF9kYXRhX3Bvc18gPDwgIiAiIDw8IGVycm5vCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBvbmx5IHdyb3RlOiAiIDw8IHRvdGFsX3dyaXR0ZW47CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBoZWFkZXJfLm9wX2NvdW50ICs9IG9wcy5zaXplKCk7CisgICAgbmV4dF9kYXRhX3Bvc18gKz0gdG90YWxfZGF0YV9zaXplOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ293V3JpdGVyVjM6OkZpbmFsaXplKCkgeworICAgIENIRUNLX0dFKGhlYWRlcl8ucHJlZml4LmhlYWRlcl9zaXplLCBzaXplb2YoQ293SGVhZGVyVjMpKTsKKyAgICBDSEVDS19MRShoZWFkZXJfLnByZWZpeC5oZWFkZXJfc2l6ZSwgc2l6ZW9mKGhlYWRlcl8pKTsKKyAgICBpZiAoIUZsdXNoQ2FjaGVPcHMoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghYW5kcm9pZDo6YmFzZTo6V3JpdGVGdWxseUF0T2Zmc2V0KGZkXywgJmhlYWRlcl8sIGhlYWRlcl8ucHJlZml4LmhlYWRlcl9zaXplLCAwKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBTeW5jKCk7Cit9CisKK0Nvd1NpemVJbmZvIENvd1dyaXRlclYzOjpHZXRDb3dTaXplSW5mbygpIGNvbnN0IHsKKyAgICBDb3dTaXplSW5mbyBpbmZvOworICAgIGluZm8uY293X3NpemUgPSBuZXh0X2RhdGFfcG9zXzsKKyAgICBpbmZvLm9wX2NvdW50X21heCA9IGhlYWRlcl8ub3BfY291bnRfbWF4OworICAgIHJldHVybiBpbmZvOworfQorCit9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3QvbGlic25hcHNob3RfY293L3dyaXRlcl92My5oIGIvZnNfbWdyL2xpYnNuYXBzaG90L2xpYnNuYXBzaG90X2Nvdy93cml0ZXJfdjMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTdjZjdhMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9saWJzbmFwc2hvdF9jb3cvd3JpdGVyX3YzLmgKQEAgLTAsMCArMSwxMjQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8c3Bhbj4KKyNpbmNsdWRlIDxzdHJpbmdfdmlldz4KKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8bGlic25hcHNob3QvY293X2Zvcm1hdC5oPgorI2luY2x1ZGUgPHN0b3JhZ2VfbGl0ZXJhbHMvc3RvcmFnZV9saXRlcmFscy5oPgorI2luY2x1ZGUgIndyaXRlcl9iYXNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBzbmFwc2hvdCB7CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpzdG9yYWdlX2xpdGVyYWxzOworLy8gVGhpcyBpcyBhIG11bHRpcGxlIG9uIHRvcCBvZiB0aGUgbnVtYmVyIG9mIGRhdGEgb3BzIHRoYXQgY2FuIGJlIHN0b3JlZCBpbiBvdXIgY2FjaGUgYXQgb25jZS4gVGhpcworLy8gaXMgYWRkZWQgc28gdGhhdCB3ZSBjYW4gY2FjaGUgbW9yZSBub24tZGF0YSBvcHMgYXMgaXQgdGFrZXMgdXAgbGVzcyBzcGFjZS4KK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga05vbkRhdGFPcEJ1ZmZlclNpemUgPSAxNjsKKworY2xhc3MgQ293V3JpdGVyVjMgOiBwdWJsaWMgQ293V3JpdGVyQmFzZSB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBDb3dXcml0ZXJWMyhjb25zdCBDb3dPcHRpb25zJiBvcHRpb25zLCBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQmJiBmZCk7CisgICAgfkNvd1dyaXRlclYzKCkgb3ZlcnJpZGU7CisKKyAgICBib29sIEluaXRpYWxpemUoc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gbGFiZWwgPSB7fSkgb3ZlcnJpZGU7CisgICAgYm9vbCBGaW5hbGl6ZSgpIG92ZXJyaWRlOworICAgIENvd1NpemVJbmZvIEdldENvd1NpemVJbmZvKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgYm9vbCBFbWl0Q29weSh1aW50NjRfdCBuZXdfYmxvY2ssIHVpbnQ2NF90IG9sZF9ibG9jaywgdWludDY0X3QgbnVtX2Jsb2NrcyA9IDEpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBFbWl0UmF3QmxvY2tzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBFbWl0WG9yQmxvY2tzKHVpbnQzMl90IG5ld19ibG9ja19zdGFydCwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2xkX2Jsb2NrLCB1aW50MTZfdCBvZmZzZXQpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBFbWl0WmVyb0Jsb2Nrcyh1aW50NjRfdCBuZXdfYmxvY2tfc3RhcnQsIHVpbnQ2NF90IG51bV9ibG9ja3MpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBFbWl0TGFiZWwodWludDY0X3QgbGFiZWwpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBFbWl0U2VxdWVuY2VEYXRhKHNpemVfdCBudW1fb3BzLCBjb25zdCB1aW50MzJfdCogZGF0YSkgb3ZlcnJpZGU7CisKKyAgcHJpdmF0ZToKKyAgICBzdHJ1Y3QgQ29tcHJlc3NlZEJ1ZmZlciB7CisgICAgICAgIHNpemVfdCBjb21wcmVzc2lvbl9mYWN0b3I7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNvbXByZXNzZWRfZGF0YTsKKyAgICB9OworICAgIHZvaWQgU2V0dXBIZWFkZXJzKCk7CisgICAgYm9vbCBOZWVkc0ZsdXNoKCkgY29uc3Q7CisgICAgYm9vbCBQYXJzZU9wdGlvbnMoKTsKKyAgICBib29sIE9wZW5Gb3JXcml0ZSgpOworICAgIGJvb2wgT3BlbkZvckFwcGVuZCh1aW50NjRfdCBsYWJlbCk7CisgICAgYm9vbCBXcml0ZU9wZXJhdGlvbihzdGQ6OnNwYW48Y29uc3QgQ293T3BlcmF0aW9uVjM+IG9wLCBzdGQ6OnNwYW48Y29uc3Qgc3RydWN0IGlvdmVjPiBkYXRhKTsKKyAgICBib29sIEVtaXRCbG9ja3ModWludDY0X3QgbmV3X2Jsb2NrX3N0YXJ0LCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSwgdWludDY0X3Qgb2xkX2Jsb2NrLAorICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBvZmZzZXQsIENvd09wZXJhdGlvblR5cGUgdHlwZSk7CisgICAgYm9vbCBDb25zdHJ1Y3RDb3dPcENvbXByZXNzZWRCdWZmZXJzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgY29uc3Qgdm9pZCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgb2xkX2Jsb2NrLCB1aW50MTZfdCBvZmZzZXQsIENvd09wZXJhdGlvblR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJsb2Nrc190b193cml0ZSk7CisgICAgYm9vbCBDaGVja09wQ291bnQoc2l6ZV90IG9wX2NvdW50KTsKKworICBwcml2YXRlOgorICAgIHN0ZDo6dmVjdG9yPENvbXByZXNzZWRCdWZmZXI+IFByb2Nlc3NCbG9ja3NXaXRoTm9Db21wcmVzc2lvbihjb25zdCBzaXplX3QgbnVtX2Jsb2NrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ293T3BlcmF0aW9uVHlwZSB0eXBlKTsKKyAgICBzdGQ6OnZlY3RvcjxDb21wcmVzc2VkQnVmZmVyPiBQcm9jZXNzQmxvY2tzV2l0aENvbXByZXNzaW9uKGNvbnN0IHNpemVfdCBudW1fYmxvY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvd09wZXJhdGlvblR5cGUgdHlwZSk7CisgICAgc3RkOjp2ZWN0b3I8Q29tcHJlc3NlZEJ1ZmZlcj4gUHJvY2Vzc0Jsb2Nrc1dpdGhUaHJlYWRlZENvbXByZXNzaW9uKGNvbnN0IHNpemVfdCBudW1fYmxvY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3dPcGVyYXRpb25UeXBlIHR5cGUpOworICAgIHN0ZDo6dmVjdG9yPENvbXByZXNzZWRCdWZmZXI+IENvbXByZXNzQmxvY2tzKGNvbnN0IHNpemVfdCBudW1fYmxvY2tzLCBjb25zdCB2b2lkKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvd09wZXJhdGlvblR5cGUgdHlwZSk7CisgICAgc2l6ZV90IEdldENvbXByZXNzaW9uRmFjdG9yKGNvbnN0IHNpemVfdCBibG9ja3NfdG9fY29tcHJlc3MsIENvd09wZXJhdGlvblR5cGUgdHlwZSkgY29uc3Q7CisKKyAgICBjb25zdGV4cHIgYm9vbCBJc0Jsb2NrQWxpZ25lZChjb25zdCB1aW50NjRfdCBzaXplKSB7CisgICAgICAgIC8vIFRoZXNlIGFyZSB0aGUgb25seSBibG9jayBzaXplIHN1cHBvcnRlZC4gQmxvY2sgc2l6ZSBiZXlvbmQgMjU2aworICAgICAgICAvLyBtYXkgaW1wYWN0IHJhbmRvbSByZWFkIHBlcmZvcm1hbmNlIHBvc3QgT1RBIGJvb3QuCisgICAgICAgIGNvbnN0IHNpemVfdCB2YWx1ZXNbXSA9IHs0X0tpQiwgOF9LaUIsIDE2X0tpQiwgMzJfS2lCLCA2NF9LaUIsIDEyOF9LaUIsIDI1Nl9LaUJ9OworCisgICAgICAgIGF1dG8gaXQgPSBzdGQ6Omxvd2VyX2JvdW5kKHN0ZDo6YmVnaW4odmFsdWVzKSwgc3RkOjplbmQodmFsdWVzKSwgc2l6ZSk7CisKKyAgICAgICAgaWYgKGl0ICE9IHN0ZDo6ZW5kKHZhbHVlcykgJiYgKml0ID09IHNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc2l6ZV90IENhY2hlZERhdGFTaXplKCkgY29uc3Q7CisgICAgYm9vbCBSZWFkQmFja1ZlcmlmaWNhdGlvbigpOworICAgIGJvb2wgRmx1c2hDYWNoZU9wcygpOworICAgIHZvaWQgSW5pdFdvcmtlcnMoKTsKKyAgICBDb3dIZWFkZXJWMyBoZWFkZXJfe307CisgICAgQ293Q29tcHJlc3Npb24gY29tcHJlc3Npb25fOworICAgIC8vIGluIHRoZSBjYXNlIHRoYXQgd2UgYXJlIHVzaW5nIG9uZSB0aHJlYWQgZm9yIGNvbXByZXNzaW9uLCB3ZSBjYW4gc3RvcmUgYW5kIHJlLXVzZSB0aGUgc2FtZQorICAgIC8vIGNvbXByZXNzb3IKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SUNvbXByZXNzb3I+IGNvbXByZXNzb3JfOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDb21wcmVzc1dvcmtlcj4+IGNvbXByZXNzX3RocmVhZHNfOworICAgIC8vIFJlc3VtZSBwb2ludHMgY29udGFpbiBhIGxhZWJsICsgY293X29wX2luZGV4LgorICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3RvcjxSZXN1bWVQb2ludD4+IHJlc3VtZV9wb2ludHNfOworCisgICAgdWludDY0X3QgbmV4dF9kYXRhX3Bvc18gPSAwOworCisgICAgLy8gaW4gdGhlIGNhc2UgdGhhdCB3ZSBhcmUgdXNpbmcgb25lIHRocmVhZCBmb3IgY29tcHJlc3Npb24sIHdlIGNhbiBzdG9yZSBhbmQgcmUtdXNlIHRoZSBzYW1lCisgICAgLy8gY29tcHJlc3NvcgorICAgIGludCBudW1fY29tcHJlc3NfdGhyZWFkc18gPSAxOworICAgIHNpemVfdCBiYXRjaF9zaXplXyA9IDE7CisgICAgc3RkOjp2ZWN0b3I8Q293T3BlcmF0aW9uVjM+IGNhY2hlZF9vcHNfOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBjYWNoZWRfZGF0YV87CisgICAgc3RkOjp2ZWN0b3I8c3RydWN0IGlvdmVjPiBkYXRhX3ZlY187CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnRocmVhZD4gdGhyZWFkc187Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3QvcGFydGl0aW9uX2Nvd19jcmVhdG9yLmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9wYXJ0aXRpb25fY293X2NyZWF0b3IuY3BwCmluZGV4IDViYzdlNjUuLmMwZDIwNzMgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9wYXJ0aXRpb25fY293X2NyZWF0b3IuY3BwCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9wYXJ0aXRpb25fY293X2NyZWF0b3IuY3BwCkBAIC0yMTcsNiArMjE3LDcgQEAKIAogICAgIGlmICh1cGRhdGUgJiYgdXBkYXRlLT5oYXNfZXN0aW1hdGVfY293X3NpemUoKSkgewogICAgICAgICByZXQuc25hcHNob3Rfc3RhdHVzLnNldF9lc3RpbWF0ZWRfY293X3NpemUodXBkYXRlLT5lc3RpbWF0ZV9jb3dfc2l6ZSgpKTsKKyAgICAgICAgcmV0LnNuYXBzaG90X3N0YXR1cy5zZXRfZXN0aW1hdGVkX29wc19idWZmZXJfc2l6ZSh1cGRhdGUtPmVzdGltYXRlX29wX2NvdW50X21heCgpKTsKICAgICB9CiAKICAgICBpZiAocmV0LnNuYXBzaG90X3N0YXR1cy5zbmFwc2hvdF9zaXplKCkgPT0gMCkgewpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3BhcnRpdGlvbl9jb3dfY3JlYXRvci5oIGIvZnNfbWdyL2xpYnNuYXBzaG90L3BhcnRpdGlvbl9jb3dfY3JlYXRvci5oCmluZGV4IGJkNWM4Y2IuLjFhZGJiYTIgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9wYXJ0aXRpb25fY293X2NyZWF0b3IuaAorKysgYi9mc19tZ3IvbGlic25hcHNob3QvcGFydGl0aW9uX2Nvd19jcmVhdG9yLmgKQEAgLTU5LDYgKzU5LDExIEBACiAgICAgLy8gVHJ1ZSBpZiBzbmFwdXNlcmQgQ09XcyBhcmUgZW5hYmxlZC4KICAgICBib29sIHVzaW5nX3NuYXB1c2VyZCA9IGZhbHNlOwogICAgIHN0ZDo6c3RyaW5nIGNvbXByZXNzaW9uX2FsZ29yaXRobTsKKyAgICB1aW50NjRfdCBjb21wcmVzc2lvbl9mYWN0b3I7CisgICAgdWludDMyX3QgcmVhZF9haGVhZF9zaXplOworCisgICAgLy8gRW5hYmxlIGRpcmVjdCByZWFkcyBvbiBzb3VyY2UgZGV2aWNlCisgICAgYm9vbCBvX2RpcmVjdDsKIAogICAgIC8vIFRydWUgaWYgbXVsdGktdGhyZWFkZWQgY29tcHJlc3Npb24gc2hvdWxkIGJlIGVuYWJsZWQKICAgICBib29sIGVuYWJsZV90aHJlYWRpbmc7CmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3QvcGFydGl0aW9uX2Nvd19jcmVhdG9yX3Rlc3QuY3BwIGIvZnNfbWdyL2xpYnNuYXBzaG90L3BhcnRpdGlvbl9jb3dfY3JlYXRvcl90ZXN0LmNwcAppbmRleCBjZjI2YTE2Li44MzU2YzBjIDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3QvcGFydGl0aW9uX2Nvd19jcmVhdG9yX3Rlc3QuY3BwCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9wYXJ0aXRpb25fY293X2NyZWF0b3JfdGVzdC5jcHAKQEAgLTM5LDYgKzM5LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBzbmFwc2hvdCB7CiAKKy8vIEBWc3JUZXN0ID0gMy43LjYKIGNsYXNzIFBhcnRpdGlvbkNvd0NyZWF0b3JUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CiAgIHB1YmxpYzoKICAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewpAQCAtMjQ5LDggKzI1MCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50YXJnZXRfcGFydGl0aW9uID0gc3lzdGVtX2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jdXJyZW50X21ldGFkYXRhID0gYnVpbGRlcl9hLmdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3VycmVudF9zdWZmaXggPSAiX2EiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudXNpbmdfc25hcHVzZXJkID0gdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVwZGF0ZSA9ICZ1cGRhdGV9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudXBkYXRlID0gJnVwZGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVzaW5nX3NuYXB1c2VyZCA9IHRydWV9OwogCiAgICAgYXV0byByZXQgPSBjcmVhdG9yLlJ1bigpOwogICAgIEFTU0VSVF9UUlVFKHJldC5oYXNfdmFsdWUoKSk7CkBAIC0yNzUsOCArMjc2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRhcmdldF9wYXJ0aXRpb24gPSBzeXN0ZW1fYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmN1cnJlbnRfbWV0YWRhdGEgPSBidWlsZGVyX2EuZ2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jdXJyZW50X3N1ZmZpeCA9ICJfYSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51c2luZ19zbmFwdXNlcmQgPSB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudXBkYXRlID0gbnVsbHB0cn07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51cGRhdGUgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudXNpbmdfc25hcHVzZXJkID0gdHJ1ZX07CiAKICAgICBhdXRvIHJldCA9IGNyZWF0b3IuUnVuKCk7CiAgICAgQVNTRVJUX0ZBTFNFKHJldC5oYXNfdmFsdWUoKSk7CmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc2NyYXRjaF9zdXBlci5jcHAgYi9mc19tZ3IvbGlic25hcHNob3Qvc2NyYXRjaF9zdXBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNjNGJiZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zY3JhdGNoX3N1cGVyLmNwcApAQCAtMCwwICsxLDQxNiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxzZWxpbnV4L3NlbGludXguaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0dmZzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3Zmcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zY29wZWd1YXJkLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CisjaW5jbHVkZSA8ZXh0NF91dGlscy9leHQ0X3V0aWxzLmg+CisKKyNpbmNsdWRlIDxsaWJzbmFwc2hvdC9zbmFwc2hvdC5oPgorCisjaW5jbHVkZSA8ZnNfbWdyLmg+CisjaW5jbHVkZSA8ZnNfbWdyX2RtX2xpbmVhci5oPgorI2luY2x1ZGUgPGZzdGFiL2ZzdGFiLmg+CisjaW5jbHVkZSA8bGlibHAvYnVpbGRlci5oPgorI2luY2x1ZGUgPHN0b3JhZ2VfbGl0ZXJhbHMvc3RvcmFnZV9saXRlcmFscy5oPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxmaWxlc3lzdGVtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxvcHRpb25hbD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZGV2aWNlX2luZm8uaCIKKyNpbmNsdWRlICJzY3JhdGNoX3N1cGVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ6OmxpdGVyYWxzOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmRtOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmZzX21ncjsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpzdG9yYWdlX2xpdGVyYWxzOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugc25hcHNob3QgeworCitzdGF0aWMgYm9vbCBVbW91bnRTY3JhdGNoKCkgeworICAgIGF1dG8gb3RhX2RpciA9IHN0ZDo6c3RyaW5nKGtPdGFNZXRhZGF0YU1vdW50KSArICIvIiArICJvdGEiOworICAgIHN0ZDo6ZXJyb3JfY29kZSBlYzsKKworICAgIGlmIChzdGQ6OmZpbGVzeXN0ZW06OnJlbW92ZV9hbGwob3RhX2RpciwgZWMpID09IHN0YXRpY19jYXN0PHN0ZDo6dWludG1heF90PigtMSkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlbW92ZSBPVEEgZGlyZWN0b3J5OiAiIDw8IGVjLm1lc3NhZ2UoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICh1bW91bnQoa090YU1ldGFkYXRhTW91bnQpICE9IDApIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIlVtb3VudFNjcmF0Y2ggZmFpbGVkIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIExPRyhJTkZPKSA8PCAidW1vdW50IHNjcmF0Y2hfc3VwZXIgc3VjY2VzcyI7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ2xlYW51cFNjcmF0Y2hPdGFNZXRhZGF0YUlmUHJlc2VudChjb25zdCBJU25hcHNob3RNYW5hZ2VyOjpJRGV2aWNlSW5mbyogaW5mbykgeworICAgIGlmICghVW1vdW50U2NyYXRjaCgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TWV0YWRhdGFCdWlsZGVyPiBidWlsZGVyOworICAgIGNvbnN0IGF1dG8gcGFydGl0aW9uX25hbWUgPSBhbmRyb2lkOjpiYXNlOjpCYXNlbmFtZShrT3RhTWV0YWRhdGFNb3VudCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiBzbG90cyA9IHswLCAxfTsKKworICAgIGlmIChpbmZvID09IG51bGxwdHIpIHsKKyAgICAgICAgaW5mbyA9IG5ldyBhbmRyb2lkOjpzbmFwc2hvdDo6RGV2aWNlSW5mbygpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHN1cGVyX2RldmljZTsKKyAgICBpZiAoaW5mby0+SXNUZXN0RGV2aWNlKCkpIHsKKyAgICAgICAgc3VwZXJfZGV2aWNlID0gInN1cGVyIjsKKyAgICB9IGVsc2UgeworICAgICAgICBzdXBlcl9kZXZpY2UgPSBrUGh5c2ljYWxEZXZpY2UgKyBmc19tZ3JfZ2V0X3N1cGVyX3BhcnRpdGlvbl9uYW1lKCk7CisgICAgfQorICAgIGNvbnN0IGF1dG8mIG9wZW5lciA9IGluZm8tPkdldFBhcnRpdGlvbk9wZW5lcigpOworICAgIHN0ZDo6c3RyaW5nIHNsb3Rfc3VmZml4ID0gaW5mby0+R2V0U2xvdFN1ZmZpeCgpOworICAgIC8vIFdhbGsgYm90aCB0aGUgc2xvdHMgYW5kIGNsZWFuIHVwIG1ldGFkYXRhIHJlbGF0ZWQgdG8gc2NyYXRjaCBzcGFjZSBmcm9tCisgICAgLy8gYm90aCB0aGUgc2xvdHMuCisgICAgZm9yIChhdXRvIHNsb3QgOiBzbG90cykgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TWV0YWRhdGFCdWlsZGVyPiBidWlsZGVyID0gTWV0YWRhdGFCdWlsZGVyOjpOZXcob3BlbmVyLCBzdXBlcl9kZXZpY2UsIHNsb3QpOworICAgICAgICBpZiAoIWJ1aWxkZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChidWlsZGVyLT5GaW5kUGFydGl0aW9uKHBhcnRpdGlvbl9uYW1lKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBidWlsZGVyLT5SZW1vdmVQYXJ0aXRpb24ocGFydGl0aW9uX25hbWUpOworICAgICAgICAgICAgYXV0byBtZXRhZGF0YSA9IGJ1aWxkZXItPkV4cG9ydCgpOworICAgICAgICAgICAgaWYgKCFtZXRhZGF0YSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghVXBkYXRlUGFydGl0aW9uVGFibGUoaW5mby0+R2V0UGFydGl0aW9uT3BlbmVyKCksIHN1cGVyX2RldmljZSwgKm1ldGFkYXRhLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90KSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlVwZGF0ZVBhcnRpdGlvblRhYmxlIGZhaWxlZCBmb3Igc2xvdDogIiA8PCBzbG90OworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChEZXN0cm95TG9naWNhbFBhcnRpdGlvbihwYXJ0aXRpb25fbmFtZSkpIHsKKyAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIkNsZWFudXBTY3JhdGNoT3RhTWV0YWRhdGEgc3VjY2VzcyBmb3Igc2xvdDogIiA8PCBzbG90OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIFNldHVwT1RBRGlycygpIHsKKyAgICBpZiAoc2V0ZnNjcmVhdGVjb24oYW5kcm9pZDo6c25hcHNob3Q6OmtPdGFNZXRhZGF0YUZpbGVDb250ZXh0KSkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAic2V0ZnNjcmVhdGVjb24gZmFpbGVkOiAiIDw8IGFuZHJvaWQ6OnNuYXBzaG90OjprT3RhTWV0YWRhdGFGaWxlQ29udGV4dDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjb25zdCBhdXRvIG90YV9kaXIgPSBzdGQ6OnN0cmluZyhrT3RhTWV0YWRhdGFNb3VudCkgKyAiLyIgKyAib3RhIjsKKyAgICBpZiAobWtkaXIob3RhX2Rpci5jX3N0cigpLCAwNzU1KSAhPSAwICYmIGVycm5vICE9IEVFWElTVCkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAibWtkaXIgIiA8PCBvdGFfZGlyOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3QgYXV0byBzbmFwc2hvdF9kaXIgPSBvdGFfZGlyICsgIi8iICsgInNuYXBzaG90cyI7CisgICAgaWYgKG1rZGlyKHNuYXBzaG90X2Rpci5jX3N0cigpLCAwNzU1KSAhPSAwICYmIGVycm5vICE9IEVFWElTVCkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAibWtkaXIgIiA8PCBzbmFwc2hvdF9kaXI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHNldGZzY3JlYXRlY29uKG51bGxwdHIpKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJzZXRmc2NyZWF0ZWNvbiBudWxsIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgTW91bnRTY3JhdGNoKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VfcGF0aCkgeworICAgIGlmIChhY2Nlc3MoZGV2aWNlX3BhdGguY19zdHIoKSwgUl9PSyB8IFdfT0spKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlBhdGggZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IHJlYWR3cml0ZTogIiA8PCBkZXZpY2VfcGF0aDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGZpbGVzeXN0ZW1fY2FuZGlkYXRlOworICAgIGlmIChmc19tZ3JfaXNfZXh0NChkZXZpY2VfcGF0aCkpIHsKKyAgICAgICAgZmlsZXN5c3RlbV9jYW5kaWRhdGUgPSAiZXh0NCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiU2NyYXRjaCBwYXJ0aXRpb24gaXMgbm90IGV4dDQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChzZXRmc2NyZWF0ZWNvbihhbmRyb2lkOjpzbmFwc2hvdDo6a090YU1ldGFkYXRhRmlsZUNvbnRleHQpKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJzZXRmc2NyZWF0ZWNvbiBmYWlsZWQ6ICIgPDwgYW5kcm9pZDo6c25hcHNob3Q6OmtPdGFNZXRhZGF0YUZpbGVDb250ZXh0OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChta2RpcihrT3RhTWV0YWRhdGFNb3VudCwgMDc1NSkgJiYgKGVycm5vICE9IEVFWElTVCkpIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgImNyZWF0ZSAiIDw8IGtPdGFNZXRhZGF0YU1vdW50OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYW5kcm9pZDo6ZnNfbWdyOjpGc3RhYkVudHJ5IGVudHJ5OworICAgIGVudHJ5LmJsa19kZXZpY2UgPSBkZXZpY2VfcGF0aDsKKyAgICBlbnRyeS5tb3VudF9wb2ludCA9IGtPdGFNZXRhZGF0YU1vdW50OworICAgIGVudHJ5LmZsYWdzID0gTVNfTk9BVElNRTsKKyAgICBlbnRyeS5mbGFncyB8PSBNU19TWU5DSFJPTk9VUzsKKyAgICBlbnRyeS5mc19vcHRpb25zID0gIm5vZGlzY2FyZCI7CisgICAgZnNfbWdyX3NldF9ibGtfcm8oZGV2aWNlX3BhdGgsIGZhbHNlKTsKKyAgICBlbnRyeS5mc19tZ3JfZmxhZ3MuY2hlY2sgPSB0cnVlOworCisgICAgYm9vbCBtb3VudGVkID0gZmFsc2U7CisgICAgZW50cnkuZnNfdHlwZSA9IGZpbGVzeXN0ZW1fY2FuZGlkYXRlLmNfc3RyKCk7CisgICAgaWYgKGZzX21ncl9kb19tb3VudF9vbmUoZW50cnkpID09IDApIHsKKyAgICAgICAgbW91bnRlZCA9IHRydWU7CisgICAgfQorCisgICAgaWYgKHNldGZzY3JlYXRlY29uKG51bGxwdHIpKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJzZXRmc2NyZWF0ZWNvbiBudWxsIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIW1vdW50ZWQpIHsKKyAgICAgICAgcm1kaXIoa090YU1ldGFkYXRhTW91bnQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIE1ha2VTY3JhdGNoRmlsZXN5c3RlbShjb25zdCBzdGQ6OnN0cmluZyYgc2NyYXRjaF9kZXZpY2UpIHsKKyAgICBzdGQ6OnN0cmluZyBmc190eXBlOworICAgIHN0ZDo6c3RyaW5nIGNvbW1hbmQ7CisgICAgaWYgKCFhY2Nlc3Moa01rRXh0NCwgWF9PSykpIHsKKyAgICAgICAgZnNfdHlwZSA9ICJleHQ0IjsKKyAgICAgICAgY29tbWFuZCA9IGtNa0V4dDQgKyAiIC1GIC1iIDQwOTYgLXQgZXh0NCAtbSAwIC1PIGhhc19qb3VybmFsIC1NICJzICsga090YU1ldGFkYXRhTW91bnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiTm8gc3VwcG9ydGVkIG1rZnMgY29tbWFuZCBvciBmaWxlc3lzdGVtIGRyaXZlciBhdmFpbGFibGUsIHN1cHBvcnRlZCAiCisgICAgICAgICAgICAgICAgICAgICAgImZpbGVzeXN0ZW1zICIKKyAgICAgICAgICAgICAgICAgICAgICAiYXJlOiBmMmZzLCBleHQ0IjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjb21tYW5kICs9ICIgIiArIHNjcmF0Y2hfZGV2aWNlICsgIiA+L2Rldi9udWxsIDI+L2Rldi9udWxsIDwvZGV2L251bGwiOworICAgIGZzX21ncl9zZXRfYmxrX3JvKHNjcmF0Y2hfZGV2aWNlLCBmYWxzZSk7CisgICAgYXV0byByZXQgPSBzeXN0ZW0oY29tbWFuZC5jX3N0cigpKTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIm1ha2UgIiA8PCBmc190eXBlIDw8ICIgZmlsZXN5c3RlbSBvbiAiIDw8IHNjcmF0Y2hfZGV2aWNlCisgICAgICAgICAgICAgICAgICAgPDwgIiByZXR1cm49IiA8PCByZXQ7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIENyZWF0ZUR5bmFtaWNTY3JhdGNoKGNvbnN0IElTbmFwc2hvdE1hbmFnZXI6OklEZXZpY2VJbmZvKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIHNjcmF0Y2hfZGV2aWNlKSB7CisgICAgY29uc3QgYXV0byBwYXJ0aXRpb25fbmFtZSA9IGFuZHJvaWQ6OmJhc2U6OkJhc2VuYW1lKGtPdGFNZXRhZGF0YU1vdW50KTsKKyAgICBhdXRvJiBkbSA9IERldmljZU1hcHBlcjo6SW5zdGFuY2UoKTsKKyAgICBpZiAoaW5mbyA9PSBudWxscHRyKSB7CisgICAgICAgIGluZm8gPSBuZXcgYW5kcm9pZDo6c25hcHNob3Q6OkRldmljZUluZm8oKTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBzdXBlcl9kZXZpY2U7CisgICAgaWYgKGluZm8tPklzVGVzdERldmljZSgpKSB7CisgICAgICAgIHN1cGVyX2RldmljZSA9ICJzdXBlciI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3VwZXJfZGV2aWNlID0ga1BoeXNpY2FsRGV2aWNlICsgZnNfbWdyX2dldF9zdXBlcl9wYXJ0aXRpb25fbmFtZSgpOworICAgIH0KKworICAgIGJvb2wgcGFydGl0aW9uX2V4aXN0cyA9IGRtLkdldFN0YXRlKHBhcnRpdGlvbl9uYW1lKSAhPSBEbURldmljZVN0YXRlOjpJTlZBTElEOworICAgIGlmIChwYXJ0aXRpb25fZXhpc3RzKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlBhcnRpdGlvbiBhbHJlYWR5IGV4aXN0czogIiA8PCBwYXJ0aXRpb25fbmFtZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IGF1dG8mIG9wZW5lciA9IGluZm8tPkdldFBhcnRpdGlvbk9wZW5lcigpOworICAgIHN0ZDo6c3RyaW5nIHNsb3Rfc3VmZml4ID0gaW5mby0+R2V0U2xvdFN1ZmZpeCgpOworICAgIGludCBzbG90ID0gU2xvdE51bWJlckZvclNsb3RTdWZmaXgoc2xvdF9zdWZmaXgpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxNZXRhZGF0YUJ1aWxkZXI+IGJ1aWxkZXIgPSBNZXRhZGF0YUJ1aWxkZXI6Ok5ldyhvcGVuZXIsIHN1cGVyX2RldmljZSwgc2xvdCk7CisKKyAgICBpZiAoIWJ1aWxkZXIpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAib3BlbiAiIDw8IHN1cGVyX2RldmljZSA8PCAiIGZhaWxlZCI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBhdXRvIHBhcnRpdGlvbiA9IGJ1aWxkZXItPkZpbmRQYXJ0aXRpb24ocGFydGl0aW9uX25hbWUpOworICAgIHBhcnRpdGlvbl9leGlzdHMgPSBwYXJ0aXRpb24gIT0gbnVsbHB0cjsKKyAgICBpZiAocGFydGl0aW9uX2V4aXN0cykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJQYXJ0aXRpb24gZXhpc3RzIGluIHN1cGVyIG1ldGFkYXRhIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHBhcnRpdGlvbiA9IGJ1aWxkZXItPkFkZFBhcnRpdGlvbihwYXJ0aXRpb25fbmFtZSwgTFBfUEFSVElUSU9OX0FUVFJfTk9ORSk7CisgICAgaWYgKCFwYXJ0aXRpb24pIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQWRkUGFydGl0aW9uIGZhaWxlZCAiIDw8IHBhcnRpdGlvbl9uYW1lOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYXV0byBmcmVlX3NwYWNlID0gYnVpbGRlci0+QWxsb2NhdGFibGVTcGFjZSgpIC0gYnVpbGRlci0+VXNlZFNwYWNlKCk7CisgICAgaWYgKGZyZWVfc3BhY2UgPCBrT3RhTWV0YWRhdGFQYXJ0aXRpb25TaXplKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIk5vIHNwYWNlIGluIHN1cGVyIHBhcnRpdGlvbi4gRnJlZSBzcGFjZTogIiA8PCBmcmVlX3NwYWNlCisgICAgICAgICAgICAgICAgICAgPDwgIiBSZXF1ZXN0ZWQgc3BhY2U6ICIgPDwga090YU1ldGFkYXRhUGFydGl0aW9uU2l6ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIExPRyhJTkZPKSA8PCAiQ3JlYXRlRHluYW1pY1NjcmF0Y2g6IGZyZWVfc3BhY2U6ICIgPDwgZnJlZV9zcGFjZQorICAgICAgICAgICAgICA8PCAiIHNjcmF0Y2hfc2l6ZTogIiA8PCBrT3RhTWV0YWRhdGFQYXJ0aXRpb25TaXplIDw8ICIgc2xvdF9udW1iZXI6ICIgPDwgc2xvdDsKKworICAgIGlmICghYnVpbGRlci0+UmVzaXplUGFydGl0aW9uKHBhcnRpdGlvbiwga090YU1ldGFkYXRhUGFydGl0aW9uU2l6ZSkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiUmVzaXplUGFydGl0aW9uIGZhaWxlZDogIiA8PCBwYXJ0aXRpb25fbmFtZSA8PCAiIGZyZWVfc3BhY2U6ICIgPDwgZnJlZV9zcGFjZQorICAgICAgICAgICAgICAgICAgIDw8ICIgc2NyYXRjaF9zaXplOiAiIDw8IGtPdGFNZXRhZGF0YVBhcnRpdGlvblNpemU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBhdXRvIG1ldGFkYXRhID0gYnVpbGRlci0+RXhwb3J0KCk7CisgICAgQ3JlYXRlTG9naWNhbFBhcnRpdGlvblBhcmFtcyBwYXJhbXM7CisKKyAgICBpZiAoIW1ldGFkYXRhIHx8CisgICAgICAgICFVcGRhdGVQYXJ0aXRpb25UYWJsZShpbmZvLT5HZXRQYXJ0aXRpb25PcGVuZXIoKSwgc3VwZXJfZGV2aWNlLCAqbWV0YWRhdGEuZ2V0KCksIHNsb3QpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlVwZGF0ZVBhcnRpdGlvblRhYmxlIGZhaWxlZDogIiA8PCBwYXJ0aXRpb25fbmFtZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBwYXJhbXMgPSB7CisgICAgICAgICAgICAuYmxvY2tfZGV2aWNlID0gc3VwZXJfZGV2aWNlLAorICAgICAgICAgICAgLm1ldGFkYXRhX3Nsb3QgPSBzbG90LAorICAgICAgICAgICAgLnBhcnRpdGlvbl9uYW1lID0gcGFydGl0aW9uX25hbWUsCisgICAgICAgICAgICAuZm9yY2Vfd3JpdGFibGUgPSB0cnVlLAorICAgICAgICAgICAgLnRpbWVvdXRfbXMgPSAxMHMsCisgICAgICAgICAgICAucGFydGl0aW9uX29wZW5lciA9ICZpbmZvLT5HZXRQYXJ0aXRpb25PcGVuZXIoKSwKKyAgICB9OworCisgICAgaWYgKCFDcmVhdGVMb2dpY2FsUGFydGl0aW9uKHBhcmFtcywgc2NyYXRjaF9kZXZpY2UpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNyZWF0ZUxvZ2ljYWxQYXJ0aXRpb24gZmFpbGVkIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIExPRyhJTkZPKSA8PCAiU2NyYXRjaCBkZXZpY2UgY3JlYXRlZCBzdWNjZXNzZnVsbHk6ICIgPDwgKnNjcmF0Y2hfZGV2aWNlIDw8ICIgc2xvdDogIiA8PCBzbG90OworICAgIHJldHVybiB0cnVlOworfQorCitib29sIElzU2NyYXRjaE90YU1ldGFkYXRhT25TdXBlcigpIHsKKyAgICBhdXRvIHBhcnRpdGlvbl9uYW1lID0gYW5kcm9pZDo6YmFzZTo6QmFzZW5hbWUoa090YU1ldGFkYXRhTW91bnQpOworICAgIGF1dG8gc291cmNlX3Nsb3QgPSBmc19tZ3JfZ2V0X3Nsb3Rfc3VmZml4KCk7CisgICAgYXV0byBzb3VyY2Vfc2xvdF9udW1iZXIgPSBTbG90TnVtYmVyRm9yU2xvdFN1ZmZpeChzb3VyY2Vfc2xvdCk7CisKKyAgICBjb25zdCBhdXRvIHN1cGVyX2RldmljZSA9CisgICAgICAgICAgICBrUGh5c2ljYWxEZXZpY2UgKyBmc19tZ3JfZ2V0X3N1cGVyX3BhcnRpdGlvbl9uYW1lKCFzb3VyY2Vfc2xvdF9udW1iZXIpOworCisgICAgYXV0byBtZXRhZGF0YSA9IGFuZHJvaWQ6OmZzX21ncjo6UmVhZE1ldGFkYXRhKHN1cGVyX2RldmljZSwgIXNvdXJjZV9zbG90X251bWJlcik7CisgICAgaWYgKCFtZXRhZGF0YSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGF1dG8gcGFydGl0aW9uID0gYW5kcm9pZDo6ZnNfbWdyOjpGaW5kUGFydGl0aW9uKCptZXRhZGF0YS5nZXQoKSwgcGFydGl0aW9uX25hbWUpOworICAgIGlmICghcGFydGl0aW9uKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBhdXRvJiBkbSA9IERldmljZU1hcHBlcjo6SW5zdGFuY2UoKTsKKyAgICBpZiAoZG0uR2V0U3RhdGUocGFydGl0aW9uX25hbWUpID09IERtRGV2aWNlU3RhdGU6OkFDVElWRSkgeworICAgICAgICBMT0coSU5GTykgPDwgIlBhcnRpdGlvbjogIiA8PCBwYXJ0aXRpb25fbmFtZSA8PCAiIGlzIGFjdGl2ZSI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIENyZWF0ZUxvZ2ljYWxQYXJ0aXRpb25QYXJhbXMgcGFyYW1zID0geworICAgICAgICAgICAgLmJsb2NrX2RldmljZSA9IHN1cGVyX2RldmljZSwKKyAgICAgICAgICAgIC5tZXRhZGF0YSA9IG1ldGFkYXRhLmdldCgpLAorICAgICAgICAgICAgLnBhcnRpdGlvbiA9IHBhcnRpdGlvbiwKKyAgICB9OworCisgICAgc3RkOjpzdHJpbmcgc2NyYXRjaF9wYXRoOworICAgIGlmICghQ3JlYXRlTG9naWNhbFBhcnRpdGlvbihwYXJhbXMsICZzY3JhdGNoX3BhdGgpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBjcmVhdGUgbG9naWNhbCBwYXJ0aXRpb246ICIgPDwgcGFydGl0aW9uX25hbWU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgTE9HKElORk8pIDw8ICJTY3JhdGNoIGRldmljZTogIiA8PCBzY3JhdGNoX3BhdGggPDwgIiBjcmVhdGVkIHN1Y2Nlc3NmdWxseSI7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RkOjpzdHJpbmcgR2V0U2NyYXRjaE90YU1ldGFkYXRhUGFydGl0aW9uKCkgeworICAgIHN0ZDo6c3RyaW5nIGRldmljZTsKKyAgICBhdXRvJiBkbSA9IERldmljZU1hcHBlcjo6SW5zdGFuY2UoKTsKKyAgICBhdXRvIHBhcnRpdGlvbl9uYW1lID0gYW5kcm9pZDo6YmFzZTo6QmFzZW5hbWUoa090YU1ldGFkYXRhTW91bnQpOworCisgICAgYm9vbCBpbnZhbGlkX3BhcnRpdGlvbiA9IChkbS5HZXRTdGF0ZShwYXJ0aXRpb25fbmFtZSkgPT0gRG1EZXZpY2VTdGF0ZTo6SU5WQUxJRCk7CisgICAgaWYgKCFpbnZhbGlkX3BhcnRpdGlvbiAmJiBkbS5HZXREbURldmljZVBhdGhCeU5hbWUocGFydGl0aW9uX25hbWUsICZkZXZpY2UpKSB7CisgICAgICAgIHJldHVybiBkZXZpY2U7CisgICAgfQorICAgIHJldHVybiAiIjsKK30KKworc3RhdGljIGJvb2wgU2NyYXRjaEFscmVhZHlNb3VudGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBtb3VudF9wb2ludCkgeworICAgIGFuZHJvaWQ6OmZzX21ncjo6RnN0YWIgZnN0YWI7CisgICAgaWYgKCFSZWFkRnN0YWJGcm9tUHJvY01vdW50cygmZnN0YWIpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiBlbnRyeSA6IEdldEVudHJpZXNGb3JNb3VudFBvaW50KCZmc3RhYiwgbW91bnRfcG9pbnQpKSB7CisgICAgICAgIGlmIChlbnRyeS0+ZnNfdHlwZSA9PSAiZXh0NCIpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RkOjpzdHJpbmcgTWFwU2NyYXRjaE90YU1ldGFkYXRhUGFydGl0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBzY3JhdGNoX2RldmljZSkgeworICAgIGlmICghU2NyYXRjaEFscmVhZHlNb3VudGVkKGtPdGFNZXRhZGF0YU1vdW50KSkgeworICAgICAgICBpZiAoIU1vdW50U2NyYXRjaChzY3JhdGNoX2RldmljZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF1dG8gb3RhX2RpciA9IHN0ZDo6c3RyaW5nKGtPdGFNZXRhZGF0YU1vdW50KSArICIvIiArICJvdGEiOworICAgIGlmIChhY2Nlc3Mob3RhX2Rpci5jX3N0cigpLCBGX09LKSAhPSAwKSB7CisgICAgICAgIHJldHVybiAiIjsKKyAgICB9CisgICAgcmV0dXJuIG90YV9kaXI7Cit9CisKKy8vIEVudHJ5IHBvaW50IHRvIGNyZWF0ZSBhIHNjcmF0Y2ggZGV2aWNlIG9uIHN1cGVyIHBhcnRpdGlvbgorLy8gVGhpcyB3aWxsIGNyZWF0ZSBhIDFNQiBzcGFjZSBpbiBzdXBlci4gVGhlIHNwYWNlIHdpbGwgYmUKKy8vIGZyb20gdGhlIGN1cnJlbnQgYWN0aXZlIHNsb3QuIEV4dDQgZmlsZXN5c3RlbSB3aWxsIGJlIGNyZWF0ZWQKKy8vIG9uIHRoaXMgc2NyYXRjaCBkZXZpY2UgYW5kIGFsbCB0aGUgT1RBIHJlbGF0ZWQgZGlyZWN0b3JpZXMKKy8vIHdpbGwgYmUgY3JlYXRlZC4KK2Jvb2wgQ3JlYXRlU2NyYXRjaE90YU1ldGFkYXRhT25TdXBlcihjb25zdCBJU25hcHNob3RNYW5hZ2VyOjpJRGV2aWNlSW5mbyogaW5mbykgeworICAgIHN0ZDo6c3RyaW5nIHNjcmF0Y2hfZGV2aWNlOworCisgICAgaWYgKCFDcmVhdGVEeW5hbWljU2NyYXRjaChpbmZvLCAmc2NyYXRjaF9kZXZpY2UpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNyZWF0ZUR5bmFtaWNTY3JhdGNoIGZhaWxlZCI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFNYWtlU2NyYXRjaEZpbGVzeXN0ZW0oc2NyYXRjaF9kZXZpY2UpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIk1ha2VTY3JhdGNoRmlsZXN5c3RlbSBmYWlsZWQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghTW91bnRTY3JhdGNoKHNjcmF0Y2hfZGV2aWNlKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJNb3VudFNjcmF0Y2ggZmFpbGVkIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIVNldHVwT1RBRGlycygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlNldHVwT1RBRGlycyBmYWlsZWQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc2NyYXRjaF9zdXBlci5oIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NjcmF0Y2hfc3VwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTZmZTcwCi0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NjcmF0Y2hfc3VwZXIuaApAQCAtMCwwICsxLDMzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBzbmFwc2hvdCB7CisKK2NvbnN0ZXhwciBjaGFyIGtNa0V4dDRbXSA9ICIvc3lzdGVtL2Jpbi9ta2UyZnMiOworY29uc3RleHByIGNoYXIga090YU1ldGFkYXRhRmlsZUNvbnRleHRbXSA9ICJ1Om9iamVjdF9yOm90YV9tZXRhZGF0YV9maWxlOnMwIjsKK2NvbnN0ZXhwciBjaGFyIGtPdGFNZXRhZGF0YU1vdW50W10gPSAiL21udC9zY3JhdGNoX290YV9tZXRhZGF0YV9zdXBlciI7Citjb25zdCBzaXplX3Qga090YU1ldGFkYXRhUGFydGl0aW9uU2l6ZSA9IHVpbnQ2NF90KDEgKiAxMDI0ICogMTAyNCk7Citjb25zdGV4cHIgY2hhciBrUGh5c2ljYWxEZXZpY2VbXSA9ICIvZGV2L2Jsb2NrL2J5LW5hbWUvIjsKKworYm9vbCBJc1NjcmF0Y2hPdGFNZXRhZGF0YU9uU3VwZXIoKTsKK3N0ZDo6c3RyaW5nIEdldFNjcmF0Y2hPdGFNZXRhZGF0YVBhcnRpdGlvbigpOworc3RkOjpzdHJpbmcgTWFwU2NyYXRjaE90YU1ldGFkYXRhUGFydGl0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2UpOworYm9vbCBDcmVhdGVTY3JhdGNoT3RhTWV0YWRhdGFPblN1cGVyKGNvbnN0IElTbmFwc2hvdE1hbmFnZXI6OklEZXZpY2VJbmZvKiBpbmZvID0gbnVsbHB0cik7Citib29sIENsZWFudXBTY3JhdGNoT3RhTWV0YWRhdGFJZlByZXNlbnQoY29uc3QgSVNuYXBzaG90TWFuYWdlcjo6SURldmljZUluZm8qIGluZm8gPSBudWxscHRyKTsKKworfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NjcmlwdHMvYXBwbHktdXBkYXRlLnNoIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NjcmlwdHMvYXBwbHktdXBkYXRlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkwYjAxMTkKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGlic25hcHNob3Qvc2NyaXB0cy9hcHBseS11cGRhdGUuc2gKQEAgLTAsMCArMSw3NyBAQAorIyEvYmluL2Jhc2gKKworIyBUaGlzIGlzIGEgZGVidWcgc2NyaXB0IHRvIHF1aWNreSB0ZXN0IGVuZC10by1lbmQgZmxvdworIyBvZiBzbmFwc2hvdCB1cGRhdGVzIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB1cGRhdGUtZW5naW5lLgorIworIyBVc2FnZToKKyMKKyMgIFRvIHVwZGF0ZSBib3RoIGR5bmFtaWMgYW5kIHN0YXRpYyBwYXJ0aXRpb25zOgorIworIyAuL3N5c3RlbS9jb3JlL2ZzX21nci9saWJzbmFwc2hvdC9hcHBseV91cGRhdGUuc2ggWy0tdXBkYXRlLXN0YXRpYy1wYXJ0aXRpb25zXSBbLS13aXBlXQorIworIyAtLXVwZGF0ZS1zdGF0aWMtcGFydGl0aW9uczogVGhpcyB3aWxsIHVwZGF0ZSBib290bG9hZGVyIGFuZCBzdGF0aWMgQS9CCisjIHBhcnRpdGlvbnMKKyMgLS13aXBlOiBBbGxvd3MgZGF0YSB3aXBlIGFzIHBhcnQgb2YgdXBkYXRlIGZsb3cKKyMKKyMgIFRvIHVwZGF0ZSBkeW5hbWljIHBhcnRpdGlvbnMgb25seSAodGhpcyBzaG91bGQgYmUgdXNlZCB3aGVuIHN0YXRpYworIyAgcGFydGl0aW9ucyBhcmUgcHJlc2VudCBpbiBib3RoIHRoZSBzbG90cyk6CisjCisjICAuL3N5c3RlbS9jb3JlL2ZzX21nci9saWJzbmFwc2hvdC9hcHBseV91cGRhdGUuc2gKKyMKKyMKKworcm0gLWYgJE9VVC8qLnBhdGNoCisKKyMgQ29tcGFyZSBpbWFnZXMgYW5kIGNyZWF0ZSBzbmFwc2hvdCBwYXRjaGVzLiBDdXJyZW50bHksIHRoaXMKKyMganVzdCBjb21wYXJlcyB0d28gaWRlbnRpY2FsIGltYWdlcyBpbiAkT1VULiBJbiBnZW5lcmFsLCBhbnkgc291cmNlCisjIGFuZCB0YXJnZXQgaW1hZ2VzIGNvdWxkIGJlIHBhc3NlZCB0byBjcmVhdGUgc25hcHNob3QgcGF0Y2hlcy4gSG93ZXZlciwKKyMgY2FyZSBtdXN0IGJlIHRha2VuIHRvIGVuc3VyZSBzb3VyY2UgaW1hZ2VzIGFyZSBhbHJlYWR5IHByZXNlbnQgb24gdGhlIGRldmljZS4KKyMKKyMgY3JlYXRlX3NuYXBzaG90IGlzIGEgaG9zdCBzaWRlIGJpbmFyeS4gQnVpbGQgaXQgd2l0aCBgbSBjcmVhdGVfc25hcHNob3RgCitjcmVhdGVfc25hcHNob3QgLS1zb3VyY2U9JE9VVC9zeXN0ZW0uaW1nIC0tdGFyZ2V0PSRPVVQvc3lzdGVtLmltZyAmCitjcmVhdGVfc25hcHNob3QgLS1zb3VyY2U9JE9VVC9wcm9kdWN0LmltZyAtLXRhcmdldD0kT1VUL3Byb2R1Y3QuaW1nICYKK2NyZWF0ZV9zbmFwc2hvdCAtLXNvdXJjZT0kT1VUL3ZlbmRvci5pbWcgLS10YXJnZXQ9JE9VVC92ZW5kb3IuaW1nICYKK2NyZWF0ZV9zbmFwc2hvdCAtLXNvdXJjZT0kT1VUL3N5c3RlbV9leHQuaW1nIC0tdGFyZ2V0PSRPVVQvc3lzdGVtX2V4dC5pbWcgJgorY3JlYXRlX3NuYXBzaG90IC0tc291cmNlPSRPVVQvdmVuZG9yX2Rsa20uaW1nIC0tdGFyZ2V0PSRPVVQvdmVuZG9yX2Rsa20uaW1nICYKK2NyZWF0ZV9zbmFwc2hvdCAtLXNvdXJjZT0kT1VUL3N5c3RlbV9kbGttLmltZyAtLXRhcmdldD0kT1VUL3N5c3RlbV9kbGttLmltZyAmCisKK2VjaG8gIldhaXRpbmcgZm9yIHNuYXBzaG90IHBhdGNoIGNyZWF0aW9uIgord2FpdCAkKGpvYnMgLXApCitlY2hvICJTbmFwc2hvdCBwYXRjaCBjcmVhdGlvbiBjb21wbGV0ZWQiCisKK212ICoucGF0Y2ggJE9VVC8KKworYWRiIHJvb3QKK2FkYiB3YWl0LWZvci1kZXZpY2UKK2FkYiBzaGVsbCBta2RpciAtcCAvZGF0YS91cGRhdGUvCithZGIgcHVzaCAkT1VULyoucGF0Y2ggL2RhdGEvdXBkYXRlLworCitpZiBbWyAiJDIiID09ICItLXdpcGUiIF1dOyB0aGVuCisgIGFkYiBzaGVsbCBzbmFwc2hvdGN0bCBhcHBseS11cGRhdGUgL2RhdGEvdXBkYXRlLyAtdworZWxzZQorICBhZGIgc2hlbGwgc25hcHNob3RjdGwgYXBwbHktdXBkYXRlIC9kYXRhL3VwZGF0ZS8KK2ZpCisKKyMgQ2hlY2sgaWYgdGhlIC0tdXBkYXRlLXN0YXRpYy1wYXJ0aXRpb25zIG9wdGlvbiBpcyBwcm92aWRlZC4KKyMgRm9yIHF1aWNrIGRldmVsb3BlciB3b3JrZmxvdywgdGhlcmUgaXMgbm8gbmVlZCB0byByZXBlYXRlZGx5CisjIGFwcGx5IHN0YXRpYyBwYXJ0aXRpb25zLgoraWYgW1sgIiQxIiA9PSAiLS11cGRhdGUtc3RhdGljLXBhcnRpdGlvbnMiIF1dOyB0aGVuCisgIGFkYiByZWJvb3QgYm9vdGxvYWRlcgorICBzbGVlcCA1CisgIGlmIFtbICIkMiIgPT0gIi0td2lwZSIgXV07IHRoZW4KKyAgICAgIGZhc3Rib290IC13CisgIGZpCisgIGZhc3Rib290IGZsYXNoIGJvb3Rsb2FkZXIgJE9VVC9ib290bG9hZGVyLmltZworICBzbGVlcCAxCisgIGZhc3Rib290IHJlYm9vdCBib290bG9hZGVyCisgIHNsZWVwIDEKKyAgZmFzdGJvb3QgZmxhc2ggcmFkaW8gJE9VVC9yYWRpby5pbWcKKyAgc2xlZXAgMQorICBmYXN0Ym9vdCByZWJvb3QgYm9vdGxvYWRlcgorICBzbGVlcCAxCisgIGZhc3Rib290IGZsYXNoYWxsIC0tZXhjbHVkZS1keW5hbWljLXBhcnRpdGlvbnMgLS1kaXNhYmxlLXN1cGVyLW9wdGltaXphdGlvbgorZWxzZQorICBhZGIgcmVib290CitmaQorCitlY2hvICJVcGRhdGUgY29tcGxldGVkIgpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXBzaG90LmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwc2hvdC5jcHAKaW5kZXggNjQ2MzdjMi4uYWNhYmQ2NyAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXBzaG90LmNwcAorKysgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHNob3QuY3BwCkBAIC0yMCwxNiArMjAsMTggQEAKICNpbmNsdWRlIDxzeXMvZmlsZS5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy91bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMveGF0dHIuaD4KIAorI2luY2x1ZGUgPGNocm9ubz4KICNpbmNsdWRlIDxmaWxlc3lzdGVtPgogI2luY2x1ZGUgPG9wdGlvbmFsPgogI2luY2x1ZGUgPHRocmVhZD4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wYXJzZWludC5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgogI2luY2x1ZGUgPGN1dGlscy9zb2NrZXRzLmg+CkBAIC00Niw4ICs0OCw4IEBACiAjaW5jbHVkZSA8bGlic25hcHNob3Qvc25hcHNob3Rfc3RhdHMuaD4KICNpbmNsdWRlICJkZXZpY2VfaW5mby5oIgogI2luY2x1ZGUgInBhcnRpdGlvbl9jb3dfY3JlYXRvci5oIgorI2luY2x1ZGUgInNjcmF0Y2hfc3VwZXIuaCIKICNpbmNsdWRlICJzbmFwc2hvdF9tZXRhZGF0YV91cGRhdGVyLmgiCi0jaW5jbHVkZSAic25hcHNob3RfcmVhZGVyLmgiCiAjaW5jbHVkZSAidXRpbGl0eS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC04MiwxMiArODQsMzAgQEAKIHVzaW5nIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0OwogdXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOwogdXNpbmcgbmFtZXNwYWNlIHN0ZDo6c3RyaW5nX2xpdGVyYWxzOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6UmVhbHBhdGg7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7CiAKK3N0YXRpYyBjb25zdGV4cHIgY2hhciBrQm9vdFNuYXBzaG90c1dpdGhvdXRTbG90U3dpdGNoW10gPQorICAgICAgICAiL21ldGFkYXRhL290YS9zbmFwc2hvdC1ib290LXdpdGhvdXQtc2xvdC1zd2l0Y2giOwogc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtCb290SW5kaWNhdG9yUGF0aFtdID0gIi9tZXRhZGF0YS9vdGEvc25hcHNob3QtYm9vdCI7CiBzdGF0aWMgY29uc3RleHByIGNoYXIga1JvbGxiYWNrSW5kaWNhdG9yUGF0aFtdID0gIi9tZXRhZGF0YS9vdGEvcm9sbGJhY2staW5kaWNhdG9yIjsKK3N0YXRpYyBjb25zdGV4cHIgY2hhciBrU25hcHVzZXJkRnJvbVN5c3RlbVtdID0gIi9tZXRhZGF0YS9vdGEvc25hcHVzZXJkLWZyb20tc3lzdGVtIjsKIHN0YXRpYyBjb25zdGV4cHIgYXV0byBrVXBkYXRlU3RhdGVDaGVja0ludGVydmFsID0gMnM7CitzdGF0aWMgY29uc3RleHByIGNoYXIga090YUZpbGVDb250ZXh0W10gPSAidTpvYmplY3RfcjpvdGFfbWV0YWRhdGFfZmlsZTpzMCI7CiAKLU1lcmdlRmFpbHVyZUNvZGUgQ2hlY2tNZXJnZUNvbnNpc3RlbmN5KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBTbmFwc2hvdFN0YXR1cyYgc3RhdHVzKTsKKy8qCisgKiBUaGUgcmVhZGFoZWFkIHNpemUgaXMgc2V0IHRvIDMya2Igc28gdGhhdAorICogdGhlcmUgaXMgbm8gc2lnbmlmaWNhbnQgbWVtb3J5IHByZXNzdXJlICgvcHJvYy9wcmVzc3VyZS9tZW1vcnkpIGR1cmluZyBib290LgorICogQWZ0ZXIgT1RBLCBkdXJpbmcgYm9vdCwgcGFydGl0aW9ucyBhcmUgc2Nhbm5lZCBiZWZvcmUgbWFya2luZyBzbG90IGFzIHN1Y2Nlc3NmdWwuCisgKiBUaGlzIHNjYW4gd2lsbCB0cmlnZ2VyIHJlYWRhaGVhZCBib3RoIG9uIHNvdXJjZSBhbmQgQ09XIGJsb2NrIGRldmljZSB0aGVyZWJ5CisgKiBsZWFkaW5nIHRvIEluYWN0aXZlKGZpbGUpIHBhZ2VzIHRvIGJlIHZlcnkgaGlnaC4KKyAqCisgKiBBIGxvd2VyIHZhbHVlIG1heSBoZWxwIHJlZHVjZSBtZW1vcnkgcHJlc3N1cmUgZnVydGhlciwgaG93ZXZlciwgdGhhdCB3aWxsCisgKiBpbmNyZWFzZSB0aGUgYm9vdCB0aW1lLiBUaHVzLCBmb3IgZGV2aWNlIHdoaWNoIGRvbid0IGNhcmUgYWJvdXQgT1RBIGJvb3QKKyAqIHRpbWUsIHRoZXkgY291bGQgdXNlIE9fRElSRUNUIGZ1bmN0aW9uYWxpdHkgd2hlcmVpbiB0aGUgSS9PIHRvIHRoZSBzb3VyY2UKKyAqIGJsb2NrIGRldmljZSB3aWxsIGJlIE9fRElSRUNULgorICovCitzdGF0aWMgY29uc3RleHByIGF1dG8ga1JlYWRBaGVhZFNpemVLYiA9IDMyOwogCiAvLyBOb3RlOiBJSW1hZ2VNYW5hZ2VyIGlzIGFuIGluY29tcGxldGUgdHlwZSBpbiB0aGUgaGVhZGVyLCBzbyB0aGUgZGVmYXVsdAogLy8gZGVzdHJ1Y3RvciBkb2Vzbid0IHdvcmsuCkBAIC05OCw3ICsxMTgsMTEgQEAKICAgICAgICAgaW5mbyA9IG5ldyBEZXZpY2VJbmZvKCk7CiAgICAgfQogCi0gICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdE1hbmFnZXI+KG5ldyBTbmFwc2hvdE1hbmFnZXIoaW5mbykpOworICAgIGF1dG8gc20gPSBzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3RNYW5hZ2VyPihuZXcgU25hcHNob3RNYW5hZ2VyKGluZm8pKTsKKyAgICBpZiAoaW5mby0+SXNUZW1wTWV0YWRhdGEoKSkgeworICAgICAgICBMT0coSU5GTykgPDwgIlVzaW5nIHRlbXAgbWV0YWRhdGEgZnJvbSBzdXBlciI7CisgICAgfQorICAgIHJldHVybiBzbTsKIH0KIAogc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90TWFuYWdlcj4gU25hcHNob3RNYW5hZ2VyOjpOZXdGb3JGaXJzdFN0YWdlTW91bnQoSURldmljZUluZm8qIGluZm8pIHsKQEAgLTExOCw5ICsxNDIsNyBAQAogfQogCiBTbmFwc2hvdE1hbmFnZXI6OlNuYXBzaG90TWFuYWdlcihJRGV2aWNlSW5mbyogZGV2aWNlKQotICAgIDogZG1fKGRldmljZS0+R2V0RGV2aWNlTWFwcGVyKCkpLCBkZXZpY2VfKGRldmljZSksIG1ldGFkYXRhX2Rpcl8oZGV2aWNlXy0+R2V0TWV0YWRhdGFEaXIoKSkgewotICAgIG1lcmdlX2NvbnNpc3RlbmN5X2NoZWNrZXJfID0gYW5kcm9pZDo6c25hcHNob3Q6OkNoZWNrTWVyZ2VDb25zaXN0ZW5jeTsKLX0KKyAgICA6IGRtXyhkZXZpY2UtPkdldERldmljZU1hcHBlcigpKSwgZGV2aWNlXyhkZXZpY2UpLCBtZXRhZGF0YV9kaXJfKGRldmljZV8tPkdldE1ldGFkYXRhRGlyKCkpIHt9CiAKIHN0YXRpYyBzdGQ6OnN0cmluZyBHZXRDb3dOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBzbmFwc2hvdF9uYW1lKSB7CiAgICAgcmV0dXJuIHNuYXBzaG90X25hbWUgKyAiLWNvdyI7CkBAIC0yMTcsNiArMjM5LDEyIEBACiAgICAgYXV0byBmaWxlID0gTG9ja0V4Y2x1c2l2ZSgpOwogICAgIGlmICghZmlsZSkgcmV0dXJuIGZhbHNlOwogCisgICAgaWYgKElzU25hcHNob3RXaXRob3V0U2xvdFN3aXRjaCgpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCBjYW5jZWwgdGhlIHNuYXBzaG90cyBhcyBwYXJ0aXRpb25zIGFyZSBtb3VudGVkIG9mZiB0aGUgc25hcHNob3RzIG9uICIKKyAgICAgICAgICAgICAgICAgICAgICAiY3VycmVudCBzbG90LiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICBVcGRhdGVTdGF0ZSBzdGF0ZSA9IFJlYWRVcGRhdGVTdGF0ZShmaWxlLmdldCgpKTsKICAgICBpZiAoc3RhdGUgPT0gVXBkYXRlU3RhdGU6Ok5vbmUpIHsKICAgICAgICAgUmVtb3ZlSW52YWxpZFNuYXBzaG90cyhmaWxlLmdldCgpKTsKQEAgLTI0NCw3ICsyNzIsNiBAQAogICAgIGF1dG8gYm9vdF9maWxlID0gR2V0U25hcHNob3RCb290SW5kaWNhdG9yUGF0aCgpOwogICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnRzOwogICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZyhib290X2ZpbGUsICZjb250ZW50cykpIHsKLSAgICAgICAgUExPRyhXQVJOSU5HKSA8PCAiQ2Fubm90IHJlYWQgIiA8PCBib290X2ZpbGU7CiAgICAgICAgIHJldHVybiB7fTsKICAgICB9CiAgICAgcmV0dXJuIGNvbnRlbnRzOwpAQCAtMjk5LDEwICszMjYsOSBAQAogICAgIC8vIC0gRm9yIEZvcndhcmRNZXJnZSwgRmluaXNoZWRTbmFwc2hvdFdyaXRlcyBhc3NlcnRzIHRoYXQgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgaW5kaWNhdG9yCiAgICAgLy8gbWF0Y2hlcyB0aGUgaW5jb21pbmcgdXBkYXRlLgogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBmaWxlcyA9IHsKLSAgICAgICAgICAgIEdldFNuYXBzaG90Qm9vdEluZGljYXRvclBhdGgoKSwKLSAgICAgICAgICAgIEdldFJvbGxiYWNrSW5kaWNhdG9yUGF0aCgpLAotICAgICAgICAgICAgR2V0Rm9yd2FyZE1lcmdlSW5kaWNhdG9yUGF0aCgpLAotICAgICAgICAgICAgR2V0T2xkUGFydGl0aW9uTWV0YWRhdGFQYXRoKCksCisgICAgICAgICAgICBHZXRTbmFwc2hvdEJvb3RJbmRpY2F0b3JQYXRoKCksICAgICAgICAgIEdldFJvbGxiYWNrSW5kaWNhdG9yUGF0aCgpLAorICAgICAgICAgICAgR2V0Rm9yd2FyZE1lcmdlSW5kaWNhdG9yUGF0aCgpLCAgICAgICAgICBHZXRPbGRQYXJ0aXRpb25NZXRhZGF0YVBhdGgoKSwKKyAgICAgICAgICAgIEdldEJvb3RTbmFwc2hvdHNXaXRob3V0U2xvdFN3aXRjaFBhdGgoKSwgR2V0U25hcHVzZXJkRnJvbVN5c3RlbVBhdGgoKSwKICAgICB9OwogICAgIGZvciAoY29uc3QgYXV0byYgZmlsZSA6IGZpbGVzKSB7CiAgICAgICAgIFJlbW92ZUZpbGVJZkV4aXN0cyhmaWxlKTsKQEAgLTQwMCw2ICs0MjYsOCBAQAogICAgIHN0YXR1cy0+c2V0X21ldGFkYXRhX3NlY3RvcnMoMCk7CiAgICAgc3RhdHVzLT5zZXRfdXNpbmdfc25hcHVzZXJkKGNvd19jcmVhdG9yLT51c2luZ19zbmFwdXNlcmQpOwogICAgIHN0YXR1cy0+c2V0X2NvbXByZXNzaW9uX2FsZ29yaXRobShjb3dfY3JlYXRvci0+Y29tcHJlc3Npb25fYWxnb3JpdGhtKTsKKyAgICBzdGF0dXMtPnNldF9jb21wcmVzc2lvbl9mYWN0b3IoY293X2NyZWF0b3ItPmNvbXByZXNzaW9uX2ZhY3Rvcik7CisgICAgc3RhdHVzLT5zZXRfcmVhZF9haGVhZF9zaXplKGNvd19jcmVhdG9yLT5yZWFkX2FoZWFkX3NpemUpOwogICAgIGlmIChjb3dfY3JlYXRvci0+ZW5hYmxlX3RocmVhZGluZykgewogICAgICAgICBzdGF0dXMtPnNldF9lbmFibGVfdGhyZWFkaW5nKGNvd19jcmVhdG9yLT5lbmFibGVfdGhyZWFkaW5nKTsKICAgICB9CkBAIC00ODMsNiArNTExLDM1IEBACiAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcmV0cmlldmUgYmFzZV9zZWN0b3JzIGZyb20gU25hcHVzZXJkIjsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoSXNTbmFwc2hvdFdpdGhvdXRTbG90U3dpdGNoKCkpIHsKKyAgICAgICAgLy8gV2hlbiBzbmFwc2hvdHMgYXJlIG9uIGN1cnJlbnQgc2xvdCwgd2UgZGV0ZXJtaW5lIHRoZSBzaXplCisgICAgICAgIC8vIG9mIGJsb2NrIGRldmljZSBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIENPVyBvcGVyYXRpb25zLiBXZSBjYW5ub3QKKyAgICAgICAgLy8gdXNlIGJhc2UgZGV2aWNlIGFzIGl0IHdpbGwgYmUgZnJvbSBvbGRlciBpbWFnZS4KKyAgICAgICAgdW5pcXVlX2ZkIGZkKG9wZW4oY293X2ZpbGUuY19zdHIoKSwgT19SRE9OTFkgfCBPX0NMT0VYRUMpKTsKKyAgICAgICAgaWYgKGZkIDwgMCkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBvcGVuICIgPDwgY293X2ZpbGU7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBDb3dSZWFkZXIgcmVhZGVyOworICAgICAgICBpZiAoIXJlYWRlci5QYXJzZShzdGQ6Om1vdmUoZmQpKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHBhcnNlIGNvdyAiIDw8IGNvd19maWxlOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdWludDY0X3QgZGV2X3N6ID0gMDsKKyAgICAgICAgY29uc3QgYXV0byYgaGVhZGVyID0gcmVhZGVyLkdldEhlYWRlcigpOworICAgICAgICBpZiAoaGVhZGVyLnByZWZpeC5tYWpvcl92ZXJzaW9uID09IDIpIHsKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBudW1fb3BzID0gcmVhZGVyLmdldF9udW1fdG90YWxfZGF0YV9vcHMoKTsKKyAgICAgICAgICAgIGRldl9zeiA9IChudW1fb3BzICogaGVhZGVyLmJsb2NrX3NpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gY3JlYXRlX3NuYXBzaG90IHdpbGwgc2tpcCBpbi1wbGFjZSBjb3B5IG9wcy4gSGVuY2UsIGZldGNoIHRoaXMKKyAgICAgICAgICAgIC8vIGluZm9ybWF0aW9uIGRpcmVjdGx5IGZyb20gdjMgaGVhZGVyLgorICAgICAgICAgICAgY29uc3QgYXV0byYgdjNfaGVhZGVyID0gcmVhZGVyLmhlYWRlcl92MygpOworICAgICAgICAgICAgZGV2X3N6ID0gdjNfaGVhZGVyLm9wX2NvdW50X21heCAqIHYzX2hlYWRlci5ibG9ja19zaXplOworICAgICAgICB9CisKKyAgICAgICAgYmFzZV9zZWN0b3JzID0gZGV2X3N6ID4+IDk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gRm9yIHVzZXJzcGFjZSBzbmFwc2hvdHMsIHRoZSBzaXplIG9mIHRoZSBiYXNlIGRldmljZSBpcyB0YWtlbiBhcyB0aGUKICAgICAgICAgLy8gc2l6ZSBvZiB0aGUgZG0tdXNlciBibG9jayBkZXZpY2UuIFNpbmNlIHRoZXJlIGlzIG5vIHBzZXVkbyBtYXBwaW5nCkBAIC03MjksNiArNzg2LDE0IEBACiAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byByZW1vdmUgc3RhdHVzIGZpbGUgIiA8PCBmaWxlX3BhdGggPDwgIjogIiA8PCBlcnJvcjsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KKworICAgIC8vIFRoaXMgcGF0aCBtYXkgbmV2ZXIgZXhpc3QuIElmIGl0IGlzIHByZXNlbnQsIHRoZW4gaXQncyBhIHN0YWxlCisgICAgLy8gc25hcHNob3Qgc3RhdHVzIGZpbGUuIEp1c3QgcmVtb3ZlIHRoZSBmaWxlIGFuZCBsb2cgdGhlIG1lc3NhZ2UuCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgdG1wX3BhdGggPSBmaWxlX3BhdGggKyAiLnRtcCI7CisgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpSZW1vdmVGaWxlSWZFeGlzdHModG1wX3BhdGgsICZlcnJvcikpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlbW92ZSBzdGFsZSBzbmFwc2hvdCBmaWxlICIgPDwgdG1wX3BhdGg7CisgICAgfQorCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKQEAgLTc1NCwxMCArODE5LDEwIEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBhdXRvIG90aGVyX3N1ZmZpeCA9IGRldmljZV8tPkdldE90aGVyU2xvdFN1ZmZpeCgpOworICAgIGF1dG8gY3VycmVudF9zbG90X3N1ZmZpeCA9IGRldmljZV8tPkdldFNsb3RTdWZmaXgoKTsKIAogICAgIGZvciAoY29uc3QgYXV0byYgc25hcHNob3QgOiBzbmFwc2hvdHMpIHsKLSAgICAgICAgaWYgKGFuZHJvaWQ6OmJhc2U6OkVuZHNXaXRoKHNuYXBzaG90LCBvdGhlcl9zdWZmaXgpKSB7CisgICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6RW5kc1dpdGgoc25hcHNob3QsIGN1cnJlbnRfc2xvdF9zdWZmaXgpKSB7CiAgICAgICAgICAgICAvLyBBbGxvdyB0aGUgbWVyZ2UgdG8gY29udGludWUsIGJ1dCBsb2cgdGhpcyB1bmV4cGVjdGVkIGNhc2UuCiAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmV4cGVjdGVkIHNuYXBzaG90IGZvdW5kIGR1cmluZyBtZXJnZTogIiA8PCBzbmFwc2hvdDsKICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMTA1MCw2ICsxMTE1LDEzIEBACiAgICAgICAgIGlmIChyZXN1bHQuc3RhdGUgPT0gVXBkYXRlU3RhdGU6Ok1lcmdlRmFpbGVkKSB7CiAgICAgICAgICAgICBBY2tub3dsZWRnZU1lcmdlRmFpbHVyZShyZXN1bHQuZmFpbHVyZV9jb2RlKTsKICAgICAgICAgfQorCisgICAgICAgIGlmIChyZXN1bHQuc3RhdGUgPT0gVXBkYXRlU3RhdGU6Ok1lcmdlQ29tcGxldGVkKSB7CisgICAgICAgICAgICBpZiAoZGV2aWNlXy0+SXNUZW1wTWV0YWRhdGEoKSkgeworICAgICAgICAgICAgICAgIENsZWFudXBTY3JhdGNoT3RhTWV0YWRhdGFJZlByZXNlbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIGlmIChyZXN1bHQuc3RhdGUgIT0gVXBkYXRlU3RhdGU6Ok1lcmdpbmcpIHsKICAgICAgICAgICAgIC8vIEVpdGhlciB0aGVyZSBpcyBubyBtZXJnZSwgb3IgdGhlIG1lcmdlIHdhcyBmaW5pc2hlZCwgc28gbm8gbmVlZAogICAgICAgICAgICAgLy8gdG8ga2VlcCB3YWl0aW5nLgpAQCAtMTA4Nyw4ICsxMTU5LDggQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1hdXRvIFNuYXBzaG90TWFuYWdlcjo6Q2hlY2tNZXJnZVN0YXRlKExvY2tlZEZpbGUqIGxvY2ssIGNvbnN0IHN0ZDo6ZnVuY3Rpb248Ym9vbCgpPiYgYmVmb3JlX2NhbmNlbCkKLSAgICAgICAgLT4gTWVyZ2VSZXN1bHQgeworYXV0byBTbmFwc2hvdE1hbmFnZXI6OkNoZWNrTWVyZ2VTdGF0ZShMb2NrZWRGaWxlKiBsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPGJvb2woKT4mIGJlZm9yZV9jYW5jZWwpIC0+IE1lcmdlUmVzdWx0IHsKICAgICBTbmFwc2hvdFVwZGF0ZVN0YXR1cyB1cGRhdGVfc3RhdHVzID0gUmVhZFNuYXBzaG90VXBkYXRlU3RhdHVzKGxvY2spOwogICAgIHN3aXRjaCAodXBkYXRlX3N0YXR1cy5zdGF0ZSgpKSB7CiAgICAgICAgIGNhc2UgVXBkYXRlU3RhdGU6Ok5vbmU6CkBAIC0xMTIzLDcgKzExOTUsNyBAQAogICAgICAgICByZXR1cm4gTWVyZ2VSZXN1bHQoVXBkYXRlU3RhdGU6Ok1lcmdlRmFpbGVkLCBNZXJnZUZhaWx1cmVDb2RlOjpMaXN0U25hcHNob3RzKTsKICAgICB9CiAKLSAgICBhdXRvIG90aGVyX3N1ZmZpeCA9IGRldmljZV8tPkdldE90aGVyU2xvdFN1ZmZpeCgpOworICAgIGF1dG8gY3VycmVudF9zbG90X3N1ZmZpeCA9IGRldmljZV8tPkdldFNsb3RTdWZmaXgoKTsKIAogICAgIGJvb2wgY2FuY2VsbGVkID0gZmFsc2U7CiAgICAgYm9vbCBtZXJnaW5nID0gZmFsc2U7CkBAIC0xMTMxLDkgKzEyMDMsOSBAQAogICAgIGJvb2wgd3JvbmdfcGhhc2UgPSBmYWxzZTsKICAgICBNZXJnZUZhaWx1cmVDb2RlIGZhaWx1cmVfY29kZSA9IE1lcmdlRmFpbHVyZUNvZGU6Ok9rOwogICAgIGZvciAoY29uc3QgYXV0byYgc25hcHNob3QgOiBzbmFwc2hvdHMpIHsKLSAgICAgICAgaWYgKGFuZHJvaWQ6OmJhc2U6OkVuZHNXaXRoKHNuYXBzaG90LCBvdGhlcl9zdWZmaXgpKSB7CisgICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6RW5kc1dpdGgoc25hcHNob3QsIGN1cnJlbnRfc2xvdF9zdWZmaXgpKSB7CiAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgaGF2ZSB0cmlnZ2VyZWQgYW4gZXJyb3IgbWVzc2FnZSBpbiBJbml0aWF0ZU1lcmdlIGFscmVhZHkuCi0gICAgICAgICAgICBMT0coSU5GTykgPDwgIlNraXBwaW5nIG1lcmdlIHZhbGlkYXRpb24gb2YgdW5leHBlY3RlZCBzbmFwc2hvdDogIiA8PCBzbmFwc2hvdDsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlNraXBwaW5nIG1lcmdlIHZhbGlkYXRpb24gb2YgdW5leHBlY3RlZCBzbmFwc2hvdDogIiA8PCBzbmFwc2hvdDsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKQEAgLTExNjMsOCArMTIzNSw4IEBACiAgICAgICAgICAgICAgICAgd3JvbmdfcGhhc2UgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmtub3duIG1lcmdlIHN0YXR1cyBmb3IgXCIiIDw8IHNuYXBzaG90IDw8ICJcIjogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiIiA8PCByZXN1bHQuc3RhdGUgPDwgIlwiIjsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmtub3duIG1lcmdlIHN0YXR1cyBmb3IgXCIiIDw8IHNuYXBzaG90IDw8ICJcIjogIiA8PCAiXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCByZXN1bHQuc3RhdGUgPDwgIlwiIjsKICAgICAgICAgICAgICAgICBpZiAoZmFpbHVyZV9jb2RlID09IE1lcmdlRmFpbHVyZUNvZGU6Ok9rKSB7CiAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmVfY29kZSA9IE1lcmdlRmFpbHVyZUNvZGU6OlVuZXhwZWN0ZWRNZXJnZVN0YXRlOwogICAgICAgICAgICAgICAgIH0KQEAgLTEyNDgsMTQgKzEzMjAsMTIgQEAKICAgICAgICAgICAgR2V0TWV0YWRhdGFQYXJ0aXRpb25TdGF0ZSgqY3VycmVudF9tZXRhZGF0YSwgbmFtZSkgPT0gTWV0YWRhdGFQYXJ0aXRpb25TdGF0ZTo6VXBkYXRlZCk7CiAKICAgICBpZiAoVXBkYXRlVXNlc1VzZXJTbmFwc2hvdHMobG9jaykpIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgbWVyZ2Vfc3RhdHVzOwotICAgICAgICBpZiAoRW5zdXJlU25hcHVzZXJkQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgIC8vIFF1ZXJ5IHRoZSBzbmFwc2hvdCBzdGF0dXMgZnJvbSB0aGUgZGFlbW9uCi0gICAgICAgICAgICBtZXJnZV9zdGF0dXMgPSBzbmFwdXNlcmRfY2xpZW50Xy0+UXVlcnlTbmFwc2hvdFN0YXR1cyhuYW1lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE1lcmdlUmVzdWx0KFVwZGF0ZVN0YXRlOjpNZXJnZUZhaWxlZCwgTWVyZ2VGYWlsdXJlQ29kZTo6UXVlcnlTbmFwc2hvdFN0YXR1cyk7CisgICAgICAgIGlmICghRW5zdXJlU25hcHVzZXJkQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBNZXJnZVJlc3VsdChVcGRhdGVTdGF0ZTo6TWVyZ2VGYWlsZWQsIE1lcmdlRmFpbHVyZUNvZGU6OlF1ZXJ5U25hcHNob3RTdGF0dXMpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gUXVlcnkgdGhlIHNuYXBzaG90IHN0YXR1cyBmcm9tIHRoZSBkYWVtb24KKyAgICAgICAgY29uc3QgYXV0byBtZXJnZV9zdGF0dXMgPSBzbmFwdXNlcmRfY2xpZW50Xy0+UXVlcnlTbmFwc2hvdFN0YXR1cyhuYW1lKTsKICAgICAgICAgaWYgKG1lcmdlX3N0YXR1cyA9PSAic25hcHNob3QtbWVyZ2UtZmFpbGVkIikgewogICAgICAgICAgICAgcmV0dXJuIE1lcmdlUmVzdWx0KFVwZGF0ZVN0YXRlOjpNZXJnZUZhaWxlZCwgTWVyZ2VGYWlsdXJlQ29kZTo6VW5rbm93blRhcmdldFR5cGUpOwogICAgICAgICB9CkBAIC0xMjczLDEwICsxMzQzLDI1IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAobWVyZ2Vfc3RhdHVzID09ICJzbmFwc2hvdCIgJiYKLSAgICAgICAgICAgIERlY2lkZU1lcmdlUGhhc2Uoc25hcHNob3Rfc3RhdHVzKSA9PSBNZXJnZVBoYXNlOjpTRUNPTkRfUEhBU0UgJiYKLSAgICAgICAgICAgIHVwZGF0ZV9zdGF0dXMubWVyZ2VfcGhhc2UoKSA9PSBNZXJnZVBoYXNlOjpGSVJTVF9QSEFTRSkgewotICAgICAgICAgICAgLy8gVGhlIHNuYXBzaG90IGlzIG5vdCBiZWluZyBtZXJnZWQgYmVjYXVzZSBpdCdzIGluIHRoZSB3cm9uZyBwaGFzZS4KLSAgICAgICAgICAgIHJldHVybiBNZXJnZVJlc3VsdChVcGRhdGVTdGF0ZTo6Tm9uZSk7CisgICAgICAgICAgICBEZWNpZGVNZXJnZVBoYXNlKHNuYXBzaG90X3N0YXR1cykgPT0gTWVyZ2VQaGFzZTo6U0VDT05EX1BIQVNFKSB7CisgICAgICAgICAgICBpZiAodXBkYXRlX3N0YXR1cy5tZXJnZV9waGFzZSgpID09IE1lcmdlUGhhc2U6OkZJUlNUX1BIQVNFKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIHNuYXBzaG90IGlzIG5vdCBiZWluZyBtZXJnZWQgYmVjYXVzZSBpdCdzIGluIHRoZSB3cm9uZyBwaGFzZS4KKyAgICAgICAgICAgICAgICByZXR1cm4gTWVyZ2VSZXN1bHQoVXBkYXRlU3RhdGU6Ok5vbmUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyB1cGRhdGVfc3RhdHVzIGlzIGFscmVhZHkgaW4gc2Vjb25kIHBoYXNlIGJ1dCB0aGUKKyAgICAgICAgICAgICAgICAvLyBzbmFwc2hvdF9zdGF0dXMgaXMgc3RpbGwgbm90IHNldCB0byBTbmFwc2hvdFN0YXRlOjpNRVJHSU5HLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gUmVzdW1lIHRoZSBtZXJnZSBhdCB0aGlzIHBvaW50LiBzZWUgYi8zNzQyMjU5MTMKKyAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIlN3aXRjaFNuYXBzaG90VG9NZXJnZTogIiA8PCBuYW1lIDw8ICIgYWZ0ZXIgcmVzdW1pbmcgbWVyZ2UiOworICAgICAgICAgICAgICAgIGF1dG8gY29kZSA9IFN3aXRjaFNuYXBzaG90VG9NZXJnZShsb2NrLCBuYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoY29kZSAhPSBNZXJnZUZhaWx1cmVDb2RlOjpPaykgeworICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gc3dpdGNoIHNuYXBzaG90OiAiIDw8IG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHRvIG1lcmdlIGR1cmluZyBzZWNvbmQgcGhhc2UiOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWVyZ2VSZXN1bHQoVXBkYXRlU3RhdGU6Ok1lcmdlRmFpbGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVyZ2VGYWlsdXJlQ29kZTo6VW5rbm93blRhcmdldFR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gTWVyZ2VSZXN1bHQoVXBkYXRlU3RhdGU6Ok1lcmdpbmcpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1lcmdlX3N0YXR1cyA9PSAic25hcHNob3QtbWVyZ2UiKSB7CkBAIC0xMzI2LDEzICsxNDExLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIE1lcmdlIGlzIGNvbXBsZXRlIGF0IHRoaXMgcG9pbnQKLQotICAgIGF1dG8gY29kZSA9IENoZWNrTWVyZ2VDb25zaXN0ZW5jeShsb2NrLCBuYW1lLCBzbmFwc2hvdF9zdGF0dXMpOwotICAgIGlmIChjb2RlICE9IE1lcmdlRmFpbHVyZUNvZGU6Ok9rKSB7Ci0gICAgICAgIHJldHVybiBNZXJnZVJlc3VsdChVcGRhdGVTdGF0ZTo6TWVyZ2VGYWlsZWQsIGNvZGUpOwotICAgIH0KLQogICAgIC8vIE1lcmdpbmcgaXMgZG9uZS4gRmlyc3QsIHVwZGF0ZSB0aGUgc3RhdHVzIGZpbGUgdG8gaW5kaWNhdGUgdGhlIG1lcmdlCiAgICAgLy8gaXMgY29tcGxldGUuIFdlIGRvIHRoaXMgYmVmb3JlIGNhbGxpbmcgT25TbmFwc2hvdE1lcmdlQ29tcGxldGUsIGV2ZW4KICAgICAvLyB0aG91Z2ggdGhpcyBtZWFucyB0aGUgd3JpdGUgaXMgcG90ZW50aWFsbHkgd2FzdGVkIHdvcmsgKHNpbmNlIGluIHRoZQpAQCAtMTM2Miw4MCArMTQ0MCw2IEBACiAgICAgcmV0dXJuIEdldENvd05hbWUoc25hcHNob3QpOwogfQogCi1NZXJnZUZhaWx1cmVDb2RlIFNuYXBzaG90TWFuYWdlcjo6Q2hlY2tNZXJnZUNvbnNpc3RlbmN5KExvY2tlZEZpbGUqIGxvY2ssIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbmFwc2hvdFN0YXR1cyYgc3RhdHVzKSB7Ci0gICAgQ0hFQ0sobG9jayk7Ci0KLSAgICByZXR1cm4gbWVyZ2VfY29uc2lzdGVuY3lfY2hlY2tlcl8obmFtZSwgc3RhdHVzKTsKLX0KLQotTWVyZ2VGYWlsdXJlQ29kZSBDaGVja01lcmdlQ29uc2lzdGVuY3koY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IFNuYXBzaG90U3RhdHVzJiBzdGF0dXMpIHsKLSAgICBpZiAoIXN0YXR1cy51c2luZ19zbmFwdXNlcmQoKSkgewotICAgICAgICAvLyBEbyBub3QgdHJ5IHRvIHZlcmlmeSBvbGQtc3R5bGUgQ09XcyB5ZXQuCi0gICAgICAgIHJldHVybiBNZXJnZUZhaWx1cmVDb2RlOjpPazsKLSAgICB9Ci0KLSAgICBhdXRvJiBkbSA9IERldmljZU1hcHBlcjo6SW5zdGFuY2UoKTsKLQotICAgIHN0ZDo6c3RyaW5nIGNvd19pbWFnZV9uYW1lID0gR2V0TWFwcGVkQ293RGV2aWNlTmFtZShuYW1lLCBzdGF0dXMpOwotICAgIHN0ZDo6c3RyaW5nIGNvd19pbWFnZV9wYXRoOwotICAgIGlmICghZG0uR2V0RG1EZXZpY2VQYXRoQnlOYW1lKGNvd19pbWFnZV9uYW1lLCAmY293X2ltYWdlX3BhdGgpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBnZXQgcGF0aCBmb3IgY293IGRldmljZTogIiA8PCBjb3dfaW1hZ2VfbmFtZTsKLSAgICAgICAgcmV0dXJuIE1lcmdlRmFpbHVyZUNvZGU6OkdldENvd1BhdGhDb25zaXN0ZW5jeUNoZWNrOwotICAgIH0KLQotICAgIC8vIEZpcnN0IHBhc3MsIGNvdW50ICMgb2Ygb3BzLgotICAgIHNpemVfdCBudW1fb3BzID0gMDsKLSAgICB7Ci0gICAgICAgIHVuaXF1ZV9mZCBmZChvcGVuKGNvd19pbWFnZV9wYXRoLmNfc3RyKCksIE9fUkRPTkxZIHwgT19DTE9FWEVDKSk7Ci0gICAgICAgIGlmIChmZCA8IDApIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gb3BlbiAiIDw8IGNvd19pbWFnZV9uYW1lOwotICAgICAgICAgICAgcmV0dXJuIE1lcmdlRmFpbHVyZUNvZGU6Ok9wZW5Db3dDb25zaXN0ZW5jeUNoZWNrOwotICAgICAgICB9Ci0KLSAgICAgICAgQ293UmVhZGVyIHJlYWRlcjsKLSAgICAgICAgaWYgKCFyZWFkZXIuUGFyc2Uoc3RkOjptb3ZlKGZkKSkpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBwYXJzZSBjb3cgIiA8PCBjb3dfaW1hZ2VfcGF0aDsKLSAgICAgICAgICAgIHJldHVybiBNZXJnZUZhaWx1cmVDb2RlOjpQYXJzZUNvd0NvbnNpc3RlbmN5Q2hlY2s7Ci0gICAgICAgIH0KLQotICAgICAgICBudW1fb3BzID0gcmVhZGVyLmdldF9udW1fdG90YWxfZGF0YV9vcHMoKTsKLSAgICB9Ci0KLSAgICAvLyBTZWNvbmQgcGFzcywgdHJ5IGFzIGhhcmQgYXMgd2UgY2FuIHRvIGdldCB0aGUgYWN0dWFsIG51bWJlciBvZiBibG9ja3MKLSAgICAvLyB0aGUgc3lzdGVtIHRoaW5rcyBpcyBtZXJnZWQuCi0gICAgdW5pcXVlX2ZkIGZkKG9wZW4oY293X2ltYWdlX3BhdGguY19zdHIoKSwgT19SRE9OTFkgfCBPX0RJUkVDVCB8IE9fU1lOQyB8IE9fQ0xPRVhFQykpOwotICAgIGlmIChmZCA8IDApIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBvcGVuIGRpcmVjdCAiIDw8IGNvd19pbWFnZV9uYW1lOwotICAgICAgICByZXR1cm4gTWVyZ2VGYWlsdXJlQ29kZTo6T3BlbkNvd0RpcmVjdENvbnNpc3RlbmN5Q2hlY2s7Ci0gICAgfQotCi0gICAgdm9pZCogYWRkcjsKLSAgICBzaXplX3QgcGFnZV9zaXplID0gZ2V0cGFnZXNpemUoKTsKLSAgICBpZiAocG9zaXhfbWVtYWxpZ24oJmFkZHIsIHBhZ2Vfc2l6ZSwgcGFnZV9zaXplKSA8IDApIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgInBvc2l4X21lbWFsaWduIHdpdGggcGFnZSBzaXplICIgPDwgcGFnZV9zaXplOwotICAgICAgICByZXR1cm4gTWVyZ2VGYWlsdXJlQ29kZTo6TWVtQWxpZ25Db25zaXN0ZW5jeUNoZWNrOwotICAgIH0KLQotICAgIC8vIENPV3MgYXJlIGFsd2F5cyBhdCBsZWFzdCAyTUIsIHRoaXMgaXMgZ3VhcmFudGVlZCBpbiBzbmFwc2hvdCBjcmVhdGlvbi4KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8dm9pZCwgZGVjbHR5cGUoJjo6ZnJlZSk+IGJ1ZmZlcihhZGRyLCA6OmZyZWUpOwotICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhZEZ1bGx5KGZkLCBidWZmZXIuZ2V0KCksIHBhZ2Vfc2l6ZSkpIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgIkRpcmVjdCByZWFkIGZhaWxlZCAiIDw8IGNvd19pbWFnZV9uYW1lOwotICAgICAgICByZXR1cm4gTWVyZ2VGYWlsdXJlQ29kZTo6RGlyZWN0UmVhZENvbnNpc3RlbmN5Q2hlY2s7Ci0gICAgfQotCi0gICAgYXV0byBoZWFkZXIgPSByZWludGVycHJldF9jYXN0PENvd0hlYWRlcio+KGJ1ZmZlci5nZXQoKSk7Ci0gICAgaWYgKGhlYWRlci0+bnVtX21lcmdlX29wcyAhPSBudW1fb3BzKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkNPVyBjb25zaXN0ZW5jeSBjaGVjayBmYWlsZWQsIGV4cGVjdGVkICIgPDwgbnVtX29wcyA8PCAiIHRvIGJlIG1lcmdlZCwgIgotICAgICAgICAgICAgICAgICAgIDw8ICJidXQgIiA8PCBoZWFkZXItPm51bV9tZXJnZV9vcHMgPDwgIiB3ZXJlIGFjdHVhbGx5IHJlY29yZGVkLiI7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkFib3J0aW5nIG1lcmdlIHByb2dyZXNzIGZvciBzbmFwc2hvdCAiIDw8IG5hbWUKLSAgICAgICAgICAgICAgICAgICA8PCAiLCB3aWxsIHRyeSBhZ2FpbiBuZXh0IGJvb3QiOwotICAgICAgICByZXR1cm4gTWVyZ2VGYWlsdXJlQ29kZTo6V3JvbmdNZXJnZUNvdW50Q29uc2lzdGVuY3lDaGVjazsKLSAgICB9Ci0KLSAgICByZXR1cm4gTWVyZ2VGYWlsdXJlQ29kZTo6T2s7Ci19Ci0KIE1lcmdlRmFpbHVyZUNvZGUgU25hcHNob3RNYW5hZ2VyOjpNZXJnZVNlY29uZFBoYXNlU25hcHNob3RzKExvY2tlZEZpbGUqIGxvY2spIHsKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc25hcHNob3RzOwogICAgIGlmICghTGlzdFNuYXBzaG90cyhsb2NrLCAmc25hcHNob3RzKSkgewpAQCAtMTQ1Myw4ICsxNDU3LDE0IEBACiAgICAgICAgIHJldHVybiBNZXJnZUZhaWx1cmVDb2RlOjpXcml0ZVN0YXR1czsKICAgICB9CiAKKyAgICBhdXRvIGN1cnJlbnRfc2xvdF9zdWZmaXggPSBkZXZpY2VfLT5HZXRTbG90U3VmZml4KCk7CiAgICAgTWVyZ2VGYWlsdXJlQ29kZSByZXN1bHQgPSBNZXJnZUZhaWx1cmVDb2RlOjpPazsKICAgICBmb3IgKGNvbnN0IGF1dG8mIHNuYXBzaG90IDogc25hcHNob3RzKSB7CisgICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6RW5kc1dpdGgoc25hcHNob3QsIGN1cnJlbnRfc2xvdF9zdWZmaXgpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJTa2lwcGluZyBpbnZhbGlkIHNuYXBzaG90OiAiIDw8IHNuYXBzaG90CisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZHVyaW5nIE1lcmdlU2Vjb25kUGhhc2VTbmFwc2hvdHMiOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KICAgICAgICAgU25hcHNob3RTdGF0dXMgc25hcHNob3Rfc3RhdHVzOwogICAgICAgICBpZiAoIVJlYWRTbmFwc2hvdFN0YXR1cyhsb2NrLCBzbmFwc2hvdCwgJnNuYXBzaG90X3N0YXR1cykpIHsKICAgICAgICAgICAgIHJldHVybiBNZXJnZUZhaWx1cmVDb2RlOjpSZWFkU3RhdHVzOwpAQCAtMTQ3Myw2ICsxNDgzLDEwIEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorc3RkOjpzdHJpbmcgU25hcHNob3RNYW5hZ2VyOjpHZXRCb290U25hcHNob3RzV2l0aG91dFNsb3RTd2l0Y2hQYXRoKCkgeworICAgIHJldHVybiBtZXRhZGF0YV9kaXJfICsgIi8iICsgYW5kcm9pZDo6YmFzZTo6QmFzZW5hbWUoa0Jvb3RTbmFwc2hvdHNXaXRob3V0U2xvdFN3aXRjaCk7Cit9CisKIHN0ZDo6c3RyaW5nIFNuYXBzaG90TWFuYWdlcjo6R2V0U25hcHNob3RCb290SW5kaWNhdG9yUGF0aCgpIHsKICAgICByZXR1cm4gbWV0YWRhdGFfZGlyXyArICIvIiArIGFuZHJvaWQ6OmJhc2U6OkJhc2VuYW1lKGtCb290SW5kaWNhdG9yUGF0aCk7CiB9CkBAIC0xNDgxLDYgKzE0OTUsMTAgQEAKICAgICByZXR1cm4gbWV0YWRhdGFfZGlyXyArICIvIiArIGFuZHJvaWQ6OmJhc2U6OkJhc2VuYW1lKGtSb2xsYmFja0luZGljYXRvclBhdGgpOwogfQogCitzdGQ6OnN0cmluZyBTbmFwc2hvdE1hbmFnZXI6OkdldFNuYXB1c2VyZEZyb21TeXN0ZW1QYXRoKCkgeworICAgIHJldHVybiBtZXRhZGF0YV9kaXJfICsgIi8iICsgYW5kcm9pZDo6YmFzZTo6QmFzZW5hbWUoa1NuYXB1c2VyZEZyb21TeXN0ZW0pOworfQorCiBzdGQ6OnN0cmluZyBTbmFwc2hvdE1hbmFnZXI6OkdldEZvcndhcmRNZXJnZUluZGljYXRvclBhdGgoKSB7CiAgICAgcmV0dXJuIG1ldGFkYXRhX2Rpcl8gKyAiL2FsbG93LWZvcndhcmQtbWVyZ2UiOwogfQpAQCAtMTcyMSw2ICsxNzM5LDE3IEBACiAgICAgICAgIGlmIChVcGRhdGVVc2VzSW91cmluZyhsb2NrLmdldCgpKSkgewogICAgICAgICAgICAgc25hcHVzZXJkX2FyZ3YtPmVtcGxhY2VfYmFjaygiLWlvX3VyaW5nIik7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKFVwZGF0ZVVzZXNPRGlyZWN0KGxvY2suZ2V0KCkpKSB7CisgICAgICAgICAgICBzbmFwdXNlcmRfYXJndi0+ZW1wbGFjZV9iYWNrKCItb19kaXJlY3QiKTsKKyAgICAgICAgfQorICAgICAgICB1aW50IGNvd19vcF9tZXJnZV9zaXplID0gR2V0VXBkYXRlQ293T3BNZXJnZVNpemUobG9jay5nZXQoKSk7CisgICAgICAgIGlmIChjb3dfb3BfbWVyZ2Vfc2l6ZSAhPSAwKSB7CisgICAgICAgICAgICBzbmFwdXNlcmRfYXJndi0+ZW1wbGFjZV9iYWNrKCItY293X29wX21lcmdlX3NpemU9IiArIHN0ZDo6dG9fc3RyaW5nKGNvd19vcF9tZXJnZV9zaXplKSk7CisgICAgICAgIH0KKyAgICAgICAgdWludDMyX3Qgd29ya2VyX2NvdW50ID0gR2V0VXBkYXRlV29ya2VyQ291bnQobG9jay5nZXQoKSk7CisgICAgICAgIGlmICh3b3JrZXJfY291bnQgIT0gMCkgeworICAgICAgICAgICAgc25hcHVzZXJkX2FyZ3YtPmVtcGxhY2VfYmFjaygiLXdvcmtlcl9jb3VudD0iICsgc3RkOjp0b19zdHJpbmcod29ya2VyX2NvdW50KSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBzaXplX3QgbnVtX2Nvd3MgPSAwOwpAQCAtMTc4OSw2ICsxODE4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX3BhdGhfbWVyZ2U7CiAgICAgICAgICAgICAgICAgc25hcHVzZXJkX2FyZ3YtPmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUobWVzc2FnZSkpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgU2V0UmVhZEFoZWFkU2l6ZShjb3dfaW1hZ2VfZGV2aWNlLCBzbmFwc2hvdF9zdGF0dXMucmVhZF9haGVhZF9zaXplKCkpOworICAgICAgICAgICAgU2V0UmVhZEFoZWFkU2l6ZShzb3VyY2VfZGV2aWNlLCBzbmFwc2hvdF9zdGF0dXMucmVhZF9haGVhZF9zaXplKCkpOwogCiAgICAgICAgICAgICAvLyBEbyBub3QgYXR0ZW1wdCB0byBjb25uZWN0IHRvIHRoZSBuZXcgc25hcHVzZXJkIHlldCwgaXQgaGFzbid0CiAgICAgICAgICAgICAvLyBiZWVuIHN0YXJ0ZWQuIFdlIGRvIGhvd2V2ZXIgd2FudCB0byB3YWl0IGZvciB0aGUgbWlzYyBkZXZpY2UKQEAgLTIxMTQsNiArMjE0NSwxMCBAQAogICAgIHJldHVybiBzdGF0ZTsKIH0KIAorYm9vbCBTbmFwc2hvdE1hbmFnZXI6OklzU25hcHNob3RXaXRob3V0U2xvdFN3aXRjaCgpIHsKKyAgICByZXR1cm4gKGFjY2VzcyhHZXRCb290U25hcHNob3RzV2l0aG91dFNsb3RTd2l0Y2hQYXRoKCkuY19zdHIoKSwgRl9PSykgPT0gMCk7Cit9CisKIGJvb2wgU25hcHNob3RNYW5hZ2VyOjpVcGRhdGVVc2VzQ29tcHJlc3Npb24oKSB7CiAgICAgYXV0byBsb2NrID0gTG9ja1NoYXJlZCgpOwogICAgIGlmICghbG9jaykgcmV0dXJuIGZhbHNlOwpAQCAtMjEzMiw2ICsyMTY3LDExNyBAQAogICAgIHJldHVybiB1cGRhdGVfc3RhdHVzLmlvX3VyaW5nX2VuYWJsZWQoKTsKIH0KIAorYm9vbCBTbmFwc2hvdE1hbmFnZXI6OlVwZGF0ZVVzZXNPRGlyZWN0KExvY2tlZEZpbGUqIGxvY2spIHsKKyAgICBTbmFwc2hvdFVwZGF0ZVN0YXR1cyB1cGRhdGVfc3RhdHVzID0gUmVhZFNuYXBzaG90VXBkYXRlU3RhdHVzKGxvY2spOworICAgIHJldHVybiB1cGRhdGVfc3RhdHVzLm9fZGlyZWN0KCk7Cit9CisKK3VpbnQzMl90IFNuYXBzaG90TWFuYWdlcjo6R2V0VXBkYXRlQ293T3BNZXJnZVNpemUoTG9ja2VkRmlsZSogbG9jaykgeworICAgIFNuYXBzaG90VXBkYXRlU3RhdHVzIHVwZGF0ZV9zdGF0dXMgPSBSZWFkU25hcHNob3RVcGRhdGVTdGF0dXMobG9jayk7CisgICAgcmV0dXJuIHVwZGF0ZV9zdGF0dXMuY293X29wX21lcmdlX3NpemUoKTsKK30KKwordWludDMyX3QgU25hcHNob3RNYW5hZ2VyOjpHZXRVcGRhdGVXb3JrZXJDb3VudChMb2NrZWRGaWxlKiBsb2NrKSB7CisgICAgU25hcHNob3RVcGRhdGVTdGF0dXMgdXBkYXRlX3N0YXR1cyA9IFJlYWRTbmFwc2hvdFVwZGF0ZVN0YXR1cyhsb2NrKTsKKyAgICByZXR1cm4gdXBkYXRlX3N0YXR1cy5udW1fd29ya2VyX3RocmVhZHMoKTsKK30KKworYm9vbCBTbmFwc2hvdE1hbmFnZXI6Ok1hcmtTbmFwdXNlcmRGcm9tU3lzdGVtKCkgeworICAgIGF1dG8gcGF0aCA9IEdldFNuYXB1c2VyZEZyb21TeXN0ZW1QYXRoKCk7CisKKyAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OldyaXRlU3RyaW5nVG9GaWxlKCIxIiwgcGF0aCkpIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byB3cml0ZSB0byB2ZW5kb3IgdXBkYXRlIHBhdGg6ICIgPDwgcGF0aDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVuaXF1ZV9mZCBmZChvcGVuKHBhdGguY19zdHIoKSwgT19QQVRIKSk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG9wZW4gZmlsZTogIiA8PCBwYXRoOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGludm9rZWQgYnkgZmlyc3Qgc3RhZ2UgaW5pdCBhbmQgaGVuY2Ugd2UgbmVlZCB0bworICAgICAqIGV4cGxpY2l0bHkgc2V0IHRoZSBjb3JyZWN0IHNlbGludXggbGFiZWwgZm9yIHRoaXMgZmlsZSBhcyB1cGRhdGVfZW5naW5lCisgICAgICogd2lsbCB0cnkgdG8gcmVtb3ZlIHRoaXMgZmlsZSBsYXRlciBvbiBvbmNlIHRoZSBzbmFwc2hvdCBtZXJnZSBpcworICAgICAqIGNvbXBsZXRlLgorICAgICAqLworICAgIGlmIChmc2V0eGF0dHIoZmQuZ2V0KCksIFhBVFRSX05BTUVfU0VMSU5VWCwga090YUZpbGVDb250ZXh0LCBzdHJsZW4oa090YUZpbGVDb250ZXh0KSArIDEsIDApIDwKKyAgICAgICAgMCkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiZnNldHhhdHRyIGZvciB0aGUgcGF0aDogIiA8PCBwYXRoIDw8ICIgZmFpbGVkIjsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIFBsZWFzZSBzZWUgYi8zMDQ4MjkzODQgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBJbiBBbmRyb2lkIFMsIHdlIHVzZSBkbS1zbmFwc2hvdCBmb3IgbW91bnRpbmcgc25hcHNob3RzIGFuZCBzbmFwc2hvdC1tZXJnZQorICogcHJvY2Vzcy4gSWYgdGhlIHZlbmRvciBwYXJ0aXRpb24gY29udGludWVzIHRvIGJlIG9uIEFuZHJvaWQgUywgdGhlbgorICogInNuYXB1c2VyZCIgYmluYXJ5IGluIGZpcnN0IHN0YWdlIHJhbWRpc2sgd2lsbCBiZSBmcm9tIHZlbmRvciBwYXJ0aXRpb24uCisgKiBUaHVzLCB3ZSBuZWVkIHRvIG1haW50YWluIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgKgorICogTm93LCBXZSB0YWtlIGEgdHdvIHN0ZXAgYXBwcm9hY2ggdG8gbWFpbnRhaW4gdGhlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6CisgKgorICogMTogRHVyaW5nIE9UQSBpbnN0YWxsYXRpb24sIHdlIHdpbGwgY29udGludWUgdG8gdXNlICJ1c2VyLXNwYWNlIiBzbmFwc2hvdHMKKyAqIGZvciBPVEEgaW5zdGFsbGF0aW9uIGFzIGJvdGggdXBkYXRlLWVuZ2luZSBhbmQgc25hcHVzZXJkIGJpbmFyeSB3aWxsIGJlIGZyb20gc3lzdGVtIHBhcnRpdGlvbi4KKyAqIEhvd2V2ZXIsIGR1cmluZyBpbnN0YWxsYXRpb24sIHdlIG1hcmsgImxlZ2FjeV9zbmFwdXNlcmQiIGluCisgKiBTbmFwc2hvdFVwZGF0ZVN0YXR1cyBmaWxlIHRvIG1hcmsgdGhhdCB0aGlzIGlzIGEgcGF0aCB0byBzdXBwb3J0IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgKiBUaHVzLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuICJmYWxzZSIgZHVyaW5nIE9UQSBpbnN0YWxsYXRpb24uCisgKgorICogMjogUG9zdCBPVEEgcmVib290LCB0aGVyZSBhcmUgdHdvIGtleSBzdGVwczoKKyAqICAgIGE6IER1cmluZyBmaXJzdCBzdGFnZSBpbml0LCAiaW5pdCIgYW5kICJzbmFwdXNlcmQiIGNvdWxkIGJlIGZyb20gdmVuZG9yCisgKiAgICBwYXJ0aXRpb24uIFRoaXMgY291bGQgYmUgZnJvbSBBbmRyb2lkIFMuIFRodXMsIHRoZSBzbmFwc2hvdCBtb3VudCBwYXRoCisgKiAgICB3aWxsIGJlIGJhc2VkIG9mZiBkbS1zbmFwc2hvdC4KKyAqCisgKiAgICBiOiBQb3N0IHNlbGludXggdHJhbnNpdGlvbiwgImluaXQiIGFuZCAidXBkYXRlLWVuZ2luZSIgd2lsbCBiZSAic3lzdGVtIgorICogICAgcGFydGl0aW9uLiBOb3csIHNpbmNlIHRoZSBzbmFwc2hvdHMgYXJlIG1vdW50ZWQgb2ZmIGRtLXNuYXBzaG90LAorICogICAgdXBkYXRlLWVuZ2luZSBpbnRlcmFjdGlvbiB3aXRoICJzbmFwdXNlcmQiIHNob3VsZCB3b3JrIGJhc2VkIG9mZgorICogICAgZG0tc25hcHNob3RzLgorICoKKyAqICAgIFRMO0RSOiB1cGRhdGUtZW5naW5lIHdpbGwgdXNlIHRoZSAic3lzdGVtIiBzbmFwdXNlcmQgZm9yIGluc3RhbGxpbmcgbmV3CisgKiAgICB1cGRhdGVzICh0aGlzIGlzIHNhZmUgYXMgdGhlcmUgaXMgbm8gInZlbmRvciIgc25hcHVzZXJkIHJ1bm5pbmcgZHVyaW5nCisgKiAgICBpbnN0YWxsYXRpb24pLiBQb3N0IHJlYm9vdCwgdXBkYXRlLWVuZ2luZSB3aWxsIHVzZSB0aGUgbGVnYWN5IHBhdGggd2hlbgorICogICAgY29tbXVuaWNhdGluZyB3aXRoICJ2ZW5kb3IiIHNuYXB1c2VyZCB0aGF0IHdhcyBzdGFydGVkIGluIGZpcnN0LXN0YWdlCisgKiAgICBpbml0LiBIZW5jZSwgdGhpcyBmdW5jdGlvbiBjaGVja3M6CisgKiAgICAgICAgIGk6IEFyZSB3ZSBpbiBwb3N0IE9UQSByZWJvb3QKKyAqICAgICAgICAgaWk6IElzIHRoZSBWZW5kb3IgZnJvbSBBbmRyb2lkIDEyCisgKiAgICAgICAgIGlpaTogSWYgYm90aCAoaSkgYW5kIChpaSkgYXJlIHRydWUsIHRoZW4gdXNlIHRoZSBkbS1zbmFwc2hvdCBiYXNlZAorICogICAgICAgICBhcHByb2FjaC4KKyAqCisgKiAzOiBQb3N0IE9UQSByZWJvb3QsIGlmIHRoZSB2ZW5kb3IgcGFydGl0aW9uIHdhcyB1cGRhdGVkIGZyb20gQW5kcm9pZCAxMiB0bworICogYW55IG90aGVyIHJlbGVhc2UgcG9zdCBBbmRyb2lkIDEyLCB0aGVuIHNuYXB1c2VyZCBiaW5hcnkgd2lsbCBiZSAic3lzdGVtIgorICogcGFydGl0aW9uIGFzIHBvc3QgQW5kcm9pZCAxMiwgaW5pdF9ib290IHdpbGwgY29udGFpbiBhIGNvcHkgb2Ygc25hcHVzZXJkCisgKiBiaW5hcnkuIFRodXMsIGR1cmluZyBmaXJzdCBzdGFnZSBpbml0LCBpZiBpbml0IGlzIGFibGUgdG8gY29tbXVuaWNhdGUgdG8KKyAqIGRhZW1vbiwgdGhhdCBnaXZlcyB1cyBhIHNpZ25hbCB0aGF0IHRoZSBiaW5hcnkgaXMgZnJvbSAic3lzdGVtIiBjb3B5LiBIZW5jZSwKKyAqIHRoZXJlIGlzIG5vIG5lZWQgdG8gZmFsbGJhY2sgdG8gbGVnYWN5IGRtLXNuYXBzaG90LiBUaHVzLCBpbml0IHdpbGwgdXNlIGEKKyAqIG1hcmtlciBpbiAvbWV0YWRhdGEgdG8gc2lnbmFsIHRoYXQgdGhlIHNuYXB1c2VyZCBiaW5hcnkgZnJvbSBmaXJzdCBzdGFnZSBpbml0CisgKiBjYW4gaGFuZGxlIHVzZXJzcGFjZSBzbmFwc2hvdHMuCisgKgorICovCitib29sIFNuYXBzaG90TWFuYWdlcjo6SXNMZWdhY3lTbmFwdXNlcmRQb3N0UmVib290KCkgeworICAgIGF1dG8gc2xvdCA9IEdldEN1cnJlbnRTbG90KCk7CisgICAgaWYgKHNsb3QgPT0gU2xvdDo6VGFyZ2V0KSB7CisgICAgICAgIC8qCisgICAgICAgICAgICBJZiB0aGlzIG1hcmtlciBpcyBwcmVzZW50LCB0aGUgZGFlbW9uIGNhbiBoYW5kbGUgdXNlcnNwYWNlIHNuYXBzaG90cy4KKyAgICAgICAgICAgIER1cmluZyBwb3N0LU9UQSByZWJvb3QsIHRoaXMgaW1wbGllcyB0aGF0IHRoZSB2ZW5kb3IgcGFydGl0aW9uIGlzCisgICAgICAgICAgICBBbmRyb2lkIDEzIG9yIGhpZ2hlci4gSWYgdGhlIHNuYXBzaG90cyB3ZXJlIGNyZWF0ZWQgb24gYW4KKyAgICAgICAgICAgIEFuZHJvaWQgMTIgdmVuZG9yLCB0aGlzIG1lYW5zIHRoZSB2ZW5kb3IgcGFydGl0aW9uIGhhcyBiZWVuIHVwZGF0ZWQuCisgICAgICAgICovCisgICAgICAgIGlmIChhY2Nlc3MoR2V0U25hcHVzZXJkRnJvbVN5c3RlbVBhdGgoKS5jX3N0cigpLCBGX09LKSA9PSAwKSB7CisgICAgICAgICAgICBpc19zbmFwc2hvdF91c2Vyc3BhY2VfID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBJZiB0aGUgbWFya2VyIGlzbid0IHByZXNlbnQgYW5kIGlmIHRoZSB2ZW5kb3IgaXMgc3RpbGwgaW4gQW5kcm9pZCAxMgorICAgICAgICBpZiAoaXNfbGVnYWN5X3NuYXB1c2VyZF8uaGFzX3ZhbHVlKCkgJiYgaXNfbGVnYWN5X3NuYXB1c2VyZF8udmFsdWUoKSA9PSB0cnVlKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKwogYm9vbCBTbmFwc2hvdE1hbmFnZXI6OlVwZGF0ZVVzZXNVc2VyU25hcHNob3RzKCkgewogICAgIC8vIFRoaXMgYW5kIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaXMgY29uc3RhbnRseQogICAgIC8vIGludm9rZWQgZHVyaW5nIHNuYXBzaG90IG1lcmdlLiBXZSB3YW50IHRvIGF2b2lkCkBAIC0yMTQzLDcgKzIyODksMTIgQEAKICAgICAvLyBkdXJpbmcgbWVyZ2UgcGhhc2UuIEhlbmNlLCBvbmNlIHdlIGtub3cgdGhhdAogICAgIC8vIHRoZSB2YWx1ZSBpcyByZWFkIGZyb20gZGlzayB0aGUgdmVyeSBmaXJzdCB0aW1lLAogICAgIC8vIGl0IGlzIHNhZmUgdG8gcmVhZCBzdWNjZXNzaXZlIGNoZWNrcyBmcm9tIG1lbW9yeS4KKwogICAgIGlmIChpc19zbmFwc2hvdF91c2Vyc3BhY2VfLmhhc192YWx1ZSgpKSB7CisgICAgICAgIC8vIENoZWNrIGlmIGxlZ2FjeSBzbmFwdXNlcmQgaXMgcnVubmluZyBwb3N0IE9UQSByZWJvb3QKKyAgICAgICAgaWYgKElzTGVnYWN5U25hcHVzZXJkUG9zdFJlYm9vdCgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGlzX3NuYXBzaG90X3VzZXJzcGFjZV8udmFsdWUoKTsKICAgICB9CiAKQEAgLTIxNTQsMTMgKzIzMDUsMTYgQEAKIH0KIAogYm9vbCBTbmFwc2hvdE1hbmFnZXI6OlVwZGF0ZVVzZXNVc2VyU25hcHNob3RzKExvY2tlZEZpbGUqIGxvY2spIHsKLSAgICAvLyBTZWUgVXBkYXRlVXNlc1VzZXJTbmFwc2hvdHMoKQotICAgIGlmIChpc19zbmFwc2hvdF91c2Vyc3BhY2VfLmhhc192YWx1ZSgpKSB7Ci0gICAgICAgIHJldHVybiBpc19zbmFwc2hvdF91c2Vyc3BhY2VfLnZhbHVlKCk7CisgICAgaWYgKCFpc19zbmFwc2hvdF91c2Vyc3BhY2VfLmhhc192YWx1ZSgpKSB7CisgICAgICAgIFNuYXBzaG90VXBkYXRlU3RhdHVzIHVwZGF0ZV9zdGF0dXMgPSBSZWFkU25hcHNob3RVcGRhdGVTdGF0dXMobG9jayk7CisgICAgICAgIGlzX3NuYXBzaG90X3VzZXJzcGFjZV8gPSB1cGRhdGVfc3RhdHVzLnVzZXJzcGFjZV9zbmFwc2hvdHMoKTsKKyAgICAgICAgaXNfbGVnYWN5X3NuYXB1c2VyZF8gPSB1cGRhdGVfc3RhdHVzLmxlZ2FjeV9zbmFwdXNlcmQoKTsKICAgICB9CiAKLSAgICBTbmFwc2hvdFVwZGF0ZVN0YXR1cyB1cGRhdGVfc3RhdHVzID0gUmVhZFNuYXBzaG90VXBkYXRlU3RhdHVzKGxvY2spOwotICAgIGlzX3NuYXBzaG90X3VzZXJzcGFjZV8gPSB1cGRhdGVfc3RhdHVzLnVzZXJzcGFjZV9zbmFwc2hvdHMoKTsKKyAgICBpZiAoSXNMZWdhY3lTbmFwdXNlcmRQb3N0UmVib290KCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgIHJldHVybiBpc19zbmFwc2hvdF91c2Vyc3BhY2VfLnZhbHVlKCk7CiB9CiAKQEAgLTIxOTgsNyArMjM1MiwyNyBAQAogfQogCiBib29sIFNuYXBzaG90TWFuYWdlcjo6SXNTbmFwc2hvdE1hbmFnZXJOZWVkZWQoKSB7Ci0gICAgcmV0dXJuIGFjY2VzcyhrQm9vdEluZGljYXRvclBhdGgsIEZfT0spID09IDA7CisgICAgaWYgKGFjY2VzcyhrQm9vdEluZGljYXRvclBhdGgsIEZfT0spID09IDApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKElzU2NyYXRjaE90YU1ldGFkYXRhT25TdXBlcigpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBTbmFwc2hvdE1hbmFnZXI6Ok1hcFRlbXBPdGFNZXRhZGF0YVBhcnRpdGlvbklmTmVlZGVkKAorICAgICAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3Qgc3RkOjpzdHJpbmcmKT4mIGluaXQpIHsKKyAgICBhdXRvIGRldmljZSA9IGFuZHJvaWQ6OnNuYXBzaG90OjpHZXRTY3JhdGNoT3RhTWV0YWRhdGFQYXJ0aXRpb24oKTsKKyAgICBpZiAoIWRldmljZS5lbXB0eSgpKSB7CisgICAgICAgIGluaXQoZGV2aWNlKTsKKyAgICAgICAgaWYgKGFuZHJvaWQ6OnNuYXBzaG90OjpNYXBTY3JhdGNoT3RhTWV0YWRhdGFQYXJ0aXRpb24oZGV2aWNlKS5lbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHN0ZDo6c3RyaW5nIFNuYXBzaG90TWFuYWdlcjo6R2V0R2xvYmFsUm9sbGJhY2tJbmRpY2F0b3JQYXRoKCkgewpAQCAtMjIwNiw2ICsyMzgwLDEzIEBACiB9CiAKIGJvb2wgU25hcHNob3RNYW5hZ2VyOjpOZWVkU25hcHNob3RzSW5GaXJzdFN0YWdlTW91bnQoKSB7CisgICAgaWYgKElzU25hcHNob3RXaXRob3V0U2xvdFN3aXRjaCgpKSB7CisgICAgICAgIGlmIChHZXRDdXJyZW50U2xvdCgpICE9IFNsb3Q6OlNvdXJjZSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiU25hcHNob3RzIG1hcmtlZCB0byBib290IHdpdGhvdXQgc2xvdCBzd2l0Y2g7IGJ1dCBzbG90IGlzIHdyb25nIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CiAgICAgLy8gSWYgd2UgZmFpbCB0byByZWFkLCB3ZSdsbCB3aW5kIHVwIHVzaW5nIENyZWF0ZUxvZ2ljYWxQYXJ0aXRpb25zLCB3aGljaAogICAgIC8vIHdpbGwgY3JlYXRlIGRldmljZXMgdGhhdCBsb29rIGxpa2UgdGhlIG9sZCBzbG90LCBleGNlcHQgd2l0aCBleHRyYQogICAgIC8vIGNvbnRlbnQgYXQgdGhlIGVuZCBvZiBlYWNoIGRldmljZS4gVGhpcyB3aWxsIGNvbmZ1c2UgZG0tdmVyaXR5LCBhbmQKQEAgLTIyNzgsNiArMjQ1OSwxMiBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoR2V0UGFydGl0aW9uTmFtZShwYXJ0aXRpb24pID09CisgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpCYXNlbmFtZShhbmRyb2lkOjpzbmFwc2hvdDo6a090YU1ldGFkYXRhTW91bnQpKSB7CisgICAgICAgICAgICBMT0coSU5GTykgPDwgIlBhcnRpdGlvbjogIiA8PCBHZXRQYXJ0aXRpb25OYW1lKHBhcnRpdGlvbikgPDwgIiBza2lwcGluZyI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCiAgICAgICAgIENyZWF0ZUxvZ2ljYWxQYXJ0aXRpb25QYXJhbXMgcGFyYW1zID0gewogICAgICAgICAgICAgICAgIC5ibG9ja19kZXZpY2UgPSBzdXBlcl9kZXZpY2UsCiAgICAgICAgICAgICAgICAgLm1ldGFkYXRhID0gbWV0YWRhdGEuZ2V0KCksCkBAIC0yMzQxLDcgKzI1MjgsOCBAQAogICAgIC8vIGNvbXBsZXRlZCwgbGl2ZV9zbmFwc2hvdF9zdGF0dXMgaXMgc2V0IHRvIG51bGxvcHQuCiAgICAgc3RkOjpvcHRpb25hbDxTbmFwc2hvdFN0YXR1cz4gbGl2ZV9zbmFwc2hvdF9zdGF0dXM7CiAgICAgZG8gewotICAgICAgICBpZiAoIShwYXJhbXMucGFydGl0aW9uLT5hdHRyaWJ1dGVzICYgTFBfUEFSVElUSU9OX0FUVFJfVVBEQVRFRCkpIHsKKyAgICAgICAgaWYgKCFJc1NuYXBzaG90V2l0aG91dFNsb3RTd2l0Y2goKSAmJgorICAgICAgICAgICAgIShwYXJhbXMucGFydGl0aW9uLT5hdHRyaWJ1dGVzICYgTFBfUEFSVElUSU9OX0FUVFJfVVBEQVRFRCkpIHsKICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiRGV0ZWN0ZWQgcmUtZmxhc2hpbmcgb2YgcGFydGl0aW9uLCB3aWxsIHNraXAgc25hcHNob3Q6ICIKICAgICAgICAgICAgICAgICAgICAgICA8PCBwYXJhbXMuR2V0UGFydGl0aW9uTmFtZSgpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0yNDkwLDkgKzI2NzgsNiBAQAogICAgICAgICB9CiAgICAgICAgIGNyZWF0ZWRfZGV2aWNlcy5FbXBsYWNlQmFjazxBdXRvVW5tYXBEZXZpY2U+KCZkbV8sIG5hbWUpOwogCi0gICAgICAgIHJlbWFpbmluZ190aW1lID0gR2V0UmVtYWluaW5nVGltZShwYXJhbXMudGltZW91dF9tcywgYmVnaW4pOwotICAgICAgICBpZiAocmVtYWluaW5nX3RpbWUuY291bnQoKSA8IDApIHJldHVybiBmYWxzZTsKLQogICAgICAgICBjb3dfZGV2aWNlID0gbmV3X2Nvd19kZXZpY2U7CiAgICAgfQogCkBAIC0yNTA3LDYgKzI2OTIsOSBAQAogICAgIC8vIHRoZSB1c2VyLXNwYWNlIHdpbGwgbm90IHN0YXJ0IHRoZSBtZXJnZS4gV2UgaGF2ZSB0byBleHBsaWNpdGx5IGluZm9ybSB0aGUKICAgICAvLyBkYWVtb24gdG8gcmVzdW1lIHRoZSBtZXJnZS4gQ2hlY2sgUHJvY2Vzc1VwZGF0ZVN0YXRlKCkgY2FsbCBzdGFjay4KICAgICBpZiAoIVVwZGF0ZVVzZXNVc2VyU25hcHNob3RzKGxvY2spKSB7CisgICAgICAgIHJlbWFpbmluZ190aW1lID0gR2V0UmVtYWluaW5nVGltZShwYXJhbXMudGltZW91dF9tcywgYmVnaW4pOworICAgICAgICBpZiAocmVtYWluaW5nX3RpbWUuY291bnQoKSA8IDApIHJldHVybiBmYWxzZTsKKwogICAgICAgICBzdGQ6OnN0cmluZyBwYXRoOwogICAgICAgICBpZiAoIU1hcFNuYXBzaG90KGxvY2ssIHBhcmFtcy5HZXRQYXJ0aXRpb25OYW1lKCksIGJhc2VfZGV2aWNlLCBjb3dfZGV2aWNlLCByZW1haW5pbmdfdGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aCkpIHsKQEAgLTI2OTcsNyArMjg4NSw3IEBACiAgICAgLy8gdG8gdW5tYXA7IGhlbmNlLCB3ZSBjYW4ndCBiZSBkZWxldGluZyB0aGUgZGV2aWNlCiAgICAgLy8gYXMgdGhlIHRhYmxlIHdvdWxkIGJlIG1vdW50ZWQgb2ZmIHBhcnRpdGlvbnMgYW5kIHdpbGwgZmFpbC4KICAgICBpZiAoc25hcHNob3Rfc3RhdHVzLnN0YXRlKCkgIT0gU25hcHNob3RTdGF0ZTo6TUVSR0VfQ09NUExFVEVEKSB7Ci0gICAgICAgIGlmICghRGVsZXRlRGV2aWNlSWZFeGlzdHMoZG1fdXNlcl9uYW1lKSkgeworICAgICAgICBpZiAoIURlbGV0ZURldmljZUlmRXhpc3RzKGRtX3VzZXJfbmFtZSwgNDAwMG1zKSkgewogICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IHVubWFwICIgPDwgZG1fdXNlcl9uYW1lOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CkBAIC0yNzgyLDEwICsyOTcwLDEyIEBACiB9CiAKIGJvb2wgU25hcHNob3RNYW5hZ2VyOjpVbm1hcEFsbFNuYXBzaG90cyhMb2NrZWRGaWxlKiBsb2NrKSB7CisgICAgTE9HKElORk8pIDw8ICJMb2NrIGFjcXVpcmVkIGZvciAiIDw8IF9fRlVOQ1RJT05fXzsKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc25hcHNob3RzOwogICAgIGlmICghTGlzdFNuYXBzaG90cyhsb2NrLCAmc25hcHNob3RzKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQorICAgIExPRyhJTkZPKSA8PCAiRm91bmQgIiA8PCBzbmFwc2hvdHMuc2l6ZSgpIDw8ICIgcGFydGl0aW9ucyB3aXRoIHNuYXBzaG90cyI7CiAKICAgICBmb3IgKGNvbnN0IGF1dG8mIHNuYXBzaG90IDogc25hcHNob3RzKSB7CiAgICAgICAgIGlmICghVW5tYXBQYXJ0aXRpb25XaXRoU25hcHNob3QobG9jaywgc25hcHNob3QpKSB7CkBAIC0yNzkzLDYgKzI5ODMsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQorICAgIExPRyhJTkZPKSA8PCAiVW5tYXBwZWQgIiA8PCBzbmFwc2hvdHMuc2l6ZSgpIDw8ICIgcGFydGl0aW9ucyB3aXRoIHNuYXBzaG90cyI7CiAKICAgICAvLyBUZXJtaW5hdGUgdGhlIGRhZW1vbiBhbmQgcmVsZWFzZSB0aGUgc25hcHVzZXJkX2NsaWVudF8gb2JqZWN0LgogICAgIC8vIElmIHdlIG5lZWQgdG8gcmUtY29ubmVjdCB3aXRoIHRoZSBkYWVtb24sIEVuc3VyZVNuYXB1c2VyZENvbm5lY3RlZCgpCkBAIC0yODA2LDggKzI5OTcsOSBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1hdXRvIFNuYXBzaG90TWFuYWdlcjo6T3BlbkZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGUsIGludCBsb2NrX2ZsYWdzKQotICAgICAgICAtPiBzdGQ6OnVuaXF1ZV9wdHI8TG9ja2VkRmlsZT4geworYXV0byBTbmFwc2hvdE1hbmFnZXI6Ok9wZW5GaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2NrX2ZsYWdzKSAtPiBzdGQ6OnVuaXF1ZV9wdHI8TG9ja2VkRmlsZT4geworICAgIGNvbnN0IGF1dG8gc3RhcnQgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKICAgICB1bmlxdWVfZmQgZmQob3BlbihmaWxlLmNfc3RyKCksIE9fUkRPTkxZIHwgT19DTE9FWEVDIHwgT19OT0ZPTExPVykpOwogICAgIGlmIChmZCA8IDApIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIk9wZW4gZmFpbGVkOiAiIDw8IGZpbGU7CkBAIC0yODIwLDYgKzMwMTIsMTEgQEAKICAgICAvLyBGb3Igc2ltcGxpY2l0eSwgd2Ugd2FudCB0byBDSEVDSyB0aGF0IGxvY2tfbW9kZSA9PSBMT0NLX0VYLCBpbiBzb21lCiAgICAgLy8gY2FsbHMsIHNvIHN0cmlwIGV4dHJhIGZsYWdzLgogICAgIGludCBsb2NrX21vZGUgPSBsb2NrX2ZsYWdzICYgKExPQ0tfRVggfCBMT0NLX1NIKTsKKyAgICBjb25zdCBhdXRvIGVuZCA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOworICAgIGNvbnN0IGF1dG8gZHVyYXRpb25fbXMgPSBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzPihlbmQgLSBzdGFydCk7CisgICAgaWYgKGR1cmF0aW9uX21zID49IDEwMDBtcykgeworICAgICAgICBMT0coSU5GTykgPDwgIlRha2luZyBsb2NrIG9uICIgPDwgZmlsZSA8PCAiIHRvb2sgIiA8PCBkdXJhdGlvbl9tcy5jb3VudCgpIDw8ICJtcyI7CisgICAgfQogICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPExvY2tlZEZpbGU+KGZpbGUsIHN0ZDo6bW92ZShmZCksIGxvY2tfbW9kZSk7CiB9CiAKQEAgLTI5NzAsNiArMzE2NywxMCBAQAogICAgICAgICBzdGF0dXMuc2V0X21lcmdlX3BoYXNlKG9sZF9zdGF0dXMubWVyZ2VfcGhhc2UoKSk7CiAgICAgICAgIHN0YXR1cy5zZXRfdXNlcnNwYWNlX3NuYXBzaG90cyhvbGRfc3RhdHVzLnVzZXJzcGFjZV9zbmFwc2hvdHMoKSk7CiAgICAgICAgIHN0YXR1cy5zZXRfaW9fdXJpbmdfZW5hYmxlZChvbGRfc3RhdHVzLmlvX3VyaW5nX2VuYWJsZWQoKSk7CisgICAgICAgIHN0YXR1cy5zZXRfbGVnYWN5X3NuYXB1c2VyZChvbGRfc3RhdHVzLmxlZ2FjeV9zbmFwdXNlcmQoKSk7CisgICAgICAgIHN0YXR1cy5zZXRfb19kaXJlY3Qob2xkX3N0YXR1cy5vX2RpcmVjdCgpKTsKKyAgICAgICAgc3RhdHVzLnNldF9jb3dfb3BfbWVyZ2Vfc2l6ZShvbGRfc3RhdHVzLmNvd19vcF9tZXJnZV9zaXplKCkpOworICAgICAgICBzdGF0dXMuc2V0X251bV93b3JrZXJfdGhyZWFkcyhvbGRfc3RhdHVzLm51bV93b3JrZXJfdGhyZWFkcygpKTsKICAgICB9CiAgICAgcmV0dXJuIFdyaXRlU25hcHNob3RVcGRhdGVTdGF0dXMobG9jaywgc3RhdHVzKTsKIH0KQEAgLTMwOTIsNyArMzI5Myw3IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgU25hcHNob3RNYW5hZ2VyOjpFbnN1cmVTbmFwdXNlcmRDb25uZWN0ZWQoKSB7Citib29sIFNuYXBzaG90TWFuYWdlcjo6RW5zdXJlU25hcHVzZXJkQ29ubmVjdGVkKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgdGltZW91dF9tcykgewogICAgIGlmIChzbmFwdXNlcmRfY2xpZW50XykgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC0zMTAxLDcgKzMzMDIsNyBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgc25hcHVzZXJkX2NsaWVudF8gPSBTbmFwdXNlcmRDbGllbnQ6OkNvbm5lY3Qoa1NuYXB1c2VyZFNvY2tldCwgMTBzKTsKKyAgICBzbmFwdXNlcmRfY2xpZW50XyA9IFNuYXB1c2VyZENsaWVudDo6Q29ubmVjdChrU25hcHVzZXJkU29ja2V0LCB0aW1lb3V0X21zKTsKICAgICBpZiAoIXNuYXB1c2VyZF9jbGllbnRfKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBjb25uZWN0IHRvIHNuYXB1c2VyZCI7CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTMxMzMsNiArMzMzNCw3IEBACiAgICAgZm9yIChhdXRvJiYgW25hbWUsIHN0YXR1c10gOiBhbGxfc25hcHNob3Rfc3RhdHVzKSB7CiAgICAgICAgIHN1bSArPSBzdGF0dXMuY293X2ZpbGVfc2l6ZSgpOwogICAgIH0KKyAgICBMT0coSU5GTykgPDwgIkNhbGN1bGF0ZWQgbmVlZGVkIENPVyBzcGFjZTogIiA8PCBzdW0gPDwgIiBieXRlcyI7CiAgICAgcmV0dXJuIFJldHVybjo6Tm9TcGFjZShzdW0pOwogfQogCkBAIC0zMjAxLDM5ICszNDAzLDIyIEBACiAgICAgQ0hFQ0soY3VycmVudF9tZXRhZGF0YS0+R2V0QmxvY2tEZXZpY2VQYXJ0aXRpb25OYW1lKDApID09IExQX01FVEFEQVRBX0RFRkFVTFRfUEFSVElUSU9OX05BTUUgJiYKICAgICAgICAgICB0YXJnZXRfbWV0YWRhdGEtPkdldEJsb2NrRGV2aWNlUGFydGl0aW9uTmFtZSgwKSA9PSBMUF9NRVRBREFUQV9ERUZBVUxUX1BBUlRJVElPTl9OQU1FKTsKIAotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBTbmFwc2hvdFN0YXR1cz4gYWxsX3NuYXBzaG90X3N0YXR1czsKLQotICAgIC8vIEluIGNhc2Ugb2YgZXJyb3IsIGF1dG9tYXRpY2FsbHkgZGVsZXRlIGRldmljZXMgdGhhdCBhcmUgY3JlYXRlZCBhbG9uZyB0aGUgd2F5LgotICAgIC8vIE5vdGUgdGhhdCAibG9jayIgaXMgZGVzdHJveWVkIGFmdGVyICJjcmVhdGVkX2RldmljZXMiLCBzbyBpdCBpcyBzYWZlIHRvIHVzZSB8bG9ja3wgZm9yCi0gICAgLy8gdGhlc2UgZGV2aWNlcy4KLSAgICBBdXRvRGV2aWNlTGlzdCBjcmVhdGVkX2RldmljZXM7Ci0KICAgICBjb25zdCBhdXRvJiBkYXBfbWV0YWRhdGEgPSBtYW5pZmVzdC5keW5hbWljX3BhcnRpdGlvbl9tZXRhZGF0YSgpOwotICAgIENvd09wdGlvbnMgb3B0aW9uczsKLSAgICBDb3dXcml0ZXIgd3JpdGVyKG9wdGlvbnMpOwotICAgIGJvb2wgY293X2Zvcm1hdF9zdXBwb3J0ID0gdHJ1ZTsKLSAgICBpZiAoZGFwX21ldGFkYXRhLmNvd192ZXJzaW9uKCkgPCB3cml0ZXIuR2V0Q293VmVyc2lvbigpKSB7Ci0gICAgICAgIGNvd19mb3JtYXRfc3VwcG9ydCA9IGZhbHNlOwotICAgIH0KLQotICAgIExPRyhJTkZPKSA8PCAiIGRhcF9tZXRhZGF0YS5jb3dfdmVyc2lvbigpOiAiIDw8IGRhcF9tZXRhZGF0YS5jb3dfdmVyc2lvbigpCi0gICAgICAgICAgICAgIDw8ICIgd3JpdGVyLkdldENvd1ZlcnNpb24oKTogIiA8PCB3cml0ZXIuR2V0Q293VmVyc2lvbigpOwotCi0gICAgLy8gRGVkdWNlIHN1cHBvcnRlZCBmZWF0dXJlcy4KLSAgICBib29sIHVzZXJzcGFjZV9zbmFwc2hvdHMgPSBDYW5Vc2VVc2Vyc3BhY2VTbmFwc2hvdHMoKTsKLSAgICBib29sIGxlZ2FjeV9jb21wcmVzc2lvbiA9IEdldExlZ2FjeUNvbXByZXNzaW9uRW5hYmxlZFByb3BlcnR5KCk7CiAKICAgICBzdGQ6OnN0cmluZyB2YWJjX2Rpc2FibGVfcmVhc29uOwogICAgIGlmICghZGFwX21ldGFkYXRhLnZhYmNfZW5hYmxlZCgpKSB7CiAgICAgICAgIHZhYmNfZGlzYWJsZV9yZWFzb24gPSAibm90IGVuYWJsZWQgbWV0YWRhdGEiOwogICAgIH0gZWxzZSBpZiAoZGV2aWNlXy0+SXNSZWNvdmVyeSgpKSB7CiAgICAgICAgIHZhYmNfZGlzYWJsZV9yZWFzb24gPSAicmVjb3ZlcnkiOwotICAgIH0gZWxzZSBpZiAoIWNvd19mb3JtYXRfc3VwcG9ydCkgewotICAgICAgICB2YWJjX2Rpc2FibGVfcmVhc29uID0gImNvdyBmb3JtYXQgbm90IHN1cHBvcnRlZCI7CiAgICAgfSBlbHNlIGlmICghS2VybmVsU3VwcG9ydHNDb21wcmVzc2VkU25hcHNob3RzKCkpIHsKICAgICAgICAgdmFiY19kaXNhYmxlX3JlYXNvbiA9ICJrZXJuZWwgbWlzc2luZyB1c2Vyc3BhY2UgYmxvY2sgZGV2aWNlIHN1cHBvcnQiOwogICAgIH0KIAorICAgIC8vIERlZHVjZSBzdXBwb3J0ZWQgZmVhdHVyZXMuCisgICAgYm9vbCB1c2Vyc3BhY2Vfc25hcHNob3RzID0gQ2FuVXNlVXNlcnNwYWNlU25hcHNob3RzKCk7CisgICAgYm9vbCBsZWdhY3lfY29tcHJlc3Npb24gPSBHZXRMZWdhY3lDb21wcmVzc2lvbkVuYWJsZWRQcm9wZXJ0eSgpOworICAgIGJvb2wgaXNfbGVnYWN5X3NuYXB1c2VyZCA9IElzVmVuZG9yRnJvbUFuZHJvaWQxMigpOworCiAgICAgaWYgKCF2YWJjX2Rpc2FibGVfcmVhc29uLmVtcHR5KCkpIHsKICAgICAgICAgaWYgKHVzZXJzcGFjZV9zbmFwc2hvdHMpIHsKICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiVXNlcnNwYWNlIHNuYXBzaG90cyBkaXNhYmxlZDogIiA8PCB2YWJjX2Rpc2FibGVfcmVhc29uOwpAQCAtMzI0Myw2ICszNDI4LDIyIEBACiAgICAgICAgIH0KICAgICAgICAgdXNlcnNwYWNlX3NuYXBzaG90cyA9IGZhbHNlOwogICAgICAgICBsZWdhY3lfY29tcHJlc3Npb24gPSBmYWxzZTsKKyAgICAgICAgaXNfbGVnYWN5X3NuYXB1c2VyZCA9IGZhbHNlOworICAgIH0KKworICAgIGlmIChsZWdhY3lfY29tcHJlc3Npb24gfHwgdXNlcnNwYWNlX3NuYXBzaG90cykgeworICAgICAgICBpZiAoZGFwX21ldGFkYXRhLmNvd192ZXJzaW9uKCkgPCBrTWluQ293VmVyc2lvbiB8fAorICAgICAgICAgICAgZGFwX21ldGFkYXRhLmNvd192ZXJzaW9uKCkgPiBrTWF4Q293VmVyc2lvbikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTWFuaWZlc3QgY293IHZlcnNpb24gaXMgb3V0IG9mIGJvdW5kcyAoZ290OiAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGRhcF9tZXRhZGF0YS5jb3dfdmVyc2lvbigpIDw8ICIsIG1pbjogIiA8PCBrTWluQ293VmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBtYXg6ICIgPDwga01heENvd1ZlcnNpb24gPDwgIikiOworICAgICAgICAgICAgcmV0dXJuIFJldHVybjo6RXJyb3IoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghdXNlcnNwYWNlX3NuYXBzaG90cyAmJiBpc19sZWdhY3lfc25hcHVzZXJkICYmIGxlZ2FjeV9jb21wcmVzc2lvbikgeworICAgICAgICB1c2Vyc3BhY2Vfc25hcHNob3RzID0gdHJ1ZTsKKyAgICAgICAgTE9HKElORk8pIDw8ICJWZW5kb3IgZnJvbSBBbmRyb2lkIDEyLiBFbmFibGluZyB1c2Vyc3BhY2Ugc25hcHNob3QgZm9yIE9UQSBpbnN0YWxsIjsKICAgICB9CiAKICAgICBjb25zdCBib29sIHVzaW5nX3NuYXB1c2VyZCA9IHVzZXJzcGFjZV9zbmFwc2hvdHMgfHwgbGVnYWN5X2NvbXByZXNzaW9uOwpAQCAtMzI1MSwxNCArMzQ1MiwxOSBAQAogICAgIH0KIAogICAgIHN0ZDo6c3RyaW5nIGNvbXByZXNzaW9uX2FsZ29yaXRobTsKKyAgICB1aW50NjRfdCBjb21wcmVzc2lvbl9mYWN0b3J7fTsKICAgICBpZiAodXNpbmdfc25hcHVzZXJkKSB7CiAgICAgICAgIGNvbXByZXNzaW9uX2FsZ29yaXRobSA9IGRhcF9tZXRhZGF0YS52YWJjX2NvbXByZXNzaW9uX3BhcmFtKCk7CisgICAgICAgIGNvbXByZXNzaW9uX2ZhY3RvciA9IGRhcF9tZXRhZGF0YS5jb21wcmVzc2lvbl9mYWN0b3IoKTsKICAgICAgICAgaWYgKGNvbXByZXNzaW9uX2FsZ29yaXRobS5lbXB0eSgpKSB7CiAgICAgICAgICAgICAvLyBPbGRlciBPVEFzIGRvbid0IHNldCBhbiBleHBsaWNpdCBjb21wcmVzc2lvbiB0eXBlLCBzbyBkZWZhdWx0IHRvIGd6LgogICAgICAgICAgICAgY29tcHJlc3Npb25fYWxnb3JpdGhtID0gImd6IjsKICAgICAgICAgfQorICAgICAgICBMT0coSU5GTykgPDwgInVzaW5nIGNvbXByZXNzaW9uIGFsZ29yaXRobTogIiA8PCBjb21wcmVzc2lvbl9hbGdvcml0aG0KKyAgICAgICAgICAgICAgICAgIDw8ICIsIG1heCBjb21wcmVzc2libGUgYmxvY2sgc2l6ZTogIiA8PCBjb21wcmVzc2lvbl9mYWN0b3I7CiAgICAgfQotCisgICAgYXV0byByZWFkX2FoZWFkX3NpemUgPQorICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6R2V0VWludFByb3BlcnR5PHVpbnQ+KCJyby52aXJ0dWFsX2FiLnJlYWRfYWhlYWRfc2l6ZSIsIGtSZWFkQWhlYWRTaXplS2IpOwogICAgIFBhcnRpdGlvbkNvd0NyZWF0b3IgY293X2NyZWF0b3J7CiAgICAgICAgICAgICAudGFyZ2V0X21ldGFkYXRhID0gdGFyZ2V0X21ldGFkYXRhLmdldCgpLAogICAgICAgICAgICAgLnRhcmdldF9zdWZmaXggPSB0YXJnZXRfc3VmZml4LApAQCAtMzI2OSw3ICszNDc1LDEwIEBACiAgICAgICAgICAgICAuZXh0cmFfZXh0ZW50cyA9IHt9LAogICAgICAgICAgICAgLnVzaW5nX3NuYXB1c2VyZCA9IHVzaW5nX3NuYXB1c2VyZCwKICAgICAgICAgICAgIC5jb21wcmVzc2lvbl9hbGdvcml0aG0gPSBjb21wcmVzc2lvbl9hbGdvcml0aG0sCisgICAgICAgICAgICAuY29tcHJlc3Npb25fZmFjdG9yID0gY29tcHJlc3Npb25fZmFjdG9yLAorICAgICAgICAgICAgLnJlYWRfYWhlYWRfc2l6ZSA9IHJlYWRfYWhlYWRfc2l6ZSwKICAgICB9OworCiAgICAgaWYgKGRhcF9tZXRhZGF0YS52YWJjX2ZlYXR1cmVfc2V0KCkuaGFzX3RocmVhZGVkKCkpIHsKICAgICAgICAgY293X2NyZWF0b3IuZW5hYmxlX3RocmVhZGluZyA9IGRhcF9tZXRhZGF0YS52YWJjX2ZlYXR1cmVfc2V0KCkudGhyZWFkZWQoKTsKICAgICB9CkBAIC0zMjc3LDkgKzM0ODYsMTcgQEAKICAgICAgICAgY293X2NyZWF0b3IuYmF0Y2hlZF93cml0ZXMgPSBkYXBfbWV0YWRhdGEudmFiY19mZWF0dXJlX3NldCgpLmJhdGNoX3dyaXRlcygpOwogICAgIH0KIAorICAgIC8vIEluIGNhc2Ugb2YgZXJyb3IsIGF1dG9tYXRpY2FsbHkgZGVsZXRlIGRldmljZXMgdGhhdCBhcmUgY3JlYXRlZCBhbG9uZyB0aGUgd2F5LgorICAgIC8vIE5vdGUgdGhhdCAibG9jayIgaXMgZGVzdHJveWVkIGFmdGVyICJjcmVhdGVkX2RldmljZXMiLCBzbyBpdCBpcyBzYWZlIHRvIHVzZSB8bG9ja3wgZm9yCisgICAgLy8gdGhlc2UgZGV2aWNlcy4KKyAgICBBdXRvRGV2aWNlTGlzdCBjcmVhdGVkX2RldmljZXM7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFNuYXBzaG90U3RhdHVzPiBhbGxfc25hcHNob3Rfc3RhdHVzOwogICAgIGF1dG8gcmV0ID0gQ3JlYXRlVXBkYXRlU25hcHNob3RzSW50ZXJuYWwobG9jay5nZXQoKSwgbWFuaWZlc3QsICZjb3dfY3JlYXRvciwgJmNyZWF0ZWRfZGV2aWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGxfc25hcHNob3Rfc3RhdHVzKTsKLSAgICBpZiAoIXJldC5pc19vaygpKSByZXR1cm4gcmV0OworICAgIGlmICghcmV0LmlzX29rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ3JlYXRlVXBkYXRlU25hcHNob3RzSW50ZXJuYWwgZmFpbGVkOiAiIDw8IHJldC5zdHJpbmcoKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CiAKICAgICBhdXRvIGV4cG9ydGVkX3RhcmdldF9tZXRhZGF0YSA9IHRhcmdldF9tZXRhZGF0YS0+RXhwb3J0KCk7CiAgICAgaWYgKGV4cG9ydGVkX3RhcmdldF9tZXRhZGF0YSA9PSBudWxscHRyKSB7CkBAIC0zMjg3LDcgKzM1MDQsNyBAQAogICAgICAgICByZXR1cm4gUmV0dXJuOjpFcnJvcigpOwogICAgIH0KIAotICAgIHJldCA9IEluaXRpYWxpemVVcGRhdGVTbmFwc2hvdHMobG9jay5nZXQoKSwgdGFyZ2V0X21ldGFkYXRhLmdldCgpLAorICAgIHJldCA9IEluaXRpYWxpemVVcGRhdGVTbmFwc2hvdHMobG9jay5nZXQoKSwgZGFwX21ldGFkYXRhLmNvd192ZXJzaW9uKCksIHRhcmdldF9tZXRhZGF0YS5nZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydGVkX3RhcmdldF9tZXRhZGF0YS5nZXQoKSwgdGFyZ2V0X3N1ZmZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF9zbmFwc2hvdF9zdGF0dXMpOwogICAgIGlmICghcmV0LmlzX29rKCkpIHJldHVybiByZXQ7CkBAIC0zMzI4LDYgKzM1NDUsMTkgQEAKICAgICAgICAgICAgIHN0YXR1cy5zZXRfaW9fdXJpbmdfZW5hYmxlZCh0cnVlKTsKICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiaW9fdXJpbmcgZm9yIHNuYXBzaG90cyBlbmFibGVkIjsKICAgICAgICAgfQorICAgICAgICBpZiAoR2V0T0RpcmVjdEVuYWJsZWRQcm9wZXJ0eSgpKSB7CisgICAgICAgICAgICBzdGF0dXMuc2V0X29fZGlyZWN0KHRydWUpOworICAgICAgICAgICAgTE9HKElORk8pIDw8ICJvX2RpcmVjdCBmb3Igc291cmNlIGltYWdlIGVuYWJsZWQiOworICAgICAgICB9CisgICAgICAgIGlmIChpc19sZWdhY3lfc25hcHVzZXJkKSB7CisgICAgICAgICAgICBzdGF0dXMuc2V0X2xlZ2FjeV9zbmFwdXNlcmQodHJ1ZSk7CisgICAgICAgICAgICBMT0coSU5GTykgPDwgIlNldHRpbmcgbGVnYWN5X3NuYXB1c2VyZCB0byB0cnVlIjsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMuc2V0X2Nvd19vcF9tZXJnZV9zaXplKAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OkdldFVpbnRQcm9wZXJ0eTx1aW50MzJfdD4oInJvLnZpcnR1YWxfYWIuY293X29wX21lcmdlX3NpemUiLCAwKSk7CisgICAgICAgIHN0YXR1cy5zZXRfbnVtX3dvcmtlcl90aHJlYWRzKAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OkdldFVpbnRQcm9wZXJ0eTx1aW50MzJfdD4oInJvLnZpcnR1YWxfYWIubnVtX3dvcmtlcl90aHJlYWRzIiwgMCkpOworCiAgICAgfSBlbHNlIGlmIChsZWdhY3lfY29tcHJlc3Npb24pIHsKICAgICAgICAgTE9HKElORk8pIDw8ICJWaXJ0dWFsIEEvQiB1c2luZyBsZWdhY3kgc25hcHVzZXJkIjsKICAgICB9IGVsc2UgewpAQCAtMzMzNSwxMiArMzU2NSwxMyBAQAogICAgIH0KIAogICAgIGlzX3NuYXBzaG90X3VzZXJzcGFjZV8uZW1wbGFjZSh1c2Vyc3BhY2Vfc25hcHNob3RzKTsKKyAgICBpc19sZWdhY3lfc25hcHVzZXJkXy5lbXBsYWNlKGlzX2xlZ2FjeV9zbmFwdXNlcmQpOwogCiAgICAgaWYgKCFkZXZpY2UoKS0+SXNUZXN0RGV2aWNlKCkgJiYgdXNpbmdfc25hcHVzZXJkKSB7CiAgICAgICAgIC8vIFRlcm1pbmF0ZSBzdGFsZSBkYWVtb24gaWYgYW55CiAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxTbmFwdXNlcmRDbGllbnQ+IHNuYXB1c2VyZF9jbGllbnQgPSBzdGQ6Om1vdmUoc25hcHVzZXJkX2NsaWVudF8pOwogICAgICAgICBpZiAoIXNuYXB1c2VyZF9jbGllbnQpIHsKLSAgICAgICAgICAgIHNuYXB1c2VyZF9jbGllbnQgPSBTbmFwdXNlcmRDbGllbnQ6OkNvbm5lY3Qoa1NuYXB1c2VyZFNvY2tldCwgNXMpOworICAgICAgICAgICAgc25hcHVzZXJkX2NsaWVudCA9IFNuYXB1c2VyZENsaWVudDo6VHJ5Q29ubmVjdChrU25hcHVzZXJkU29ja2V0LCA1cyk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHNuYXB1c2VyZF9jbGllbnQpIHsKICAgICAgICAgICAgIHNuYXB1c2VyZF9jbGllbnQtPkRldGFjaFNuYXB1c2VyZCgpOwpAQCAtMzQ5Niw3ICszNzI3LDEwIEBACiAgICAgICAgIC8vIENyZWF0ZSB0aGUgYmFja2luZyBDT1cgaW1hZ2UgaWYgbmVjZXNzYXJ5LgogICAgICAgICBpZiAoc25hcHNob3Rfc3RhdHVzLmNvd19maWxlX3NpemUoKSA+IDApIHsKICAgICAgICAgICAgIGF1dG8gcmV0ID0gQ3JlYXRlQ293SW1hZ2UobG9jaywgbmFtZSk7Ci0gICAgICAgICAgICBpZiAoIXJldC5pc19vaygpKSByZXR1cm4gQWRkUmVxdWlyZWRTcGFjZShyZXQsICphbGxfc25hcHNob3Rfc3RhdHVzKTsKKyAgICAgICAgICAgIGlmICghcmV0LmlzX29rKCkpIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDcmVhdGVDb3dJbWFnZSBmYWlsZWQ6ICIgPDwgcmV0LnN0cmluZygpOworICAgICAgICAgICAgICAgIHJldHVybiBBZGRSZXF1aXJlZFNwYWNlKHJldCwgKmFsbF9zbmFwc2hvdF9zdGF0dXMpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgTE9HKElORk8pIDw8ICJTdWNjZXNzZnVsbHkgY3JlYXRlZCBzbmFwc2hvdCBmb3IgIiA8PCBuYW1lOwpAQCAtMzUwNiw3ICszNzQwLDcgQEAKIH0KIAogUmV0dXJuIFNuYXBzaG90TWFuYWdlcjo6SW5pdGlhbGl6ZVVwZGF0ZVNuYXBzaG90cygKLSAgICAgICAgTG9ja2VkRmlsZSogbG9jaywgTWV0YWRhdGFCdWlsZGVyKiB0YXJnZXRfbWV0YWRhdGEsCisgICAgICAgIExvY2tlZEZpbGUqIGxvY2ssIHVpbnQzMl90IGNvd192ZXJzaW9uLCBNZXRhZGF0YUJ1aWxkZXIqIHRhcmdldF9tZXRhZGF0YSwKICAgICAgICAgY29uc3QgTHBNZXRhZGF0YSogZXhwb3J0ZWRfdGFyZ2V0X21ldGFkYXRhLCBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0X3N1ZmZpeCwKICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFNuYXBzaG90U3RhdHVzPiYgYWxsX3NuYXBzaG90X3N0YXR1cykgewogICAgIENIRUNLKGxvY2spOwpAQCAtMzU0MCw2ICszNzc0LDExIEBACiAgICAgICAgICAgICByZXR1cm4gUmV0dXJuOjpFcnJvcigpOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKCFhbmRyb2lkOjpmc19tZ3I6OldhaXRGb3JGaWxlKGNvd19wYXRoLCA2cykpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlRpbWVkIG91dCB3YWl0aW5nIGZvciBkZXZpY2UgdG8gYXBwZWFyOiAiIDw8IGNvd19wYXRoOworICAgICAgICAgICAgcmV0dXJuIFJldHVybjo6RXJyb3IoKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChpdC0+c2Vjb25kLnVzaW5nX3NuYXB1c2VyZCgpKSB7CiAgICAgICAgICAgICB1bmlxdWVfZmQgZmQob3Blbihjb3dfcGF0aC5jX3N0cigpLCBPX1JEV1IgfCBPX0NMT0VYRUMpKTsKICAgICAgICAgICAgIGlmIChmZCA8IDApIHsKQEAgLTM1NTMsOSArMzc5MiwxMyBAQAogICAgICAgICAgICAgICAgIG9wdGlvbnMuc2NyYXRjaF9zcGFjZSA9IGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgb3B0aW9ucy5jb21wcmVzc2lvbiA9IGl0LT5zZWNvbmQuY29tcHJlc3Npb25fYWxnb3JpdGhtKCk7CisgICAgICAgICAgICBpZiAoY293X3ZlcnNpb24gPj0gMykgeworICAgICAgICAgICAgICAgIG9wdGlvbnMub3BfY291bnRfbWF4ID0gaXQtPnNlY29uZC5lc3RpbWF0ZWRfb3BzX2J1ZmZlcl9zaXplKCk7CisgICAgICAgICAgICAgICAgb3B0aW9ucy5tYXhfYmxvY2tzID0ge2l0LT5zZWNvbmQuZGV2aWNlX3NpemUoKSAvIG9wdGlvbnMuYmxvY2tfc2l6ZX07CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIENvd1dyaXRlciB3cml0ZXIob3B0aW9ucyk7Ci0gICAgICAgICAgICBpZiAoIXdyaXRlci5Jbml0aWFsaXplKGZkKSB8fCAhd3JpdGVyLkZpbmFsaXplKCkpIHsKKyAgICAgICAgICAgIGF1dG8gd3JpdGVyID0gQ3JlYXRlQ293V3JpdGVyKGNvd192ZXJzaW9uLCBvcHRpb25zLCBzdGQ6Om1vdmUoZmQpKTsKKyAgICAgICAgICAgIGlmICghd3JpdGVyLT5GaW5hbGl6ZSgpKSB7CiAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IGluaXRpYWxpemUgQ09XIGRldmljZSBmb3IgIiA8PCB0YXJnZXRfcGFydGl0aW9uLT5uYW1lKCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIFJldHVybjo6RXJyb3IoKTsKICAgICAgICAgICAgIH0KQEAgLTM2MDUsMTIgKzM4NDgsMTIgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotc3RkOjp1bmlxdWVfcHRyPElTbmFwc2hvdFdyaXRlcj4gU25hcHNob3RNYW5hZ2VyOjpPcGVuU25hcHNob3RXcml0ZXIoCitzdGQ6OnVuaXF1ZV9wdHI8SUNvd1dyaXRlcj4gU25hcHNob3RNYW5hZ2VyOjpPcGVuU25hcHNob3RXcml0ZXIoCiAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OmZzX21ncjo6Q3JlYXRlTG9naWNhbFBhcnRpdGlvblBhcmFtcyYgcGFyYW1zLAotICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiYgc291cmNlX2RldmljZSkgeworICAgICAgICBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBsYWJlbCkgewogI2lmIGRlZmluZWQoTElCU05BUFNIT1RfTk9fQ09XX1dSSVRFKQogICAgICh2b2lkKXBhcmFtczsKLSAgICAodm9pZClzb3VyY2VfZGV2aWNlOworICAgICh2b2lkKWxhYmVsOwogCiAgICAgTE9HKEVSUk9SKSA8PCAiU25hcHNob3RzIGNhbm5vdCBiZSB3cml0dGVuIGluIGZpcnN0LXN0YWdlIGluaXQgb3IgcmVjb3ZlcnkiOwogICAgIHJldHVybiBudWxscHRyOwpAQCAtMzY0NCwyNyArMzg4NywyOCBAQAogICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CiAKLSAgICBpZiAoc3RhdHVzLnVzaW5nX3NuYXB1c2VyZCgpKSB7Ci0gICAgICAgIHJldHVybiBPcGVuQ29tcHJlc3NlZFNuYXBzaG90V3JpdGVyKGxvY2suZ2V0KCksIHNvdXJjZV9kZXZpY2UsIHBhcmFtcy5HZXRQYXJ0aXRpb25OYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgcGF0aHMpOworICAgIGlmICghc3RhdHVzLnVzaW5nX3NuYXB1c2VyZCgpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbiBvbmx5IGNyZWF0ZSBzbmFwc2hvdCB3cml0ZXJzIHdpdGggdXNlcnNwYWNlIG9yIGNvbXByZXNzZWQgc25hcHNob3RzIjsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgfQotICAgIHJldHVybiBPcGVuS2VybmVsU25hcHNob3RXcml0ZXIobG9jay5nZXQoKSwgc291cmNlX2RldmljZSwgcGFyYW1zLkdldFBhcnRpdGlvbk5hbWUoKSwgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aHMpOworCisgICAgcmV0dXJuIE9wZW5Db21wcmVzc2VkU25hcHNob3RXcml0ZXIobG9jay5nZXQoKSwgc3RhdHVzLCBwYXRocywgbGFiZWwpOwogI2VuZGlmCiB9CiAKICNpZiAhZGVmaW5lZChMSUJTTkFQU0hPVF9OT19DT1dfV1JJVEUpCi1zdGQ6OnVuaXF1ZV9wdHI8SVNuYXBzaG90V3JpdGVyPiBTbmFwc2hvdE1hbmFnZXI6Ok9wZW5Db21wcmVzc2VkU25hcHNob3RXcml0ZXIoCi0gICAgICAgIExvY2tlZEZpbGUqIGxvY2ssIGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+JiBzb3VyY2VfZGV2aWNlLAotICAgICAgICBbW21heWJlX3VudXNlZF1dIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJ0aXRpb25fbmFtZSwgY29uc3QgU25hcHNob3RTdGF0dXMmIHN0YXR1cywKLSAgICAgICAgY29uc3QgU25hcHNob3RQYXRocyYgcGF0aHMpIHsKK3N0ZDo6dW5pcXVlX3B0cjxJQ293V3JpdGVyPiBTbmFwc2hvdE1hbmFnZXI6Ok9wZW5Db21wcmVzc2VkU25hcHNob3RXcml0ZXIoCisgICAgICAgIExvY2tlZEZpbGUqIGxvY2ssIGNvbnN0IFNuYXBzaG90U3RhdHVzJiBzdGF0dXMsIGNvbnN0IFNuYXBzaG90UGF0aHMmIHBhdGhzLAorICAgICAgICBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PiBsYWJlbCkgewogICAgIENIRUNLKGxvY2spOwogCiAgICAgQ293T3B0aW9ucyBjb3dfb3B0aW9uczsKICAgICBjb3dfb3B0aW9ucy5jb21wcmVzc2lvbiA9IHN0YXR1cy5jb21wcmVzc2lvbl9hbGdvcml0aG0oKTsKICAgICBjb3dfb3B0aW9ucy5tYXhfYmxvY2tzID0ge3N0YXR1cy5kZXZpY2Vfc2l6ZSgpIC8gY293X29wdGlvbnMuYmxvY2tfc2l6ZX07CiAgICAgY293X29wdGlvbnMuYmF0Y2hfd3JpdGUgPSBzdGF0dXMuYmF0Y2hlZF93cml0ZXMoKTsKLSAgICBjb3dfb3B0aW9ucy5udW1fY29tcHJlc3NfdGhyZWFkcyA9IHN0YXR1cy5lbmFibGVfdGhyZWFkaW5nKCkgPyAyIDogMDsKKyAgICBjb3dfb3B0aW9ucy5udW1fY29tcHJlc3NfdGhyZWFkcyA9IHN0YXR1cy5lbmFibGVfdGhyZWFkaW5nKCkgPyAyIDogMTsKKyAgICBjb3dfb3B0aW9ucy5vcF9jb3VudF9tYXggPSBzdGF0dXMuZXN0aW1hdGVkX29wc19idWZmZXJfc2l6ZSgpOworICAgIGNvd19vcHRpb25zLmNvbXByZXNzaW9uX2ZhY3RvciA9IHN0YXR1cy5jb21wcmVzc2lvbl9mYWN0b3IoKTsKICAgICAvLyBEaXNhYmxlIHNjcmF0Y2ggc3BhY2UgZm9yIHZ0cyB0ZXN0cwogICAgIGlmIChkZXZpY2UoKS0+SXNUZXN0RGV2aWNlKCkpIHsKICAgICAgICAgY293X29wdGlvbnMuc2NyYXRjaF9zcGFjZSA9IGZhbHNlOwpAQCAtMzY3NCwxMSArMzkxOCw2IEBACiAgICAgLy8gbmV2ZXIgY3JlYXRlcyB0aGlzIHNjZW5hcmlvLgogICAgIENIRUNLKHN0YXR1cy5zbmFwc2hvdF9zaXplKCkgPT0gc3RhdHVzLmRldmljZV9zaXplKCkpOwogCi0gICAgYXV0byB3cml0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENvbXByZXNzZWRTbmFwc2hvdFdyaXRlcj4oY293X29wdGlvbnMpOwotICAgIGlmIChzb3VyY2VfZGV2aWNlKSB7Ci0gICAgICAgIHdyaXRlci0+U2V0U291cmNlRGV2aWNlKCpzb3VyY2VfZGV2aWNlKTsKLSAgICB9Ci0KICAgICBzdGQ6OnN0cmluZyBjb3dfcGF0aDsKICAgICBpZiAoIUdldE1hcHBlZEltYWdlRGV2aWNlUGF0aChwYXRocy5jb3dfZGV2aWNlX25hbWUsICZjb3dfcGF0aCkpIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IGRldGVybWluZSBwYXRoIGZvciAiIDw8IHBhdGhzLmNvd19kZXZpY2VfbmFtZTsKQEAgLTM2OTAsNDAgKzM5MjksMTQgQEAKICAgICAgICAgUExPRyhFUlJPUikgPDwgIk9wZW5Db21wcmVzc2VkU25hcHNob3RXcml0ZXI6IG9wZW4gIiA8PCBjb3dfcGF0aDsKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgfQotICAgIGlmICghd3JpdGVyLT5TZXRDb3dEZXZpY2Uoc3RkOjptb3ZlKGNvd19mZCkpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBjcmVhdGUgQ09XIHdyaXRlciBmcm9tICIgPDwgY293X3BhdGg7CisKKyAgICBDb3dIZWFkZXJWMyBoZWFkZXI7CisgICAgaWYgKCFSZWFkQ293SGVhZGVyKGNvd19mZCwgJmhlYWRlcikpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiT3BlbkNvbXByZXNzZWRTbmFwc2hvdFdyaXRlcjogcmVhZCBoZWFkZXIgZmFpbGVkIjsKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgfQogCi0gICAgcmV0dXJuIHdyaXRlcjsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPElTbmFwc2hvdFdyaXRlcj4gU25hcHNob3RNYW5hZ2VyOjpPcGVuS2VybmVsU25hcHNob3RXcml0ZXIoCi0gICAgICAgIExvY2tlZEZpbGUqIGxvY2ssIGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+JiBzb3VyY2VfZGV2aWNlLAotICAgICAgICBbW21heWJlX3VudXNlZF1dIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJ0aXRpb25fbmFtZSwgY29uc3QgU25hcHNob3RTdGF0dXMmIHN0YXR1cywKLSAgICAgICAgY29uc3QgU25hcHNob3RQYXRocyYgcGF0aHMpIHsKLSAgICBDSEVDSyhsb2NrKTsKLQotICAgIENvd09wdGlvbnMgY293X29wdGlvbnM7Ci0gICAgY293X29wdGlvbnMubWF4X2Jsb2NrcyA9IHtzdGF0dXMuZGV2aWNlX3NpemUoKSAvIGNvd19vcHRpb25zLmJsb2NrX3NpemV9OwotCi0gICAgYXV0byB3cml0ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPE9ubGluZUtlcm5lbFNuYXBzaG90V3JpdGVyPihjb3dfb3B0aW9ucyk7Ci0KLSAgICBzdGQ6OnN0cmluZyBwYXRoID0gcGF0aHMuc25hcHNob3RfZGV2aWNlLmVtcHR5KCkgPyBwYXRocy50YXJnZXRfZGV2aWNlIDogcGF0aHMuc25hcHNob3RfZGV2aWNlOwotICAgIHVuaXF1ZV9mZCBmZChvcGVuKHBhdGguY19zdHIoKSwgT19SRFdSIHwgT19DTE9FWEVDKSk7Ci0gICAgaWYgKGZkIDwgMCkgewotICAgICAgICBQTE9HKEVSUk9SKSA8PCAib3BlbiBmYWlsZWQ6ICIgPDwgcGF0aDsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotCi0gICAgaWYgKHNvdXJjZV9kZXZpY2UpIHsKLSAgICAgICAgd3JpdGVyLT5TZXRTb3VyY2VEZXZpY2UoKnNvdXJjZV9kZXZpY2UpOwotICAgIH0KLQotICAgIHVpbnQ2NF90IGNvd19zaXplID0gc3RhdHVzLmNvd19wYXJ0aXRpb25fc2l6ZSgpICsgc3RhdHVzLmNvd19maWxlX3NpemUoKTsKLSAgICB3cml0ZXItPlNldFNuYXBzaG90RGV2aWNlKHN0ZDo6bW92ZShmZCksIGNvd19zaXplKTsKLQotICAgIHJldHVybiB3cml0ZXI7CisgICAgcmV0dXJuIENyZWF0ZUNvd1dyaXRlcihoZWFkZXIucHJlZml4Lm1ham9yX3ZlcnNpb24sIGNvd19vcHRpb25zLCBzdGQ6Om1vdmUoY293X2ZkKSwgbGFiZWwpOwogfQogI2VuZGlmICAvLyAhZGVmaW5lZChMSUJTTkFQU0hPVF9OT19DT1dfV1JJVEUpCiAKQEAgLTM3NzksNiArMzk5Miw5IEBACiAgICAgc3MgPDwgIlVzaW5nIHNuYXB1c2VyZDogIiA8PCB1cGRhdGVfc3RhdHVzLnVzaW5nX3NuYXB1c2VyZCgpIDw8IHN0ZDo6ZW5kbDsKICAgICBzcyA8PCAiVXNpbmcgdXNlcnNwYWNlIHNuYXBzaG90czogIiA8PCB1cGRhdGVfc3RhdHVzLnVzZXJzcGFjZV9zbmFwc2hvdHMoKSA8PCBzdGQ6OmVuZGw7CiAgICAgc3MgPDwgIlVzaW5nIGlvX3VyaW5nOiAiIDw8IHVwZGF0ZV9zdGF0dXMuaW9fdXJpbmdfZW5hYmxlZCgpIDw8IHN0ZDo6ZW5kbDsKKyAgICBzcyA8PCAiVXNpbmcgb19kaXJlY3Q6ICIgPDwgdXBkYXRlX3N0YXR1cy5vX2RpcmVjdCgpIDw8IHN0ZDo6ZW5kbDsKKyAgICBzcyA8PCAiQ293IG9wIG1lcmdlIHNpemUgKDAgZm9yIHVuY2FwcGVkKTogIiA8PCB1cGRhdGVfc3RhdHVzLmNvd19vcF9tZXJnZV9zaXplKCkgPDwgc3RkOjplbmRsOworICAgIHNzIDw8ICJXb3JrZXIgdGhyZWFkIGNvdW50OiAiIDw8IHVwZGF0ZV9zdGF0dXMubnVtX3dvcmtlcl90aHJlYWRzKCkgPDwgc3RkOjplbmRsOwogICAgIHNzIDw8ICJVc2luZyBYT1IgY29tcHJlc3Npb246ICIgPDwgR2V0WG9yQ29tcHJlc3Npb25FbmFibGVkUHJvcGVydHkoKSA8PCBzdGQ6OmVuZGw7CiAgICAgc3MgPDwgIkN1cnJlbnQgc2xvdDogIiA8PCBkZXZpY2VfLT5HZXRTbG90U3VmZml4KCkgPDwgc3RkOjplbmRsOwogICAgIHNzIDw8ICJCb290IGluZGljYXRvcjogYm9vdGluZyBmcm9tICIgPDwgR2V0Q3VycmVudFNsb3QoKSA8PCAiIHNsb3QiIDw8IHN0ZDo6ZW5kbDsKQEAgLTM4MjMsNiArNDAzOSw3IEBACiAgICAgICAgIHNzIDw8ICIgICAgYWxsb2NhdGVkIHNlY3RvcnM6ICIgPDwgc3RhdHVzLnNlY3RvcnNfYWxsb2NhdGVkKCkgPDwgc3RkOjplbmRsOwogICAgICAgICBzcyA8PCAiICAgIG1ldGFkYXRhIHNlY3RvcnM6ICIgPDwgc3RhdHVzLm1ldGFkYXRhX3NlY3RvcnMoKSA8PCBzdGQ6OmVuZGw7CiAgICAgICAgIHNzIDw8ICIgICAgY29tcHJlc3Npb246ICIgPDwgc3RhdHVzLmNvbXByZXNzaW9uX2FsZ29yaXRobSgpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgc3MgPDwgIiAgICBjb21wcmVzc2lvbiBmYWN0b3I6ICIgPDwgc3RhdHVzLmNvbXByZXNzaW9uX2ZhY3RvcigpIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgc3MgPDwgIiAgICBtZXJnZSBwaGFzZTogIiA8PCBEZWNpZGVNZXJnZVBoYXNlKHN0YXR1cykgPDwgc3RkOjplbmRsOwogICAgIH0KICAgICBvcyA8PCBzcy5yZGJ1ZigpOwpAQCAtMzg2MSw0NCArNDA3OCw5MCBAQAogICAgICAgICAvLyBXZSBhbGxvdyB0aGUgd2lwZSB0byBjb250aW51ZSwgYmVjYXVzZSBpZiB3ZSBjYW4ndCBtb3VudCAvbWV0YWRhdGEsCiAgICAgICAgIC8vIGl0IGlzIHVubGlrZWx5IHRoZSBkZXZpY2Ugd291bGQgaGF2ZSBib290ZWQgYW55d2F5LiBJZiB0aGVyZSBpcyBubwogICAgICAgICAvLyBtZXRhZGF0YSBwYXJ0aXRpb24sIHRoZW4gdGhlIGRldmljZSBwcmVkYXRlcyBWaXJ0dWFsIEEvQi4KKyAgICAgICAgTE9HKElORk8pIDw8ICIvbWV0YWRhdGEgbm90IGZvdW5kOyBhbGxvd2luZyB3aXBlLiI7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIC8vIENoZWNrIHRoaXMgZWFybHksIHNvIHdlIGRvbid0IGFjY2lkZW50YWxseSBzdGFydCB0cnlpbmcgdG8gcG9wdWxhdGUKLSAgICAvLyB0aGUgc3RhdGUgZmlsZSBpbiByZWNvdmVyeS4gTm90ZSB3ZSBkb24ndCBjYWxsIEdldFVwZGF0ZVN0YXRlIHNpbmNlCi0gICAgLy8gd2Ugd2FudCBlcnJvcnMgaW4gYWNxdWlyaW5nIHRoZSBsb2NrIHRvIGJlIHByb3BhZ2F0ZWQsIGluc3RlYWQgb2YKLSAgICAvLyByZXR1cm5pbmcgVXBkYXRlU3RhdGU6Ok5vbmUuCi0gICAgYXV0byBzdGF0ZV9maWxlID0gR2V0U3RhdGVGaWxlUGF0aCgpOwotICAgIGlmIChhY2Nlc3Moc3RhdGVfZmlsZS5jX3N0cigpLCBGX09LKSAhPSAwICYmIGVycm5vID09IEVOT0VOVCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBhdXRvIHNsb3RfbnVtYmVyID0gU2xvdE51bWJlckZvclNsb3RTdWZmaXgoZGV2aWNlXy0+R2V0U2xvdFN1ZmZpeCgpKTsKLSAgICBhdXRvIHN1cGVyX3BhdGggPSBkZXZpY2VfLT5HZXRTdXBlckRldmljZShzbG90X251bWJlcik7Ci0gICAgaWYgKCFDcmVhdGVMb2dpY2FsQW5kU25hcHNob3RQYXJ0aXRpb25zKHN1cGVyX3BhdGgsIDIwcykpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIG1hcCBwYXJ0aXRpb25zIHRvIGNvbXBsZXRlIG1lcmdlLiI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBhdXRvIHByb2Nlc3NfY2FsbGJhY2sgPSBbJl0oKSAtPiBib29sIHsKLSAgICAgICAgaWYgKGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBjYWxsYmFjaygpOworICAgIC8vIFRoaXMgY291bGQgaGFwcGVuIGlmIC9tZXRhZGF0YSBtb3VudGVkIGJ1dCB0aGVyZSBpcyBubyBmaWxlc3lzdGVtCisgICAgLy8gc3RydWN0dXJlLiBXZWlyZCwgYnV0IHdlIGhhdmUgdG8gYXNzdW1lIHRoZXJlJ3Mgbm8gT1RBIHBlbmRpbmcsIGFuZAorICAgIC8vIHRodXMgd2UgbGV0IHRoZSB3aXBlIHByb2NlZWQuCisgICAgVXBkYXRlU3RhdGUgc3RhdGU7CisgICAgeworICAgICAgICBhdXRvIGxvY2sgPSBMb2NrRXhjbHVzaXZlKCk7CisgICAgICAgIGlmICghbG9jaykgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIGRldGVybWluZSB1cGRhdGUgc3RhdGU7IGFsbG93aW5nIHdpcGUuIjsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH07CiAKLSAgICBpbl9mYWN0b3J5X2RhdGFfcmVzZXRfID0gdHJ1ZTsKLSAgICBVcGRhdGVTdGF0ZSBzdGF0ZSA9Ci0gICAgICAgICAgICBQcm9jZXNzVXBkYXRlU3RhdGVPbkRhdGFXaXBlKHRydWUgLyogYWxsb3dfZm9yd2FyZF9tZXJnZSAqLywgcHJvY2Vzc19jYWxsYmFjayk7Ci0gICAgaW5fZmFjdG9yeV9kYXRhX3Jlc2V0XyA9IGZhbHNlOwotCi0gICAgaWYgKHN0YXRlID09IFVwZGF0ZVN0YXRlOjpNZXJnZUZhaWxlZCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHN0YXRlID0gUmVhZFVwZGF0ZVN0YXRlKGxvY2suZ2V0KCkpOworICAgICAgICBMT0coSU5GTykgPDwgIlVwZGF0ZSBzdGF0ZSBiZWZvcmUgd2lwZTogIiA8PCBzdGF0ZSA8PCAiOyBzbG90OiAiIDw8IEdldEN1cnJlbnRTbG90KCkKKyAgICAgICAgICAgICAgICAgIDw8ICI7IHN1ZmZpeDogIiA8PCBkZXZpY2VfLT5HZXRTbG90U3VmZml4KCk7CiAgICAgfQogCi0gICAgLy8gTm90aGluZyBzaG91bGQgYmUgZGVwZW5kaW5nIG9uIHBhcnRpdGlvbnMgbm93LCBzbyB1bm1hcCB0aGVtIGFsbC4KLSAgICBpZiAoIVVubWFwQWxsUGFydGl0aW9uc0luUmVjb3ZlcnkoKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gdW5tYXAgYWxsIHBhcnRpdGlvbnM7IGZhc3Rib290IG1heSBmYWlsIHRvIGZsYXNoLiI7CisgICAgYm9vbCB0cnlfbWVyZ2UgPSBmYWxzZTsKKyAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgIGNhc2UgVXBkYXRlU3RhdGU6Ok5vbmU6CisgICAgICAgIGNhc2UgVXBkYXRlU3RhdGU6OkluaXRpYXRlZDoKKyAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiV2lwZSBpcyBub3QgaW1wYWN0ZWQgYnkgdXBkYXRlIHN0YXRlOyBhbGxvd2luZyB3aXBlLiI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBVcGRhdGVTdGF0ZTo6VW52ZXJpZmllZDoKKyAgICAgICAgICAgIGlmIChHZXRDdXJyZW50U2xvdCgpICE9IFNsb3Q6OlRhcmdldCkgeworICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiV2lwZSBpcyBub3QgaW1wYWN0ZWQgYnkgcm9sbGVkIGJhY2sgdXBkYXRlOyBhbGxvd2luZyB3aXBlIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghSGFzRm9yd2FyZE1lcmdlSW5kaWNhdG9yKCkpIHsKKyAgICAgICAgICAgICAgICBhdXRvIHNsb3RfbnVtYmVyID0gU2xvdE51bWJlckZvclNsb3RTdWZmaXgoZGV2aWNlXy0+R2V0U2xvdFN1ZmZpeCgpKTsKKyAgICAgICAgICAgICAgICBhdXRvIG90aGVyX3Nsb3RfbnVtYmVyID0gU2xvdE51bWJlckZvclNsb3RTdWZmaXgoZGV2aWNlXy0+R2V0T3RoZXJTbG90U3VmZml4KCkpOworCisgICAgICAgICAgICAgICAgLy8gV2UncmUgbm90IGFsbG93ZWQgdG8gZm9yd2FyZCBtZXJnZSwgc28gZm9yY2VmdWxseSByb2xsYmFjayB0aGUKKyAgICAgICAgICAgICAgICAvLyBzbG90IHN3aXRjaC4KKyAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIkFsbG93aW5nIHdpcGUgZHVlIHRvIGxhY2sgb2YgZm9yd2FyZCBtZXJnZSBpbmRpY2F0b3I7IHJldmVydGluZyB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvbGQgc2xvdCBzaW5jZSB1cGRhdGUgd2lsbCBiZSBkZWxldGVkLiI7CisgICAgICAgICAgICAgICAgZGV2aWNlXy0+U2V0U2xvdEFzVW5ib290YWJsZShzbG90X251bWJlcik7CisgICAgICAgICAgICAgICAgZGV2aWNlXy0+U2V0QWN0aXZlQm9vdFNsb3Qob3RoZXJfc2xvdF9udW1iZXIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBGb3J3YXJkIG1lcmdlIGluZGljYXRvciBtZWFucyB3ZSBoYXZlIHRvIG1vdW50IHNuYXBzaG90cyBhbmQgdHJ5IHRvIG1lcmdlLgorICAgICAgICAgICAgTE9HKElORk8pIDw8ICJGb3J3YXJkIG1lcmdlIGluZGljYXRvciBpcyBwcmVzZW50LiI7CisgICAgICAgICAgICB0cnlfbWVyZ2UgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVXBkYXRlU3RhdGU6Ok1lcmdpbmc6CisgICAgICAgIGNhc2UgVXBkYXRlU3RhdGU6Ok1lcmdlRmFpbGVkOgorICAgICAgICAgICAgdHJ5X21lcmdlID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFVwZGF0ZVN0YXRlOjpNZXJnZU5lZWRzUmVib290OgorICAgICAgICBjYXNlIFVwZGF0ZVN0YXRlOjpDYW5jZWxsZWQ6CisgICAgICAgICAgICBMT0coSU5GTykgPDwgIlVuZXhwZWN0ZWQgdXBkYXRlIHN0YXRlIGluIHJlY292ZXJ5OyBhbGxvd2luZyB3aXBlLiI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICh0cnlfbWVyZ2UpIHsKKyAgICAgICAgYXV0byBzbG90X251bWJlciA9IFNsb3ROdW1iZXJGb3JTbG90U3VmZml4KGRldmljZV8tPkdldFNsb3RTdWZmaXgoKSk7CisgICAgICAgIGF1dG8gc3VwZXJfcGF0aCA9IGRldmljZV8tPkdldFN1cGVyRGV2aWNlKHNsb3RfbnVtYmVyKTsKKyAgICAgICAgaWYgKCFDcmVhdGVMb2dpY2FsQW5kU25hcHNob3RQYXJ0aXRpb25zKHN1cGVyX3BhdGgsIDIwcykpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBtYXAgcGFydGl0aW9ucyB0byBjb21wbGV0ZSBtZXJnZS4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgYXV0byBwcm9jZXNzX2NhbGxiYWNrID0gWyZdKCkgLT4gYm9vbCB7CisgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICBjYWxsYmFjaygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH07CisKKyAgICAgICAgc3RhdGUgPSBQcm9jZXNzVXBkYXRlU3RhdGVPbkRhdGFXaXBlKHByb2Nlc3NfY2FsbGJhY2spOworICAgICAgICBpZiAoc3RhdGUgPT0gVXBkYXRlU3RhdGU6Ok1lcmdlRmFpbGVkKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3RoaW5nIHNob3VsZCBiZSBkZXBlbmRpbmcgb24gcGFydGl0aW9ucyBub3csIHNvIHVubWFwIHRoZW0gYWxsLgorICAgICAgICBpZiAoIVVubWFwQWxsUGFydGl0aW9uc0luUmVjb3ZlcnkoKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIHVubWFwIGFsbCBwYXJ0aXRpb25zOyBmYXN0Ym9vdCBtYXkgZmFpbCB0byBmbGFzaC4iOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKHN0YXRlICE9IFVwZGF0ZVN0YXRlOjpOb25lKSB7CkBAIC0zOTQ0LDU4ICs0MjA3LDQwIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLVVwZGF0ZVN0YXRlIFNuYXBzaG90TWFuYWdlcjo6UHJvY2Vzc1VwZGF0ZVN0YXRlT25EYXRhV2lwZShib29sIGFsbG93X2ZvcndhcmRfbWVyZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpmdW5jdGlvbjxib29sKCk+JiBjYWxsYmFjaykgewotICAgIGF1dG8gc2xvdF9udW1iZXIgPSBTbG90TnVtYmVyRm9yU2xvdFN1ZmZpeChkZXZpY2VfLT5HZXRTbG90U3VmZml4KCkpOwotICAgIFVwZGF0ZVN0YXRlIHN0YXRlID0gUHJvY2Vzc1VwZGF0ZVN0YXRlKGNhbGxiYWNrKTsKLSAgICBMT0coSU5GTykgPDwgIlVwZGF0ZSBzdGF0ZSBpbiByZWNvdmVyeTogIiA8PCBzdGF0ZTsKLSAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgIGNhc2UgVXBkYXRlU3RhdGU6Ok1lcmdlRmFpbGVkOgotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5yZWNvdmVyYWJsZSBtZXJnZSBmYWlsdXJlIGRldGVjdGVkLiI7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGU7Ci0gICAgICAgIGNhc2UgVXBkYXRlU3RhdGU6OlVudmVyaWZpZWQ6IHsKLSAgICAgICAgICAgIC8vIElmIGFuIE9UQSB3YXMganVzdCBhcHBsaWVkIGJ1dCBoYXMgbm90IHlldCBzdGFydGVkIG1lcmdpbmc6Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gLSBpZiBmb3J3YXJkIG1lcmdlIGlzIGFsbG93ZWQsIGluaXRpYXRlIG1lcmdlIGFuZCBjYWxsCi0gICAgICAgICAgICAvLyBQcm9jZXNzVXBkYXRlU3RhdGUgYWdhaW4uCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gLSBpZiBmb3J3YXJkIG1lcmdlIGlzIG5vdCBhbGxvd2VkLCB3ZQotICAgICAgICAgICAgLy8gaGF2ZSBubyBjaG9pY2UgYnV0IHRvIHJldmVydCBzbG90cywgYmVjYXVzZSB0aGUgY3VycmVudCBzbG90IHdpbGwKLSAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5IGJlY29tZSB1bmJvb3RhYmxlLiBSYXRoZXIgdGhhbiB3YWl0IGZvciB0aGUgZGV2aWNlCi0gICAgICAgICAgICAvLyB0byByZWJvb3QgTiB0aW1lcyB1bnRpbCBhIHJvbGxiYWNrLCB3ZSBwcm9hY3RpdmVseSBkaXNhYmxlIHRoZQotICAgICAgICAgICAgLy8gbmV3IHNsb3QgaW5zdGVhZC4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBTaW5jZSB0aGUgcm9sbGJhY2sgaXMgaW5ldml0YWJsZSwgd2UgZG9uJ3QgdHJlYXQgYSBIQUwgZmFpbHVyZQotICAgICAgICAgICAgLy8gYXMgYW4gZXJyb3IgaGVyZS4KLSAgICAgICAgICAgIGF1dG8gc2xvdCA9IEdldEN1cnJlbnRTbG90KCk7Ci0gICAgICAgICAgICBpZiAoc2xvdCA9PSBTbG90OjpUYXJnZXQpIHsKLSAgICAgICAgICAgICAgICBpZiAoYWxsb3dfZm9yd2FyZF9tZXJnZSAmJgotICAgICAgICAgICAgICAgICAgICBhY2Nlc3MoR2V0Rm9yd2FyZE1lcmdlSW5kaWNhdG9yUGF0aCgpLmNfc3RyKCksIEZfT0spID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJGb3J3YXJkIG1lcmdlIGFsbG93ZWQsIGluaXRpYXRpbmcgbWVyZ2Ugbm93LiI7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFJbml0aWF0ZU1lcmdlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBpbml0aWF0ZSBtZXJnZSBvbiBkYXRhIHdpcGUuIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBVcGRhdGVTdGF0ZTo6TWVyZ2VGYWlsZWQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb2Nlc3NVcGRhdGVTdGF0ZU9uRGF0YVdpcGUoZmFsc2UgLyogYWxsb3dfZm9yd2FyZF9tZXJnZSAqLywgY2FsbGJhY2spOworVXBkYXRlU3RhdGUgU25hcHNob3RNYW5hZ2VyOjpQcm9jZXNzVXBkYXRlU3RhdGVPbkRhdGFXaXBlKGNvbnN0IHN0ZDo6ZnVuY3Rpb248Ym9vbCgpPiYgY2FsbGJhY2spIHsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBVcGRhdGVTdGF0ZSBzdGF0ZSA9IFByb2Nlc3NVcGRhdGVTdGF0ZShjYWxsYmFjayk7CisgICAgICAgIExPRyhJTkZPKSA8PCAiUHJvY2Vzc2VkIHVwZGF0ZWQgc3RhdGUgaW4gcmVjb3Zlcnk6ICIgPDwgc3RhdGU7CisgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgICAgIGNhc2UgVXBkYXRlU3RhdGU6Ok1lcmdlRmFpbGVkOgorICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlVucmVjb3ZlcmFibGUgbWVyZ2UgZmFpbHVyZSBkZXRlY3RlZC4iOworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKKyAgICAgICAgICAgIGNhc2UgVXBkYXRlU3RhdGU6OlVudmVyaWZpZWQ6IHsKKyAgICAgICAgICAgICAgICAvLyBVbnZlcmlmaWVkIHdhcyBhbHJlYWR5IGhhbmRsZWQgZWFybGllciwgaW4gSGFuZGxlSW1taW5lbnREYXRhV2lwZSwKKyAgICAgICAgICAgICAgICAvLyBidXQgaXQgd2lsbCBmYWxsIHRocm91Z2ggaGVyZSBpZiBhIGZvcndhcmQgbWVyZ2UgaXMgcmVxdWlyZWQuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBJZiBJbml0aWF0ZU1lcmdlIGZhaWxzLCB3ZSBlYXJseSByZXR1cm4uIElmIGl0IHN1Y2NlZWRzLCB0aGVuIHdlCisgICAgICAgICAgICAgICAgLy8gYXJlIGd1YXJhbnRlZWQgdGhhdCB0aGUgbmV4dCBjYWxsIHRvIFByb2Nlc3NVcGRhdGVTdGF0ZSB3aWxsIG5vdAorICAgICAgICAgICAgICAgIC8vIHJldHVybiBVbnZlcmlmaWVkLgorICAgICAgICAgICAgICAgIGlmICghSW5pdGlhdGVNZXJnZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBpbml0aWF0ZSBtZXJnZSBvbiBkYXRhIHdpcGUuIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVwZGF0ZVN0YXRlOjpNZXJnZUZhaWxlZDsKICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJSZXZlcnRpbmcgdG8gb2xkIHNsb3Qgc2luY2UgdXBkYXRlIHdpbGwgYmUgZGVsZXRlZC4iOwotICAgICAgICAgICAgICAgIGRldmljZV8tPlNldFNsb3RBc1VuYm9vdGFibGUoc2xvdF9udW1iZXIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIkJvb3RpbmcgZnJvbSAiIDw8IHNsb3QgPDwgIiBzbG90LCBubyBhY3Rpb24gaXMgdGFrZW4uIjsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBVcGRhdGVTdGF0ZTo6TWVyZ2VOZWVkc1JlYm9vdDoKKyAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGRuJ3QgZ2V0IGhlcmUsIGJlY2F1c2Ugbm90aGluZyBpcyBkZXBlbmRpbmcgb24KKyAgICAgICAgICAgICAgICAvLyBsb2dpY2FsIHBhcnRpdGlvbnMuCisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5leHBlY3RlZCBtZXJnZS1uZWVkcy1yZWJvb3Qgc3RhdGUgaW4gcmVjb3ZlcnkuIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGU7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKICAgICAgICAgfQotICAgICAgICBjYXNlIFVwZGF0ZVN0YXRlOjpNZXJnZU5lZWRzUmVib290OgotICAgICAgICAgICAgLy8gV2Ugc2hvdWxkbid0IGdldCBoZXJlLCBiZWNhdXNlIG5vdGhpbmcgaXMgZGVwZW5kaW5nIG9uCi0gICAgICAgICAgICAvLyBsb2dpY2FsIHBhcnRpdGlvbnMuCi0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmV4cGVjdGVkIG1lcmdlLW5lZWRzLXJlYm9vdCBzdGF0ZSBpbiByZWNvdmVyeS4iOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKICAgICB9Ci0gICAgcmV0dXJuIHN0YXRlOworfQorCitib29sIFNuYXBzaG90TWFuYWdlcjo6SGFzRm9yd2FyZE1lcmdlSW5kaWNhdG9yKCkgeworICAgIHJldHVybiBhY2Nlc3MoR2V0Rm9yd2FyZE1lcmdlSW5kaWNhdG9yUGF0aCgpLmNfc3RyKCksIEZfT0spID09IDA7CiB9CiAKIGJvb2wgU25hcHNob3RNYW5hZ2VyOjpFbnN1cmVOb092ZXJmbG93U25hcHNob3QoTG9ja2VkRmlsZSogbG9jaykgewpAQCAtNDM2Niw4ICs0NjExLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIExPRyhFUlJPUikgPDwgIkRldmljZS1tYXBwZXIgZGV2aWNlICIgPDwgbmFtZSA8PCAiKCIgPDwgZnVsbF9wYXRoIDw8ICIpIgotICAgICAgICAgICAgICAgPDwgIiBzdGlsbCBpbiB1c2UuIgorICAgIExPRyhFUlJPUikgPDwgIkRldmljZS1tYXBwZXIgZGV2aWNlICIgPDwgbmFtZSA8PCAiKCIgPDwgZnVsbF9wYXRoIDw8ICIpIiA8PCAiIHN0aWxsIGluIHVzZS4iCiAgICAgICAgICAgICAgICA8PCAiICBQcm9iYWJseSBhIGZpbGUgZGVzY3JpcHRvciB3YXMgbGVha2VkIG9yIGhlbGQgb3Blbiwgb3IgYSBsb29wIGRldmljZSBpcyIKICAgICAgICAgICAgICAgIDw8ICIgYXR0YWNoZWQuIjsKICAgICByZXR1cm4gZmFsc2U7CkBAIC00MzkzLDE1ICs0NjM3LDk2IEBACiB9CiAKIGJvb2wgU25hcHNob3RNYW5hZ2VyOjpJc1VzZXJzcGFjZVNuYXBzaG90VXBkYXRlSW5Qcm9ncmVzcygpIHsKLSAgICBhdXRvIHNsb3QgPSBHZXRDdXJyZW50U2xvdCgpOwotICAgIGlmIChzbG90ID09IFNsb3Q6OlRhcmdldCkgewotICAgICAgICBpZiAoSXNTbmFwdXNlcmRSZXF1aXJlZCgpKSB7CisgICAgLy8gV2UgY2Fubm90IGdyYWIgL21ldGFkYXRhL290YSBsb2NrIGhlcmUgYXMgdGhpcworICAgIC8vIGlzIGluIHJlYm9vdCBwYXRoLiBTZWUgYi8zMDg5MDA4NTMKKyAgICAvLworICAgIC8vIENoZWNrIGlmIGFueSBvZiB0aGUgcGFydGl0aW9ucyBhcmUgbW91bnRlZAorICAgIC8vIG9mZiBkbS11c2VyIGJsb2NrIGRldmljZS4gSWYgc28sIHRoZW4gd2UgYXJlIGNlcnRhaW4KKyAgICAvLyB0aGF0IE9UQSB1cGRhdGUgaW4gcHJvZ3Jlc3MuCisgICAgYXV0byBjdXJyZW50X3N1ZmZpeCA9IGRldmljZV8tPkdldFNsb3RTdWZmaXgoKTsKKyAgICBhdXRvJiBkbSA9IERldmljZU1hcHBlcjo6SW5zdGFuY2UoKTsKKyAgICBhdXRvIGRtX2Jsb2NrX2RldmljZXMgPSBkbS5GaW5kRG1QYXJ0aXRpb25zKCk7CisgICAgaWYgKGRtX2Jsb2NrX2RldmljZXMuZW1wdHkoKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJObyBkbS1lbmFibGVkIGJsb2NrIGRldmljZSBpcyBmb3VuZC4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoYXV0byYgcGFydGl0aW9uIDogZG1fYmxvY2tfZGV2aWNlcykgeworICAgICAgICBzdGQ6OnN0cmluZyBwYXJ0aXRpb25fbmFtZSA9IHBhcnRpdGlvbi5maXJzdCArIGN1cnJlbnRfc3VmZml4OworICAgICAgICBEZXZpY2VNYXBwZXI6OlRhcmdldEluZm8gc25hcF90YXJnZXQ7CisgICAgICAgIGlmICghR2V0U2luZ2xlVGFyZ2V0KHBhcnRpdGlvbl9uYW1lLCBUYWJsZVF1ZXJ5OjpTdGF0dXMsICZzbmFwX3RhcmdldCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBhdXRvIHR5cGUgPSBEZXZpY2VNYXBwZXI6OkdldFRhcmdldFR5cGUoc25hcF90YXJnZXQuc3BlYyk7CisgICAgICAgIGlmICh0eXBlID09ICJ1c2VyIikgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0KICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK2Jvb2wgU25hcHNob3RNYW5hZ2VyOjpCb290RnJvbVNuYXBzaG90c1dpdGhvdXRTbG90U3dpdGNoKCkgeworICAgIGF1dG8gbG9jayA9IExvY2tFeGNsdXNpdmUoKTsKKyAgICBpZiAoIWxvY2spIHJldHVybiBmYWxzZTsKKworICAgIGF1dG8gY29udGVudHMgPSBkZXZpY2VfLT5HZXRTbG90U3VmZml4KCk7CisgICAgLy8gVGhpcyBpcyB0aGUgaW5kaWNhdG9yIHdoaWNoIHRlbGxzIGZpcnN0LXN0YWdlIGluaXQKKyAgICAvLyB0byBib290IGZyb20gc25hcHNob3RzIGV2ZW4gdGhvdWdoIHRoZXJlIHdhcyBubyBzbG90LXN3aXRjaAorICAgIGF1dG8gYm9vdF9maWxlID0gR2V0Qm9vdFNuYXBzaG90c1dpdGhvdXRTbG90U3dpdGNoUGF0aCgpOworICAgIGlmICghV3JpdGVTdHJpbmdUb0ZpbGVBdG9taWMoY29udGVudHMsIGJvb3RfZmlsZSkpIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIndyaXRlIGZhaWxlZDogIiA8PCBib290X2ZpbGU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBTbmFwc2hvdFVwZGF0ZVN0YXR1cyB1cGRhdGVfc3RhdHVzID0gUmVhZFNuYXBzaG90VXBkYXRlU3RhdHVzKGxvY2suZ2V0KCkpOworICAgIHVwZGF0ZV9zdGF0dXMuc2V0X3N0YXRlKFVwZGF0ZVN0YXRlOjpJbml0aWF0ZWQpOworICAgIHVwZGF0ZV9zdGF0dXMuc2V0X3VzZXJzcGFjZV9zbmFwc2hvdHModHJ1ZSk7CisgICAgdXBkYXRlX3N0YXR1cy5zZXRfdXNpbmdfc25hcHVzZXJkKHRydWUpOworICAgIGlmICghV3JpdGVTbmFwc2hvdFVwZGF0ZVN0YXR1cyhsb2NrLmdldCgpLCB1cGRhdGVfc3RhdHVzKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIFNuYXBzaG90TWFuYWdlcjo6UHJlcGFyZURldmljZVRvQm9vdFdpdGhvdXRTbmFwc2hvdCgpIHsKKyAgICBhdXRvIGxvY2sgPSBMb2NrRXhjbHVzaXZlKCk7CisgICAgaWYgKCFsb2NrKSByZXR1cm4gZmFsc2U7CisKKyAgICBhbmRyb2lkOjpiYXNlOjpSZW1vdmVGaWxlSWZFeGlzdHMoR2V0U25hcHNob3RCb290SW5kaWNhdG9yUGF0aCgpKTsKKyAgICBhbmRyb2lkOjpiYXNlOjpSZW1vdmVGaWxlSWZFeGlzdHMoR2V0Qm9vdFNuYXBzaG90c1dpdGhvdXRTbG90U3dpdGNoUGF0aCgpKTsKKworICAgIFNuYXBzaG90VXBkYXRlU3RhdHVzIHVwZGF0ZV9zdGF0dXMgPSBSZWFkU25hcHNob3RVcGRhdGVTdGF0dXMobG9jay5nZXQoKSk7CisgICAgdXBkYXRlX3N0YXR1cy5zZXRfc3RhdGUoVXBkYXRlU3RhdGU6OkNhbmNlbGxlZCk7CisgICAgaWYgKCFXcml0ZVNuYXBzaG90VXBkYXRlU3RhdHVzKGxvY2suZ2V0KCksIHVwZGF0ZV9zdGF0dXMpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgU25hcHNob3RNYW5hZ2VyOjpTZXRSZWFkQWhlYWRTaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiBlbnRyeV9ibG9ja19kZXZpY2UsIG9mZjY0X3Qgc2l6ZV9rYikgeworICAgIHN0ZDo6c3RyaW5nIGJsb2NrX2RldmljZTsKKyAgICBpZiAoIVJlYWxwYXRoKGVudHJ5X2Jsb2NrX2RldmljZSwgJmJsb2NrX2RldmljZSkpIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byByZWFscGF0aCAiIDw8IGVudHJ5X2Jsb2NrX2RldmljZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0YXRpYyBjb25zdGV4cHIgc3RkOjpzdHJpbmdfdmlldyBrRGV2QmxvY2tQcmVmaXgoIi9kZXYvYmxvY2svIik7CisgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpTdGFydHNXaXRoKGJsb2NrX2RldmljZSwga0RldkJsb2NrUHJlZml4KSkgeworICAgICAgICBMT0coRVJST1IpIDw8IGJsb2NrX2RldmljZSA8PCAiIGlzIG5vdCBhIGJsb2NrIGRldmljZSI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBibG9ja19uYW1lID0gYmxvY2tfZGV2aWNlLnN1YnN0cihrRGV2QmxvY2tQcmVmaXgubGVuZ3RoKCkpOworICAgIHN0ZDo6c3RyaW5nIHN5c19wYXJ0aXRpb24gPQorICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKCIvc3lzL2NsYXNzL2Jsb2NrLyVzL3BhcnRpdGlvbiIsIGJsb2NrX25hbWUuY19zdHIoKSk7CisgICAgc3RydWN0IHN0YXQgaW5mbzsKKyAgICBpZiAobHN0YXQoc3lzX3BhcnRpdGlvbi5jX3N0cigpLCAmaW5mbykgPT0gMCkgeworICAgICAgICBibG9ja19uYW1lICs9ICIvLi4iOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBzeXNfcmEgPSBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoIi9zeXMvY2xhc3MvYmxvY2svJXMvcXVldWUvcmVhZF9haGVhZF9rYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX25hbWUuY19zdHIoKSk7CisgICAgc3RkOjpzdHJpbmcgc2l6ZSA9IHN0ZDo6dG9fc3RyaW5nKHNpemVfa2IpOworICAgIGFuZHJvaWQ6OmJhc2U6OldyaXRlU3RyaW5nVG9GaWxlKHNpemUsIHN5c19yYS5jX3N0cigpKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90CiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXBzaG90X3JlYWRlci5jcHAgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHNob3RfcmVhZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU0NmMyYS4uMDAwMDAwMAotLS0gYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHNob3RfcmVhZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM1NSArMCwwIEBACi0vLwotLy8gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jaW5jbHVkZSAic25hcHNob3RfcmVhZGVyLmgiCi0KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8ZXh0NF91dGlscy9leHQ0X3V0aWxzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBzbmFwc2hvdCB7Ci0KLXVzaW5nIGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkOwotCi0vLyBOb3Qgc3VwcG9ydGVkLgotYm9vbCBSZWFkT25seUZpbGVEZXNjcmlwdG9yOjpPcGVuKGNvbnN0IGNoYXIqLCBpbnQsIG1vZGVfdCkgewotICAgIGVycm5vID0gRUlOVkFMOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBSZWFkT25seUZpbGVEZXNjcmlwdG9yOjpPcGVuKGNvbnN0IGNoYXIqLCBpbnQpIHsKLSAgICBlcnJubyA9IEVJTlZBTDsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXNzaXplX3QgUmVhZE9ubHlGaWxlRGVzY3JpcHRvcjo6V3JpdGUoY29uc3Qgdm9pZCosIHNpemVfdCkgewotICAgIGVycm5vID0gRUlOVkFMOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBSZWFkT25seUZpbGVEZXNjcmlwdG9yOjpCbGtJb2N0bChpbnQsIHVpbnQ2NF90LCB1aW50NjRfdCwgaW50KikgewotICAgIGVycm5vID0gRUlOVkFMOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotUmVhZEZkRmlsZURlc2NyaXB0b3I6OlJlYWRGZEZpbGVEZXNjcmlwdG9yKGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCYmIGZkKSA6IGZkXyhzdGQ6Om1vdmUoZmQpKSB7fQotCi1zc2l6ZV90IFJlYWRGZEZpbGVEZXNjcmlwdG9yOjpSZWFkKHZvaWQqIGJ1Ziwgc2l6ZV90IGNvdW50KSB7Ci0gICAgcmV0dXJuIHJlYWQoZmRfLmdldCgpLCBidWYsIGNvdW50KTsKLX0KLQotb2ZmNjRfdCBSZWFkRmRGaWxlRGVzY3JpcHRvcjo6U2VlayhvZmY2NF90IG9mZnNldCwgaW50IHdoZW5jZSkgewotICAgIHJldHVybiBsc2VlayhmZF8uZ2V0KCksIG9mZnNldCwgd2hlbmNlKTsKLX0KLQotdWludDY0X3QgUmVhZEZkRmlsZURlc2NyaXB0b3I6OkJsb2NrRGV2U2l6ZSgpIHsKLSAgICByZXR1cm4gZ2V0X2Jsb2NrX2RldmljZV9zaXplKGZkXy5nZXQoKSk7Ci19Ci0KLWJvb2wgUmVhZEZkRmlsZURlc2NyaXB0b3I6OkNsb3NlKCkgewotICAgIGZkXyA9IHt9OwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFJlYWRGZEZpbGVEZXNjcmlwdG9yOjpJc1NldHRpbmdFcnJubygpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBSZWFkRmRGaWxlRGVzY3JpcHRvcjo6SXNPcGVuKCkgewotICAgIHJldHVybiBmZF8gPj0gMDsKLX0KLQotYm9vbCBSZWFkRmRGaWxlRGVzY3JpcHRvcjo6Rmx1c2goKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ29tcHJlc3NlZFNuYXBzaG90UmVhZGVyOjpTZXRDb3coc3RkOjp1bmlxdWVfcHRyPENvd1JlYWRlcj4mJiBjb3cpIHsKLSAgICBjb3dfID0gc3RkOjptb3ZlKGNvdyk7Ci0KLSAgICBDb3dIZWFkZXIgaGVhZGVyOwotICAgIGlmICghY293Xy0+R2V0SGVhZGVyKCZoZWFkZXIpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgYmxvY2tfc2l6ZV8gPSBoZWFkZXIuYmxvY2tfc2l6ZTsKLQotICAgIC8vIFBvcHVsYXRlIHRoZSBvcGVyYXRpb24gbWFwLgotICAgIG9wX2l0ZXJfID0gY293Xy0+R2V0T3BJdGVyKCk7Ci0gICAgd2hpbGUgKCFvcF9pdGVyXy0+RG9uZSgpKSB7Ci0gICAgICAgIGNvbnN0IENvd09wZXJhdGlvbiogb3AgPSAmb3BfaXRlcl8tPkdldCgpOwotICAgICAgICBpZiAoSXNNZXRhZGF0YU9wKCpvcCkpIHsKLSAgICAgICAgICAgIG9wX2l0ZXJfLT5OZXh0KCk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAob3AtPm5ld19ibG9jayA+PSBvcHNfLnNpemUoKSkgewotICAgICAgICAgICAgb3BzXy5yZXNpemUob3AtPm5ld19ibG9jayArIDEsIG51bGxwdHIpOwotICAgICAgICB9Ci0gICAgICAgIG9wc19bb3AtPm5ld19ibG9ja10gPSBvcDsKLSAgICAgICAgb3BfaXRlcl8tPk5leHQoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBDb21wcmVzc2VkU25hcHNob3RSZWFkZXI6OlNldFNvdXJjZURldmljZShjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlX2RldmljZSkgewotICAgIHNvdXJjZV9kZXZpY2VfID0ge3NvdXJjZV9kZXZpY2V9OwotfQotCi12b2lkIENvbXByZXNzZWRTbmFwc2hvdFJlYWRlcjo6U2V0QmxvY2tEZXZpY2VTaXplKHVpbnQ2NF90IGJsb2NrX2RldmljZV9zaXplKSB7Ci0gICAgYmxvY2tfZGV2aWNlX3NpemVfID0gYmxvY2tfZGV2aWNlX3NpemU7Ci19Ci0KLWJvcnJvd2VkX2ZkIENvbXByZXNzZWRTbmFwc2hvdFJlYWRlcjo6R2V0U291cmNlRmQoKSB7Ci0gICAgaWYgKHNvdXJjZV9mZF8gPCAwKSB7Ci0gICAgICAgIGlmICghc291cmNlX2RldmljZV8pIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNvbXByZXNzZWRTbmFwc2hvdFJlYWRlciBuZWVkcyBzb3VyY2UgZGV2aWNlLCBidXQgbm9uZSB3YXMgc2V0IjsKLSAgICAgICAgICAgIGVycm5vID0gRUlOVkFMOwotICAgICAgICAgICAgcmV0dXJuIHstMX07Ci0gICAgICAgIH0KLSAgICAgICAgc291cmNlX2ZkXy5yZXNldChvcGVuKHNvdXJjZV9kZXZpY2VfLT5jX3N0cigpLCBPX1JET05MWSB8IE9fQ0xPRVhFQykpOwotICAgICAgICBpZiAoc291cmNlX2ZkXyA8IDApIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJvcGVuICIgPDwgKnNvdXJjZV9kZXZpY2VfOwotICAgICAgICAgICAgcmV0dXJuIHstMX07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHNvdXJjZV9mZF87Ci19Ci0KLWNsYXNzIE1lbW9yeUJ5dGVTaW5rIDogcHVibGljIElCeXRlU2luayB7Ci0gIHB1YmxpYzoKLSAgICBNZW1vcnlCeXRlU2luayh2b2lkKiBidWYsIHNpemVfdCBjb3VudCkgewotICAgICAgICBidWZfID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oYnVmKTsKLSAgICAgICAgcG9zXyA9IGJ1Zl87Ci0gICAgICAgIGVuZF8gPSBidWZfICsgY291bnQ7Ci0gICAgfQotCi0gICAgdm9pZCogR2V0QnVmZmVyKHNpemVfdCByZXF1ZXN0ZWQsIHNpemVfdCogYWN0dWFsKSBvdmVycmlkZSB7Ci0gICAgICAgICphY3R1YWwgPSBzdGQ6Om1pbihyZW1haW5pbmcoKSwgcmVxdWVzdGVkKTsKLSAgICAgICAgaWYgKCEqYWN0dWFsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAgICAgfQotCi0gICAgICAgIHVpbnQ4X3QqIHN0YXJ0ID0gcG9zXzsKLSAgICAgICAgcG9zXyArPSAqYWN0dWFsOwotICAgICAgICByZXR1cm4gc3RhcnQ7Ci0gICAgfQotCi0gICAgYm9vbCBSZXR1cm5EYXRhKHZvaWQqLCBzaXplX3QpIG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KLQotICAgIHVpbnQ4X3QqIGJ1ZigpIGNvbnN0IHsgcmV0dXJuIGJ1Zl87IH0KLSAgICB1aW50OF90KiBwb3MoKSBjb25zdCB7IHJldHVybiBwb3NfOyB9Ci0gICAgc2l6ZV90IHJlbWFpbmluZygpIGNvbnN0IHsgcmV0dXJuIGVuZF8gLSBwb3NfOyB9Ci0KLSAgcHJpdmF0ZToKLSAgICB1aW50OF90KiBidWZfOwotICAgIHVpbnQ4X3QqIHBvc187Ci0gICAgdWludDhfdCogZW5kXzsKLX07Ci0KLXNzaXplX3QgQ29tcHJlc3NlZFNuYXBzaG90UmVhZGVyOjpSZWFkKHZvaWQqIGJ1Ziwgc2l6ZV90IGNvdW50KSB7Ci0gICAgLy8gRmluZCB0aGUgc3RhcnQgYW5kIGVuZCBjaHVua3MsIGluY2x1c2l2ZS4KLSAgICB1aW50NjRfdCBzdGFydF9jaHVuayA9IG9mZnNldF8gLyBibG9ja19zaXplXzsKLSAgICB1aW50NjRfdCBlbmRfY2h1bmsgPSAob2Zmc2V0XyArIGNvdW50IC0gMSkgLyBibG9ja19zaXplXzsKLQotICAgIC8vIENob3Agb2ZmIHRoZSBmaXJzdCBOIGJ5dGVzIGlmIHRoZSBwb3NpdGlvbiBpcyBub3QgYmxvY2stYWxpZ25lZC4KLSAgICBzaXplX3Qgc3RhcnRfb2Zmc2V0ID0gb2Zmc2V0XyAlIGJsb2NrX3NpemVfOwotCi0gICAgTWVtb3J5Qnl0ZVNpbmsgc2luayhidWYsIGNvdW50KTsKLQotICAgIHNpemVfdCBpbml0aWFsX2J5dGVzID0gc3RkOjptaW4oYmxvY2tfc2l6ZV8gLSBzdGFydF9vZmZzZXQsIHNpbmsucmVtYWluaW5nKCkpOwotICAgIHNzaXplX3QgcnYgPSBSZWFkQmxvY2soc3RhcnRfY2h1bmssICZzaW5rLCBzdGFydF9vZmZzZXQsIGluaXRpYWxfYnl0ZXMpOwotICAgIGlmIChydiA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBvZmZzZXRfICs9IHJ2OwotCi0gICAgZm9yICh1aW50NjRfdCBjaHVuayA9IHN0YXJ0X2NodW5rICsgMTsgY2h1bmsgPCBlbmRfY2h1bms7IGNodW5rKyspIHsKLSAgICAgICAgc3NpemVfdCBydiA9IFJlYWRCbG9jayhjaHVuaywgJnNpbmssIDApOwotICAgICAgICBpZiAocnYgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgb2Zmc2V0XyArPSBydjsKLSAgICB9Ci0KLSAgICBpZiAoc2luay5yZW1haW5pbmcoKSkgewotICAgICAgICBzc2l6ZV90IHJ2ID0gUmVhZEJsb2NrKGVuZF9jaHVuaywgJnNpbmssIDAsIHtzaW5rLnJlbWFpbmluZygpfSk7Ci0gICAgICAgIGlmIChydiA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBvZmZzZXRfICs9IHJ2OwotICAgIH0KLQotICAgIGVycm5vID0gMDsKLQotICAgIERDSEVDSyhzaW5rLnBvcygpIC0gc2luay5idWYoKSA9PSBjb3VudCk7Ci0gICAgcmV0dXJuIGNvdW50OwotfQotCi0vLyBEaXNjYXJkIHRoZSBmaXJzdCBOIGJ5dGVzIG9mIGEgc2luayByZXF1ZXN0LCBvciBhbnkgZXhjZXNzIGJ5dGVzLgotY2xhc3MgUGFydGlhbFNpbmsgOiBwdWJsaWMgTWVtb3J5Qnl0ZVNpbmsgewotICBwdWJsaWM6Ci0gICAgUGFydGlhbFNpbmsodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IGlnbm9yZV9zdGFydCkKLSAgICAgICAgOiBNZW1vcnlCeXRlU2luayhidWZmZXIsIHNpemUpLCBpZ25vcmVfc3RhcnRfKGlnbm9yZV9zdGFydCkge30KLQotICAgIHZvaWQqIEdldEJ1ZmZlcihzaXplX3QgcmVxdWVzdGVkLCBzaXplX3QqIGFjdHVhbCkgb3ZlcnJpZGUgewotICAgICAgICAvLyBUaHJvdyBhd2F5IHRoZSBmaXJzdCBOIGJ5dGVzIGlmIG5lZWRlZC4KLSAgICAgICAgaWYgKGlnbm9yZV9zdGFydF8pIHsKLSAgICAgICAgICAgICphY3R1YWwgPSBzdGQ6Om1pbih7cmVxdWVzdGVkLCBpZ25vcmVfc3RhcnRfLCBzaXplb2YoZGlzY2FyZF8pfSk7Ci0gICAgICAgICAgICBpZ25vcmVfc3RhcnRfIC09ICphY3R1YWw7Ci0gICAgICAgICAgICByZXR1cm4gZGlzY2FyZF87Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVGhyb3cgYXdheSBhbnkgZXhjZXNzIGJ5dGVzIGlmIG5lZWRlZC4KLSAgICAgICAgaWYgKHJlbWFpbmluZygpID09IDApIHsKLSAgICAgICAgICAgICphY3R1YWwgPSBzdGQ6Om1pbihyZXF1ZXN0ZWQsIHNpemVvZihkaXNjYXJkXykpOwotICAgICAgICAgICAgcmV0dXJuIGRpc2NhcmRfOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNZW1vcnlCeXRlU2luazo6R2V0QnVmZmVyKHJlcXVlc3RlZCwgYWN0dWFsKTsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBzaXplX3QgaWdub3JlX3N0YXJ0XzsKLSAgICBjaGFyIGRpc2NhcmRfW0JMT0NLX1NaXTsKLX07Ci0KLXNzaXplX3QgQ29tcHJlc3NlZFNuYXBzaG90UmVhZGVyOjpSZWFkQmxvY2sodWludDY0X3QgY2h1bmssIElCeXRlU2luayogc2luaywgc2l6ZV90IHN0YXJ0X29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4mIG1heF9ieXRlcykgewotICAgIHNpemVfdCBieXRlc190b19yZWFkID0gYmxvY2tfc2l6ZV87Ci0gICAgaWYgKG1heF9ieXRlcykgewotICAgICAgICBieXRlc190b19yZWFkID0gKm1heF9ieXRlczsKLSAgICB9Ci0KLSAgICAvLyBUaGUgb2Zmc2V0IGlzIHJlbGF0aXZlIHRvIHRoZSBjaHVuazsgd2Ugc2hvdWxkIGJlIHJlYWRpbmcgbm8gbW9yZSB0aGFuCi0gICAgLy8gb25lIGNodW5rLgotICAgIENIRUNLKHN0YXJ0X29mZnNldCArIGJ5dGVzX3RvX3JlYWQgPD0gYmxvY2tfc2l6ZV8pOwotCi0gICAgY29uc3QgQ293T3BlcmF0aW9uKiBvcCA9IG51bGxwdHI7Ci0gICAgaWYgKGNodW5rIDwgb3BzXy5zaXplKCkpIHsKLSAgICAgICAgb3AgPSBvcHNfW2NodW5rXTsKLSAgICB9Ci0KLSAgICBzaXplX3QgYWN0dWFsOwotICAgIHZvaWQqIGJ1ZmZlciA9IHNpbmstPkdldEJ1ZmZlcihieXRlc190b19yZWFkLCAmYWN0dWFsKTsKLSAgICBpZiAoIWJ1ZmZlciB8fCBhY3R1YWwgPCBieXRlc190b19yZWFkKSB7Ci0gICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiB1bmxlc3Mgd2UgY2FsY3VsYXRlZCB0aGUgcmVhZCBzaXplIHdyb25nCi0gICAgICAgIC8vIHNvbWV3aGVyZS4gTWVtb3J5Qnl0ZVNpbmsgYWx3YXlzIGZ1bGZpbGxzIHRoZSBlbnRpcmUgcmVxdWVzdGVkCi0gICAgICAgIC8vIHJlZ2lvbiB1bmxlc3MgdGhlcmUncyBub3QgZW5vdWdoIGJ1ZmZlciByZW1haW5pbmcuCi0gICAgICAgIExPRyhFUlJPUikgPDwgIkFza2VkIGZvciBidWZmZXIgb2Ygc2l6ZSAiIDw8IGJ5dGVzX3RvX3JlYWQgPDwgIiwgZ290ICIgPDwgYWN0dWFsOwotICAgICAgICBlcnJubyA9IEVJTlZBTDsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGlmICghb3AgfHwgb3AtPnR5cGUgPT0ga0Nvd0NvcHlPcCkgewotICAgICAgICBib3Jyb3dlZF9mZCBmZCA9IEdldFNvdXJjZUZkKCk7Ci0gICAgICAgIGlmIChmZCA8IDApIHsKLSAgICAgICAgICAgIC8vIEdldFNvdXJjZUZkIHNldHMgZXJybm8uCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob3ApIHsKLSAgICAgICAgICAgIGNodW5rID0gb3AtPnNvdXJjZTsKLSAgICAgICAgfQotCi0gICAgICAgIG9mZjY0X3Qgb2Zmc2V0ID0gKGNodW5rICogYmxvY2tfc2l6ZV8pICsgc3RhcnRfb2Zmc2V0OwotICAgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseUF0T2Zmc2V0KGZkLCBidWZmZXIsIGJ5dGVzX3RvX3JlYWQsIG9mZnNldCkpIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJyZWFkICIgPDwgKnNvdXJjZV9kZXZpY2VfOwotICAgICAgICAgICAgLy8gUmVhZEZ1bGx5QXRPZmZzZXQgc2V0cyBlcnJuby4KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAob3AtPnR5cGUgPT0ga0Nvd1plcm9PcCkgewotICAgICAgICBtZW1zZXQoYnVmZmVyLCAwLCBieXRlc190b19yZWFkKTsKLSAgICB9IGVsc2UgaWYgKG9wLT50eXBlID09IGtDb3dSZXBsYWNlT3ApIHsKLSAgICAgICAgUGFydGlhbFNpbmsgcGFydGlhbF9zaW5rKGJ1ZmZlciwgYnl0ZXNfdG9fcmVhZCwgc3RhcnRfb2Zmc2V0KTsKLSAgICAgICAgaWYgKCFjb3dfLT5SZWFkRGF0YSgqb3AsICZwYXJ0aWFsX3NpbmspKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDb21wcmVzc2VkU25hcHNob3RSZWFkZXIgZmFpbGVkIHRvIHJlYWQgcmVwbGFjZSBvcCI7Ci0gICAgICAgICAgICBlcnJubyA9IEVJTzsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAob3AtPnR5cGUgPT0ga0Nvd1hvck9wKSB7Ci0gICAgICAgIGJvcnJvd2VkX2ZkIGZkID0gR2V0U291cmNlRmQoKTsKLSAgICAgICAgaWYgKGZkIDwgMCkgewotICAgICAgICAgICAgLy8gR2V0U291cmNlRmQgc2V0cyBlcnJuby4KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIG9mZjY0X3Qgb2Zmc2V0ID0gb3AtPnNvdXJjZSArIHN0YXJ0X29mZnNldDsKLSAgICAgICAgY2hhciBkYXRhW0JMT0NLX1NaXTsKLSAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHlBdE9mZnNldChmZCwgJmRhdGEsIGJ5dGVzX3RvX3JlYWQsIG9mZnNldCkpIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJyZWFkICIgPDwgKnNvdXJjZV9kZXZpY2VfOwotICAgICAgICAgICAgLy8gUmVhZEZ1bGx5QXRPZmZzZXQgc2V0cyBlcnJuby4KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBQYXJ0aWFsU2luayBwYXJ0aWFsX3NpbmsoYnVmZmVyLCBieXRlc190b19yZWFkLCBzdGFydF9vZmZzZXQpOwotICAgICAgICBpZiAoIWNvd18tPlJlYWREYXRhKCpvcCwgJnBhcnRpYWxfc2luaykpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNvbXByZXNzZWRTbmFwc2hvdFJlYWRlciBmYWlsZWQgdG8gcmVhZCB4b3Igb3AiOwotICAgICAgICAgICAgZXJybm8gPSBFSU87Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBieXRlc190b19yZWFkOyBpKyspIHsKLSAgICAgICAgICAgICgoY2hhciopYnVmZmVyKVtpXSBePSBkYXRhW2ldOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ29tcHJlc3NlZFNuYXBzaG90UmVhZGVyIHVua25vd24gb3AgdHlwZTogIiA8PCB1aW50MzJfdChvcC0+dHlwZSk7Ci0gICAgICAgIGVycm5vID0gRUlOVkFMOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLy8gTWVtb3J5Qnl0ZVNpbmsgZG9lc24ndCBkbyBhbnl0aGluZyBpbiBSZXR1cm5CdWZmZXIsIHNvIGRvbid0IGJvdGhlciBjYWxsaW5nIGl0LgotICAgIHJldHVybiBieXRlc190b19yZWFkOwotfQotCi1vZmY2NF90IENvbXByZXNzZWRTbmFwc2hvdFJlYWRlcjo6U2VlayhvZmY2NF90IG9mZnNldCwgaW50IHdoZW5jZSkgewotICAgIHN3aXRjaCAod2hlbmNlKSB7Ci0gICAgICAgIGNhc2UgU0VFS19TRVQ6Ci0gICAgICAgICAgICBvZmZzZXRfID0gb2Zmc2V0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU0VFS19FTkQ6Ci0gICAgICAgICAgICBvZmZzZXRfID0gc3RhdGljX2Nhc3Q8b2ZmNjRfdD4oYmxvY2tfZGV2aWNlX3NpemVfKSArIG9mZnNldDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNFRUtfQ1VSOgotICAgICAgICAgICAgb2Zmc2V0XyArPSBvZmZzZXQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlVucmVjb2duaXplZCBzZWVrIHdoZW5jZTogIiA8PCB3aGVuY2U7Ci0gICAgICAgICAgICBlcnJubyA9IEVJTlZBTDsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgcmV0dXJuIG9mZnNldF87Ci19Ci0KLXVpbnQ2NF90IENvbXByZXNzZWRTbmFwc2hvdFJlYWRlcjo6QmxvY2tEZXZTaXplKCkgewotICAgIHJldHVybiBibG9ja19kZXZpY2Vfc2l6ZV87Ci19Ci0KLWJvb2wgQ29tcHJlc3NlZFNuYXBzaG90UmVhZGVyOjpDbG9zZSgpIHsKLSAgICBjb3dfID0gbnVsbHB0cjsKLSAgICBzb3VyY2VfZmRfID0ge307Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ29tcHJlc3NlZFNuYXBzaG90UmVhZGVyOjpJc1NldHRpbmdFcnJubygpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDb21wcmVzc2VkU25hcHNob3RSZWFkZXI6OklzT3BlbigpIHsKLSAgICByZXR1cm4gY293XyAhPSBudWxscHRyOwotfQotCi1ib29sIENvbXByZXNzZWRTbmFwc2hvdFJlYWRlcjo6Rmx1c2goKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwc2hvdF9zdGF0cy5jcHAgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHNob3Rfc3RhdHMuY3BwCmluZGV4IDliNmViMmMuLjhlOWQ5YzUgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwc2hvdF9zdGF0cy5jcHAKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXBzaG90X3N0YXRzLmNwcApAQCAtMjUsNyArMjUsNyBAQAogCiBTbmFwc2hvdE1lcmdlU3RhdHMqIFNuYXBzaG90TWVyZ2VTdGF0czo6R2V0SW5zdGFuY2UoU25hcHNob3RNYW5hZ2VyJiBwYXJlbnQpIHsKICAgICBzdGF0aWMgU25hcHNob3RNZXJnZVN0YXRzIGdfaW5zdGFuY2UocGFyZW50LkdldE1lcmdlU3RhdGVGaWxlUGF0aCgpKTsKLSAgICBDSEVDSyhnX2luc3RhbmNlLnBhdGhfID09IHBhcmVudC5HZXRNZXJnZVN0YXRlRmlsZVBhdGgoKSk7CisgICAgQ0hFQ0tfRVEoZ19pbnN0YW5jZS5wYXRoXywgcGFyZW50LkdldE1lcmdlU3RhdGVGaWxlUGF0aCgpKTsKICAgICByZXR1cm4gJmdfaW5zdGFuY2U7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwc2hvdF9zdHViLmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwc2hvdF9zdHViLmNwcAppbmRleCA4NGUyMjI2Li45MzU0MTAyIDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHNob3Rfc3R1Yi5jcHAKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXBzaG90X3N0dWIuY3BwCkBAIC0xNTQsOCArMTU0LDggQEAKICAgICByZXR1cm4gJnNuYXBzaG90X21lcmdlX3N0YXRzOwogfQogCi1zdGQ6OnVuaXF1ZV9wdHI8SVNuYXBzaG90V3JpdGVyPiBTbmFwc2hvdE1hbmFnZXJTdHViOjpPcGVuU25hcHNob3RXcml0ZXIoCi0gICAgICAgIGNvbnN0IENyZWF0ZUxvZ2ljYWxQYXJ0aXRpb25QYXJhbXMmLCBjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiYpIHsKK3N0ZDo6dW5pcXVlX3B0cjxJQ293V3JpdGVyPiBTbmFwc2hvdE1hbmFnZXJTdHViOjpPcGVuU25hcHNob3RXcml0ZXIoCisgICAgICAgIGNvbnN0IENyZWF0ZUxvZ2ljYWxQYXJ0aXRpb25QYXJhbXMmLCBzdGQ6Om9wdGlvbmFsPHVpbnQ2NF90PikgewogICAgIExPRyhFUlJPUikgPDwgX19GVU5DVElPTl9fIDw8ICIgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZC4iOwogICAgIHJldHVybiBudWxscHRyOwogfQpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXBzaG90X3Rlc3QuY3BwIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXBzaG90X3Rlc3QuY3BwCmluZGV4IGNlNzVhNTQuLjFhMGQ1NTkgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwc2hvdF90ZXN0LmNwcAorKysgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHNob3RfdGVzdC5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxzaWduYWwuaD4KICNpbmNsdWRlIDxzeXMvZmlsZS5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXR2ZnMuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAogI2luY2x1ZGUgPGNocm9ubz4KQEAgLTQ2LDYgKzQ3LDcgQEAKICNpbmNsdWRlIDxhbmRyb2lkL3NuYXBzaG90L3NuYXBzaG90LnBiLmg+CiAjaW5jbHVkZSA8bGlic25hcHNob3QvdGVzdF9oZWxwZXJzLmg+CiAjaW5jbHVkZSAicGFydGl0aW9uX2Nvd19jcmVhdG9yLmgiCisjaW5jbHVkZSAic2NyYXRjaF9zdXBlci5oIgogI2luY2x1ZGUgInV0aWxpdHkuaCIKIAogLy8gTW9jayBjbGFzc2VzIGFyZSBub3QgdXNlZC4gSGVhZGVyIGluY2x1ZGVkIHRvIGVuc3VyZSBtb2NrZWQgY2xhc3MgZGVmaW5pdGlvbiBhbGlnbnMgd2l0aCB0aGUKQEAgLTU1LDE0ICs1NywxMiBAQAogCiAjaWYgZGVmaW5lZChMSUJTTkFQU0hPVF9URVNUX1ZBQl9MRUdBQ1kpCiAjZGVmaW5lIERFRkFVTFRfTU9ERSAidmFiLWxlZ2FjeSIKLSNlbGlmIGRlZmluZWQoTElCU05BUFNIT1RfVEVTVF9WQUJDX0xFR0FDWSkKLSNkZWZpbmUgREVGQVVMVF9NT0RFICJ2YWJjLWxlZ2FjeSIKICNlbHNlCiAjZGVmaW5lIERFRkFVTFRfTU9ERSAiIgogI2VuZGlmCiAKIERFRklORV9zdHJpbmcoZm9yY2VfbW9kZSwgREVGQVVMVF9NT0RFLAotICAgICAgICAgICAgICAiRm9yY2UgdGVzdGluZyBvbGRlciBtb2RlcyAodmFiLWxlZ2FjeSwgdmFiYy1sZWdhY3kpIGlnbm9yaW5nIGRldmljZSBjb25maWcuIik7CisgICAgICAgICAgICAgICJGb3JjZSB0ZXN0aW5nIG9sZGVyIG1vZGVzICh2YWItbGVnYWN5KSBpZ25vcmluZyBkZXZpY2UgY29uZmlnLiIpOwogREVGSU5FX3N0cmluZyhmb3JjZV9pb3VyaW5nX2Rpc2FibGUsICIiLAogICAgICAgICAgICAgICAiRm9yY2UgdGVzdGluZyBtb2RlIChpb3VyaW5nX2Rpc2FibGVkKSAtIGRpc2FibGUgaW9fdXJpbmciKTsKIERFRklORV9zdHJpbmcoY29tcHJlc3Npb25fbWV0aG9kLCAiZ3oiLCAiRGVmYXVsdCBjb21wcmVzc2lvbiBhbGdvcml0aG0uIik7CkBAIC0xMDMsNiArMTAzLDcgQEAKIAogdm9pZCBNb3VudE1ldGFkYXRhKCk7CiAKKy8vIEBWc3JUZXN0ID0gMy43LjYKIGNsYXNzIFNuYXBzaG90VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewogICBwdWJsaWM6CiAgICAgU25hcHNob3RUZXN0KCkgOiBkbV8oRGV2aWNlTWFwcGVyOjpJbnN0YW5jZSgpKSB7fQpAQCAtMTIyLDYgKzEyMyw3IEBACiAgICAgICAgIExPRyhJTkZPKSA8PCAiU3RhcnRpbmcgdGVzdDogIiA8PCB0ZXN0X25hbWVfOwogCiAgICAgICAgIFNLSVBfSUZfTk9OX1ZJUlRVQUxfQUIoKTsKKyAgICAgICAgU0tJUF9JRl9WRU5ET1JfT05fQU5EUk9JRF9TKCk7CiAKICAgICAgICAgU2V0dXBQcm9wZXJ0aWVzKCk7CiAgICAgICAgIGlmICghRGV2aWNlU3VwcG9ydHNNb2RlKCkpIHsKQEAgLTEzOCwxNyArMTQwLDEwIEBACiAgICAgdm9pZCBTZXR1cFByb3BlcnRpZXMoKSB7CiAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHByb3BlcnRpZXM7CiAKLSAgICAgICAgQVNTRVJUX1RSVUUoYW5kcm9pZDo6YmFzZTo6U2V0UHJvcGVydHkoInNuYXB1c2VyZC50ZXN0LmRtLnNuYXBzaG90cyIsICIwIikpCi0gICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBkaXNhYmxlIHByb3BlcnR5OiB2aXJ0dWFsX2FiLnVzZXJzcGFjZS5zbmFwc2hvdHMuZW5hYmxlZCI7CiAgICAgICAgIEFTU0VSVF9UUlVFKGFuZHJvaWQ6OmJhc2U6OlNldFByb3BlcnR5KCJzbmFwdXNlcmQudGVzdC5pb191cmluZy5mb3JjZV9kaXNhYmxlIiwgIjAiKSkKICAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIHNldCBwcm9wZXJ0eTogc25hcHVzZXJkLnRlc3QuaW9fdXJpbmcuZGlzYWJsZWQiOwogCi0gICAgICAgIGlmIChGTEFHU19mb3JjZV9tb2RlID09ICJ2YWJjLWxlZ2FjeSIpIHsKLSAgICAgICAgICAgIEFTU0VSVF9UUlVFKGFuZHJvaWQ6OmJhc2U6OlNldFByb3BlcnR5KCJzbmFwdXNlcmQudGVzdC5kbS5zbmFwc2hvdHMiLCAiMSIpKQotICAgICAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGRpc2FibGUgcHJvcGVydHk6IHZpcnR1YWxfYWIudXNlcnNwYWNlLnNuYXBzaG90cy5lbmFibGVkIjsKLSAgICAgICAgICAgIHByb3BlcnRpZXNbInJvLnZpcnR1YWxfYWIuY29tcHJlc3Npb24uZW5hYmxlZCJdID0gInRydWUiOwotICAgICAgICAgICAgcHJvcGVydGllc1sicm8udmlydHVhbF9hYi51c2Vyc3BhY2Uuc25hcHNob3RzLmVuYWJsZWQiXSA9ICJmYWxzZSI7Ci0gICAgICAgIH0gZWxzZSBpZiAoRkxBR1NfZm9yY2VfbW9kZSA9PSAidmFiLWxlZ2FjeSIpIHsKKyAgICAgICAgaWYgKEZMQUdTX2ZvcmNlX21vZGUgPT0gInZhYi1sZWdhY3kiKSB7CiAgICAgICAgICAgICBwcm9wZXJ0aWVzWyJyby52aXJ0dWFsX2FiLmNvbXByZXNzaW9uLmVuYWJsZWQiXSA9ICJmYWxzZSI7CiAgICAgICAgICAgICBwcm9wZXJ0aWVzWyJyby52aXJ0dWFsX2FiLnVzZXJzcGFjZS5zbmFwc2hvdHMuZW5hYmxlZCJdID0gImZhbHNlIjsKICAgICAgICAgfQpAQCAtMTc1LDYgKzE3MCw3IEBACiAKICAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewogICAgICAgICBSRVRVUk5fSUZfTk9OX1ZJUlRVQUxfQUIoKTsKKyAgICAgICAgUkVUVVJOX0lGX1ZFTkRPUl9PTl9BTkRST0lEX1MoKTsKIAogICAgICAgICBMT0coSU5GTykgPDwgIlRlYXJpbmcgZG93biBTbmFwc2hvdFRlc3QgdGVzdDogIiA8PCB0ZXN0X25hbWVfOwogCkBAIC0xOTYsNiArMTkyLDE3IEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAorICAgIGJvb2wgU2hvdWxkU2tpcExlZ2FjeU1lcmdpbmcoKSB7CisgICAgICAgIGlmICghR2V0TGVnYWN5Q29tcHJlc3Npb25FbmFibGVkUHJvcGVydHkoKSB8fCAhc25hcHVzZXJkX3JlcXVpcmVkXykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGludCBhcGlfbGV2ZWwgPSBhbmRyb2lkOjpiYXNlOjpHZXRJbnRQcm9wZXJ0eSgicm8uYm9hcmQuYXBpX2xldmVsIiwgLTEpOworICAgICAgICBpZiAoYXBpX2xldmVsID09IC0xKSB7CisgICAgICAgICAgICBhcGlfbGV2ZWwgPSBhbmRyb2lkOjpiYXNlOjpHZXRJbnRQcm9wZXJ0eSgicm8ucHJvZHVjdC5maXJzdF9hcGlfbGV2ZWwiLCAtMSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFwaV9sZXZlbCAhPSBfX0FORFJPSURfQVBJX1NfXzsKKyAgICB9CisKICAgICB2b2lkIEluaXRpYWxpemVTdGF0ZSgpIHsKICAgICAgICAgQVNTRVJUX1RSVUUoc20tPkVuc3VyZUltYWdlTWFuYWdlcigpKTsKICAgICAgICAgaW1hZ2VfbWFuYWdlcl8gPSBzbS0+aW1hZ2VfbWFuYWdlcigpOwpAQCAtMzMzLDcgKzM0MCw3IEBACiAgICAgfQogCiAgICAgQXNzZXJ0aW9uUmVzdWx0IE1hcFVwZGF0ZVNuYXBzaG90KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVNuYXBzaG90V3JpdGVyPiogd3JpdGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJQ293V3JpdGVyPiogd3JpdGVyKSB7CiAgICAgICAgIFRlc3RQYXJ0aXRpb25PcGVuZXIgb3BlbmVyKGZha2Vfc3VwZXIpOwogICAgICAgICBDcmVhdGVMb2dpY2FsUGFydGl0aW9uUGFyYW1zIHBhcmFtc3sKICAgICAgICAgICAgICAgICAuYmxvY2tfZGV2aWNlID0gZmFrZV9zdXBlciwKQEAgLTM0MywxNCArMzUwLDEwIEBACiAgICAgICAgICAgICAgICAgLnBhcnRpdGlvbl9vcGVuZXIgPSAmb3BlbmVyLAogICAgICAgICB9OwogCi0gICAgICAgIGF1dG8gb2xkX3BhcnRpdGlvbiA9ICIvZGV2L2Jsb2NrL21hcHBlci8iICsgR2V0T3RoZXJQYXJ0aXRpb25OYW1lKG5hbWUpOwotICAgICAgICBhdXRvIHJlc3VsdCA9IHNtLT5PcGVuU25hcHNob3RXcml0ZXIocGFyYW1zLCB7b2xkX3BhcnRpdGlvbn0pOworICAgICAgICBhdXRvIHJlc3VsdCA9IHNtLT5PcGVuU25hcHNob3RXcml0ZXIocGFyYW1zLCB7fSk7CiAgICAgICAgIGlmICghcmVzdWx0KSB7CiAgICAgICAgICAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8ICJDYW5ub3Qgb3BlbiBzbmFwc2hvdCBmb3Igd3JpdGluZzogIiA8PCBuYW1lOwogICAgICAgICB9Ci0gICAgICAgIGlmICghcmVzdWx0LT5Jbml0aWFsaXplKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgIkNhbm5vdCBpbml0aWFsaXplIHNuYXBzaG90IGZvciB3cml0aW5nOiAiIDw8IG5hbWU7Ci0gICAgICAgIH0KIAogICAgICAgICBpZiAod3JpdGVyKSB7CiAgICAgICAgICAgICAqd3JpdGVyID0gc3RkOjptb3ZlKHJlc3VsdCk7CkBAIC00MjgsNyArNDMxLDcgQEAKIAogICAgIC8vIFByZXBhcmUgQS9CIHNsb3QgZm9yIGEgcGFydGl0aW9uIG5hbWVkICJ0ZXN0X3BhcnRpdGlvbiIuCiAgICAgQXNzZXJ0aW9uUmVzdWx0IFByZXBhcmVPbmVTbmFwc2hvdCh1aW50NjRfdCBkZXZpY2Vfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJU25hcHNob3RXcml0ZXI+KiB3cml0ZXIgPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SUNvd1dyaXRlcj4qIHdyaXRlciA9IG51bGxwdHIpIHsKICAgICAgICAgbG9ja18gPSBudWxscHRyOwogCiAgICAgICAgIERlbHRhQXJjaGl2ZU1hbmlmZXN0IG1hbmlmZXN0OwpAQCAtNjMxLDIxICs2MzQsMzggQEAKIFRFU1RfRihTbmFwc2hvdFRlc3QsIE1lcmdlKSB7CiAgICAgQVNTRVJUX1RSVUUoQWNxdWlyZUxvY2soKSk7CiAKLSAgICBzdGF0aWMgY29uc3QgdWludDY0X3Qga0RldmljZVNpemUgPSAxMDI0ICogMTAyNDsKLQotICAgIHN0ZDo6dW5pcXVlX3B0cjxJU25hcHNob3RXcml0ZXI+IHdyaXRlcjsKLSAgICBBU1NFUlRfVFJVRShQcmVwYXJlT25lU25hcHNob3Qoa0RldmljZVNpemUsICZ3cml0ZXIpKTsKLQotICAgIGJvb2wgdXNlcnNwYWNlX3NuYXBzaG90cyA9IHNtLT5VcGRhdGVVc2VzVXNlclNuYXBzaG90cyhsb2NrXy5nZXQoKSk7Ci0KLSAgICAvLyBSZWxlYXNlIHRoZSBsb2NrLgotICAgIGxvY2tfID0gbnVsbHB0cjsKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtEZXZpY2VTaXplID0gMTAyNCAqIDEwMjQ7CisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrQmxvY2tTaXplID0gNDA5NjsKIAogICAgIHN0ZDo6c3RyaW5nIHRlc3Rfc3RyaW5nID0gIlRoaXMgaXMgYSB0ZXN0IHN0cmluZy4iOwotICAgIHRlc3Rfc3RyaW5nLnJlc2l6ZSh3cml0ZXItPm9wdGlvbnMoKS5ibG9ja19zaXplKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFJhd0Jsb2NrcygwLCB0ZXN0X3N0cmluZy5kYXRhKCksIHRlc3Rfc3RyaW5nLnNpemUoKSkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7Ci0gICAgd3JpdGVyID0gbnVsbHB0cjsKKyAgICB0ZXN0X3N0cmluZy5yZXNpemUoa0Jsb2NrU2l6ZSk7CisKKyAgICBib29sIHVzZXJzcGFjZV9zbmFwc2hvdHMgPSBmYWxzZTsKKyAgICBpZiAoc25hcHVzZXJkX3JlcXVpcmVkXykgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SUNvd1dyaXRlcj4gd3JpdGVyOworICAgICAgICBBU1NFUlRfVFJVRShQcmVwYXJlT25lU25hcHNob3Qoa0RldmljZVNpemUsICZ3cml0ZXIpKTsKKworICAgICAgICB1c2Vyc3BhY2Vfc25hcHNob3RzID0gc20tPlVwZGF0ZVVzZXNVc2VyU25hcHNob3RzKGxvY2tfLmdldCgpKTsKKworICAgICAgICAvLyBSZWxlYXNlIHRoZSBsb2NrLgorICAgICAgICBsb2NrXyA9IG51bGxwdHI7CisKKyAgICAgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRSYXdCbG9ja3MoMCwgdGVzdF9zdHJpbmcuZGF0YSgpLCB0ZXN0X3N0cmluZy5zaXplKCkpKTsKKyAgICAgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKKyAgICAgICAgd3JpdGVyID0gbnVsbHB0cjsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfVFJVRShQcmVwYXJlT25lU25hcHNob3Qoa0RldmljZVNpemUpKTsKKworICAgICAgICAvLyBSZWxlYXNlIHRoZSBsb2NrLgorICAgICAgICBsb2NrXyA9IG51bGxwdHI7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgcGF0aDsKKyAgICAgICAgQVNTRVJUX1RSVUUoZG1fLkdldERtRGV2aWNlUGF0aEJ5TmFtZSgidGVzdF9wYXJ0aXRpb25fYiIsICZwYXRoKSk7CisKKyAgICAgICAgdW5pcXVlX2ZkIGZkKG9wZW4ocGF0aC5jX3N0cigpLCBPX1dST05MWSkpOworICAgICAgICBBU1NFUlRfR0UoZmQsIDApOworICAgICAgICBBU1NFUlRfVFJVRShhbmRyb2lkOjpiYXNlOjpXcml0ZUZ1bGx5KGZkLCB0ZXN0X3N0cmluZy5kYXRhKCksIHRlc3Rfc3RyaW5nLnNpemUoKSkpOworICAgIH0KIAogICAgIC8vIERvbmUgdXBkYXRpbmcuCiAgICAgQVNTRVJUX1RSVUUoc20tPkZpbmlzaGVkU25hcHNob3RXcml0ZXMoZmFsc2UpKTsKQEAgLTY1NCw4ICs2NzQsMjMgQEAKIAogICAgIHRlc3RfZGV2aWNlLT5zZXRfc2xvdF9zdWZmaXgoIl9iIik7CiAgICAgQVNTRVJUX1RSVUUoc20tPkNyZWF0ZUxvZ2ljYWxBbmRTbmFwc2hvdFBhcnRpdGlvbnMoInN1cGVyIiwgc25hcHNob3RfdGltZW91dF8pKTsKKyAgICBpZiAoU2hvdWxkU2tpcExlZ2FjeU1lcmdpbmcoKSkgeworICAgICAgICBMT0coSU5GTykgPDwgIlNraXBwaW5nIGxlZ2FjeSBtZXJnZSBpbiB0ZXN0IjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBBU1NFUlRfVFJVRShzbS0+SW5pdGlhdGVNZXJnZSgpKTsKIAorICAgIC8vIENyZWF0ZSBzdGFsZSBmaWxlcyBpbiBzbmFwc2hvdCBkaXJlY3RvcnkuIE1lcmdlIHNob3VsZCBza2lwIHRoZXNlIGZpbGVzCisgICAgLy8gYXMgdGhlIHN1ZmZpeCBkb2Vzbid0IG1hdGNoIHRoZSBjdXJyZW50IHNsb3QuCisgICAgYXV0byB0bXBfcGF0aCA9IHRlc3RfZGV2aWNlLT5HZXRNZXRhZGF0YURpcigpICsgIi9zbmFwc2hvdHMvdGVzdF9wYXJ0aXRpb25fYi50bXAiOworICAgIGF1dG8gb3RoZXJfc2xvdCA9IHRlc3RfZGV2aWNlLT5HZXRNZXRhZGF0YURpcigpICsgIi9zbmFwc2hvdHMvdGVzdF9wYXJ0aXRpb25fYSI7CisKKyAgICB1bmlxdWVfZmQgZmQob3Blbih0bXBfcGF0aC5jX3N0cigpLCBPX1JEV1IgfCBPX0NMT0VYRUMgfCBPX0NSRUFULCAwNjQ0KSk7CisgICAgQVNTRVJUX0dFKGZkLCAwKTsKKworICAgIGZkLnJlc2V0KG9wZW4ob3RoZXJfc2xvdC5jX3N0cigpLCBPX1JEV1IgfCBPX0NMT0VYRUMgfCBPX0NSRUFULCAwNjQ0KSk7CisgICAgQVNTRVJUX0dFKGZkLCAwKTsKKwogICAgIC8vIFRoZSBkZXZpY2Ugc2hvdWxkIGhhdmUgYmVlbiBzd2l0Y2hlZCB0byBhIHNuYXBzaG90LW1lcmdlIHRhcmdldC4KICAgICBEZXZpY2VNYXBwZXI6OlRhcmdldEluZm8gdGFyZ2V0OwogICAgIEFTU0VSVF9UUlVFKHNtLT5Jc1NuYXBzaG90RGV2aWNlKCJ0ZXN0X3BhcnRpdGlvbl9iIiwgJnRhcmdldCkpOwpAQCAtNjcxLDEzICs3MDYsMjMgQEAKICAgICBBU1NFUlRfRVEoc20tPlByb2Nlc3NVcGRhdGVTdGF0ZSgpLCBVcGRhdGVTdGF0ZTo6TWVyZ2VDb21wbGV0ZWQpOwogICAgIEFTU0VSVF9FUShzbS0+R2V0VXBkYXRlU3RhdGUoKSwgVXBkYXRlU3RhdGU6Ok5vbmUpOwogCisgICAgLy8gTWFrZSBzdXJlIHRoYXQgc25hcHNob3Qgc3RhdGVzIGFyZSBjbGVhcmVkIGFuZCBhbGwgc3RhbGUgZmlsZXMKKyAgICAvLyBhcmUgZGVsZXRlZAorICAgIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoQWNxdWlyZUxvY2soKSk7CisgICAgICAgIGF1dG8gbG9jYWxfbG9jayA9IHN0ZDo6bW92ZShsb2NrXyk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzbmFwc2hvdHM7CisgICAgICAgIEFTU0VSVF9UUlVFKHNtLT5MaXN0U25hcHNob3RzKGxvY2FsX2xvY2suZ2V0KCksICZzbmFwc2hvdHMpKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoc25hcHNob3RzLmVtcHR5KCkpOworICAgIH0KKwogICAgIC8vIFRoZSBkZXZpY2Ugc2hvdWxkIG5vIGxvbmdlciBiZSBhIHNuYXBzaG90IG9yIHNuYXBzaG90LW1lcmdlLgogICAgIEFTU0VSVF9GQUxTRShzbS0+SXNTbmFwc2hvdERldmljZSgidGVzdF9wYXJ0aXRpb25fYiIpKTsKIAogICAgIC8vIFRlc3QgdGhhdCB3ZSBjYW4gcmVhZCBiYWNrIHRoZSBzdHJpbmcgd2Ugd3JvdGUgdG8gdGhlIHNuYXBzaG90LiBOb3RlCiAgICAgLy8gdGhhdCB0aGUgYmFzZSBkZXZpY2UgaXMgZ29uZSBub3cuIHxzbmFwX2RldmljZXwgY29udGFpbnMgdGhlIGNvcnJlY3QKICAgICAvLyBwYXJ0aXRpb24uCi0gICAgdW5pcXVlX2ZkIGZkKG9wZW4oIi9kZXYvYmxvY2svbWFwcGVyL3Rlc3RfcGFydGl0aW9uX2IiLCBPX1JET05MWSB8IE9fQ0xPRVhFQykpOworICAgIGZkLnJlc2V0KG9wZW4oIi9kZXYvYmxvY2svbWFwcGVyL3Rlc3RfcGFydGl0aW9uX2IiLCBPX1JET05MWSB8IE9fQ0xPRVhFQykpOwogICAgIEFTU0VSVF9HRShmZCwgMCk7CiAKICAgICBzdGQ6OnN0cmluZyBidWZmZXIodGVzdF9zdHJpbmcuc2l6ZSgpLCAnXDAnKTsKQEAgLTc2MSw2ICs4MDYsMTAgQEAKICAgICBBU1NFUlRfTkUoaW5pdCwgbnVsbHB0cik7CiAgICAgQVNTRVJUX1RSVUUoaW5pdC0+TmVlZFNuYXBzaG90c0luRmlyc3RTdGFnZU1vdW50KCkpOwogICAgIEFTU0VSVF9UUlVFKGluaXQtPkNyZWF0ZUxvZ2ljYWxBbmRTbmFwc2hvdFBhcnRpdGlvbnMoInN1cGVyIiwgc25hcHNob3RfdGltZW91dF8pKTsKKyAgICBpZiAoU2hvdWxkU2tpcExlZ2FjeU1lcmdpbmcoKSkgeworICAgICAgICBMT0coSU5GTykgPDwgIlNraXBwaW5nIGxlZ2FjeSBtZXJnZSBpbiB0ZXN0IjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBBU1NFUlRfVFJVRShpbml0LT5Jbml0aWF0ZU1lcmdlKCkpOwogCiAgICAgLy8gTm93LCByZWZsYXNoIHN1cGVyLiBOb3RlIHRoYXQgd2UgaGF2ZW4ndCBjYWxsZWQgUHJvY2Vzc1VwZGF0ZVN0YXRlLCBzbyB0aGUKQEAgLTk2OSw2ICsxMDE4LDcgQEAKICAgcHVibGljOgogICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CiAgICAgICAgIFNLSVBfSUZfTk9OX1ZJUlRVQUxfQUIoKTsKKyAgICAgICAgU0tJUF9JRl9WRU5ET1JfT05fQU5EUk9JRF9TKCk7CiAKICAgICAgICAgU25hcHNob3RUZXN0OjpTZXRVcCgpOwogICAgICAgICBpZiAoIWltYWdlX21hbmFnZXJfKSB7CkBAIC0xMDUxLDYgKzExMDEsNyBAQAogICAgIH0KICAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewogICAgICAgICBSRVRVUk5fSUZfTk9OX1ZJUlRVQUxfQUIoKTsKKyAgICAgICAgUkVUVVJOX0lGX1ZFTkRPUl9PTl9BTkRST0lEX1MoKTsKIAogICAgICAgICBMT0coSU5GTykgPDwgIlRlYXJpbmcgZG93biBTbmFwc2hvdFVwZGF0ZVRlc3QgdGVzdDogIiA8PCB0ZXN0X25hbWVfOwogCkBAIC0xMTIzLDcgKzExNzQsNyBAQAogCiAgICAgQXNzZXJ0aW9uUmVzdWx0IE1hcE9uZVVwZGF0ZVNuYXBzaG90KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CiAgICAgICAgIGlmIChzbmFwdXNlcmRfcmVxdWlyZWRfKSB7Ci0gICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVNuYXBzaG90V3JpdGVyPiB3cml0ZXI7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SUNvd1dyaXRlcj4gd3JpdGVyOwogICAgICAgICAgICAgcmV0dXJuIE1hcFVwZGF0ZVNuYXBzaG90KG5hbWUsICZ3cml0ZXIpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc3RkOjpzdHJpbmcgcGF0aDsKQEAgLTExNDQsNyArMTE5NSw3IEBACiAgICAgQXNzZXJ0aW9uUmVzdWx0IFdyaXRlU25hcHNob3RBbmRIYXNoKFBhcnRpdGlvblVwZGF0ZSogcGFydGl0aW9uKSB7CiAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBwYXJ0aXRpb24tPnBhcnRpdGlvbl9uYW1lKCkgKyAiX2IiOwogICAgICAgICBpZiAoc25hcHVzZXJkX3JlcXVpcmVkXykgewotICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElTbmFwc2hvdFdyaXRlcj4gd3JpdGVyOworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElDb3dXcml0ZXI+IHdyaXRlcjsKICAgICAgICAgICAgIGF1dG8gcmVzID0gTWFwVXBkYXRlU25hcHNob3QobmFtZSwgJndyaXRlcik7CiAgICAgICAgICAgICBpZiAoIXJlcykgewogICAgICAgICAgICAgICAgIHJldHVybiByZXM7CkBAIC0xMTgzLDEzICsxMjM0LDEzIEBACiAgICAgICAgIFNIQTI1Nl9DVFggY3R4OwogICAgICAgICBTSEEyNTZfSW5pdCgmY3R4KTsKIAotICAgICAgICBpZiAoIXdyaXRlci0+b3B0aW9ucygpLm1heF9ibG9ja3MpIHsKKyAgICAgICAgaWYgKCF3cml0ZXItPkdldE1heEJsb2NrcygpKSB7CiAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDb3dXcml0ZXIgbXVzdCBzcGVjaWZ5IG1heGltdW0gbnVtYmVyIG9mIGJsb2NrcyI7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgY29uc3QgYXV0byBudW1fYmxvY2tzID0gd3JpdGVyLT5vcHRpb25zKCkubWF4X2Jsb2Nrcy52YWx1ZSgpOworICAgICAgICBjb25zdCBhdXRvIG51bV9ibG9ja3MgPSB3cml0ZXItPkdldE1heEJsb2NrcygpLnZhbHVlKCk7CiAKLSAgICAgICAgY29uc3QgYXV0byBibG9ja19zaXplID0gd3JpdGVyLT5vcHRpb25zKCkuYmxvY2tfc2l6ZTsKKyAgICAgICAgY29uc3QgYXV0byBibG9ja19zaXplID0gd3JpdGVyLT5HZXRCbG9ja1NpemUoKTsKICAgICAgICAgc3RkOjpzdHJpbmcgYmxvY2soYmxvY2tfc2l6ZSwgJ1wwJyk7CiAgICAgICAgIGZvciAodWludDY0X3QgaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspIHsKICAgICAgICAgICAgIGlmICghUmVhZEZ1bGx5KHJhbmQsIGJsb2NrLmRhdGEoKSwgYmxvY2suc2l6ZSgpKSkgewpAQCAtMTIxMywxNyArMTI2NCwxNyBAQAogICAgIC8vIEl0IGRvZXNuJ3QgcmVhbGx5IG1hdHRlciB0aGUgb3JkZXIsIHdlIGp1c3Qgd2FudCBjb3BpZXMgdGhhdCByZWZlcmVuY2UKICAgICAvLyBibG9ja3MgdGhhdCB3b24ndCBleGlzdCBpZiB0aGUgcGFydGl0aW9uIHNocmlua3MuCiAgICAgQXNzZXJ0aW9uUmVzdWx0IFNoaWZ0QWxsU25hcHNob3RCbG9ja3MoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHVpbnQ2NF90IG9sZF9zaXplKSB7Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJU25hcHNob3RXcml0ZXI+IHdyaXRlcjsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElDb3dXcml0ZXI+IHdyaXRlcjsKICAgICAgICAgaWYgKGF1dG8gcmVzID0gTWFwVXBkYXRlU25hcHNob3QobmFtZSwgJndyaXRlcik7ICFyZXMpIHsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCF3cml0ZXItPm9wdGlvbnMoKS5tYXhfYmxvY2tzIHx8ICEqd3JpdGVyLT5vcHRpb25zKCkubWF4X2Jsb2NrcykgeworICAgICAgICBpZiAoIXdyaXRlci0+R2V0TWF4QmxvY2tzKCkgfHwgISp3cml0ZXItPkdldE1heEJsb2NrcygpKSB7CiAgICAgICAgICAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8ICJObyBtYXggYmxvY2tzIHNldCBmb3IgIiA8PCBuYW1lIDw8ICIgd3JpdGVyIjsKICAgICAgICAgfQogCi0gICAgICAgIHVpbnQ2NF90IHNyY19ibG9jayA9IChvbGRfc2l6ZSAvIHdyaXRlci0+b3B0aW9ucygpLmJsb2NrX3NpemUpIC0gMTsKKyAgICAgICAgdWludDY0X3Qgc3JjX2Jsb2NrID0gKG9sZF9zaXplIC8gd3JpdGVyLT5HZXRCbG9ja1NpemUoKSkgLSAxOwogICAgICAgICB1aW50NjRfdCBkc3RfYmxvY2sgPSAwOwotICAgICAgICB1aW50NjRfdCBtYXhfYmxvY2tzID0gKndyaXRlci0+b3B0aW9ucygpLm1heF9ibG9ja3M7CisgICAgICAgIHVpbnQ2NF90IG1heF9ibG9ja3MgPSAqd3JpdGVyLT5HZXRNYXhCbG9ja3MoKTsKICAgICAgICAgd2hpbGUgKGRzdF9ibG9jayA8IG1heF9ibG9ja3MgJiYgZHN0X2Jsb2NrIDwgc3JjX2Jsb2NrKSB7CiAgICAgICAgICAgICBpZiAoIXdyaXRlci0+QWRkQ29weShkc3RfYmxvY2ssIHNyY19ibG9jaykpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8ICJVbmFibGUgdG8gYWRkIGNvcHkgZm9yICIgPDwgbmFtZSA8PCAiIGZvciBibG9ja3MgIgpAQCAtMTIzNiw3ICsxMjg3LDEzIEBACiAgICAgICAgICAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8ICJVbmFibGUgdG8gZmluYWxpemUgd3JpdGVyIGZvciAiIDw8IG5hbWU7CiAgICAgICAgIH0KIAotICAgICAgICBhdXRvIGhhc2ggPSBIYXNoU25hcHNob3Qod3JpdGVyLmdldCgpKTsKKyAgICAgICAgYXV0byBvbGRfcGFydGl0aW9uID0gIi9kZXYvYmxvY2svbWFwcGVyLyIgKyBHZXRPdGhlclBhcnRpdGlvbk5hbWUobmFtZSk7CisgICAgICAgIGF1dG8gcmVhZGVyID0gd3JpdGVyLT5PcGVuRmlsZURlc2NyaXB0b3Iob2xkX3BhcnRpdGlvbik7CisgICAgICAgIGlmICghcmVhZGVyKSB7CisgICAgICAgICAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8ICJDb3VsZCBub3Qgb3BlbiBmaWxlIGRlc2NyaXB0b3IgZm9yICIgPDwgbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIGF1dG8gaGFzaCA9IEhhc2hTbmFwc2hvdChyZWFkZXIuZ2V0KCkpOwogICAgICAgICBpZiAoaGFzaC5lbXB0eSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8ICJVbmFibGUgdG8gaGFzaCBzbmFwc2hvdCB3cml0ZXIgZm9yICIgPDwgbmFtZTsKICAgICAgICAgfQpAQCAtMTI4Niw2ICsxMzQzLDE1IEBACiAgICAgRHluYW1pY1BhcnRpdGlvbkdyb3VwKiBncm91cF8gPSBudWxscHRyOwogfTsKIAorVEVTVF9GKFNuYXBzaG90VXBkYXRlVGVzdCwgU3VwZXJPdGFNZXRhZGF0YVRlc3QpIHsKKyAgICBhdXRvIGluZm8gPSBuZXcgVGVzdERldmljZUluZm8oZmFrZV9zdXBlcik7CisgICAgQVNTRVJUX1RSVUUoQ3JlYXRlU2NyYXRjaE90YU1ldGFkYXRhT25TdXBlcihpbmZvKSk7CisgICAgc3RkOjpzdHJpbmcgc2NyYXRjaF9kZXZpY2UgPSBHZXRTY3JhdGNoT3RhTWV0YWRhdGFQYXJ0aXRpb24oKTsKKyAgICBBU1NFUlRfTkUoc2NyYXRjaF9kZXZpY2UsICIiKTsKKyAgICBBU1NFUlRfTkUoTWFwU2NyYXRjaE90YU1ldGFkYXRhUGFydGl0aW9uKHNjcmF0Y2hfZGV2aWNlKSwgIiIpOworICAgIEFTU0VSVF9UUlVFKENsZWFudXBTY3JhdGNoT3RhTWV0YWRhdGFJZlByZXNlbnQoaW5mbykpOworfQorCiAvLyBUZXN0IGZ1bGwgdXBkYXRlIGZsb3cgZXhlY3V0ZWQgYnkgdXBkYXRlX2VuZ2luZS4gU29tZSBwYXJ0aXRpb25zIHVzZXMgc3VwZXIgZW1wdHkgc3BhY2UsCiAvLyBzb21lIHVzZXMgaW1hZ2VzLCBhbmQgc29tZSB1c2VzIGJvdGguCiAvLyBBbHNvIHRlc3QgVW5tYXBVcGRhdGVTbmFwc2hvdCB1bm1hcHMgZXZlcnl0aGluZy4KQEAgLTEzNDQsNiArMTQxMCwxMCBAQAogICAgIH0KIAogICAgIC8vIEluaXRpYXRlIHRoZSBtZXJnZSBhbmQgd2FpdCBmb3IgaXQgdG8gYmUgY29tcGxldGVkLgorICAgIGlmIChTaG91bGRTa2lwTGVnYWN5TWVyZ2luZygpKSB7CisgICAgICAgIExPRyhJTkZPKSA8PCAiU2tpcHBpbmcgbGVnYWN5IG1lcmdlIGluIHRlc3QiOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIEFTU0VSVF9UUlVFKGluaXQtPkluaXRpYXRlTWVyZ2UoKSk7CiAgICAgQVNTRVJUX0VRKGluaXQtPklzU25hcHVzZXJkUmVxdWlyZWQoKSwgc25hcHVzZXJkX3JlcXVpcmVkXyk7CiAgICAgewpAQCAtMTM4Nyw3ICsxNDU3LDcgQEAKICAgICBmb3IgKGF1dG8qIHBhcnRpdGlvbiA6IHBhcnRpdGlvbnMpIHsKICAgICAgICAgQWRkT3BlcmF0aW9uKHBhcnRpdGlvbik7CiAKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElTbmFwc2hvdFdyaXRlcj4gd3JpdGVyOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SUNvd1dyaXRlcj4gd3JpdGVyOwogICAgICAgICBhdXRvIHJlcyA9IE1hcFVwZGF0ZVNuYXBzaG90KHBhcnRpdGlvbi0+cGFydGl0aW9uX25hbWUoKSArICJfYiIsICZ3cml0ZXIpOwogICAgICAgICBBU1NFUlRfVFJVRShyZXMpOwogICAgICAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFplcm9CbG9ja3MoMCwgMSkpOwpAQCAtMTQwNyw2ICsxNDc3LDEwIEBACiAgICAgQVNTRVJUX1RSVUUoaW5pdC0+Q3JlYXRlTG9naWNhbEFuZFNuYXBzaG90UGFydGl0aW9ucygic3VwZXIiLCBzbmFwc2hvdF90aW1lb3V0XykpOwogCiAgICAgLy8gSW5pdGlhdGUgdGhlIG1lcmdlIGFuZCB3YWl0IGZvciBpdCB0byBiZSBjb21wbGV0ZWQuCisgICAgaWYgKFNob3VsZFNraXBMZWdhY3lNZXJnaW5nKCkpIHsKKyAgICAgICAgTE9HKElORk8pIDw8ICJTa2lwcGluZyBsZWdhY3kgbWVyZ2UgaW4gdGVzdCI7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgQVNTRVJUX1RSVUUoaW5pdC0+SW5pdGlhdGVNZXJnZSgpKTsKICAgICBBU1NFUlRfRVEoVXBkYXRlU3RhdGU6Ok1lcmdlQ29tcGxldGVkLCBpbml0LT5Qcm9jZXNzVXBkYXRlU3RhdGUoKSk7CiB9CkBAIC0xNDc2LDYgKzE1NTAsMTAgQEAKICAgICB9CiAKICAgICAvLyBJbml0aWF0ZSB0aGUgbWVyZ2UgYW5kIHdhaXQgZm9yIGl0IHRvIGJlIGNvbXBsZXRlZC4KKyAgICBpZiAoU2hvdWxkU2tpcExlZ2FjeU1lcmdpbmcoKSkgeworICAgICAgICBMT0coSU5GTykgPDwgIlNraXBwaW5nIGxlZ2FjeSBtZXJnZSBpbiB0ZXN0IjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBBU1NFUlRfVFJVRShpbml0LT5Jbml0aWF0ZU1lcmdlKCkpOwogICAgIEFTU0VSVF9FUShpbml0LT5Jc1NuYXB1c2VyZFJlcXVpcmVkKCksIHNuYXB1c2VyZF9yZXF1aXJlZF8pOwogICAgIHsKQEAgLTE1MjksOCArMTYwNyw5IEBACiAgICAgfQogfQogCi0vLyBUZXN0IHRoYXQgYSB0cmFuc2llbnQgbWVyZ2UgY29uc2lzdGVuY3kgY2hlY2sgZmFpbHVyZSBjYW4gcmVzdW1lIHByb3Blcmx5LgotVEVTVF9GKFNuYXBzaG90VXBkYXRlVGVzdCwgQ29uc2lzdGVuY3lDaGVja1Jlc3VtZSkgeworLy8gVGVzdCB0aGF0IHNocmlua2luZyBhbmQgZ3Jvd2luZyBwYXJ0aXRpb25zIGF0IHRoZSBzYW1lIHRpbWUgaXMgaGFuZGxlZAorLy8gY29ycmVjdGx5IGluIFZBQkMuCitURVNUX0YoU25hcHNob3RVcGRhdGVUZXN0LCBJbnRlcnJ1cHRNZXJnZUR1cmluZ1BoYXNlVXBkYXRlKSB7CiAgICAgaWYgKCFzbmFwdXNlcmRfcmVxdWlyZWRfKSB7CiAgICAgICAgIC8vIGIvMTc5MTExMzU5CiAgICAgICAgIEdURVNUX1NLSVAoKSA8PCAiU2tpcHBpbmcgc25hcHVzZXJkIHRlc3QiOwpAQCAtMTU0OSw2ICsxNjI4LDE5IEBACiAKICAgICBBU1NFUlRfVFJVRShzbS0+QmVnaW5VcGRhdGUoKSk7CiAgICAgQVNTRVJUX1RSVUUoc20tPkNyZWF0ZVVwZGF0ZVNuYXBzaG90cyhtYW5pZmVzdF8pKTsKKworICAgIC8vIENoZWNrIHRoYXQgdGhlIG9sZCBwYXJ0aXRpb24gc2l6ZXMgd2VyZSBzYXZlZCBjb3JyZWN0bHkuCisgICAgeworICAgICAgICBBU1NFUlRfVFJVRShBY3F1aXJlTG9jaygpKTsKKyAgICAgICAgYXV0byBsb2NhbF9sb2NrID0gc3RkOjptb3ZlKGxvY2tfKTsKKworICAgICAgICBTbmFwc2hvdFN0YXR1cyBzdGF0dXM7CisgICAgICAgIEFTU0VSVF9UUlVFKHNtLT5SZWFkU25hcHNob3RTdGF0dXMobG9jYWxfbG9jay5nZXQoKSwgInByZF9iIiwgJnN0YXR1cykpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLm9sZF9wYXJ0aXRpb25fc2l6ZSgpLCAzMTQ1NzI4KTsKKyAgICAgICAgQVNTRVJUX1RSVUUoc20tPlJlYWRTbmFwc2hvdFN0YXR1cyhsb2NhbF9sb2NrLmdldCgpLCAic3lzX2IiLCAmc3RhdHVzKSk7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMub2xkX3BhcnRpdGlvbl9zaXplKCksIDMxNDU3MjgpOworICAgIH0KKwogICAgIEFTU0VSVF9UUlVFKFdyaXRlU25hcHNob3RBbmRIYXNoKHN5c18pKTsKICAgICBBU1NFUlRfVFJVRShXcml0ZVNuYXBzaG90QW5kSGFzaCh2bmRfKSk7CiAgICAgQVNTRVJUX1RSVUUoU2hpZnRBbGxTbmFwc2hvdEJsb2NrcygicHJkX2IiLCBvbGRfcHJkX3NpemUpKTsKQEAgLTE1NzYsMTQgKzE2NjgsMTEgQEAKICAgICAgICAgQVNTRVJUX1RSVUUoSXNQYXJ0aXRpb25VbmNoYW5nZWQobmFtZSkpOwogICAgIH0KIAotICAgIGF1dG8gb2xkX2NoZWNrZXIgPSBpbml0LT5tZXJnZV9jb25zaXN0ZW5jeV9jaGVja2VyKCk7Ci0KLSAgICBpbml0LT5zZXRfbWVyZ2VfY29uc2lzdGVuY3lfY2hlY2tlcigKLSAgICAgICAgICAgIFtdKGNvbnN0IHN0ZDo6c3RyaW5nJiwgY29uc3QgU25hcHNob3RTdGF0dXMmKSAtPiBNZXJnZUZhaWx1cmVDb2RlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTWVyZ2VGYWlsdXJlQ29kZTo6V3JvbmdNZXJnZUNvdW50Q29uc2lzdGVuY3lDaGVjazsKLSAgICAgICAgICAgIH0pOwotCiAgICAgLy8gSW5pdGlhdGUgdGhlIG1lcmdlIGFuZCB3YWl0IGZvciBpdCB0byBiZSBjb21wbGV0ZWQuCisgICAgaWYgKFNob3VsZFNraXBMZWdhY3lNZXJnaW5nKCkpIHsKKyAgICAgICAgTE9HKElORk8pIDw8ICJTa2lwcGluZyBsZWdhY3kgbWVyZ2UgaW4gdGVzdCI7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgQVNTRVJUX1RSVUUoaW5pdC0+SW5pdGlhdGVNZXJnZSgpKTsKICAgICBBU1NFUlRfRVEoaW5pdC0+SXNTbmFwdXNlcmRSZXF1aXJlZCgpLCBzbmFwdXNlcmRfcmVxdWlyZWRfKTsKICAgICB7CkBAIC0xNTk1LDIwICsxNjg0LDYyIEBACiAgICAgICAgIEFTU0VSVF9FUShzdGF0dXMubWVyZ2VfcGhhc2UoKSwgTWVyZ2VQaGFzZTo6RklSU1RfUEhBU0UpOwogICAgIH0KIAotICAgIC8vIE1lcmdlIHNob3VsZCBoYXZlIGZhaWxlZC4KLSAgICBBU1NFUlRfRVEoVXBkYXRlU3RhdGU6Ok1lcmdlRmFpbGVkLCBpbml0LT5Qcm9jZXNzVXBkYXRlU3RhdGUoKSk7CisgICAgLy8gV2FpdCB1bnRpbCBwcmRfYiBtZXJnZSBpcyBjb21wbGV0ZWQgd2hpY2ggaXMgcGFydCBvZiBmaXJzdCBwaGFzZQorICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgdGltZW91dCg2MDAwKTsKKyAgICBhdXRvIHN0YXJ0ID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CisgICAgLy8gS2VlcCBwb2xsaW5nIHVudGlsIHRoZSBtZXJnZSBpcyBjb21wbGV0ZSBvciB0aW1lb3V0IGlzIHJlYWNoZWQKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAvLyBRdWVyeSB0aGUgbWVyZ2Ugc3RhdHVzCisgICAgICAgIGNvbnN0IGF1dG8gbWVyZ2Vfc3RhdHVzID0gaW5pdC0+c25hcHVzZXJkX2NsaWVudCgpLT5RdWVyeVNuYXBzaG90U3RhdHVzKCJwcmRfYiIpOworICAgICAgICBpZiAobWVyZ2Vfc3RhdHVzID09ICJzbmFwc2hvdC1tZXJnZS1jb21wbGV0ZSIpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgYXV0byBub3cgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKKyAgICAgICAgYXV0byBlbGFwc2VkID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4obm93IC0gc3RhcnQpOworCisgICAgICAgIEFTU0VSVF9UUlVFKGVsYXBzZWQgPCB0aW1lb3V0KTsKKyAgICAgICAgLy8gc2xlZXAgZm9yIGEgc2Vjb25kIGFuZCBhbGxvdyBtZXJnZSB0byBjb21wbGV0ZQorICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMDAwKSk7CisgICAgfQorCisgICAgLy8gTm93LCBmb3JjZWZ1bGx5IHVwZGF0ZSB0aGUgc25hcHNob3QtdXBkYXRlIHN0YXR1cyB0byBTRUNPTkQgUEhBU0UKKyAgICAvLyBUaGlzIHdpbGwgbm90IHVwZGF0ZSB0aGUgc25hcHNob3Qgc3RhdHVzIG9mIHN5c19iIHRvIE1FUkdJTkcKKyAgICBpZiAoaW5pdC0+VXBkYXRlVXNlc1VzZXJTbmFwc2hvdHMoKSkgeworICAgICAgICBBU1NFUlRfVFJVRShBY3F1aXJlTG9jaygpKTsKKyAgICAgICAgYXV0byBsb2NhbF9sb2NrID0gc3RkOjptb3ZlKGxvY2tfKTsKKyAgICAgICAgYXV0byBzdGF0dXMgPSBpbml0LT5SZWFkU25hcHNob3RVcGRhdGVTdGF0dXMobG9jYWxfbG9jay5nZXQoKSk7CisgICAgICAgIHN0YXR1cy5zZXRfbWVyZ2VfcGhhc2UoTWVyZ2VQaGFzZTo6U0VDT05EX1BIQVNFKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoaW5pdC0+V3JpdGVTbmFwc2hvdFVwZGF0ZVN0YXR1cyhsb2NhbF9sb2NrLmdldCgpLCBzdGF0dXMpKTsKKyAgICB9CiAKICAgICAvLyBTaW11bGF0ZSBzaHV0dGluZyBkb3duIHRoZSBkZXZpY2UgYW5kIGNyZWF0aW5nIHBhcnRpdGlvbnMgYWdhaW4uCiAgICAgQVNTRVJUX1RSVUUoVW5tYXBBbGwoKSk7Ci0KLSAgICAvLyBSZXN0b3JlIHRoZSBjaGVja2VyLgotICAgIGluaXQtPnNldF9tZXJnZV9jb25zaXN0ZW5jeV9jaGVja2VyKHN0ZDo6bW92ZShvbGRfY2hlY2tlcikpOwotCiAgICAgQVNTRVJUX1RSVUUoaW5pdC0+Q3JlYXRlTG9naWNhbEFuZFNuYXBzaG90UGFydGl0aW9ucygic3VwZXIiLCBzbmFwc2hvdF90aW1lb3V0XykpOwogCi0gICAgLy8gQ29tcGxldGUgdGhlIG1lcmdlLgorICAgIERldmljZU1hcHBlcjo6VGFyZ2V0SW5mbyB0YXJnZXQ7CisgICAgQVNTRVJUX1RSVUUoaW5pdC0+SXNTbmFwc2hvdERldmljZSgicHJkX2IiLCAmdGFyZ2V0KSk7CisKKyAgICBBU1NFUlRfRVEoRGV2aWNlTWFwcGVyOjpHZXRUYXJnZXRUeXBlKHRhcmdldC5zcGVjKSwgInVzZXIiKTsKKyAgICBBU1NFUlRfVFJVRShpbml0LT5Jc1NuYXBzaG90RGV2aWNlKCJzeXNfYiIsICZ0YXJnZXQpKTsKKyAgICBBU1NFUlRfRVEoRGV2aWNlTWFwcGVyOjpHZXRUYXJnZXRUeXBlKHRhcmdldC5zcGVjKSwgInVzZXIiKTsKKyAgICBBU1NFUlRfVFJVRShpbml0LT5Jc1NuYXBzaG90RGV2aWNlKCJ2bmRfYiIsICZ0YXJnZXQpKTsKKyAgICBBU1NFUlRfRVEoRGV2aWNlTWFwcGVyOjpHZXRUYXJnZXRUeXBlKHRhcmdldC5zcGVjKSwgInVzZXIiKTsKKworICAgIC8vIENvbXBsZXRlIHRoZSBtZXJnZTsgInN5cyIgYW5kICJ2bmQiIHNob3VsZCByZXN1bWUgdGhlIG1lcmdlCisgICAgLy8gZXZlbiB0aG91Z2ggbWVyZ2Ugd2FzIGludGVycnVwdGVkIGFmdGVyIHVwZGF0ZV9zdGF0dXMgd2FzIHVwZGF0ZWQgdG8KKyAgICAvLyBTRUNPTkRfUEhBU0UKICAgICBBU1NFUlRfRVEoVXBkYXRlU3RhdGU6Ok1lcmdlQ29tcGxldGVkLCBpbml0LT5Qcm9jZXNzVXBkYXRlU3RhdGUoKSk7CiAKKyAgICAvLyBNYWtlIHN1cmUgdGhlIHNlY29uZCBwaGFzZSByYW4gYW5kIGRlbGV0ZWQgc25hcHNob3RzLgorICAgIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoQWNxdWlyZUxvY2soKSk7CisgICAgICAgIGF1dG8gbG9jYWxfbG9jayA9IHN0ZDo6bW92ZShsb2NrXyk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzbmFwc2hvdHM7CisgICAgICAgIEFTU0VSVF9UUlVFKGluaXQtPkxpc3RTbmFwc2hvdHMobG9jYWxfbG9jay5nZXQoKSwgJnNuYXBzaG90cykpOworICAgICAgICBBU1NFUlRfVFJVRShzbmFwc2hvdHMuZW1wdHkoKSk7CisgICAgfQorCiAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgdGFyZ2V0IHBhcnRpdGlvbnMgaGF2ZSB0aGUgc2FtZSBjb250ZW50IGFmdGVyIHRoZSBtZXJnZS4KICAgICBmb3IgKGNvbnN0IGF1dG8mIG5hbWUgOiB7InN5c19iIiwgInZuZF9iIiwgInByZF9iIn0pIHsKICAgICAgICAgQVNTRVJUX1RSVUUoSXNQYXJ0aXRpb25VbmNoYW5nZWQobmFtZSkpCkBAIC0xNzg2LDYgKzE5MTcsMTAgQEAKIAogICAgIC8vIEluaXRpYXRlIHRoZSBtZXJnZSBhbmQgd2FpdCBmb3IgaXQgdG8gYmUgY29tcGxldGVkLgogICAgIGF1dG8gbmV3X3NtID0gU25hcHNob3RNYW5hZ2VyOjpOZXcobmV3IFRlc3REZXZpY2VJbmZvKGZha2Vfc3VwZXIsICJfYiIpKTsKKyAgICBpZiAoU2hvdWxkU2tpcExlZ2FjeU1lcmdpbmcoKSkgeworICAgICAgICBMT0coSU5GTykgPDwgIlNraXBwaW5nIGxlZ2FjeSBtZXJnZSBpbiB0ZXN0IjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBBU1NFUlRfVFJVRShuZXdfc20tPkluaXRpYXRlTWVyZ2UoKSk7CiAgICAgQVNTRVJUX0VRKFVwZGF0ZVN0YXRlOjpNZXJnZUNvbXBsZXRlZCwgbmV3X3NtLT5Qcm9jZXNzVXBkYXRlU3RhdGUoKSk7CiAKQEAgLTE5MjQsNiArMjA1OSwxMCBAQAogICAgIEFTU0VSVF9HRShmZCwgMCk7CiAKICAgICAvLyBDT1cgY2Fubm90IGJlIHJlbW92ZWQgZHVlIHRvIG9wZW4gZmQsIHNvIGV4cGVjdCBhIHNvZnQgZmFpbHVyZS4KKyAgICBpZiAoU2hvdWxkU2tpcExlZ2FjeU1lcmdpbmcoKSkgeworICAgICAgICBMT0coSU5GTykgPDwgIlNraXBwaW5nIGxlZ2FjeSBtZXJnZSBpbiB0ZXN0IjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBBU1NFUlRfVFJVRShpbml0LT5Jbml0aWF0ZU1lcmdlKCkpOwogICAgIEFTU0VSVF9FUShVcGRhdGVTdGF0ZTo6TWVyZ2VOZWVkc1JlYm9vdCwgaW5pdC0+UHJvY2Vzc1VwZGF0ZVN0YXRlKCkpOwogCkBAIC0xOTkzLDYgKzIxMzIsOCBAQAogfQogCiBURVNUX0YoTWV0YWRhdGFNb3VudGVkVGVzdCwgUmVjb3ZlcnkpIHsKKyAgICBHVEVTVF9TS0lQKCkgPDwgImIvMzUwNzE1NDYzIjsKKwogICAgIHRlc3RfZGV2aWNlLT5zZXRfcmVjb3ZlcnkodHJ1ZSk7CiAgICAgbWV0YWRhdGFfZGlyXyA9IHRlc3RfZGV2aWNlLT5HZXRNZXRhZGF0YURpcigpOwogCkBAIC0yMDI3LDYgKzIxNjgsMTAgQEAKIAogICAgIC8vIEluaXRpYXRlIHRoZSBtZXJnZSBhbmQgdGhlbiBpbW1lZGlhdGVseSBzdG9wIGl0IHRvIHNpbXVsYXRlIGEgcmVib290LgogICAgIGF1dG8gbmV3X3NtID0gU25hcHNob3RNYW5hZ2VyOjpOZXcobmV3IFRlc3REZXZpY2VJbmZvKGZha2Vfc3VwZXIsICJfYiIpKTsKKyAgICBpZiAoU2hvdWxkU2tpcExlZ2FjeU1lcmdpbmcoKSkgeworICAgICAgICBMT0coSU5GTykgPDwgIlNraXBwaW5nIGxlZ2FjeSBtZXJnZSBpbiB0ZXN0IjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBBU1NFUlRfVFJVRShuZXdfc20tPkluaXRpYXRlTWVyZ2UoKSk7CiAgICAgQVNTRVJUX1RSVUUoVW5tYXBBbGwoKSk7CiAKQEAgLTIwNTksNiArMjIwNCwxMCBAQAogCiAgICAgLy8gSW5pdGlhdGUgdGhlIG1lcmdlIGFuZCB0aGVuIGltbWVkaWF0ZWx5IHN0b3AgaXQgdG8gc2ltdWxhdGUgYSByZWJvb3QuCiAgICAgYXV0byBuZXdfc20gPSBTbmFwc2hvdE1hbmFnZXI6Ok5ldyhuZXcgVGVzdERldmljZUluZm8oZmFrZV9zdXBlciwgIl9iIikpOworICAgIGlmIChTaG91bGRTa2lwTGVnYWN5TWVyZ2luZygpKSB7CisgICAgICAgIExPRyhJTkZPKSA8PCAiU2tpcHBpbmcgbGVnYWN5IG1lcmdlIGluIHRlc3QiOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIEFTU0VSVF9UUlVFKG5ld19zbS0+SW5pdGlhdGVNZXJnZSgpKTsKICAgICBBU1NFUlRfVFJVRShVbm1hcEFsbCgpKTsKIApAQCAtMjEwMywxMCArMjI1MiwxMCBAQAogICAgIHRlc3RfZGV2aWNlLT5zZXRfcmVjb3ZlcnkodHJ1ZSk7CiAgICAgYXV0byBuZXdfc20gPSBOZXdNYW5hZ2VyRm9yRmlyc3RTdGFnZU1vdW50KHRlc3RfZGV2aWNlKTsKIAorICAgIEVYUEVDVF9FUShuZXdfc20tPkdldFVwZGF0ZVN0YXRlKCksIFVwZGF0ZVN0YXRlOjpVbnZlcmlmaWVkKTsKICAgICBBU1NFUlRfVFJVRShuZXdfc20tPkhhbmRsZUltbWluZW50RGF0YVdpcGUoKSk7CiAgICAgLy8gTWFudWFsbHkgbW91bnQgbWV0YWRhdGEgc28gdGhhdCB3ZSBjYW4gY2FsbCBHZXRVcGRhdGVTdGF0ZSgpIGJlbG93LgogICAgIE1vdW50TWV0YWRhdGEoKTsKLSAgICBFWFBFQ1RfRVEobmV3X3NtLT5HZXRVcGRhdGVTdGF0ZSgpLCBVcGRhdGVTdGF0ZTo6Tm9uZSk7CiAgICAgRVhQRUNUX1RSVUUodGVzdF9kZXZpY2UtPklzU2xvdFVuYm9vdGFibGUoMSkpOwogICAgIEVYUEVDVF9GQUxTRSh0ZXN0X2RldmljZS0+SXNTbG90VW5ib290YWJsZSgwKSk7CiB9CkBAIC0yMTI4LDYgKzIyNzcsNyBAQAogICAgIHRlc3RfZGV2aWNlLT5zZXRfcmVjb3ZlcnkodHJ1ZSk7CiAgICAgYXV0byBuZXdfc20gPSBOZXdNYW5hZ2VyRm9yRmlyc3RTdGFnZU1vdW50KHRlc3RfZGV2aWNlKTsKIAorICAgIEVYUEVDVF9FUShuZXdfc20tPkdldFVwZGF0ZVN0YXRlKCksIFVwZGF0ZVN0YXRlOjpVbnZlcmlmaWVkKTsKICAgICBBU1NFUlRfVFJVRShuZXdfc20tPkhhbmRsZUltbWluZW50RGF0YVdpcGUoKSk7CiAgICAgRVhQRUNUX0VRKG5ld19zbS0+R2V0VXBkYXRlU3RhdGUoKSwgVXBkYXRlU3RhdGU6Ok5vbmUpOwogICAgIEVYUEVDVF9GQUxTRSh0ZXN0X2RldmljZS0+SXNTbG90VW5ib290YWJsZSgwKSk7CkBAIC0yMTU0LDYgKzIzMDQsNyBAQAogICAgIHRlc3RfZGV2aWNlLT5zZXRfcmVjb3ZlcnkodHJ1ZSk7CiAgICAgYXV0byBuZXdfc20gPSBOZXdNYW5hZ2VyRm9yRmlyc3RTdGFnZU1vdW50KHRlc3RfZGV2aWNlKTsKIAorICAgIEVYUEVDVF9FUShuZXdfc20tPkdldFVwZGF0ZVN0YXRlKCksIFVwZGF0ZVN0YXRlOjpVbnZlcmlmaWVkKTsKICAgICBBU1NFUlRfVFJVRShuZXdfc20tPkhhbmRsZUltbWluZW50RGF0YVdpcGUoKSk7CiAgICAgLy8gTWFudWFsbHkgbW91bnQgbWV0YWRhdGEgc28gdGhhdCB3ZSBjYW4gY2FsbCBHZXRVcGRhdGVTdGF0ZSgpIGJlbG93LgogICAgIE1vdW50TWV0YWRhdGEoKTsKQEAgLTIyMTUsNiArMjM2Niw3IEBACiAgICAgdGVzdF9kZXZpY2UtPnNldF9yZWNvdmVyeSh0cnVlKTsKICAgICBhdXRvIG5ld19zbSA9IE5ld01hbmFnZXJGb3JGaXJzdFN0YWdlTW91bnQodGVzdF9kZXZpY2UpOwogCisgICAgRVhQRUNUX0VRKG5ld19zbS0+R2V0VXBkYXRlU3RhdGUoKSwgVXBkYXRlU3RhdGU6OlVudmVyaWZpZWQpOwogICAgIEFTU0VSVF9UUlVFKG5ld19zbS0+SGFuZGxlSW1taW5lbnREYXRhV2lwZSgpKTsKICAgICAvLyBNYW51YWxseSBtb3VudCBtZXRhZGF0YSBzbyB0aGF0IHdlIGNhbiBjYWxsIEdldFVwZGF0ZVN0YXRlKCkgYmVsb3cuCiAgICAgTW91bnRNZXRhZGF0YSgpOwpAQCAtMjM1Myw4ICsyNTA1LDEwIEBACiAgICAgYXV0byBpbml0ID0gTmV3TWFuYWdlckZvckZpcnN0U3RhZ2VNb3VudCgiX2IiKTsKICAgICBBU1NFUlRfTkUoaW5pdCwgbnVsbHB0cik7CiAKLSAgICBBU1NFUlRfVFJVRShpbml0LT5FbnN1cmVTbmFwdXNlcmRDb25uZWN0ZWQoKSk7Ci0gICAgaW5pdC0+c2V0X3VzZV9maXJzdF9zdGFnZV9zbmFwdXNlcmQodHJ1ZSk7CisgICAgaWYgKHNuYXB1c2VyZF9yZXF1aXJlZF8pIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoaW5pdC0+RW5zdXJlU25hcHVzZXJkQ29ubmVjdGVkKCkpOworICAgICAgICBpbml0LT5zZXRfdXNlX2ZpcnN0X3N0YWdlX3NuYXB1c2VyZCh0cnVlKTsKKyAgICB9CiAKICAgICBBU1NFUlRfVFJVRShpbml0LT5OZWVkU25hcHNob3RzSW5GaXJzdFN0YWdlTW91bnQoKSk7CiAgICAgQVNTRVJUX1RSVUUoaW5pdC0+Q3JlYXRlTG9naWNhbEFuZFNuYXBzaG90UGFydGl0aW9ucygic3VwZXIiLCBzbmFwc2hvdF90aW1lb3V0XykpOwpAQCAtMjM2NSwxMiArMjUxOSwxOCBAQAogICAgICAgICBBU1NFUlRfVFJVRShJc1BhcnRpdGlvblVuY2hhbmdlZChuYW1lKSk7CiAgICAgfQogCi0gICAgQVNTRVJUX1RSVUUoaW5pdC0+UGVyZm9ybUluaXRUcmFuc2l0aW9uKFNuYXBzaG90TWFuYWdlcjo6SW5pdFRyYW5zaXRpb246OlNFQ09ORF9TVEFHRSkpOwotICAgIGZvciAoY29uc3QgYXV0byYgbmFtZSA6IHBhcnRpdGlvbnMpIHsKLSAgICAgICAgQVNTRVJUX1RSVUUoaW5pdC0+c25hcHVzZXJkX2NsaWVudCgpLT5XYWl0Rm9yRGV2aWNlRGVsZXRlKG5hbWUgKyAiLXVzZXItY293LWluaXQiKSk7CisgICAgaWYgKHNuYXB1c2VyZF9yZXF1aXJlZF8pIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoaW5pdC0+UGVyZm9ybUluaXRUcmFuc2l0aW9uKFNuYXBzaG90TWFuYWdlcjo6SW5pdFRyYW5zaXRpb246OlNFQ09ORF9TVEFHRSkpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIG5hbWUgOiBwYXJ0aXRpb25zKSB7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShpbml0LT5zbmFwdXNlcmRfY2xpZW50KCktPldhaXRGb3JEZXZpY2VEZWxldGUobmFtZSArICItdXNlci1jb3ctaW5pdCIpKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8vIEluaXRpYXRlIHRoZSBtZXJnZSBhbmQgd2FpdCBmb3IgaXQgdG8gYmUgY29tcGxldGVkLgorICAgIGlmIChTaG91bGRTa2lwTGVnYWN5TWVyZ2luZygpKSB7CisgICAgICAgIExPRyhJTkZPKSA8PCAiU2tpcHBpbmcgbGVnYWN5IG1lcmdlIGluIHRlc3QiOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIEFTU0VSVF9UUlVFKGluaXQtPkluaXRpYXRlTWVyZ2UoKSk7CiAgICAgQVNTRVJUX0VRKFVwZGF0ZVN0YXRlOjpNZXJnZUNvbXBsZXRlZCwgaW5pdC0+UHJvY2Vzc1VwZGF0ZVN0YXRlKCkpOwogCkBAIC0yNDU1LDYgKzI2MTUsNTMgQEAKICAgICB9CiB9CiAKK1RFU1RfRihTbmFwc2hvdFVwZGF0ZVRlc3QsIE1hcEFsbFNuYXBzaG90c1dpdGhvdXRTbG90U3dpdGNoKSB7CisgICAgTW91bnRNZXRhZGF0YSgpOworICAgIEFkZE9wZXJhdGlvbkZvclBhcnRpdGlvbnMoKTsKKyAgICAvLyBFeGVjdXRlIHRoZSB1cGRhdGUuCisgICAgQVNTRVJUX1RSVUUoc20tPkJlZ2luVXBkYXRlKCkpOworICAgIEFTU0VSVF9UUlVFKHNtLT5DcmVhdGVVcGRhdGVTbmFwc2hvdHMobWFuaWZlc3RfKSk7CisKKyAgICBpZiAoIXNtLT5VcGRhdGVVc2VzVXNlclNuYXBzaG90cygpKSB7CisgICAgICAgIEdURVNUX1NLSVAoKSA8PCAiVGVzdCBkb2VzIG5vdCBhcHBseSBhcyBVc2VyU25hcHNob3RzIGFyZW4ndCBlbmFibGVkLiI7CisgICAgfQorCisgICAgQVNTRVJUX1RSVUUoV3JpdGVTbmFwc2hvdHMoKSk7CisgICAgQVNTRVJUX1RSVUUoc20tPkZpbmlzaGVkU25hcHNob3RXcml0ZXMoZmFsc2UpKTsKKworICAgIGlmIChTaG91bGRTa2lwTGVnYWN5TWVyZ2luZygpKSB7CisgICAgICAgIEdURVNUX1NLSVAoKSA8PCAiU2tpcHBpbmcgbGVnYWN5IG1lcmdlIHRlc3QiOworICAgIH0KKyAgICAvLyBNYXJrIHRoZSBpbmRpY2F0b3IKKyAgICBBU1NFUlRfVFJVRShzbS0+Qm9vdEZyb21TbmFwc2hvdHNXaXRob3V0U2xvdFN3aXRjaCgpKTsKKworICAgIEFTU0VSVF9UUlVFKHNtLT5FbnN1cmVTbmFwdXNlcmRDb25uZWN0ZWQoKSk7CisgICAgc20tPnNldF91c2VfZmlyc3Rfc3RhZ2Vfc25hcHVzZXJkKHRydWUpOworCisgICAgQVNTRVJUX1RSVUUoc20tPk5lZWRTbmFwc2hvdHNJbkZpcnN0U3RhZ2VNb3VudCgpKTsKKworICAgIC8vIE1hcCBzbmFwc2hvdHMKKyAgICBBU1NFUlRfVFJVRShzbS0+TWFwQWxsU25hcHNob3RzKDEwcykpOworCisgICAgLy8gTmV3IHVwZGF0ZXMgc2hvdWxkIGZhaWwKKyAgICBBU1NFUlRfRkFMU0Uoc20tPkJlZ2luVXBkYXRlKCkpOworCisgICAgLy8gU25hcHNob3RzIGNhbm5vdCBiZSBjYW5jZWxsZWQKKyAgICBBU1NFUlRfRkFMU0Uoc20tPkNhbmNlbFVwZGF0ZSgpKTsKKworICAgIC8vIE1lcmdlIGNhbm5vdCBzdGFydAorICAgIEFTU0VSVF9GQUxTRShzbS0+SW5pdGlhdGVNZXJnZSgpKTsKKworICAgIC8vIFJlYWQgYnl0ZXMgYmFjayBhbmQgdmVyaWZ5IHRoZXkgbWF0Y2ggdGhlIGNhY2hlLgorICAgIEFTU0VSVF9UUlVFKElzUGFydGl0aW9uVW5jaGFuZ2VkKCJzeXNfYiIpKTsKKworICAgIC8vIFJlbW92ZSB0aGUgaW5kaWNhdG9ycworICAgIEFTU0VSVF9UUlVFKHNtLT5QcmVwYXJlRGV2aWNlVG9Cb290V2l0aG91dFNuYXBzaG90KCkpOworCisgICAgLy8gQ2xlYW51cCBzbmFwc2hvdHMKKyAgICBBU1NFUlRfVFJVRShzbS0+VW5tYXBBbGxTbmFwc2hvdHMoKSk7Cit9CisKIFRFU1RfRihTbmFwc2hvdFVwZGF0ZVRlc3QsIE1hcEFsbFNuYXBzaG90cykgewogICAgIEFkZE9wZXJhdGlvbkZvclBhcnRpdGlvbnMoKTsKICAgICAvLyBFeGVjdXRlIHRoZSB1cGRhdGUuCkBAIC0yNTU3LDYgKzI3NjQsMTEgQEAKICAgICBBU1NFUlRfVFJVRShpbml0LT5Jbml0aWF0ZU1lcmdlKCkpOwogICAgIEFTU0VSVF9FUShVcGRhdGVTdGF0ZTo6TWVyZ2VGYWlsZWQsIGluaXQtPlByb2Nlc3NVcGRhdGVTdGF0ZSgpKTsKIAorICAgIGlmIChTaG91bGRTa2lwTGVnYWN5TWVyZ2luZygpKSB7CisgICAgICAgIExPRyhJTkZPKSA8PCAiU2tpcHBpbmcgbGVnYWN5IG1lcmdlIGluIHRlc3QiOworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgLy8gU2ltdWxhdGUgYSByZWJvb3QgdGhhdCB0cmllcyB0aGUgbWVyZ2UgYWdhaW4sIHdpdGggdGhlIG5vbi1mYWlsaW5nIGRtLgogICAgIEFTU0VSVF9UUlVFKFVubWFwQWxsKCkpOwogICAgIGluaXQgPSBOZXdNYW5hZ2VyRm9yRmlyc3RTdGFnZU1vdW50KCJfYiIpOwpAQCAtMjU2NSw2ICsyNzc3LDYyIEBACiAgICAgQVNTRVJUX0VRKFVwZGF0ZVN0YXRlOjpNZXJnZUNvbXBsZXRlZCwgaW5pdC0+UHJvY2Vzc1VwZGF0ZVN0YXRlKCkpOwogfQogCitURVNUX0YoU25hcHNob3RVcGRhdGVUZXN0LCBCYWRDb3dWZXJzaW9uKSB7CisgICAgaWYgKCFzbmFwdXNlcmRfcmVxdWlyZWRfKSB7CisgICAgICAgIEdURVNUX1NLSVAoKSA8PCAiVkFCQyBvbmx5IjsKKyAgICB9CisKKyAgICBBU1NFUlRfVFJVRShzbS0+QmVnaW5VcGRhdGUoKSk7CisKKyAgICBhdXRvIGR5bmFtaWNfcGFydGl0aW9uX21ldGFkYXRhID0gbWFuaWZlc3RfLm11dGFibGVfZHluYW1pY19wYXJ0aXRpb25fbWV0YWRhdGEoKTsKKyAgICBkeW5hbWljX3BhcnRpdGlvbl9tZXRhZGF0YS0+c2V0X2Nvd192ZXJzaW9uKGtNaW5Db3dWZXJzaW9uIC0gMSk7CisgICAgQVNTRVJUX0ZBTFNFKHNtLT5DcmVhdGVVcGRhdGVTbmFwc2hvdHMobWFuaWZlc3RfKSk7CisKKyAgICBkeW5hbWljX3BhcnRpdGlvbl9tZXRhZGF0YS0+c2V0X2Nvd192ZXJzaW9uKGtNYXhDb3dWZXJzaW9uICsgMSk7CisgICAgQVNTRVJUX0ZBTFNFKHNtLT5DcmVhdGVVcGRhdGVTbmFwc2hvdHMobWFuaWZlc3RfKSk7CisKKyAgICBkeW5hbWljX3BhcnRpdGlvbl9tZXRhZGF0YS0+c2V0X2Nvd192ZXJzaW9uKGtNYXhDb3dWZXJzaW9uKTsKKyAgICBBU1NFUlRfVFJVRShzbS0+Q3JlYXRlVXBkYXRlU25hcHNob3RzKG1hbmlmZXN0XykpOworfQorCitURVNUX0YoU25hcHNob3RUZXN0LCBGbGFnQ2hlY2spIHsKKyAgICBpZiAoIXNuYXB1c2VyZF9yZXF1aXJlZF8pIHsKKyAgICAgICAgR1RFU1RfU0tJUCgpIDw8ICJTa2lwcGluZyBzbmFwdXNlcmQgdGVzdCI7CisgICAgfQorICAgIEFTU0VSVF9UUlVFKEFjcXVpcmVMb2NrKCkpOworCisgICAgU25hcHNob3RVcGRhdGVTdGF0dXMgc3RhdHVzID0gc20tPlJlYWRTbmFwc2hvdFVwZGF0ZVN0YXR1cyhsb2NrXy5nZXQoKSk7CisKKyAgICAvLyBTZXQgZmxhZ3MgaW4gcHJvdG8KKyAgICBzdGF0dXMuc2V0X29fZGlyZWN0KHRydWUpOworICAgIHN0YXR1cy5zZXRfaW9fdXJpbmdfZW5hYmxlZCh0cnVlKTsKKyAgICBzdGF0dXMuc2V0X3VzZXJzcGFjZV9zbmFwc2hvdHModHJ1ZSk7CisgICAgc3RhdHVzLnNldF9jb3dfb3BfbWVyZ2Vfc2l6ZSgxNik7CisKKyAgICBzbS0+V3JpdGVTbmFwc2hvdFVwZGF0ZVN0YXR1cyhsb2NrXy5nZXQoKSwgc3RhdHVzKTsKKyAgICAvLyBFbnN1cmUgYSBjb25uZWN0aW9uIHRvIHRoZSBzZWNvbmQtc3RhZ2UgZGFlbW9uLCBidXQgdXNlIHRoZSBmaXJzdC1zdGFnZQorICAgIC8vIGNvZGUgcGF0aHMgdGhlcmVhZnRlci4KKyAgICBBU1NFUlRfVFJVRShzbS0+RW5zdXJlU25hcHVzZXJkQ29ubmVjdGVkKCkpOworICAgIHNtLT5zZXRfdXNlX2ZpcnN0X3N0YWdlX3NuYXB1c2VyZCh0cnVlKTsKKworICAgIGF1dG8gaW5pdCA9IE5ld01hbmFnZXJGb3JGaXJzdFN0YWdlTW91bnQoIl9iIik7CisgICAgQVNTRVJUX05FKGluaXQsIG51bGxwdHIpOworCisgICAgbG9ja18gPSBudWxscHRyOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNuYXB1c2VyZF9hcmd2OworICAgIEFTU0VSVF9UUlVFKGluaXQtPlBlcmZvcm1Jbml0VHJhbnNpdGlvbihTbmFwc2hvdE1hbmFnZXI6OkluaXRUcmFuc2l0aW9uOjpTRUxJTlVYX0RFVEFDSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNuYXB1c2VyZF9hcmd2KSk7CisgICAgQVNTRVJUX1RSVUUoc3RkOjpmaW5kKHNuYXB1c2VyZF9hcmd2LmJlZ2luKCksIHNuYXB1c2VyZF9hcmd2LmVuZCgpLCAiLW9fZGlyZWN0IikgIT0KKyAgICAgICAgICAgICAgICBzbmFwdXNlcmRfYXJndi5lbmQoKSk7CisgICAgQVNTRVJUX1RSVUUoc3RkOjpmaW5kKHNuYXB1c2VyZF9hcmd2LmJlZ2luKCksIHNuYXB1c2VyZF9hcmd2LmVuZCgpLCAiLWlvX3VyaW5nIikgIT0KKyAgICAgICAgICAgICAgICBzbmFwdXNlcmRfYXJndi5lbmQoKSk7CisgICAgQVNTRVJUX1RSVUUoc3RkOjpmaW5kKHNuYXB1c2VyZF9hcmd2LmJlZ2luKCksIHNuYXB1c2VyZF9hcmd2LmVuZCgpLCAiLXVzZXJfc25hcHNob3QiKSAhPQorICAgICAgICAgICAgICAgIHNuYXB1c2VyZF9hcmd2LmVuZCgpKTsKKyAgICBBU1NFUlRfVFJVRShzdGQ6OmZpbmQoc25hcHVzZXJkX2FyZ3YuYmVnaW4oKSwgc25hcHVzZXJkX2FyZ3YuZW5kKCksICItY293X29wX21lcmdlX3NpemU9MTYiKSAhPQorICAgICAgICAgICAgICAgIHNuYXB1c2VyZF9hcmd2LmVuZCgpKTsKK30KKwogY2xhc3MgRmxhc2hBZnRlclVwZGF0ZVRlc3QgOiBwdWJsaWMgU25hcHNob3RVcGRhdGVUZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgV2l0aFBhcmFtSW50ZXJmYWNlPHN0ZDo6dHVwbGU8dWludDMyX3QsIGJvb2w+PiB7CiAgIHB1YmxpYzoKQEAgLTI3NjgsMjEgKzMwMzYsMzEgQEAKIAogdm9pZCBTbmFwc2hvdFRlc3RFbnZpcm9ubWVudDo6VGVhckRvd24oKSB7CiAgICAgUkVUVVJOX0lGX05PTl9WSVJUVUFMX0FCKCk7CisgICAgUkVUVVJOX0lGX1ZFTkRPUl9PTl9BTkRST0lEX1MoKTsKKwogICAgIGlmIChzdXBlcl9pbWFnZXNfICE9IG51bGxwdHIpIHsKICAgICAgICAgRGVsZXRlQmFja2luZ0ltYWdlKHN1cGVyX2ltYWdlc18uZ2V0KCksICJmYWtlLXN1cGVyIik7CiAgICAgfQogfQogCiB2b2lkIEtpbGxTbmFwdXNlcmQoKSB7Ci0gICAgYXV0byBzdGF0dXMgPSBhbmRyb2lkOjpiYXNlOjpHZXRQcm9wZXJ0eSgiaW5pdC5zdmMuc25hcHVzZXJkIiwgInN0b3BwZWQiKTsKLSAgICBpZiAoc3RhdHVzID09ICJzdG9wcGVkIikgewotICAgICAgICByZXR1cm47CisgICAgLy8gRGV0YWNoIHRoZSBkYWVtb24gaWYgaXQncyBhbGl2ZQorICAgIGF1dG8gc25hcHVzZXJkX2NsaWVudCA9IFNuYXB1c2VyZENsaWVudDo6VHJ5Q29ubmVjdChrU25hcHVzZXJkU29ja2V0LCA1cyk7CisgICAgaWYgKHNuYXB1c2VyZF9jbGllbnQpIHsKKyAgICAgICAgc25hcHVzZXJkX2NsaWVudC0+RGV0YWNoU25hcHVzZXJkKCk7CiAgICAgfQotICAgIGF1dG8gc25hcHVzZXJkX2NsaWVudCA9IFNuYXB1c2VyZENsaWVudDo6Q29ubmVjdChrU25hcHVzZXJkU29ja2V0LCA1cyk7Ci0gICAgaWYgKCFzbmFwdXNlcmRfY2xpZW50KSB7Ci0gICAgICAgIHJldHVybjsKKworICAgIC8vIE5vdyBzdG9wIHRoZSBzZXJ2aWNlIC0gSW5pdCB3aWxsIHNlbmQgYSBTSUdLSUxMIHRvIHRoZSBkYWVtb24uIEhvd2V2ZXIsCisgICAgLy8gcHJvY2VzcyBzdGF0ZSB3aWxsIG1vdmUgZnJvbSAicnVubmluZyIgdG8gInN0b3BwaW5nIi4gT25seSBhZnRlciB0aGUKKyAgICAvLyBwcm9jZXNzIGlzIHJlYXBlZCBieSBpbml0LCB0aGUgc2VydmljZSBzdGF0ZSBpcyBtb3ZlZCB0byAic3RvcHBlZCIuCisgICAgLy8KKyAgICAvLyBTaW5jZSB0aGUgdGVzdHMgaW52b2x2ZSBzdGFydGluZyB0aGUgZGFlbW9uIGltbWVkaWF0ZWx5LCB3YWl0IGZvciB0aGUKKyAgICAvLyBwcm9jZXNzIHRvIGNvbXBsZXRlbHkgc3RvcCAoYWthLiB3YWl0IHVudGlsIGluaXQgcmVhcHMgdGhlIHRlcm1pbmF0ZWQKKyAgICAvLyBwcm9jZXNzKS4KKyAgICBhbmRyb2lkOjpiYXNlOjpTZXRQcm9wZXJ0eSgiY3RsLnN0b3AiLCAic25hcHVzZXJkIik7CisgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpXYWl0Rm9yUHJvcGVydHkoImluaXQuc3ZjLnNuYXB1c2VyZCIsICJzdG9wcGVkIiwgMTBzKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJUaW1lZCBvdXQgd2FpdGluZyBmb3Igc25hcHVzZXJkIHRvIHN0b3AuIjsKICAgICB9Ci0gICAgc25hcHVzZXJkX2NsaWVudC0+RGV0YWNoU25hcHVzZXJkKCk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdApAQCAtMjc5MywyMiArMzA3MSwyOSBAQAogICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KG5ldyA6OmFuZHJvaWQ6OnNuYXBzaG90OjpTbmFwc2hvdFRlc3RFbnZpcm9ubWVudCgpKTsKICAgICBnZmxhZ3M6OlBhcnNlQ29tbWFuZExpbmVGbGFncygmYXJnYywgJmFyZ3YsIGZhbHNlKTsKIAotICAgIGFuZHJvaWQ6OmJhc2U6OlNldFByb3BlcnR5KCJjdGwuc3RvcCIsICJzbmFwdXNlcmQiKTsKKyAgICBib29sIHZhYl9sZWdhY3kgPSBmYWxzZTsKKyAgICBpZiAoRkxBR1NfZm9yY2VfbW9kZSA9PSAidmFiLWxlZ2FjeSIpIHsKKyAgICAgICAgdmFiX2xlZ2FjeSA9IHRydWU7CisgICAgfQogCi0gICAgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBtb2RlcyA9IHsiIiwgInZhYi1sZWdhY3kiLCAidmFiYy1sZWdhY3kifTsKKyAgICBpZiAoIXZhYl9sZWdhY3kpIHsKKyAgICAgICAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgaWYgdGhlIGNvbmZpZ3VyYXRpb24gd2UncmUgdGVzdGluZyBkb2Vzbid0IG1hdGNoIHRoZSBkZXZpY2UuCisgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlNldFByb3BlcnR5KCJjdGwuc3RvcCIsICJzbmFwdXNlcmQiKTsKKyAgICAgICAgYW5kcm9pZDo6c25hcHNob3Q6OktpbGxTbmFwdXNlcmQoKTsKKyAgICB9CisKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IG1vZGVzID0geyIiLCAidmFiLWxlZ2FjeSJ9OwogICAgIGlmIChtb2Rlcy5jb3VudChGTEFHU19mb3JjZV9tb2RlKSA9PSAwKSB7CiAgICAgICAgIHN0ZDo6Y2VyciA8PCAiVW5leHBlY3RlZCBmb3JjZV9jb25maWcgYXJndW1lbnRcbiI7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KIAotICAgIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IGlmIHRoZSBjb25maWd1cmF0aW9uIHdlJ3JlIHRlc3RpbmcgZG9lc24ndCBtYXRjaCB0aGUgZGV2aWNlLgotICAgIGFuZHJvaWQ6OnNuYXBzaG90OjpLaWxsU25hcHVzZXJkKCk7Ci0KICAgICBpbnQgcmV0ID0gUlVOX0FMTF9URVNUUygpOwogCi0gICAgYW5kcm9pZDo6YmFzZTo6U2V0UHJvcGVydHkoInNuYXB1c2VyZC50ZXN0LmRtLnNuYXBzaG90cyIsICIwIik7CiAgICAgYW5kcm9pZDo6YmFzZTo6U2V0UHJvcGVydHkoInNuYXB1c2VyZC50ZXN0LmlvX3VyaW5nLmZvcmNlX2Rpc2FibGUiLCAiMCIpOwogCi0gICAgYW5kcm9pZDo6c25hcHNob3Q6OktpbGxTbmFwdXNlcmQoKTsKKyAgICBpZiAoIXZhYl9sZWdhY3kpIHsKKyAgICAgICAgYW5kcm9pZDo6c25hcHNob3Q6OktpbGxTbmFwdXNlcmQoKTsKKyAgICB9CiAgICAgcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwc2hvdF93cml0ZXIuY3BwIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXBzaG90X3dyaXRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYTdmZDcuLjAwMDAwMDAKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXBzaG90X3dyaXRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLy8KLS8vIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLy8KLQotI2luY2x1ZGUgPGxpYnNuYXBzaG90L3NuYXBzaG90X3dyaXRlci5oPgotCi0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPHBheWxvYWRfY29uc3VtZXIvZmlsZV9kZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSAic25hcHNob3RfcmVhZGVyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBzbmFwc2hvdCB7Ci0KLXVzaW5nIGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkOwotdXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOwotdXNpbmcgY2hyb21lb3NfdXBkYXRlX2VuZ2luZTo6RmlsZURlc2NyaXB0b3I7Ci0KLUlTbmFwc2hvdFdyaXRlcjo6SVNuYXBzaG90V3JpdGVyKGNvbnN0IENvd09wdGlvbnMmIG9wdGlvbnMpIDogSUNvd1dyaXRlcihvcHRpb25zKSB7fQotCi12b2lkIElTbmFwc2hvdFdyaXRlcjo6U2V0U291cmNlRGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VfZGV2aWNlKSB7Ci0gICAgc291cmNlX2RldmljZV8gPSB7c291cmNlX2RldmljZX07Ci19Ci0KLWJvcnJvd2VkX2ZkIElTbmFwc2hvdFdyaXRlcjo6R2V0U291cmNlRmQoKSB7Ci0gICAgaWYgKCFzb3VyY2VfZGV2aWNlXykgewotICAgICAgICBMT0coRVJST1IpIDw8ICJBdHRlbXB0ZWQgdG8gcmVhZCBmcm9tIHNvdXJjZSBkZXZpY2UgYnV0IG5vbmUgd2FzIHNldCI7Ci0gICAgICAgIHJldHVybiBib3Jyb3dlZF9mZHstMX07Ci0gICAgfQotCi0gICAgaWYgKHNvdXJjZV9mZF8gPCAwKSB7Ci0gICAgICAgIHNvdXJjZV9mZF8ucmVzZXQob3Blbihzb3VyY2VfZGV2aWNlXy0+Y19zdHIoKSwgT19SRE9OTFkgfCBPX0NMT0VYRUMpKTsKLSAgICAgICAgaWYgKHNvdXJjZV9mZF8gPCAwKSB7Ci0gICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAib3BlbiAiIDw8ICpzb3VyY2VfZGV2aWNlXzsKLSAgICAgICAgICAgIHJldHVybiBib3Jyb3dlZF9mZHstMX07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHNvdXJjZV9mZF87Ci19Ci0KLUNvbXByZXNzZWRTbmFwc2hvdFdyaXRlcjo6Q29tcHJlc3NlZFNuYXBzaG90V3JpdGVyKGNvbnN0IENvd09wdGlvbnMmIG9wdGlvbnMpCi0gICAgOiBJU25hcHNob3RXcml0ZXIob3B0aW9ucykge30KLQotYm9vbCBDb21wcmVzc2VkU25hcHNob3RXcml0ZXI6OlNldENvd0RldmljZShhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQmJiBjb3dfZGV2aWNlKSB7Ci0gICAgY293X2RldmljZV8gPSBzdGQ6Om1vdmUoY293X2RldmljZSk7Ci0gICAgY293XyA9IHN0ZDo6bWFrZV91bmlxdWU8Q293V3JpdGVyPihvcHRpb25zXyk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ29tcHJlc3NlZFNuYXBzaG90V3JpdGVyOjpGaW5hbGl6ZSgpIHsKLSAgICByZXR1cm4gY293Xy0+RmluYWxpemUoKTsKLX0KLQotdWludDY0X3QgQ29tcHJlc3NlZFNuYXBzaG90V3JpdGVyOjpHZXRDb3dTaXplKCkgewotICAgIHJldHVybiBjb3dfLT5HZXRDb3dTaXplKCk7Ci19Ci0KLXN0ZDo6dW5pcXVlX3B0cjxDb3dSZWFkZXI+IENvbXByZXNzZWRTbmFwc2hvdFdyaXRlcjo6T3BlbkNvd1JlYWRlcigpIGNvbnN0IHsKLSAgICB1bmlxdWVfZmQgY293X2ZkKGR1cChjb3dfZGV2aWNlXy5nZXQoKSkpOwotICAgIGlmIChjb3dfZmQgPCAwKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJkdXAgQ09XIGRldmljZSI7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLQotICAgIGF1dG8gY293ID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dSZWFkZXI+KCk7Ci0gICAgaWYgKCFjb3ctPlBhcnNlKHN0ZDo6bW92ZShjb3dfZmQpKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gcmVhZCBDT1ciOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gICAgcmV0dXJuIGNvdzsKLX0KLQotYm9vbCBDb21wcmVzc2VkU25hcHNob3RXcml0ZXI6OlZlcmlmeU1lcmdlT3BzKCkgY29uc3Qgbm9leGNlcHQgewotICAgIGF1dG8gY293X3JlYWRlciA9IE9wZW5Db3dSZWFkZXIoKTsKLSAgICBpZiAoY293X3JlYWRlciA9PSBudWxscHRyKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkNvdWxkbid0IG9wZW4gQ293UmVhZGVyIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gY293X3JlYWRlci0+VmVyaWZ5TWVyZ2VPcHMoKTsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPEZpbGVEZXNjcmlwdG9yPiBDb21wcmVzc2VkU25hcHNob3RXcml0ZXI6Ok9wZW5SZWFkZXIoKSB7Ci0gICAgYXV0byBjb3cgPSBPcGVuQ293UmVhZGVyKCk7Ci0gICAgaWYgKGNvdyA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLQotICAgIGF1dG8gcmVhZGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDb21wcmVzc2VkU25hcHNob3RSZWFkZXI+KCk7Ci0gICAgaWYgKCFyZWFkZXItPlNldENvdyhzdGQ6Om1vdmUoY293KSkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIGluaXRpYWxpemUgQ09XIHJlYWRlciI7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLSAgICBpZiAoc291cmNlX2RldmljZV8pIHsKLSAgICAgICAgcmVhZGVyLT5TZXRTb3VyY2VEZXZpY2UoKnNvdXJjZV9kZXZpY2VfKTsKLSAgICB9Ci0KLSAgICBjb25zdCBhdXRvJiBjb3dfb3B0aW9ucyA9IG9wdGlvbnMoKTsKLSAgICBpZiAoY293X29wdGlvbnMubWF4X2Jsb2NrcykgewotICAgICAgICByZWFkZXItPlNldEJsb2NrRGV2aWNlU2l6ZSgqY293X29wdGlvbnMubWF4X2Jsb2NrcyAqIGNvd19vcHRpb25zLmJsb2NrX3NpemUpOwotICAgIH0KLQotICAgIHJldHVybiByZWFkZXI7Ci19Ci0KLWJvb2wgQ29tcHJlc3NlZFNuYXBzaG90V3JpdGVyOjpFbWl0Q29weSh1aW50NjRfdCBuZXdfYmxvY2ssIHVpbnQ2NF90IG9sZF9ibG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBudW1fYmxvY2tzKSB7Ci0gICAgcmV0dXJuIGNvd18tPkFkZENvcHkobmV3X2Jsb2NrLCBvbGRfYmxvY2ssIG51bV9ibG9ja3MpOwotfQotCi1ib29sIENvbXByZXNzZWRTbmFwc2hvdFdyaXRlcjo6RW1pdFJhd0Jsb2Nrcyh1aW50NjRfdCBuZXdfYmxvY2tfc3RhcnQsIGNvbnN0IHZvaWQqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgewotICAgIHJldHVybiBjb3dfLT5BZGRSYXdCbG9ja3MobmV3X2Jsb2NrX3N0YXJ0LCBkYXRhLCBzaXplKTsKLX0KLQotYm9vbCBDb21wcmVzc2VkU25hcHNob3RXcml0ZXI6OkVtaXRYb3JCbG9ja3ModWludDMyX3QgbmV3X2Jsb2NrX3N0YXJ0LCBjb25zdCB2b2lkKiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsIHVpbnQzMl90IG9sZF9ibG9jaywgdWludDE2X3Qgb2Zmc2V0KSB7Ci0gICAgcmV0dXJuIGNvd18tPkFkZFhvckJsb2NrcyhuZXdfYmxvY2tfc3RhcnQsIGRhdGEsIHNpemUsIG9sZF9ibG9jaywgb2Zmc2V0KTsKLX0KLQotYm9vbCBDb21wcmVzc2VkU25hcHNob3RXcml0ZXI6OkVtaXRaZXJvQmxvY2tzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgdWludDY0X3QgbnVtX2Jsb2NrcykgewotICAgIHJldHVybiBjb3dfLT5BZGRaZXJvQmxvY2tzKG5ld19ibG9ja19zdGFydCwgbnVtX2Jsb2Nrcyk7Ci19Ci0KLWJvb2wgQ29tcHJlc3NlZFNuYXBzaG90V3JpdGVyOjpFbWl0TGFiZWwodWludDY0X3QgbGFiZWwpIHsKLSAgICByZXR1cm4gY293Xy0+QWRkTGFiZWwobGFiZWwpOwotfQotCi1ib29sIENvbXByZXNzZWRTbmFwc2hvdFdyaXRlcjo6RW1pdFNlcXVlbmNlRGF0YShzaXplX3QgbnVtX29wcywgY29uc3QgdWludDMyX3QqIGRhdGEpIHsKLSAgICByZXR1cm4gY293Xy0+QWRkU2VxdWVuY2VEYXRhKG51bV9vcHMsIGRhdGEpOwotfQotCi1ib29sIENvbXByZXNzZWRTbmFwc2hvdFdyaXRlcjo6SW5pdGlhbGl6ZSgpIHsKLSAgICByZXR1cm4gY293Xy0+SW5pdGlhbGl6ZShjb3dfZGV2aWNlXyk7Ci19Ci0KLWJvb2wgQ29tcHJlc3NlZFNuYXBzaG90V3JpdGVyOjpJbml0aWFsaXplQXBwZW5kKHVpbnQ2NF90IGxhYmVsKSB7Ci0gICAgcmV0dXJuIGNvd18tPkluaXRpYWxpemVBcHBlbmQoY293X2RldmljZV8sIGxhYmVsKTsKLX0KLQotT25saW5lS2VybmVsU25hcHNob3RXcml0ZXI6Ok9ubGluZUtlcm5lbFNuYXBzaG90V3JpdGVyKGNvbnN0IENvd09wdGlvbnMmIG9wdGlvbnMpCi0gICAgOiBJU25hcHNob3RXcml0ZXIob3B0aW9ucykge30KLQotdm9pZCBPbmxpbmVLZXJuZWxTbmFwc2hvdFdyaXRlcjo6U2V0U25hcHNob3REZXZpY2UoYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkJiYgc25hcHNob3RfZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBjb3dfc2l6ZSkgewotICAgIHNuYXBzaG90X2ZkXyA9IHN0ZDo6bW92ZShzbmFwc2hvdF9mZCk7Ci0gICAgY293X3NpemVfID0gY293X3NpemU7Ci19Ci0KLWJvb2wgT25saW5lS2VybmVsU25hcHNob3RXcml0ZXI6OkZpbmFsaXplKCkgewotICAgIGlmIChmc3luYyhzbmFwc2hvdF9mZF8uZ2V0KCkpIDwgMCkgewotICAgICAgICBQTE9HKEVSUk9SKSA8PCAiZnN5bmMiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIE9ubGluZUtlcm5lbFNuYXBzaG90V3JpdGVyOjpFbWl0UmF3QmxvY2tzKHVpbnQ2NF90IG5ld19ibG9ja19zdGFydCwgY29uc3Qgdm9pZCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpIHsKLSAgICB1aW50NjRfdCBvZmZzZXQgPSBuZXdfYmxvY2tfc3RhcnQgKiBvcHRpb25zXy5ibG9ja19zaXplOwotICAgIGlmIChsc2VlayhzbmFwc2hvdF9mZF8uZ2V0KCksIG9mZnNldCwgU0VFS19TRVQpIDwgMCkgewotICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRW1pdFJhd0Jsb2NrcyBsc2VlayB0byBvZmZzZXQgIiA8PCBvZmZzZXQ7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpXcml0ZUZ1bGx5KHNuYXBzaG90X2ZkXywgZGF0YSwgc2l6ZSkpIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgIkVtaXRSYXdCbG9ja3Mgd3JpdGUiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIE9ubGluZUtlcm5lbFNuYXBzaG90V3JpdGVyOjpFbWl0WG9yQmxvY2tzKHVpbnQzMl90LCBjb25zdCB2b2lkKiwgc2l6ZV90LCB1aW50MzJfdCwgdWludDE2X3QpIHsKLSAgICBMT0coRVJST1IpIDw8ICJFbWl0WG9yQmxvY2tzIG5vdCBpbXBsZW1lbnRlZC4iOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBPbmxpbmVLZXJuZWxTbmFwc2hvdFdyaXRlcjo6RW1pdFplcm9CbG9ja3ModWludDY0X3QgbmV3X2Jsb2NrX3N0YXJ0LCB1aW50NjRfdCBudW1fYmxvY2tzKSB7Ci0gICAgc3RkOjpzdHJpbmcgemVyb2VzKG9wdGlvbnNfLmJsb2NrX3NpemUsIDApOwotICAgIGZvciAodWludDY0X3QgaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspIHsKLSAgICAgICAgaWYgKCFFbWl0UmF3QmxvY2tzKG5ld19ibG9ja19zdGFydCArIGksIHplcm9lcy5kYXRhKCksIHplcm9lcy5zaXplKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgT25saW5lS2VybmVsU25hcHNob3RXcml0ZXI6OkVtaXRDb3B5KHVpbnQ2NF90IG5ld19ibG9jaywgdWludDY0X3Qgb2xkX2Jsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgbnVtX2Jsb2NrcykgewotICAgIGF1dG8gc291cmNlX2ZkID0gR2V0U291cmNlRmQoKTsKLSAgICBpZiAoc291cmNlX2ZkIDwgMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQ0hFQ0sobnVtX2Jsb2NrcyAhPSAwKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtX2Jsb2NrczsgaSsrKSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGJ1ZmZlcihvcHRpb25zXy5ibG9ja19zaXplLCAwKTsKLSAgICAgICAgdWludDY0X3Qgb2Zmc2V0ID0gKG9sZF9ibG9jayArIGkpICogb3B0aW9uc18uYmxvY2tfc2l6ZTsKLSAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHlBdE9mZnNldChzb3VyY2VfZmQsIGJ1ZmZlci5kYXRhKCksIGJ1ZmZlci5zaXplKCksIG9mZnNldCkpIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJFbWl0Q29weSByZWFkIjsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIUVtaXRSYXdCbG9ja3MobmV3X2Jsb2NrICsgaSwgYnVmZmVyLmRhdGEoKSwgYnVmZmVyLnNpemUoKSkpIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJFbWl0UmF3QmxvY2tzIGZhaWxlZCI7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBPbmxpbmVLZXJuZWxTbmFwc2hvdFdyaXRlcjo6RW1pdExhYmVsKHVpbnQ2NF90KSB7Ci0gICAgLy8gTm90IE5lZWRlZAotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIE9ubGluZUtlcm5lbFNuYXBzaG90V3JpdGVyOjpFbWl0U2VxdWVuY2VEYXRhKHNpemVfdCwgY29uc3QgdWludDMyX3QqKSB7Ci0gICAgLy8gTm90IE5lZWRlZAotICAgIHJldHVybiB0cnVlOwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8RmlsZURlc2NyaXB0b3I+IE9ubGluZUtlcm5lbFNuYXBzaG90V3JpdGVyOjpPcGVuUmVhZGVyKCkgewotICAgIHVuaXF1ZV9mZCBmZChkdXAoc25hcHNob3RfZmRfLmdldCgpKSk7Ci0gICAgaWYgKGZkIDwgMCkgewotICAgICAgICBQTE9HKEVSUk9SKSA8PCAiZHVwMiBmYWlsZWQgaW4gT3BlblJlYWRlciI7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLSAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxSZWFkRmRGaWxlRGVzY3JpcHRvcj4oc3RkOjptb3ZlKGZkKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwc2hvdF93cml0ZXJfdGVzdC5jcHAgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHNob3Rfd3JpdGVyX3Rlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDM2MzJiLi4wMDAwMDAwCi0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwc2hvdF93cml0ZXJfdGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLwotLy8gQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0vLwotCi0jaW5jbHVkZSA8bGlic25hcHNob3Qvc25hcHNob3QuaD4KLQotI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+Ci0KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8bGlic25hcHNob3Qvc25hcHNob3Rfd3JpdGVyLmg+Ci0jaW5jbHVkZSA8cGF5bG9hZF9jb25zdW1lci9maWxlX2Rlc2NyaXB0b3IuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQ6OnNuYXBzaG90IHsKLWNsYXNzIENvbXByZXNzZWRTbmFwc2hvdFdyaXRlclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSAgcHVibGljOgotICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IEJMT0NLX1NJWkUgPSA0MDk2OwotfTsKLQotVEVTVF9GKENvbXByZXNzZWRTbmFwc2hvdFdyaXRlclRlc3QsIFJlYWRBZnRlcldyaXRlKSB7Ci0gICAgVGVtcG9yYXJ5RmlsZSBjb3dfZGV2aWNlX2ZpbGV7fTsKLSAgICBhbmRyb2lkOjpzbmFwc2hvdDo6Q293T3B0aW9ucyBvcHRpb25zey5ibG9ja19zaXplID0gQkxPQ0tfU0laRX07Ci0gICAgYW5kcm9pZDo6c25hcHNob3Q6OkNvbXByZXNzZWRTbmFwc2hvdFdyaXRlciBzbmFwc2hvdF93cml0ZXJ7b3B0aW9uc307Ci0gICAgQVNTRVJUX1RSVUUoc25hcHNob3Rfd3JpdGVyLlNldENvd0RldmljZShhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmR7Y293X2RldmljZV9maWxlLmZkfSkpOwotICAgIEFTU0VSVF9UUlVFKHNuYXBzaG90X3dyaXRlci5Jbml0aWFsaXplKCkpOwotICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+IGJ1ZmZlcjsKLSAgICBidWZmZXIucmVzaXplKEJMT0NLX1NJWkUpOwotICAgIHN0ZDo6ZmlsbChidWZmZXIuYmVnaW4oKSwgYnVmZmVyLmVuZCgpLCAxMjMpOwotCi0gICAgQVNTRVJUX1RSVUUoc25hcHNob3Rfd3JpdGVyLkFkZFJhd0Jsb2NrcygwLCBidWZmZXIuZGF0YSgpLCBidWZmZXIuc2l6ZSgpKSk7Ci0gICAgQVNTRVJUX1RSVUUoc25hcHNob3Rfd3JpdGVyLkZpbmFsaXplKCkpOwotICAgIGF1dG8gY293X3JlYWRlciA9IHNuYXBzaG90X3dyaXRlci5PcGVuUmVhZGVyKCk7Ci0gICAgQVNTRVJUX05FKGNvd19yZWFkZXIsIG51bGxwdHIpOwotICAgIEFTU0VSVF9UUlVFKHNuYXBzaG90X3dyaXRlci5BZGRSYXdCbG9ja3MoMSwgYnVmZmVyLmRhdGEoKSwgYnVmZmVyLnNpemUoKSkpOwotICAgIEFTU0VSVF9UUlVFKHNuYXBzaG90X3dyaXRlci5BZGRSYXdCbG9ja3MoMiwgYnVmZmVyLmRhdGEoKSwgYnVmZmVyLnNpemUoKSkpOwotICAgIEFTU0VSVF9UUlVFKHNuYXBzaG90X3dyaXRlci5GaW5hbGl6ZSgpKTsKLSAgICAvLyBBZnRlciB3cmlnaW4gc29tZSBkYXRhLCBpZiB3ZSBjYWxsIE9wZW5SZWFkZXIoKSBhZ2Fpbiwgd3JpdGVzIHNob3VsZAotICAgIC8vIGJlIHZpc2libGUgdG8gdGhlIG5ld2x5IG9wZW5lZCByZWFkZXIuIHVwZGF0ZV9lbmdpbmUgcmVsaWVzIG9uIHRoaXMKLSAgICAvLyBiZWhhdmlvciBmb3IgdmVyaXR5IHdyaXRlcy4KLSAgICBjb3dfcmVhZGVyID0gc25hcHNob3Rfd3JpdGVyLk9wZW5SZWFkZXIoKTsKLSAgICBBU1NFUlRfTkUoY293X3JlYWRlciwgbnVsbHB0cik7Ci0gICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4gcmVhZF9iYWNrOwotICAgIHJlYWRfYmFjay5yZXNpemUoYnVmZmVyLnNpemUoKSk7Ci0gICAgY293X3JlYWRlci0+U2VlayhCTE9DS19TSVpFLCBTRUVLX1NFVCk7Ci0gICAgY29uc3QgYXV0byBieXRlc19yZWFkID0gY293X3JlYWRlci0+UmVhZChyZWFkX2JhY2suZGF0YSgpLCByZWFkX2JhY2suc2l6ZSgpKTsKLSAgICBBU1NFUlRfRVEoKHNpemVfdCkoYnl0ZXNfcmVhZCksIEJMT0NLX1NJWkUpOwotICAgIEFTU0VSVF9FUShyZWFkX2JhY2ssIGJ1ZmZlcik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkOjpzbmFwc2hvdApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXBzaG90Y3RsLmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwc2hvdGN0bC5jcHAKaW5kZXggYWQzZjgzYy4uNDZkZTk5MSAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXBzaG90Y3RsLmNwcAorKysgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHNob3RjdGwuY3BwCkBAIC0xNSwxNiArMTUsMjcgQEAKIC8vCiAKICNpbmNsdWRlIDxzeXNleGl0cy5oPgotCisjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPGZpbGVzeXN0ZW0+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxmdXR1cmU+CiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8dGhyZWFkPgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9jaHJvbm9fdXRpbHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcGFyc2VpbnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zY29wZWd1YXJkLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CisKICNpbmNsdWRlIDxmc19tZ3IuaD4KICNpbmNsdWRlIDxmc19tZ3JfZG1fbGluZWFyLmg+CiAjaW5jbHVkZSA8ZnN0YWIvZnN0YWIuaD4KQEAgLTMzLDYgKzQ0LDkgQEAKICNpbmNsdWRlIDxsaWJzbmFwc2hvdC9zbmFwc2hvdC5oPgogI2luY2x1ZGUgPHN0b3JhZ2VfbGl0ZXJhbHMvc3RvcmFnZV9saXRlcmFscy5oPgogCisjaW5jbHVkZSAicGFydGl0aW9uX2Nvd19jcmVhdG9yLmgiCisjaW5jbHVkZSAic2NyYXRjaF9zdXBlci5oIgorCiAjaWZkZWYgU05BUFNIT1RDVExfVVNFUkRFQlVHX09SX0VORwogI2luY2x1ZGUgPEJvb3RDb250cm9sQ2xpZW50Lmg+CiAjZW5kaWYKQEAgLTQwLDYgKzU0LDExIEBACiB1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7CiB1c2luZyBuYW1lc3BhY2Ugc3RkOjpzdHJpbmdfbGl0ZXJhbHM7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6c3RvcmFnZV9saXRlcmFsczsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OkxvZ2RMb2dnZXI7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpTdGRlcnJMb2dnZXI7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpUZWVMb2dnZXI7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6ZG07Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6ZnNfbWdyOwogdXNpbmcgYW5kcm9pZDo6ZnNfbWdyOjpDcmVhdGVMb2dpY2FsUGFydGl0aW9uUGFyYW1zOwogdXNpbmcgYW5kcm9pZDo6ZnNfbWdyOjpGaW5kUGFydGl0aW9uOwogdXNpbmcgYW5kcm9pZDo6ZnNfbWdyOjpHZXRQYXJ0aXRpb25TaXplOwpAQCAtNTYsMzYgKzc1LDYzMCBAQAogICAgICAgICAgICAgICAgICAiICBtZXJnZVxuIgogICAgICAgICAgICAgICAgICAiICAgIERlcHJlY2F0ZWQuXG4iCiAgICAgICAgICAgICAgICAgICIgIG1hcFxuIgotICAgICAgICAgICAgICAgICAiICAgIE1hcCBhbGwgcGFydGl0aW9ucyBhdCAvZGV2L2Jsb2NrL21hcHBlclxuIjsKKyAgICAgICAgICAgICAgICAgIiAgICBNYXAgYWxsIHBhcnRpdGlvbnMgYXQgL2Rldi9ibG9jay9tYXBwZXJcbiIKKyAgICAgICAgICAgICAgICAgIiAgbWFwLXNuYXBzaG90cyA8ZGlyZWN0b3J5IHdoZXJlIHNuYXBzaG90IHBhdGNoZXMgYXJlIHByZXNlbnQ+XG4iCisgICAgICAgICAgICAgICAgICIgICAgTWFwIGFsbCBzbmFwc2hvdHMgYmFzZWQgb24gcGF0Y2hlcyBwcmVzZW50IGluIHRoZSBkaXJlY3RvcnlcbiIKKyAgICAgICAgICAgICAgICAgIiAgdW5tYXAtc25hcHNob3RzXG4iCisgICAgICAgICAgICAgICAgICIgICAgVW5tYXAgYWxsIHByZS1jcmVhdGVkIHNuYXBzaG90c1xuIgorICAgICAgICAgICAgICAgICAiICBkZWxldGUtc25hcHNob3RzXG4iCisgICAgICAgICAgICAgICAgICIgICAgRGVsZXRlIGFsbCBwcmUtY3JlYXRlZCBzbmFwc2hvdHNcbiIKKyAgICAgICAgICAgICAgICAgIiAgcmV2ZXJ0LXNuYXBzaG90c1xuIgorICAgICAgICAgICAgICAgICAiICAgIFByZXBhcmVzIGRldmljZXMgdG8gYm9vdCB3aXRob3V0IHNuYXBzaG90cyBvbiBuZXh0IGJvb3QuXG4iCisgICAgICAgICAgICAgICAgICIgICAgVGhpcyBkb2VzIG5vdCBkZWxldGUgdGhlIHNuYXBzaG90LiBJdCBvbmx5IHJlbW92ZXMgdGhlIGluZGljYXRvcnNcbiIKKyAgICAgICAgICAgICAgICAgIiAgICBzbyB0aGF0IGZpcnN0IHN0YWdlIGluaXQgd2lsbCBub3QgbW91bnQgZnJvbSBzbmFwc2hvdHMuXG4iCisgICAgICAgICAgICAgICAgICIgIGFwcGx5LXVwZGF0ZVxuIgorICAgICAgICAgICAgICAgICAiICAgIEFwcGx5IHRoZSBpbmNyZW1lbnRhbCBPVEEgdXBkYXRlIHdoZXJlaW4gdGhlIHNuYXBzaG90cyBhcmVcbiIKKyAgICAgICAgICAgICAgICAgIiAgICBkaXJlY3RseSB3cml0dGVuIHRvIENPVyBibG9jayBkZXZpY2UuIFRoaXMgd2lsbCBieXBhc3MgdXBkYXRlLWVuZ2luZVxuIgorICAgICAgICAgICAgICAgICAiICAgIGFuZCB0aGUgZGV2aWNlIHdpbGwgYmUgcmVhZHkgdG8gYm9vdCBmcm9tIHRoZSB0YXJnZXQgYnVpbGQuXG4iOwogICAgIHJldHVybiBFWF9VU0FHRTsKIH0KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHNuYXBzaG90IHsKIAorI2lmZGVmIFNOQVBTSE9UQ1RMX1VTRVJERUJVR19PUl9FTkcKK2NsYXNzIE1hcFNuYXBzaG90cyB7CisgIHB1YmxpYzoKKyAgICBNYXBTbmFwc2hvdHMoc3RkOjpzdHJpbmcgcGF0aCA9ICIiLCBib29sIG1ldGFkYXRhX3N1cGVyID0gZmFsc2UpOworICAgIGJvb2wgQ3JlYXRlU25hcHNob3REZXZpY2Uoc3RkOjpzdHJpbmcmIHBhcnRpdGlvbl9uYW1lLCBzdGQ6OnN0cmluZyYgcGF0Y2gpOworICAgIGJvb2wgSW5pdGlhdGVUaHJlYWRlZFNuYXBzaG90V3JpdGUoc3RkOjpzdHJpbmcmIHBuYW1lLCBzdGQ6OnN0cmluZyYgc25hcHNob3RfcGF0Y2gpOworICAgIGJvb2wgRmluaXNoU25hcHNob3RXcml0ZXMoKTsKKyAgICBib29sIFVubWFwQ293SW1hZ2VQYXRoKHN0ZDo6c3RyaW5nJiBuYW1lKTsKKyAgICBib29sIERlbGV0ZVNuYXBzaG90cygpOworICAgIGJvb2wgQ2xlYW51cFNuYXBzaG90KCk7CisgICAgYm9vbCBCZWdpblVwZGF0ZSgpOworICAgIGJvb2wgQXBwbHlVcGRhdGUoKTsKKworICBwcml2YXRlOgorICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IEdldENvd0ltYWdlUGF0aChzdGQ6OnN0cmluZyYgbmFtZSk7CisgICAgYm9vbCBQcmVwYXJlVXBkYXRlKCk7CisgICAgYm9vbCBHZXRDb3dEZXZpY2VQYXRoKHN0ZDo6c3RyaW5nIHBhcnRpdGlvbl9uYW1lLCBzdGQ6OnN0cmluZyogY293X3BhdGgpOworICAgIGJvb2wgV3JpdGVTbmFwc2hvdFBhdGNoKHN0ZDo6c3RyaW5nIGNvd19kZXZpY2UsIHN0ZDo6c3RyaW5nIHBhdGNoKTsKKyAgICBzdGQ6OnN0cmluZyBHZXRHcm91cE5hbWUoY29uc3QgYW5kcm9pZDo6ZnNfbWdyOjpMcE1ldGFkYXRhJiBwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhcnRpdG9uX25hbWUpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdE1hbmFnZXI6OkxvY2tlZEZpbGU+IGxvY2tfOworICAgIHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdE1hbmFnZXI+IHNtXzsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OmZ1dHVyZTxib29sPj4gdGhyZWFkc187CisgICAgc3RkOjpzdHJpbmcgc25hcHNob3RfZGlyX3BhdGhfOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgY2hyb21lb3NfdXBkYXRlX2VuZ2luZTo6RHluYW1pY1BhcnRpdGlvbkdyb3VwKj4gZ3JvdXBfbWFwXzsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwYXRjaGZpbGVzXzsKKyAgICBjaHJvbWVvc191cGRhdGVfZW5naW5lOjpEZWx0YUFyY2hpdmVNYW5pZmVzdCBtYW5pZmVzdF87CisgICAgYm9vbCBtZXRhZGF0YV9zdXBlcl8gPSBmYWxzZTsKK307CisKK01hcFNuYXBzaG90czo6TWFwU25hcHNob3RzKHN0ZDo6c3RyaW5nIHBhdGgsIGJvb2wgbWV0YWRhdGFfc3VwZXIpIHsKKyAgICBzbmFwc2hvdF9kaXJfcGF0aF8gPSBwYXRoICsgIi8iOworICAgIG1ldGFkYXRhX3N1cGVyXyA9IG1ldGFkYXRhX3N1cGVyOworfQorCitzdGQ6OnN0cmluZyBNYXBTbmFwc2hvdHM6OkdldEdyb3VwTmFtZShjb25zdCBhbmRyb2lkOjpmc19tZ3I6OkxwTWV0YWRhdGEmIHB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhcnRpdGlvbl9uYW1lKSB7CisgICAgc3RkOjpzdHJpbmcgZ3JvdXBfbmFtZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHBhcnRpdGlvbiA6IHB0LnBhcnRpdGlvbnMpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGFuZHJvaWQ6OmZzX21ncjo6R2V0UGFydGl0aW9uTmFtZShwYXJ0aXRpb24pOworICAgICAgICBhdXRvIHN1ZmZpeCA9IGFuZHJvaWQ6OmZzX21ncjo6R2V0UGFydGl0aW9uU2xvdFN1ZmZpeChuYW1lKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgcG5hbWUgPSBuYW1lLnN1YnN0cigwLCBuYW1lLnNpemUoKSAtIHN1ZmZpeC5zaXplKCkpOworICAgICAgICBpZiAocG5hbWUgPT0gcGFydGl0aW9uX25hbWUpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGdyb3VwX25hbWUgPQorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpmc19tZ3I6OkdldFBhcnRpdGlvbkdyb3VwTmFtZShwdC5ncm91cHNbcGFydGl0aW9uLmdyb3VwX2luZGV4XSk7CisgICAgICAgICAgICByZXR1cm4gZ3JvdXBfbmFtZS5zdWJzdHIoMCwgZ3JvdXBfbmFtZS5zaXplKCkgLSBzdWZmaXguc2l6ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gIiI7Cit9CisKK2Jvb2wgTWFwU25hcHNob3RzOjpQcmVwYXJlVXBkYXRlKCkgeworICAgIGlmIChtZXRhZGF0YV9zdXBlcl8gJiYgIUNyZWF0ZVNjcmF0Y2hPdGFNZXRhZGF0YU9uU3VwZXIoKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIE9UQSBtZXRhZGF0YSBvbiBzdXBlciI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc21fID0gU25hcHNob3RNYW5hZ2VyOjpOZXcoKTsKKworICAgIGF1dG8gc291cmNlX3Nsb3QgPSBmc19tZ3JfZ2V0X3Nsb3Rfc3VmZml4KCk7CisgICAgYXV0byBzb3VyY2Vfc2xvdF9udW1iZXIgPSBTbG90TnVtYmVyRm9yU2xvdFN1ZmZpeChzb3VyY2Vfc2xvdCk7CisgICAgYXV0byBzdXBlcl9zb3VyY2UgPSBmc19tZ3JfZ2V0X3N1cGVyX3BhcnRpdGlvbl9uYW1lKHNvdXJjZV9zbG90X251bWJlcik7CisKKyAgICAvLyBHZXQgY3VycmVudCBwYXJ0aXRpb24gaW5mb3JtYXRpb24uCisgICAgUGFydGl0aW9uT3BlbmVyIG9wZW5lcjsKKyAgICBhdXRvIHNvdXJjZV9tZXRhZGF0YSA9IFJlYWRNZXRhZGF0YShvcGVuZXIsIHN1cGVyX3NvdXJjZSwgc291cmNlX3Nsb3RfbnVtYmVyKTsKKyAgICBpZiAoIXNvdXJjZV9tZXRhZGF0YSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgcmVhZCBzb3VyY2UgcGFydGl0aW9uIG1ldGFkYXRhLlxuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGF1dG8gZGFwID0gbWFuaWZlc3RfLm11dGFibGVfZHluYW1pY19wYXJ0aXRpb25fbWV0YWRhdGEoKTsKKyAgICBkYXAtPnNldF9zbmFwc2hvdF9lbmFibGVkKHRydWUpOworICAgIGRhcC0+c2V0X3ZhYmNfZW5hYmxlZCh0cnVlKTsKKyAgICBkYXAtPnNldF92YWJjX2NvbXByZXNzaW9uX3BhcmFtKCJsejQiKTsKKyAgICBkYXAtPnNldF9jb3dfdmVyc2lvbigzKTsKKworICAgIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBzdGQ6OmZpbGVzeXN0ZW06OmRpcmVjdG9yeV9pdGVyYXRvcihzbmFwc2hvdF9kaXJfcGF0aF8pKSB7CisgICAgICAgIGlmIChhbmRyb2lkOjpiYXNlOjpFbmRzV2l0aChlbnRyeS5wYXRoKCkuZ2VuZXJpY19zdHJpbmcoKSwgIi5wYXRjaCIpKSB7CisgICAgICAgICAgICBwYXRjaGZpbGVzXy5wdXNoX2JhY2soYW5kcm9pZDo6YmFzZTo6QmFzZW5hbWUoZW50cnkucGF0aCgpLmdlbmVyaWNfc3RyaW5nKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byYgcGF0Y2hmaWxlIDogcGF0Y2hmaWxlc18pIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgcGFyc2luZ19maWxlID0gc25hcHNob3RfZGlyX3BhdGhfICsgcGF0Y2hmaWxlOworICAgICAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgZmQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4ocGFyc2luZ19maWxlLmNfc3RyKCksIE9fUkRPTkxZKSkpOworICAgICAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gb3BlbiBmaWxlOiAiIDw8IHBhcnNpbmdfZmlsZTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB1aW50NjRfdCBkZXZfc3ogPSBsc2VlayhmZC5nZXQoKSwgMCwgU0VFS19FTkQpOworICAgICAgICBpZiAoIWRldl9zeikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IGRldGVybWluZSBibG9jayBkZXZpY2Ugc2l6ZTogIiA8PCBwYXJzaW5nX2ZpbGU7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBpbnQgYmxvY2tfc3ogPSA0X0tpQjsKKyAgICAgICAgZGV2X3N6ICs9IGJsb2NrX3N6IC0gMTsKKyAgICAgICAgZGV2X3N6ICY9IH4oYmxvY2tfc3ogLSAxKTsKKworICAgICAgICBhdXRvIG5wb3MgPSBwYXRjaGZpbGUucmZpbmQoIi5wYXRjaCIpOworICAgICAgICBhdXRvIHBhcnRpdGlvbl9uYW1lID0gcGF0Y2hmaWxlLnN1YnN0cigwLCBucG9zKTsKKworICAgICAgICBjaHJvbWVvc191cGRhdGVfZW5naW5lOjpEeW5hbWljUGFydGl0aW9uR3JvdXAqIGdyb3VwID0gbnVsbHB0cjsKKyAgICAgICAgc3RkOjpzdHJpbmcgZ3JvdXBfbmFtZSA9IEdldEdyb3VwTmFtZSgqc291cmNlX21ldGFkYXRhLmdldCgpLCBwYXJ0aXRpb25fbmFtZSk7CisgICAgICAgIGlmIChncm91cF9tYXBfLmZpbmQoZ3JvdXBfbmFtZSkgIT0gZ3JvdXBfbWFwXy5lbmQoKSkgeworICAgICAgICAgICAgZ3JvdXAgPSBncm91cF9tYXBfW2dyb3VwX25hbWVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ3JvdXAgPSBkYXAtPmFkZF9ncm91cHMoKTsKKyAgICAgICAgICAgIGdyb3VwLT5zZXRfbmFtZShncm91cF9uYW1lKTsKKyAgICAgICAgICAgIGdyb3VwX21hcF9bZ3JvdXBfbmFtZV0gPSBncm91cDsKKyAgICAgICAgfQorICAgICAgICBncm91cC0+YWRkX3BhcnRpdGlvbl9uYW1lcyhwYXJ0aXRpb25fbmFtZSk7CisKKyAgICAgICAgYXV0byBwdSA9IG1hbmlmZXN0Xy5tdXRhYmxlX3BhcnRpdGlvbnMoKS0+QWRkKCk7CisgICAgICAgIHB1LT5zZXRfcGFydGl0aW9uX25hbWUocGFydGl0aW9uX25hbWUpOworICAgICAgICBwdS0+c2V0X2VzdGltYXRlX2Nvd19zaXplKGRldl9zeik7CisKKyAgICAgICAgQ293UmVhZGVyIHJlYWRlcjsKKyAgICAgICAgaWYgKCFyZWFkZXIuUGFyc2UoZmQpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDT1cgcmVhZGVyIHBhcnNlIGZhaWxlZCI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB1aW50NjRfdCBuZXdfZGV2aWNlX3NpemUgPSAwOworICAgICAgICBjb25zdCBhdXRvJiBoZWFkZXIgPSByZWFkZXIuR2V0SGVhZGVyKCk7CisgICAgICAgIGlmIChoZWFkZXIucHJlZml4Lm1ham9yX3ZlcnNpb24gPT0gMikgeworICAgICAgICAgICAgc2l6ZV90IG51bV9vcHMgPSByZWFkZXIuZ2V0X251bV90b3RhbF9kYXRhX29wcygpOworICAgICAgICAgICAgbmV3X2RldmljZV9zaXplID0gKG51bV9vcHMgKiBoZWFkZXIuYmxvY2tfc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCBhdXRvJiB2M19oZWFkZXIgPSByZWFkZXIuaGVhZGVyX3YzKCk7CisgICAgICAgICAgICBuZXdfZGV2aWNlX3NpemUgPSB2M19oZWFkZXIub3BfY291bnRfbWF4ICogdjNfaGVhZGVyLmJsb2NrX3NpemU7CisgICAgICAgIH0KKworICAgICAgICBMT0coSU5GTykgPDwgIlBhcnRpdGlvbjogIiA8PCBwYXJ0aXRpb25fbmFtZSA8PCAiIEdyb3VwX25hbWU6ICIgPDwgZ3JvdXBfbmFtZQorICAgICAgICAgICAgICAgICAgPDwgIiBzaXplOiAiIDw8IG5ld19kZXZpY2Vfc2l6ZSA8PCAiIENPVy1zaXplOiAiIDw8IGRldl9zejsKKyAgICAgICAgcHUtPm11dGFibGVfbmV3X3BhcnRpdGlvbl9pbmZvKCktPnNldF9zaXplKG5ld19kZXZpY2Vfc2l6ZSk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIE1hcFNuYXBzaG90czo6R2V0Q293RGV2aWNlUGF0aChzdGQ6OnN0cmluZyBwYXJ0aXRpb25fbmFtZSwgc3RkOjpzdHJpbmcqIGNvd19wYXRoKSB7CisgICAgYXV0byYgZG0gPSBhbmRyb2lkOjpkbTo6RGV2aWNlTWFwcGVyOjpJbnN0YW5jZSgpOworCisgICAgc3RkOjpzdHJpbmcgY293X2RldmljZSA9IHBhcnRpdGlvbl9uYW1lICsgIi1jb3ctaW1nIjsKKyAgICBpZiAobWV0YWRhdGFfc3VwZXJfKSB7CisgICAgICAgIC8vIElmIENPVyBkZXZpY2UgZXhpc3RzIG9uIC9kYXRhLCB0aGVuIGRhdGEgd2lwZSBjYW5ub3QgYmUgZG9uZS4KKyAgICAgICAgaWYgKGRtLkdldERtRGV2aWNlUGF0aEJ5TmFtZShjb3dfZGV2aWNlLCBjb3dfcGF0aCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNPVyBkZXZpY2UgZXhpc3RzIG9uIC9kYXRhOiAiIDw8ICpjb3dfcGF0aDsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvd19kZXZpY2UgPSBwYXJ0aXRpb25fbmFtZSArICItY293IjsKKyAgICBpZiAoZG0uR2V0RG1EZXZpY2VQYXRoQnlOYW1lKGNvd19kZXZpY2UsIGNvd19wYXRoKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBMT0coSU5GTykgPDwgIkZhaWxlZCB0byBmaW5kIGNvdyBwYXRoOiAiIDw8IGNvd19kZXZpY2UgPDwgIiBDaGVja2luZyB0aGUgZGV2aWNlIGZvciAtaW1nIHBhdGgiOworICAgIC8vIElmIHRoZSBDT1cgZGV2aWNlIGV4aXN0cyBvbmx5IG9uIC9kYXRhCisgICAgY293X2RldmljZSA9IHBhcnRpdGlvbl9uYW1lICsgIi1jb3ctaW1nIjsKKyAgICBpZiAoIWRtLkdldERtRGV2aWNlUGF0aEJ5TmFtZShjb3dfZGV2aWNlLCBjb3dfcGF0aCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGNvdyBwYXRoOiAiIDw8IGNvd19kZXZpY2U7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTWFwU25hcHNob3RzOjpBcHBseVVwZGF0ZSgpIHsKKyAgICBpZiAoIVByZXBhcmVVcGRhdGUoKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJQcmVwYXJlVXBkYXRlIGZhaWxlZCI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFzbV8tPkJlZ2luVXBkYXRlKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQmVnaW5VcGRhdGUgZmFpbGVkIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIXNtXy0+Q3JlYXRlVXBkYXRlU25hcHNob3RzKG1hbmlmZXN0XykpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IGFwcGx5IHNuYXBzaG90cyI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBMT0coSU5GTykgPDwgIkNyZWF0ZVVwZGF0ZVNuYXBzaG90cyBzdWNjZXNzIjsKKyAgICBpZiAoIXNtXy0+TWFwQWxsU25hcHNob3RzKDEwcykpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiTWFwQWxsU25hcHNob3RzIGZhaWxlZCI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBMT0coSU5GTykgPDwgIk1hcEFsbFNuYXBzaG90cyBzdWNjZXNzIjsKKworICAgIGF1dG8gdGFyZ2V0X3Nsb3QgPSBmc19tZ3JfZ2V0X290aGVyX3Nsb3Rfc3VmZml4KCk7CisgICAgZm9yIChhdXRvJiBwYXRjaGZpbGUgOiBwYXRjaGZpbGVzXykgeworICAgICAgICBhdXRvIG5wb3MgPSBwYXRjaGZpbGUucmZpbmQoIi5wYXRjaCIpOworICAgICAgICBhdXRvIHBhcnRpdGlvbl9uYW1lID0gcGF0Y2hmaWxlLnN1YnN0cigwLCBucG9zKSArIHRhcmdldF9zbG90OworICAgICAgICBzdGQ6OnN0cmluZyBjb3dfcGF0aDsKKyAgICAgICAgaWYgKCFHZXRDb3dEZXZpY2VQYXRoKHBhcnRpdGlvbl9uYW1lLCAmY293X3BhdGgpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZmluZCBjb3cgcGF0aCI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhyZWFkc18uZW1wbGFjZV9iYWNrKHN0ZDo6YXN5bmMoc3RkOjpsYXVuY2g6OmFzeW5jLCAmTWFwU25hcHNob3RzOjpXcml0ZVNuYXBzaG90UGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIGNvd19wYXRoLCBwYXRjaGZpbGUpKTsKKyAgICB9CisKKyAgICBib29sIHJldCA9IHRydWU7CisgICAgZm9yIChhdXRvJiB0IDogdGhyZWFkc18pIHsKKyAgICAgICAgcmV0ID0gdC5nZXQoKSAmJiByZXQ7CisgICAgfQorICAgIGlmICghcmV0KSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlNuYXBzaG90IHdyaXRlcyBmYWlsZWQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghc21fLT5Vbm1hcEFsbFNuYXBzaG90cygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlVubWFwQWxsU25hcHNob3RzIGZhaWxlZCI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBMT0coSU5GTykgPDwgIlByZS1jcmVhdGVkIHNuYXBzaG90cyBzdWNjZXNzZnVsbHkgY29waWVkIjsKKyAgICAvLyBBbGwgc25hcHNob3RzIGhhdmUgYmVlbiB3cml0dGVuLgorICAgIGlmICghc21fLT5GaW5pc2hlZFNuYXBzaG90V3JpdGVzKGZhbHNlIC8qIHdpcGUgKi8pKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBmaW5hbGl6ZSBzbmFwc2hvdCB3cml0ZXMuXG4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYXV0byBoYWwgPSBoYWw6OkJvb3RDb250cm9sQ2xpZW50OjpXYWl0Rm9yU2VydmljZSgpOworICAgIGlmICghaGFsKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBmaW5kIElCb290Q29udHJvbCBIQUwuXG4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGF1dG8gdGFyZ2V0X3Nsb3RfbnVtYmVyID0gU2xvdE51bWJlckZvclNsb3RTdWZmaXgodGFyZ2V0X3Nsb3QpOworICAgIGF1dG8gY3IgPSBoYWwtPlNldEFjdGl2ZUJvb3RTbG90KHRhcmdldF9zbG90X251bWJlcik7CisgICAgaWYgKCFjci5Jc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IHNldCBhY3RpdmUgYm9vdCBzbG90OiAiIDw8IGNyLmVyck1zZzsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIExPRyhJTkZPKSA8PCAiQXBwbHlVcGRhdGUgc3VjY2VzcyI7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTWFwU25hcHNob3RzOjpCZWdpblVwZGF0ZSgpIHsKKyAgICBpZiAobWV0YWRhdGFfc3VwZXJfICYmICFDcmVhdGVTY3JhdGNoT3RhTWV0YWRhdGFPblN1cGVyKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBPVEEgbWV0YWRhdGEgb24gc3VwZXIiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHNtXyA9IFNuYXBzaG90TWFuYWdlcjo6TmV3KCk7CisKKyAgICBsb2NrXyA9IHNtXy0+TG9ja0V4Y2x1c2l2ZSgpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzbmFwc2hvdHM7CisgICAgc21fLT5MaXN0U25hcHNob3RzKGxvY2tfLmdldCgpLCAmc25hcHNob3RzKTsKKyAgICBpZiAoIXNuYXBzaG90cy5lbXB0eSgpKSB7CisgICAgICAgIC8vIFNuYXBzaG90cyBhcmUgYWxyZWFkeSBwcmVzZW50LgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBsb2NrXyA9IG51bGxwdHI7CisgICAgaWYgKCFzbV8tPkJlZ2luVXBkYXRlKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQmVnaW5VcGRhdGUgZmFpbGVkIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBsb2NrXyA9IHNtXy0+TG9ja0V4Y2x1c2l2ZSgpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE1hcFNuYXBzaG90czo6Q3JlYXRlU25hcHNob3REZXZpY2Uoc3RkOjpzdHJpbmcmIHBhcnRpdGlvbl9uYW1lLCBzdGQ6OnN0cmluZyYgcGF0Y2hmaWxlKSB7CisgICAgc3RkOjpzdHJpbmcgcGFyc2luZ19maWxlID0gc25hcHNob3RfZGlyX3BhdGhfICsgcGF0Y2hmaWxlOworCisgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGZkKFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKHBhcnNpbmdfZmlsZS5jX3N0cigpLCBPX1JET05MWSkpKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBvcGVuIGZpbGU6ICIgPDwgcGFyc2luZ19maWxlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdWludDY0X3QgZGV2X3N6ID0gbHNlZWsoZmQuZ2V0KCksIDAsIFNFRUtfRU5EKTsKKyAgICBpZiAoIWRldl9zeikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgZGV0ZXJtaW5lIGJsb2NrIGRldmljZSBzaXplOiAiIDw8IHBhcnNpbmdfZmlsZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IGludCBibG9ja19zeiA9IDRfS2lCOworICAgIGRldl9zeiArPSBibG9ja19zeiAtIDE7CisgICAgZGV2X3N6ICY9IH4oYmxvY2tfc3ogLSAxKTsKKworICAgIFNuYXBzaG90U3RhdHVzIHN0YXR1czsKKyAgICBzdGF0dXMuc2V0X3N0YXRlKFNuYXBzaG90U3RhdGU6OkNSRUFURUQpOworICAgIHN0YXR1cy5zZXRfdXNpbmdfc25hcHVzZXJkKHRydWUpOworICAgIHN0YXR1cy5zZXRfb2xkX3BhcnRpdGlvbl9zaXplKDApOworICAgIHN0YXR1cy5zZXRfbmFtZShwYXJ0aXRpb25fbmFtZSk7CisgICAgc3RhdHVzLnNldF9jb3dfZmlsZV9zaXplKGRldl9zeik7CisgICAgc3RhdHVzLnNldF9jb3dfcGFydGl0aW9uX3NpemUoMCk7CisKKyAgICBQYXJ0aXRpb25Db3dDcmVhdG9yIGNvd19jcmVhdG9yOworICAgIGNvd19jcmVhdG9yLnVzaW5nX3NuYXB1c2VyZCA9IHRydWU7CisKKyAgICBpZiAoIXNtXy0+Q3JlYXRlU25hcHNob3QobG9ja18uZ2V0KCksICZjb3dfY3JlYXRvciwgJnN0YXR1cykpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ3JlYXRlU25hcHNob3QgZmFpbGVkIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghc21fLT5DcmVhdGVDb3dJbWFnZShsb2NrXy5nZXQoKSwgcGFydGl0aW9uX25hbWUpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNyZWF0ZUNvd0ltYWdlIGZhaWxlZCI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gTWFwU25hcHNob3RzOjpHZXRDb3dJbWFnZVBhdGgoc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgICBhdXRvIGNvd19kZXYgPSBzbV8tPk1hcENvd0ltYWdlKG5hbWUsIDVzKTsKKyAgICBpZiAoIWNvd19kZXYuaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGdldCBDT1cgZGV2aWNlIHBhdGgiOworICAgICAgICByZXR1cm4gc3RkOjpudWxsb3B0OworICAgIH0KKworICAgIExPRyhJTkZPKSA8PCAiQ09XIERldmljZSBwYXRoOiAiIDw8IGNvd19kZXYudmFsdWUoKTsKKyAgICByZXR1cm4gY293X2RldjsKK30KKworYm9vbCBNYXBTbmFwc2hvdHM6OldyaXRlU25hcHNob3RQYXRjaChzdGQ6OnN0cmluZyBjb3dfZGV2aWNlLCBzdGQ6OnN0cmluZyBwYXRjaCkgeworICAgIHN0ZDo6c3RyaW5nIHBhdGNoX2ZpbGUgPSBzbmFwc2hvdF9kaXJfcGF0aF8gKyBwYXRjaDsKKworICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBmZChURU1QX0ZBSUxVUkVfUkVUUlkob3BlbihwYXRjaF9maWxlLmNfc3RyKCksIE9fUkRPTkxZKSkpOworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG9wZW4gZmlsZTogIiA8PCBwYXRjaF9maWxlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdWludDY0X3QgZGV2X3N6ID0gbHNlZWsoZmQuZ2V0KCksIDAsIFNFRUtfRU5EKTsKKyAgICBpZiAoIWRldl9zeikgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIkNvdWxkIG5vdCBkZXRlcm1pbmUgYmxvY2sgZGV2aWNlIHNpemU6ICIgPDwgcGF0Y2hfZmlsZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBjZmQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oY293X2RldmljZS5jX3N0cigpLCBPX1JEV1IpKSk7CisgICAgaWYgKGNmZCA8IDApIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG9wZW4gZmlsZTogIiA8PCBjb3dfZGV2aWNlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3QgdWludDY0X3QgcmVhZF9zeiA9IDFfTWlCOworICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IGJ1ZmZlciA9IHN0ZDo6bWFrZV91bmlxdWU8dWludDhfdFtdPihyZWFkX3N6KTsKKyAgICBvZmZfdCBmaWxlX29mZnNldCA9IDA7CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBzaXplX3QgdG9fcmVhZCA9IHN0ZDo6bWluKChkZXZfc3ogLSBmaWxlX29mZnNldCksIHJlYWRfc3opOworICAgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseUF0T2Zmc2V0KGZkLmdldCgpLCBidWZmZXIuZ2V0KCksIHRvX3JlYWQsIGZpbGVfb2Zmc2V0KSkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIlJlYWRGdWxseUF0T2Zmc2V0IGZhaWxlZCI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OldyaXRlRnVsbHlBdE9mZnNldChjZmQsIGJ1ZmZlci5nZXQoKSwgdG9fcmVhZCwgZmlsZV9vZmZzZXQpKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiV3JpdGVGdWxseUF0T2Zmc2V0IGZhaWxlZCI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmlsZV9vZmZzZXQgKz0gdG9fcmVhZDsKKyAgICAgICAgaWYgKGZpbGVfb2Zmc2V0ID49IGRldl9zeikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGZzeW5jKGNmZC5nZXQoKSkgPCAwKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJGc3luYyBmYWlsZWQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIE1hcFNuYXBzaG90czo6SW5pdGlhdGVUaHJlYWRlZFNuYXBzaG90V3JpdGUoc3RkOjpzdHJpbmcmIHBuYW1lLCBzdGQ6OnN0cmluZyYgc25hcHNob3RfcGF0Y2gpIHsKKyAgICBhdXRvIHBhdGggPSBHZXRDb3dJbWFnZVBhdGgocG5hbWUpOworICAgIGlmICghcGF0aC5oYXNfdmFsdWUoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHRocmVhZHNfLmVtcGxhY2VfYmFjayhzdGQ6OmFzeW5jKHN0ZDo6bGF1bmNoOjphc3luYywgJk1hcFNuYXBzaG90czo6V3JpdGVTbmFwc2hvdFBhdGNoLCB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgudmFsdWUoKSwgc25hcHNob3RfcGF0Y2gpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNYXBTbmFwc2hvdHM6OkZpbmlzaFNuYXBzaG90V3JpdGVzKCkgeworICAgIGJvb2wgcmV0ID0gdHJ1ZTsKKyAgICBmb3IgKGF1dG8mIHQgOiB0aHJlYWRzXykgeworICAgICAgICByZXQgPSB0LmdldCgpICYmIHJldDsKKyAgICB9CisKKyAgICBsb2NrXyA9IG51bGxwdHI7CisgICAgaWYgKHJldCkgeworICAgICAgICBMT0coSU5GTykgPDwgIlByZS1jcmVhdGVkIHNuYXBzaG90cyBzdWNjZXNzZnVsbHkgY29waWVkIjsKKyAgICAgICAgaWYgKCFzbV8tPkZpbmlzaGVkU25hcHNob3RXcml0ZXMoZmFsc2UpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNtXy0+Qm9vdEZyb21TbmFwc2hvdHNXaXRob3V0U2xvdFN3aXRjaCgpOworICAgIH0KKworICAgIExPRyhFUlJPUikgPDwgIlNuYXBzaG90IGNvcHkgZmFpbGVkIjsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgTWFwU25hcHNob3RzOjpVbm1hcENvd0ltYWdlUGF0aChzdGQ6OnN0cmluZyYgbmFtZSkgeworICAgIHNtXyA9IFNuYXBzaG90TWFuYWdlcjo6TmV3KCk7CisgICAgcmV0dXJuIHNtXy0+VW5tYXBDb3dJbWFnZShuYW1lKTsKK30KKworYm9vbCBNYXBTbmFwc2hvdHM6OkNsZWFudXBTbmFwc2hvdCgpIHsKKyAgICBzbV8gPSBTbmFwc2hvdE1hbmFnZXI6Ok5ldygpOworICAgIHJldHVybiBzbV8tPlByZXBhcmVEZXZpY2VUb0Jvb3RXaXRob3V0U25hcHNob3QoKTsKK30KKworYm9vbCBNYXBTbmFwc2hvdHM6OkRlbGV0ZVNuYXBzaG90cygpIHsKKyAgICBzbV8gPSBTbmFwc2hvdE1hbmFnZXI6Ok5ldygpOworICAgIGxvY2tfID0gc21fLT5Mb2NrRXhjbHVzaXZlKCk7CisgICAgaWYgKCFzbV8tPlJlbW92ZUFsbFVwZGF0ZVN0YXRlKGxvY2tfLmdldCgpKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJSZW1vdmUgQWxsIFVwZGF0ZSBTdGF0ZSBmYWlsZWQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorI2VuZGlmCisKIGJvb2wgRHVtcENtZEhhbmRsZXIoaW50IC8qYXJnYyovLCBjaGFyKiogYXJndikgewotICAgIGFuZHJvaWQ6OmJhc2U6OkluaXRMb2dnaW5nKGFyZ3YsICZhbmRyb2lkOjpiYXNlOjpTdGRlcnJMb2dnZXIpOworICAgIGFuZHJvaWQ6OmJhc2U6OkluaXRMb2dnaW5nKGFyZ3YsIFRlZUxvZ2dlcihMb2dkTG9nZ2VyKCksICZTdGRlcnJMb2dnZXIpKTsKICAgICByZXR1cm4gU25hcHNob3RNYW5hZ2VyOjpOZXcoKS0+RHVtcChzdGQ6OmNvdXQpOwogfQogCiBib29sIE1hcENtZEhhbmRsZXIoaW50LCBjaGFyKiogYXJndikgewotICAgIGFuZHJvaWQ6OmJhc2U6OkluaXRMb2dnaW5nKGFyZ3YsICZhbmRyb2lkOjpiYXNlOjpTdGRlcnJMb2dnZXIpOworICAgIGFuZHJvaWQ6OmJhc2U6OkluaXRMb2dnaW5nKGFyZ3YsIFRlZUxvZ2dlcihMb2dkTG9nZ2VyKCksICZTdGRlcnJMb2dnZXIpKTsKICAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7CiAgICAgcmV0dXJuIFNuYXBzaG90TWFuYWdlcjo6TmV3KCktPk1hcEFsbFNuYXBzaG90cyg1MDAwbXMpOwogfQogCiBib29sIFVubWFwQ21kSGFuZGxlcihpbnQsIGNoYXIqKiBhcmd2KSB7Ci0gICAgYW5kcm9pZDo6YmFzZTo6SW5pdExvZ2dpbmcoYXJndiwgJmFuZHJvaWQ6OmJhc2U6OlN0ZGVyckxvZ2dlcik7CisgICAgYW5kcm9pZDo6YmFzZTo6SW5pdExvZ2dpbmcoYXJndiwgVGVlTG9nZ2VyKExvZ2RMb2dnZXIoKSwgJlN0ZGVyckxvZ2dlcikpOwogICAgIHJldHVybiBTbmFwc2hvdE1hbmFnZXI6Ok5ldygpLT5Vbm1hcEFsbFNuYXBzaG90cygpOwogfQogCiBib29sIE1lcmdlQ21kSGFuZGxlcihpbnQgLyphcmdjKi8sIGNoYXIqKiBhcmd2KSB7Ci0gICAgYW5kcm9pZDo6YmFzZTo6SW5pdExvZ2dpbmcoYXJndiwgJmFuZHJvaWQ6OmJhc2U6OlN0ZGVyckxvZ2dlcik7CisgICAgYW5kcm9pZDo6YmFzZTo6SW5pdExvZ2dpbmcoYXJndiwgVGVlTG9nZ2VyKExvZ2RMb2dnZXIoKSwgJlN0ZGVyckxvZ2dlcikpOwogICAgIExPRyhXQVJOSU5HKSA8PCAiRGVwcmVjYXRlZC4gQ2FsbCB1cGRhdGVfZW5naW5lX2NsaWVudCAtLW1lcmdlIGluc3RlYWQuIjsKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKICNpZmRlZiBTTkFQU0hPVENUTF9VU0VSREVCVUdfT1JfRU5HCitib29sIEdldFZlcml0eVBhcnRpdGlvbnMoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwYXJ0aXRpb25zKSB7CisgICAgYXV0byYgZG0gPSBhbmRyb2lkOjpkbTo6RGV2aWNlTWFwcGVyOjpJbnN0YW5jZSgpOworICAgIGF1dG8gZG1fYmxvY2tfZGV2aWNlcyA9IGRtLkZpbmREbVBhcnRpdGlvbnMoKTsKKyAgICBpZiAoZG1fYmxvY2tfZGV2aWNlcy5lbXB0eSgpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIk5vIGRtLWVuYWJsZWQgYmxvY2sgZGV2aWNlIGlzIGZvdW5kLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmb3IgKGF1dG8mIGJsb2NrX2RldmljZSA6IGRtX2Jsb2NrX2RldmljZXMpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgZG1fYmxvY2tfbmFtZSA9IGJsb2NrX2RldmljZS5maXJzdDsKKyAgICAgICAgc3RkOjpzdHJpbmcgc2xvdF9zdWZmaXggPSBmc19tZ3JfZ2V0X3Nsb3Rfc3VmZml4KCk7CisgICAgICAgIHN0ZDo6c3RyaW5nIHBhcnRpdGlvbiA9IGRtX2Jsb2NrX25hbWUgKyBzbG90X3N1ZmZpeDsKKyAgICAgICAgcGFydGl0aW9ucy5wdXNoX2JhY2socGFydGl0aW9uKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgVW5NYXBQcmVjcmVhdGVkU25hcHNob3RzKGludCwgY2hhcioqIGFyZ3YpIHsKKyAgICBhbmRyb2lkOjpiYXNlOjpJbml0TG9nZ2luZyhhcmd2LCAmYW5kcm9pZDo6YmFzZTo6S2VybmVsTG9nZ2VyKTsKKyAgICAvLyBNYWtlIHN1cmUgd2UgYXJlIHJvb3QuCisgICAgaWYgKDo6Z2V0dWlkKCkgIT0gMCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJOb3QgcnVubmluZyBhcyByb290LiBUcnkgXCJhZGIgcm9vdFwiIGZpcnN0LiI7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBhcnRpdGlvbnM7CisgICAgaWYgKCFHZXRWZXJpdHlQYXJ0aXRpb25zKHBhcnRpdGlvbnMpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBNYXBTbmFwc2hvdHMgc25hcHNob3Q7CisgICAgZm9yIChhdXRvIHBhcnRpdGlvbiA6IHBhcnRpdGlvbnMpIHsKKyAgICAgICAgaWYgKCFzbmFwc2hvdC5Vbm1hcENvd0ltYWdlUGF0aChwYXJ0aXRpb24pKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbm1hcENvd0ltYWdlUGF0aCBmYWlsZWQ6ICIgPDwgcGFydGl0aW9uOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIFJlbW92ZVByZWNyZWF0ZWRTbmFwc2hvdHMoaW50LCBjaGFyKiogYXJndikgeworICAgIGFuZHJvaWQ6OmJhc2U6OkluaXRMb2dnaW5nKGFyZ3YsICZhbmRyb2lkOjpiYXNlOjpLZXJuZWxMb2dnZXIpOworICAgIC8vIE1ha2Ugc3VyZSB3ZSBhcmUgcm9vdC4KKyAgICBpZiAoOjpnZXR1aWQoKSAhPSAwKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIk5vdCBydW5uaW5nIGFzIHJvb3QuIFRyeSBcImFkYiByb290XCIgZmlyc3QuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIE1hcFNuYXBzaG90cyBzbmFwc2hvdDsKKyAgICBpZiAoIXNuYXBzaG90LkNsZWFudXBTbmFwc2hvdCgpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNsZWFudXBTbmFwc2hvdCBmYWlsZWQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIERlbGV0ZVByZWNyZWF0ZWRTbmFwc2hvdHMoaW50LCBjaGFyKiogYXJndikgeworICAgIGFuZHJvaWQ6OmJhc2U6OkluaXRMb2dnaW5nKGFyZ3YsICZhbmRyb2lkOjpiYXNlOjpLZXJuZWxMb2dnZXIpOworICAgIC8vIE1ha2Ugc3VyZSB3ZSBhcmUgcm9vdC4KKyAgICBpZiAoOjpnZXR1aWQoKSAhPSAwKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIk5vdCBydW5uaW5nIGFzIHJvb3QuIFRyeSBcImFkYiByb290XCIgZmlyc3QuIjsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisKKyAgICBNYXBTbmFwc2hvdHMgc25hcHNob3Q7CisgICAgcmV0dXJuIHNuYXBzaG90LkRlbGV0ZVNuYXBzaG90cygpOworfQorCitib29sIEFwcGx5VXBkYXRlKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIGFuZHJvaWQ6OmJhc2U6OkluaXRMb2dnaW5nKGFyZ3YsICZhbmRyb2lkOjpiYXNlOjpLZXJuZWxMb2dnZXIpOworCisgICAgLy8gTWFrZSBzdXJlIHdlIGFyZSByb290LgorICAgIGlmICg6OmdldHVpZCgpICE9IDApIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiTm90IHJ1bm5pbmcgYXMgcm9vdC4gVHJ5IFwiYWRiIHJvb3RcIiBmaXJzdC4iOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKworICAgIGlmIChhcmdjIDwgMykgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIiBhcHBseS11cGRhdGUgPGRpcmVjdG9yeSBsb2NhdGlvbiB3aGVyZSBzbmFwc2hvdCBwYXRjaGVzIGFyZSBwcmVzZW50PiB7LXd9IgorICAgICAgICAgICAgICAgICAgICAgIiAgICBBcHBseSB0aGUgc25hcHNob3RzIHRvIHRoZSBDT1cgYmxvY2sgZGV2aWNlXG4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgcGF0aCA9IHN0ZDo6c3RyaW5nKGFyZ3ZbMl0pOworICAgIGJvb2wgbWV0YWRhdGFfb25fc3VwZXIgPSBmYWxzZTsKKyAgICBpZiAoYXJnYyA9PSA0KSB7CisgICAgICAgIGlmIChzdGQ6OnN0cmluZyhhcmd2WzNdKSA9PSAiLXciKSB7CisgICAgICAgICAgICBtZXRhZGF0YV9vbl9zdXBlciA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgTWFwU25hcHNob3RzIGNvdyhwYXRoLCBtZXRhZGF0YV9vbl9zdXBlcik7CisgICAgaWYgKCFjb3cuQXBwbHlVcGRhdGUoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIExPRyhJTkZPKSA8PCAiQXBwbHkgdXBkYXRlIHN1Y2Nlc3MuIFBsZWFzZSByZWJvb3QgdGhlIGRldmljZSI7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTWFwUHJlY3JlYXRlZFNuYXBzaG90cyhpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBhbmRyb2lkOjpiYXNlOjpJbml0TG9nZ2luZyhhcmd2LCAmYW5kcm9pZDo6YmFzZTo6S2VybmVsTG9nZ2VyKTsKKworICAgIC8vIE1ha2Ugc3VyZSB3ZSBhcmUgcm9vdC4KKyAgICBpZiAoOjpnZXR1aWQoKSAhPSAwKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIk5vdCBydW5uaW5nIGFzIHJvb3QuIFRyeSBcImFkYiByb290XCIgZmlyc3QuIjsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisKKyAgICBpZiAoYXJnYyA8IDMpIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICIgbWFwLXNuYXBzaG90cyA8ZGlyZWN0b3J5IGxvY2F0aW9uIHdoZXJlIHNuYXBzaG90IHBhdGNoZXMgYXJlIHByZXNlbnQ+IHstd30iCisgICAgICAgICAgICAgICAgICAgICAiICAgIE1hcCBhbGwgc25hcHNob3RzIGJhc2VkIG9uIHBhdGNoZXMgcHJlc2VudCBpbiB0aGUgZGlyZWN0b3J5XG4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgcGF0aCA9IHN0ZDo6c3RyaW5nKGFyZ3ZbMl0pOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwYXRjaGZpbGVzOworCisgICAgZm9yIChjb25zdCBhdXRvJiBlbnRyeSA6IHN0ZDo6ZmlsZXN5c3RlbTo6ZGlyZWN0b3J5X2l0ZXJhdG9yKHBhdGgpKSB7CisgICAgICAgIGlmIChhbmRyb2lkOjpiYXNlOjpFbmRzV2l0aChlbnRyeS5wYXRoKCkuZ2VuZXJpY19zdHJpbmcoKSwgIi5wYXRjaCIpKSB7CisgICAgICAgICAgICBwYXRjaGZpbGVzLnB1c2hfYmFjayhhbmRyb2lkOjpiYXNlOjpCYXNlbmFtZShlbnRyeS5wYXRoKCkuZ2VuZXJpY19zdHJpbmcoKSkpOworICAgICAgICB9CisgICAgfQorICAgIGF1dG8mIGRtID0gYW5kcm9pZDo6ZG06OkRldmljZU1hcHBlcjo6SW5zdGFuY2UoKTsKKyAgICBhdXRvIGRtX2Jsb2NrX2RldmljZXMgPSBkbS5GaW5kRG1QYXJ0aXRpb25zKCk7CisgICAgaWYgKGRtX2Jsb2NrX2RldmljZXMuZW1wdHkoKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJObyBkbS1lbmFibGVkIGJsb2NrIGRldmljZSBpcyBmb3VuZC4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+IHBhcnRpdGlvbnM7CisgICAgZm9yIChhdXRvJiBwYXRjaGZpbGUgOiBwYXRjaGZpbGVzKSB7CisgICAgICAgIGF1dG8gbnBvcyA9IHBhdGNoZmlsZS5yZmluZCgiLnBhdGNoIik7CisgICAgICAgIGF1dG8gZG1fYmxvY2tfbmFtZSA9IHBhdGNoZmlsZS5zdWJzdHIoMCwgbnBvcyk7CisgICAgICAgIGlmIChkbV9ibG9ja19kZXZpY2VzLmZpbmQoZG1fYmxvY2tfbmFtZSkgIT0gZG1fYmxvY2tfZGV2aWNlcy5lbmQoKSkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgc2xvdF9zdWZmaXggPSBmc19tZ3JfZ2V0X3Nsb3Rfc3VmZml4KCk7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBwYXJ0aXRpb24gPSBkbV9ibG9ja19uYW1lICsgc2xvdF9zdWZmaXg7CisgICAgICAgICAgICBwYXJ0aXRpb25zLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihwYXJ0aXRpb24sIHBhdGNoZmlsZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBtZXRhZGF0YV9vbl9zdXBlciA9IGZhbHNlOworICAgIGlmIChhcmdjID09IDQpIHsKKyAgICAgICAgaWYgKHN0ZDo6c3RyaW5nKGFyZ3ZbM10pID09ICItdyIpIHsKKyAgICAgICAgICAgIG1ldGFkYXRhX29uX3N1cGVyID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIE1hcFNuYXBzaG90cyBjb3cocGF0aCwgbWV0YWRhdGFfb25fc3VwZXIpOworICAgIGlmICghY293LkJlZ2luVXBkYXRlKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQmVnaW5VcGRhdGUgZmFpbGVkIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZvciAoYXV0byYgcGFpciA6IHBhcnRpdGlvbnMpIHsKKyAgICAgICAgaWYgKCFjb3cuQ3JlYXRlU25hcHNob3REZXZpY2UocGFpci5maXJzdCwgcGFpci5zZWNvbmQpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDcmVhdGVTbmFwc2hvdERldmljZSBmYWlsZWQgZm9yOiAiIDw8IHBhaXIuZmlyc3Q7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjb3cuSW5pdGlhdGVUaHJlYWRlZFNuYXBzaG90V3JpdGUocGFpci5maXJzdCwgcGFpci5zZWNvbmQpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbml0aWF0ZVRocmVhZGVkU25hcHNob3RXcml0ZSBmYWlsZWQgZm9yOiAiIDw8IHBhaXIuZmlyc3Q7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY293LkZpbmlzaFNuYXBzaG90V3JpdGVzKCk7Cit9CisKIGJvb2wgQ3JlYXRlVGVzdFVwZGF0ZShTbmFwc2hvdE1hbmFnZXIqIHNtKSB7CiAgICAgY2hyb21lb3NfdXBkYXRlX2VuZ2luZTo6RGVsdGFBcmNoaXZlTWFuaWZlc3QgbWFuaWZlc3Q7CiAKQEAgLTEzMywyMyArNzQ2LDE4IEBACiAKICAgICAvLyBXcml0ZSB0aGUgIm5ldyIgc3lzdGVtIHBhcnRpdGlvbi4KICAgICBhdXRvIHN5c3RlbV90YXJnZXRfbmFtZSA9ICJzeXN0ZW0iICsgdGFyZ2V0X3Nsb3Q7Ci0gICAgYXV0byBzb3VyY2VfZGV2aWNlID0gIi9kZXYvYmxvY2svbWFwcGVyLyIgKyBzeXN0ZW1fc291cmNlX25hbWU7CiAgICAgQ3JlYXRlTG9naWNhbFBhcnRpdGlvblBhcmFtcyBjbHBwID0gewogICAgICAgICAgICAgLmJsb2NrX2RldmljZSA9IGZzX21ncl9nZXRfc3VwZXJfcGFydGl0aW9uX25hbWUodGFyZ2V0X3Nsb3RfbnVtYmVyKSwKICAgICAgICAgICAgIC5tZXRhZGF0YV9zbG90ID0ge3RhcmdldF9zbG90X251bWJlcn0sCiAgICAgICAgICAgICAucGFydGl0aW9uX25hbWUgPSBzeXN0ZW1fdGFyZ2V0X25hbWUsCi0gICAgICAgICAgICAucGFydGl0aW9uX29wZW5lciA9ICZvcGVuZXIsCiAgICAgICAgICAgICAudGltZW91dF9tcyA9IDEwcywKKyAgICAgICAgICAgIC5wYXJ0aXRpb25fb3BlbmVyID0gJm9wZW5lciwKICAgICB9OwotICAgIGF1dG8gd3JpdGVyID0gc20tPk9wZW5TbmFwc2hvdFdyaXRlcihjbHBwLCB7c291cmNlX2RldmljZX0pOworICAgIGF1dG8gd3JpdGVyID0gc20tPk9wZW5TbmFwc2hvdFdyaXRlcihjbHBwLCBzdGQ6Om51bGxvcHQpOwogICAgIGlmICghd3JpdGVyKSB7CiAgICAgICAgIHN0ZDo6Y2VyciA8PCAiQ291bGQgbm90IG9wZW4gc25hcHNob3Qgd3JpdGVyLlxuIjsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBpZiAoIXdyaXRlci0+SW5pdGlhbGl6ZSgpKSB7Ci0gICAgICAgIHN0ZDo6Y2VyciA8PCAiQ291bGQgbm90IGluaXRpYWxpemUgc25hcHNob3QgZm9yIHdyaXRpbmcuXG4iOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQogCiAgICAgZm9yICh1aW50NjRfdCBibG9jayA9IDA7IGJsb2NrIDwgc3lzdGVtX3NvdXJjZV9zaXplIC8gNDA5NjsgYmxvY2srKykgewogICAgICAgICBpZiAoIXdyaXRlci0+QWRkQ29weShibG9jaywgYmxvY2spKSB7CkBAIC0yMTQsNiArODIyLDExIEBACiAgICAgICAgIHsibWFwIiwgTWFwQ21kSGFuZGxlcn0sCiAjaWZkZWYgU05BUFNIT1RDVExfVVNFUkRFQlVHX09SX0VORwogICAgICAgICB7InRlc3QtYmxhbmstb3RhIiwgVGVzdE90YUhhbmRsZXJ9LAorICAgICAgICB7ImFwcGx5LXVwZGF0ZSIsIEFwcGx5VXBkYXRlfSwKKyAgICAgICAgeyJtYXAtc25hcHNob3RzIiwgTWFwUHJlY3JlYXRlZFNuYXBzaG90c30sCisgICAgICAgIHsidW5tYXAtc25hcHNob3RzIiwgVW5NYXBQcmVjcmVhdGVkU25hcHNob3RzfSwKKyAgICAgICAgeyJkZWxldGUtc25hcHNob3RzIiwgRGVsZXRlUHJlY3JlYXRlZFNuYXBzaG90c30sCisgICAgICAgIHsicmV2ZXJ0LXNuYXBzaG90cyIsIFJlbW92ZVByZWNyZWF0ZWRTbmFwc2hvdHN9LAogI2VuZGlmCiAgICAgICAgIHsidW5tYXAiLCBVbm1hcENtZEhhbmRsZXJ9LAogICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb24KZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvQW5kcm9pZC5icCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvQW5kcm9pZC5icAppbmRleCA5MjYxNDgyLi42MzkxMTZlIDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL0FuZHJvaWQuYnAKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9BbmRyb2lkLmJwCkBAIC0xNSwxMSArMTUsMTIgQEAKIC8vCiAKIHBhY2thZ2UgeworICAgIGRlZmF1bHRfdGVhbTogInRyZW5keV90ZWFtX2FuZHJvaWRfa2VybmVsIiwKICAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCiB9CiAKIGNjX2RlZmF1bHRzIHsKLSAgICBuYW1lOiAibGlic25hcHNob3Rfc25hcHVzZXJkX2RlZmF1bHRzIiwKKyAgICBuYW1lOiAibGlic25hcHVzZXJkX2NsaWVudF9kZWZhdWx0cyIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImZzX21ncl9kZWZhdWx0cyIsCiAgICAgXSwKQEAgLTMzLDE1ICszNCwxNiBAQAogfQogCiBjY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYnNuYXBzaG90X3NuYXB1c2VyZCIsCisgICAgbmFtZTogImxpYnNuYXB1c2VyZF9jbGllbnQiLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJmc19tZ3JfZGVmYXVsdHMiLAotICAgICAgICAibGlic25hcHNob3Rfc25hcHVzZXJkX2RlZmF1bHRzIiwKKyAgICAgICAgImxpYnNuYXB1c2VyZF9jbGllbnRfZGVmYXVsdHMiLAogICAgIF0sCiAgICAgcmVjb3ZlcnlfYXZhaWxhYmxlOiB0cnVlLAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJjdXRpbHNfc29ja2V0cyIsCi0gICAgICAgICJsaWJmc19tZ3IiLAorICAgICAgICAibGliZnNfbWdyX2ZpbGVfd2FpdCIsCisgICAgICAgICJsaWJkbSIsCiAgICAgXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYmFzZSIsCkBAIC01NywzMiArNTksNDUgQEAKICAgICBkZWZhdWx0czogWwogICAgICAgICAiZnNfbWdyX2RlZmF1bHRzIiwKICAgICBdLAorICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJpbmNsdWRlLyJdLAogICAgIHNyY3M6IFsKLSAgICAgICAgImRtLXNuYXBzaG90LW1lcmdlL3NuYXB1c2VyZC5jcHAiLAotICAgICAgICAiZG0tc25hcHNob3QtbWVyZ2Uvc25hcHVzZXJkX3dvcmtlci5jcHAiLAotICAgICAgICAiZG0tc25hcHNob3QtbWVyZ2Uvc25hcHVzZXJkX3JlYWRhaGVhZC5jcHAiLAorICAgICAgICAiZG1fdXNlcl9ibG9ja19zZXJ2ZXIuY3BwIiwKICAgICAgICAgInNuYXB1c2VyZF9idWZmZXIuY3BwIiwKKyAgICAgICAgInVzZXItc3BhY2UtbWVyZ2UvaGFuZGxlcl9tYW5hZ2VyLmNwcCIsCisgICAgICAgICJ1c2VyLXNwYWNlLW1lcmdlL21lcmdlX3dvcmtlci5jcHAiLAorICAgICAgICAidXNlci1zcGFjZS1tZXJnZS9yZWFkX3dvcmtlci5jcHAiLAogICAgICAgICAidXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfY29yZS5jcHAiLAotICAgICAgICAidXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfZG1fdXNlci5jcHAiLAotICAgICAgICAidXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfbWVyZ2UuY3BwIiwKICAgICAgICAgInVzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX3JlYWRhaGVhZC5jcHAiLAogICAgICAgICAidXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfdHJhbnNpdGlvbnMuY3BwIiwKICAgICAgICAgInVzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX3ZlcmlmeS5jcHAiLAorICAgICAgICAidXNlci1zcGFjZS1tZXJnZS93b3JrZXIuY3BwIiwKKyAgICAgICAgInV0aWxpdHkuY3BwIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLURfRklMRV9PRkZTRVRfQklUUz02NCIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKICAgICBdLAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmRtIiwKKyAgICAgICAgImxpYmV4dDJfdXVpZCIsCiAgICAgICAgICJsaWJleHQ0X3V0aWxzIiwKICAgICAgICAgImxpYnNuYXBzaG90X2NvdyIsCiAgICAgICAgICJsaWJ1cmluZyIsCisgICAgICAgICJsaWJwcm9jZXNzZ3JvdXAiLAorICAgICAgICAibGlicHJvY2Vzc2dyb3VwX3V0aWwiLAorICAgICAgICAibGlianNvbmNwcCIsCiAgICAgXSwKLSAgICBpbmNsdWRlX2RpcnM6IFsiYmlvbmljL2xpYmMva2VybmVsIl0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiAgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmN1dGlsc19oZWFkZXJzIiwKICAgICAgICAgImxpYnN0b3JhZ2VfbGl0ZXJhbHNfaGVhZGVycyIsCiAgICAgXSwKICAgICByYW1kaXNrX2F2YWlsYWJsZTogdHJ1ZSwKICAgICB2ZW5kb3JfcmFtZGlza19hdmFpbGFibGU6IHRydWUsCiAgICAgcmVjb3ZlcnlfYXZhaWxhYmxlOiB0cnVlLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogfQogCiBjY19kZWZhdWx0cyB7CkBAIC05MSwzMyArMTA2LDQzIEBACiAgICAgICAgICJmc19tZ3JfZGVmYXVsdHMiLAogICAgIF0sCiAgICAgc3JjczogWwotICAgICAgICAiZG0tc25hcHNob3QtbWVyZ2Uvc25hcHVzZXJkX3NlcnZlci5jcHAiLAogICAgICAgICAic25hcHVzZXJkX2RhZW1vbi5jcHAiLAogICAgICAgICAidXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfc2VydmVyLmNwcCIsCiAgICAgXSwKIAorICAgIGNmbGFnczogWworICAgICAgICAiLURfRklMRV9PRkZTRVRfQklUUz02NCIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliYnJvdGxpIiwKICAgICAgICAgImxpYmN1dGlsc19zb2NrZXRzIiwKICAgICAgICAgImxpYmRtIiwKLSAgICAgICAgImxpYmZzX21nciIsCisgICAgICAgICJsaWJleHQyX3V1aWQiLAorICAgICAgICAibGliZnNfbWdyX2ZpbGVfd2FpdCIsCiAgICAgICAgICJsaWJnZmxhZ3MiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnNuYXBzaG90X2NvdyIsCi0gICAgICAgICJsaWJzbmFwc2hvdF9zbmFwdXNlcmQiLAogICAgICAgICAibGlic25hcHVzZXJkIiwKKyAgICAgICAgImxpYnByb2Nlc3Nncm91cCIsCisgICAgICAgICJsaWJwcm9jZXNzZ3JvdXBfdXRpbCIsCisgICAgICAgICJsaWJqc29uY3BwIiwKKyAgICAgICAgImxpYnNuYXB1c2VyZF9jbGllbnQiLAogICAgICAgICAibGlieiIsCiAgICAgICAgICJsaWJsejQiLAogICAgICAgICAibGliZXh0NF91dGlscyIsCiAgICAgICAgICJsaWJ1cmluZyIsCisgICAgICAgICJsaWJ6c3RkIiwKICAgICBdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmN1dGlsc19oZWFkZXJzIiwKICAgICAgICAgImxpYnN0b3JhZ2VfbGl0ZXJhbHNfaGVhZGVycyIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWyJiaW9uaWMvbGliYy9rZXJuZWwiXSwKICAgICBzeXN0ZW1fc2hhcmVkX2xpYnM6IFtdLAogCiAgICAgLy8gc25hcHVzZXJkIGlzIHN0YXJ0ZWQgZHVyaW5nIGVhcmx5IGJvb3QgYnkgZmlyc3Qtc3RhZ2UgaW5pdC4gQXQgdGhhdApAQCAtMTI2LDEyICsxNTEsNiBAQAogICAgIC8vIHNuYXB1c2VyZCwgd2hpY2ggd291bGQgbGVhZCB0byBkZWFkbG9jayBpZiB3ZSBoYWQgdG8gaGFuZGxlIHBhZ2UKICAgICAvLyBmYXVsdHMgZm9yIGl0cyBjb2RlIHBhZ2VzLgogICAgIHN0YXRpY19leGVjdXRhYmxlOiB0cnVlLAotCi0gICAgLy8gU25hcHVzZXJkIHNlZ2ZhdWx0cyB3aXRoIFRoaW5MVE8KLSAgICAvLyBodHRwOi8vYi8yMDg1NjU3MTcKLSAgICBsdG86IHsKLSAgICAgICAgIG5ldmVyOiB0cnVlLAotICAgIH0sCiB9CiAKIGNjX2JpbmFyeSB7CkBAIC0xNDAsMTEgKzE1OSwxNSBAQAogICAgIGluaXRfcmM6IFsKICAgICAgICAgInNuYXB1c2VyZC5yYyIsCiAgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic25hcHVzZXJkX2NsaWVudCIsCisgICAgXSwKICAgICByYW1kaXNrX2F2YWlsYWJsZTogZmFsc2UsCiAgICAgdmVuZG9yX3JhbWRpc2tfYXZhaWxhYmxlOiB0cnVlLAorICAgIHJlY292ZXJ5X2F2YWlsYWJsZTogdHJ1ZSwKIH0KIAotLy8gVGhpcyB0YXJnZXQgd2lsbCBpbnN0YWxsIHRvIC9zeXN0ZW0vYmluL3NuYXB1c2VyZF9yYW1kaXNrIAorLy8gVGhpcyB0YXJnZXQgd2lsbCBpbnN0YWxsIHRvIC9zeXN0ZW0vYmluL3NuYXB1c2VyZF9yYW1kaXNrCiAvLyBJdCB3aWxsIGFsc28gY3JlYXRlIGEgc3ltYmxpbmsgb24gL3N5c3RlbS9iaW4vc25hcHVzZXJkIHRoYXQgcG9pbnQgdG8KIC8vIC9zeXN0ZW0vYmluL3NuYXB1c2VyZF9yYW1kaXNrIC4KIC8vIFRoaXMgd2F5LCBpbml0IGNhbiBjaGVjayBpZiBnZW5lcmljIHJhbWRpc2sgY29weSBleGlzdHMuCkBAIC0xNjIsMTcgKzE4NSwyMiBAQAogICAgIHN5bWxpbmtzOiBbInNuYXB1c2VyZCJdLAogfQogCi1jY190ZXN0IHsKLSAgICBuYW1lOiAiY293X3NuYXB1c2VyZF90ZXN0IiwKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAic25hcHVzZXJkX3Rlc3RfZGVmYXVsdHMiLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJmc19tZ3JfZGVmYXVsdHMiLAogICAgICAgICAibGlic25hcHNob3RfY293X2RlZmF1bHRzIiwKICAgICBdLAogICAgIHNyY3M6IFsKLSAgICAgICAgImRtLXNuYXBzaG90LW1lcmdlL2Nvd19zbmFwdXNlcmRfdGVzdC5jcHAiLAotICAgICAgICAiZG0tc25hcHNob3QtbWVyZ2Uvc25hcHVzZXJkLmNwcCIsCi0gICAgICAgICJkbS1zbmFwc2hvdC1tZXJnZS9zbmFwdXNlcmRfd29ya2VyLmNwcCIsCi0gICAgICAgICJzbmFwdXNlcmRfYnVmZmVyLmNwcCIsCisgICAgICAgICJ0ZXN0aW5nL2RtX3VzZXJfaGFybmVzcy5jcHAiLAorICAgICAgICAidGVzdGluZy9oYXJuZXNzLmNwcCIsCisgICAgICAgICJ0ZXN0aW5nL2hvc3RfaGFybmVzcy5jcHAiLAorICAgICAgICAidXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfdGVzdC5jcHAiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRF9GSUxFX09GRlNFVF9CSVRTPTY0IiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAogICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmJhc2UiLApAQCAtMTgwLDM0ICsyMDgsOTggQEAKICAgICBdLAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJicm90bGkiLAorICAgICAgICAibGliY3V0aWxzX3NvY2tldHMiLAorICAgICAgICAibGliZG0iLAorICAgICAgICAibGliZXh0Ml91dWlkIiwKKyAgICAgICAgImxpYmV4dDRfdXRpbHMiLAorICAgICAgICAibGliZnNfbWdyX2ZpbGVfd2FpdCIsCisgICAgICAgICJsaWJnZmxhZ3MiLAogICAgICAgICAibGliZ3Rlc3QiLAogICAgICAgICAibGlic25hcHNob3RfY293IiwKLSAgICAgICAgImxpYnNuYXBzaG90X3NuYXB1c2VyZCIsCi0gICAgICAgICJsaWJjdXRpbHNfc29ja2V0cyIsCisgICAgICAgICJsaWJzbmFwdXNlcmQiLAorICAgICAgICAibGlicHJvY2Vzc2dyb3VwIiwKKyAgICAgICAgImxpYnByb2Nlc3Nncm91cF91dGlsIiwKKyAgICAgICAgImxpYmpzb25jcHAiLAorICAgICAgICAibGlidXJpbmciLAogICAgICAgICAibGlieiIsCi0gICAgICAgICJsaWJmc19tZ3IiLAotICAgICAgICAibGliZG0iLAotICAgICAgICAibGliZXh0NF91dGlscyIsCisgICAgXSwKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgIi4iLAogICAgIF0sCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYnN0b3JhZ2VfbGl0ZXJhbHNfaGVhZGVycyIsCiAgICAgICAgICJsaWJmaWVtYXBfaGVhZGVycyIsCisgICAgICAgICJsaWJjdXRpbHNfaGVhZGVycyIsCiAgICAgXSwKICAgICB0ZXN0X29wdGlvbnM6IHsKICAgICAgICAgbWluX3NoaXBwaW5nX2FwaV9sZXZlbDogMzAsCiAgICAgfSwKKworICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJib3RoIiwKKyAgICBtdWx0aWxpYjogeworICAgICAgICBsaWIzMjogeworICAgICAgICAgICAgc3VmZml4OiAiMzIiLAorICAgICAgICB9LAorICAgICAgICBsaWI2NDogeworICAgICAgICAgICAgc3VmZml4OiAiNjQiLAorICAgICAgICB9LAorICAgIH0sCisKICAgICBhdXRvX2dlbl9jb25maWc6IHRydWUsCi0gICAgcmVxdWlyZV9yb290OiBmYWxzZSwKKyAgICByZXF1aXJlX3Jvb3Q6IHRydWUsCiB9CiAKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJzbmFwdXNlcmRfdGVzdCIsCisgICAgZGVmYXVsdHM6IFsic25hcHVzZXJkX3Rlc3RfZGVmYXVsdHMiXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB0ZXN0X3N1aXRlczogWworICAgICAgICAiZ2VuZXJhbC10ZXN0cyIsCisgICAgXSwKKyAgICB0ZXN0X29wdGlvbnM6IHsKKyAgICAgICAgdGVzdF9ydW5uZXJfb3B0aW9uczogWworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5hbWU6ICJmb3JjZS1uby10ZXN0LWVycm9yIiwKKyAgICAgICAgICAgICAgICB2YWx1ZTogImZhbHNlIiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmFtZTogIm5hdGl2ZS10ZXN0LXRpbWVvdXQiLAorICAgICAgICAgICAgICAgIHZhbHVlOiAiMTVtIiwKKyAgICAgICAgICAgIH0sCisgICAgICAgIF0sCisgICAgfSwKK30KKworLy8gdnRzIHRlc3RzIGNhbm5vdCBiZSBob3N0X3N1cHBvcnRlZC4KK2NjX3Rlc3QgeworICAgIG5hbWU6ICJ2dHNfc25hcHVzZXJkX3Rlc3QiLAorICAgIGRlZmF1bHRzOiBbInNuYXB1c2VyZF90ZXN0X2RlZmF1bHRzIl0sCisgICAgdGVzdF9zdWl0ZXM6IFsKKyAgICAgICAgInZ0cyIsCisgICAgXSwKKyAgICB0ZXN0X29wdGlvbnM6IHsKKyAgICAgICAgLy8gVkFCQyBtYW5kYXRvcnkgaW4gQW5kcm9pZCBUIHBlciBWU1IuCisgICAgICAgIG1pbl9zaGlwcGluZ19hcGlfbGV2ZWw6IDMyLAorICAgIH0sCit9CisKK2NjX2JpbmFyeV9ob3N0IHsKKyAgICBuYW1lOiAic25hcHVzZXJkX2V4dHJhY3RvciIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImZzX21ncl9kZWZhdWx0cyIsCiAgICAgICAgICJsaWJzbmFwc2hvdF9jb3dfZGVmYXVsdHMiLAogICAgIF0sCiAgICAgc3JjczogWwotICAgICAgICAidXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfdGVzdC5jcHAiLAorICAgICAgICAidGVzdGluZy9kbV91c2VyX2hhcm5lc3MuY3BwIiwKKyAgICAgICAgInRlc3RpbmcvaGFybmVzcy5jcHAiLAorICAgICAgICAidGVzdGluZy9ob3N0X2hhcm5lc3MuY3BwIiwKKyAgICAgICAgInVzZXItc3BhY2UtbWVyZ2UvZXh0cmFjdG9yLmNwcCIsCisgICAgICAgICJzbmFwdXNlcmRfZXh0cmFjdG9yLmNwcCIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYmFzZSIsCkBAIC0yMTUsMjUgKzMwNywyNSBAQAogICAgIF0sCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYmJyb3RsaSIsCi0gICAgICAgICJsaWJndGVzdCIsCi0gICAgICAgICJsaWJzbmFwc2hvdF9jb3ciLAotICAgICAgICAibGlic25hcHNob3Rfc25hcHVzZXJkIiwKICAgICAgICAgImxpYmN1dGlsc19zb2NrZXRzIiwKLSAgICAgICAgImxpYnoiLAotICAgICAgICAibGliZnNfbWdyIiwKICAgICAgICAgImxpYmRtIiwKKyAgICAgICAgImxpYmV4dDJfdXVpZCIsCiAgICAgICAgICJsaWJleHQ0X3V0aWxzIiwKLSAgICAgICAgImxpYnVyaW5nIiwKKyAgICAgICAgImxpYmZzX21ncl9maWxlX3dhaXQiLAogICAgICAgICAibGliZ2ZsYWdzIiwKKyAgICAgICAgImxpYnNuYXBzaG90X2NvdyIsCisgICAgICAgICJsaWJzbmFwdXNlcmQiLAorICAgICAgICAibGlicHJvY2Vzc2dyb3VwIiwKKyAgICAgICAgImxpYmpzb25jcHAiLAorICAgICAgICAibGlidXJpbmciLAorICAgICAgICAibGlieiIsCiAgICAgXSwKLSAgICBpbmNsdWRlX2RpcnM6IFsiYmlvbmljL2xpYmMva2VybmVsIl0sCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICIuIiwKKyAgICBdLAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJzdG9yYWdlX2xpdGVyYWxzX2hlYWRlcnMiLAogICAgICAgICAibGliZmllbWFwX2hlYWRlcnMiLAorICAgICAgICAibGliY3V0aWxzX2hlYWRlcnMiLAogICAgIF0sCi0gICAgdGVzdF9vcHRpb25zOiB7Ci0gICAgICAgIG1pbl9zaGlwcGluZ19hcGlfbGV2ZWw6IDMwLAotICAgIH0sCi0gICAgYXV0b19nZW5fY29uZmlnOiB0cnVlLAotICAgIHJlcXVpcmVfcm9vdDogZmFsc2UsCiB9CmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL2RtLXNuYXBzaG90LW1lcmdlL2Nvd19zbmFwdXNlcmRfdGVzdC5jcHAgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL2RtLXNuYXBzaG90LW1lcmdlL2Nvd19zbmFwdXNlcmRfdGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNGFiMmUuLjAwMDAwMDAKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9kbS1zbmFwc2hvdC1tZXJnZS9jb3dfc25hcHVzZXJkX3Rlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTI1NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tZW1mZC5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPGNocm9ubz4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8c3RyaW5nX3ZpZXc+Ci0KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KLSNpbmNsdWRlIDxmc19tZ3IvZmlsZV93YWl0Lmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLSNpbmNsdWRlIDxsaWJkbS9kbS5oPgotI2luY2x1ZGUgPGxpYmRtL2xvb3BfY29udHJvbC5oPgotI2luY2x1ZGUgPGxpYnNuYXBzaG90L2Nvd193cml0ZXIuaD4KLSNpbmNsdWRlIDxzbmFwdXNlcmQvc25hcHVzZXJkX2J1ZmZlci5oPgotI2luY2x1ZGUgPHNuYXB1c2VyZC9zbmFwdXNlcmRfY2xpZW50Lmg+Ci0jaW5jbHVkZSA8c3RvcmFnZV9saXRlcmFscy9zdG9yYWdlX2xpdGVyYWxzLmg+Ci0KLSNpbmNsdWRlICJzbmFwdXNlcmQuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIHNuYXBzaG90IHsKLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnN0b3JhZ2VfbGl0ZXJhbHM7Ci11c2luZyBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQ7Ci11c2luZyBMb29wRGV2aWNlID0gYW5kcm9pZDo6ZG06Okxvb3BEZXZpY2U7Ci11c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7Ci11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6ZG07Ci11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi1zdGF0aWMgY29uc3RleHByIGNoYXIga1NuYXB1c2VyZFNvY2tldFRlc3RbXSA9ICJzbmFwdXNlcmRUZXN0IjsKLQotY2xhc3MgVGVtcERldmljZSB7Ci0gIHB1YmxpYzoKLSAgICBUZW1wRGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBEbVRhYmxlJiB0YWJsZSkKLSAgICAgICAgOiBkbV8oRGV2aWNlTWFwcGVyOjpJbnN0YW5jZSgpKSwgbmFtZV8obmFtZSksIHZhbGlkXyhmYWxzZSkgewotICAgICAgICB2YWxpZF8gPSBkbV8uQ3JlYXRlRGV2aWNlKG5hbWUsIHRhYmxlLCAmcGF0aF8sIHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDUpKTsKLSAgICB9Ci0gICAgVGVtcERldmljZShUZW1wRGV2aWNlJiYgb3RoZXIpIG5vZXhjZXB0Ci0gICAgICAgIDogZG1fKG90aGVyLmRtXyksIG5hbWVfKG90aGVyLm5hbWVfKSwgcGF0aF8ob3RoZXIucGF0aF8pLCB2YWxpZF8ob3RoZXIudmFsaWRfKSB7Ci0gICAgICAgIG90aGVyLnZhbGlkXyA9IGZhbHNlOwotICAgIH0KLSAgICB+VGVtcERldmljZSgpIHsKLSAgICAgICAgaWYgKHZhbGlkXykgewotICAgICAgICAgICAgZG1fLkRlbGV0ZURldmljZShuYW1lXyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgYm9vbCBEZXN0cm95KCkgewotICAgICAgICBpZiAoIXZhbGlkXykgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHZhbGlkXyA9IGZhbHNlOwotICAgICAgICByZXR1cm4gZG1fLkRlbGV0ZURldmljZShuYW1lXyk7Ci0gICAgfQotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKCkgY29uc3QgeyByZXR1cm4gcGF0aF87IH0KLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfOyB9Ci0gICAgYm9vbCB2YWxpZCgpIGNvbnN0IHsgcmV0dXJuIHZhbGlkXzsgfQotCi0gICAgVGVtcERldmljZShjb25zdCBUZW1wRGV2aWNlJikgPSBkZWxldGU7Ci0gICAgVGVtcERldmljZSYgb3BlcmF0b3I9KGNvbnN0IFRlbXBEZXZpY2UmKSA9IGRlbGV0ZTsKLQotICAgIFRlbXBEZXZpY2UmIG9wZXJhdG9yPShUZW1wRGV2aWNlJiYgb3RoZXIpIG5vZXhjZXB0IHsKLSAgICAgICAgbmFtZV8gPSBvdGhlci5uYW1lXzsKLSAgICAgICAgdmFsaWRfID0gb3RoZXIudmFsaWRfOwotICAgICAgICBvdGhlci52YWxpZF8gPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLQotICBwcml2YXRlOgotICAgIERldmljZU1hcHBlciYgZG1fOwotICAgIHN0ZDo6c3RyaW5nIG5hbWVfOwotICAgIHN0ZDo6c3RyaW5nIHBhdGhfOwotICAgIGJvb2wgdmFsaWRfOwotfTsKLQotY2xhc3MgQ293U25hcHVzZXJkVGVzdCBmaW5hbCB7Ci0gIHB1YmxpYzoKLSAgICBib29sIFNldHVwKCk7Ci0gICAgYm9vbCBTZXR1cE9yZGVyZWRPcHMoKTsKLSAgICBib29sIFNldHVwT3JkZXJlZE9wc0ludmVydGVkKCk7Ci0gICAgYm9vbCBTZXR1cENvcHlPdmVybGFwXzEoKTsKLSAgICBib29sIFNldHVwQ29weU92ZXJsYXBfMigpOwotICAgIGJvb2wgTWVyZ2UoKTsKLSAgICB2b2lkIFZhbGlkYXRlTWVyZ2UoKTsKLSAgICB2b2lkIFJlYWRTbmFwc2hvdERldmljZUFuZFZhbGlkYXRlKCk7Ci0gICAgdm9pZCBTaHV0ZG93bigpOwotICAgIHZvaWQgTWVyZ2VJbnRlcnJ1cHQoKTsKLSAgICB2b2lkIE1lcmdlSW50ZXJydXB0Rml4ZWQoaW50IGR1cmF0aW9uKTsKLSAgICB2b2lkIE1lcmdlSW50ZXJydXB0UmFuZG9tbHkoaW50IG1heF9kdXJhdGlvbik7Ci0gICAgdm9pZCBSZWFkRG1Vc2VyQmxvY2tXaXRob3V0RGFlbW9uKCk7Ci0gICAgdm9pZCBSZWFkTGFzdEJsb2NrKCk7Ci0KLSAgICBzdGQ6OnN0cmluZyBzbmFwc2hvdF9kZXYoKSBjb25zdCB7IHJldHVybiBzbmFwc2hvdF9kZXZfLT5wYXRoKCk7IH0KLQotICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBrU2VjdG9yU2l6ZSA9IDUxMjsKLQotICBwcml2YXRlOgotICAgIHZvaWQgU2V0dXBJbXBsKCk7Ci0KLSAgICB2b2lkIE1lcmdlSW1wbCgpOwotICAgIHZvaWQgU2ltdWxhdGVEYWVtb25SZXN0YXJ0KCk7Ci0gICAgdm9pZCBTdGFydE1lcmdlKCk7Ci0KLSAgICB2b2lkIENyZWF0ZUNvd0RldmljZSgpOwotICAgIHZvaWQgQ3JlYXRlQ293RGV2aWNlT3JkZXJlZE9wcygpOwotICAgIHZvaWQgQ3JlYXRlQ293RGV2aWNlT3JkZXJlZE9wc0ludmVydGVkKCk7Ci0gICAgdm9pZCBDcmVhdGVDb3dEZXZpY2VXaXRoQ29weU92ZXJsYXBfMSgpOwotICAgIHZvaWQgQ3JlYXRlQ293RGV2aWNlV2l0aENvcHlPdmVybGFwXzIoKTsKLSAgICBib29sIFNldHVwRGFlbW9uKCk7Ci0gICAgdm9pZCBDcmVhdGVCYXNlRGV2aWNlKCk7Ci0gICAgdm9pZCBJbml0Q293RGV2aWNlKCk7Ci0gICAgdm9pZCBTZXREZXZpY2VDb250cm9sTmFtZSgpOwotICAgIHZvaWQgSW5pdERhZW1vbigpOwotICAgIHZvaWQgQ3JlYXRlRG1Vc2VyRGV2aWNlKCk7Ci0gICAgdm9pZCBTdGFydFNuYXB1c2VyZERhZW1vbigpOwotICAgIHZvaWQgQ3JlYXRlU25hcHNob3REZXZpY2UoKTsKLQotICAgIHVuaXF1ZV9wdHI8TG9vcERldmljZT4gYmFzZV9sb29wXzsKLSAgICB1bmlxdWVfcHRyPFRlbXBEZXZpY2U+IGRtdXNlcl9kZXZfOwotICAgIHVuaXF1ZV9wdHI8VGVtcERldmljZT4gc25hcHNob3RfZGV2XzsKLQotICAgIHN0ZDo6c3RyaW5nIHN5c3RlbV9kZXZpY2VfY3RybF9uYW1lXzsKLSAgICBzdGQ6OnN0cmluZyBzeXN0ZW1fZGV2aWNlX25hbWVfOwotCi0gICAgdW5pcXVlX2ZkIGJhc2VfZmRfOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxUZW1wb3JhcnlGaWxlPiBjb3dfc3lzdGVtXzsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHVzZXJkQ2xpZW50PiBjbGllbnRfOwotICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IG9yaWdfYnVmZmVyXzsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBtZXJnZWRfYnVmZmVyXzsKLSAgICBib29sIHNldHVwX29rXyA9IGZhbHNlOwotICAgIGJvb2wgbWVyZ2Vfb2tfID0gZmFsc2U7Ci0gICAgc2l6ZV90IHNpemVfID0gNTBfTWlCOwotICAgIGludCBjb3dfbnVtX3NlY3RvcnNfOwotICAgIGludCB0b3RhbF9iYXNlX3NpemVfOwotfTsKLQotY2xhc3MgQ293U25hcHVzZXJkTWV0YWRhdGFUZXN0IGZpbmFsIHsKLSAgcHVibGljOgotICAgIHZvaWQgU2V0dXAoKTsKLSAgICB2b2lkIFNldHVwUGFydGlhbEFyZWEoKTsKLSAgICB2b2lkIFZhbGlkYXRlTWV0YWRhdGEoKTsKLSAgICB2b2lkIFZhbGlkYXRlUGFydGlhbEZpbGxlZEFyZWEoKTsKLQotICBwcml2YXRlOgotICAgIHZvaWQgSW5pdE1ldGFkYXRhKCk7Ci0gICAgdm9pZCBDcmVhdGVDb3dEZXZpY2UoKTsKLSAgICB2b2lkIENyZWF0ZUNvd1BhcnRpYWxGaWxsZWRBcmVhKCk7Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U25hcHVzZXJkPiBzbmFwdXNlcmRfOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxUZW1wb3JhcnlGaWxlPiBjb3dfc3lzdGVtXzsKLSAgICBzaXplX3Qgc2l6ZV8gPSAxX01pQjsKLX07Ci0KLXN0YXRpYyB1bmlxdWVfZmQgQ3JlYXRlVGVtcEZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHNpemVfdCBzaXplKSB7Ci0gICAgdW5pcXVlX2ZkIGZkKHN5c2NhbGwoX19OUl9tZW1mZF9jcmVhdGUsIG5hbWUuY19zdHIoKSwgTUZEX0FMTE9XX1NFQUxJTkcpKTsKLSAgICBpZiAoZmQgPCAwKSB7Ci0gICAgICAgIHJldHVybiB7fTsKLSAgICB9Ci0gICAgaWYgKHNpemUpIHsKLSAgICAgICAgaWYgKGZ0cnVuY2F0ZShmZCwgc2l6ZSkgPCAwKSB7Ci0gICAgICAgICAgICBwZXJyb3IoImZ0cnVuY2F0ZSIpOwotICAgICAgICAgICAgcmV0dXJuIHt9OwotICAgICAgICB9Ci0gICAgICAgIGlmIChmY250bChmZCwgRl9BRERfU0VBTFMsIEZfU0VBTF9HUk9XIHwgRl9TRUFMX1NIUklOSykgPCAwKSB7Ci0gICAgICAgICAgICBwZXJyb3IoImZjbnRsIik7Ci0gICAgICAgICAgICByZXR1cm4ge307Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZkOwotfQotCi12b2lkIENvd1NuYXB1c2VyZFRlc3Q6OlNodXRkb3duKCkgewotICAgIEFTU0VSVF9UUlVFKHNuYXBzaG90X2Rldl8tPkRlc3Ryb3koKSk7Ci0gICAgQVNTRVJUX1RSVUUoZG11c2VyX2Rldl8tPkRlc3Ryb3koKSk7Ci0KLSAgICBhdXRvIG1pc2NfZGV2aWNlID0gIi9kZXYvZG0tdXNlci8iICsgc3lzdGVtX2RldmljZV9jdHJsX25hbWVfOwotICAgIEFTU0VSVF9UUlVFKGNsaWVudF8tPldhaXRGb3JEZXZpY2VEZWxldGUoc3lzdGVtX2RldmljZV9jdHJsX25hbWVfKSk7Ci0gICAgQVNTRVJUX1RSVUUoYW5kcm9pZDo6ZnNfbWdyOjpXYWl0Rm9yRmlsZURlbGV0ZWQobWlzY19kZXZpY2UsIDEwcykpOwotICAgIEFTU0VSVF9UUlVFKGNsaWVudF8tPkRldGFjaFNuYXB1c2VyZCgpKTsKLX0KLQotYm9vbCBDb3dTbmFwdXNlcmRUZXN0OjpTZXR1cCgpIHsKLSAgICBTZXR1cEltcGwoKTsKLSAgICByZXR1cm4gc2V0dXBfb2tfOwotfQotCi1ib29sIENvd1NuYXB1c2VyZFRlc3Q6OlNldHVwT3JkZXJlZE9wcygpIHsKLSAgICBDcmVhdGVCYXNlRGV2aWNlKCk7Ci0gICAgQ3JlYXRlQ293RGV2aWNlT3JkZXJlZE9wcygpOwotICAgIHJldHVybiBTZXR1cERhZW1vbigpOwotfQotCi1ib29sIENvd1NuYXB1c2VyZFRlc3Q6OlNldHVwT3JkZXJlZE9wc0ludmVydGVkKCkgewotICAgIENyZWF0ZUJhc2VEZXZpY2UoKTsKLSAgICBDcmVhdGVDb3dEZXZpY2VPcmRlcmVkT3BzSW52ZXJ0ZWQoKTsKLSAgICByZXR1cm4gU2V0dXBEYWVtb24oKTsKLX0KLQotYm9vbCBDb3dTbmFwdXNlcmRUZXN0OjpTZXR1cENvcHlPdmVybGFwXzEoKSB7Ci0gICAgQ3JlYXRlQmFzZURldmljZSgpOwotICAgIENyZWF0ZUNvd0RldmljZVdpdGhDb3B5T3ZlcmxhcF8xKCk7Ci0gICAgcmV0dXJuIFNldHVwRGFlbW9uKCk7Ci19Ci0KLWJvb2wgQ293U25hcHVzZXJkVGVzdDo6U2V0dXBDb3B5T3ZlcmxhcF8yKCkgewotICAgIENyZWF0ZUJhc2VEZXZpY2UoKTsKLSAgICBDcmVhdGVDb3dEZXZpY2VXaXRoQ29weU92ZXJsYXBfMigpOwotICAgIHJldHVybiBTZXR1cERhZW1vbigpOwotfQotCi1ib29sIENvd1NuYXB1c2VyZFRlc3Q6OlNldHVwRGFlbW9uKCkgewotICAgIFNldERldmljZUNvbnRyb2xOYW1lKCk7Ci0KLSAgICBTdGFydFNuYXB1c2VyZERhZW1vbigpOwotICAgIEluaXRDb3dEZXZpY2UoKTsKLQotICAgIENyZWF0ZURtVXNlckRldmljZSgpOwotICAgIEluaXREYWVtb24oKTsKLQotICAgIENyZWF0ZVNuYXBzaG90RGV2aWNlKCk7Ci0gICAgc2V0dXBfb2tfID0gdHJ1ZTsKLQotICAgIHJldHVybiBzZXR1cF9va187Ci19Ci0KLXZvaWQgQ293U25hcHVzZXJkVGVzdDo6U3RhcnRTbmFwdXNlcmREYWVtb24oKSB7Ci0gICAgcGlkX3QgcGlkID0gZm9yaygpOwotICAgIEFTU0VSVF9HRShwaWQsIDApOwotICAgIGlmIChwaWQgPT0gMCkgewotICAgICAgICBzdGQ6OnN0cmluZyBhcmcwID0gIi9zeXN0ZW0vYmluL3NuYXB1c2VyZCI7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGFyZzEgPSAiLXNvY2tldD0icyArIGtTbmFwdXNlcmRTb2NrZXRUZXN0OwotICAgICAgICBjaGFyKiBjb25zdCBhcmd2W10gPSB7YXJnMC5kYXRhKCksIGFyZzEuZGF0YSgpLCBudWxscHRyfTsKLSAgICAgICAgQVNTRVJUX0dFKGV4ZWN2KGFyZzAuY19zdHIoKSwgYXJndiksIDApOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNsaWVudF8gPSBTbmFwdXNlcmRDbGllbnQ6OkNvbm5lY3Qoa1NuYXB1c2VyZFNvY2tldFRlc3QsIDEwcyk7Ci0gICAgICAgIEFTU0VSVF9ORShjbGllbnRfLCBudWxscHRyKTsKLSAgICB9Ci19Ci0KLXZvaWQgQ293U25hcHVzZXJkVGVzdDo6UmVhZExhc3RCbG9jaygpIHsKLSAgICB1bmlxdWVfZmQgcm5kX2ZkOwotICAgIHRvdGFsX2Jhc2Vfc2l6ZV8gPSBCTE9DS19TWiAqIDI7Ci0KLSAgICBiYXNlX2ZkXyA9IENyZWF0ZVRlbXBGaWxlKCJiYXNlX2RldmljZSIsIHRvdGFsX2Jhc2Vfc2l6ZV8pOwotICAgIEFTU0VSVF9HRShiYXNlX2ZkXywgMCk7Ci0KLSAgICBybmRfZmQucmVzZXQob3BlbigiL2Rldi9yYW5kb20iLCBPX1JET05MWSkpOwotICAgIEFTU0VSVF9UUlVFKHJuZF9mZCA+IDApOwotCi0gICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gcmFuZG9tX2J1ZmZlciA9IHN0ZDo6bWFrZV91bmlxdWU8dWludDhfdFtdPihCTE9DS19TWik7Ci0KLSAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8ICgodG90YWxfYmFzZV9zaXplXykgLyBCTE9DS19TWik7IGorKykgewotICAgICAgICBBU1NFUlRfRVEoUmVhZEZ1bGx5QXRPZmZzZXQocm5kX2ZkLCAoY2hhciopcmFuZG9tX2J1ZmZlci5nZXQoKSwgQkxPQ0tfU1osIDApLCB0cnVlKTsKLSAgICAgICAgQVNTRVJUX0VRKGFuZHJvaWQ6OmJhc2U6OldyaXRlRnVsbHkoYmFzZV9mZF8sIHJhbmRvbV9idWZmZXIuZ2V0KCksIEJMT0NLX1NaKSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgQVNTRVJUX0VRKGxzZWVrKGJhc2VfZmRfLCAwLCBTRUVLX1NFVCksIDApOwotCi0gICAgYmFzZV9sb29wXyA9IHN0ZDo6bWFrZV91bmlxdWU8TG9vcERldmljZT4oYmFzZV9mZF8sIDEwcyk7Ci0gICAgQVNTRVJUX1RSVUUoYmFzZV9sb29wXy0+dmFsaWQoKSk7Ci0KLSAgICBzdGQ6OnN0cmluZyBwYXRoID0gYW5kcm9pZDo6YmFzZTo6R2V0RXhlY3V0YWJsZURpcmVjdG9yeSgpOwotICAgIGNvd19zeXN0ZW1fID0gc3RkOjptYWtlX3VuaXF1ZTxUZW1wb3JhcnlGaWxlPihwYXRoKTsKLQotICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IHJhbmRvbV9idWZmZXJfMV8gPSBzdGQ6Om1ha2VfdW5pcXVlPHVpbnQ4X3RbXT4odG90YWxfYmFzZV9zaXplXyk7Ci0gICAgbG9mZl90IG9mZnNldCA9IDA7Ci0KLSAgICAvLyBGaWxsIHJhbmRvbSBkYXRhCi0gICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCAodG90YWxfYmFzZV9zaXplXyAvIEJMT0NLX1NaKTsgaisrKSB7Ci0gICAgICAgIEFTU0VSVF9FUShSZWFkRnVsbHlBdE9mZnNldChybmRfZmQsIChjaGFyKilyYW5kb21fYnVmZmVyXzFfLmdldCgpICsgb2Zmc2V0LCBCTE9DS19TWiwgMCksCi0gICAgICAgICAgICAgICAgICB0cnVlKTsKLQotICAgICAgICBvZmZzZXQgKz0gQkxPQ0tfU1o7Ci0gICAgfQotCi0gICAgQ293T3B0aW9ucyBvcHRpb25zOwotICAgIG9wdGlvbnMuY29tcHJlc3Npb24gPSAiZ3oiOwotICAgIENvd1dyaXRlciB3cml0ZXIob3B0aW9ucyk7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuSW5pdGlhbGl6ZShjb3dfc3lzdGVtXy0+ZmQpKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRSYXdCbG9ja3MoMCwgcmFuZG9tX2J1ZmZlcl8xXy5nZXQoKSwgQkxPQ0tfU1opKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkUmF3QmxvY2tzKDEsIChjaGFyKilyYW5kb21fYnVmZmVyXzFfLmdldCgpICsgQkxPQ0tfU1osIEJMT0NLX1NaKSk7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuRmluYWxpemUoKSk7Ci0KLSAgICBTZXREZXZpY2VDb250cm9sTmFtZSgpOwotCi0gICAgU3RhcnRTbmFwdXNlcmREYWVtb24oKTsKLSAgICBJbml0Q293RGV2aWNlKCk7Ci0KLSAgICBDcmVhdGVEbVVzZXJEZXZpY2UoKTsKLSAgICBJbml0RGFlbW9uKCk7Ci0KLSAgICBDcmVhdGVTbmFwc2hvdERldmljZSgpOwotCi0gICAgdW5pcXVlX2ZkIHNuYXBzaG90X2ZkKG9wZW4oc25hcHNob3RfZGV2Xy0+cGF0aCgpLmNfc3RyKCksIE9fUkRPTkxZKSk7Ci0gICAgQVNTRVJUX1RSVUUoc25hcHNob3RfZmQgPiAwKTsKLQotICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IHNuYXB1c2VyZF9idWZmZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPHVpbnQ4X3RbXT4oQkxPQ0tfU1opOwotCi0gICAgb2Zmc2V0ID0gNzY4MDsKLSAgICBBU1NFUlRfRVEoUmVhZEZ1bGx5QXRPZmZzZXQoc25hcHNob3RfZmQsIHNuYXB1c2VyZF9idWZmZXIuZ2V0KCksIDUxMiwgb2Zmc2V0KSwgdHJ1ZSk7Ci0gICAgQVNTRVJUX0VRKG1lbWNtcChzbmFwdXNlcmRfYnVmZmVyLmdldCgpLCAoY2hhciopcmFuZG9tX2J1ZmZlcl8xXy5nZXQoKSArIG9mZnNldCwgNTEyKSwgMCk7Ci19Ci0KLXZvaWQgQ293U25hcHVzZXJkVGVzdDo6Q3JlYXRlQmFzZURldmljZSgpIHsKLSAgICB1bmlxdWVfZmQgcm5kX2ZkOwotCi0gICAgdG90YWxfYmFzZV9zaXplXyA9IChzaXplXyAqIDUpOwotICAgIGJhc2VfZmRfID0gQ3JlYXRlVGVtcEZpbGUoImJhc2VfZGV2aWNlIiwgdG90YWxfYmFzZV9zaXplXyk7Ci0gICAgQVNTRVJUX0dFKGJhc2VfZmRfLCAwKTsKLQotICAgIHJuZF9mZC5yZXNldChvcGVuKCIvZGV2L3JhbmRvbSIsIE9fUkRPTkxZKSk7Ci0gICAgQVNTRVJUX1RSVUUocm5kX2ZkID4gMCk7Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiByYW5kb21fYnVmZmVyID0gc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KDFfTWlCKTsKLQotICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgKCh0b3RhbF9iYXNlX3NpemVfKSAvIDFfTWlCKTsgaisrKSB7Ci0gICAgICAgIEFTU0VSVF9FUShSZWFkRnVsbHlBdE9mZnNldChybmRfZmQsIChjaGFyKilyYW5kb21fYnVmZmVyLmdldCgpLCAxX01pQiwgMCksIHRydWUpOwotICAgICAgICBBU1NFUlRfRVEoYW5kcm9pZDo6YmFzZTo6V3JpdGVGdWxseShiYXNlX2ZkXywgcmFuZG9tX2J1ZmZlci5nZXQoKSwgMV9NaUIpLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBBU1NFUlRfRVEobHNlZWsoYmFzZV9mZF8sIDAsIFNFRUtfU0VUKSwgMCk7Ci0KLSAgICBiYXNlX2xvb3BfID0gc3RkOjptYWtlX3VuaXF1ZTxMb29wRGV2aWNlPihiYXNlX2ZkXywgMTBzKTsKLSAgICBBU1NFUlRfVFJVRShiYXNlX2xvb3BfLT52YWxpZCgpKTsKLX0KLQotdm9pZCBDb3dTbmFwdXNlcmRUZXN0OjpSZWFkU25hcHNob3REZXZpY2VBbmRWYWxpZGF0ZSgpIHsKLSAgICB1bmlxdWVfZmQgc25hcHNob3RfZmQob3BlbihzbmFwc2hvdF9kZXZfLT5wYXRoKCkuY19zdHIoKSwgT19SRE9OTFkpKTsKLSAgICBBU1NFUlRfVFJVRShzbmFwc2hvdF9mZCA+IDApOwotCi0gICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gc25hcHVzZXJkX2J1ZmZlciA9IHN0ZDo6bWFrZV91bmlxdWU8dWludDhfdFtdPihzaXplXyk7Ci0KLSAgICAvLyBDT1BZCi0gICAgbG9mZl90IG9mZnNldCA9IDA7Ci0gICAgQVNTRVJUX0VRKFJlYWRGdWxseUF0T2Zmc2V0KHNuYXBzaG90X2ZkLCBzbmFwdXNlcmRfYnVmZmVyLmdldCgpLCBzaXplXywgb2Zmc2V0KSwgdHJ1ZSk7Ci0gICAgQVNTRVJUX0VRKG1lbWNtcChzbmFwdXNlcmRfYnVmZmVyLmdldCgpLCBvcmlnX2J1ZmZlcl8uZ2V0KCksIHNpemVfKSwgMCk7Ci0KLSAgICAvLyBSRVBMQUNFCi0gICAgb2Zmc2V0ICs9IHNpemVfOwotICAgIEFTU0VSVF9FUShSZWFkRnVsbHlBdE9mZnNldChzbmFwc2hvdF9mZCwgc25hcHVzZXJkX2J1ZmZlci5nZXQoKSwgc2l6ZV8sIG9mZnNldCksIHRydWUpOwotICAgIEFTU0VSVF9FUShtZW1jbXAoc25hcHVzZXJkX2J1ZmZlci5nZXQoKSwgKGNoYXIqKW9yaWdfYnVmZmVyXy5nZXQoKSArIHNpemVfLCBzaXplXyksIDApOwotCi0gICAgLy8gWkVSTwotICAgIG9mZnNldCArPSBzaXplXzsKLSAgICBBU1NFUlRfRVEoUmVhZEZ1bGx5QXRPZmZzZXQoc25hcHNob3RfZmQsIHNuYXB1c2VyZF9idWZmZXIuZ2V0KCksIHNpemVfLCBvZmZzZXQpLCB0cnVlKTsKLSAgICBBU1NFUlRfRVEobWVtY21wKHNuYXB1c2VyZF9idWZmZXIuZ2V0KCksIChjaGFyKilvcmlnX2J1ZmZlcl8uZ2V0KCkgKyAoc2l6ZV8gKiAyKSwgc2l6ZV8pLCAwKTsKLQotICAgIC8vIFJFUExBQ0UKLSAgICBvZmZzZXQgKz0gc2l6ZV87Ci0gICAgQVNTRVJUX0VRKFJlYWRGdWxseUF0T2Zmc2V0KHNuYXBzaG90X2ZkLCBzbmFwdXNlcmRfYnVmZmVyLmdldCgpLCBzaXplXywgb2Zmc2V0KSwgdHJ1ZSk7Ci0gICAgQVNTRVJUX0VRKG1lbWNtcChzbmFwdXNlcmRfYnVmZmVyLmdldCgpLCAoY2hhciopb3JpZ19idWZmZXJfLmdldCgpICsgKHNpemVfICogMyksIHNpemVfKSwgMCk7Ci0KLSAgICAvLyBYT1IKLSAgICBvZmZzZXQgKz0gc2l6ZV87Ci0gICAgQVNTRVJUX0VRKFJlYWRGdWxseUF0T2Zmc2V0KHNuYXBzaG90X2ZkLCBzbmFwdXNlcmRfYnVmZmVyLmdldCgpLCBzaXplXywgb2Zmc2V0KSwgdHJ1ZSk7Ci0gICAgQVNTRVJUX0VRKG1lbWNtcChzbmFwdXNlcmRfYnVmZmVyLmdldCgpLCAoY2hhciopb3JpZ19idWZmZXJfLmdldCgpICsgKHNpemVfICogNCksIHNpemVfKSwgMCk7Ci19Ci0KLXZvaWQgQ293U25hcHVzZXJkVGVzdDo6Q3JlYXRlQ293RGV2aWNlV2l0aENvcHlPdmVybGFwXzIoKSB7Ci0gICAgc3RkOjpzdHJpbmcgcGF0aCA9IGFuZHJvaWQ6OmJhc2U6OkdldEV4ZWN1dGFibGVEaXJlY3RvcnkoKTsKLSAgICBjb3dfc3lzdGVtXyA9IHN0ZDo6bWFrZV91bmlxdWU8VGVtcG9yYXJ5RmlsZT4ocGF0aCk7Ci0KLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5jb21wcmVzc2lvbiA9ICJneiI7Ci0gICAgQ293V3JpdGVyIHdyaXRlcihvcHRpb25zKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5Jbml0aWFsaXplKGNvd19zeXN0ZW1fLT5mZCkpOwotCi0gICAgc2l6ZV90IG51bV9ibG9ja3MgPSBzaXplXyAvIG9wdGlvbnMuYmxvY2tfc2l6ZTsKLSAgICBzaXplX3QgeCA9IG51bV9ibG9ja3M7Ci0gICAgc2l6ZV90IGJsa19zcmNfY29weSA9IDA7Ci0KLSAgICAvLyBDcmVhdGUgb3ZlcmxhcHBpbmcgY29weSBvcGVyYXRpb25zCi0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoYmxrX3NyY19jb3B5LCBibGtfc3JjX2NvcHkgKyAxKSk7Ci0gICAgICAgIHggLT0gMTsKLSAgICAgICAgaWYgKHggPT0gMSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYmxrX3NyY19jb3B5ICs9IDE7Ci0gICAgfQotCi0gICAgLy8gRmx1c2ggb3BlcmF0aW9ucwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5GaW5hbGl6ZSgpKTsKLQotICAgIC8vIENvbnN0cnVjdCB0aGUgYnVmZmVyIHJlcXVpcmVkIGZvciB2YWxpZGF0aW9uCi0gICAgb3JpZ19idWZmZXJfID0gc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KHRvdGFsX2Jhc2Vfc2l6ZV8pOwotCi0gICAgLy8gUmVhZCB0aGUgZW50aXJlIGJhc2UgZGV2aWNlCi0gICAgQVNTRVJUX0VRKGFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseUF0T2Zmc2V0KGJhc2VfZmRfLCBvcmlnX2J1ZmZlcl8uZ2V0KCksIHRvdGFsX2Jhc2Vfc2l6ZV8sIDApLAotICAgICAgICAgICAgICB0cnVlKTsKLQotICAgIC8vIE1lcmdlZCBvcGVyYXRpb25zIHJlcXVpcmVkIGZvciB2YWxpZGF0aW9uCi0gICAgaW50IGJsb2NrX3NpemUgPSA0MDk2OwotICAgIHggPSBudW1fYmxvY2tzOwotICAgIGxvZmZfdCBzcmNfb2Zmc2V0ID0gYmxvY2tfc2l6ZTsKLSAgICBsb2ZmX3QgZGVzdF9vZmZzZXQgPSAwOwotCi0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgbWVtbW92ZSgoY2hhciopb3JpZ19idWZmZXJfLmdldCgpICsgZGVzdF9vZmZzZXQsIChjaGFyKilvcmlnX2J1ZmZlcl8uZ2V0KCkgKyBzcmNfb2Zmc2V0LAotICAgICAgICAgICAgICAgIGJsb2NrX3NpemUpOwotICAgICAgICB4IC09IDE7Ci0gICAgICAgIGlmICh4ID09IDEpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHNyY19vZmZzZXQgKz0gYmxvY2tfc2l6ZTsKLSAgICAgICAgZGVzdF9vZmZzZXQgKz0gYmxvY2tfc2l6ZTsKLSAgICB9Ci19Ci0KLXZvaWQgQ293U25hcHVzZXJkVGVzdDo6Q3JlYXRlQ293RGV2aWNlV2l0aENvcHlPdmVybGFwXzEoKSB7Ci0gICAgc3RkOjpzdHJpbmcgcGF0aCA9IGFuZHJvaWQ6OmJhc2U6OkdldEV4ZWN1dGFibGVEaXJlY3RvcnkoKTsKLSAgICBjb3dfc3lzdGVtXyA9IHN0ZDo6bWFrZV91bmlxdWU8VGVtcG9yYXJ5RmlsZT4ocGF0aCk7Ci0KLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5jb21wcmVzc2lvbiA9ICJneiI7Ci0gICAgQ293V3JpdGVyIHdyaXRlcihvcHRpb25zKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5Jbml0aWFsaXplKGNvd19zeXN0ZW1fLT5mZCkpOwotCi0gICAgc2l6ZV90IG51bV9ibG9ja3MgPSBzaXplXyAvIG9wdGlvbnMuYmxvY2tfc2l6ZTsKLSAgICBzaXplX3QgeCA9IG51bV9ibG9ja3M7Ci0gICAgc2l6ZV90IGJsa19zcmNfY29weSA9IG51bV9ibG9ja3MgLSAxOwotCi0gICAgLy8gQ3JlYXRlIG92ZXJsYXBwaW5nIGNvcHkgb3BlcmF0aW9ucwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRDb3B5KGJsa19zcmNfY29weSArIDEsIGJsa19zcmNfY29weSkpOwotICAgICAgICB4IC09IDE7Ci0gICAgICAgIGlmICh4ID09IDApIHsKLSAgICAgICAgICAgIEFTU0VSVF9FUShibGtfc3JjX2NvcHksIDApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYmxrX3NyY19jb3B5IC09IDE7Ci0gICAgfQotCi0gICAgLy8gRmx1c2ggb3BlcmF0aW9ucwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5GaW5hbGl6ZSgpKTsKLQotICAgIC8vIENvbnN0cnVjdCB0aGUgYnVmZmVyIHJlcXVpcmVkIGZvciB2YWxpZGF0aW9uCi0gICAgb3JpZ19idWZmZXJfID0gc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KHRvdGFsX2Jhc2Vfc2l6ZV8pOwotCi0gICAgLy8gUmVhZCB0aGUgZW50aXJlIGJhc2UgZGV2aWNlCi0gICAgQVNTRVJUX0VRKGFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseUF0T2Zmc2V0KGJhc2VfZmRfLCBvcmlnX2J1ZmZlcl8uZ2V0KCksIHRvdGFsX2Jhc2Vfc2l6ZV8sIDApLAotICAgICAgICAgICAgICB0cnVlKTsKLQotICAgIC8vIE1lcmdlZCBvcGVyYXRpb25zCi0gICAgQVNTRVJUX0VRKGFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseUF0T2Zmc2V0KGJhc2VfZmRfLCBvcmlnX2J1ZmZlcl8uZ2V0KCksIG9wdGlvbnMuYmxvY2tfc2l6ZSwgMCksCi0gICAgICAgICAgICAgIHRydWUpOwotICAgIEFTU0VSVF9FUShhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHlBdE9mZnNldCgKLSAgICAgICAgICAgICAgICAgICAgICBiYXNlX2ZkXywgKGNoYXIqKW9yaWdfYnVmZmVyXy5nZXQoKSArIG9wdGlvbnMuYmxvY2tfc2l6ZSwgc2l6ZV8sIDApLAotICAgICAgICAgICAgICB0cnVlKTsKLX0KLQotdm9pZCBDb3dTbmFwdXNlcmRUZXN0OjpDcmVhdGVDb3dEZXZpY2VPcmRlcmVkT3BzSW52ZXJ0ZWQoKSB7Ci0gICAgdW5pcXVlX2ZkIHJuZF9mZDsKLSAgICBsb2ZmX3Qgb2Zmc2V0ID0gMDsKLQotICAgIHN0ZDo6c3RyaW5nIHBhdGggPSBhbmRyb2lkOjpiYXNlOjpHZXRFeGVjdXRhYmxlRGlyZWN0b3J5KCk7Ci0gICAgY293X3N5c3RlbV8gPSBzdGQ6Om1ha2VfdW5pcXVlPFRlbXBvcmFyeUZpbGU+KHBhdGgpOwotCi0gICAgcm5kX2ZkLnJlc2V0KG9wZW4oIi9kZXYvcmFuZG9tIiwgT19SRE9OTFkpKTsKLSAgICBBU1NFUlRfVFJVRShybmRfZmQgPiAwKTsKLQotICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IHJhbmRvbV9idWZmZXJfMV8gPSBzdGQ6Om1ha2VfdW5pcXVlPHVpbnQ4X3RbXT4oc2l6ZV8pOwotCi0gICAgLy8gRmlsbCByYW5kb20gZGF0YQotICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgKHNpemVfIC8gMV9NaUIpOyBqKyspIHsKLSAgICAgICAgQVNTRVJUX0VRKFJlYWRGdWxseUF0T2Zmc2V0KHJuZF9mZCwgKGNoYXIqKXJhbmRvbV9idWZmZXJfMV8uZ2V0KCkgKyBvZmZzZXQsIDFfTWlCLCAwKSwKLSAgICAgICAgICAgICAgICAgIHRydWUpOwotCi0gICAgICAgIG9mZnNldCArPSAxX01pQjsKLSAgICB9Ci0KLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5jb21wcmVzc2lvbiA9ICJneiI7Ci0gICAgQ293V3JpdGVyIHdyaXRlcihvcHRpb25zKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5Jbml0aWFsaXplKGNvd19zeXN0ZW1fLT5mZCkpOwotCi0gICAgc2l6ZV90IG51bV9ibG9ja3MgPSBzaXplXyAvIG9wdGlvbnMuYmxvY2tfc2l6ZTsKLSAgICBzaXplX3QgYmxrX2VuZF9jb3B5ID0gbnVtX2Jsb2NrcyAqIDM7Ci0gICAgc2l6ZV90IHNvdXJjZV9ibGsgPSBudW1fYmxvY2tzIC0gMTsKLSAgICBzaXplX3QgYmxrX3NyY19jb3B5ID0gYmxrX2VuZF9jb3B5IC0gMTsKLSAgICB1aW50MTZfdCB4b3Jfb2Zmc2V0ID0gNTsKLQotICAgIHNpemVfdCB4ID0gbnVtX2Jsb2NrczsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weShzb3VyY2VfYmxrLCBibGtfc3JjX2NvcHkpKTsKLSAgICAgICAgeCAtPSAxOwotICAgICAgICBpZiAoeCA9PSAwKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBzb3VyY2VfYmxrIC09IDE7Ci0gICAgICAgIGJsa19zcmNfY29weSAtPSAxOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSBudW1fYmxvY2tzOyBpID4gMDsgaS0tKSB7Ci0gICAgICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRYb3JCbG9ja3MobnVtX2Jsb2NrcyArIGkgLSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyYW5kb21fYnVmZmVyXzFfLmdldCgpW29wdGlvbnMuYmxvY2tfc2l6ZSAqIChpIC0gMSldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuYmxvY2tfc2l6ZSwgMiAqIG51bV9ibG9ja3MgKyBpIC0gMSwgeG9yX29mZnNldCkpOwotICAgIH0KLSAgICAvLyBGbHVzaCBvcGVyYXRpb25zCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkZpbmFsaXplKCkpOwotICAgIC8vIENvbnN0cnVjdCB0aGUgYnVmZmVyIHJlcXVpcmVkIGZvciB2YWxpZGF0aW9uCi0gICAgb3JpZ19idWZmZXJfID0gc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KHRvdGFsX2Jhc2Vfc2l6ZV8pOwotICAgIC8vIFJlYWQgdGhlIGVudGlyZSBiYXNlIGRldmljZQotICAgIEFTU0VSVF9FUShhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHlBdE9mZnNldChiYXNlX2ZkXywgb3JpZ19idWZmZXJfLmdldCgpLCB0b3RhbF9iYXNlX3NpemVfLCAwKSwKLSAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgLy8gTWVyZ2VkIEJ1ZmZlcgotICAgIG1lbW1vdmUob3JpZ19idWZmZXJfLmdldCgpLCAoY2hhciopb3JpZ19idWZmZXJfLmdldCgpICsgMiAqIHNpemVfLCBzaXplXyk7Ci0gICAgbWVtbW92ZShvcmlnX2J1ZmZlcl8uZ2V0KCkgKyBzaXplXywgKGNoYXIqKW9yaWdfYnVmZmVyXy5nZXQoKSArIDIgKiBzaXplXyArIHhvcl9vZmZzZXQsIHNpemVfKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemVfOyBpKyspIHsKLSAgICAgICAgb3JpZ19idWZmZXJfLmdldCgpW3NpemVfICsgaV0gXj0gcmFuZG9tX2J1ZmZlcl8xXy5nZXQoKVtpXTsKLSAgICB9Ci19Ci0KLXZvaWQgQ293U25hcHVzZXJkVGVzdDo6Q3JlYXRlQ293RGV2aWNlT3JkZXJlZE9wcygpIHsKLSAgICB1bmlxdWVfZmQgcm5kX2ZkOwotICAgIGxvZmZfdCBvZmZzZXQgPSAwOwotCi0gICAgc3RkOjpzdHJpbmcgcGF0aCA9IGFuZHJvaWQ6OmJhc2U6OkdldEV4ZWN1dGFibGVEaXJlY3RvcnkoKTsKLSAgICBjb3dfc3lzdGVtXyA9IHN0ZDo6bWFrZV91bmlxdWU8VGVtcG9yYXJ5RmlsZT4ocGF0aCk7Ci0KLSAgICBybmRfZmQucmVzZXQob3BlbigiL2Rldi9yYW5kb20iLCBPX1JET05MWSkpOwotICAgIEFTU0VSVF9UUlVFKHJuZF9mZCA+IDApOwotCi0gICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gcmFuZG9tX2J1ZmZlcl8xXyA9IHN0ZDo6bWFrZV91bmlxdWU8dWludDhfdFtdPihzaXplXyk7Ci0KLSAgICAvLyBGaWxsIHJhbmRvbSBkYXRhCi0gICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCAoc2l6ZV8gLyAxX01pQik7IGorKykgewotICAgICAgICBBU1NFUlRfRVEoUmVhZEZ1bGx5QXRPZmZzZXQocm5kX2ZkLCAoY2hhciopcmFuZG9tX2J1ZmZlcl8xXy5nZXQoKSArIG9mZnNldCwgMV9NaUIsIDApLAotICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0KLSAgICAgICAgb2Zmc2V0ICs9IDFfTWlCOwotICAgIH0KLSAgICBtZW1zZXQocmFuZG9tX2J1ZmZlcl8xXy5nZXQoKSwgMCwgc2l6ZV8pOwotCi0gICAgQ293T3B0aW9ucyBvcHRpb25zOwotICAgIG9wdGlvbnMuY29tcHJlc3Npb24gPSAiZ3oiOwotICAgIENvd1dyaXRlciB3cml0ZXIob3B0aW9ucyk7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuSW5pdGlhbGl6ZShjb3dfc3lzdGVtXy0+ZmQpKTsKLQotICAgIHNpemVfdCBudW1fYmxvY2tzID0gc2l6ZV8gLyBvcHRpb25zLmJsb2NrX3NpemU7Ci0gICAgc2l6ZV90IHggPSBudW1fYmxvY2tzOwotICAgIHNpemVfdCBzb3VyY2VfYmxrID0gMDsKLSAgICBzaXplX3QgYmxrX3NyY19jb3B5ID0gMiAqIG51bV9ibG9ja3M7Ci0gICAgdWludDE2X3QgeG9yX29mZnNldCA9IDU7Ci0KLSAgICB3aGlsZSAoMSkgewotICAgICAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weShzb3VyY2VfYmxrLCBibGtfc3JjX2NvcHkpKTsKLQotICAgICAgICB4IC09IDE7Ci0gICAgICAgIGlmICh4ID09IDApIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHNvdXJjZV9ibGsgKz0gMTsKLSAgICAgICAgYmxrX3NyY19jb3B5ICs9IDE7Ci0gICAgfQotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFhvckJsb2NrcyhudW1fYmxvY2tzLCByYW5kb21fYnVmZmVyXzFfLmdldCgpLCBzaXplXywgMiAqIG51bV9ibG9ja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4b3Jfb2Zmc2V0KSk7Ci0gICAgLy8gRmx1c2ggb3BlcmF0aW9ucwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5GaW5hbGl6ZSgpKTsKLSAgICAvLyBDb25zdHJ1Y3QgdGhlIGJ1ZmZlciByZXF1aXJlZCBmb3IgdmFsaWRhdGlvbgotICAgIG9yaWdfYnVmZmVyXyA9IHN0ZDo6bWFrZV91bmlxdWU8dWludDhfdFtdPih0b3RhbF9iYXNlX3NpemVfKTsKLSAgICAvLyBSZWFkIHRoZSBlbnRpcmUgYmFzZSBkZXZpY2UKLSAgICBBU1NFUlRfRVEoYW5kcm9pZDo6YmFzZTo6UmVhZEZ1bGx5QXRPZmZzZXQoYmFzZV9mZF8sIG9yaWdfYnVmZmVyXy5nZXQoKSwgdG90YWxfYmFzZV9zaXplXywgMCksCi0gICAgICAgICAgICAgIHRydWUpOwotICAgIC8vIE1lcmdlZCBCdWZmZXIKLSAgICBtZW1tb3ZlKG9yaWdfYnVmZmVyXy5nZXQoKSwgKGNoYXIqKW9yaWdfYnVmZmVyXy5nZXQoKSArIDIgKiBzaXplXywgc2l6ZV8pOwotICAgIG1lbW1vdmUob3JpZ19idWZmZXJfLmdldCgpICsgc2l6ZV8sIChjaGFyKilvcmlnX2J1ZmZlcl8uZ2V0KCkgKyAyICogc2l6ZV8gKyB4b3Jfb2Zmc2V0LCBzaXplXyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplXzsgaSsrKSB7Ci0gICAgICAgIG9yaWdfYnVmZmVyXy5nZXQoKVtzaXplXyArIGldIF49IHJhbmRvbV9idWZmZXJfMV8uZ2V0KClbaV07Ci0gICAgfQotfQotCi12b2lkIENvd1NuYXB1c2VyZFRlc3Q6OkNyZWF0ZUNvd0RldmljZSgpIHsKLSAgICB1bmlxdWVfZmQgcm5kX2ZkOwotICAgIGxvZmZfdCBvZmZzZXQgPSAwOwotCi0gICAgc3RkOjpzdHJpbmcgcGF0aCA9IGFuZHJvaWQ6OmJhc2U6OkdldEV4ZWN1dGFibGVEaXJlY3RvcnkoKTsKLSAgICBjb3dfc3lzdGVtXyA9IHN0ZDo6bWFrZV91bmlxdWU8VGVtcG9yYXJ5RmlsZT4ocGF0aCk7Ci0KLSAgICBybmRfZmQucmVzZXQob3BlbigiL2Rldi9yYW5kb20iLCBPX1JET05MWSkpOwotICAgIEFTU0VSVF9UUlVFKHJuZF9mZCA+IDApOwotCi0gICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gcmFuZG9tX2J1ZmZlcl8xXyA9IHN0ZDo6bWFrZV91bmlxdWU8dWludDhfdFtdPihzaXplXyk7Ci0KLSAgICAvLyBGaWxsIHJhbmRvbSBkYXRhCi0gICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCAoc2l6ZV8gLyAxX01pQik7IGorKykgewotICAgICAgICBBU1NFUlRfRVEoUmVhZEZ1bGx5QXRPZmZzZXQocm5kX2ZkLCAoY2hhciopcmFuZG9tX2J1ZmZlcl8xXy5nZXQoKSArIG9mZnNldCwgMV9NaUIsIDApLAotICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0KLSAgICAgICAgb2Zmc2V0ICs9IDFfTWlCOwotICAgIH0KLQotICAgIENvd09wdGlvbnMgb3B0aW9uczsKLSAgICBvcHRpb25zLmNvbXByZXNzaW9uID0gImd6IjsKLSAgICBDb3dXcml0ZXIgd3JpdGVyKG9wdGlvbnMpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkluaXRpYWxpemUoY293X3N5c3RlbV8tPmZkKSk7Ci0KLSAgICBzaXplX3QgbnVtX2Jsb2NrcyA9IHNpemVfIC8gb3B0aW9ucy5ibG9ja19zaXplOwotICAgIHNpemVfdCBibGtfZW5kX2NvcHkgPSBudW1fYmxvY2tzICogMjsKLSAgICBzaXplX3Qgc291cmNlX2JsayA9IG51bV9ibG9ja3MgLSAxOwotICAgIHNpemVfdCBibGtfc3JjX2NvcHkgPSBibGtfZW5kX2NvcHkgLSAxOwotCi0gICAgdWludDMyX3Qgc2VxdWVuY2VbbnVtX2Jsb2NrcyAqIDJdOwotICAgIC8vIFNlcXVlbmNlIGZvciBDb3B5IG9wcwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2Jsb2NrczsgaSsrKSB7Ci0gICAgICAgIHNlcXVlbmNlW2ldID0gbnVtX2Jsb2NrcyAtIDEgLSBpOwotICAgIH0KLSAgICAvLyBTZXF1ZW5jZSBmb3IgWG9yIG9wcwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2Jsb2NrczsgaSsrKSB7Ci0gICAgICAgIHNlcXVlbmNlW251bV9ibG9ja3MgKyBpXSA9IDUgKiBudW1fYmxvY2tzIC0gMSAtIGk7Ci0gICAgfQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRTZXF1ZW5jZURhdGEoMiAqIG51bV9ibG9ja3MsIHNlcXVlbmNlKSk7Ci0KLSAgICBzaXplX3QgeCA9IG51bV9ibG9ja3M7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoc291cmNlX2JsaywgYmxrX3NyY19jb3B5KSk7Ci0gICAgICAgIHggLT0gMTsKLSAgICAgICAgaWYgKHggPT0gMCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgc291cmNlX2JsayAtPSAxOwotICAgICAgICBibGtfc3JjX2NvcHkgLT0gMTsKLSAgICB9Ci0KLSAgICBzb3VyY2VfYmxrID0gbnVtX2Jsb2NrczsKLSAgICBibGtfc3JjX2NvcHkgPSBibGtfZW5kX2NvcHk7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkUmF3QmxvY2tzKHNvdXJjZV9ibGssIHJhbmRvbV9idWZmZXJfMV8uZ2V0KCksIHNpemVfKSk7Ci0KLSAgICBzaXplX3QgYmxrX3plcm9fY29weV9zdGFydCA9IHNvdXJjZV9ibGsgKyBudW1fYmxvY2tzOwotICAgIHNpemVfdCBibGtfemVyb19jb3B5X2VuZCA9IGJsa196ZXJvX2NvcHlfc3RhcnQgKyBudW1fYmxvY2tzOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFplcm9CbG9ja3MoYmxrX3plcm9fY29weV9zdGFydCwgbnVtX2Jsb2NrcykpOwotCi0gICAgc2l6ZV90IGJsa19yYW5kb20yX3JlcGxhY2Vfc3RhcnQgPSBibGtfemVyb19jb3B5X2VuZDsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRSYXdCbG9ja3MoYmxrX3JhbmRvbTJfcmVwbGFjZV9zdGFydCwgcmFuZG9tX2J1ZmZlcl8xXy5nZXQoKSwgc2l6ZV8pKTsKLQotICAgIHNpemVfdCBibGtfeG9yX3N0YXJ0ID0gYmxrX3JhbmRvbTJfcmVwbGFjZV9zdGFydCArIG51bV9ibG9ja3M7Ci0gICAgc2l6ZV90IHhvcl9vZmZzZXQgPSBCTE9DS19TWiAvIDI7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFhvckJsb2NrcyhibGtfeG9yX3N0YXJ0LCByYW5kb21fYnVmZmVyXzFfLmdldCgpLCBzaXplXywgbnVtX2Jsb2NrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhvcl9vZmZzZXQpKTsKLQotICAgIC8vIEZsdXNoIG9wZXJhdGlvbnMKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuRmluYWxpemUoKSk7Ci0gICAgLy8gQ29uc3RydWN0IHRoZSBidWZmZXIgcmVxdWlyZWQgZm9yIHZhbGlkYXRpb24KLSAgICBvcmlnX2J1ZmZlcl8gPSBzdGQ6Om1ha2VfdW5pcXVlPHVpbnQ4X3RbXT4odG90YWxfYmFzZV9zaXplXyk7Ci0gICAgc3RkOjpzdHJpbmcgemVyb19idWZmZXIoc2l6ZV8sIDApOwotICAgIEFTU0VSVF9FUShhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHlBdE9mZnNldChiYXNlX2ZkXywgb3JpZ19idWZmZXJfLmdldCgpLCBzaXplXywgc2l6ZV8pLCB0cnVlKTsKLSAgICBtZW1jcHkoKGNoYXIqKW9yaWdfYnVmZmVyXy5nZXQoKSArIHNpemVfLCByYW5kb21fYnVmZmVyXzFfLmdldCgpLCBzaXplXyk7Ci0gICAgbWVtY3B5KChjaGFyKilvcmlnX2J1ZmZlcl8uZ2V0KCkgKyAoc2l6ZV8gKiAyKSwgKHZvaWQqKXplcm9fYnVmZmVyLmNfc3RyKCksIHNpemVfKTsKLSAgICBtZW1jcHkoKGNoYXIqKW9yaWdfYnVmZmVyXy5nZXQoKSArIChzaXplXyAqIDMpLCByYW5kb21fYnVmZmVyXzFfLmdldCgpLCBzaXplXyk7Ci0gICAgQVNTRVJUX0VRKGFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseUF0T2Zmc2V0KGJhc2VfZmRfLCAmb3JpZ19idWZmZXJfLmdldCgpW3NpemVfICogNF0sIHNpemVfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplXyArIHhvcl9vZmZzZXQpLAotICAgICAgICAgICAgICB0cnVlKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemVfOyBpKyspIHsKLSAgICAgICAgb3JpZ19idWZmZXJfLmdldCgpWyhzaXplXyAqIDQpICsgaV0gPQotICAgICAgICAgICAgICAgICh1aW50OF90KShvcmlnX2J1ZmZlcl8uZ2V0KClbKHNpemVfICogNCkgKyBpXSBeIHJhbmRvbV9idWZmZXJfMV8uZ2V0KClbaV0pOwotICAgIH0KLX0KLQotdm9pZCBDb3dTbmFwdXNlcmRUZXN0OjpJbml0Q293RGV2aWNlKCkgewotICAgIGNvd19udW1fc2VjdG9yc18gPSBjbGllbnRfLT5Jbml0RG1Vc2VyQ293KHN5c3RlbV9kZXZpY2VfY3RybF9uYW1lXywgY293X3N5c3RlbV8tPnBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9sb29wXy0+ZGV2aWNlKCkpOwotICAgIEFTU0VSVF9ORShjb3dfbnVtX3NlY3RvcnNfLCAwKTsKLX0KLQotdm9pZCBDb3dTbmFwdXNlcmRUZXN0OjpTZXREZXZpY2VDb250cm9sTmFtZSgpIHsKLSAgICBzeXN0ZW1fZGV2aWNlX25hbWVfLmNsZWFyKCk7Ci0gICAgc3lzdGVtX2RldmljZV9jdHJsX25hbWVfLmNsZWFyKCk7Ci0KLSAgICBzdGQ6OnN0cmluZyBzdHIoY293X3N5c3RlbV8tPnBhdGgpOwotICAgIHN0ZDo6c2l6ZV90IGZvdW5kID0gc3RyLmZpbmRfbGFzdF9vZigiL1xcIik7Ci0gICAgQVNTRVJUX05FKGZvdW5kLCBzdGQ6OnN0cmluZzo6bnBvcyk7Ci0gICAgc3lzdGVtX2RldmljZV9uYW1lXyA9IHN0ci5zdWJzdHIoZm91bmQgKyAxKTsKLQotICAgIHN5c3RlbV9kZXZpY2VfY3RybF9uYW1lXyA9IHN5c3RlbV9kZXZpY2VfbmFtZV8gKyAiLWN0cmwiOwotfQotCi12b2lkIENvd1NuYXB1c2VyZFRlc3Q6OkNyZWF0ZURtVXNlckRldmljZSgpIHsKLSAgICBEbVRhYmxlIGRtdXNlcl90YWJsZTsKLSAgICBBU1NFUlRfVFJVRShkbXVzZXJfdGFibGUuQWRkVGFyZ2V0KAotICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxEbVRhcmdldFVzZXI+KDAsIGNvd19udW1fc2VjdG9yc18sIHN5c3RlbV9kZXZpY2VfY3RybF9uYW1lXykpKTsKLSAgICBBU1NFUlRfVFJVRShkbXVzZXJfdGFibGUudmFsaWQoKSk7Ci0KLSAgICBkbXVzZXJfZGV2XyA9IHN0ZDo6bWFrZV91bmlxdWU8VGVtcERldmljZT4oc3lzdGVtX2RldmljZV9uYW1lXywgZG11c2VyX3RhYmxlKTsKLSAgICBBU1NFUlRfVFJVRShkbXVzZXJfZGV2Xy0+dmFsaWQoKSk7Ci0gICAgQVNTRVJUX0ZBTFNFKGRtdXNlcl9kZXZfLT5wYXRoKCkuZW1wdHkoKSk7Ci0KLSAgICBhdXRvIG1pc2NfZGV2aWNlID0gIi9kZXYvZG0tdXNlci8iICsgc3lzdGVtX2RldmljZV9jdHJsX25hbWVfOwotICAgIEFTU0VSVF9UUlVFKGFuZHJvaWQ6OmZzX21ncjo6V2FpdEZvckZpbGUobWlzY19kZXZpY2UsIDEwcykpOwotfQotCi12b2lkIENvd1NuYXB1c2VyZFRlc3Q6OlJlYWREbVVzZXJCbG9ja1dpdGhvdXREYWVtb24oKSB7Ci0gICAgRG1UYWJsZSBkbXVzZXJfdGFibGU7Ci0gICAgc3RkOjpzdHJpbmcgZG1fdXNlcl9uYW1lID0gImRtLXRlc3QtZGV2aWNlIjsKLSAgICB1bmlxdWVfZmQgZmQ7Ci0KLSAgICAvLyBDcmVhdGUgYSBkbS11c2VyIGJsb2NrIGRldmljZQotICAgIEFTU0VSVF9UUlVFKGRtdXNlcl90YWJsZS5BZGRUYXJnZXQoc3RkOjptYWtlX3VuaXF1ZTxEbVRhcmdldFVzZXI+KDAsIDEyMzQ1NiwgZG1fdXNlcl9uYW1lKSkpOwotICAgIEFTU0VSVF9UUlVFKGRtdXNlcl90YWJsZS52YWxpZCgpKTsKLQotICAgIGRtdXNlcl9kZXZfID0gc3RkOjptYWtlX3VuaXF1ZTxUZW1wRGV2aWNlPihkbV91c2VyX25hbWUsIGRtdXNlcl90YWJsZSk7Ci0gICAgQVNTRVJUX1RSVUUoZG11c2VyX2Rldl8tPnZhbGlkKCkpOwotICAgIEFTU0VSVF9GQUxTRShkbXVzZXJfZGV2Xy0+cGF0aCgpLmVtcHR5KCkpOwotCi0gICAgZmQucmVzZXQob3BlbihkbXVzZXJfZGV2Xy0+cGF0aCgpLmNfc3RyKCksIE9fUkRPTkxZKSk7Ci0gICAgQVNTRVJUX0dFKGZkLCAwKTsKLQotICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IGJ1ZmZlciA9IHN0ZDo6bWFrZV91bmlxdWU8dWludDhfdFtdPigxX01pQik7Ci0KLSAgICBsb2ZmX3Qgb2Zmc2V0ID0gMDsKLSAgICAvLyBFdmVyeSBJTyBzaG91bGQgZmFpbCBhcyB0aGVyZSBpcyBubyBkYWVtb24gdG8gcHJvY2VzcyB0aGUgSU8KLSAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IDEwOyBqKyspIHsKLSAgICAgICAgQVNTRVJUX0VRKFJlYWRGdWxseUF0T2Zmc2V0KGZkLCAoY2hhciopYnVmZmVyLmdldCgpICsgb2Zmc2V0LCBCTE9DS19TWiwgb2Zmc2V0KSwgZmFsc2UpOwotCi0gICAgICAgIG9mZnNldCArPSBCTE9DS19TWjsKLSAgICB9Ci0KLSAgICBmZCA9IHt9OwotICAgIEFTU0VSVF9UUlVFKGRtdXNlcl9kZXZfLT5EZXN0cm95KCkpOwotfQotCi12b2lkIENvd1NuYXB1c2VyZFRlc3Q6OkluaXREYWVtb24oKSB7Ci0gICAgYm9vbCBvayA9IGNsaWVudF8tPkF0dGFjaERtVXNlcihzeXN0ZW1fZGV2aWNlX2N0cmxfbmFtZV8pOwotICAgIEFTU0VSVF9UUlVFKG9rKTsKLX0KLQotdm9pZCBDb3dTbmFwdXNlcmRUZXN0OjpDcmVhdGVTbmFwc2hvdERldmljZSgpIHsKLSAgICBEbVRhYmxlIHNuYXBfdGFibGU7Ci0gICAgQVNTRVJUX1RSVUUoc25hcF90YWJsZS5BZGRUYXJnZXQoc3RkOjptYWtlX3VuaXF1ZTxEbVRhcmdldFNuYXBzaG90PigKLSAgICAgICAgICAgIDAsIHRvdGFsX2Jhc2Vfc2l6ZV8gLyBrU2VjdG9yU2l6ZSwgYmFzZV9sb29wXy0+ZGV2aWNlKCksIGRtdXNlcl9kZXZfLT5wYXRoKCksCi0gICAgICAgICAgICBTbmFwc2hvdFN0b3JhZ2VNb2RlOjpQZXJzaXN0ZW50LCA4KSkpOwotICAgIEFTU0VSVF9UUlVFKHNuYXBfdGFibGUudmFsaWQoKSk7Ci0KLSAgICBzbmFwX3RhYmxlLnNldF9yZWFkb25seSh0cnVlKTsKLQotICAgIHNuYXBzaG90X2Rldl8gPSBzdGQ6Om1ha2VfdW5pcXVlPFRlbXBEZXZpY2U+KCJjb3dzbmFwdXNlcmQtdGVzdC1kbS1zbmFwc2hvdCIsIHNuYXBfdGFibGUpOwotICAgIEFTU0VSVF9UUlVFKHNuYXBzaG90X2Rldl8tPnZhbGlkKCkpOwotICAgIEFTU0VSVF9GQUxTRShzbmFwc2hvdF9kZXZfLT5wYXRoKCkuZW1wdHkoKSk7Ci19Ci0KLXZvaWQgQ293U25hcHVzZXJkVGVzdDo6U2V0dXBJbXBsKCkgewotICAgIENyZWF0ZUJhc2VEZXZpY2UoKTsKLSAgICBDcmVhdGVDb3dEZXZpY2UoKTsKLQotICAgIFNldERldmljZUNvbnRyb2xOYW1lKCk7Ci0KLSAgICBTdGFydFNuYXB1c2VyZERhZW1vbigpOwotICAgIEluaXRDb3dEZXZpY2UoKTsKLQotICAgIENyZWF0ZURtVXNlckRldmljZSgpOwotICAgIEluaXREYWVtb24oKTsKLQotICAgIENyZWF0ZVNuYXBzaG90RGV2aWNlKCk7Ci0gICAgc2V0dXBfb2tfID0gdHJ1ZTsKLX0KLQotYm9vbCBDb3dTbmFwdXNlcmRUZXN0OjpNZXJnZSgpIHsKLSAgICBNZXJnZUltcGwoKTsKLSAgICByZXR1cm4gbWVyZ2Vfb2tfOwotfQotCi12b2lkIENvd1NuYXB1c2VyZFRlc3Q6OlN0YXJ0TWVyZ2UoKSB7Ci0gICAgRG1UYWJsZSBtZXJnZV90YWJsZTsKLSAgICBBU1NFUlRfVFJVRShtZXJnZV90YWJsZS5BZGRUYXJnZXQoc3RkOjptYWtlX3VuaXF1ZTxEbVRhcmdldFNuYXBzaG90PigKLSAgICAgICAgICAgIDAsIHRvdGFsX2Jhc2Vfc2l6ZV8gLyBrU2VjdG9yU2l6ZSwgYmFzZV9sb29wXy0+ZGV2aWNlKCksIGRtdXNlcl9kZXZfLT5wYXRoKCksCi0gICAgICAgICAgICBTbmFwc2hvdFN0b3JhZ2VNb2RlOjpNZXJnZSwgOCkpKTsKLSAgICBBU1NFUlRfVFJVRShtZXJnZV90YWJsZS52YWxpZCgpKTsKLSAgICBBU1NFUlRfRVEodG90YWxfYmFzZV9zaXplXyAvIGtTZWN0b3JTaXplLCBtZXJnZV90YWJsZS5udW1fc2VjdG9ycygpKTsKLQotICAgIERldmljZU1hcHBlciYgZG0gPSBEZXZpY2VNYXBwZXI6Okluc3RhbmNlKCk7Ci0gICAgQVNTRVJUX1RSVUUoZG0uTG9hZFRhYmxlQW5kQWN0aXZhdGUoImNvd3NuYXB1c2VyZC10ZXN0LWRtLXNuYXBzaG90IiwgbWVyZ2VfdGFibGUpKTsKLX0KLQotdm9pZCBDb3dTbmFwdXNlcmRUZXN0OjpNZXJnZUltcGwoKSB7Ci0gICAgU3RhcnRNZXJnZSgpOwotICAgIERldmljZU1hcHBlciYgZG0gPSBEZXZpY2VNYXBwZXI6Okluc3RhbmNlKCk7Ci0KLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICB2ZWN0b3I8RGV2aWNlTWFwcGVyOjpUYXJnZXRJbmZvPiBzdGF0dXM7Ci0gICAgICAgIEFTU0VSVF9UUlVFKGRtLkdldFRhYmxlU3RhdHVzKCJjb3dzbmFwdXNlcmQtdGVzdC1kbS1zbmFwc2hvdCIsICZzdGF0dXMpKTsKLSAgICAgICAgQVNTRVJUX0VRKHN0YXR1cy5zaXplKCksIDEpOwotICAgICAgICBBU1NFUlRfRVEoc3RybmNtcChzdGF0dXNbMF0uc3BlYy50YXJnZXRfdHlwZSwgInNuYXBzaG90LW1lcmdlIiwgc3RybGVuKCJzbmFwc2hvdC1tZXJnZSIpKSwKLSAgICAgICAgICAgICAgICAgIDApOwotCi0gICAgICAgIERtVGFyZ2V0U25hcHNob3Q6OlN0YXR1cyBtZXJnZV9zdGF0dXM7Ci0gICAgICAgIEFTU0VSVF9UUlVFKERtVGFyZ2V0U25hcHNob3Q6OlBhcnNlU3RhdHVzVGV4dChzdGF0dXNbMF0uZGF0YSwgJm1lcmdlX3N0YXR1cykpOwotICAgICAgICBBU1NFUlRfVFJVRShtZXJnZV9zdGF0dXMuZXJyb3IuZW1wdHkoKSk7Ci0gICAgICAgIGlmIChtZXJnZV9zdGF0dXMuc2VjdG9yc19hbGxvY2F0ZWQgPT0gbWVyZ2Vfc3RhdHVzLm1ldGFkYXRhX3NlY3RvcnMpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKDI1MG1zKTsKLSAgICB9Ci0KLSAgICBtZXJnZV9va18gPSB0cnVlOwotfQotCi12b2lkIENvd1NuYXB1c2VyZFRlc3Q6OlZhbGlkYXRlTWVyZ2UoKSB7Ci0gICAgbWVyZ2VkX2J1ZmZlcl8gPSBzdGQ6Om1ha2VfdW5pcXVlPHVpbnQ4X3RbXT4odG90YWxfYmFzZV9zaXplXyk7Ci0gICAgQVNTRVJUX0VRKGFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseUF0T2Zmc2V0KGJhc2VfZmRfLCBtZXJnZWRfYnVmZmVyXy5nZXQoKSwgdG90YWxfYmFzZV9zaXplXywgMCksCi0gICAgICAgICAgICAgIHRydWUpOwotICAgIEFTU0VSVF9FUShtZW1jbXAobWVyZ2VkX2J1ZmZlcl8uZ2V0KCksIG9yaWdfYnVmZmVyXy5nZXQoKSwgdG90YWxfYmFzZV9zaXplXyksIDApOwotfQotCi12b2lkIENvd1NuYXB1c2VyZFRlc3Q6OlNpbXVsYXRlRGFlbW9uUmVzdGFydCgpIHsKLSAgICBTaHV0ZG93bigpOwotICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2Zvcig1MDBtcyk7Ci0gICAgU2V0RGV2aWNlQ29udHJvbE5hbWUoKTsKLSAgICBTdGFydFNuYXB1c2VyZERhZW1vbigpOwotICAgIEluaXRDb3dEZXZpY2UoKTsKLSAgICBDcmVhdGVEbVVzZXJEZXZpY2UoKTsKLSAgICBJbml0RGFlbW9uKCk7Ci0gICAgQ3JlYXRlU25hcHNob3REZXZpY2UoKTsKLX0KLQotdm9pZCBDb3dTbmFwdXNlcmRUZXN0OjpNZXJnZUludGVycnVwdFJhbmRvbWx5KGludCBtYXhfZHVyYXRpb24pIHsKLSAgICBzdGQ6OnNyYW5kKHN0ZDo6dGltZShudWxscHRyKSk7Ci0gICAgU3RhcnRNZXJnZSgpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7Ci0gICAgICAgIGludCBkdXJhdGlvbiA9IHN0ZDo6cmFuZCgpICUgbWF4X2R1cmF0aW9uOwotICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyhkdXJhdGlvbikpOwotICAgICAgICBTaW11bGF0ZURhZW1vblJlc3RhcnQoKTsKLSAgICAgICAgU3RhcnRNZXJnZSgpOwotICAgIH0KLQotICAgIFNpbXVsYXRlRGFlbW9uUmVzdGFydCgpOwotICAgIEFTU0VSVF9UUlVFKE1lcmdlKCkpOwotfQotCi12b2lkIENvd1NuYXB1c2VyZFRlc3Q6Ok1lcmdlSW50ZXJydXB0Rml4ZWQoaW50IGR1cmF0aW9uKSB7Ci0gICAgU3RhcnRNZXJnZSgpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTsgaSsrKSB7Ci0gICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKGR1cmF0aW9uKSk7Ci0gICAgICAgIFNpbXVsYXRlRGFlbW9uUmVzdGFydCgpOwotICAgICAgICBTdGFydE1lcmdlKCk7Ci0gICAgfQotCi0gICAgU2ltdWxhdGVEYWVtb25SZXN0YXJ0KCk7Ci0gICAgQVNTRVJUX1RSVUUoTWVyZ2UoKSk7Ci19Ci0KLXZvaWQgQ293U25hcHVzZXJkVGVzdDo6TWVyZ2VJbnRlcnJ1cHQoKSB7Ci0gICAgLy8gSW50ZXJydXB0IG1lcmdlIGF0IHZhcmlvdXMgaW50ZXJ2YWxzCi0gICAgU3RhcnRNZXJnZSgpOwotICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcigyNTBtcyk7Ci0gICAgU2ltdWxhdGVEYWVtb25SZXN0YXJ0KCk7Ci0KLSAgICBTdGFydE1lcmdlKCk7Ci0gICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKDI1MG1zKTsKLSAgICBTaW11bGF0ZURhZW1vblJlc3RhcnQoKTsKLQotICAgIFN0YXJ0TWVyZ2UoKTsKLSAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoMTUwbXMpOwotICAgIFNpbXVsYXRlRGFlbW9uUmVzdGFydCgpOwotCi0gICAgU3RhcnRNZXJnZSgpOwotICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcigxMDBtcyk7Ci0gICAgU2ltdWxhdGVEYWVtb25SZXN0YXJ0KCk7Ci0KLSAgICBTdGFydE1lcmdlKCk7Ci0gICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKDgwMG1zKTsKLSAgICBTaW11bGF0ZURhZW1vblJlc3RhcnQoKTsKLQotICAgIFN0YXJ0TWVyZ2UoKTsKLSAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoNjAwbXMpOwotICAgIFNpbXVsYXRlRGFlbW9uUmVzdGFydCgpOwotCi0gICAgQVNTRVJUX1RSVUUoTWVyZ2UoKSk7Ci19Ci0KLXZvaWQgQ293U25hcHVzZXJkTWV0YWRhdGFUZXN0OjpDcmVhdGVDb3dQYXJ0aWFsRmlsbGVkQXJlYSgpIHsKLSAgICBzdGQ6OnN0cmluZyBwYXRoID0gYW5kcm9pZDo6YmFzZTo6R2V0RXhlY3V0YWJsZURpcmVjdG9yeSgpOwotICAgIGNvd19zeXN0ZW1fID0gc3RkOjptYWtlX3VuaXF1ZTxUZW1wb3JhcnlGaWxlPihwYXRoKTsKLQotICAgIENvd09wdGlvbnMgb3B0aW9uczsKLSAgICBvcHRpb25zLmNvbXByZXNzaW9uID0gImd6IjsKLSAgICBDb3dXcml0ZXIgd3JpdGVyKG9wdGlvbnMpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkluaXRpYWxpemUoY293X3N5c3RlbV8tPmZkKSk7Ci0KLSAgICAvLyBBcmVhIDAgaXMgY29tcGxldGVseSBmaWxsZWQgd2l0aCAyNTYgZXhjZXB0aW9ucwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLSAgICAgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoaSwgMjU2ICsgaSkpOwotICAgIH0KLQotICAgIC8vIEFyZWEgMSBpcyBwYXJ0aWFsbHkgZmlsbGVkIHdpdGggMiBjb3B5IG9wcyBhbmQgMTAgemVybyBvcHMKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weSg1MDAsIDEwMDApKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weSg1MDEsIDEwMDEpKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRaZXJvQmxvY2tzKDMwMCwgMTApKTsKLQotICAgIC8vIEZsdXNoIG9wZXJhdGlvbnMKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuRmluYWxpemUoKSk7Ci19Ci0KLXZvaWQgQ293U25hcHVzZXJkTWV0YWRhdGFUZXN0OjpWYWxpZGF0ZVBhcnRpYWxGaWxsZWRBcmVhKCkgewotICAgIGludCBhcmVhX3N6ID0gc25hcHVzZXJkXy0+R2V0TWV0YWRhdGFBcmVhU2l6ZSgpOwotCi0gICAgQVNTRVJUX0VRKGFyZWFfc3osIDIpOwotCi0gICAgLy8gVmVyaWZ5IHRoZSBwYXJ0aWFsbHkgZmlsbGVkIGFyZWEKLSAgICB2b2lkKiBidWZmZXIgPSBzbmFwdXNlcmRfLT5HZXRFeGNlcHRpb25CdWZmZXIoMSk7Ci0gICAgbG9mZl90IG9mZnNldCA9IDA7Ci0gICAgc3RydWN0IGRpc2tfZXhjZXB0aW9uKiBkZTsKLSAgICBmb3IgKGludCBpID0gMTE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgIGRlID0gcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3QgZGlza19leGNlcHRpb24qPigoY2hhciopYnVmZmVyICsgb2Zmc2V0KTsKLSAgICAgICAgQVNTRVJUX0VRKGRlLT5vbGRfY2h1bmssIGkpOwotICAgICAgICBvZmZzZXQgKz0gc2l6ZW9mKHN0cnVjdCBkaXNrX2V4Y2VwdGlvbik7Ci0gICAgfQotCi0gICAgZGUgPSByZWludGVycHJldF9jYXN0PHN0cnVjdCBkaXNrX2V4Y2VwdGlvbio+KChjaGFyKilidWZmZXIgKyBvZmZzZXQpOwotICAgIEFTU0VSVF9FUShkZS0+b2xkX2NodW5rLCAwKTsKLSAgICBBU1NFUlRfRVEoZGUtPm5ld19jaHVuaywgMCk7Ci19Ci0KLXZvaWQgQ293U25hcHVzZXJkTWV0YWRhdGFUZXN0OjpTZXR1cFBhcnRpYWxBcmVhKCkgewotICAgIENyZWF0ZUNvd1BhcnRpYWxGaWxsZWRBcmVhKCk7Ci0gICAgSW5pdE1ldGFkYXRhKCk7Ci19Ci0KLXZvaWQgQ293U25hcHVzZXJkTWV0YWRhdGFUZXN0OjpDcmVhdGVDb3dEZXZpY2UoKSB7Ci0gICAgdW5pcXVlX2ZkIHJuZF9mZDsKLSAgICBsb2ZmX3Qgb2Zmc2V0ID0gMDsKLQotICAgIHN0ZDo6c3RyaW5nIHBhdGggPSBhbmRyb2lkOjpiYXNlOjpHZXRFeGVjdXRhYmxlRGlyZWN0b3J5KCk7Ci0gICAgY293X3N5c3RlbV8gPSBzdGQ6Om1ha2VfdW5pcXVlPFRlbXBvcmFyeUZpbGU+KHBhdGgpOwotCi0gICAgcm5kX2ZkLnJlc2V0KG9wZW4oIi9kZXYvcmFuZG9tIiwgT19SRE9OTFkpKTsKLSAgICBBU1NFUlRfVFJVRShybmRfZmQgPiAwKTsKLQotICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IHJhbmRvbV9idWZmZXJfMV8gPSBzdGQ6Om1ha2VfdW5pcXVlPHVpbnQ4X3RbXT4oc2l6ZV8pOwotCi0gICAgLy8gRmlsbCByYW5kb20gZGF0YQotICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgKHNpemVfIC8gMV9NaUIpOyBqKyspIHsKLSAgICAgICAgQVNTRVJUX0VRKFJlYWRGdWxseUF0T2Zmc2V0KHJuZF9mZCwgKGNoYXIqKXJhbmRvbV9idWZmZXJfMV8uZ2V0KCkgKyBvZmZzZXQsIDFfTWlCLCAwKSwKLSAgICAgICAgICAgICAgICAgIHRydWUpOwotCi0gICAgICAgIG9mZnNldCArPSAxX01pQjsKLSAgICB9Ci0KLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5jb21wcmVzc2lvbiA9ICJneiI7Ci0gICAgQ293V3JpdGVyIHdyaXRlcihvcHRpb25zKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5Jbml0aWFsaXplKGNvd19zeXN0ZW1fLT5mZCkpOwotCi0gICAgc2l6ZV90IG51bV9ibG9ja3MgPSBzaXplXyAvIG9wdGlvbnMuYmxvY2tfc2l6ZTsKLQotICAgIC8vIE92ZXJsYXBwaW5nIHJlZ2lvbi4gVGhpcyBoYXMgdG8gYmUgc3BsaXQKLSAgICAvLyBpbnRvIHR3byBiYXRjaCBvcGVyYXRpb25zCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoMjMsIDIwKSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoMjIsIDE5KSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoMjEsIDE4KSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoMjAsIDE3KSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoMTksIDE2KSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoMTgsIDE1KSk7Ci0KLSAgICAvLyBDb250aWd1b3VzIHJlZ2lvbiBidXQgYmxvY2tzIGluIGFzY2VuZGluZyBvcmRlcgotICAgIC8vIERhZW1vbiBoYXMgdG8gZW5zdXJlIHRoYXQgdGhlc2UgYmxvY2tzIGFyZSBtZXJnZWQKLSAgICAvLyBpbiBhIGJhdGNoCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoNTAsIDc1KSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoNTEsIDc2KSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoNTIsIDc3KSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoNTMsIDc4KSk7Ci0KLSAgICAvLyBEaXMtY29udGlndW91cyByZWdpb24KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weSgxMTAsIDEzMCkpOwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRDb3B5KDEwNSwgMTI1KSk7Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoMTAwLCAxMjApKTsKLQotICAgIC8vIE92ZXJsYXAKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weSgyNSwgMzApKTsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weSgzMCwgMzEpKTsKLQotICAgIHNpemVfdCBzb3VyY2VfYmxrID0gbnVtX2Jsb2NrczsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRSYXdCbG9ja3Moc291cmNlX2JsaywgcmFuZG9tX2J1ZmZlcl8xXy5nZXQoKSwgc2l6ZV8pKTsKLQotICAgIHNpemVfdCBibGtfemVyb19jb3B5X3N0YXJ0ID0gc291cmNlX2JsayArIG51bV9ibG9ja3M7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWmVyb0Jsb2NrcyhibGtfemVyb19jb3B5X3N0YXJ0LCBudW1fYmxvY2tzKSk7Ci0KLSAgICAvLyBGbHVzaCBvcGVyYXRpb25zCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkZpbmFsaXplKCkpOwotfQotCi12b2lkIENvd1NuYXB1c2VyZE1ldGFkYXRhVGVzdDo6SW5pdE1ldGFkYXRhKCkgewotICAgIHNuYXB1c2VyZF8gPSBzdGQ6Om1ha2VfdW5pcXVlPFNuYXB1c2VyZD4oIiIsIGNvd19zeXN0ZW1fLT5wYXRoLCAiIik7Ci0gICAgQVNTRVJUX1RSVUUoc25hcHVzZXJkXy0+SW5pdENvd0RldmljZSgpKTsKLX0KLQotdm9pZCBDb3dTbmFwdXNlcmRNZXRhZGF0YVRlc3Q6OlNldHVwKCkgewotICAgIENyZWF0ZUNvd0RldmljZSgpOwotICAgIEluaXRNZXRhZGF0YSgpOwotfQotCi12b2lkIENvd1NuYXB1c2VyZE1ldGFkYXRhVGVzdDo6VmFsaWRhdGVNZXRhZGF0YSgpIHsKLSAgICBpbnQgYXJlYV9zeiA9IHNuYXB1c2VyZF8tPkdldE1ldGFkYXRhQXJlYVNpemUoKTsKLSAgICBBU1NFUlRfRVEoYXJlYV9zeiwgMyk7Ci0KLSAgICBzaXplX3Qgb2xkX2NodW5rOwotICAgIHNpemVfdCBuZXdfY2h1bms7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZWFfc3o7IGkrKykgewotICAgICAgICB2b2lkKiBidWZmZXIgPSBzbmFwdXNlcmRfLT5HZXRFeGNlcHRpb25CdWZmZXIoaSk7Ci0gICAgICAgIGxvZmZfdCBvZmZzZXQgPSAwOwotICAgICAgICBpZiAoaSA9PSAwKSB7Ci0gICAgICAgICAgICBvbGRfY2h1bmsgPSAyNTY7Ci0gICAgICAgICAgICBuZXdfY2h1bmsgPSAyOwotICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMSkgewotICAgICAgICAgICAgb2xkX2NodW5rID0gNTEyOwotICAgICAgICAgICAgbmV3X2NodW5rID0gMjU5OwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMjU2OyBqKyspIHsKLSAgICAgICAgICAgIHN0cnVjdCBkaXNrX2V4Y2VwdGlvbiogZGUgPQotICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHN0cnVjdCBkaXNrX2V4Y2VwdGlvbio+KChjaGFyKilidWZmZXIgKyBvZmZzZXQpOwotCi0gICAgICAgICAgICBpZiAoaSAhPSAyKSB7Ci0gICAgICAgICAgICAgICAgQVNTRVJUX0VRKGRlLT5vbGRfY2h1bmssIG9sZF9jaHVuayk7Ci0gICAgICAgICAgICAgICAgQVNTRVJUX0VRKGRlLT5uZXdfY2h1bmssIG5ld19jaHVuayk7Ci0gICAgICAgICAgICAgICAgb2xkX2NodW5rICs9IDE7Ci0gICAgICAgICAgICAgICAgbmV3X2NodW5rICs9IDE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemVvZihzdHJ1Y3QgZGlza19leGNlcHRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGkgPT0gMikgewotICAgICAgICAgICAgLy8gVGhlIGZpcnN0IDUgY29weSBvcGVyYXRpb24gaXMgbm90IGJhdGNoIG1lcmdlZAotICAgICAgICAgICAgLy8gYXMgdGhlIHNlcXVlbmNlIGlzIGRpc2NvbnRpZ3VvdXMKLSAgICAgICAgICAgIHN0cnVjdCBkaXNrX2V4Y2VwdGlvbiogZGUgPQotICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHN0cnVjdCBkaXNrX2V4Y2VwdGlvbio+KChjaGFyKilidWZmZXIgKyBvZmZzZXQpOwotICAgICAgICAgICAgQVNTRVJUX0VRKGRlLT5vbGRfY2h1bmssIDMwKTsKLSAgICAgICAgICAgIEFTU0VSVF9FUShkZS0+bmV3X2NodW5rLCA1MTgpOwotICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemVvZihzdHJ1Y3QgZGlza19leGNlcHRpb24pOwotCi0gICAgICAgICAgICBkZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IGRpc2tfZXhjZXB0aW9uKj4oKGNoYXIqKWJ1ZmZlciArIG9mZnNldCk7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoZGUtPm9sZF9jaHVuaywgMjUpOwotICAgICAgICAgICAgQVNTRVJUX0VRKGRlLT5uZXdfY2h1bmssIDUyMCk7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZW9mKHN0cnVjdCBkaXNrX2V4Y2VwdGlvbik7Ci0KLSAgICAgICAgICAgIGRlID0gcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3QgZGlza19leGNlcHRpb24qPigoY2hhciopYnVmZmVyICsgb2Zmc2V0KTsKLSAgICAgICAgICAgIEFTU0VSVF9FUShkZS0+b2xkX2NodW5rLCAxMDApOwotICAgICAgICAgICAgQVNTRVJUX0VRKGRlLT5uZXdfY2h1bmssIDUyMSk7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZW9mKHN0cnVjdCBkaXNrX2V4Y2VwdGlvbik7Ci0KLSAgICAgICAgICAgIGRlID0gcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3QgZGlza19leGNlcHRpb24qPigoY2hhciopYnVmZmVyICsgb2Zmc2V0KTsKLSAgICAgICAgICAgIEFTU0VSVF9FUShkZS0+b2xkX2NodW5rLCAxMDUpOwotICAgICAgICAgICAgQVNTRVJUX0VRKGRlLT5uZXdfY2h1bmssIDUyMik7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZW9mKHN0cnVjdCBkaXNrX2V4Y2VwdGlvbik7Ci0KLSAgICAgICAgICAgIGRlID0gcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3QgZGlza19leGNlcHRpb24qPigoY2hhciopYnVmZmVyICsgb2Zmc2V0KTsKLSAgICAgICAgICAgIEFTU0VSVF9FUShkZS0+b2xkX2NodW5rLCAxMTApOwotICAgICAgICAgICAgQVNTRVJUX0VRKGRlLT5uZXdfY2h1bmssIDUyMyk7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZW9mKHN0cnVjdCBkaXNrX2V4Y2VwdGlvbik7Ci0KLSAgICAgICAgICAgIC8vIFRoZSBuZXh0IDQgb3BlcmF0aW9ucyBhcmUgYmF0Y2ggbWVyZ2VkIGFzCi0gICAgICAgICAgICAvLyBib3RoIG9sZCBhbmQgbmV3IGNodW5rIGFyZSBjb250aWd1b3VzCi0gICAgICAgICAgICBkZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IGRpc2tfZXhjZXB0aW9uKj4oKGNoYXIqKWJ1ZmZlciArIG9mZnNldCk7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoZGUtPm9sZF9jaHVuaywgNTMpOwotICAgICAgICAgICAgQVNTRVJUX0VRKGRlLT5uZXdfY2h1bmssIDUyNCk7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZW9mKHN0cnVjdCBkaXNrX2V4Y2VwdGlvbik7Ci0KLSAgICAgICAgICAgIGRlID0gcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3QgZGlza19leGNlcHRpb24qPigoY2hhciopYnVmZmVyICsgb2Zmc2V0KTsKLSAgICAgICAgICAgIEFTU0VSVF9FUShkZS0+b2xkX2NodW5rLCA1Mik7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoZGUtPm5ld19jaHVuaywgNTI1KTsKLSAgICAgICAgICAgIG9mZnNldCArPSBzaXplb2Yoc3RydWN0IGRpc2tfZXhjZXB0aW9uKTsKLQotICAgICAgICAgICAgZGUgPSByZWludGVycHJldF9jYXN0PHN0cnVjdCBkaXNrX2V4Y2VwdGlvbio+KChjaGFyKilidWZmZXIgKyBvZmZzZXQpOwotICAgICAgICAgICAgQVNTRVJUX0VRKGRlLT5vbGRfY2h1bmssIDUxKTsKLSAgICAgICAgICAgIEFTU0VSVF9FUShkZS0+bmV3X2NodW5rLCA1MjYpOwotICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemVvZihzdHJ1Y3QgZGlza19leGNlcHRpb24pOwotCi0gICAgICAgICAgICBkZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IGRpc2tfZXhjZXB0aW9uKj4oKGNoYXIqKWJ1ZmZlciArIG9mZnNldCk7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoZGUtPm9sZF9jaHVuaywgNTApOwotICAgICAgICAgICAgQVNTRVJUX0VRKGRlLT5uZXdfY2h1bmssIDUyNyk7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZW9mKHN0cnVjdCBkaXNrX2V4Y2VwdGlvbik7Ci0KLSAgICAgICAgICAgIC8vIFRoaXMgaXMgaGFuZGxpbmcgb3ZlcmxhcCBvcGVyYXRpb24gd2l0aAotICAgICAgICAgICAgLy8gdHdvIGJhdGNoIG1lcmdlIG9wZXJhdGlvbnMuCi0gICAgICAgICAgICBkZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IGRpc2tfZXhjZXB0aW9uKj4oKGNoYXIqKWJ1ZmZlciArIG9mZnNldCk7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoZGUtPm9sZF9jaHVuaywgMTgpOwotICAgICAgICAgICAgQVNTRVJUX0VRKGRlLT5uZXdfY2h1bmssIDUyOCk7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZW9mKHN0cnVjdCBkaXNrX2V4Y2VwdGlvbik7Ci0KLSAgICAgICAgICAgIGRlID0gcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3QgZGlza19leGNlcHRpb24qPigoY2hhciopYnVmZmVyICsgb2Zmc2V0KTsKLSAgICAgICAgICAgIEFTU0VSVF9FUShkZS0+b2xkX2NodW5rLCAxOSk7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoZGUtPm5ld19jaHVuaywgNTI5KTsKLSAgICAgICAgICAgIG9mZnNldCArPSBzaXplb2Yoc3RydWN0IGRpc2tfZXhjZXB0aW9uKTsKLQotICAgICAgICAgICAgZGUgPSByZWludGVycHJldF9jYXN0PHN0cnVjdCBkaXNrX2V4Y2VwdGlvbio+KChjaGFyKilidWZmZXIgKyBvZmZzZXQpOwotICAgICAgICAgICAgQVNTRVJUX0VRKGRlLT5vbGRfY2h1bmssIDIwKTsKLSAgICAgICAgICAgIEFTU0VSVF9FUShkZS0+bmV3X2NodW5rLCA1MzApOwotICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemVvZihzdHJ1Y3QgZGlza19leGNlcHRpb24pOwotCi0gICAgICAgICAgICBkZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IGRpc2tfZXhjZXB0aW9uKj4oKGNoYXIqKWJ1ZmZlciArIG9mZnNldCk7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoZGUtPm9sZF9jaHVuaywgMjEpOwotICAgICAgICAgICAgQVNTRVJUX0VRKGRlLT5uZXdfY2h1bmssIDUzMik7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZW9mKHN0cnVjdCBkaXNrX2V4Y2VwdGlvbik7Ci0KLSAgICAgICAgICAgIGRlID0gcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3QgZGlza19leGNlcHRpb24qPigoY2hhciopYnVmZmVyICsgb2Zmc2V0KTsKLSAgICAgICAgICAgIEFTU0VSVF9FUShkZS0+b2xkX2NodW5rLCAyMik7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoZGUtPm5ld19jaHVuaywgNTMzKTsKLSAgICAgICAgICAgIG9mZnNldCArPSBzaXplb2Yoc3RydWN0IGRpc2tfZXhjZXB0aW9uKTsKLQotICAgICAgICAgICAgZGUgPSByZWludGVycHJldF9jYXN0PHN0cnVjdCBkaXNrX2V4Y2VwdGlvbio+KChjaGFyKilidWZmZXIgKyBvZmZzZXQpOwotICAgICAgICAgICAgQVNTRVJUX0VRKGRlLT5vbGRfY2h1bmssIDIzKTsKLSAgICAgICAgICAgIEFTU0VSVF9FUShkZS0+bmV3X2NodW5rLCA1MzQpOwotICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemVvZihzdHJ1Y3QgZGlza19leGNlcHRpb24pOwotCi0gICAgICAgICAgICAvLyBFbmQgb2YgbWV0YWRhdGEKLSAgICAgICAgICAgIGRlID0gcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3QgZGlza19leGNlcHRpb24qPigoY2hhciopYnVmZmVyICsgb2Zmc2V0KTsKLSAgICAgICAgICAgIEFTU0VSVF9FUShkZS0+b2xkX2NodW5rLCAwKTsKLSAgICAgICAgICAgIEFTU0VSVF9FUShkZS0+bmV3X2NodW5rLCAwKTsKLSAgICAgICAgICAgIG9mZnNldCArPSBzaXplb2Yoc3RydWN0IGRpc2tfZXhjZXB0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotVEVTVChTbmFwdXNlcmRfVGVzdCwgU25hcHNob3RfTWV0YWRhdGEpIHsKLSAgICBDb3dTbmFwdXNlcmRNZXRhZGF0YVRlc3QgaGFybmVzczsKLSAgICBoYXJuZXNzLlNldHVwKCk7Ci0gICAgaGFybmVzcy5WYWxpZGF0ZU1ldGFkYXRhKCk7Ci19Ci0KLVRFU1QoU25hcHVzZXJkX1Rlc3QsIFNuYXBzaG90X01ldGFkYXRhX092ZXJsYXApIHsKLSAgICBDb3dTbmFwdXNlcmRNZXRhZGF0YVRlc3QgaGFybmVzczsKLSAgICBoYXJuZXNzLlNldHVwUGFydGlhbEFyZWEoKTsKLSAgICBoYXJuZXNzLlZhbGlkYXRlUGFydGlhbEZpbGxlZEFyZWEoKTsKLX0KLQotVEVTVChTbmFwdXNlcmRfVGVzdCwgU25hcHNob3RfTWVyZ2VfUmVzdW1lKSB7Ci0gICAgQ293U25hcHVzZXJkVGVzdCBoYXJuZXNzOwotICAgIEFTU0VSVF9UUlVFKGhhcm5lc3MuU2V0dXAoKSk7Ci0gICAgaGFybmVzcy5NZXJnZUludGVycnVwdCgpOwotICAgIGhhcm5lc3MuVmFsaWRhdGVNZXJnZSgpOwotICAgIGhhcm5lc3MuU2h1dGRvd24oKTsKLX0KLQotVEVTVChTbmFwdXNlcmRfVGVzdCwgU25hcHNob3RfSU9fVEVTVCkgewotICAgIENvd1NuYXB1c2VyZFRlc3QgaGFybmVzczsKLSAgICBBU1NFUlRfVFJVRShoYXJuZXNzLlNldHVwKCkpOwotICAgIGhhcm5lc3MuUmVhZFNuYXBzaG90RGV2aWNlQW5kVmFsaWRhdGUoKTsKLSAgICBBU1NFUlRfVFJVRShoYXJuZXNzLk1lcmdlKCkpOwotICAgIGhhcm5lc3MuVmFsaWRhdGVNZXJnZSgpOwotICAgIGhhcm5lc3MuU2h1dGRvd24oKTsKLX0KLQotVEVTVChTbmFwdXNlcmRfVGVzdCwgU25hcHNob3RfRU5EX0lPX1RFU1QpIHsKLSAgICBDb3dTbmFwdXNlcmRUZXN0IGhhcm5lc3M7Ci0gICAgaGFybmVzcy5SZWFkTGFzdEJsb2NrKCk7Ci0gICAgaGFybmVzcy5TaHV0ZG93bigpOwotfQotCi1URVNUKFNuYXB1c2VyZF9UZXN0LCBTbmFwc2hvdF9DT1BZX092ZXJsYXBfVEVTVF8xKSB7Ci0gICAgQ293U25hcHVzZXJkVGVzdCBoYXJuZXNzOwotICAgIEFTU0VSVF9UUlVFKGhhcm5lc3MuU2V0dXBDb3B5T3ZlcmxhcF8xKCkpOwotICAgIEFTU0VSVF9UUlVFKGhhcm5lc3MuTWVyZ2UoKSk7Ci0gICAgaGFybmVzcy5WYWxpZGF0ZU1lcmdlKCk7Ci0gICAgaGFybmVzcy5TaHV0ZG93bigpOwotfQotCi1URVNUKFNuYXB1c2VyZF9UZXN0LCBTbmFwc2hvdF9DT1BZX092ZXJsYXBfVEVTVF8yKSB7Ci0gICAgQ293U25hcHVzZXJkVGVzdCBoYXJuZXNzOwotICAgIEFTU0VSVF9UUlVFKGhhcm5lc3MuU2V0dXBDb3B5T3ZlcmxhcF8yKCkpOwotICAgIEFTU0VSVF9UUlVFKGhhcm5lc3MuTWVyZ2UoKSk7Ci0gICAgaGFybmVzcy5WYWxpZGF0ZU1lcmdlKCk7Ci0gICAgaGFybmVzcy5TaHV0ZG93bigpOwotfQotCi1URVNUKFNuYXB1c2VyZF9UZXN0LCBTbmFwc2hvdF9DT1BZX092ZXJsYXBfTWVyZ2VfUmVzdW1lX1RFU1QpIHsKLSAgICBDb3dTbmFwdXNlcmRUZXN0IGhhcm5lc3M7Ci0gICAgQVNTRVJUX1RSVUUoaGFybmVzcy5TZXR1cENvcHlPdmVybGFwXzEoKSk7Ci0gICAgaGFybmVzcy5NZXJnZUludGVycnVwdCgpOwotICAgIGhhcm5lc3MuVmFsaWRhdGVNZXJnZSgpOwotICAgIGhhcm5lc3MuU2h1dGRvd24oKTsKLX0KLQotVEVTVChTbmFwdXNlcmRfVGVzdCwgUmVhZERtVXNlckJsb2NrV2l0aG91dERhZW1vbikgewotICAgIENvd1NuYXB1c2VyZFRlc3QgaGFybmVzczsKLSAgICBoYXJuZXNzLlJlYWREbVVzZXJCbG9ja1dpdGhvdXREYWVtb24oKTsKLX0KLQotVEVTVChTbmFwdXNlcmRfVGVzdCwgU25hcHNob3RfTWVyZ2VfQ3Jhc2hfRml4ZWRfT3JkZXJlZCkgewotICAgIENvd1NuYXB1c2VyZFRlc3QgaGFybmVzczsKLSAgICBBU1NFUlRfVFJVRShoYXJuZXNzLlNldHVwT3JkZXJlZE9wcygpKTsKLSAgICBoYXJuZXNzLk1lcmdlSW50ZXJydXB0Rml4ZWQoMzAwKTsKLSAgICBoYXJuZXNzLlZhbGlkYXRlTWVyZ2UoKTsKLSAgICBoYXJuZXNzLlNodXRkb3duKCk7Ci19Ci0KLVRFU1QoU25hcHVzZXJkX1Rlc3QsIFNuYXBzaG90X01lcmdlX0NyYXNoX1JhbmRvbV9PcmRlcmVkKSB7Ci0gICAgQ293U25hcHVzZXJkVGVzdCBoYXJuZXNzOwotICAgIEFTU0VSVF9UUlVFKGhhcm5lc3MuU2V0dXBPcmRlcmVkT3BzKCkpOwotICAgIGhhcm5lc3MuTWVyZ2VJbnRlcnJ1cHRSYW5kb21seSg1MDApOwotICAgIGhhcm5lc3MuVmFsaWRhdGVNZXJnZSgpOwotICAgIGhhcm5lc3MuU2h1dGRvd24oKTsKLX0KLQotVEVTVChTbmFwdXNlcmRfVGVzdCwgU25hcHNob3RfTWVyZ2VfQ3Jhc2hfRml4ZWRfSW52ZXJ0ZWQpIHsKLSAgICBDb3dTbmFwdXNlcmRUZXN0IGhhcm5lc3M7Ci0gICAgQVNTRVJUX1RSVUUoaGFybmVzcy5TZXR1cE9yZGVyZWRPcHNJbnZlcnRlZCgpKTsKLSAgICBoYXJuZXNzLk1lcmdlSW50ZXJydXB0Rml4ZWQoNTApOwotICAgIGhhcm5lc3MuVmFsaWRhdGVNZXJnZSgpOwotICAgIGhhcm5lc3MuU2h1dGRvd24oKTsKLX0KLQotVEVTVChTbmFwdXNlcmRfVGVzdCwgU25hcHNob3RfTWVyZ2VfQ3Jhc2hfUmFuZG9tX0ludmVydGVkKSB7Ci0gICAgQ293U25hcHVzZXJkVGVzdCBoYXJuZXNzOwotICAgIEFTU0VSVF9UUlVFKGhhcm5lc3MuU2V0dXBPcmRlcmVkT3BzSW52ZXJ0ZWQoKSk7Ci0gICAgaGFybmVzcy5NZXJnZUludGVycnVwdFJhbmRvbWx5KDUwKTsKLSAgICBoYXJuZXNzLlZhbGlkYXRlTWVyZ2UoKTsKLSAgICBoYXJuZXNzLlNodXRkb3duKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7Ci0gICAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKLX0KZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvZG0tc25hcHNob3QtbWVyZ2Uvc25hcHVzZXJkLmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvZG0tc25hcHNob3QtbWVyZ2Uvc25hcHVzZXJkLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkyNjAzMC4uMDAwMDAwMAotLS0gYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL2RtLXNuYXBzaG90LW1lcmdlL3NuYXB1c2VyZC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4ODYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJzbmFwdXNlcmQuaCIKLQotI2luY2x1ZGUgPGRpcmVudC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlIDxjc2lnbmFsPgotI2luY2x1ZGUgPG9wdGlvbmFsPgotI2luY2x1ZGUgPHNldD4KLQotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcGFyc2VpbnQuaD4KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgotI2luY2x1ZGUgPHNuYXB1c2VyZC9zbmFwdXNlcmRfY2xpZW50Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBzbmFwc2hvdCB7Ci0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmRtOwotdXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOwotCi0jZGVmaW5lIFNOQVBfTE9HKGxldmVsKSBMT0cobGV2ZWwpIDw8IG1pc2NfbmFtZV8gPDwgIjogIgotI2RlZmluZSBTTkFQX1BMT0cobGV2ZWwpIFBMT0cobGV2ZWwpIDw8IG1pc2NfbmFtZV8gPDwgIjogIgotCi1TbmFwdXNlcmQ6OlNuYXB1c2VyZChjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgY293X2RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBiYWNraW5nX2RldmljZSkgewotICAgIG1pc2NfbmFtZV8gPSBtaXNjX25hbWU7Ci0gICAgY293X2RldmljZV8gPSBjb3dfZGV2aWNlOwotICAgIGJhY2tpbmdfc3RvcmVfZGV2aWNlXyA9IGJhY2tpbmdfZGV2aWNlOwotICAgIGNvbnRyb2xfZGV2aWNlXyA9ICIvZGV2L2RtLXVzZXIvIiArIG1pc2NfbmFtZTsKLX0KLQotYm9vbCBTbmFwdXNlcmQ6OkluaXRpYWxpemVXb3JrZXJzKCkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1RIUkVBRFNfUEVSX1BBUlRJVElPTjsgaSsrKSB7Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxXb3JrZXJUaHJlYWQ+IHd0ID0gc3RkOjptYWtlX3VuaXF1ZTxXb3JrZXJUaHJlYWQ+KAotICAgICAgICAgICAgICAgIGNvd19kZXZpY2VfLCBiYWNraW5nX3N0b3JlX2RldmljZV8sIGNvbnRyb2xfZGV2aWNlXywgbWlzY19uYW1lXywgR2V0U2hhcmVkUHRyKCkpOwotCi0gICAgICAgIHdvcmtlcl90aHJlYWRzXy5wdXNoX2JhY2soc3RkOjptb3ZlKHd0KSk7Ci0gICAgfQotCi0gICAgcmVhZF9haGVhZF90aHJlYWRfID0gc3RkOjptYWtlX3VuaXF1ZTxSZWFkQWhlYWRUaHJlYWQ+KGNvd19kZXZpY2VfLCBiYWNraW5nX3N0b3JlX2RldmljZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc2NfbmFtZV8sIEdldFNoYXJlZFB0cigpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPENvd1JlYWRlcj4gU25hcHVzZXJkOjpDbG9uZVJlYWRlckZvcldvcmtlcigpIHsKLSAgICByZXR1cm4gcmVhZGVyXy0+Q2xvbmVDb3dSZWFkZXIoKTsKLX0KLQotYm9vbCBTbmFwdXNlcmQ6OkNvbW1pdE1lcmdlKGludCBudW1fbWVyZ2Vfb3BzKSB7Ci0gICAgc3RydWN0IENvd0hlYWRlciogY2ggPSByZWludGVycHJldF9jYXN0PHN0cnVjdCBDb3dIZWFkZXIqPihtYXBwZWRfYWRkcl8pOwotICAgIGNoLT5udW1fbWVyZ2Vfb3BzICs9IG51bV9tZXJnZV9vcHM7Ci0KLSAgICBpZiAocmVhZF9haGVhZF9mZWF0dXJlXyAmJiByZWFkX2FoZWFkX29wc18uc2l6ZSgpID4gMCkgewotICAgICAgICBzdHJ1Y3QgQnVmZmVyU3RhdGUqIHJhX3N0YXRlID0gR2V0QnVmZmVyU3RhdGUoKTsKLSAgICAgICAgcmFfc3RhdGUtPnJlYWRfYWhlYWRfc3RhdGUgPSBrQ293UmVhZEFoZWFkSW5Qcm9ncmVzczsKLSAgICB9Ci0KLSAgICBpbnQgcmV0ID0gbXN5bmMobWFwcGVkX2FkZHJfLCBCTE9DS19TWiwgTVNfU1lOQyk7Ci0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgU05BUF9QTE9HKEVSUk9SKSA8PCAibXN5bmMgaGVhZGVyIGZhaWxlZDogIiA8PCByZXQ7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBtZXJnZV9pbml0aWF0ZWRfID0gdHJ1ZTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFNuYXB1c2VyZDo6UHJlcGFyZVJlYWRBaGVhZCgpIHsKLSAgICBpZiAoIXJlYWRfYWhlYWRfZmVhdHVyZV8pIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN0cnVjdCBCdWZmZXJTdGF0ZSogcmFfc3RhdGUgPSBHZXRCdWZmZXJTdGF0ZSgpOwotICAgIC8vIENoZWNrIGlmIHRoZSBkYXRhIGhhcyB0byBiZSByZS1jb25zdHJ1Y3RlZCBmcm9tIENPVyBkZXZpY2UKLSAgICBpZiAocmFfc3RhdGUtPnJlYWRfYWhlYWRfc3RhdGUgPT0ga0Nvd1JlYWRBaGVhZERvbmUpIHsKLSAgICAgICAgcG9wdWxhdGVfZGF0YV9mcm9tX2Nvd18gPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBvcHVsYXRlX2RhdGFfZnJvbV9jb3dfID0gZmFsc2U7Ci0gICAgfQotCi0gICAgU3RhcnRSZWFkQWhlYWQoKTsKLX0KLQotYm9vbCBTbmFwdXNlcmQ6OkdldFJBQnVmZmVyKHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4qIGxvY2ssIHVpbnQ2NF90IGJsb2NrLCB2b2lkKiBidWZmZXIpIHsKLSAgICBpZiAoIWxvY2stPm93bnNfbG9jaygpKSB7Ci0gICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiR2V0UkFCdWZmZXIgLSBMb2NrIG5vdCBoZWxkIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDY0X3QsIHZvaWQqPjo6aXRlcmF0b3IgaXQgPSByZWFkX2FoZWFkX2J1ZmZlcl9tYXBfLmZpbmQoYmxvY2spOwotCi0gICAgLy8gVGhpcyB3aWxsIGJlIHRydWUgb25seSBmb3IgSU8ncyBnZW5lcmF0ZWQgYXMgcGFydCBvZiByZWFkaW5nIGEgcm9vdAotICAgIC8vIGZpbGVzeXN0ZW0uIElPJ3MgcmVsYXRlZCB0byBtZXJnZSBzaG91bGQgYWx3YXlzIGJlIGluIHJlYWQtYWhlYWQgY2FjaGUuCi0gICAgaWYgKGl0ID09IHJlYWRfYWhlYWRfYnVmZmVyX21hcF8uZW5kKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIFRoZW9yZXRpY2FsbHksIHdlIGNhbiBzZW5kIHRoZSBkYXRhIGJhY2sgZnJvbSB0aGUgcmVhZC1haGVhZCBidWZmZXIKLSAgICAvLyBhbGwgdGhlIHdheSB0byB0aGUga2VybmVsIHdpdGhvdXQgbWVtY3B5LiBIb3dldmVyLCBpZiB0aGUgSU8gaXMKLSAgICAvLyB1bi1hbGlnbmVkLCB0aGUgd3JhcHBlciBmdW5jdGlvbiB3aWxsIG5lZWQgdG8gdG91Y2ggdGhlIHJlYWQtYWhlYWQKLSAgICAvLyBidWZmZXJzIGFuZCB0cmFuc2l0aW9ucyB3aWxsIGJlIGJpdCBtb3JlIGNvbXBsaWNhdGVkLgotICAgIG1lbWNweShidWZmZXIsIGl0LT5zZWNvbmQsIEJMT0NLX1NaKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gPT09PT09PT09PSBTdGF0ZSB0cmFuc2l0aW9uIGZ1bmN0aW9ucyBmb3IgcmVhZC1haGVhZCBvcGVyYXRpb25zID09PT09PT09PT09Ci0KLWJvb2wgU25hcHVzZXJkOjpHZXRSZWFkQWhlYWRQb3B1bGF0ZWRCdWZmZXIodWludDY0X3QgYmxvY2ssIHZvaWQqIGJ1ZmZlcikgewotICAgIGlmICghcmVhZF9haGVhZF9mZWF0dXJlXykgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgewotICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobG9ja18pOwotICAgICAgICBpZiAoaW9fc3RhdGVfID09IFJFQURfQUhFQURfSU9fVFJBTlNJVElPTjo6UkVBRF9BSEVBRF9GQUlMVVJFKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaW9fc3RhdGVfID09IFJFQURfQUhFQURfSU9fVFJBTlNJVElPTjo6SU9fSU5fUFJPR1JFU1MpIHsKLSAgICAgICAgICAgIHJldHVybiBHZXRSQUJ1ZmZlcigmbG9jaywgYmxvY2ssIGJ1ZmZlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIC8vIFJlYWQtYWhlYWQgdGhyZWFkIElPIGlzIGluLXByb2dyZXNzLiBXYWl0IGZvciBpdCB0byBjb21wbGV0ZQotICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobG9ja18pOwotICAgICAgICB3aGlsZSAoIShpb19zdGF0ZV8gPT0gUkVBRF9BSEVBRF9JT19UUkFOU0lUSU9OOjpSRUFEX0FIRUFEX0ZBSUxVUkUgfHwKLSAgICAgICAgICAgICAgICAgaW9fc3RhdGVfID09IFJFQURfQUhFQURfSU9fVFJBTlNJVElPTjo6SU9fSU5fUFJPR1JFU1MpKSB7Ci0gICAgICAgICAgICBjdi53YWl0KGxvY2spOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEdldFJBQnVmZmVyKCZsb2NrLCBibG9jaywgYnVmZmVyKTsKLSAgICB9Ci19Ci0KLS8vIFRoaXMgaXMgaW52b2tlZCBieSByZWFkLWFoZWFkIHRocmVhZCB3YWl0aW5nIGZvciBtZXJnZSBJTydzCi0vLyB0byBjb21wbGV0ZQotYm9vbCBTbmFwdXNlcmQ6OldhaXRGb3JNZXJnZVRvQ29tcGxldGUoKSB7Ci0gICAgewotICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobG9ja18pOwotICAgICAgICB3aGlsZSAoIShpb19zdGF0ZV8gPT0gUkVBRF9BSEVBRF9JT19UUkFOU0lUSU9OOjpSRUFEX0FIRUFEX0JFR0lOIHx8Ci0gICAgICAgICAgICAgICAgIGlvX3N0YXRlXyA9PSBSRUFEX0FIRUFEX0lPX1RSQU5TSVRJT046OklPX1RFUk1JTkFURUQpKSB7Ci0gICAgICAgICAgICBjdi53YWl0KGxvY2spOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlvX3N0YXRlXyA9PSBSRUFEX0FIRUFEX0lPX1RSQU5TSVRJT046OklPX1RFUk1JTkFURUQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlvX3N0YXRlXyA9IFJFQURfQUhFQURfSU9fVFJBTlNJVElPTjo6UkVBRF9BSEVBRF9JTl9QUk9HUkVTUzsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQotCi0vLyBUaGlzIGlzIGludm9rZWQgZHVyaW5nIHRoZSBsYXVuY2ggb2Ygd29ya2VyIHRocmVhZHMuIFdlIHdhaXQKLS8vIGZvciByZWFkLWFoZWFkIHRocmVhZCB0byBieSBmdWxseSB1cCBiZWZvcmUgd29ya2VyIHRocmVhZHMKLS8vIGFyZSBsYXVuY2hlZDsgZWxzZSB3ZSB3aWxsIGhhdmUgYSByYWNlIGJldHdlZW4gd29ya2VyIHRocmVhZHMKLS8vIGFuZCByZWFkLWFoZWFkIHRocmVhZCBzcGVjaWZpY2FsbHkgZHVyaW5nIHJlLWNvbnN0cnVjdGlvbi4KLWJvb2wgU25hcHVzZXJkOjpXYWl0Rm9yUmVhZEFoZWFkVG9TdGFydCgpIHsKLSAgICB7Ci0gICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhsb2NrXyk7Ci0gICAgICAgIHdoaWxlICghKGlvX3N0YXRlXyA9PSBSRUFEX0FIRUFEX0lPX1RSQU5TSVRJT046OklPX0lOX1BST0dSRVNTIHx8Ci0gICAgICAgICAgICAgICAgIGlvX3N0YXRlXyA9PSBSRUFEX0FIRUFEX0lPX1RSQU5TSVRJT046OlJFQURfQUhFQURfRkFJTFVSRSkpIHsKLSAgICAgICAgICAgIGN2LndhaXQobG9jayk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaW9fc3RhdGVfID09IFJFQURfQUhFQURfSU9fVFJBTlNJVElPTjo6UkVBRF9BSEVBRF9GQUlMVVJFKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19Ci0KLS8vIEludm9rZWQgYnkgd29ya2VyIHRocmVhZHMgd2hlbiBhIHNlcXVlbmNlIG9mIG1lcmdlIG9wZXJhdGlvbgotLy8gaXMgY29tcGxldGUgbm90aWZ5aW5nIHJlYWQtYWhlYWQgdGhyZWFkIHRvIG1ha2UgZm9yd2FyZAotLy8gcHJvZ3Jlc3MuCi12b2lkIFNuYXB1c2VyZDo6U3RhcnRSZWFkQWhlYWQoKSB7Ci0gICAgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhsb2NrXyk7Ci0gICAgICAgIGlvX3N0YXRlXyA9IFJFQURfQUhFQURfSU9fVFJBTlNJVElPTjo6UkVBRF9BSEVBRF9CRUdJTjsKLSAgICB9Ci0KLSAgICBjdi5ub3RpZnlfb25lKCk7Ci19Ci0KLXZvaWQgU25hcHVzZXJkOjpNZXJnZUNvbXBsZXRlZCgpIHsKLSAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGxvY2tfKTsKLSAgICAgICAgaW9fc3RhdGVfID0gUkVBRF9BSEVBRF9JT19UUkFOU0lUSU9OOjpJT19URVJNSU5BVEVEOwotICAgIH0KLQotICAgIGN2Lm5vdGlmeV9vbmUoKTsKLX0KLQotYm9vbCBTbmFwdXNlcmQ6OlJlYWRBaGVhZElPQ29tcGxldGVkKGJvb2wgc3luYykgewotICAgIGlmIChzeW5jKSB7Ci0gICAgICAgIC8vIEZsdXNoIHRoZSBlbnRpcmUgYnVmZmVyIHJlZ2lvbgotICAgICAgICBpbnQgcmV0ID0gbXN5bmMobWFwcGVkX2FkZHJfLCB0b3RhbF9tYXBwZWRfYWRkcl9sZW5ndGhfLCBNU19TWU5DKTsKLSAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJtc3luYyBmYWlsZWQgYWZ0ZXIgUmVhZEFoZWFkSU9Db21wbGV0ZWQ6ICIgPDwgcmV0OwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTWV0YWRhdGEgYW5kIGRhdGEgYXJlIHN5bmNlZC4gTm93LCB1cGRhdGUgdGhlIHN0YXRlLgotICAgICAgICAvLyBXZSBuZWVkIHRvIHVwZGF0ZSB0aGUgc3RhdGUgYWZ0ZXIgZmx1c2hpbmcgZGF0YTsgaWYgdGhlcmUgaXMgYSBjcmFzaAotICAgICAgICAvLyB3aGVuIHJlYWQtYWhlYWQgSU8gaXMgaW4gcHJvZ3Jlc3MsIHRoZSBzdGF0ZSBvZiBkYXRhIGluIHRoZSBDT1cgZmlsZQotICAgICAgICAvLyBpcyB1bmtub3duLiBrQ293UmVhZEFoZWFkRG9uZSBhY3RzIGFzIGEgY2hlY2twb2ludCB3aGVyZWluIHRoZSBkYXRhCi0gICAgICAgIC8vIGluIHRoZSBzY3JhdGNoIHNwYWNlIGlzIGdvb2QgYW5kIGR1cmluZyBuZXh0IHJlYm9vdCwgcmVhZC1haGVhZCB0aHJlYWQKLSAgICAgICAgLy8gY2FuIHNhZmVseSByZS1jb25zdHJ1Y3QgdGhlIGRhdGEuCi0gICAgICAgIHN0cnVjdCBCdWZmZXJTdGF0ZSogcmFfc3RhdGUgPSBHZXRCdWZmZXJTdGF0ZSgpOwotICAgICAgICByYV9zdGF0ZS0+cmVhZF9haGVhZF9zdGF0ZSA9IGtDb3dSZWFkQWhlYWREb25lOwotCi0gICAgICAgIHJldCA9IG1zeW5jKG1hcHBlZF9hZGRyXywgQkxPQ0tfU1osIE1TX1NZTkMpOwotICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIm1zeW5jIGZhaWxlZCB0byBmbHVzaCBSZWFkYWhlYWQgY29tcGxldGlvbiBzdGF0ZS4uLiI7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBOb3RpZnkgdGhlIHdvcmtlciB0aHJlYWRzCi0gICAgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhsb2NrXyk7Ci0gICAgICAgIGlvX3N0YXRlXyA9IFJFQURfQUhFQURfSU9fVFJBTlNJVElPTjo6SU9fSU5fUFJPR1JFU1M7Ci0gICAgfQotCi0gICAgY3Yubm90aWZ5X2FsbCgpOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFNuYXB1c2VyZDo6UmVhZEFoZWFkSU9GYWlsZWQoKSB7Ci0gICAgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhsb2NrXyk7Ci0gICAgICAgIGlvX3N0YXRlXyA9IFJFQURfQUhFQURfSU9fVFJBTlNJVElPTjo6UkVBRF9BSEVBRF9GQUlMVVJFOwotICAgIH0KLQotICAgIGN2Lm5vdGlmeV9hbGwoKTsKLX0KLQotLy89PT09PT09PT09IEVuZCBvZiBzdGF0ZSB0cmFuc2l0aW9uIGZ1bmN0aW9ucyA9PT09PT09PT09PT09PT09PT09PQotCi1ib29sIFNuYXB1c2VyZDo6SXNDaHVua0lkTWV0YWRhdGEoY2h1bmtfdCBjaHVuaykgewotICAgIHVpbnQzMl90IHN0cmlkZSA9IGV4Y2VwdGlvbnNfcGVyX2FyZWFfICsgMTsKLSAgICBsbGRpdl90IGRpdnJlc3VsdCA9IGxsZGl2KGNodW5rLCBzdHJpZGUpOwotCi0gICAgcmV0dXJuIChkaXZyZXN1bHQucmVtID09IE5VTV9TTkFQU0hPVF9IRFJfQ0hVTktTKTsKLX0KLQotLy8gRmluZCB0aGUgbmV4dCBmcmVlIGNodW5rLWlkIHRvIGJlIGFzc2lnbmVkLiBDaGVjayBpZiB0aGUgbmV4dCBmcmVlCi0vLyBjaHVuay1pZCByZXByZXNlbnRzIGEgbWV0YWRhdGEgcGFnZS4gSWYgc28sIHNraXAgaXQuCi1jaHVua190IFNuYXB1c2VyZDo6R2V0TmV4dEFsbG9jYXRhYmxlQ2h1bmtJZChjaHVua190IGNodW5rKSB7Ci0gICAgY2h1bmtfdCBuZXh0X2NodW5rID0gY2h1bmsgKyAxOwotCi0gICAgaWYgKElzQ2h1bmtJZE1ldGFkYXRhKG5leHRfY2h1bmspKSB7Ci0gICAgICAgIG5leHRfY2h1bmsgKz0gMTsKLSAgICB9Ci0gICAgcmV0dXJuIG5leHRfY2h1bms7Ci19Ci0KLXZvaWQgU25hcHVzZXJkOjpDaGVja01lcmdlQ29tcGxldGlvblN0YXR1cygpIHsKLSAgICBpZiAoIW1lcmdlX2luaXRpYXRlZF8pIHsKLSAgICAgICAgU05BUF9MT0coSU5GTykgPDwgIk1lcmdlIHdhcyBub3QgaW5pdGlhdGVkLiBUb3RhbC1kYXRhLW9wczogIgotICAgICAgICAgICAgICAgICAgICAgICA8PCByZWFkZXJfLT5nZXRfbnVtX3RvdGFsX2RhdGFfb3BzKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdHJ1Y3QgQ293SGVhZGVyKiBjaCA9IHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IENvd0hlYWRlcio+KG1hcHBlZF9hZGRyXyk7Ci0KLSAgICBTTkFQX0xPRyhJTkZPKSA8PCAiTWVyZ2Utc3RhdHVzOiBUb3RhbC1NZXJnZWQtb3BzOiAiIDw8IGNoLT5udW1fbWVyZ2Vfb3BzCi0gICAgICAgICAgICAgICAgICAgPDwgIiBUb3RhbC1kYXRhLW9wczogIiA8PCByZWFkZXJfLT5nZXRfbnVtX3RvdGFsX2RhdGFfb3BzKCk7Ci19Ci0KLS8qCi0gKiBSZWFkIHRoZSBtZXRhZGF0YSBmcm9tIENPVyBkZXZpY2UgYW5kCi0gKiBjb25zdHJ1Y3QgdGhlIG1ldGFkYXRhIGFzIHJlcXVpcmVkIGJ5IHRoZSBrZXJuZWwuCi0gKgotICogUGxlYXNlIHNlZSBkZXNpZ24gb24ga2VybmVsIENPVyBmb3JtYXQKLSAqCi0gKiAxOiBSZWFkIHRoZSBtZXRhZGF0YSBmcm9tIGludGVybmFsIENPVyBkZXZpY2UKLSAqIDI6IFRoZXJlIGFyZSAzIENPVyBvcGVyYXRpb25zOgotICogICAgIGE6IFJlcGxhY2Ugb3AKLSAqICAgICBiOiBDb3B5IG9wCi0gKiAgICAgYzogWmVybyBvcAotICogMzogRm9yIGVhY2ggb2YgdGhlIDMgb3BlcmF0aW9ucywgb3AtPm5ld19ibG9jawotICogICAgcmVwcmVzZW50cyB0aGUgYmxvY2sgbnVtYmVyIGluIHRoZSBiYXNlIGRldmljZQotICogICAgZm9yIHdoaWNoIG9uZSBvZiB0aGUgMyBvcGVyYXRpb25zIGhhdmUgdG8gYmUgYXBwbGllZC4KLSAqICAgIFRoaXMgcmVwcmVzZW50cyB0aGUgb2xkX2NodW5rIGluIHRoZSBrZXJuZWwgQ09XIGZvcm1hdAotICogNDogV2UgbmVlZCB0byBhc3NpZ24gbmV3X2NodW5rIGZvciBhIGNvcnJlc3BvbmRpbmcgb2xkX2NodW5rCi0gKiA1OiBUaGUgYWxnb3JpdGhtIGlzIHNpbWlsYXIgdG8gaG93IGtlcm5lbCBhc3NpZ25zIGNodW5rIG51bWJlcgotICogICAgd2hpbGUgY3JlYXRpbmcgZXhjZXB0aW9ucy4gSG93ZXZlciwgdGhlcmUgYXJlIGZldyBjYXNlcwotICogICAgd2hpY2ggbmVlZHMgdG8gYmUgYWRkcmVzc2VkIGhlcmU6Ci0gKiAgICAgIGE6IER1cmluZyBtZXJnZSBwcm9jZXNzLCBrZXJuZWwgc2NhbnMgdGhlIG1ldGFkYXRhIHBhZ2UKLSAqICAgICAgZnJvbSBiYWNrd2FyZHMgd2hlbiBtZXJnZSBpcyBpbml0aWF0ZWQuIFNpbmNlLCB3ZSBuZWVkCi0gKiAgICAgIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBtZXJnZSBvcmRlcmluZyBmb2xsb3dzIG91ciBDT1cgZm9ybWF0LAotICogICAgICB3ZSByZWFkIHRoZSBDT1cgb3BlcmF0aW9uIGZyb20gYmFja3dhcmRzIGFuZCBwb3B1bGF0ZSB0aGUKLSAqICAgICAgbWV0YWRhdGEgc28gdGhhdCB3aGVuIGtlcm5lbCBzdGFydHMgdGhlIG1lcmdpbmcgZnJvbSBiYWNrd2FyZHMsCi0gKiAgICAgIHRob3NlIG9wcyBjb3JyZXNwb25kIHRvIHRoZSBiZWdpbm5pbmcgb2Ygb3VyIENPVyBmb3JtYXQuCi0gKiAgICAgIGI6IEtlcm5lbCBjYW4gbWVyZ2Ugc3VjY2Vzc2l2ZSBvcGVyYXRpb25zIGlmIHRoZSB0d28gY2h1bmsgSURzCi0gKiAgICAgIGFyZSBjb250aWd1b3VzLiBUaGlzIGNhbiBiZSBwcm9ibGVtYXRpYyB3aGVuIHRoZXJlIGlzIGEgY3Jhc2gKLSAqICAgICAgZHVyaW5nIG1lcmdlOyBzcGVjaWZpY2FsbHkgd2hlbiB0aGUgbWVyZ2Ugb3BlcmF0aW9uIGhhcyBkZXBlbmRlbmN5LgotICogICAgICBUaGVzZSBkZXBlbmRlbmNpZXMgY2FuIG9ubHkgaGFwcGVuIGR1cmluZyBjb3B5IG9wZXJhdGlvbnMuCi0gKgotICogICAgICBUbyBhdm9pZCB0aGlzIHByb2JsZW0sIHdlIG1ha2Ugc3VyZSBvdmVybGFwIGNvcHkgb3BlcmF0aW9ucwotICogICAgICBhcmUgbm90IGJhdGNoIG1lcmdlZC4KLSAqIDY6IFVzZSBhIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBjaHVuayBudW1iZXIgdG8gYXNzaWduIHRoZQotICogICAgbmV3X2NodW5rCi0gKiA3OiBFYWNoIGNodW5rLWlkIHJlcHJlc2VudHMgZWl0aGVyCi0gKiAgICAgICAgYTogTWV0YWRhdGEgcGFnZSBvcgotICogICAgICAgIGI6IERhdGEgcGFnZQotICogODogQ2h1bmstaWQgcmVwcmVzZW50aW5nIGEgZGF0YSBwYWdlIGlzIHN0b3JlZCBpbiBhIG1hcC4KLSAqIDk6IENodW5rLWlkIHJlcHJlc2VudGluZyBhIG1ldGFkYXRhIHBhZ2UgaXMgY29udmVydGVkIGludG8gYSB2ZWN0b3IKLSAqICAgIGluZGV4LiBXZSBzdG9yZSB0aGlzIGluIHZlY3RvciBhcyBrZXJuZWwgcmVxdWVzdHMgbWV0YWRhdGEgZHVyaW5nCi0gKiAgICB0d28gc3RhZ2U6Ci0gKiAgICAgICBhOiBXaGVuIGluaXRpYWwgZG0tc25hcHNob3QgZGV2aWNlIGlzIGNyZWF0ZWQsIGtlcm5lbCByZXF1ZXN0cwotICogICAgICAgICAgYWxsIHRoZSBtZXRhZGF0YSBhbmQgc3RvcmVzIGl0IGluIGl0cyBpbnRlcm5hbCBkYXRhLXN0cnVjdHVyZXMuCi0gKiAgICAgICBiOiBEdXJpbmcgbWVyZ2UsIGtlcm5lbCBvbmNlIGFnYWluIHJlcXVlc3RzIHRoZSBzYW1lIG1ldGFkYXRhCi0gKiAgICAgICAgICBvbmNlLWFnYWluLgotICogICAgSW4gYm90aCB0aGVzZSBjYXNlcywgYSBxdWljayBsb29rdXAgYmFzZWQgb24gY2h1bmstaWQgaXMgZG9uZS4KLSAqIDEwOiBXaGVuIGNodW5rIG51bWJlciBpcyBpbmNyZW1lbnRlZCwgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdAotICogICAgaWYgdGhlIGNodW5rIGlzIHJlcHJlc2VudGluZyBhIG1ldGFkYXRhIHBhZ2UgYW5kIHNraXAuCi0gKiAxMTogRWFjaCA0ayBwYWdlIHdpbGwgY29udGFpbiAyNTYgZGlzayBleGNlcHRpb25zLiBXZSBjYWxsIHRoaXMKLSAqICAgIGV4Y2VwdGlvbnNfcGVyX2FyZWFfCi0gKiAxMjogS2VybmVsIHdpbGwgc3RvcCBpc3N1aW5nIG1ldGFkYXRhIElPIHJlcXVlc3Qgd2hlbiBuZXctY2h1bmsgSUQgaXMgMC4KLSAqLwotYm9vbCBTbmFwdXNlcmQ6OlJlYWRNZXRhZGF0YSgpIHsKLSAgICByZWFkZXJfID0gc3RkOjptYWtlX3VuaXF1ZTxDb3dSZWFkZXI+KCk7Ci0gICAgQ293SGVhZGVyIGhlYWRlcjsKLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgYm9vbCBtZXRhZGF0YV9mb3VuZCA9IGZhbHNlOwotICAgIGludCByZXBsYWNlX29wcyA9IDAsIHplcm9fb3BzID0gMCwgY29weV9vcHMgPSAwOwotCi0gICAgU05BUF9MT0coREVCVUcpIDw8ICJSZWFkTWV0YWRhdGE6IFBhcnNpbmcgY293IGZpbGUiOwotCi0gICAgaWYgKCFyZWFkZXJfLT5QYXJzZShjb3dfZmRfKSkgewotICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBwYXJzZSI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoIXJlYWRlcl8tPkdldEhlYWRlcigmaGVhZGVyKSkgewotICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBnZXQgaGVhZGVyIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICghKGhlYWRlci5ibG9ja19zaXplID09IEJMT0NLX1NaKSkgewotICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIkludmFsaWQgaGVhZGVyIGJsb2NrIHNpemUgZm91bmQ6ICIgPDwgaGVhZGVyLmJsb2NrX3NpemU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBTTkFQX0xPRyhERUJVRykgPDwgIk1lcmdlLW9wczogIiA8PCBoZWFkZXIubnVtX21lcmdlX29wczsKLQotICAgIGlmICghTW1hcE1ldGFkYXRhKCkpIHsKLSAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJtbWFwIGZhaWxlZCI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBJbml0aWFsaXplIHRoZSBpdGVyYXRvciBmb3IgcmVhZGluZyBtZXRhZGF0YQotICAgIHN0ZDo6dW5pcXVlX3B0cjxJQ293T3BJdGVyPiBjb3dvcF9ybV9pdGVyID0gcmVhZGVyXy0+R2V0UmV2TWVyZ2VPcEl0ZXIoKTsKLQotICAgIGV4Y2VwdGlvbnNfcGVyX2FyZWFfID0gKENIVU5LX1NJWkUgPDwgU0VDVE9SX1NISUZUKSAvIHNpemVvZihzdHJ1Y3QgZGlza19leGNlcHRpb24pOwotCi0gICAgLy8gU3RhcnQgZnJvbSBjaHVuayBudW1iZXIgMi4gQ2h1bmsgMCByZXByZXNlbnRzIGhlYWRlciBhbmQgY2h1bmsgMQotICAgIC8vIHJlcHJlc2VudHMgZmlyc3QgbWV0YWRhdGEgcGFnZS4KLSAgICBjaHVua190IGRhdGFfY2h1bmtfaWQgPSBOVU1fU05BUFNIT1RfSERSX0NIVU5LUyArIDE7Ci0gICAgc2l6ZV90IG51bV9vcHMgPSAwOwotCi0gICAgbG9mZl90IG9mZnNldCA9IDA7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gZGVfcHRyID0KLSAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8dWludDhfdFtdPihleGNlcHRpb25zX3Blcl9hcmVhXyAqIHNpemVvZihzdHJ1Y3QgZGlza19leGNlcHRpb24pKTsKLQotICAgIC8vIFRoaXMgbWVtc2V0IGlzIGltcG9ydGFudC4gS2VybmVsIHdpbGwgc3RvcCBpc3N1aW5nIElPIHdoZW4gbmV3LWNodW5rIElECi0gICAgLy8gaXMgMC4gV2hlbiBBcmVhIGlzIG5vdCBmaWxsZWQgY29tcGxldGVseSB3aXRoIGFsbCAyNTYgZXhjZXB0aW9ucywKLSAgICAvLyB0aGlzIG1lbXNldCB3aWxsIGVuc3VyZSB0aGF0IG1ldGFkYXRhIHJlYWQgaXMgY29tcGxldGVkLgotICAgIG1lbXNldChkZV9wdHIuZ2V0KCksIDAsIChleGNlcHRpb25zX3Blcl9hcmVhXyAqIHNpemVvZihzdHJ1Y3QgZGlza19leGNlcHRpb24pKSk7Ci0KLSAgICB3aGlsZSAoIWNvd29wX3JtX2l0ZXItPkRvbmUoKSkgewotICAgICAgICBjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCA9ICZjb3dvcF9ybV9pdGVyLT5HZXQoKTsKLSAgICAgICAgc3RydWN0IGRpc2tfZXhjZXB0aW9uKiBkZSA9Ci0gICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3QgZGlza19leGNlcHRpb24qPigoY2hhciopZGVfcHRyLmdldCgpICsgb2Zmc2V0KTsKLQotICAgICAgICBtZXRhZGF0YV9mb3VuZCA9IHRydWU7Ci0gICAgICAgIC8vIFRoaXMgbG9vcCB3aWxsIGhhbmRsZSBhbGwgdGhlIHJlcGxhY2UgYW5kIHplcm8gb3BzLgotICAgICAgICAvLyBXZSB3aWxsIGhhbmRsZSB0aGUgY29weSBvcHMgbGF0ZXIgYXMgaXQgcmVxdWlyZXMgc3BlY2lhbAotICAgICAgICAvLyBoYW5kbGluZyBvZiBhc3NpZ25pbmcgY2h1bmstaWQncy4gRnVydGhlcm1vcmUsIHdlIG1ha2UKLSAgICAgICAgLy8gc3VyZSB0aGF0IHJlcGxhY2UvemVybyBhbmQgY29weSBvcHMgYXJlIG5vdCBiYXRjaCBtZXJnZWQ7IGhlbmNlLAotICAgICAgICAvLyB0aGUgYnVtcCBpbiB0aGUgY2h1bmtfaWQgYmVmb3JlIGJyZWFrIG9mIHRoaXMgbG9vcAotICAgICAgICBpZiAoSXNPcmRlcmVkT3AoKmNvd19vcCkpIHsKLSAgICAgICAgICAgIGRhdGFfY2h1bmtfaWQgPSBHZXROZXh0QWxsb2NhdGFibGVDaHVua0lkKGRhdGFfY2h1bmtfaWQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY293X29wLT50eXBlID09IGtDb3dSZXBsYWNlT3ApIHsKLSAgICAgICAgICAgIHJlcGxhY2Vfb3BzKys7Ci0gICAgICAgIH0gZWxzZSBpZiAoY293X29wLT50eXBlID09IGtDb3daZXJvT3ApIHsKLSAgICAgICAgICAgIHplcm9fb3BzKys7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIGRpc2stZXhjZXB0aW9uCi0gICAgICAgIGRlLT5vbGRfY2h1bmsgPSBjb3dfb3AtPm5ld19ibG9jazsKLSAgICAgICAgZGUtPm5ld19jaHVuayA9IGRhdGFfY2h1bmtfaWQ7Ci0KLSAgICAgICAgLy8gU3RvcmUgb3BlcmF0aW9uIHBvaW50ZXIuCi0gICAgICAgIGNodW5rX3ZlY18ucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKENodW5rVG9TZWN0b3IoZGF0YV9jaHVua19pZCksIGNvd19vcCkpOwotICAgICAgICBudW1fb3BzICs9IDE7Ci0gICAgICAgIG9mZnNldCArPSBzaXplb2Yoc3RydWN0IGRpc2tfZXhjZXB0aW9uKTsKLSAgICAgICAgY293b3Bfcm1faXRlci0+TmV4dCgpOwotCi0gICAgICAgIFNOQVBfTE9HKERFQlVHKSA8PCBudW1fb3BzIDw8ICI6IgotICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBPbGQtY2h1bms6ICIgPDwgZGUtPm9sZF9jaHVuayA8PCAiIE5ldy1jaHVuazogIiA8PCBkZS0+bmV3X2NodW5rOwotCi0gICAgICAgIGlmIChudW1fb3BzID09IGV4Y2VwdGlvbnNfcGVyX2FyZWFfKSB7Ci0gICAgICAgICAgICAvLyBTdG9yZSBpdCBpbiB2ZWN0b3IgYXQgdGhlIHJpZ2h0IGluZGV4LiBUaGlzIG1hcHMgdGhlIGNodW5rLWlkIHRvCi0gICAgICAgICAgICAvLyB2ZWN0b3IgaW5kZXguCi0gICAgICAgICAgICB2ZWNfLnB1c2hfYmFjayhzdGQ6Om1vdmUoZGVfcHRyKSk7Ci0gICAgICAgICAgICBvZmZzZXQgPSAwOwotICAgICAgICAgICAgbnVtX29wcyA9IDA7Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBidWZmZXIgZm9yIG5leHQgYXJlYQotICAgICAgICAgICAgZGVfcHRyID0gc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KGV4Y2VwdGlvbnNfcGVyX2FyZWFfICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGRpc2tfZXhjZXB0aW9uKSk7Ci0gICAgICAgICAgICBtZW1zZXQoZGVfcHRyLmdldCgpLCAwLCAoZXhjZXB0aW9uc19wZXJfYXJlYV8gKiBzaXplb2Yoc3RydWN0IGRpc2tfZXhjZXB0aW9uKSkpOwotCi0gICAgICAgICAgICBpZiAoY293b3Bfcm1faXRlci0+RG9uZSgpKSB7Ci0gICAgICAgICAgICAgICAgdmVjXy5wdXNoX2JhY2soc3RkOjptb3ZlKGRlX3B0cikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZGF0YV9jaHVua19pZCA9IEdldE5leHRBbGxvY2F0YWJsZUNodW5rSWQoZGF0YV9jaHVua19pZCk7Ci0gICAgfQotCi0gICAgaW50IG51bV9yYV9vcHNfcGVyX2l0ZXIgPSAoKEdldEJ1ZmZlckRhdGFTaXplKCkpIC8gQkxPQ0tfU1opOwotICAgIHN0ZDo6b3B0aW9uYWw8Y2h1bmtfdD4gcHJldl9pZCA9IHt9OwotICAgIHN0ZDo6dmVjdG9yPGNvbnN0IENvd09wZXJhdGlvbio+IHZlYzsKLSAgICBzdGQ6OnNldDx1aW50NjRfdD4gZGVzdF9ibG9ja3M7Ci0gICAgc3RkOjpzZXQ8dWludDY0X3Q+IHNvdXJjZV9ibG9ja3M7Ci0gICAgc2l6ZV90IHBlbmRpbmdfb3JkZXJlZF9vcHMgPSBleGNlcHRpb25zX3Blcl9hcmVhXyAtIG51bV9vcHM7Ci0gICAgdWludDY0X3QgdG90YWxfb3JkZXJlZF9vcHMgPSByZWFkZXJfLT5nZXRfbnVtX29yZGVyZWRfb3BzX3RvX21lcmdlKCk7Ci0KLSAgICBTTkFQX0xPRyhERUJVRykgPDwgIiBQcm9jZXNzaW5nIGNvcHktb3BzIGF0IEFyZWE6ICIgPDwgdmVjXy5zaXplKCkKLSAgICAgICAgICAgICAgICAgICAgPDwgIiBOdW1iZXIgb2YgcmVwbGFjZS96ZXJvIG9wcyBjb21wbGV0ZWQgaW4gdGhpcyBhcmVhOiAiIDw8IG51bV9vcHMKLSAgICAgICAgICAgICAgICAgICAgPDwgIiBQZW5kaW5nIGNvcHkgb3BzIGZvciB0aGlzIGFyZWE6ICIgPDwgcGVuZGluZ19vcmRlcmVkX29wczsKLQotICAgIHdoaWxlICghY293b3Bfcm1faXRlci0+RG9uZSgpKSB7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGNvbnN0IENvd09wZXJhdGlvbiogY293X29wID0gJmNvd29wX3JtX2l0ZXItPkdldCgpOwotCi0gICAgICAgICAgICAvLyBXZSBoYXZlIHR3byBjYXNlcyBzcGVjaWZpYyBjYXNlczoKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICAgICAgLy8gQ2FzZSAxOiBPdmVybGFwcGluZyBjb3B5IHJlZ2lvbnMKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBFeDoKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBTb3VyY2UgLT4gRGVzdGluYXRpb24KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyAxOiAxNSAtPiAxOAotICAgICAgICAgICAgLy8gMjogMTYgLT4gMTkKLSAgICAgICAgICAgIC8vIDM6IDE3IC0+IDIwCi0gICAgICAgICAgICAvLyA0OiAxOCAtPiAyMQotICAgICAgICAgICAgLy8gNTogMTkgLT4gMjIKLSAgICAgICAgICAgIC8vIDY6IDIwIC0+IDIzCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gV2UgaGF2ZSA2IGNvcHkgb3BlcmF0aW9ucyB0byBiZSBleGVjdXRlZCBpbiBPVEEgYW5kIHRoZXJlIGlzIGEgb3ZlcmxhcC4gVXBkYXRlLWVuZ2luZQotICAgICAgICAgICAgLy8gd2lsbCB3cml0ZSB0byBDT1cgZmlsZSBhcyBmb2xsb3dzOgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIE9wLTE6IDIwIC0+IDIzCi0gICAgICAgICAgICAvLyBPcC0yOiAxOSAtPiAyMgotICAgICAgICAgICAgLy8gT3AtMzogMTggLT4gMjEKLSAgICAgICAgICAgIC8vIE9wLTQ6IDE3IC0+IDIwCi0gICAgICAgICAgICAvLyBPcC01OiAxNiAtPiAxOQotICAgICAgICAgICAgLy8gT3AtNjogMTUgLT4gMTgKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIGJsb2NrcyBudW1iZXJzIGFyZSBjb250aWd1b3VzLiBIZW5jZSwgYWxsIDYgY29weQotICAgICAgICAgICAgLy8gb3BlcmF0aW9ucyBjYW4gYmUgYmF0Y2ggbWVyZ2VkLiBIb3dldmVyLCB0aGF0IHdpbGwgYmUKLSAgICAgICAgICAgIC8vIHByb2JsZW1hdGljIGlmIHdlIGhhdmUgYSBjcmFzaCBhcyBibG9jayAyMCwgMTksIDE4IHdvdWxkIGhhdmUKLSAgICAgICAgICAgIC8vIGJlZW4gb3ZlcndyaXR0ZW4gYW5kIGhlbmNlIHN1YnNlcXVlbnQgcmVjb3ZlcnkgbWF5IGVuZCB1cCB3aXRoCi0gICAgICAgICAgICAvLyBhIHNpbGVudCBkYXRhIGNvcnJ1cHRpb24gd2hlbiBvcC0xLCBvcC0yIGFuZCBvcC0zIGFyZQotICAgICAgICAgICAgLy8gcmUtZXhlY3V0ZWQuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gVG8gYWRkcmVzcyB0aGUgYWJvdmUgcHJvYmxlbSwgcmVhZC1haGVhZCB0aHJlYWQgd2lsbAotICAgICAgICAgICAgLy8gcmVhZCBhbGwgdGhlIDYgc291cmNlIGJsb2NrcywgY2FjaGUgdGhlbSBpbiB0aGUgc2NyYXRjaAotICAgICAgICAgICAgLy8gc3BhY2Ugb2YgdGhlIENPVyBmaWxlLiBEdXJpbmcgbWVyZ2UsIHJlYWQtYWhlYWQKLSAgICAgICAgICAgIC8vIHRocmVhZCB3aWxsIHNlcnZlIHRoZSBibG9ja3MgZnJvbSB0aGUgcmVhZC1haGVhZCBjYWNoZS4KLSAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgY3Jhc2ggZHVyaW5nIG1lcmdlOyBvbiBzdWJzZXF1ZW50IHJlYm9vdCwKLSAgICAgICAgICAgIC8vIHJlYWQtYWhlYWQgdGhyZWFkIHdpbGwgcmVjb3ZlciB0aGUgZGF0YSBmcm9tIHRoZQotICAgICAgICAgICAgLy8gc2NyYXRjaCBzcGFjZSBhbmQgcmUtY29uc3RydWN0IGl0IHRoZXJlYnkgdGhlcmUKLSAgICAgICAgICAgIC8vIGlzIG5vIGxvc3Mgb2YgZGF0YS4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2Ugd2lsbCBmb2xsb3cgdGhlIHNhbWUgb3JkZXIgb2YgQ09XIG9wZXJhdGlvbnMKLSAgICAgICAgICAgIC8vIGFzIHByZXNlbnQgaW4gdGhlIENPVyBmaWxlLiBUaGlzIHdpbGwgbWFrZSBzdXJlIHRoYXQKLSAgICAgICAgICAgIC8vIHRoZSBtZXJnZSBvZiBvcGVyYXRpb25zIGFyZSBkb25lIGJhc2VkIG9uIHRoZSBvcHMgcHJlc2VudAotICAgICAgICAgICAgLy8gaW4gdGhlIGZpbGUuCi0gICAgICAgICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgICAgICB1aW50NjRfdCBibG9ja19zb3VyY2UgPSBjb3dfb3AtPnNvdXJjZTsKLSAgICAgICAgICAgIHVpbnQ2NF90IGJsb2NrX29mZnNldCA9IDA7Ci0gICAgICAgICAgICBpZiAocHJldl9pZC5oYXNfdmFsdWUoKSkgewotICAgICAgICAgICAgICAgIGlmIChkZXN0X2Jsb2Nrcy5jb3VudChjb3dfb3AtPm5ld19ibG9jaykgfHwgc291cmNlX2Jsb2Nrcy5jb3VudChibG9ja19zb3VyY2UpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChibG9ja19vZmZzZXQgPiAwICYmIHNvdXJjZV9ibG9ja3MuY291bnQoYmxvY2tfc291cmNlICsgMSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1ldGFkYXRhX2ZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgIHBlbmRpbmdfb3JkZXJlZF9vcHMgLT0gMTsKLSAgICAgICAgICAgIHZlYy5wdXNoX2JhY2soY293X29wKTsKLSAgICAgICAgICAgIGRlc3RfYmxvY2tzLmluc2VydChibG9ja19zb3VyY2UpOwotICAgICAgICAgICAgaWYgKGJsb2NrX29mZnNldCA+IDApIHsKLSAgICAgICAgICAgICAgICBkZXN0X2Jsb2Nrcy5pbnNlcnQoYmxvY2tfc291cmNlICsgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzb3VyY2VfYmxvY2tzLmluc2VydChjb3dfb3AtPm5ld19ibG9jayk7Ci0gICAgICAgICAgICBwcmV2X2lkID0gY293X29wLT5uZXdfYmxvY2s7Ci0gICAgICAgICAgICBjb3dvcF9ybV9pdGVyLT5OZXh0KCk7Ci0gICAgICAgIH0gd2hpbGUgKCFjb3dvcF9ybV9pdGVyLT5Eb25lKCkgJiYgcGVuZGluZ19vcmRlcmVkX29wcyk7Ci0KLSAgICAgICAgZGF0YV9jaHVua19pZCA9IEdldE5leHRBbGxvY2F0YWJsZUNodW5rSWQoZGF0YV9jaHVua19pZCk7Ci0gICAgICAgIFNOQVBfTE9HKERFQlVHKSA8PCAiQmF0Y2ggTWVyZ2UgY29weS1vcHMgb2Ygc2l6ZTogIiA8PCB2ZWMuc2l6ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiIEFyZWE6ICIgPDwgdmVjXy5zaXplKCkgPDwgIiBBcmVhIG9mZnNldDogIiA8PCBvZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgUGVuZGluZy1vcmRlcmVkLW9wcyBpbiB0aGlzIGFyZWE6ICIgPDwgcGVuZGluZ19vcmRlcmVkX29wczsKLQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZlYy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3RydWN0IGRpc2tfZXhjZXB0aW9uKiBkZSA9Ci0gICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IGRpc2tfZXhjZXB0aW9uKj4oKGNoYXIqKWRlX3B0ci5nZXQoKSArIG9mZnNldCk7Ci0gICAgICAgICAgICBjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCA9IHZlY1tpXTsKLQotICAgICAgICAgICAgZGUtPm9sZF9jaHVuayA9IGNvd19vcC0+bmV3X2Jsb2NrOwotICAgICAgICAgICAgZGUtPm5ld19jaHVuayA9IGRhdGFfY2h1bmtfaWQ7Ci0KLSAgICAgICAgICAgIC8vIFN0b3JlIG9wZXJhdGlvbiBwb2ludGVyLgotICAgICAgICAgICAgY2h1bmtfdmVjXy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoQ2h1bmtUb1NlY3RvcihkYXRhX2NodW5rX2lkKSwgY293X29wKSk7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZW9mKHN0cnVjdCBkaXNrX2V4Y2VwdGlvbik7Ci0gICAgICAgICAgICBudW1fb3BzICs9IDE7Ci0gICAgICAgICAgICBpZiAoY293X29wLT50eXBlID09IGtDb3dDb3B5T3ApIHsKLSAgICAgICAgICAgICAgICBjb3B5X29wcysrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocmVhZF9haGVhZF9mZWF0dXJlXykgewotICAgICAgICAgICAgICAgIHJlYWRfYWhlYWRfb3BzXy5wdXNoX2JhY2soY293X29wKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU05BUF9MT0coREVCVUcpIDw8IG51bV9vcHMgPDwgIjoiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBPcmRlcmVkLW9wOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBPbGQtY2h1bms6ICIgPDwgZGUtPm9sZF9jaHVuayA8PCAiIE5ldy1jaHVuazogIiA8PCBkZS0+bmV3X2NodW5rOwotCi0gICAgICAgICAgICBpZiAobnVtX29wcyA9PSBleGNlcHRpb25zX3Blcl9hcmVhXykgewotICAgICAgICAgICAgICAgIC8vIFN0b3JlIGl0IGluIHZlY3RvciBhdCB0aGUgcmlnaHQgaW5kZXguIFRoaXMgbWFwcyB0aGUgY2h1bmstaWQgdG8KLSAgICAgICAgICAgICAgICAvLyB2ZWN0b3IgaW5kZXguCi0gICAgICAgICAgICAgICAgdmVjXy5wdXNoX2JhY2soc3RkOjptb3ZlKGRlX3B0cikpOwotICAgICAgICAgICAgICAgIG51bV9vcHMgPSAwOwotICAgICAgICAgICAgICAgIG9mZnNldCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYnVmZmVyIGZvciBuZXh0IGFyZWEKLSAgICAgICAgICAgICAgICBkZV9wdHIgPSBzdGQ6Om1ha2VfdW5pcXVlPHVpbnQ4X3RbXT4oZXhjZXB0aW9uc19wZXJfYXJlYV8gKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGRpc2tfZXhjZXB0aW9uKSk7Ci0gICAgICAgICAgICAgICAgbWVtc2V0KGRlX3B0ci5nZXQoKSwgMCwgKGV4Y2VwdGlvbnNfcGVyX2FyZWFfICogc2l6ZW9mKHN0cnVjdCBkaXNrX2V4Y2VwdGlvbikpKTsKLQotICAgICAgICAgICAgICAgIGlmIChjb3dvcF9ybV9pdGVyLT5Eb25lKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdmVjXy5wdXNoX2JhY2soc3RkOjptb3ZlKGRlX3B0cikpOwotICAgICAgICAgICAgICAgICAgICBTTkFQX0xPRyhERUJVRykgPDwgIlJlYWRNZXRhZGF0YSgpIGNvbXBsZXRlZDsgTnVtYmVyIG9mIEFyZWFzOiAiIDw8IHZlY18uc2l6ZSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghKHBlbmRpbmdfb3JkZXJlZF9vcHMgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJJbnZhbGlkIHBlbmRpbmdfb3JkZXJlZF9vcHM6IGV4cGVjdGVkOiAwIGZvdW5kOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBwZW5kaW5nX29yZGVyZWRfb3BzOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBlbmRpbmdfb3JkZXJlZF9vcHMgPSBleGNlcHRpb25zX3Blcl9hcmVhXzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGF0YV9jaHVua19pZCA9IEdldE5leHRBbGxvY2F0YWJsZUNodW5rSWQoZGF0YV9jaHVua19pZCk7Ci0gICAgICAgICAgICB0b3RhbF9vcmRlcmVkX29wcyAtPSAxOwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFNwbGl0IHRoZSBudW1iZXIgb2Ygb3BzIGJhc2VkIG9uIHRoZSBzaXplIG9mIHJlYWQtYWhlYWQgYnVmZmVyCi0gICAgICAgICAgICAgKiByZWdpb24uIFdlIG5lZWQgdG8gZW5zdXJlIHRoYXQga2VybmVsIGRvZXNuJ3QgaXNzdWUgSU8gb24gYmxvY2tzCi0gICAgICAgICAgICAgKiB3aGljaCBhcmUgbm90IHJlYWQgYnkgdGhlIHJlYWQtYWhlYWQgdGhyZWFkLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAocmVhZF9haGVhZF9mZWF0dXJlXyAmJiAodG90YWxfb3JkZXJlZF9vcHMgJSBudW1fcmFfb3BzX3Blcl9pdGVyID09IDApKSB7Ci0gICAgICAgICAgICAgICAgZGF0YV9jaHVua19pZCA9IEdldE5leHRBbGxvY2F0YWJsZUNodW5rSWQoZGF0YV9jaHVua19pZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdmVjLmNsZWFyKCk7Ci0gICAgICAgIGRlc3RfYmxvY2tzLmNsZWFyKCk7Ci0gICAgICAgIHNvdXJjZV9ibG9ja3MuY2xlYXIoKTsKLSAgICAgICAgcHJldl9pZC5yZXNldCgpOwotICAgIH0KLQotICAgIC8vIFBhcnRpYWxseSBmaWxsZWQgYXJlYSBvciB0aGVyZSBpcyBubyBtZXRhZGF0YQotICAgIC8vIElmIHRoZXJlIGlzIG5vIG1ldGFkYXRhLCBmaWxsIHdpdGggemVybyBzbyB0aGF0IGtlcm5lbAotICAgIC8vIGlzIGF3YXJlIHRoYXQgbWVyZ2UgaXMgY29tcGxldGVkLgotICAgIGlmIChudW1fb3BzIHx8ICFtZXRhZGF0YV9mb3VuZCkgewotICAgICAgICB2ZWNfLnB1c2hfYmFjayhzdGQ6Om1vdmUoZGVfcHRyKSk7Ci0gICAgICAgIFNOQVBfTE9HKERFQlVHKSA8PCAiUmVhZE1ldGFkYXRhKCkgY29tcGxldGVkLiBQYXJ0aWFsbHkgZmlsbGVkIGFyZWEgbnVtX29wczogIiA8PCBudW1fb3BzCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiQXJlYXMgOiAiIDw8IHZlY18uc2l6ZSgpOwotICAgIH0KLQotICAgIGNodW5rX3ZlY18uc2hyaW5rX3RvX2ZpdCgpOwotICAgIHZlY18uc2hyaW5rX3RvX2ZpdCgpOwotICAgIHJlYWRfYWhlYWRfb3BzXy5zaHJpbmtfdG9fZml0KCk7Ci0KLSAgICAvLyBTb3J0IHRoZSB2ZWN0b3IgYmFzZWQgb24gc2VjdG9ycyBhcyB3ZSBuZWVkIHRoaXMgZHVyaW5nIHVuLWFsaWduZWQgYWNjZXNzCi0gICAgc3RkOjpzb3J0KGNodW5rX3ZlY18uYmVnaW4oKSwgY2h1bmtfdmVjXy5lbmQoKSwgY29tcGFyZSk7Ci0KLSAgICBTTkFQX0xPRyhJTkZPKSA8PCAiUmVhZE1ldGFkYXRhIGNvbXBsZXRlZC4gRmluYWwtY2h1bmstaWQ6ICIgPDwgZGF0YV9jaHVua19pZAotICAgICAgICAgICAgICAgICAgIDw8ICIgTnVtIFNlY3RvcjogIiA8PCBDaHVua1RvU2VjdG9yKGRhdGFfY2h1bmtfaWQpCi0gICAgICAgICAgICAgICAgICAgPDwgIiBSZXBsYWNlLW9wczogIiA8PCByZXBsYWNlX29wcyA8PCAiIFplcm8tb3BzOiAiIDw8IHplcm9fb3BzCi0gICAgICAgICAgICAgICAgICAgPDwgIiBDb3B5LW9wczogIiA8PCBjb3B5X29wcyA8PCAiIEFyZWFzOiAiIDw8IHZlY18uc2l6ZSgpCi0gICAgICAgICAgICAgICAgICAgPDwgIiBOdW0tb3BzLW1lcmdlZDogIiA8PCBoZWFkZXIubnVtX21lcmdlX29wcwotICAgICAgICAgICAgICAgICAgIDw8ICIgVG90YWwtZGF0YS1vcHM6ICIgPDwgcmVhZGVyXy0+Z2V0X251bV90b3RhbF9kYXRhX29wcygpOwotCi0gICAgLy8gVG90YWwgbnVtYmVyIG9mIHNlY3RvcnMgcmVxdWlyZWQgZm9yIGNyZWF0aW5nIGRtLXVzZXIgZGV2aWNlCi0gICAgbnVtX3NlY3RvcnNfID0gQ2h1bmtUb1NlY3RvcihkYXRhX2NodW5rX2lkKTsKLSAgICBtZXJnZV9pbml0aWF0ZWRfID0gZmFsc2U7Ci0gICAgUHJlcGFyZVJlYWRBaGVhZCgpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgU25hcHVzZXJkOjpNbWFwTWV0YWRhdGEoKSB7Ci0gICAgQ293SGVhZGVyIGhlYWRlcjsKLSAgICByZWFkZXJfLT5HZXRIZWFkZXIoJmhlYWRlcik7Ci0KLSAgICBpZiAoaGVhZGVyLm1ham9yX3ZlcnNpb24gPj0gMiAmJiBoZWFkZXIuYnVmZmVyX3NpemUgPiAwKSB7Ci0gICAgICAgIHRvdGFsX21hcHBlZF9hZGRyX2xlbmd0aF8gPSBoZWFkZXIuaGVhZGVyX3NpemUgKyBCVUZGRVJfUkVHSU9OX0RFRkFVTFRfU0laRTsKLSAgICAgICAgcmVhZF9haGVhZF9mZWF0dXJlXyA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gbW1hcCB0aGUgZmlyc3QgNGsgcGFnZSAtIG9sZGVyIENPVyBmb3JtYXQKLSAgICAgICAgdG90YWxfbWFwcGVkX2FkZHJfbGVuZ3RoXyA9IEJMT0NLX1NaOwotICAgICAgICByZWFkX2FoZWFkX2ZlYXR1cmVfID0gZmFsc2U7Ci0gICAgfQotCi0gICAgbWFwcGVkX2FkZHJfID0gbW1hcChOVUxMLCB0b3RhbF9tYXBwZWRfYWRkcl9sZW5ndGhfLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELAotICAgICAgICAgICAgICAgICAgICAgICAgY293X2ZkXy5nZXQoKSwgMCk7Ci0gICAgaWYgKG1hcHBlZF9hZGRyXyA9PSBNQVBfRkFJTEVEKSB7Ci0gICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAibW1hcCBtZXRhZGF0YSBmYWlsZWQiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgU25hcHVzZXJkOjpVbm1hcEJ1ZmZlclJlZ2lvbigpIHsKLSAgICBpbnQgcmV0ID0gbXVubWFwKG1hcHBlZF9hZGRyXywgdG90YWxfbWFwcGVkX2FkZHJfbGVuZ3RoXyk7Ci0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgU05BUF9QTE9HKEVSUk9SKSA8PCAibXVubWFwIGZhaWxlZCI7Ci0gICAgfQotfQotCi12b2lkIE15TG9nZ2VyKGFuZHJvaWQ6OmJhc2U6OkxvZ0lkLCBhbmRyb2lkOjpiYXNlOjpMb2dTZXZlcml0eSBzZXZlcml0eSwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLAotICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQsIGNvbnN0IGNoYXIqIG1lc3NhZ2UpIHsKLSAgICBpZiAoc2V2ZXJpdHkgPT0gYW5kcm9pZDo6YmFzZTo6RVJST1IpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgbWVzc2FnZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihzdGRvdXQsICIlc1xuIiwgbWVzc2FnZSk7Ci0gICAgfQotfQotCi1ib29sIFNuYXB1c2VyZDo6SW5pdENvd0RldmljZSgpIHsKLSAgICBjb3dfZmRfLnJlc2V0KG9wZW4oY293X2RldmljZV8uY19zdHIoKSwgT19SRFdSKSk7Ci0gICAgaWYgKGNvd19mZF8gPCAwKSB7Ci0gICAgICAgIFNOQVBfUExPRyhFUlJPUikgPDwgIk9wZW4gRmFpbGVkOiAiIDw8IGNvd19kZXZpY2VfOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIFJlYWRNZXRhZGF0YSgpOwotfQotCi12b2lkIFNuYXB1c2VyZDo6UmVhZEJsb2Nrc1RvQ2FjaGUoY29uc3Qgc3RkOjpzdHJpbmcmIGRtX2Jsb2NrX2RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFydGl0aW9uX25hbWUsIG9mZl90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKLSAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgZmQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oZG1fYmxvY2tfZGV2aWNlLmNfc3RyKCksIE9fUkRPTkxZKSkpOwotICAgIGlmIChmZC5nZXQoKSA9PSAtMSkgewotICAgICAgICBTTkFQX1BMT0coRVJST1IpIDw8ICJFcnJvciByZWFkaW5nICIgPDwgZG1fYmxvY2tfZGV2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBwYXJ0aXRpb24tbmFtZTogIiA8PCBwYXJ0aXRpb25fbmFtZTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHNpemVfdCByZW1haW4gPSBzaXplOwotICAgIG9mZl90IGZpbGVfb2Zmc2V0ID0gb2Zmc2V0OwotICAgIC8vIFdlIHBpY2sgNE0gSS9PIHNpemUgYmFzZWQgb24gdGhlIGZhY3QgdGhhdCB0aGUgY3VycmVudAotICAgIC8vIHVwZGF0ZV92ZXJpZmllciBoYXMgYSBzaW1pbGFyIEkvTyBzaXplLgotICAgIHNpemVfdCByZWFkX3N6ID0gMTAyNCAqIEJMT0NLX1NaOwotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ1ZihyZWFkX3N6KTsKLQotICAgIHdoaWxlIChyZW1haW4gPiAwKSB7Ci0gICAgICAgIHNpemVfdCB0b19yZWFkID0gc3RkOjptaW4ocmVtYWluLCByZWFkX3N6KTsKLQotICAgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseUF0T2Zmc2V0KGZkLmdldCgpLCBidWYuZGF0YSgpLCB0b19yZWFkLCBmaWxlX29mZnNldCkpIHsKLSAgICAgICAgICAgIFNOQVBfUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byByZWFkIGJsb2NrIGZyb20gYmxvY2sgZGV2aWNlOiAiIDw8IGRtX2Jsb2NrX2RldmljZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGF0IG9mZnNldDogIiA8PCBmaWxlX29mZnNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHBhcnRpdGlvbi1uYW1lOiAiIDw8IHBhcnRpdGlvbl9uYW1lIDw8ICIgdG90YWwtc2l6ZTogIiA8PCBzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgcmVtYWluX3NpemU6ICIgPDwgcmVtYWluOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZmlsZV9vZmZzZXQgKz0gdG9fcmVhZDsKLSAgICAgICAgcmVtYWluIC09IHRvX3JlYWQ7Ci0gICAgfQotCi0gICAgU05BUF9MT0coSU5GTykgPDwgIkZpbmlzaGVkIHJlYWRpbmcgYmxvY2stZGV2aWNlOiAiIDw8IGRtX2Jsb2NrX2RldmljZQotICAgICAgICAgICAgICAgICAgIDw8ICIgcGFydGl0aW9uOiAiIDw8IHBhcnRpdGlvbl9uYW1lIDw8ICIgc2l6ZTogIiA8PCBzaXplCi0gICAgICAgICAgICAgICAgICAgPDwgIiBvZmZzZXQ6ICIgPDwgb2Zmc2V0OwotfQotCi12b2lkIFNuYXB1c2VyZDo6UmVhZEJsb2Nrcyhjb25zdCBzdGQ6OnN0cmluZyYgcGFydGl0aW9uX25hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBkbV9ibG9ja19kZXZpY2UpIHsKLSAgICBTTkFQX0xPRyhERUJVRykgPDwgIlJlYWRpbmcgcGFydGl0aW9uOiAiIDw8IHBhcnRpdGlvbl9uYW1lCi0gICAgICAgICAgICAgICAgICAgIDw8ICIgQmxvY2stRGV2aWNlOiAiIDw8IGRtX2Jsb2NrX2RldmljZTsKLQotICAgIHVpbnQ2NF90IGRldl9zeiA9IDA7Ci0KLSAgICB1bmlxdWVfZmQgZmQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oZG1fYmxvY2tfZGV2aWNlLmNfc3RyKCksIE9fUkRPTkxZIHwgT19DTE9FWEVDKSkpOwotICAgIGlmIChmZCA8IDApIHsKLSAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJDYW5ub3Qgb3BlbiBibG9jayBkZXZpY2UiOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZGV2X3N6ID0gZ2V0X2Jsb2NrX2RldmljZV9zaXplKGZkLmdldCgpKTsKLSAgICBpZiAoIWRldl9zeikgewotICAgICAgICBTTkFQX1BMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgZGV0ZXJtaW5lIGJsb2NrIGRldmljZSBzaXplOiAiIDw8IGRtX2Jsb2NrX2RldmljZTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGludCBudW1fdGhyZWFkcyA9IDI7Ci0gICAgc2l6ZV90IG51bV9ibG9ja3MgPSBkZXZfc3ogPj4gQkxPQ0tfU0hJRlQ7Ci0gICAgc2l6ZV90IG51bV9ibG9ja3NfcGVyX3RocmVhZCA9IG51bV9ibG9ja3MgLyBudW1fdGhyZWFkczsKLSAgICBzaXplX3QgcmVhZF9zel9wZXJfdGhyZWFkID0gbnVtX2Jsb2Nrc19wZXJfdGhyZWFkIDw8IEJMT0NLX1NISUZUOwotICAgIG9mZl90IG9mZnNldCA9IDA7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV90aHJlYWRzOyBpKyspIHsKLSAgICAgICAgc3RkOjphc3luYyhzdGQ6OmxhdW5jaDo6YXN5bmMsICZTbmFwdXNlcmQ6OlJlYWRCbG9ja3NUb0NhY2hlLCB0aGlzLCBkbV9ibG9ja19kZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgcGFydGl0aW9uX25hbWUsIG9mZnNldCwgcmVhZF9zel9wZXJfdGhyZWFkKTsKLQotICAgICAgICBvZmZzZXQgKz0gcmVhZF9zel9wZXJfdGhyZWFkOwotICAgIH0KLX0KLQotLyoKLSAqIEVudHJ5IHBvaW50IHRvIGxhdW5jaCB0aHJlYWRzCi0gKi8KLWJvb2wgU25hcHVzZXJkOjpTdGFydCgpIHsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OmZ1dHVyZTxib29sPj4gdGhyZWFkczsKLSAgICBzdGQ6OmZ1dHVyZTxib29sPiByYV90aHJlYWQ7Ci0gICAgYm9vbCByYXRocmVhZCA9IChyZWFkX2FoZWFkX2ZlYXR1cmVfICYmIChyZWFkX2FoZWFkX29wc18uc2l6ZSgpID4gMCkpOwotCi0gICAgLy8gU3RhcnQgdGhlIHJlYWQtYWhlYWQgdGhyZWFkIGFuZCB3YWl0Ci0gICAgLy8gZm9yIGl0IGFzIHRoZSBkYXRhIGhhcyB0byBiZSByZS1jb25zdHJ1Y3RlZAotICAgIC8vIGZyb20gQ09XIGRldmljZS4KLSAgICBpZiAocmF0aHJlYWQpIHsKLSAgICAgICAgcmFfdGhyZWFkID0gc3RkOjphc3luYyhzdGQ6OmxhdW5jaDo6YXN5bmMsICZSZWFkQWhlYWRUaHJlYWQ6OlJ1blRocmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX2FoZWFkX3RocmVhZF8uZ2V0KCkpOwotICAgICAgICBpZiAoIVdhaXRGb3JSZWFkQWhlYWRUb1N0YXJ0KCkpIHsKLSAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHN0YXJ0IFJlYWQtYWhlYWQgdGhyZWFkLi4uIjsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIFNOQVBfTE9HKElORk8pIDw8ICJSZWFkLWFoZWFkIHRocmVhZCBzdGFydGVkLi4uIjsKLSAgICB9Ci0KLSAgICAvLyBMYXVuY2ggd29ya2VyIHRocmVhZHMKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHdvcmtlcl90aHJlYWRzXy5zaXplKCk7IGkrKykgewotICAgICAgICB0aHJlYWRzLmVtcGxhY2VfYmFjaygKLSAgICAgICAgICAgICAgICBzdGQ6OmFzeW5jKHN0ZDo6bGF1bmNoOjphc3luYywgJldvcmtlclRocmVhZDo6UnVuVGhyZWFkLCB3b3JrZXJfdGhyZWFkc19baV0uZ2V0KCkpKTsKLSAgICB9Ci0KLSAgICBib29sIHNlY29uZF9zdGFnZV9pbml0ID0gdHJ1ZTsKLQotICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gcmVhZCB0aGUgYmxvY2tzIGR1cmluZyBmaXJzdCBzdGFnZSBpbml0LgotICAgIGlmIChhbmRyb2lkOjpiYXNlOjpFbmRzV2l0aChtaXNjX25hbWVfLCAiLWluaXQiKSB8fCBpc19zb2NrZXRfcHJlc2VudF8pIHsKLSAgICAgICAgc2Vjb25kX3N0YWdlX2luaXQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoc2Vjb25kX3N0YWdlX2luaXQpIHsKLSAgICAgICAgU05BUF9MT0coSU5GTykgPDwgIlJlYWRpbmcgYmxvY2tzIHRvIGNhY2hlLi4uLiI7Ci0gICAgICAgIGF1dG8mIGRtID0gRGV2aWNlTWFwcGVyOjpJbnN0YW5jZSgpOwotICAgICAgICBhdXRvIGRtX2Jsb2NrX2RldmljZXMgPSBkbS5GaW5kRG1QYXJ0aXRpb25zKCk7Ci0gICAgICAgIGlmIChkbV9ibG9ja19kZXZpY2VzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiTm8gZG0tZW5hYmxlZCBibG9jayBkZXZpY2UgaXMgZm91bmQuIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGF1dG8gcGFydHMgPSBhbmRyb2lkOjpiYXNlOjpTcGxpdChtaXNjX25hbWVfLCAiLSIpOwotICAgICAgICAgICAgc3RkOjpzdHJpbmcgcGFydGl0aW9uX25hbWUgPSBwYXJ0c1swXTsKLQotICAgICAgICAgICAgY29uc3QgY2hhciogc3VmZml4X2IgPSAiX2IiOwotICAgICAgICAgICAgY29uc3QgY2hhciogc3VmZml4X2EgPSAiX2EiOwotCi0gICAgICAgICAgICBwYXJ0aXRpb25fbmFtZS5lcmFzZShwYXJ0aXRpb25fbmFtZS5maW5kX2xhc3Rfbm90X29mKHN1ZmZpeF9iKSArIDEpOwotICAgICAgICAgICAgcGFydGl0aW9uX25hbWUuZXJhc2UocGFydGl0aW9uX25hbWUuZmluZF9sYXN0X25vdF9vZihzdWZmaXhfYSkgKyAxKTsKLQotICAgICAgICAgICAgaWYgKGRtX2Jsb2NrX2RldmljZXMuZmluZChwYXJ0aXRpb25fbmFtZSkgPT0gZG1fYmxvY2tfZGV2aWNlcy5lbmQoKSkgewotICAgICAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGZpbmQgZG0gYmxvY2sgZGV2aWNlIGZvciAiIDw8IHBhcnRpdGlvbl9uYW1lOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBSZWFkQmxvY2tzKHBhcnRpdGlvbl9uYW1lLCBkbV9ibG9ja19kZXZpY2VzLmF0KHBhcnRpdGlvbl9uYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBTTkFQX0xPRyhJTkZPKSA8PCAiTm90IHJlYWRpbmcgYmxvY2sgZGV2aWNlIGludG8gY2FjaGUiOwotICAgIH0KLQotICAgIGJvb2wgcmV0ID0gdHJ1ZTsKLSAgICBmb3IgKGF1dG8mIHQgOiB0aHJlYWRzKSB7Ci0gICAgICAgIHJldCA9IHQuZ2V0KCkgJiYgcmV0OwotICAgIH0KLQotICAgIGlmIChyYXRocmVhZCkgewotICAgICAgICAvLyBOb3RpZnkgdGhlIHJlYWQtYWhlYWQgdGhyZWFkIHRoYXQgYWxsIHdvcmtlciB0aHJlYWRzCi0gICAgICAgIC8vIGFyZSBkb25lLiBXZSBuZWVkIHRoaXMgZXhwbGljaXQgbm90aWZpY2F0aW9uIHdoZW4KLSAgICAgICAgLy8gdGhlcmUgaXMgYW4gSU8gZmFpbHVyZSBvciB0aGVyZSB3YXMgYSBzd2l0Y2gKLSAgICAgICAgLy8gb2YgZG0tdXNlciB0YWJsZTsgdGh1cywgZm9yY2luZyB0aGUgcmVhZC1haGVhZAotICAgICAgICAvLyB0aHJlYWQgdG8gd2FrZSB1cC4KLSAgICAgICAgTWVyZ2VDb21wbGV0ZWQoKTsKLSAgICAgICAgcmV0ID0gcmV0ICYmIHJhX3RocmVhZC5nZXQoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi11aW50NjRfdCBTbmFwdXNlcmQ6OkdldEJ1ZmZlck1ldGFkYXRhT2Zmc2V0KCkgewotICAgIENvd0hlYWRlciBoZWFkZXI7Ci0gICAgcmVhZGVyXy0+R2V0SGVhZGVyKCZoZWFkZXIpOwotCi0gICAgc2l6ZV90IHNpemUgPSBoZWFkZXIuaGVhZGVyX3NpemUgKyBzaXplb2YoQnVmZmVyU3RhdGUpOwotICAgIHJldHVybiBzaXplOwotfQotCi0vKgotICogTWV0YWRhdGEgZm9yIHJlYWQtYWhlYWQgaXMgMTYgYnl0ZXMuIEZvciBhIDIgTUIgcmVnaW9uLCB3ZSB3aWxsCi0gKiBlbmQgdXAgd2l0aCA4ayAoMiBQQUdFKSB3b3J0aCBvZiBtZXRhZGF0YS4gVGh1cywgYSAyTUIgYnVmZmVyCi0gKiByZWdpb24gaXMgc3BsaXQgaW50bzoKLSAqCi0gKiAxOiA4ayBtZXRhZGF0YQotICoKLSAqLwotc2l6ZV90IFNuYXB1c2VyZDo6R2V0QnVmZmVyTWV0YWRhdGFTaXplKCkgewotICAgIENvd0hlYWRlciBoZWFkZXI7Ci0gICAgcmVhZGVyXy0+R2V0SGVhZGVyKCZoZWFkZXIpOwotCi0gICAgc2l6ZV90IG1ldGFkYXRhX2J5dGVzID0gKGhlYWRlci5idWZmZXJfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgU2NyYXRjaE1ldGFkYXRhKSkgLyBCTE9DS19TWjsKLSAgICByZXR1cm4gbWV0YWRhdGFfYnl0ZXM7Ci19Ci0KLXNpemVfdCBTbmFwdXNlcmQ6OkdldEJ1ZmZlckRhdGFPZmZzZXQoKSB7Ci0gICAgQ293SGVhZGVyIGhlYWRlcjsKLSAgICByZWFkZXJfLT5HZXRIZWFkZXIoJmhlYWRlcik7Ci0KLSAgICByZXR1cm4gKGhlYWRlci5oZWFkZXJfc2l6ZSArIEdldEJ1ZmZlck1ldGFkYXRhU2l6ZSgpKTsKLX0KLQotLyoKLSAqICgyTUIgLSA4SyA9IDIwODg5NjAgYnl0ZXMpIHdpbGwgYmUgdGhlIGJ1ZmZlciByZWdpb24gdG8gaG9sZCB0aGUgZGF0YS4KLSAqLwotc2l6ZV90IFNuYXB1c2VyZDo6R2V0QnVmZmVyRGF0YVNpemUoKSB7Ci0gICAgQ293SGVhZGVyIGhlYWRlcjsKLSAgICByZWFkZXJfLT5HZXRIZWFkZXIoJmhlYWRlcik7Ci0KLSAgICBzaXplX3Qgc2l6ZSA9IGhlYWRlci5idWZmZXJfc2l6ZSAtIEdldEJ1ZmZlck1ldGFkYXRhU2l6ZSgpOwotICAgIHJldHVybiBzaXplOwotfQotCi1zdHJ1Y3QgQnVmZmVyU3RhdGUqIFNuYXB1c2VyZDo6R2V0QnVmZmVyU3RhdGUoKSB7Ci0gICAgQ293SGVhZGVyIGhlYWRlcjsKLSAgICByZWFkZXJfLT5HZXRIZWFkZXIoJmhlYWRlcik7Ci0KLSAgICBzdHJ1Y3QgQnVmZmVyU3RhdGUqIHJhX3N0YXRlID0KLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IEJ1ZmZlclN0YXRlKj4oKGNoYXIqKW1hcHBlZF9hZGRyXyArIGhlYWRlci5oZWFkZXJfc2l6ZSk7Ci0gICAgcmV0dXJuIHJhX3N0YXRlOwotfQotCi19ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL2RtLXNuYXBzaG90LW1lcmdlL3NuYXB1c2VyZC5oIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9kbS1zbmFwc2hvdC1tZXJnZS9zbmFwdXNlcmQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmViNjAwNC4uMDAwMDAwMAotLS0gYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL2RtLXNuYXBzaG90LW1lcmdlL3NuYXB1c2VyZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMyICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotI2luY2x1ZGUgPGJpdHNldD4KLSNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+Ci0jaW5jbHVkZSA8Y3NpZ25hbD4KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPGZ1dHVyZT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxsaW1pdHM+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx0aHJlYWQ+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgotI2luY2x1ZGUgPGV4dDRfdXRpbHMvZXh0NF91dGlscy5oPgotI2luY2x1ZGUgPGxpYmRtL2RtLmg+Ci0jaW5jbHVkZSA8bGlic25hcHNob3QvY293X3JlYWRlci5oPgotI2luY2x1ZGUgPGxpYnNuYXBzaG90L2Nvd193cml0ZXIuaD4KLSNpbmNsdWRlIDxzbmFwdXNlcmQvc25hcHVzZXJkX2J1ZmZlci5oPgotI2luY2x1ZGUgPHNuYXB1c2VyZC9zbmFwdXNlcmRfa2VybmVsLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBzbmFwc2hvdCB7Ci0KLXVzaW5nIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZDsKLXVzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKLQotc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgUEFZTE9BRF9TSVpFID0gKDFVTCA8PCAyMCk7Ci1zdGF0aWNfYXNzZXJ0KFBBWUxPQURfU0laRSA+PSBCTE9DS19TWik7Ci0KLS8qCi0gKiBXaXRoIDQgdGhyZWFkcywgd2UgZ2V0IG9wdGltYWwgcGVyZm9ybWFuY2UKLSAqIHdoZW4gdXBkYXRlX3ZlcmlmaWVyIHJlYWRzIHRoZSBwYXJ0aXRpb24gZHVyaW5nCi0gKiBib290LgotICovCi1zdGF0aWMgY29uc3RleHByIGludCBOVU1fVEhSRUFEU19QRVJfUEFSVElUSU9OID0gNDsKLQotLyoKLSAqIFN0YXRlIHRyYW5zaXRpb25zIGJldHdlZW4gd29ya2VyIHRocmVhZHMgYW5kIHJlYWQtYWhlYWQKLSAqIHRocmVhZHMuCi0gKgotICogUkVBRF9BSEVBRF9CRUdJTjogV29ya2VyIHRocmVhZHMgaW5pdGlhdGVzIHRoZSByZWFkLWFoZWFkCi0gKiAgICAgICAgICAgICAgICAgICB0aHJlYWQgdG8gYmVnaW4gcmVhZGluZyB0aGUgY29weSBvcGVyYXRpb25zCi0gKiAgICAgICAgICAgICAgICAgICBmb3IgZWFjaCBib3VuZGVkIHJlZ2lvbi4KLSAqCi0gKiBSRUFEX0FIRUFEX0lOX1BST0dSRVNTOiBXaGVuIHJlYWQgYWhlYWQgdGhyZWFkIGlzIGluLWZsaWdodAotICogICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHJlYWRpbmcgdGhlIGNvcHkgb3BlcmF0aW9ucy4KLSAqCi0gKiBJT19JTl9QUk9HUkVTUzogTWVyZ2Ugb3BlcmF0aW9uIGlzIGluLXByb2dyZXNzIGJ5IHdvcmtlciB0aHJlYWRzLgotICoKLSAqIElPX1RFUk1JTkFURUQ6IFdoZW4gYWxsIHRoZSB3b3JrZXIgdGhyZWFkcyBhcmUgZG9uZSwgcmVxdWVzdCB0aGUKLSAqICAgICAgICAgICAgICAgIHJlYWQtYWhlYWQgdGhyZWFkIHRvIHRlcm1pbmF0ZQotICoKLSAqIFJFQURfQUhFQURfRkFJTFVSRTogSWYgdGhlcmUgYXJlIGFueSBJTyBmYWlsdXJlcyB3aGVuIHJlYWQtYWhlYWQKLSAqICAgICAgICAgICAgICAgICAgICAgdGhyZWFkIGlzIHJlYWRpbmcgZnJvbSBDT1cgZGV2aWNlLgotICoKLSAqIFRoZSB0cmFuc2l0aW9uIG9mIGVhY2ggc3RhdGVzIGlzIGRlc2NyaWJlZCBpbiBzbmFwdXNlcmRfcmVhZGFoZWFkLmNwcAotICovCi1lbnVtIGNsYXNzIFJFQURfQUhFQURfSU9fVFJBTlNJVElPTiB7Ci0gICAgUkVBRF9BSEVBRF9CRUdJTiwKLSAgICBSRUFEX0FIRUFEX0lOX1BST0dSRVNTLAotICAgIElPX0lOX1BST0dSRVNTLAotICAgIElPX1RFUk1JTkFURUQsCi0gICAgUkVBRF9BSEVBRF9GQUlMVVJFLAotfTsKLQotY2xhc3MgU25hcHVzZXJkOwotCi1jbGFzcyBSZWFkQWhlYWRUaHJlYWQgewotICBwdWJsaWM6Ci0gICAgUmVhZEFoZWFkVGhyZWFkKGNvbnN0IHN0ZDo6c3RyaW5nJiBjb3dfZGV2aWNlLCBjb25zdCBzdGQ6OnN0cmluZyYgYmFja2luZ19kZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUsIHN0ZDo6c2hhcmVkX3B0cjxTbmFwdXNlcmQ+IHNuYXB1c2VyZCk7Ci0gICAgYm9vbCBSdW5UaHJlYWQoKTsKLQotICBwcml2YXRlOgotICAgIHZvaWQgSW5pdGlhbGl6ZVJBSXRlcigpOwotICAgIGJvb2wgUkFJdGVyRG9uZSgpOwotICAgIHZvaWQgUkFJdGVyTmV4dCgpOwotICAgIGNvbnN0IENvd09wZXJhdGlvbiogR2V0UkFPcEl0ZXIoKTsKLSAgICB2b2lkIEluaXRpYWxpemVCdWZmZXIoKTsKLQotICAgIGJvb2wgSW5pdGlhbGl6ZUZkcygpOwotICAgIHZvaWQgQ2xvc2VGZHMoKSB7Ci0gICAgICAgIGNvd19mZF8gPSB7fTsKLSAgICAgICAgYmFja2luZ19zdG9yZV9mZF8gPSB7fTsKLSAgICB9Ci0KLSAgICBib29sIFJlYWRBaGVhZElPU3RhcnQoKTsKLSAgICB2b2lkIFByZXBhcmVSZWFkQWhlYWQodWludDY0X3QqIHNvdXJjZV9vZmZzZXQsIGludCogcGVuZGluZ19vcHMsIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiYgYmxvY2tzKTsKLSAgICBib29sIFJlY29uc3RydWN0RGF0YUZyb21Db3coKTsKLSAgICB2b2lkIENoZWNrT3ZlcmxhcChjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCk7Ci0KLSAgICB2b2lkKiByZWFkX2FoZWFkX2J1ZmZlcl87Ci0gICAgdm9pZCogbWV0YWRhdGFfYnVmZmVyXzsKLSAgICBzdGQ6OnZlY3Rvcjxjb25zdCBDb3dPcGVyYXRpb24qPjo6cmV2ZXJzZV9pdGVyYXRvciByZWFkX2FoZWFkX2l0ZXJfOwotICAgIHN0ZDo6c3RyaW5nIGNvd19kZXZpY2VfOwotICAgIHN0ZDo6c3RyaW5nIGJhY2tpbmdfc3RvcmVfZGV2aWNlXzsKLSAgICBzdGQ6OnN0cmluZyBtaXNjX25hbWVfOwotCi0gICAgdW5pcXVlX2ZkIGNvd19mZF87Ci0gICAgdW5pcXVlX2ZkIGJhY2tpbmdfc3RvcmVfZmRfOwotCi0gICAgc3RkOjpzaGFyZWRfcHRyPFNuYXB1c2VyZD4gc25hcHVzZXJkXzsKLQotICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1aW50NjRfdD4gZGVzdF9ibG9ja3NfOwotICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1aW50NjRfdD4gc291cmNlX2Jsb2Nrc187Ci0gICAgYm9vbCBvdmVybGFwXzsKLX07Ci0KLWNsYXNzIFdvcmtlclRocmVhZCB7Ci0gIHB1YmxpYzoKLSAgICBXb3JrZXJUaHJlYWQoY29uc3Qgc3RkOjpzdHJpbmcmIGNvd19kZXZpY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBiYWNraW5nX2RldmljZSwKLSAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRyb2xfZGV2aWNlLCBjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lLAotICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U25hcHVzZXJkPiBzbmFwdXNlcmQpOwotICAgIGJvb2wgUnVuVGhyZWFkKCk7Ci0KLSAgcHJpdmF0ZToKLSAgICAvLyBJbml0aWFsaXphdGlvbgotICAgIHZvaWQgSW5pdGlhbGl6ZUJ1ZnNpbmsoKTsKLSAgICBib29sIEluaXRpYWxpemVGZHMoKTsKLSAgICBib29sIEluaXRSZWFkZXIoKTsKLSAgICB2b2lkIENsb3NlRmRzKCkgewotICAgICAgICBjdHJsX2ZkXyA9IHt9OwotICAgICAgICBiYWNraW5nX3N0b3JlX2ZkXyA9IHt9OwotICAgIH0KLQotICAgIC8vIEZ1bmN0aW9ucyBpbnRlcmFjdGluZyB3aXRoIGRtLXVzZXIKLSAgICBib29sIFJlYWREbVVzZXJIZWFkZXIoKTsKLSAgICBib29sIERtdXNlclJlYWRSZXF1ZXN0KCk7Ci0gICAgYm9vbCBEbXVzZXJXcml0ZVJlcXVlc3QoKTsKLSAgICBib29sIFJlYWREbVVzZXJQYXlsb2FkKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOwotICAgIGJvb2wgV3JpdGVEbVVzZXJQYXlsb2FkKHNpemVfdCBzaXplLCBib29sIGhlYWRlcl9yZXNwb25zZSk7Ci0KLSAgICBib29sIFJlYWREaXNrRXhjZXB0aW9ucyhjaHVua190IGNodW5rLCBzaXplX3Qgc2l6ZSk7Ci0gICAgYm9vbCBaZXJvZmlsbERpc2tFeGNlcHRpb25zKHNpemVfdCByZWFkX3NpemUpOwotICAgIHZvaWQgQ29uc3RydWN0S2VybmVsQ293SGVhZGVyKCk7Ci0KLSAgICAvLyBJTyBQYXRoCi0gICAgYm9vbCBQcm9jZXNzSU9SZXF1ZXN0KCk7Ci0gICAgaW50IFJlYWREYXRhKHNlY3Rvcl90IHNlY3Rvciwgc2l6ZV90IHNpemUpOwotICAgIGludCBSZWFkVW5hbGlnbmVkU2VjdG9yKHNlY3Rvcl90IHNlY3Rvciwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHNlY3Rvcl90LCBjb25zdCBDb3dPcGVyYXRpb24qPj46Oml0ZXJhdG9yJiBpdCk7Ci0KLSAgICAvLyBQcm9jZXNzaW5nIENPVyBvcGVyYXRpb25zCi0gICAgYm9vbCBQcm9jZXNzQ293T3AoY29uc3QgQ293T3BlcmF0aW9uKiBjb3dfb3ApOwotICAgIGJvb2wgUHJvY2Vzc1JlcGxhY2VPcChjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCk7Ci0gICAgLy8gSGFuZGxlcyBDb3B5Ci0gICAgYm9vbCBQcm9jZXNzQ29weU9wKGNvbnN0IENvd09wZXJhdGlvbiogY293X29wKTsKLSAgICBib29sIFByb2Nlc3NaZXJvT3AoKTsKLQotICAgIGJvb2wgUmVhZEZyb21CYXNlRGV2aWNlKGNvbnN0IENvd09wZXJhdGlvbiogY293X29wKTsKLSAgICBib29sIEdldFJlYWRBaGVhZFBvcHVsYXRlZEJ1ZmZlcihjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCk7Ci0KLSAgICAvLyBNZXJnZSByZWxhdGVkIGZ1bmN0aW9ucwotICAgIGJvb2wgUHJvY2Vzc01lcmdlQ29tcGxldGUoY2h1bmtfdCBjaHVuaywgdm9pZCogYnVmZmVyKTsKLSAgICBsb2ZmX3QgR2V0TWVyZ2VTdGFydE9mZnNldCh2b2lkKiBtZXJnZWRfYnVmZmVyLCB2b2lkKiB1bm1lcmdlZF9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB1bm1lcmdlZF9leGNlcHRpb25zKTsKLQotICAgIGludCBHZXROdW1iZXJPZk1lcmdlZE9wcyh2b2lkKiBtZXJnZWRfYnVmZmVyLCB2b2lkKiB1bm1lcmdlZF9idWZmZXIsIGxvZmZfdCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1bm1lcmdlZF9leGNlcHRpb25zLCBib29sKiBjb3B5X29wLCBib29sKiBjb21taXQpOwotCi0gICAgc2VjdG9yX3QgQ2h1bmtUb1NlY3RvcihjaHVua190IGNodW5rKSB7IHJldHVybiBjaHVuayA8PCBDSFVOS19TSElGVDsgfQotICAgIGNodW5rX3QgU2VjdG9yVG9DaHVuayhzZWN0b3JfdCBzZWN0b3IpIHsgcmV0dXJuIHNlY3RvciA+PiBDSFVOS19TSElGVDsgfQotCi0gICAgc3RkOjp1bmlxdWVfcHRyPENvd1JlYWRlcj4gcmVhZGVyXzsKLSAgICBCdWZmZXJTaW5rIGJ1ZnNpbmtfOwotCi0gICAgc3RkOjpzdHJpbmcgY293X2RldmljZV87Ci0gICAgc3RkOjpzdHJpbmcgYmFja2luZ19zdG9yZV9kZXZpY2VfOwotICAgIHN0ZDo6c3RyaW5nIGNvbnRyb2xfZGV2aWNlXzsKLSAgICBzdGQ6OnN0cmluZyBtaXNjX25hbWVfOwotCi0gICAgdW5pcXVlX2ZkIGNvd19mZF87Ci0gICAgdW5pcXVlX2ZkIGJhY2tpbmdfc3RvcmVfZmRfOwotICAgIHVuaXF1ZV9mZCBjdHJsX2ZkXzsKLQotICAgIHN0ZDo6c2hhcmVkX3B0cjxTbmFwdXNlcmQ+IHNuYXB1c2VyZF87Ci0gICAgdWludDMyX3QgZXhjZXB0aW9uc19wZXJfYXJlYV87Ci19OwotCi1jbGFzcyBTbmFwdXNlcmQgOiBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxTbmFwdXNlcmQ+IHsKLSAgcHVibGljOgotICAgIFNuYXB1c2VyZChjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgY293X2RldmljZSwKLSAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJhY2tpbmdfZGV2aWNlKTsKLSAgICBib29sIEluaXRDb3dEZXZpY2UoKTsKLSAgICBib29sIFN0YXJ0KCk7Ci0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIEdldENvbnRyb2xEZXZpY2VQYXRoKCkgeyByZXR1cm4gY29udHJvbF9kZXZpY2VfOyB9Ci0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIEdldE1pc2NOYW1lKCkgeyByZXR1cm4gbWlzY19uYW1lXzsgfQotICAgIHVpbnQ2NF90IEdldE51bVNlY3RvcnMoKSB7IHJldHVybiBudW1fc2VjdG9yc187IH0KLSAgICBib29sIElzQXR0YWNoZWQoKSBjb25zdCB7IHJldHVybiBhdHRhY2hlZF87IH0KLSAgICB2b2lkIEF0dGFjaENvbnRyb2xEZXZpY2UoKSB7IGF0dGFjaGVkXyA9IHRydWU7IH0KLQotICAgIHZvaWQgQ2hlY2tNZXJnZUNvbXBsZXRpb25TdGF0dXMoKTsKLSAgICBib29sIENvbW1pdE1lcmdlKGludCBudW1fbWVyZ2Vfb3BzKTsKLQotICAgIHZvaWQgQ2xvc2VGZHMoKSB7IGNvd19mZF8gPSB7fTsgfQotICAgIHZvaWQgRnJlZVJlc291cmNlcygpIHsKLSAgICAgICAgd29ya2VyX3RocmVhZHNfLmNsZWFyKCk7Ci0gICAgICAgIHJlYWRfYWhlYWRfdGhyZWFkXyA9IG51bGxwdHI7Ci0gICAgfQotICAgIHNpemVfdCBHZXRNZXRhZGF0YUFyZWFTaXplKCkgeyByZXR1cm4gdmVjXy5zaXplKCk7IH0KLSAgICB2b2lkKiBHZXRFeGNlcHRpb25CdWZmZXIoc2l6ZV90IGkpIHsgcmV0dXJuIHZlY19baV0uZ2V0KCk7IH0KLQotICAgIGJvb2wgSW5pdGlhbGl6ZVdvcmtlcnMoKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q293UmVhZGVyPiBDbG9uZVJlYWRlckZvcldvcmtlcigpOwotICAgIHN0ZDo6c2hhcmVkX3B0cjxTbmFwdXNlcmQ+IEdldFNoYXJlZFB0cigpIHsgcmV0dXJuIHNoYXJlZF9mcm9tX3RoaXMoKTsgfQotCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHNlY3Rvcl90LCBjb25zdCBDb3dPcGVyYXRpb24qPj4mIEdldENodW5rVmVjKCkgeyByZXR1cm4gY2h1bmtfdmVjXzsgfQotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+PiYgR2V0TWV0YWRhdGFWZWMoKSBjb25zdCB7IHJldHVybiB2ZWNfOyB9Ci0KLSAgICBzdGF0aWMgYm9vbCBjb21wYXJlKHN0ZDo6cGFpcjxzZWN0b3JfdCwgY29uc3QgQ293T3BlcmF0aW9uKj4gcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8c2VjdG9yX3QsIGNvbnN0IENvd09wZXJhdGlvbio+IHAyKSB7Ci0gICAgICAgIHJldHVybiBwMS5maXJzdCA8IHAyLmZpcnN0OwotICAgIH0KLQotICAgIHZvaWQgVW5tYXBCdWZmZXJSZWdpb24oKTsKLSAgICBib29sIE1tYXBNZXRhZGF0YSgpOwotCi0gICAgLy8gUmVhZC1haGVhZCByZWxhdGVkIGZ1bmN0aW9ucwotICAgIHN0ZDo6dmVjdG9yPGNvbnN0IENvd09wZXJhdGlvbio+JiBHZXRSZWFkQWhlYWRPcHNWZWMoKSB7IHJldHVybiByZWFkX2FoZWFkX29wc187IH0KLSAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDY0X3QsIHZvaWQqPiYgR2V0UmVhZEFoZWFkTWFwKCkgeyByZXR1cm4gcmVhZF9haGVhZF9idWZmZXJfbWFwXzsgfQotICAgIHZvaWQqIEdldE1hcHBlZEFkZHIoKSB7IHJldHVybiBtYXBwZWRfYWRkcl87IH0KLSAgICBib29sIElzUmVhZEFoZWFkRmVhdHVyZVByZXNlbnQoKSB7IHJldHVybiByZWFkX2FoZWFkX2ZlYXR1cmVfOyB9Ci0gICAgdm9pZCBQcmVwYXJlUmVhZEFoZWFkKCk7Ci0gICAgdm9pZCBTdGFydFJlYWRBaGVhZCgpOwotICAgIHZvaWQgTWVyZ2VDb21wbGV0ZWQoKTsKLSAgICBib29sIFJlYWRBaGVhZElPQ29tcGxldGVkKGJvb2wgc3luYyk7Ci0gICAgdm9pZCBSZWFkQWhlYWRJT0ZhaWxlZCgpOwotICAgIGJvb2wgV2FpdEZvck1lcmdlVG9Db21wbGV0ZSgpOwotICAgIGJvb2wgR2V0UmVhZEFoZWFkUG9wdWxhdGVkQnVmZmVyKHVpbnQ2NF90IGJsb2NrLCB2b2lkKiBidWZmZXIpOwotICAgIGJvb2wgUmVjb25zdHJ1Y3REYXRhRnJvbUNvdygpIHsgcmV0dXJuIHBvcHVsYXRlX2RhdGFfZnJvbV9jb3dfOyB9Ci0gICAgdm9pZCBSZWNvbnN0cnVjdERhdGFGcm9tQ293RmluaXNoKCkgeyBwb3B1bGF0ZV9kYXRhX2Zyb21fY293XyA9IGZhbHNlOyB9Ci0gICAgYm9vbCBXYWl0Rm9yUmVhZEFoZWFkVG9TdGFydCgpOwotCi0gICAgdWludDY0X3QgR2V0QnVmZmVyTWV0YWRhdGFPZmZzZXQoKTsKLSAgICBzaXplX3QgR2V0QnVmZmVyTWV0YWRhdGFTaXplKCk7Ci0gICAgc2l6ZV90IEdldEJ1ZmZlckRhdGFPZmZzZXQoKTsKLSAgICBzaXplX3QgR2V0QnVmZmVyRGF0YVNpemUoKTsKLQotICAgIC8vIEZpbmFsIGJsb2NrIHRvIGJlIG1lcmdlZCBpbiBhIGdpdmVuIHJlYWQtYWhlYWQgYnVmZmVyIHJlZ2lvbgotICAgIHZvaWQgU2V0RmluYWxCbG9ja01lcmdlZCh1aW50NjRfdCB4KSB7IGZpbmFsX2Jsb2NrX21lcmdlZF8gPSB4OyB9Ci0gICAgdWludDY0X3QgR2V0RmluYWxCbG9ja01lcmdlZCgpIHsgcmV0dXJuIGZpbmFsX2Jsb2NrX21lcmdlZF87IH0KLSAgICAvLyBUb3RhbCBudW1iZXIgb2YgYmxvY2tzIHRvIGJlIG1lcmdlZCBpbiBhIGdpdmVuIHJlYWQtYWhlYWQgYnVmZmVyIHJlZ2lvbgotICAgIHZvaWQgU2V0VG90YWxSYUJsb2Nrc01lcmdlZChpbnQgeCkgeyB0b3RhbF9yYV9ibG9ja3NfbWVyZ2VkXyA9IHg7IH0KLSAgICBpbnQgR2V0VG90YWxSYUJsb2Nrc01lcmdlZCgpIHsgcmV0dXJuIHRvdGFsX3JhX2Jsb2Nrc19tZXJnZWRfOyB9Ci0gICAgdm9pZCBTZXRTb2NrZXRQcmVzZW50KGJvb2wgc29ja2V0KSB7IGlzX3NvY2tldF9wcmVzZW50XyA9IHNvY2tldDsgfQotCi0gIHByaXZhdGU6Ci0gICAgYm9vbCBJc0NodW5rSWRNZXRhZGF0YShjaHVua190IGNodW5rKTsKLSAgICBjaHVua190IEdldE5leHRBbGxvY2F0YWJsZUNodW5rSWQoY2h1bmtfdCBjaHVua19pZCk7Ci0KLSAgICBib29sIEdldFJBQnVmZmVyKHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4qIGxvY2ssIHVpbnQ2NF90IGJsb2NrLCB2b2lkKiBidWZmZXIpOwotICAgIGJvb2wgUmVhZE1ldGFkYXRhKCk7Ci0gICAgc2VjdG9yX3QgQ2h1bmtUb1NlY3RvcihjaHVua190IGNodW5rKSB7IHJldHVybiBjaHVuayA8PCBDSFVOS19TSElGVDsgfQotICAgIGNodW5rX3QgU2VjdG9yVG9DaHVuayhzZWN0b3JfdCBzZWN0b3IpIHsgcmV0dXJuIHNlY3RvciA+PiBDSFVOS19TSElGVDsgfQotICAgIGJvb2wgSXNCbG9ja0FsaWduZWQoaW50IHJlYWRfc2l6ZSkgeyByZXR1cm4gKChyZWFkX3NpemUgJiAoQkxPQ0tfU1ogLSAxKSkgPT0gMCk7IH0KLSAgICBzdHJ1Y3QgQnVmZmVyU3RhdGUqIEdldEJ1ZmZlclN0YXRlKCk7Ci0KLSAgICB2b2lkIFJlYWRCbG9ja3MoY29uc3Qgc3RkOjpzdHJpbmcmIHBhcnRpdGlvbl9uYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgZG1fYmxvY2tfZGV2aWNlKTsKLSAgICB2b2lkIFJlYWRCbG9ja3NUb0NhY2hlKGNvbnN0IHN0ZDo6c3RyaW5nJiBkbV9ibG9ja19kZXZpY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJ0aXRpb25fbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl90IG9mZnNldCwgc2l6ZV90IHNpemUpOwotCi0gICAgc3RkOjpzdHJpbmcgY293X2RldmljZV87Ci0gICAgc3RkOjpzdHJpbmcgYmFja2luZ19zdG9yZV9kZXZpY2VfOwotICAgIHN0ZDo6c3RyaW5nIGNvbnRyb2xfZGV2aWNlXzsKLSAgICBzdGQ6OnN0cmluZyBtaXNjX25hbWVfOwotCi0gICAgdW5pcXVlX2ZkIGNvd19mZF87Ci0KLSAgICB1aW50MzJfdCBleGNlcHRpb25zX3Blcl9hcmVhXzsKLSAgICB1aW50NjRfdCBudW1fc2VjdG9yc187Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q293UmVhZGVyPiByZWFkZXJfOwotCi0gICAgLy8gVmVjdG9yIG9mIGRpc2sgZXhjZXB0aW9uIHdoaWNoIGlzIGEKLSAgICAvLyBtYXBwaW5nIG9mIG9sZC1jaHVuayB0byBuZXctY2h1bmsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPj4gdmVjXzsKLQotICAgIC8vIGNodW5rX3ZlYyBzdG9yZXMgdGhlIHBzZXVkbyBtYXBwaW5nIG9mIHNlY3RvcgotICAgIC8vIHRvIENPVyBvcGVyYXRpb25zLgotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzZWN0b3JfdCwgY29uc3QgQ293T3BlcmF0aW9uKj4+IGNodW5rX3ZlY187Ci0KLSAgICBzdGQ6Om11dGV4IGxvY2tfOwotICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIGN2OwotCi0gICAgdm9pZCogbWFwcGVkX2FkZHJfOwotICAgIHNpemVfdCB0b3RhbF9tYXBwZWRfYWRkcl9sZW5ndGhfOwotCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFdvcmtlclRocmVhZD4+IHdvcmtlcl90aHJlYWRzXzsKLSAgICAvLyBSZWFkLWFoZWFkIHJlbGF0ZWQKLSAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDY0X3QsIHZvaWQqPiByZWFkX2FoZWFkX2J1ZmZlcl9tYXBfOwotICAgIHN0ZDo6dmVjdG9yPGNvbnN0IENvd09wZXJhdGlvbio+IHJlYWRfYWhlYWRfb3BzXzsKLSAgICBib29sIHBvcHVsYXRlX2RhdGFfZnJvbV9jb3dfID0gZmFsc2U7Ci0gICAgYm9vbCByZWFkX2FoZWFkX2ZlYXR1cmVfOwotICAgIHVpbnQ2NF90IGZpbmFsX2Jsb2NrX21lcmdlZF87Ci0gICAgaW50IHRvdGFsX3JhX2Jsb2Nrc19tZXJnZWRfID0gMDsKLSAgICBSRUFEX0FIRUFEX0lPX1RSQU5TSVRJT04gaW9fc3RhdGVfOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxSZWFkQWhlYWRUaHJlYWQ+IHJlYWRfYWhlYWRfdGhyZWFkXzsKLQotICAgIGJvb2wgbWVyZ2VfaW5pdGlhdGVkXyA9IGZhbHNlOwotICAgIGJvb2wgYXR0YWNoZWRfID0gZmFsc2U7Ci0gICAgYm9vbCBpc19zb2NrZXRfcHJlc2VudF87Ci19OwotCi19ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL2RtLXNuYXBzaG90LW1lcmdlL3NuYXB1c2VyZF9yZWFkYWhlYWQuY3BwIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9kbS1zbmFwc2hvdC1tZXJnZS9zbmFwdXNlcmRfcmVhZGFoZWFkLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDExMjNmOC4uMDAwMDAwMAotLS0gYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL2RtLXNuYXBzaG90LW1lcmdlL3NuYXB1c2VyZF9yZWFkYWhlYWQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAic25hcHVzZXJkLmgiCi0KLSNpbmNsdWRlIDxjc2lnbmFsPgotI2luY2x1ZGUgPG9wdGlvbmFsPgotI2luY2x1ZGUgPHNldD4KLQotI2luY2x1ZGUgPHNuYXB1c2VyZC9zbmFwdXNlcmRfY2xpZW50Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBzbmFwc2hvdCB7Ci0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmRtOwotdXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOwotCi0jZGVmaW5lIFNOQVBfTE9HKGxldmVsKSBMT0cobGV2ZWwpIDw8IG1pc2NfbmFtZV8gPDwgIjogIgotI2RlZmluZSBTTkFQX1BMT0cobGV2ZWwpIFBMT0cobGV2ZWwpIDw8IG1pc2NfbmFtZV8gPDwgIjogIgotCi0vKgotICogTWVyZ2luZyBhIGNvcHkgb3BlcmF0aW9uIGludm9sdmVzIHRoZSBmb2xsb3dpbmcgZmxvdzoKLSAqCi0gKiAxOiBkbS1zbmFwc2hvdCBsYXllciByZXF1ZXN0cyBtZXJnZSBmb3IgYSA0ayBibG9jay4gZG0tdXNlciBzZW5kcyB0aGUgcmVxdWVzdAotICogICAgdG8gdGhlIGRhZW1vbgotICogMjogZGFlbW9uIHJlYWRzIHRoZSBzb3VyY2UgYmxvY2sKLSAqIDM6IGRhZW1vbiBjb3BpZXMgdGhlIHNvdXJjZSBkYXRhCi0gKiA0OiBJTyBjb21wbGV0aW9uIHNlbnQgYmFjayB0byBkbS11c2VyIChhIHN3aXRjaCBmcm9tIHVzZXIgc3BhY2UgdG8ga2VybmVsKQotICogNTogZG0tc25hcHNob3QgbWVyZ2VzIHRoZSBkYXRhIHRvIGJhc2UgZGV2aWNlCi0gKiA2OiBkbS1zbmFwc2hvdCBzZW5kcyB0aGUgbWVyZ2UtY29tcGxldGlvbiBJTyB0byBkbS11c2VyCi0gKiA3OiBkbS11c2VyIHJlLWRpcmVjdHMgdGhlIG1lcmdlIGNvbXBsZXRpb24gSU8gdG8gZGFlbW9uIChvbmUgbW9yZSBzd2l0Y2gpCi0gKiA4OiBkYWVtb24gdXBkYXRlcyB0aGUgQ09XIGZpbGUgYWJvdXQgdGhlIGNvbXBsZXRlZCBtZXJnZSByZXF1ZXN0IChhIHdyaXRlIHN5c2NhbGwpIGFuZCBmb2xsb3dlZAotICogYnkgYSBmeXNuYy4gOTogU2VuZCB0aGUgSU8gY29tcGxldGlvbiBiYWNrIHRvIGRtLXVzZXIKLSAqCi0gKiBUaGUgYWJvdmUgc2VxdWVuY2UgaXMgYSBzaWduaWZpY2FudCBvdmVyaGVhZCBlc3BlY2lhbGx5IHdoZW4gbWVyZ2luZyBvbmUgNGsKLSAqIGJsb2NrIGF0IGEgdGltZS4KLSAqCi0gKiBSZWFkLWFoZWFkIGxheWVyIHdpbGwgb3B0aW1pemUgdGhlIGFib3ZlIHBhdGggYnkgcmVhZGluZyB0aGUgZGF0YSBmcm9tIGJhc2UKLSAqIGRldmljZSBpbiB0aGUgYmFja2dyb3VuZCBzbyB0aGF0IG1lcmdpbmcgdGhyZWFkIGNhbiByZXRyaWV2ZSB0aGUgZGF0YSBmcm9tCi0gKiB0aGUgcmVhZC1haGVhZCBjYWNoZS4gQWRkaXRpb25hbGx5LCBzeW5jaW5nIG9mIG1lcmdlZCBkYXRhIGlzIGRlZmVycmVkIHRvCi0gKiByZWFkLWFoZWFkIHRocmVhZCB0aHJlYWRieSB0aGUgSU8gcGF0aCBpcyBub3QgYm90dGxlbmVja2VkLgotICoKLSAqIFdlIGNyZWF0ZSBhIHNjcmF0Y2ggc3BhY2Ugb2YgMk1CIHRvIHN0b3JlIHRoZSByZWFkLWFoZWFkIGRhdGEgaW4gdGhlIENPVwotICogZGV2aWNlLgotICoKLSAqICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICogICAgICB8ICAgICBIZWFkZXIgKGZpeGVkKSAgICB8Ci0gKiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAqICAgICAgfCAgICBTY3JhdGNoIHNwYWNlICAgICAgfCAgPC0tIDJNQgotICogICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gKgotICogICAgICBTY3JhdGNoIHNwYWNlIGlzIGFzIGZvbGxvd3M6Ci0gKgotICogICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gKiAgICAgIHwgICAgICAgTWV0YWRhdGEgICAgICAgIHwgPC0gNGsgcGFnZQotICogICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gKiAgICAgIHwgICAgICAgTWV0YWRhdGEgICAgICAgIHwgPC0gNGsgcGFnZQotICogICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gKiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICAgICAgfCAgICBSZWFkLWFoZWFkIGRhdGEgICAgfAotICogICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAqCi0gKiBTdGF0ZSB0cmFuc2l0aW9ucyBhbmQgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHJlYWQtYWhlYWQgdGhyZWFkIGFuZCB3b3JrZXIKLSAqIHRocmVhZCBkdXJpbmcgbWVyZ2U6Ci0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiAgIFdvcmtlciBUaHJlYWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZC1BaGVhZCB0aHJlYWQKLSAqICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogICAgICB8Ci0gKiAgICAgIHwKLSAqICAtLT4gLS0tLS0tLS0tLS0tLS0tLS1SRUFEX0FIRUFEX0JFR0lOLS0tLS0tLS0tLS0tLT58Ci0gKiAgfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSRUFEX0FIRUFEX0lOX1BST0dSRVNTCi0gKiAgfCAgV0FJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogIHwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICB8ICAgfDwtLS0tLS0tLS0tLS0tLS0tLUlPX0lOX1BST0dSRVNTLS0tLS0tLS0tLS0tLS0tCi0gKiAgfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogIHwgICB8IElPX0lOX1BSR1JFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0FJVAotICogIHwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICB8PC0tfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogICAgICAtLS0tLS0tLS0tLS0tLS0tLS1JT19URVJNSU5BVEVELS0tLS0tLS0tLS0tLS0tPnwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQKLSAqCi0gKgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIEV4YW1wbGU6Ci0gKgotICogV2UgaGF2ZSA2IGNvcHkgb3BlcmF0aW9ucyB0byBiZSBleGVjdXRlZCBpbiBPVEEgYW5kIHRoZXJlIGlzIGEgb3ZlcmxhcC4gVXBkYXRlLWVuZ2luZQotICogd2lsbCB3cml0ZSB0byBDT1cgZmlsZSBhcyBmb2xsb3dzOgotICoKLSAqIE9wLTE6IDIwIC0+IDIzCi0gKiBPcC0yOiAxOSAtPiAyMgotICogT3AtMzogMTggLT4gMjEKLSAqIE9wLTQ6IDE3IC0+IDIwCi0gKiBPcC01OiAxNiAtPiAxOQotICogT3AtNjogMTUgLT4gMTgKLSAqCi0gKiBSZWFkLWFoZWFkIHRocmVhZCB3aWxsIHJlYWQgYWxsIHRoZSA2IHNvdXJjZSBibG9ja3MgYW5kIHN0b3JlIHRoZSBkYXRhIGluIHRoZQotICogc2NyYXRjaCBzcGFjZS4gTWV0YWRhdGEgd2lsbCBjb250YWluIHRoZSBkZXN0aW5hdGlvbiBibG9jayBudW1iZXJzLiBUaHVzLAotICogc2NyYXRjaCBzcGFjZSB3aWxsIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpczoKLSAqCi0gKiArLS0tLS0tLS0tLS0tLS0rCi0gKiB8IEJsb2NrICAgMjMgICB8Ci0gKiB8IG9mZnNldCAtIDEgICB8Ci0gKiArLS0tLS0tLS0tLS0tLS0rCi0gKiB8IEJsb2NrICAgMjIgICB8Ci0gKiB8IG9mZnNldCAtIDIgICB8Ci0gKiArLS0tLS0tLS0tLS0tLS0rCi0gKiB8IEJsb2NrICAgMjEgICB8Ci0gKiB8IG9mZnNldCAtIDMgICB8Ci0gKiArLS0tLS0tLS0tLS0tLS0rCi0gKiAgICAuLi4KLSAqICAgIC4uLgotICogKy0tLS0tLS0tLS0tLS0tKwotICogfCBEYXRhLUJsb2NrIDIwfCA8LS0gb2Zmc2V0IC0gMQotICogKy0tLS0tLS0tLS0tLS0tKwotICogfCBEYXRhLUJsb2NrIDE5fCA8LS0gb2Zmc2V0IC0gMgotICogKy0tLS0tLS0tLS0tLS0tKwotICogfCBEYXRhLUJsb2NrIDE4fCA8LS0gb2Zmc2V0IC0gMwotICogKy0tLS0tLS0tLS0tLS0tKwotICogICAgIC4uLgotICogICAgIC4uLgotICoKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBJTyBQYXRoOgotICoKLSAqIFJlYWQtYWhlYWQgd2lsbCBzZXJ2ZSB0aGUgZGF0YSB0byB3b3JrZXIgdGhyZWFkcyBkdXJpbmcgbWVyZ2Ugb25seQotICogYWZ0ZXIgbWV0YWRhdGEgYW5kIGRhdGEgYXJlIHBlcnNpc3RlZCB0byB0aGUgc2NyYXRjaCBzcGFjZS4gV29ya2VyCi0gKiB0aHJlYWRzIGR1cmluZyBtZXJnZSB3aWxsIGFsd2F5cyByZXRyaWV2ZSB0aGUgZGF0YSBmcm9tIGNhY2hlOyBpZiB0aGUKLSAqIGNhY2hlIGlzIG5vdCBwb3B1bGF0ZWQsIGl0IHdpbGwgd2FpdCBmb3IgdGhlIHJlYWQtYWhlYWQgdGhyZWFkIHRvIGZpbmlzaC4KLSAqIEZ1cnRoZXJtb3JlLCB0aGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgbWVyZ2VkIHdpbGwgYnkgc3luY2VkIHRvIHRoZSBoZWFkZXIKLSAqIG9ubHkgd2hlbiBhbGwgdGhlIGJsb2NrcyBpbiB0aGUgcmVhZC1haGVhZCBjYWNoZSBhcmUgbWVyZ2VkLiBJbiB0aGUgYWJvdmUKLSAqIGNhc2UsIHdoZW4gYWxsIDYgb3BlcmF0aW9ucyBhcmUgbWVyZ2VkLCBDT1cgSGVhZGVyIGlzIHVwZGF0ZWQgd2l0aAotICogbnVtX21lcmdlX29wcyA9IDYuCi0gKgotICogTWVyZ2UgcmVzdW1lIGFmdGVyIGNyYXNoOgotICoKLSAqIExldCdzIHNheSB3ZSBoYXZlIGEgY3Jhc2ggYWZ0ZXIgNSBvcGVyYXRpb25zIGFyZSBtZXJnZWQuIGkuZS4gYWZ0ZXIKLSAqIE9wLTU6IDE2LT4xOSBpcyBjb21wbGV0ZWQgYnV0IGJlZm9yZSB0aGUgT3AtNiBpcyBtZXJnZWQuIFRodXMsIENPVyBIZWFkZXIKLSAqIG51bV9tZXJnZV9vcHMgd2lsbCBiZSAwIGFzIHRoZSBhbGwgdGhlIG9wcyB3ZXJlIG5vdCBtZXJnZWQgeWV0LiBEdXJpbmcgbmV4dAotICogcmVib290LCByZWFkLWFoZWFkIHRocmVhZCB3aWxsIHJlLWNvbnN0cnVjdCB0aGUgZGF0YSBpbi1tZW1vcnkgZnJvbSB0aGUKLSAqIHNjcmF0Y2ggc3BhY2U7IHdoZW4gbWVyZ2UgcmVzdW1lcywgT3AtMSB3aWxsIGJlIHJlLWV4ZWN0dWVkLiBIb3dldmVyLAotICogZGF0YSB3aWxsIGJlIHNlcnZlZCBmcm9tIHJlYWQtYWhlYWQgY2FjaGUgc2FmZWx5IGV2ZW4gdGhvdWdoLCBibG9jayAyMAotICogd2FzIG92ZXItd3JpdHRlbiBieSBPcC00LgotICoKLSAqLwotCi1SZWFkQWhlYWRUaHJlYWQ6OlJlYWRBaGVhZFRocmVhZChjb25zdCBzdGQ6OnN0cmluZyYgY293X2RldmljZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGJhY2tpbmdfZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTbmFwdXNlcmQ+IHNuYXB1c2VyZCkgewotICAgIGNvd19kZXZpY2VfID0gY293X2RldmljZTsKLSAgICBiYWNraW5nX3N0b3JlX2RldmljZV8gPSBiYWNraW5nX2RldmljZTsKLSAgICBtaXNjX25hbWVfID0gbWlzY19uYW1lOwotICAgIHNuYXB1c2VyZF8gPSBzbmFwdXNlcmQ7Ci19Ci0KLXZvaWQgUmVhZEFoZWFkVGhyZWFkOjpDaGVja092ZXJsYXAoY29uc3QgQ293T3BlcmF0aW9uKiBjb3dfb3ApIHsKLSAgICB1aW50NjRfdCBzb3VyY2VfYmxvY2sgPSBjb3dfb3AtPnNvdXJjZTsKLSAgICB1aW50NjRfdCBzb3VyY2Vfb2Zmc2V0ID0gMDsKLSAgICBpZiAoZGVzdF9ibG9ja3NfLmNvdW50KGNvd19vcC0+bmV3X2Jsb2NrKSB8fCBzb3VyY2VfYmxvY2tzXy5jb3VudChzb3VyY2VfYmxvY2spIHx8Ci0gICAgICAgIChzb3VyY2Vfb2Zmc2V0ID4gMCAmJiBzb3VyY2VfYmxvY2tzXy5jb3VudChzb3VyY2VfYmxvY2sgKyAxKSkpIHsKLSAgICAgICAgb3ZlcmxhcF8gPSB0cnVlOwotICAgIH0KLQotICAgIGRlc3RfYmxvY2tzXy5pbnNlcnQoc291cmNlX2Jsb2NrKTsKLSAgICBpZiAoc291cmNlX29mZnNldCA+IDApIHsKLSAgICAgICAgZGVzdF9ibG9ja3NfLmluc2VydChzb3VyY2VfYmxvY2sgKyAxKTsKLSAgICB9Ci0gICAgc291cmNlX2Jsb2Nrc18uaW5zZXJ0KGNvd19vcC0+bmV3X2Jsb2NrKTsKLX0KLQotdm9pZCBSZWFkQWhlYWRUaHJlYWQ6OlByZXBhcmVSZWFkQWhlYWQodWludDY0X3QqIHNvdXJjZV9vZmZzZXQsIGludCogcGVuZGluZ19vcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4mIGJsb2NrcykgewotICAgIGludCBudW1fb3BzID0gKnBlbmRpbmdfb3BzOwotICAgIGludCBucl9jb25zZWN1dGl2ZSA9IDA7Ci0gICAgQ0hFQ0tfTkUoc291cmNlX29mZnNldCwgbnVsbHB0cik7Ci0KLSAgICBpZiAoIVJBSXRlckRvbmUoKSAmJiBudW1fb3BzKSB7Ci0gICAgICAgIC8vIEdldCB0aGUgZmlyc3QgYmxvY2sgd2l0aCBvZmZzZXQKLSAgICAgICAgY29uc3QgQ293T3BlcmF0aW9uKiBjb3dfb3AgPSBHZXRSQU9wSXRlcigpOwotICAgICAgICBDSEVDS19ORShjb3dfb3AsIG51bGxwdHIpOwotICAgICAgICAqc291cmNlX29mZnNldCA9IGNvd19vcC0+c291cmNlOwotICAgICAgICBpZiAoY293X29wLT50eXBlID09IGtDb3dDb3B5T3ApIHsKLSAgICAgICAgICAgICpzb3VyY2Vfb2Zmc2V0ICo9IEJMT0NLX1NaOwotICAgICAgICB9Ci0gICAgICAgIFJBSXRlck5leHQoKTsKLSAgICAgICAgbnVtX29wcyAtPSAxOwotICAgICAgICBucl9jb25zZWN1dGl2ZSA9IDE7Ci0gICAgICAgIGJsb2Nrcy5wdXNoX2JhY2soY293X29wLT5uZXdfYmxvY2spOwotCi0gICAgICAgIGlmICghb3ZlcmxhcF8pIHsKLSAgICAgICAgICAgIENoZWNrT3ZlcmxhcChjb3dfb3ApOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogRmluZCBudW1iZXIgb2YgY29uc2VjdXRpdmUgYmxvY2tzIHdvcmtpbmcgYmFja3dhcmRzLgotICAgICAgICAgKi8KLSAgICAgICAgd2hpbGUgKCFSQUl0ZXJEb25lKCkgJiYgbnVtX29wcykgewotICAgICAgICAgICAgY29uc3QgQ293T3BlcmF0aW9uKiBvcCA9IEdldFJBT3BJdGVyKCk7Ci0gICAgICAgICAgICBDSEVDS19ORShvcCwgbnVsbHB0cik7Ci0gICAgICAgICAgICB1aW50NjRfdCBuZXh0X29mZnNldCA9IG9wLT5zb3VyY2U7Ci0gICAgICAgICAgICBpZiAob3AtPnR5cGUgPT0ga0Nvd0NvcHlPcCkgewotICAgICAgICAgICAgICAgIG5leHRfb2Zmc2V0ICo9IEJMT0NLX1NaOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG5leHRfb2Zmc2V0ICsgbnJfY29uc2VjdXRpdmUgKiBCTE9DS19TWiAhPSAqc291cmNlX29mZnNldCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbnJfY29uc2VjdXRpdmUgKz0gMTsKLSAgICAgICAgICAgIG51bV9vcHMgLT0gMTsKLSAgICAgICAgICAgIGJsb2Nrcy5wdXNoX2JhY2sob3AtPm5ld19ibG9jayk7Ci0gICAgICAgICAgICBSQUl0ZXJOZXh0KCk7Ci0KLSAgICAgICAgICAgIGlmICghb3ZlcmxhcF8pIHsKLSAgICAgICAgICAgICAgICBDaGVja092ZXJsYXAob3ApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi1ib29sIFJlYWRBaGVhZFRocmVhZDo6UmVjb25zdHJ1Y3REYXRhRnJvbUNvdygpIHsKLSAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDY0X3QsIHZvaWQqPiYgcmVhZF9haGVhZF9idWZmZXJfbWFwID0gc25hcHVzZXJkXy0+R2V0UmVhZEFoZWFkTWFwKCk7Ci0gICAgcmVhZF9haGVhZF9idWZmZXJfbWFwLmNsZWFyKCk7Ci0gICAgbG9mZl90IG1ldGFkYXRhX29mZnNldCA9IDA7Ci0gICAgbG9mZl90IHN0YXJ0X2RhdGFfb2Zmc2V0ID0gc25hcHVzZXJkXy0+R2V0QnVmZmVyRGF0YU9mZnNldCgpOwotICAgIGludCBudW1fb3BzID0gMDsKLSAgICBpbnQgdG90YWxfYmxvY2tzX21lcmdlZCA9IDA7Ci0KLSAgICAvLyBUaGlzIG1lbWNweSBpcyBpbXBvcnRhbnQgYXMgbWV0YWRhdGFfYnVmZmVyXyB3aWxsIGJlIGFuIHVuYWxpZ25lZCBhZGRyZXNzIGFuZCB3aWxsIGZhdWx0Ci0gICAgLy8gb24gMzItYml0IHN5c3RlbXMKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBtZXRhZGF0YV9idWZmZXIgPQotICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KHNuYXB1c2VyZF8tPkdldEJ1ZmZlck1ldGFkYXRhU2l6ZSgpKTsKLSAgICBtZW1jcHkobWV0YWRhdGFfYnVmZmVyLmdldCgpLCBtZXRhZGF0YV9idWZmZXJfLCBzbmFwdXNlcmRfLT5HZXRCdWZmZXJNZXRhZGF0YVNpemUoKSk7Ci0KLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzdHJ1Y3QgU2NyYXRjaE1ldGFkYXRhKiBibSA9IHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IFNjcmF0Y2hNZXRhZGF0YSo+KAotICAgICAgICAgICAgICAgIChjaGFyKiltZXRhZGF0YV9idWZmZXIuZ2V0KCkgKyBtZXRhZGF0YV9vZmZzZXQpOwotCi0gICAgICAgIC8vIERvbmUgcmVhZGluZyBtZXRhZGF0YQotICAgICAgICBpZiAoYm0tPm5ld19ibG9jayA9PSAwICYmIGJtLT5maWxlX29mZnNldCA9PSAwKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGxvZmZfdCBidWZmZXJfb2Zmc2V0ID0gYm0tPmZpbGVfb2Zmc2V0IC0gc3RhcnRfZGF0YV9vZmZzZXQ7Ci0gICAgICAgIHZvaWQqIGJ1ZnB0ciA9IHN0YXRpY19jYXN0PHZvaWQqPigoY2hhciopcmVhZF9haGVhZF9idWZmZXJfICsgYnVmZmVyX29mZnNldCk7Ci0gICAgICAgIHJlYWRfYWhlYWRfYnVmZmVyX21hcFtibS0+bmV3X2Jsb2NrXSA9IGJ1ZnB0cjsKLSAgICAgICAgbnVtX29wcyArPSAxOwotICAgICAgICB0b3RhbF9ibG9ja3NfbWVyZ2VkICs9IDE7Ci0KLSAgICAgICAgbWV0YWRhdGFfb2Zmc2V0ICs9IHNpemVvZihzdHJ1Y3QgU2NyYXRjaE1ldGFkYXRhKTsKLSAgICB9Ci0KLSAgICAvLyBXZSBhcmUgZG9uZSByZS1jb25zdHJ1Y3RpbmcgdGhlIG1hcHBpbmc7IGhvd2V2ZXIsIHdlIG5lZWQgdG8gbWFrZSBzdXJlCi0gICAgLy8gYWxsIHRoZSBDT1cgb3BlcmF0aW9ucyB0by1iZSBtZXJnZWQgYXJlIHByZXNlbnQgaW4gdGhlIHJlLWNvbnN0cnVjdGVkCi0gICAgLy8gbWFwcGluZy4KLSAgICB3aGlsZSAoIVJBSXRlckRvbmUoKSkgewotICAgICAgICBjb25zdCBDb3dPcGVyYXRpb24qIG9wID0gR2V0UkFPcEl0ZXIoKTsKLSAgICAgICAgaWYgKHJlYWRfYWhlYWRfYnVmZmVyX21hcC5maW5kKG9wLT5uZXdfYmxvY2spICE9IHJlYWRfYWhlYWRfYnVmZmVyX21hcC5lbmQoKSkgewotICAgICAgICAgICAgbnVtX29wcyAtPSAxOwotICAgICAgICAgICAgc25hcHVzZXJkXy0+U2V0RmluYWxCbG9ja01lcmdlZChvcC0+bmV3X2Jsb2NrKTsKLSAgICAgICAgICAgIFJBSXRlck5leHQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IHdlIGhhdmUgY292ZXJlZCBhbGwgdGhlIG9wcyB3aGljaCB3ZXJlIHJlLWNvbnN0cnVjdGVkCi0gICAgICAgICAgICAvLyBmcm9tIENPVyBkZXZpY2UgLSBUaGVzZSBhcmUgdGhlIG9wcyB3aGljaCBhcmUgYmVpbmcKLSAgICAgICAgICAgIC8vIHJlLWNvbnN0cnVjdGVkIGFmdGVyIGNyYXNoLgotICAgICAgICAgICAgaWYgKCEobnVtX29wcyA9PSAwKSkgewotICAgICAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUmVjb25zdHJ1Y3REYXRhRnJvbUNvdyBmYWlsZWQuIE5vdCBhbGwgb3BzIHJlY292ZXJkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBQZW5kaW5nIG9wczogIiA8PCBudW1fb3BzOwotICAgICAgICAgICAgICAgIHNuYXB1c2VyZF8tPlJlYWRBaGVhZElPRmFpbGVkKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzbmFwdXNlcmRfLT5TZXRUb3RhbFJhQmxvY2tzTWVyZ2VkKHRvdGFsX2Jsb2Nrc19tZXJnZWQpOwotCi0gICAgc25hcHVzZXJkXy0+UmVjb25zdHJ1Y3REYXRhRnJvbUNvd0ZpbmlzaCgpOwotCi0gICAgaWYgKCFzbmFwdXNlcmRfLT5SZWFkQWhlYWRJT0NvbXBsZXRlZCh0cnVlKSkgewotICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlJlYWRBaGVhZElPQ29tcGxldGVkIGZhaWxlZC4uLiI7Ci0gICAgICAgIHNuYXB1c2VyZF8tPlJlYWRBaGVhZElPRmFpbGVkKCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBTTkFQX0xPRyhJTkZPKSA8PCAiUmVjb25zdHJ1Y3REYXRhRnJvbUNvdyBzdWNjZXNzIjsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBSZWFkQWhlYWRUaHJlYWQ6OlJlYWRBaGVhZElPU3RhcnQoKSB7Ci0gICAgLy8gQ2hlY2sgaWYgdGhlIGRhdGEgaGFzIHRvIGJlIGNvbnN0cnVjdGVkIGZyb20gdGhlIENPVyBmaWxlLgotICAgIC8vIFRoaXMgd2lsbCBiZSB0cnVlIG9ubHkgb25jZSBkdXJpbmcgYm9vdCB1cCBhZnRlciBhIGNyYXNoCi0gICAgLy8gZHVyaW5nIG1lcmdlLgotICAgIGlmIChzbmFwdXNlcmRfLT5SZWNvbnN0cnVjdERhdGFGcm9tQ293KCkpIHsKLSAgICAgICAgcmV0dXJuIFJlY29uc3RydWN0RGF0YUZyb21Db3coKTsKLSAgICB9Ci0KLSAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDY0X3QsIHZvaWQqPiYgcmVhZF9haGVhZF9idWZmZXJfbWFwID0gc25hcHVzZXJkXy0+R2V0UmVhZEFoZWFkTWFwKCk7Ci0gICAgcmVhZF9haGVhZF9idWZmZXJfbWFwLmNsZWFyKCk7Ci0KLSAgICBpbnQgbnVtX29wcyA9IChzbmFwdXNlcmRfLT5HZXRCdWZmZXJEYXRhU2l6ZSgpKSAvIEJMT0NLX1NaOwotICAgIGxvZmZfdCBtZXRhZGF0YV9vZmZzZXQgPSAwOwotCi0gICAgc3RydWN0IFNjcmF0Y2hNZXRhZGF0YSogYm0gPQotICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3QgU2NyYXRjaE1ldGFkYXRhKj4oKGNoYXIqKW1ldGFkYXRhX2J1ZmZlcl8gKyBtZXRhZGF0YV9vZmZzZXQpOwotCi0gICAgYm0tPm5ld19ibG9jayA9IDA7Ci0gICAgYm0tPmZpbGVfb2Zmc2V0ID0gMDsKLQotICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBibG9ja3M7Ci0KLSAgICBsb2ZmX3QgYnVmZmVyX29mZnNldCA9IDA7Ci0gICAgbG9mZl90IG9mZnNldCA9IDA7Ci0gICAgbG9mZl90IGZpbGVfb2Zmc2V0ID0gc25hcHVzZXJkXy0+R2V0QnVmZmVyRGF0YU9mZnNldCgpOwotICAgIGludCB0b3RhbF9ibG9ja3NfbWVyZ2VkID0gMDsKLSAgICBvdmVybGFwXyA9IGZhbHNlOwotICAgIGRlc3RfYmxvY2tzXy5jbGVhcigpOwotICAgIHNvdXJjZV9ibG9ja3NfLmNsZWFyKCk7Ci0KLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICB1aW50NjRfdCBzb3VyY2Vfb2Zmc2V0OwotICAgICAgICBpbnQgbGluZWFyX2Jsb2NrczsKLQotICAgICAgICBQcmVwYXJlUmVhZEFoZWFkKCZzb3VyY2Vfb2Zmc2V0LCAmbnVtX29wcywgYmxvY2tzKTsKLSAgICAgICAgbGluZWFyX2Jsb2NrcyA9IGJsb2Nrcy5zaXplKCk7Ci0gICAgICAgIGlmIChsaW5lYXJfYmxvY2tzID09IDApIHsKLSAgICAgICAgICAgIC8vIE5vIG1vcmUgYmxvY2tzIHRvIHJlYWQKLSAgICAgICAgICAgIFNOQVBfTE9HKERFQlVHKSA8PCAiIFJlYWQtYWhlYWQgY29tcGxldGVkLi4uLiI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdldCB0aGUgZmlyc3QgYmxvY2sgaW4gdGhlIGNvbnNlY3V0aXZlIHNldCBvZiBibG9ja3MKLSAgICAgICAgc291cmNlX29mZnNldCA9IHNvdXJjZV9vZmZzZXQgLSAobGluZWFyX2Jsb2NrcyAtIDEpICogQkxPQ0tfU1o7Ci0gICAgICAgIHNpemVfdCBpb19zaXplID0gKGxpbmVhcl9ibG9ja3MgKiBCTE9DS19TWik7Ci0gICAgICAgIG51bV9vcHMgLT0gbGluZWFyX2Jsb2NrczsKLSAgICAgICAgdG90YWxfYmxvY2tzX21lcmdlZCArPSBsaW5lYXJfYmxvY2tzOwotCi0gICAgICAgIC8vIE1hcmsgdGhlIGJsb2NrIG51bWJlciBhcyB0aGUgb25lIHdoaWNoIHdpbGwKLSAgICAgICAgLy8gYmUgdGhlIGZpbmFsIGJsb2NrIHRvIGJlIG1lcmdlZCBpbiB0aGlzIGVudGlyZSByZWdpb24uCi0gICAgICAgIC8vIFJlYWQtYWhlYWQgdGhyZWFkIHdpbGwgZ2V0Ci0gICAgICAgIC8vIG5vdGlmaWVkIHdoZW4gdGhpcyBibG9jayBpcyBtZXJnZWQgdG8gbWFrZQotICAgICAgICAvLyBmb3J3YXJkIHByb2dyZXNzCi0gICAgICAgIHNuYXB1c2VyZF8tPlNldEZpbmFsQmxvY2tNZXJnZWQoYmxvY2tzLmJhY2soKSk7Ci0KLSAgICAgICAgd2hpbGUgKGxpbmVhcl9ibG9ja3MpIHsKLSAgICAgICAgICAgIHVpbnQ2NF90IG5ld19ibG9jayA9IGJsb2Nrcy5iYWNrKCk7Ci0gICAgICAgICAgICBibG9ja3MucG9wX2JhY2soKTsKLSAgICAgICAgICAgIC8vIEFzc2lnbiB0aGUgbWFwcGluZwotICAgICAgICAgICAgdm9pZCogYnVmcHRyID0gc3RhdGljX2Nhc3Q8dm9pZCo+KChjaGFyKilyZWFkX2FoZWFkX2J1ZmZlcl8gKyBvZmZzZXQpOwotICAgICAgICAgICAgcmVhZF9haGVhZF9idWZmZXJfbWFwW25ld19ibG9ja10gPSBidWZwdHI7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gQkxPQ0tfU1o7Ci0KLSAgICAgICAgICAgIGJtID0gcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3QgU2NyYXRjaE1ldGFkYXRhKj4oKGNoYXIqKW1ldGFkYXRhX2J1ZmZlcl8gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YV9vZmZzZXQpOwotICAgICAgICAgICAgYm0tPm5ld19ibG9jayA9IG5ld19ibG9jazsKLSAgICAgICAgICAgIGJtLT5maWxlX29mZnNldCA9IGZpbGVfb2Zmc2V0OwotCi0gICAgICAgICAgICBtZXRhZGF0YV9vZmZzZXQgKz0gc2l6ZW9mKHN0cnVjdCBTY3JhdGNoTWV0YWRhdGEpOwotICAgICAgICAgICAgZmlsZV9vZmZzZXQgKz0gQkxPQ0tfU1o7Ci0KLSAgICAgICAgICAgIGxpbmVhcl9ibG9ja3MgLT0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlYWQgZnJvbSB0aGUgYmFzZSBkZXZpY2UgY29uc2VjdXRpdmUgc2V0IG9mIGJsb2NrcyBpbiBvbmUgc2hvdAotICAgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseUF0T2Zmc2V0KGJhY2tpbmdfc3RvcmVfZmRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKilyZWFkX2FoZWFkX2J1ZmZlcl8gKyBidWZmZXJfb2Zmc2V0LCBpb19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9vZmZzZXQpKSB7Ci0gICAgICAgICAgICBTTkFQX1BMT0coRVJST1IpIDw8ICJPcmRlcmVkLW9wIGZhaWxlZC4gUmVhZCBmcm9tIGJhY2tpbmcgc3RvcmU6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgYmFja2luZ19zdG9yZV9kZXZpY2VfIDw8ICJhdCBibG9jayA6IiA8PCBzb3VyY2Vfb2Zmc2V0IC8gQkxPQ0tfU1oKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBvZmZzZXQgOiIgPDwgc291cmNlX29mZnNldCAlIEJMT0NLX1NaCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgYnVmZmVyX29mZnNldCA6ICIgPDwgYnVmZmVyX29mZnNldCA8PCAiIGlvX3NpemUgOiAiIDw8IGlvX3NpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBidWYtYWRkciA6ICIgPDwgcmVhZF9haGVhZF9idWZmZXJfOwotCi0gICAgICAgICAgICBzbmFwdXNlcmRfLT5SZWFkQWhlYWRJT0ZhaWxlZCgpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhpcyBpcyBpbXBvcnRhbnQgLSBleHBsaWNpdGx5IHNldCB0aGUgY29udGVudHMgdG8gemVyby4gVGhpcyBpcyB1c2VkCi0gICAgICAgIC8vIHdoZW4gcmUtY29uc3RydWN0aW5nIHRoZSBkYXRhIGFmdGVyIGNyYXNoLiBUaGlzIGluZGljYXRlcyBlbmQgb2YKLSAgICAgICAgLy8gcmVhZGluZyBtZXRhZGF0YSBjb250ZW50cyB3aGVuIHJlLWNvbnN0cnVjdGluZyB0aGUgZGF0YQotICAgICAgICBibSA9IHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IFNjcmF0Y2hNZXRhZGF0YSo+KChjaGFyKiltZXRhZGF0YV9idWZmZXJfICsgbWV0YWRhdGFfb2Zmc2V0KTsKLSAgICAgICAgYm0tPm5ld19ibG9jayA9IDA7Ci0gICAgICAgIGJtLT5maWxlX29mZnNldCA9IDA7Ci0KLSAgICAgICAgYnVmZmVyX29mZnNldCArPSBpb19zaXplOwotICAgIH0KLQotICAgIHNuYXB1c2VyZF8tPlNldFRvdGFsUmFCbG9ja3NNZXJnZWQodG90YWxfYmxvY2tzX21lcmdlZCk7Ci0KLSAgICAvLyBGbHVzaCB0aGUgZGF0YSBvbmx5IGlmIHdlIGhhdmUgYSBvdmVybGFwcGluZyBibG9ja3MgaW4gdGhlIHJlZ2lvbgotICAgIGlmICghc25hcHVzZXJkXy0+UmVhZEFoZWFkSU9Db21wbGV0ZWQob3ZlcmxhcF8pKSB7Ci0gICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUmVhZEFoZWFkSU9Db21wbGV0ZWQgZmFpbGVkLi4uIjsKLSAgICAgICAgc25hcHVzZXJkXy0+UmVhZEFoZWFkSU9GYWlsZWQoKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFJlYWRBaGVhZFRocmVhZDo6UnVuVGhyZWFkKCkgewotICAgIGlmICghSW5pdGlhbGl6ZUZkcygpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBJbml0aWFsaXplUkFJdGVyKCk7Ci0gICAgSW5pdGlhbGl6ZUJ1ZmZlcigpOwotCi0gICAgd2hpbGUgKCFSQUl0ZXJEb25lKCkpIHsKLSAgICAgICAgaWYgKCFSZWFkQWhlYWRJT1N0YXJ0KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2wgc3RhdHVzID0gc25hcHVzZXJkXy0+V2FpdEZvck1lcmdlVG9Db21wbGV0ZSgpOwotCi0gICAgICAgIGlmIChzdGF0dXMgJiYgIXNuYXB1c2VyZF8tPkNvbW1pdE1lcmdlKHNuYXB1c2VyZF8tPkdldFRvdGFsUmFCbG9ja3NNZXJnZWQoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghc3RhdHVzKSBicmVhazsKLSAgICB9Ci0KLSAgICBDbG9zZUZkcygpOwotICAgIFNOQVBfTE9HKElORk8pIDw8ICIgUmVhZEFoZWFkIHRocmVhZCB0ZXJtaW5hdGluZy4uLi4iOwotICAgIHJldHVybiB0cnVlOwotfQotCi0vLyBJbml0aWFsaXphdGlvbgotYm9vbCBSZWFkQWhlYWRUaHJlYWQ6OkluaXRpYWxpemVGZHMoKSB7Ci0gICAgYmFja2luZ19zdG9yZV9mZF8ucmVzZXQob3BlbihiYWNraW5nX3N0b3JlX2RldmljZV8uY19zdHIoKSwgT19SRE9OTFkpKTsKLSAgICBpZiAoYmFja2luZ19zdG9yZV9mZF8gPCAwKSB7Ci0gICAgICAgIFNOQVBfUExPRyhFUlJPUikgPDwgIk9wZW4gRmFpbGVkOiAiIDw8IGJhY2tpbmdfc3RvcmVfZGV2aWNlXzsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGNvd19mZF8ucmVzZXQob3Blbihjb3dfZGV2aWNlXy5jX3N0cigpLCBPX1JEV1IpKTsKLSAgICBpZiAoY293X2ZkXyA8IDApIHsKLSAgICAgICAgU05BUF9QTE9HKEVSUk9SKSA8PCAiT3BlbiBGYWlsZWQ6ICIgPDwgY293X2RldmljZV87Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBSZWFkQWhlYWRUaHJlYWQ6OkluaXRpYWxpemVSQUl0ZXIoKSB7Ci0gICAgc3RkOjp2ZWN0b3I8Y29uc3QgQ293T3BlcmF0aW9uKj4mIHJlYWRfYWhlYWRfb3BzID0gc25hcHVzZXJkXy0+R2V0UmVhZEFoZWFkT3BzVmVjKCk7Ci0gICAgcmVhZF9haGVhZF9pdGVyXyA9IHJlYWRfYWhlYWRfb3BzLnJiZWdpbigpOwotfQotCi1ib29sIFJlYWRBaGVhZFRocmVhZDo6UkFJdGVyRG9uZSgpIHsKLSAgICBzdGQ6OnZlY3Rvcjxjb25zdCBDb3dPcGVyYXRpb24qPiYgcmVhZF9haGVhZF9vcHMgPSBzbmFwdXNlcmRfLT5HZXRSZWFkQWhlYWRPcHNWZWMoKTsKLSAgICByZXR1cm4gcmVhZF9haGVhZF9pdGVyXyA9PSByZWFkX2FoZWFkX29wcy5yZW5kKCk7Ci19Ci0KLXZvaWQgUmVhZEFoZWFkVGhyZWFkOjpSQUl0ZXJOZXh0KCkgewotICAgIHJlYWRfYWhlYWRfaXRlcl8rKzsKLX0KLQotY29uc3QgQ293T3BlcmF0aW9uKiBSZWFkQWhlYWRUaHJlYWQ6OkdldFJBT3BJdGVyKCkgewotICAgIHJldHVybiAqcmVhZF9haGVhZF9pdGVyXzsKLX0KLQotdm9pZCBSZWFkQWhlYWRUaHJlYWQ6OkluaXRpYWxpemVCdWZmZXIoKSB7Ci0gICAgdm9pZCogbWFwcGVkX2FkZHIgPSBzbmFwdXNlcmRfLT5HZXRNYXBwZWRBZGRyKCk7Ci0gICAgLy8gTWFwIHRoZSBzY3JhdGNoIHNwYWNlIHJlZ2lvbiBpbnRvIG1lbW9yeQotICAgIG1ldGFkYXRhX2J1ZmZlcl8gPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dm9pZCo+KChjaGFyKiltYXBwZWRfYWRkciArIHNuYXB1c2VyZF8tPkdldEJ1ZmZlck1ldGFkYXRhT2Zmc2V0KCkpOwotICAgIHJlYWRfYWhlYWRfYnVmZmVyXyA9IHN0YXRpY19jYXN0PHZvaWQqPigoY2hhciopbWFwcGVkX2FkZHIgKyBzbmFwdXNlcmRfLT5HZXRCdWZmZXJEYXRhT2Zmc2V0KCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL2RtLXNuYXBzaG90LW1lcmdlL3NuYXB1c2VyZF9zZXJ2ZXIuY3BwIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9kbS1zbmFwc2hvdC1tZXJnZS9zbmFwdXNlcmRfc2VydmVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc3YjA5ZC4uMDAwMDAwMAotLS0gYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL2RtLXNuYXBzaG90LW1lcmdlL3NuYXB1c2VyZF9zZXJ2ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3NvY2tldHMuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9jbXNnLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zY29wZWd1YXJkLmg+Ci0jaW5jbHVkZSA8ZnNfbWdyL2ZpbGVfd2FpdC5oPgotI2luY2x1ZGUgPHNuYXB1c2VyZC9zbmFwdXNlcmRfY2xpZW50Lmg+Ci0KLSNpbmNsdWRlICJzbmFwdXNlcmRfc2VydmVyLmgiCi0KLSNkZWZpbmUgX1JFQUxMWV9JTkNMVURFX1NZU19fU1lTVEVNX1BST1BFUlRJRVNfSF8KLSNpbmNsdWRlIDxzeXMvX3N5c3RlbV9wcm9wZXJ0aWVzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBzbmFwc2hvdCB7Ci0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ6OnN0cmluZ19saXRlcmFsczsKLQotdXNpbmcgYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQ7Ci11c2luZyBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQ7Ci0KLURhZW1vbk9wZXJhdGlvbnMgU25hcHVzZXJkU2VydmVyOjpSZXNvbHZlb3Aoc3RkOjpzdHJpbmcmIGlucHV0KSB7Ci0gICAgaWYgKGlucHV0ID09ICJpbml0IikgcmV0dXJuIERhZW1vbk9wZXJhdGlvbnM6OklOSVQ7Ci0gICAgaWYgKGlucHV0ID09ICJzdGFydCIpIHJldHVybiBEYWVtb25PcGVyYXRpb25zOjpTVEFSVDsKLSAgICBpZiAoaW5wdXQgPT0gInN0b3AiKSByZXR1cm4gRGFlbW9uT3BlcmF0aW9uczo6U1RPUDsKLSAgICBpZiAoaW5wdXQgPT0gInF1ZXJ5IikgcmV0dXJuIERhZW1vbk9wZXJhdGlvbnM6OlFVRVJZOwotICAgIGlmIChpbnB1dCA9PSAiZGVsZXRlIikgcmV0dXJuIERhZW1vbk9wZXJhdGlvbnM6OkRFTEVURTsKLSAgICBpZiAoaW5wdXQgPT0gImRldGFjaCIpIHJldHVybiBEYWVtb25PcGVyYXRpb25zOjpERVRBQ0g7Ci0gICAgaWYgKGlucHV0ID09ICJzdXBwb3J0cyIpIHJldHVybiBEYWVtb25PcGVyYXRpb25zOjpTVVBQT1JUUzsKLQotICAgIHJldHVybiBEYWVtb25PcGVyYXRpb25zOjpJTlZBTElEOwotfQotCi1TbmFwdXNlcmRTZXJ2ZXI6On5TbmFwdXNlcmRTZXJ2ZXIoKSB7Ci0gICAgLy8gQ2xvc2UgYW55IGNsaWVudCBzb2NrZXRzIHRoYXQgd2VyZSBhZGRlZCB2aWEgQWNjZXB0Q2xpZW50KCkuCi0gICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCB3YXRjaGVkX2Zkc18uc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgY2xvc2Uod2F0Y2hlZF9mZHNfW2ldLmZkKTsKLSAgICB9Ci19Ci0KLXN0ZDo6c3RyaW5nIFNuYXB1c2VyZFNlcnZlcjo6R2V0RGFlbW9uU3RhdHVzKCkgewotICAgIHN0ZDo6c3RyaW5nIG1zZyA9ICIiOwotCi0gICAgaWYgKElzVGVybWluYXRpbmcoKSkKLSAgICAgICAgbXNnID0gInBhc3NpdmUiOwotICAgIGVsc2UKLSAgICAgICAgbXNnID0gImFjdGl2ZSI7Ci0KLSAgICByZXR1cm4gbXNnOwotfQotCi12b2lkIFNuYXB1c2VyZFNlcnZlcjo6UGFyc2Vtc2coc3RkOjpzdHJpbmcgY29uc3QmIG1zZywgY29uc3QgY2hhciBkZWxpbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIG91dCkgewotICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzKG1zZyk7Ci0gICAgc3RkOjpzdHJpbmcgczsKLQotICAgIHdoaWxlIChzdGQ6OmdldGxpbmUoc3MsIHMsIGRlbGltKSkgewotICAgICAgICBvdXQucHVzaF9iYWNrKHMpOwotICAgIH0KLX0KLQotdm9pZCBTbmFwdXNlcmRTZXJ2ZXI6OlNodXRkb3duVGhyZWFkcygpIHsKLSAgICBTdG9wVGhyZWFkcygpOwotICAgIEpvaW5BbGxUaHJlYWRzKCk7Ci19Ci0KLURtVXNlckhhbmRsZXI6OkRtVXNlckhhbmRsZXIoc3RkOjpzaGFyZWRfcHRyPFNuYXB1c2VyZD4gc25hcHVzZXJkKQotICAgIDogc25hcHVzZXJkXyhzbmFwdXNlcmQpLCBtaXNjX25hbWVfKHNuYXB1c2VyZF8tPkdldE1pc2NOYW1lKCkpIHt9Ci0KLWJvb2wgU25hcHVzZXJkU2VydmVyOjpTZW5kbXNnKGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIGZkLCBjb25zdCBzdGQ6OnN0cmluZyYgbXNnKSB7Ci0gICAgc3NpemVfdCByZXQgPSBURU1QX0ZBSUxVUkVfUkVUUlkoc2VuZChmZC5nZXQoKSwgbXNnLmRhdGEoKSwgbXNnLnNpemUoKSwgTVNHX05PU0lHTkFMKSk7Ci0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgIlNuYXB1c2VyZDpzZXJ2ZXI6IHNlbmQoKSBmYWlsZWQiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKHJldCA8IG1zZy5zaXplKCkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiUGFydGlhbCBzZW5kOyBleHBlY3RlZCAiIDw8IG1zZy5zaXplKCkgPDwgIiBieXRlcywgc2VudCAiIDw8IHJldDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBTbmFwdXNlcmRTZXJ2ZXI6OlJlY3YoYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgZmQsIHN0ZDo6c3RyaW5nKiBkYXRhKSB7Ci0gICAgY2hhciBtc2dbTUFYX1BBQ0tFVF9TSVpFXTsKLSAgICBzc2l6ZV90IHJ2ID0gVEVNUF9GQUlMVVJFX1JFVFJZKHJlY3YoZmQuZ2V0KCksIG1zZywgc2l6ZW9mKG1zZyksIDApKTsKLSAgICBpZiAocnYgPCAwKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJyZWN2IGZhaWxlZCI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgKmRhdGEgPSBzdGQ6OnN0cmluZyhtc2csIHJ2KTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBTbmFwdXNlcmRTZXJ2ZXI6OlJlY2VpdmVtc2coYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgZmQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgICBjb25zdCBjaGFyIGRlbGltID0gJywnOwotCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG91dDsKLSAgICBQYXJzZW1zZyhzdHIsIGRlbGltLCBvdXQpOwotICAgIERhZW1vbk9wZXJhdGlvbnMgb3AgPSBSZXNvbHZlb3Aob3V0WzBdKTsKLQotICAgIHN3aXRjaCAob3ApIHsKLSAgICAgICAgY2FzZSBEYWVtb25PcGVyYXRpb25zOjpJTklUOiB7Ci0gICAgICAgICAgICAvLyBNZXNzYWdlIGZvcm1hdDoKLSAgICAgICAgICAgIC8vIGluaXQsPG1pc2NfbmFtZT4sPGNvd19kZXZpY2VfcGF0aD4sPGJhY2tpbmdfZGV2aWNlPgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIFJlYWRzIHRoZSBtZXRhZGF0YSBhbmQgc2VuZCB0aGUgbnVtYmVyIG9mIHNlY3RvcnMKLSAgICAgICAgICAgIGlmIChvdXQuc2l6ZSgpICE9IDQpIHsKLSAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJNYWxmb3JtZWQgaW5pdCBtZXNzYWdlLCAiIDw8IG91dC5zaXplKCkgPDwgIiBwYXJ0cyI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNlbmRtc2coZmQsICJmYWlsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGF1dG8gaGFuZGxlciA9IEFkZEhhbmRsZXIob3V0WzFdLCBvdXRbMl0sIG91dFszXSk7Ci0gICAgICAgICAgICBpZiAoIWhhbmRsZXIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgImZhaWwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXV0byByZXR2YWwgPSAic3VjY2VzcywiICsgc3RkOjp0b19zdHJpbmcoaGFuZGxlci0+c25hcHVzZXJkKCktPkdldE51bVNlY3RvcnMoKSk7Ci0gICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgcmV0dmFsKTsKLSAgICAgICAgfQotICAgICAgICBjYXNlIERhZW1vbk9wZXJhdGlvbnM6OlNUQVJUOiB7Ci0gICAgICAgICAgICAvLyBNZXNzYWdlIGZvcm1hdDoKLSAgICAgICAgICAgIC8vIHN0YXJ0LDxtaXNjX25hbWU+Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gU3RhcnQgdGhlIG5ldyB0aHJlYWQgd2hpY2ggYmluZHMgdG8gZG0tdXNlciBtaXNjIGRldmljZQotICAgICAgICAgICAgaWYgKG91dC5zaXplKCkgIT0gMikgewotICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk1hbGZvcm1lZCBzdGFydCBtZXNzYWdlLCAiIDw8IG91dC5zaXplKCkgPDwgIiBwYXJ0cyI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNlbmRtc2coZmQsICJmYWlsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGxvY2tfKTsKLSAgICAgICAgICAgIGF1dG8gaXRlciA9IEZpbmRIYW5kbGVyKCZsb2NrLCBvdXRbMV0pOwotICAgICAgICAgICAgaWYgKGl0ZXIgPT0gZG1fdXNlcnNfLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IGZpbmQgaGFuZGxlcjogIiA8PCBvdXRbMV07Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNlbmRtc2coZmQsICJmYWlsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoISgqaXRlciktPnNuYXB1c2VyZCgpIHx8ICgqaXRlciktPnNuYXB1c2VyZCgpLT5Jc0F0dGFjaGVkKCkpIHsKLSAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJUcmllZCB0byByZS1hdHRhY2ggY29udHJvbCBkZXZpY2U6ICIgPDwgb3V0WzFdOwotICAgICAgICAgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCAiZmFpbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFTdGFydEhhbmRsZXIoKml0ZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNlbmRtc2coZmQsICJmYWlsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgInN1Y2Nlc3MiKTsKLSAgICAgICAgfQotICAgICAgICBjYXNlIERhZW1vbk9wZXJhdGlvbnM6OlNUT1A6IHsKLSAgICAgICAgICAgIC8vIE1lc3NhZ2UgZm9ybWF0OiBzdG9wCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gU3RvcCBhbGwgdGhlIHRocmVhZHMgZ3JhY2VmdWxseSBhbmQgdGhlbiBzaHV0ZG93biB0aGUKLSAgICAgICAgICAgIC8vIG1haW4gdGhyZWFkCi0gICAgICAgICAgICBTZXRUZXJtaW5hdGluZygpOwotICAgICAgICAgICAgU2h1dGRvd25UaHJlYWRzKCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBjYXNlIERhZW1vbk9wZXJhdGlvbnM6OlFVRVJZOiB7Ci0gICAgICAgICAgICAvLyBNZXNzYWdlIGZvcm1hdDogcXVlcnkKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBBcyBwYXJ0IG9mIHRyYW5zaXRpb24sIFNlY29uZCBzdGFnZSBkYWVtb24gd2lsbCBiZQotICAgICAgICAgICAgLy8gY3JlYXRlZCBiZWZvcmUgdGVybWluYXRpbmcgdGhlIGZpcnN0IHN0YWdlIGRhZW1vbi4gSGVuY2UsCi0gICAgICAgICAgICAvLyBmb3IgYSBicmllZiBwZXJpb2QgY2xpZW50IG1heSBoYXZlIHRvIGRpc3RpZ3Vpc2ggYmV0d2VlbgotICAgICAgICAgICAgLy8gZmlyc3Qgc3RhZ2UgZGFlbW9uIGFuZCBzZWNvbmQgc3RhZ2UgZGFlbW9uLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIFNlY29uZCBzdGFnZSBkYWVtb24gaXMgbWFya2VkIGFzIGFjdGl2ZSBhbmQgaGVuY2Ugd2lsbAotICAgICAgICAgICAgLy8gYmUgcmVhZHkgdG8gcmVjZWl2ZSBjb250cm9sIG1lc3NhZ2UuCi0gICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgR2V0RGFlbW9uU3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRGFlbW9uT3BlcmF0aW9uczo6REVMRVRFOiB7Ci0gICAgICAgICAgICAvLyBNZXNzYWdlIGZvcm1hdDoKLSAgICAgICAgICAgIC8vIGRlbGV0ZSw8bWlzY19uYW1lPgotICAgICAgICAgICAgaWYgKG91dC5zaXplKCkgIT0gMikgewotICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk1hbGZvcm1lZCBkZWxldGUgbWVzc2FnZSwgIiA8PCBvdXQuc2l6ZSgpIDw8ICIgcGFydHMiOwotICAgICAgICAgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCAiZmFpbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFSZW1vdmVBbmRKb2luSGFuZGxlcihvdXRbMV0pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNlbmRtc2coZmQsICJmYWlsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgInN1Y2Nlc3MiKTsKLSAgICAgICAgfQotICAgICAgICBjYXNlIERhZW1vbk9wZXJhdGlvbnM6OkRFVEFDSDogewotICAgICAgICAgICAgdGVybWluYXRpbmdfID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRGFlbW9uT3BlcmF0aW9uczo6U1VQUE9SVFM6IHsKLSAgICAgICAgICAgIGlmIChvdXQuc2l6ZSgpICE9IDIpIHsKLSAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJNYWxmb3JtZWQgc3VwcG9ydHMgbWVzc2FnZSwgIiA8PCBvdXQuc2l6ZSgpIDw8ICIgcGFydHMiOwotICAgICAgICAgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCAiZmFpbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG91dFsxXSA9PSAic2Vjb25kX3N0YWdlX3NvY2tldF9oYW5kb2ZmIikgewotICAgICAgICAgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCAic3VjY2VzcyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFNlbmRtc2coZmQsICJmYWlsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiUmVjZWl2ZWQgdW5rbm93biBtZXNzYWdlIHR5cGUgZnJvbSBjbGllbnQiOwotICAgICAgICAgICAgU2VuZG1zZyhmZCwgImZhaWwiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBTbmFwdXNlcmRTZXJ2ZXI6OlJ1blRocmVhZChzdGQ6OnNoYXJlZF9wdHI8RG1Vc2VySGFuZGxlcj4gaGFuZGxlcikgewotICAgIExPRyhJTkZPKSA8PCAiRW50ZXJpbmcgdGhyZWFkIGZvciBoYW5kbGVyOiAiIDw8IGhhbmRsZXItPm1pc2NfbmFtZSgpOwotCi0gICAgaGFuZGxlci0+c25hcHVzZXJkKCktPlNldFNvY2tldFByZXNlbnQoaXNfc29ja2V0X3ByZXNlbnRfKTsKLSAgICBpZiAoIWhhbmRsZXItPnNuYXB1c2VyZCgpLT5TdGFydCgpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIiBGYWlsZWQgdG8gbGF1bmNoIGFsbCB3b3JrZXIgdGhyZWFkcyI7Ci0gICAgfQotCi0gICAgaGFuZGxlci0+c25hcHVzZXJkKCktPkNsb3NlRmRzKCk7Ci0gICAgaGFuZGxlci0+c25hcHVzZXJkKCktPkNoZWNrTWVyZ2VDb21wbGV0aW9uU3RhdHVzKCk7Ci0gICAgaGFuZGxlci0+c25hcHVzZXJkKCktPlVubWFwQnVmZmVyUmVnaW9uKCk7Ci0KLSAgICBhdXRvIG1pc2NfbmFtZSA9IGhhbmRsZXItPm1pc2NfbmFtZSgpOwotICAgIExPRyhJTkZPKSA8PCAiSGFuZGxlciB0aHJlYWQgYWJvdXQgdG8gZXhpdDogIiA8PCBtaXNjX25hbWU7Ci0KLSAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGxvY2tfKTsKLSAgICAgICAgYXV0byBpdGVyID0gRmluZEhhbmRsZXIoJmxvY2ssIGhhbmRsZXItPm1pc2NfbmFtZSgpKTsKLSAgICAgICAgaWYgKGl0ZXIgPT0gZG1fdXNlcnNfLmVuZCgpKSB7Ci0gICAgICAgICAgICAvLyBSZW1vdmVBbmRKb2luSGFuZGxlcigpIGFscmVhZHkgcmVtb3ZlZCB1cyBmcm9tIHRoZSBsaXN0LCBhbmQgaXMKLSAgICAgICAgICAgIC8vIG5vdyB3YWl0aW5nIG9uIGEgam9pbigpLCBzbyBqdXN0IHJldHVybi4gQWRkaXRpb25hbGx5LCByZWxlYXNlCi0gICAgICAgICAgICAvLyBhbGwgdGhlIHJlc291cmNlcyBoZWxkIGJ5IHNuYXB1c2VyZCBvYmplY3Qgd2hpY2ggYXJlIHNoYXJlZAotICAgICAgICAgICAgLy8gYnkgd29ya2VyIHRocmVhZHMuIFRoaXMgc2hvdWxkIGJlIGRvbmUgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2UKLSAgICAgICAgICAgIC8vIG9mICJoYW5kbGVyIiBpcyByZWxlYXNlZDsgYnV0IHdlIHdpbGwgZXhwbGljaXRseSByZWxlYXNlIGhlcmUKLSAgICAgICAgICAgIC8vIHRvIG1ha2Ugc3VyZSBzbmFwdXNlcmQgb2JqZWN0IGlzIGZyZWVkIGFzIGl0IGlzIHRoZSBiaWdnZXN0Ci0gICAgICAgICAgICAvLyBjb25zdW1lciBvZiBtZW1vcnkgaW4gdGhlIGRhZW1vbi4KLSAgICAgICAgICAgIGhhbmRsZXItPkZyZWVSZXNvdXJjZXMoKTsKLSAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiRXhpdGluZyBoYW5kbGVyIHRocmVhZCB0byBhbGxvdyBmb3Igam9pbjogIiA8PCBtaXNjX25hbWU7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBMT0coSU5GTykgPDwgIkV4aXRpbmcgaGFuZGxlciB0aHJlYWQgYW5kIGZyZWVpbmcgcmVzb3VyY2VzOiAiIDw8IG1pc2NfbmFtZTsKLQotICAgICAgICBpZiAoaGFuZGxlci0+c25hcHVzZXJkKCktPklzQXR0YWNoZWQoKSkgewotICAgICAgICAgICAgaGFuZGxlci0+dGhyZWFkKCkuZGV0YWNoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJbXBvcnRhbnQ6IGZyZWUgcmVzb3VyY2VzIHdpdGhpbiB0aGUgbG9jay4gVGhpcyBlbnN1cmVzIHRoYXQgaWYKLSAgICAgICAgLy8gV2FpdEZvckRlbGV0ZSgpIGlzIGNhbGxlZCwgdGhlIGhhbmRsZXIgaXMgZWl0aGVyIGluIHRoZSBsaXN0LCBvcgotICAgICAgICAvLyBpdCdzIG5vdCBhbmQgaXRzIHJlc291cmNlcyBhcmUgZ3VhcmFudGVlZCB0byBiZSBmcmVlZC4KLSAgICAgICAgaGFuZGxlci0+RnJlZVJlc291cmNlcygpOwotICAgIH0KLX0KLQotYm9vbCBTbmFwdXNlcmRTZXJ2ZXI6OlN0YXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzb2NrZXRuYW1lKSB7Ci0gICAgYm9vbCBzdGFydF9saXN0ZW5pbmcgPSB0cnVlOwotCi0gICAgc29ja2ZkXy5yZXNldChhbmRyb2lkX2dldF9jb250cm9sX3NvY2tldChzb2NrZXRuYW1lLmNfc3RyKCkpKTsKLSAgICBpZiAoc29ja2ZkXyA8IDApIHsKLSAgICAgICAgc29ja2ZkXy5yZXNldChzb2NrZXRfbG9jYWxfc2VydmVyKHNvY2tldG5hbWUuY19zdHIoKSwgQU5EUk9JRF9TT0NLRVRfTkFNRVNQQUNFX1JFU0VSVkVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09DS19TVFJFQU0pKTsKLSAgICAgICAgaWYgKHNvY2tmZF8gPCAwKSB7Ci0gICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBzZXJ2ZXIgc29ja2V0ICIgPDwgc29ja2V0bmFtZTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBzdGFydF9saXN0ZW5pbmcgPSBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXJ0V2l0aFNvY2tldChzdGFydF9saXN0ZW5pbmcpOwotfQotCi1ib29sIFNuYXB1c2VyZFNlcnZlcjo6U3RhcnRXaXRoU29ja2V0KGJvb2wgc3RhcnRfbGlzdGVuaW5nKSB7Ci0gICAgaWYgKHN0YXJ0X2xpc3RlbmluZyAmJiBsaXN0ZW4oc29ja2ZkXy5nZXQoKSwgNCkgPCAwKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJsaXN0ZW4gc29ja2V0IGZhaWxlZCI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBBZGRXYXRjaGVkRmQoc29ja2ZkXywgUE9MTElOKTsKLSAgICBpc19zb2NrZXRfcHJlc2VudF8gPSB0cnVlOwotCi0gICAgLy8gSWYgc3RhcnRlZCBpbiBmaXJzdC1zdGFnZSBpbml0LCB0aGUgcHJvcGVydHkgc2VydmljZSB3b24ndCBiZSBvbmxpbmUuCi0gICAgaWYgKGFjY2VzcygiL2Rldi9zb2NrZXQvcHJvcGVydHlfc2VydmljZSIsIEZfT0spID09IDApIHsKLSAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpTZXRQcm9wZXJ0eSgic25hcHVzZXJkLnJlYWR5IiwgInRydWUiKSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHNldCBzbmFwdXNlcmQucmVhZHkgcHJvcGVydHkiOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgTE9HKERFQlVHKSA8PCAiU25hcHVzZXJkIHNlcnZlciBub3cgYWNjZXB0aW5nIGNvbm5lY3Rpb25zIjsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBTbmFwdXNlcmRTZXJ2ZXI6OlJ1bigpIHsKLSAgICBMT0coSU5GTykgPDwgIk5vdyBsaXN0ZW5pbmcgb24gc25hcHVzZXJkIHNvY2tldCI7Ci0KLSAgICB3aGlsZSAoIUlzVGVybWluYXRpbmcoKSkgewotICAgICAgICBpbnQgcnYgPSBURU1QX0ZBSUxVUkVfUkVUUlkocG9sbCh3YXRjaGVkX2Zkc18uZGF0YSgpLCB3YXRjaGVkX2Zkc18uc2l6ZSgpLCAtMSkpOwotICAgICAgICBpZiAocnYgPCAwKSB7Ci0gICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAicG9sbCBmYWlsZWQiOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcnYpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHdhdGNoZWRfZmRzX1swXS5yZXZlbnRzKSB7Ci0gICAgICAgICAgICBBY2NlcHRDbGllbnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGF1dG8gaXRlciA9IHdhdGNoZWRfZmRzXy5iZWdpbigpICsgMTsKLSAgICAgICAgd2hpbGUgKGl0ZXIgIT0gd2F0Y2hlZF9mZHNfLmVuZCgpKSB7Ci0gICAgICAgICAgICBpZiAoaXRlci0+cmV2ZW50cyAmJiAhSGFuZGxlQ2xpZW50KGl0ZXItPmZkLCBpdGVyLT5yZXZlbnRzKSkgewotICAgICAgICAgICAgICAgIGNsb3NlKGl0ZXItPmZkKTsKLSAgICAgICAgICAgICAgICBpdGVyID0gd2F0Y2hlZF9mZHNfLmVyYXNlKGl0ZXIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpdGVyKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBKb2luQWxsVGhyZWFkcygpOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFNuYXB1c2VyZFNlcnZlcjo6Sm9pbkFsbFRocmVhZHMoKSB7Ci0gICAgLy8gQWNxdWlyZSB0aGUgdGhyZWFkIGxpc3Qgd2l0aGluIHRoZSBsb2NrLgotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxEbVVzZXJIYW5kbGVyPj4gZG1fdXNlcnM7Ci0gICAgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gZ3VhcmQobG9ja18pOwotICAgICAgICBkbV91c2VycyA9IHN0ZDo6bW92ZShkbV91c2Vyc18pOwotICAgIH0KLQotICAgIGZvciAoYXV0byYgY2xpZW50IDogZG1fdXNlcnMpIHsKLSAgICAgICAgYXV0byYgdGggPSBjbGllbnQtPnRocmVhZCgpOwotCi0gICAgICAgIGlmICh0aC5qb2luYWJsZSgpKSB0aC5qb2luKCk7Ci0gICAgfQotfQotCi12b2lkIFNuYXB1c2VyZFNlcnZlcjo6QWRkV2F0Y2hlZEZkKGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIGZkLCBpbnQgZXZlbnRzKSB7Ci0gICAgc3RydWN0IHBvbGxmZCBwID0ge307Ci0gICAgcC5mZCA9IGZkLmdldCgpOwotICAgIHAuZXZlbnRzID0gZXZlbnRzOwotICAgIHdhdGNoZWRfZmRzXy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKHApKTsKLX0KLQotdm9pZCBTbmFwdXNlcmRTZXJ2ZXI6OkFjY2VwdENsaWVudCgpIHsKLSAgICBpbnQgZmQgPSBURU1QX0ZBSUxVUkVfUkVUUlkoYWNjZXB0NChzb2NrZmRfLmdldCgpLCBudWxscHRyLCBudWxscHRyLCBTT0NLX0NMT0VYRUMpKTsKLSAgICBpZiAoZmQgPCAwKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJhY2NlcHQ0IGZhaWxlZCI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBZGRXYXRjaGVkRmQoZmQsIFBPTExJTik7Ci19Ci0KLWJvb2wgU25hcHVzZXJkU2VydmVyOjpIYW5kbGVDbGllbnQoYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgZmQsIGludCByZXZlbnRzKSB7Ci0gICAgaWYgKHJldmVudHMgJiBQT0xMSFVQKSB7Ci0gICAgICAgIExPRyhERUJVRykgPDwgIlNuYXB1c2VyZCBjbGllbnQgZGlzY29ubmVjdGVkIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHN0ZDo6c3RyaW5nIHN0cjsKLSAgICBpZiAoIVJlY3YoZmQsICZzdHIpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKCFSZWNlaXZlbXNnKGZkLCBzdHIpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkVuY291bnRlcmVkIGVycm9yIGhhbmRsaW5nIGNsaWVudCBtZXNzYWdlLCByZXZlbnRzOiAiIDw8IHJldmVudHM7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgU25hcHVzZXJkU2VydmVyOjpJbnRlcnJ1cHQoKSB7Ci0gICAgLy8gRm9yY2UgY2xvc2UgdGhlIHNvY2tldCBzbyBwb2xsKCkgZmFpbHMuCi0gICAgc29ja2ZkXyA9IHt9OwotICAgIFNldFRlcm1pbmF0aW5nKCk7Ci19Ci0KLXN0ZDo6c2hhcmVkX3B0cjxEbVVzZXJIYW5kbGVyPiBTbmFwdXNlcmRTZXJ2ZXI6OkFkZEhhbmRsZXIoY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvd19kZXZpY2VfcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJhY2tpbmdfZGV2aWNlKSB7Ci0gICAgYXV0byBzbmFwdXNlcmQgPSBzdGQ6Om1ha2Vfc2hhcmVkPFNuYXB1c2VyZD4obWlzY19uYW1lLCBjb3dfZGV2aWNlX3BhdGgsIGJhY2tpbmdfZGV2aWNlKTsKLSAgICBpZiAoIXNuYXB1c2VyZC0+SW5pdENvd0RldmljZSgpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBpbml0aWFsaXplIFNuYXB1c2VyZCI7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLQotICAgIGlmICghc25hcHVzZXJkLT5Jbml0aWFsaXplV29ya2VycygpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBpbml0aWFsaXplIHdvcmtlcnMiOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICBhdXRvIGhhbmRsZXIgPSBzdGQ6Om1ha2Vfc2hhcmVkPERtVXNlckhhbmRsZXI+KHNuYXB1c2VyZCk7Ci0gICAgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhsb2NrXyk7Ci0gICAgICAgIGlmIChGaW5kSGFuZGxlcigmbG9jaywgbWlzY19uYW1lKSAhPSBkbV91c2Vyc18uZW5kKCkpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkhhbmRsZXIgYWxyZWFkeSBleGlzdHM6ICIgPDwgbWlzY19uYW1lOwotICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICAgICAgZG1fdXNlcnNfLnB1c2hfYmFjayhoYW5kbGVyKTsKLSAgICB9Ci0gICAgcmV0dXJuIGhhbmRsZXI7Ci19Ci0KLWJvb2wgU25hcHVzZXJkU2VydmVyOjpTdGFydEhhbmRsZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPERtVXNlckhhbmRsZXI+JiBoYW5kbGVyKSB7Ci0gICAgaWYgKGhhbmRsZXItPnNuYXB1c2VyZCgpLT5Jc0F0dGFjaGVkKCkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiSGFuZGxlciBhbHJlYWR5IGF0dGFjaGVkIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGhhbmRsZXItPnNuYXB1c2VyZCgpLT5BdHRhY2hDb250cm9sRGV2aWNlKCk7Ci0KLSAgICBoYW5kbGVyLT50aHJlYWQoKSA9IHN0ZDo6dGhyZWFkKHN0ZDo6YmluZCgmU25hcHVzZXJkU2VydmVyOjpSdW5UaHJlYWQsIHRoaXMsIGhhbmRsZXIpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYXV0byBTbmFwdXNlcmRTZXJ2ZXI6OkZpbmRIYW5kbGVyKHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiogcHJvb2Zfb2ZfbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lKSAtPiBIYW5kbGVyTGlzdDo6aXRlcmF0b3IgewotICAgIENIRUNLKHByb29mX29mX2xvY2spOwotCi0gICAgZm9yIChhdXRvIGl0ZXIgPSBkbV91c2Vyc18uYmVnaW4oKTsgaXRlciAhPSBkbV91c2Vyc18uZW5kKCk7IGl0ZXIrKykgewotICAgICAgICBpZiAoKCppdGVyKS0+bWlzY19uYW1lKCkgPT0gbWlzY19uYW1lKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXRlcjsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZG1fdXNlcnNfLmVuZCgpOwotfQotCi1ib29sIFNuYXB1c2VyZFNlcnZlcjo6UmVtb3ZlQW5kSm9pbkhhbmRsZXIoY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSkgewotICAgIHN0ZDo6c2hhcmVkX3B0cjxEbVVzZXJIYW5kbGVyPiBoYW5kbGVyOwotICAgIHsKLSAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobG9ja18pOwotCi0gICAgICAgIGF1dG8gaXRlciA9IEZpbmRIYW5kbGVyKCZsb2NrLCBtaXNjX25hbWUpOwotICAgICAgICBpZiAoaXRlciA9PSBkbV91c2Vyc18uZW5kKCkpIHsKLSAgICAgICAgICAgIC8vIENsaWVudCBhbHJlYWR5IGRlbGV0ZWQuCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBoYW5kbGVyID0gc3RkOjptb3ZlKCppdGVyKTsKLSAgICAgICAgZG1fdXNlcnNfLmVyYXNlKGl0ZXIpOwotICAgIH0KLQotICAgIGF1dG8mIHRoID0gaGFuZGxlci0+dGhyZWFkKCk7Ci0gICAgaWYgKHRoLmpvaW5hYmxlKCkpIHsKLSAgICAgICAgdGguam9pbigpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBTbmFwdXNlcmRTZXJ2ZXI6OldhaXRGb3JTb2NrZXQoKSB7Ci0gICAgYXV0byBzY29wZV9ndWFyZCA9IGFuZHJvaWQ6OmJhc2U6Om1ha2Vfc2NvcGVfZ3VhcmQoW3RoaXNdKCkgLT4gdm9pZCB7IEpvaW5BbGxUaHJlYWRzKCk7IH0pOwotCi0gICAgYXV0byBzb2NrZXRfcGF0aCA9IEFORFJPSURfU09DS0VUX0RJUiAiLyJzICsga1NuYXB1c2VyZFNvY2tldFByb3h5OwotCi0gICAgaWYgKCFhbmRyb2lkOjpmc19tZ3I6OldhaXRGb3JGaWxlKHNvY2tldF9wYXRoLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzOjptYXgoKSkpIHsKLSAgICAgICAgTE9HKEVSUk9SKQotICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gd2FpdCBmb3IgcHJveHkgc29ja2V0LCBzZWNvbmQtc3RhZ2Ugc25hcHVzZXJkIHdpbGwgZmFpbCB0byBjb25uZWN0IjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIFdlIG11c3QgcmUtaW5pdGlhbGl6ZSBwcm9wZXJ0eSBzZXJ2aWNlIGFjY2Vzcywgc2luY2Ugd2UgbGF1bmNoZWQgYmVmb3JlCi0gICAgLy8gc2Vjb25kLXN0YWdlIGluaXQuCi0gICAgX19zeXN0ZW1fcHJvcGVydGllc19pbml0KCk7Ci0KLSAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OldhaXRGb3JQcm9wZXJ0eSgic25hcHVzZXJkLnByb3h5X3JlYWR5IiwgInRydWUiKSkgewotICAgICAgICBMT0coRVJST1IpCi0gICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byB3YWl0IGZvciBwcm94eSBwcm9wZXJ0eSwgc2Vjb25kLXN0YWdlIHNuYXB1c2VyZCB3aWxsIGZhaWwgdG8gY29ubmVjdCI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB1bmlxdWVfZmQgZmQoc29ja2V0X2xvY2FsX2NsaWVudChrU25hcHVzZXJkU29ja2V0UHJveHksIEFORFJPSURfU09DS0VUX05BTUVTUEFDRV9SRVNFUlZFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0NLX1NFUVBBQ0tFVCkpOwotICAgIGlmIChmZCA8IDApIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBjb25uZWN0IHRvIHNvY2tldCBwcm94eSI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjaGFyIGNvZGVbMV07Ci0gICAgc3RkOjp2ZWN0b3I8dW5pcXVlX2ZkPiBmZHM7Ci0gICAgc3NpemVfdCBydiA9IGFuZHJvaWQ6OmJhc2U6OlJlY2VpdmVGaWxlRGVzY3JpcHRvclZlY3RvcihmZCwgY29kZSwgc2l6ZW9mKGNvZGUpLCAxLCAmZmRzKTsKLSAgICBpZiAocnYgPCAwKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcmVjZWl2ZSBzZXJ2ZXIgc29ja2V0IG92ZXIgcHJveHkiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChmZHMuZW1wdHkoKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJFeHBlY3RlZCBhdCBsZWFzdCBvbmUgZmlsZSBkZXNjcmlwdG9yIGZyb20gcHJveHkiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gV2UgZG9uJ3QgY2FyZSBpZiB0aGUgQUNLIGlzIHJlY2VpdmVkLgotICAgIGNvZGVbMF0gPSAnYSc7Ci0gICAgaWYgKFRFTVBfRkFJTFVSRV9SRVRSWShzZW5kKGZkLCBjb2RlLCBzaXplb2YoY29kZSksIE1TR19OT1NJR05BTCkpIDwgMCkgewotICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHNlbmQgQUNLIHRvIHByb3h5IjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHNvY2tmZF8gPSBzdGQ6Om1vdmUoZmRzWzBdKTsKLSAgICBpZiAoIVN0YXJ0V2l0aFNvY2tldCh0cnVlKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBSdW4oKTsKLX0KLQotYm9vbCBTbmFwdXNlcmRTZXJ2ZXI6OlJ1bkZvclNvY2tldEhhbmRvZmYoKSB7Ci0gICAgdW5pcXVlX2ZkIHByb3h5X2ZkKGFuZHJvaWRfZ2V0X2NvbnRyb2xfc29ja2V0KGtTbmFwdXNlcmRTb2NrZXRQcm94eSkpOwotICAgIGlmIChwcm94eV9mZCA8IDApIHsKLSAgICAgICAgUExPRyhGQVRBTCkgPDwgIlByb3h5IGNvdWxkIG5vdCBnZXQgYW5kcm9pZCBjb250cm9sIHNvY2tldCAiIDw8IGtTbmFwdXNlcmRTb2NrZXRQcm94eTsKLSAgICB9Ci0gICAgYm9ycm93ZWRfZmQgc2VydmVyX2ZkKGFuZHJvaWRfZ2V0X2NvbnRyb2xfc29ja2V0KGtTbmFwdXNlcmRTb2NrZXQpKTsKLSAgICBpZiAoc2VydmVyX2ZkIDwgMCkgewotICAgICAgICBQTE9HKEZBVEFMKSA8PCAiUHJveHkgY291bGQgbm90IGdldCBhbmRyb2lkIGNvbnRyb2wgc29ja2V0ICIgPDwga1NuYXB1c2VyZFNvY2tldDsKLSAgICB9Ci0KLSAgICBpZiAobGlzdGVuKHByb3h5X2ZkLmdldCgpLCA0KSA8IDApIHsKLSAgICAgICAgUExPRyhGQVRBTCkgPDwgIlByb3h5IGxpc3RlbiBzb2NrZXQgZmFpbGVkIjsKLSAgICB9Ci0KLSAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlNldFByb3BlcnR5KCJzbmFwdXNlcmQucHJveHlfcmVhZHkiLCAidHJ1ZSIpKSB7Ci0gICAgICAgIExPRyhGQVRBTCkgPDwgIlByb3h5IGZhaWxlZCB0byBzZXQgcmVhZHkgcHJvcGVydHkiOwotICAgIH0KLQotICAgIHVuaXF1ZV9mZCBjbGllbnRfZmQoCi0gICAgICAgICAgICBURU1QX0ZBSUxVUkVfUkVUUlkoYWNjZXB0NChwcm94eV9mZC5nZXQoKSwgbnVsbHB0ciwgbnVsbHB0ciwgU09DS19DTE9FWEVDKSkpOwotICAgIGlmIChjbGllbnRfZmQgPCAwKSB7Ci0gICAgICAgIFBMT0coRkFUQUwpIDw8ICJQcm94eSBhY2NlcHQgZmFpbGVkIjsKLSAgICB9Ci0KLSAgICBjaGFyIGNvZGVbMV0gPSB7J2EnfTsKLSAgICBzdGQ6OnZlY3RvcjxpbnQ+IGZkcyA9IHtzZXJ2ZXJfZmQuZ2V0KCl9OwotICAgIHNzaXplX3QgcnYgPSBhbmRyb2lkOjpiYXNlOjpTZW5kRmlsZURlc2NyaXB0b3JWZWN0b3IoY2xpZW50X2ZkLCBjb2RlLCBzaXplb2YoY29kZSksIGZkcyk7Ci0gICAgaWYgKHJ2IDwgMCkgewotICAgICAgICBQTE9HKEZBVEFMKSA8PCAiUHJveHkgY291bGQgbm90IHNlbmQgZmlsZSBkZXNjcmlwdG9yIHRvIHNuYXB1c2VyZCI7Ci0gICAgfQotICAgIC8vIFdhaXQgZm9yIGFuIEFDSyAtIHJlc3VsdHMgZG9uJ3QgbWF0dGVyLCB3ZSBqdXN0IGRvbid0IHdhbnQgdG8gcmlzayBjbG9zaW5nCi0gICAgLy8gdGhlIHByb3h5IHNvY2tldCB0b28gZWFybHkuCi0gICAgaWYgKHJlY3YoY2xpZW50X2ZkLCBjb2RlLCBzaXplb2YoY29kZSksIDApIDwgMCkgewotICAgICAgICBQTE9HKEZBVEFMKSA8PCAiUHJveHkgY291bGQgbm90IHJlY2VpdmUgdGVybWluYXRpbmcgY29kZSBmcm9tIHNuYXB1c2VyZCI7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL2RtLXNuYXBzaG90LW1lcmdlL3NuYXB1c2VyZF9zZXJ2ZXIuaCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvZG0tc25hcHNob3QtbWVyZ2Uvc25hcHVzZXJkX3NlcnZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjZmZjE1Li4wMDAwMDAwCi0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvZG0tc25hcHNob3QtbWVyZ2Uvc25hcHVzZXJkX3NlcnZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHBvbGwuaD4KLQotI2luY2x1ZGUgPGNzdGRpbz4KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8ZnV0dXJlPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPG11dGV4PgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHRocmVhZD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+Ci0jaW5jbHVkZSAic25hcHVzZXJkLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBzbmFwc2hvdCB7Ci0KLXN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgTUFYX1BBQ0tFVF9TSVpFID0gNTEyOwotCi1lbnVtIGNsYXNzIERhZW1vbk9wZXJhdGlvbnMgewotICAgIElOSVQsCi0gICAgU1RBUlQsCi0gICAgUVVFUlksCi0gICAgU1RPUCwKLSAgICBERUxFVEUsCi0gICAgREVUQUNILAotICAgIFNVUFBPUlRTLAotICAgIElOVkFMSUQsCi19OwotCi1jbGFzcyBEbVVzZXJIYW5kbGVyIHsKLSAgcHVibGljOgotICAgIGV4cGxpY2l0IERtVXNlckhhbmRsZXIoc3RkOjpzaGFyZWRfcHRyPFNuYXB1c2VyZD4gc25hcHVzZXJkKTsKLQotICAgIHZvaWQgRnJlZVJlc291cmNlcygpIHsKLSAgICAgICAgLy8gRWFjaCB3b3JrZXIgdGhyZWFkIGhvbGRzIGEgcmVmZXJlbmNlIHRvIHNuYXB1c2VyZC4KLSAgICAgICAgLy8gQ2xlYXIgdGhlbSBzbyB0aGF0IGFsbCB0aGUgcmVzb3VyY2VzCi0gICAgICAgIC8vIGhlbGQgYnkgc25hcHVzZXJkIGlzIHJlbGVhc2VkCi0gICAgICAgIGlmIChzbmFwdXNlcmRfKSB7Ci0gICAgICAgICAgICBzbmFwdXNlcmRfLT5GcmVlUmVzb3VyY2VzKCk7Ci0gICAgICAgICAgICBzbmFwdXNlcmRfID0gbnVsbHB0cjsKLSAgICAgICAgfQotICAgIH0KLSAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8U25hcHVzZXJkPiYgc25hcHVzZXJkKCkgY29uc3QgeyByZXR1cm4gc25hcHVzZXJkXzsgfQotICAgIHN0ZDo6dGhyZWFkJiB0aHJlYWQoKSB7IHJldHVybiB0aHJlYWRfOyB9Ci0KLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lKCkgY29uc3QgeyByZXR1cm4gbWlzY19uYW1lXzsgfQotCi0gIHByaXZhdGU6Ci0gICAgc3RkOjp0aHJlYWQgdGhyZWFkXzsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8U25hcHVzZXJkPiBzbmFwdXNlcmRfOwotICAgIHN0ZDo6c3RyaW5nIG1pc2NfbmFtZV87Ci19OwotCi1jbGFzcyBTdG9wcGFibGUgewotICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiBleGl0U2lnbmFsXzsKLSAgICBzdGQ6OmZ1dHVyZTx2b2lkPiBmdXR1cmVPYmpfOwotCi0gIHB1YmxpYzoKLSAgICBTdG9wcGFibGUoKSA6IGZ1dHVyZU9ial8oZXhpdFNpZ25hbF8uZ2V0X2Z1dHVyZSgpKSB7fQotCi0gICAgdmlydHVhbCB+U3RvcHBhYmxlKCkge30KLQotICAgIGJvb2wgU3RvcFJlcXVlc3RlZCgpIHsKLSAgICAgICAgLy8gY2hlY2tzIGlmIHZhbHVlIGluIGZ1dHVyZSBvYmplY3QgaXMgYXZhaWxhYmxlCi0gICAgICAgIGlmIChmdXR1cmVPYmpfLndhaXRfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMCkpID09IHN0ZDo6ZnV0dXJlX3N0YXR1czo6dGltZW91dCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAvLyBSZXF1ZXN0IHRoZSB0aHJlYWQgdG8gc3RvcCBieSBzZXR0aW5nIHZhbHVlIGluIHByb21pc2Ugb2JqZWN0Ci0gICAgdm9pZCBTdG9wVGhyZWFkcygpIHsgZXhpdFNpZ25hbF8uc2V0X3ZhbHVlKCk7IH0KLX07Ci0KLWNsYXNzIFNuYXB1c2VyZFNlcnZlciA6IHB1YmxpYyBTdG9wcGFibGUgewotICBwcml2YXRlOgotICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBzb2NrZmRfOwotICAgIGJvb2wgdGVybWluYXRpbmdfOwotICAgIHZvbGF0aWxlIGJvb2wgcmVjZWl2ZWRfc29ja2V0X3NpZ25hbF8gPSBmYWxzZTsKLSAgICBzdGQ6OnZlY3RvcjxzdHJ1Y3QgcG9sbGZkPiB3YXRjaGVkX2Zkc187Ci0gICAgYm9vbCBpc19zb2NrZXRfcHJlc2VudF8gPSBmYWxzZTsKLQotICAgIHN0ZDo6bXV0ZXggbG9ja187Ci0KLSAgICB1c2luZyBIYW5kbGVyTGlzdCA9IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxEbVVzZXJIYW5kbGVyPj47Ci0gICAgSGFuZGxlckxpc3QgZG1fdXNlcnNfOwotCi0gICAgdm9pZCBBZGRXYXRjaGVkRmQoYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgZmQsIGludCBldmVudHMpOwotICAgIHZvaWQgQWNjZXB0Q2xpZW50KCk7Ci0gICAgYm9vbCBIYW5kbGVDbGllbnQoYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgZmQsIGludCByZXZlbnRzKTsKLSAgICBib29sIFJlY3YoYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgZmQsIHN0ZDo6c3RyaW5nKiBkYXRhKTsKLSAgICBib29sIFNlbmRtc2coYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgZmQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpOwotICAgIGJvb2wgUmVjZWl2ZW1zZyhhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBmZCwgY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgICB2b2lkIFNodXRkb3duVGhyZWFkcygpOwotICAgIGJvb2wgUmVtb3ZlQW5kSm9pbkhhbmRsZXIoY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRyb2xfZGV2aWNlKTsKLSAgICBEYWVtb25PcGVyYXRpb25zIFJlc29sdmVvcChzdGQ6OnN0cmluZyYgaW5wdXQpOwotICAgIHN0ZDo6c3RyaW5nIEdldERhZW1vblN0YXR1cygpOwotICAgIHZvaWQgUGFyc2Vtc2coc3RkOjpzdHJpbmcgY29uc3QmIG1zZywgY29uc3QgY2hhciBkZWxpbSwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBvdXQpOwotCi0gICAgYm9vbCBJc1Rlcm1pbmF0aW5nKCkgeyByZXR1cm4gdGVybWluYXRpbmdfOyB9Ci0KLSAgICB2b2lkIFJ1blRocmVhZChzdGQ6OnNoYXJlZF9wdHI8RG1Vc2VySGFuZGxlcj4gaGFuZGxlcik7Ci0gICAgdm9pZCBKb2luQWxsVGhyZWFkcygpOwotICAgIGJvb2wgU3RhcnRXaXRoU29ja2V0KGJvb2wgc3RhcnRfbGlzdGVuaW5nKTsKLQotICAgIC8vIEZpbmQgYSBEbVVzZXJIYW5kbGVyIHdpdGhpbiBhIGxvY2suCi0gICAgSGFuZGxlckxpc3Q6Oml0ZXJhdG9yIEZpbmRIYW5kbGVyKHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiogcHJvb2Zfb2ZfbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSk7Ci0KLSAgcHVibGljOgotICAgIFNuYXB1c2VyZFNlcnZlcigpIHsgdGVybWluYXRpbmdfID0gZmFsc2U7IH0KLSAgICB+U25hcHVzZXJkU2VydmVyKCk7Ci0KLSAgICBib29sIFN0YXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzb2NrZXRuYW1lKTsKLSAgICBib29sIFJ1bigpOwotICAgIHZvaWQgSW50ZXJydXB0KCk7Ci0gICAgYm9vbCBSdW5Gb3JTb2NrZXRIYW5kb2ZmKCk7Ci0gICAgYm9vbCBXYWl0Rm9yU29ja2V0KCk7Ci0KLSAgICBzdGQ6OnNoYXJlZF9wdHI8RG1Vc2VySGFuZGxlcj4gQWRkSGFuZGxlcihjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb3dfZGV2aWNlX3BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJhY2tpbmdfZGV2aWNlKTsKLSAgICBib29sIFN0YXJ0SGFuZGxlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RG1Vc2VySGFuZGxlcj4mIGhhbmRsZXIpOwotCi0gICAgdm9pZCBTZXRUZXJtaW5hdGluZygpIHsgdGVybWluYXRpbmdfID0gdHJ1ZTsgfQotICAgIHZvaWQgUmVjZWl2ZWRTb2NrZXRTaWduYWwoKSB7IHJlY2VpdmVkX3NvY2tldF9zaWduYWxfID0gdHJ1ZTsgfQotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90Ci19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9kbS1zbmFwc2hvdC1tZXJnZS9zbmFwdXNlcmRfd29ya2VyLmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvZG0tc25hcHNob3QtbWVyZ2Uvc25hcHVzZXJkX3dvcmtlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NWFmNDAuLjAwMDAwMDAKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9kbS1zbmFwc2hvdC1tZXJnZS9zbmFwdXNlcmRfd29ya2VyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInNuYXB1c2VyZC5oIgotCi0jaW5jbHVkZSA8Y3NpZ25hbD4KLSNpbmNsdWRlIDxvcHRpb25hbD4KLSNpbmNsdWRlIDxzZXQ+Ci0KLSNpbmNsdWRlIDxzbmFwdXNlcmQvc25hcHVzZXJkX2NsaWVudC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2Ugc25hcHNob3QgewotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpkbTsKLXVzaW5nIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZDsKLQotI2RlZmluZSBTTkFQX0xPRyhsZXZlbCkgTE9HKGxldmVsKSA8PCBtaXNjX25hbWVfIDw8ICI6ICIKLSNkZWZpbmUgU05BUF9QTE9HKGxldmVsKSBQTE9HKGxldmVsKSA8PCBtaXNjX25hbWVfIDw8ICI6ICIKLQotV29ya2VyVGhyZWFkOjpXb3JrZXJUaHJlYWQoY29uc3Qgc3RkOjpzdHJpbmcmIGNvd19kZXZpY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBiYWNraW5nX2RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250cm9sX2RldmljZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTbmFwdXNlcmQ+IHNuYXB1c2VyZCkgewotICAgIGNvd19kZXZpY2VfID0gY293X2RldmljZTsKLSAgICBiYWNraW5nX3N0b3JlX2RldmljZV8gPSBiYWNraW5nX2RldmljZTsKLSAgICBjb250cm9sX2RldmljZV8gPSBjb250cm9sX2RldmljZTsKLSAgICBtaXNjX25hbWVfID0gbWlzY19uYW1lOwotICAgIHNuYXB1c2VyZF8gPSBzbmFwdXNlcmQ7Ci0gICAgZXhjZXB0aW9uc19wZXJfYXJlYV8gPSAoQ0hVTktfU0laRSA8PCBTRUNUT1JfU0hJRlQpIC8gc2l6ZW9mKHN0cnVjdCBkaXNrX2V4Y2VwdGlvbik7Ci19Ci0KLWJvb2wgV29ya2VyVGhyZWFkOjpJbml0aWFsaXplRmRzKCkgewotICAgIGJhY2tpbmdfc3RvcmVfZmRfLnJlc2V0KG9wZW4oYmFja2luZ19zdG9yZV9kZXZpY2VfLmNfc3RyKCksIE9fUkRPTkxZKSk7Ci0gICAgaWYgKGJhY2tpbmdfc3RvcmVfZmRfIDwgMCkgewotICAgICAgICBTTkFQX1BMT0coRVJST1IpIDw8ICJPcGVuIEZhaWxlZDogIiA8PCBiYWNraW5nX3N0b3JlX2RldmljZV87Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjb3dfZmRfLnJlc2V0KG9wZW4oY293X2RldmljZV8uY19zdHIoKSwgT19SRFdSKSk7Ci0gICAgaWYgKGNvd19mZF8gPCAwKSB7Ci0gICAgICAgIFNOQVBfUExPRyhFUlJPUikgPDwgIk9wZW4gRmFpbGVkOiAiIDw8IGNvd19kZXZpY2VfOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY3RybF9mZF8ucmVzZXQob3Blbihjb250cm9sX2RldmljZV8uY19zdHIoKSwgT19SRFdSKSk7Ci0gICAgaWYgKGN0cmxfZmRfIDwgMCkgewotICAgICAgICBTTkFQX1BMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gb3BlbiAiIDw8IGNvbnRyb2xfZGV2aWNlXzsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFdvcmtlclRocmVhZDo6SW5pdFJlYWRlcigpIHsKLSAgICByZWFkZXJfID0gc25hcHVzZXJkXy0+Q2xvbmVSZWFkZXJGb3JXb3JrZXIoKTsKLQotICAgIGlmICghcmVhZGVyXy0+SW5pdEZvck1lcmdlKHN0ZDo6bW92ZShjb3dfZmRfKSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gQ29uc3RydWN0IGtlcm5lbCBDT1cgaGVhZGVyIGluIG1lbW9yeQotLy8gVGhpcyBoZWFkZXIgd2lsbCBiZSBpbiBzZWN0b3IgMC4gVGhlIElPCi0vLyByZXF1ZXN0IHdpbGwgYWx3YXlzIGJlIDRrLiBBZnRlciBjb25zdHJ1Y3RpbmcKLS8vIHRoZSBoZWFkZXIsIHplcm8gb3V0IHRoZSByZW1haW5pbmcgYmxvY2suCi12b2lkIFdvcmtlclRocmVhZDo6Q29uc3RydWN0S2VybmVsQ293SGVhZGVyKCkgewotICAgIHZvaWQqIGJ1ZmZlciA9IGJ1ZnNpbmtfLkdldFBheWxvYWRCdWZmZXIoQkxPQ0tfU1opOwotCi0gICAgbWVtc2V0KGJ1ZmZlciwgMCwgQkxPQ0tfU1opOwotCi0gICAgc3RydWN0IGRpc2tfaGVhZGVyKiBkaCA9IHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IGRpc2tfaGVhZGVyKj4oYnVmZmVyKTsKLQotICAgIGRoLT5tYWdpYyA9IFNOQVBfTUFHSUM7Ci0gICAgZGgtPnZhbGlkID0gU05BUFNIT1RfVkFMSUQ7Ci0gICAgZGgtPnZlcnNpb24gPSBTTkFQU0hPVF9ESVNLX1ZFUlNJT047Ci0gICAgZGgtPmNodW5rX3NpemUgPSBDSFVOS19TSVpFOwotfQotCi0vLyBTdGFydCB0aGUgcmVwbGFjZSBvcGVyYXRpb24uIFRoaXMgd2lsbCByZWFkIHRoZQotLy8gaW50ZXJuYWwgQ09XIGZvcm1hdCBhbmQgaWYgdGhlIGJsb2NrIGlzIGNvbXByZXNzZWQsCi0vLyBpdCB3aWxsIGJlIGRlLWNvbXByZXNzZWQuCi1ib29sIFdvcmtlclRocmVhZDo6UHJvY2Vzc1JlcGxhY2VPcChjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCkgewotICAgIGlmICghcmVhZGVyXy0+UmVhZERhdGEoKmNvd19vcCwgJmJ1ZnNpbmtfKSkgewotICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlByb2Nlc3NSZXBsYWNlT3AgZmFpbGVkIGZvciBibG9jayAiIDw8IGNvd19vcC0+bmV3X2Jsb2NrOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgV29ya2VyVGhyZWFkOjpSZWFkRnJvbUJhc2VEZXZpY2UoY29uc3QgQ293T3BlcmF0aW9uKiBjb3dfb3ApIHsKLSAgICB2b2lkKiBidWZmZXIgPSBidWZzaW5rXy5HZXRQYXlsb2FkQnVmZmVyKEJMT0NLX1NaKTsKLSAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKLSAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJSZWFkRnJvbUJhc2VEZXZpY2U6IEZhaWxlZCB0byBnZXQgcGF5bG9hZCBidWZmZXIiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIFNOQVBfTE9HKERFQlVHKSA8PCAiIFJlYWRGcm9tQmFzZURldmljZS4uLjogbmV3LWJsb2NrOiAiIDw8IGNvd19vcC0+bmV3X2Jsb2NrCi0gICAgICAgICAgICAgICAgICAgIDw8ICIgU291cmNlOiAiIDw8IGNvd19vcC0+c291cmNlOwotICAgIHVpbnQ2NF90IG9mZnNldCA9IGNvd19vcC0+c291cmNlOwotICAgIGlmIChjb3dfb3AtPnR5cGUgPT0ga0Nvd0NvcHlPcCkgewotICAgICAgICBvZmZzZXQgKj0gQkxPQ0tfU1o7Ci0gICAgfQotICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhZEZ1bGx5QXRPZmZzZXQoYmFja2luZ19zdG9yZV9mZF8sIGJ1ZmZlciwgQkxPQ0tfU1osIG9mZnNldCkpIHsKLSAgICAgICAgU05BUF9QTE9HKEVSUk9SKSA8PCAiQ29weSBvcCBmYWlsZWQuIFJlYWQgZnJvbSBiYWNraW5nIHN0b3JlOiAiIDw8IGJhY2tpbmdfc3RvcmVfZGV2aWNlXwotICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJhdCBibG9jayA6IiA8PCBvZmZzZXQgLyBCTE9DS19TWiA8PCAiIG9mZnNldDoiIDw8IG9mZnNldCAlIEJMT0NLX1NaOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgV29ya2VyVGhyZWFkOjpHZXRSZWFkQWhlYWRQb3B1bGF0ZWRCdWZmZXIoY29uc3QgQ293T3BlcmF0aW9uKiBjb3dfb3ApIHsKLSAgICB2b2lkKiBidWZmZXIgPSBidWZzaW5rXy5HZXRQYXlsb2FkQnVmZmVyKEJMT0NLX1NaKTsKLSAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKLSAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJHZXRSZWFkQWhlYWRQb3B1bGF0ZWRCdWZmZXI6IEZhaWxlZCB0byBnZXQgcGF5bG9hZCBidWZmZXIiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKCFzbmFwdXNlcmRfLT5HZXRSZWFkQWhlYWRQb3B1bGF0ZWRCdWZmZXIoY293X29wLT5uZXdfYmxvY2ssIGJ1ZmZlcikpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi0vLyBTdGFydCB0aGUgY29weSBvcGVyYXRpb24uIFRoaXMgd2lsbCByZWFkIHRoZSBiYWNraW5nCi0vLyBibG9jayBkZXZpY2Ugd2hpY2ggaXMgcmVwcmVzZW50ZWQgYnkgY293X29wLT5zb3VyY2UuCi1ib29sIFdvcmtlclRocmVhZDo6UHJvY2Vzc0NvcHlPcChjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCkgewotICAgIGlmICghR2V0UmVhZEFoZWFkUG9wdWxhdGVkQnVmZmVyKGNvd19vcCkpIHsKLSAgICAgICAgU05BUF9MT0coREVCVUcpIDw8ICIgR2V0UmVhZEFoZWFkUG9wdWxhdGVkQnVmZmVyIGZhaWxlZC4uLiIKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgbmV3X2Jsb2NrOiAiIDw8IGNvd19vcC0+bmV3X2Jsb2NrOwotICAgICAgICBpZiAoIVJlYWRGcm9tQmFzZURldmljZShjb3dfb3ApKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBXb3JrZXJUaHJlYWQ6OlByb2Nlc3NaZXJvT3AoKSB7Ci0gICAgLy8gWmVybyBvdXQgdGhlIGVudGlyZSBibG9jawotICAgIHZvaWQqIGJ1ZmZlciA9IGJ1ZnNpbmtfLkdldFBheWxvYWRCdWZmZXIoQkxPQ0tfU1opOwotICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgewotICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlByb2Nlc3NaZXJvT3A6IEZhaWxlZCB0byBnZXQgcGF5bG9hZCBidWZmZXIiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgbWVtc2V0KGJ1ZmZlciwgMCwgQkxPQ0tfU1opOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFdvcmtlclRocmVhZDo6UHJvY2Vzc0Nvd09wKGNvbnN0IENvd09wZXJhdGlvbiogY293X29wKSB7Ci0gICAgaWYgKGNvd19vcCA9PSBudWxscHRyKSB7Ci0gICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUHJvY2Vzc0Nvd09wOiBJbnZhbGlkIGNvd19vcCI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKGNvd19vcC0+dHlwZSkgewotICAgICAgICBjYXNlIGtDb3dSZXBsYWNlT3A6IHsKLSAgICAgICAgICAgIHJldHVybiBQcm9jZXNzUmVwbGFjZU9wKGNvd19vcCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtDb3daZXJvT3A6IHsKLSAgICAgICAgICAgIHJldHVybiBQcm9jZXNzWmVyb09wKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtDb3dDb3B5T3A6IHsKLSAgICAgICAgICAgIHJldHVybiBQcm9jZXNzQ29weU9wKGNvd19vcCk7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlVuc3VwcG9ydGVkIG9wZXJhdGlvbi10eXBlIGZvdW5kOiAiIDw8IGNvd19vcC0+dHlwZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWludCBXb3JrZXJUaHJlYWQ6OlJlYWRVbmFsaWduZWRTZWN0b3IoCi0gICAgICAgIHNlY3Rvcl90IHNlY3Rvciwgc2l6ZV90IHNpemUsCi0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzZWN0b3JfdCwgY29uc3QgQ293T3BlcmF0aW9uKj4+OjppdGVyYXRvciYgaXQpIHsKLSAgICBzaXplX3Qgc2tpcF9zZWN0b3Jfc2l6ZSA9IDA7Ci0KLSAgICBTTkFQX0xPRyhERUJVRykgPDwgIlJlYWRVbmFsaWduZWRTZWN0b3I6IHNlY3RvciAiIDw8IHNlY3RvciA8PCAiIHNpemU6ICIgPDwgc2l6ZQotICAgICAgICAgICAgICAgICAgICA8PCAiIEFsaWduZWQgc2VjdG9yOiAiIDw8IGl0LT5maXJzdDsKLQotICAgIGlmICghUHJvY2Vzc0Nvd09wKGl0LT5zZWNvbmQpKSB7Ci0gICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUmVhZFVuYWxpZ25lZFNlY3RvcjogIiA8PCBzZWN0b3IgPDwgIiBmYWlsZWQgb2Ygc2l6ZTogIiA8PCBzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiIEFsaWduZWQgc2VjdG9yOiAiIDw8IGl0LT5maXJzdDsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGludCBudW1fc2VjdG9yc19za2lwID0gc2VjdG9yIC0gaXQtPmZpcnN0OwotCi0gICAgaWYgKG51bV9zZWN0b3JzX3NraXAgPiAwKSB7Ci0gICAgICAgIHNraXBfc2VjdG9yX3NpemUgPSBudW1fc2VjdG9yc19za2lwIDw8IFNFQ1RPUl9TSElGVDsKLSAgICAgICAgY2hhciogYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYnVmc2lua18uR2V0QnVmUHRyKCkpOwotICAgICAgICBzdHJ1Y3QgZG1fdXNlcl9tZXNzYWdlKiBtc2cgPSAoc3RydWN0IGRtX3VzZXJfbWVzc2FnZSopKCYoYnVmZmVyWzBdKSk7Ci0KLSAgICAgICAgaWYgKHNraXBfc2VjdG9yX3NpemUgPT0gQkxPQ0tfU1opIHsKLSAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiSW52YWxpZCB1bi1hbGlnbmVkIElPIHJlcXVlc3QgYXQgc2VjdG9yOiAiIDw8IHNlY3RvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgQmFzZS1zZWN0b3I6ICIgPDwgaXQtPmZpcnN0OwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgbWVtbW92ZShtc2ctPnBheWxvYWQuYnVmLCAoY2hhciopbXNnLT5wYXlsb2FkLmJ1ZiArIHNraXBfc2VjdG9yX3NpemUsCi0gICAgICAgICAgICAgICAgKEJMT0NLX1NaIC0gc2tpcF9zZWN0b3Jfc2l6ZSkpOwotICAgIH0KLQotICAgIGJ1ZnNpbmtfLlJlc2V0QnVmZmVyT2Zmc2V0KCk7Ci0gICAgcmV0dXJuIHN0ZDo6bWluKHNpemUsIChCTE9DS19TWiAtIHNraXBfc2VjdG9yX3NpemUpKTsKLX0KLQotLyoKLSAqIFJlYWQgdGhlIGRhdGEgZm9yIGEgZ2l2ZW4gQ09XIE9wZXJhdGlvbi4KLSAqCi0gKiBLZXJuZWwgY2FuIGlzc3VlIElPIGF0IGEgc2VjdG9yIGdyYW51bGFyaXR5LgotICogSGVuY2UsIGFuIElPIG1heSBlbmQgdXAgd2l0aCByZWFkaW5nIHBhcnRpYWwKLSAqIGRhdGEgZnJvbSBhIENPVyBvcGVyYXRpb24gb3Igd2UgbWF5IGFsc28KLSAqIGVuZCB1cCB3aXRoIGludGVyc3BlcnNlZCByZXF1ZXN0IGJldHdlZW4KLSAqIHR3byBDT1cgb3BlcmF0aW9ucy4KLSAqCi0gKi8KLWludCBXb3JrZXJUaHJlYWQ6OlJlYWREYXRhKHNlY3Rvcl90IHNlY3Rvciwgc2l6ZV90IHNpemUpIHsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c2VjdG9yX3QsIGNvbnN0IENvd09wZXJhdGlvbio+PiYgY2h1bmtfdmVjID0gc25hcHVzZXJkXy0+R2V0Q2h1bmtWZWMoKTsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c2VjdG9yX3QsIGNvbnN0IENvd09wZXJhdGlvbio+Pjo6aXRlcmF0b3IgaXQ7Ci0gICAgLyoKLSAgICAgKiBjaHVua19tYXAgc3RvcmVzIENPVyBvcGVyYXRpb24gYXQgNGsgZ3JhbnVsYXJpdHkuCi0gICAgICogSWYgdGhlIHJlcXVlc3RlZCBJTyB3aXRoIHRoZSBzZWN0b3IgZmFsbHMgb24gdGhlIDRrCi0gICAgICogYm91bmRhcnksIHRoZW4gd2UgY2FuIHJlYWQgdGhlIENPVyBvcCBkaXJlY3RseSB3aXRob3V0Ci0gICAgICogYW55IGlzc3VlLgotICAgICAqCi0gICAgICogSG93ZXZlciwgaWYgdGhlIHJlcXVlc3RlZCBzZWN0b3IgaXMgbm90IDRLIGFsaWduZWQsCi0gICAgICogdGhlbiB3ZSB3aWxsIGhhdmUgdGhlIGZpbmQgdGhlIG5lYXJlc3QgQ09XIG9wZXJhdGlvbgotICAgICAqIGFuZCBjaG9wIHRoZSA0SyBibG9jayB0byBmZXRjaCB0aGUgcmVxdWVzdGVkIHNlY3Rvci4KLSAgICAgKi8KLSAgICBpdCA9IHN0ZDo6bG93ZXJfYm91bmQoY2h1bmtfdmVjLmJlZ2luKCksIGNodW5rX3ZlYy5lbmQoKSwgc3RkOjptYWtlX3BhaXIoc2VjdG9yLCBudWxscHRyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgU25hcHVzZXJkOjpjb21wYXJlKTsKLQotICAgIGJvb2wgcmVhZF9lbmRfb2ZfZGV2aWNlID0gZmFsc2U7Ci0gICAgaWYgKGl0ID09IGNodW5rX3ZlYy5lbmQoKSkgewotICAgICAgICAvLyB8LS0tLS0tLXwtLS0tLS0tfC0tLS0tLS18Ci0gICAgICAgIC8vIDAgICAgICAgMSAgICAgICAyICAgICAgIDMKLSAgICAgICAgLy8KLSAgICAgICAgLy8gQmxvY2sgMCAtIG9wIDEKLSAgICAgICAgLy8gQmxvY2sgMSAtIG9wIDIKLSAgICAgICAgLy8gQmxvY2sgMiAtIG9wIDMKLSAgICAgICAgLy8KLSAgICAgICAgLy8gY2h1bmtfdmVjIHdpbGwgaGF2ZSBibG9jayAwLCAxLCAyIHdoaWNoIG1hcHMgdG8gcmVsYXZhbnQgQ09XIG9wcy4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gRWFjaCBibG9jayBpcyA0ayBieXRlcy4gVGh1cywgdGhlIGxhc3QgYmxvY2sgd2lsbCBzcGFuIDggc2VjdG9ycwotICAgICAgICAvLyByYW5naW5nIHRpbGwgYmxvY2sgMyAoSG93ZXZlciwgYmxvY2sgMyB3b24ndCBiZSBpbiBjaHVua192ZWMgYXMKLSAgICAgICAgLy8gaXQgZG9lc24ndCBoYXZlIGFueSBtYXBwaW5nIHRvIENPVyBvcHMuIE5vdywgaWYgd2UgZ2V0IGFuIEkvTyByZXF1ZXN0IGZvciBhIHNlY3RvcgotICAgICAgICAvLyBzcGFubmluZyBiZXR3ZWVuIGJsb2NrIDIgYW5kIGJsb2NrIDMsIHdlIG5lZWQgdG8gc3RlcCBiYWNrCi0gICAgICAgIC8vIGFuZCBnZXQgaG9sZCBvZiB0aGUgbGFzdCBlbGVtZW50LgotICAgICAgICAvLwotICAgICAgICAvLyBBZGRpdGlvbmFsbHksIGRtLXNuYXBzaG90IG1ha2VzIHN1cmUgdGhhdCBJL08gcmVxdWVzdCBiZXlvbmQgYmxvY2sgMwotICAgICAgICAvLyB3aWxsIG5vdCBiZSByb3V0ZWQgdG8gdGhlIGRhZW1vbi4gSGVuY2UsIGl0IGlzIHNhZmUgdG8gYXNzdW1lIHRoYXQKLSAgICAgICAgLy8gaWYgYSBzZWN0b3IgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgY2h1bmtfdmVjLCB0aGUgSS9PIGZhbGxzIGluIHRoZQotICAgICAgICAvLyBlbmQgb2YgcmVnaW9uLgotICAgICAgICBpdCA9IHN0ZDo6cHJldihjaHVua192ZWMuZW5kKCkpOwotICAgICAgICByZWFkX2VuZF9vZl9kZXZpY2UgPSB0cnVlOwotICAgIH0KLQotICAgIC8vIFdlIGRpZG4ndCBmaW5kIHRoZSByZXF1aXJlZCBzZWN0b3I7IGhlbmNlIGZpbmQgdGhlIHByZXZpb3VzIHNlY3RvcgotICAgIC8vIGFzIGxvd2VyX2JvdW5kIHdpbGwgZ2l2ZXMgdXMgdGhlIHZhbHVlIGdyZWF0ZXIgdGhhbgotICAgIC8vIHRoZSByZXF1ZXN0ZWQgc2VjdG9yCi0gICAgaWYgKGl0LT5maXJzdCAhPSBzZWN0b3IpIHsKLSAgICAgICAgaWYgKGl0ICE9IGNodW5rX3ZlYy5iZWdpbigpICYmICFyZWFkX2VuZF9vZl9kZXZpY2UpIHsKLSAgICAgICAgICAgIC0taXQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBJZiB0aGUgSU8gaXMgc3Bhbm5lZCBiZXR3ZWVuIHR3byBDT1cgb3BlcmF0aW9ucywKLSAgICAgICAgICogc3BsaXQgdGhlIElPIGludG8gdHdvIHBhcnRzOgotICAgICAgICAgKgotICAgICAgICAgKiAxOiBSZWFkIHRoZSBmaXJzdCBwYXJ0IGZyb20gdGhlIHNpbmdsZSBDT1cgb3AKLSAgICAgICAgICogMjogUmVhZCB0aGUgc2Vjb25kIHBhcnQgZnJvbSB0aGUgbmV4dCBDT1cgb3AuCi0gICAgICAgICAqCi0gICAgICAgICAqIEV4OiBMZXQncyBzYXkgd2UgaGF2ZSBhIDEwMjQgQnl0ZXMgSU8gcmVxdWVzdC4KLSAgICAgICAgICoKLSAgICAgICAgICogMCAgICAgICBDT1cgT1AtMSAgNDA5NiAgICAgQ09XIE9QLTIgIDgxOTIKLSAgICAgICAgICogfCoqKioqKioqKioqKioqKioqKnwqKioqKioqKioqKioqKioqKioqfAotICAgICAgICAgKiAgICAgICAgICAgICAgfCoqKioqfCoqKioqfAotICAgICAgICAgKiAgICAgICAgICAgMzU4NCAgICAgICAgICAgNDYwOAotICAgICAgICAgKiAgICAgICAgICAgICAgPC0gMTAyNEIgLSA+Ci0gICAgICAgICAqCi0gICAgICAgICAqIFdlIGhhdmUgdHdvIENPVyBvcGVyYXRpb25zIHdoaWNoIGFyZSA0ayBibG9ja3MuCi0gICAgICAgICAqIFRoZSBJTyBpcyByZXF1ZXN0ZWQgZm9yIDEwMjQgQnl0ZXMgd2hpY2ggYXJlIHNwYW5uZWQKLSAgICAgICAgICogYmV0d2VlbiB0d28gQ09XIG9wZXJhdGlvbnMuIFdlIHdpbGwgc3BsaXQgdGhpcyBJTwotICAgICAgICAgKiBpbnRvIHR3byBwYXJ0czoKLSAgICAgICAgICoKLSAgICAgICAgICogMTogSU8gb2Ygc2l6ZSA1MTJCIGZyb20gb2Zmc2V0IDM1ODQgYnl0ZXMgKENPVyBPUC0xKQotICAgICAgICAgKiAyOiBJTyBvZiBzaXplIDUxMkIgZnJvbSBvZmZzZXQgNDA5NiBieXRlcyAoQ09XIE9QLTIpCi0gICAgICAgICAqLwotICAgICAgICByZXR1cm4gUmVhZFVuYWxpZ25lZFNlY3RvcihzZWN0b3IsIHNpemUsIGl0KTsKLSAgICB9Ci0KLSAgICBpbnQgbnVtX29wcyA9IERJVl9ST1VORF9VUChzaXplLCBCTE9DS19TWik7Ci0gICAgc2VjdG9yX3QgcmVhZF9zZWN0b3IgPSBzZWN0b3I7Ci0gICAgd2hpbGUgKG51bV9vcHMpIHsKLSAgICAgICAgLy8gV2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgcmVhZHMgYXJlCi0gICAgICAgIC8vIHNlcXVlbnRpYWw7IHRoZXJlIHNob3VsZG4ndCBiZSBhIGRhdGEKLSAgICAgICAgLy8gcmVxdWVzdCBtZXJnZWQgd2l0aCBhIG1ldGFkYXRhIElPLgotICAgICAgICBpZiAoaXQtPmZpcnN0ICE9IHJlYWRfc2VjdG9yKSB7Ci0gICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIkludmFsaWQgSU8gcmVxdWVzdDogcmVhZF9zZWN0b3I6ICIgPDwgcmVhZF9zZWN0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGNvdy1vcCBzZWN0b3I6ICIgPDwgaXQtPmZpcnN0OwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9IGVsc2UgaWYgKCFQcm9jZXNzQ293T3AoaXQtPnNlY29uZCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBudW1fb3BzIC09IDE7Ci0gICAgICAgIHJlYWRfc2VjdG9yICs9IChCTE9DS19TWiA+PiBTRUNUT1JfU0hJRlQpOwotCi0gICAgICAgIGl0Kys7Ci0KLSAgICAgICAgaWYgKGl0ID09IGNodW5rX3ZlYy5lbmQoKSAmJiBudW1fb3BzKSB7Ci0gICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIkludmFsaWQgSU8gcmVxdWVzdCBhdCBzZWN0b3IgIiA8PCBzZWN0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIENPVyBvcHMgY29tcGxldGVkOyBwZW5kaW5nIHJlYWQtcmVxdWVzdDogIiA8PCBudW1fb3BzOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIC8vIFVwZGF0ZSB0aGUgYnVmZmVyIG9mZnNldAotICAgICAgICBidWZzaW5rXy5VcGRhdGVCdWZmZXJPZmZzZXQoQkxPQ0tfU1opOwotICAgIH0KLQotICAgIC8vIFJlc2V0IHRoZSBidWZmZXIgb2Zmc2V0Ci0gICAgYnVmc2lua18uUmVzZXRCdWZmZXJPZmZzZXQoKTsKLSAgICByZXR1cm4gc2l6ZTsKLX0KLQotLyoKLSAqIGRtLXNuYXAgZG9lcyBwcmVmZXRjaCByZWFkcyB3aGlsZSByZWFkaW5nIGRpc2stZXhjZXB0aW9ucy4KLSAqIEJ5IGRlZmF1bHQsIHByZWZldGNoIHZhbHVlIGlzIHNldCB0byAxMjsgdGhpcyBtZWFucyB0aGF0Ci0gKiBkbS1zbmFwIHdpbGwgaXNzdWUgMTIgYXJlYXMgd2hlcmVpbiBlYWNoIGFyZWEgaXMgYSA0ayBwYWdlCi0gKiBvZiBkaXNrLWV4Y2VwdGlvbnMuCi0gKgotICogSWYgZHVyaW5nIHByZWZldGNoLCBpZiB0aGUgY2h1bmstaWQgc2VlbiBpcyBiZXlvbmQgdGhlCi0gKiBhY3R1YWwgbnVtYmVyIG9mIG1ldGFkYXRhIHBhZ2UsIGZpbGwgdGhlIGJ1ZmZlciB3aXRoIHplcm8uCi0gKiBXaGVuIGRtLXNuYXAgc3RhcnRzIHBhcnNpbmcgdGhlIGJ1ZmZlciwgaXQgd2lsbCBzdG9wCi0gKiByZWFkaW5nIG1ldGFkYXRhIHBhZ2Ugb25jZSB0aGUgYnVmZmVyIGNvbnRlbnQgaXMgemVyby4KLSAqLwotYm9vbCBXb3JrZXJUaHJlYWQ6Olplcm9maWxsRGlza0V4Y2VwdGlvbnMoc2l6ZV90IHJlYWRfc2l6ZSkgewotICAgIHNpemVfdCBzaXplID0gZXhjZXB0aW9uc19wZXJfYXJlYV8gKiBzaXplb2Yoc3RydWN0IGRpc2tfZXhjZXB0aW9uKTsKLQotICAgIGlmIChyZWFkX3NpemUgPiBzaXplKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkKiBidWZmZXIgPSBidWZzaW5rXy5HZXRQYXlsb2FkQnVmZmVyKHNpemUpOwotICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgewotICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlplcm9maWxsRGlza0V4Y2VwdGlvbnM6IEZhaWxlZCB0byBnZXQgcGF5bG9hZCBidWZmZXIiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgbWVtc2V0KGJ1ZmZlciwgMCwgc2l6ZSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi0gKiBBIGRpc2sgZXhjZXB0aW9uIGlzIGEgc2ltcGxlIG1hcHBpbmcgb2Ygb2xkX2NodW5rIHRvIG5ld19jaHVuay4KLSAqIFdoZW4gZG0tc25hcHNob3QgZGV2aWNlIGlzIGNyZWF0ZWQsIGtlcm5lbCByZXF1ZXN0cyB0aGVzZSBtYXBwaW5nLgotICoKLSAqIEVhY2ggZGlzayBleGNlcHRpb24gaXMgb2Ygc2l6ZSAxNiBieXRlcy4gVGh1cyBhIHNpbmdsZSA0ayBwYWdlIGNhbgotICogaGF2ZToKLSAqCi0gKiBleGNlcHRpb25zX3Blcl9hcmVhXyA9IDQwOTYvMTYgPSAyNTYuIFRoaXMgZW50aXJlIDRrIHBhZ2UKLSAqIGlzIGNvbnNpZGVyZWQgYSBtZXRhZGF0YSBwYWdlIGFuZCBpdCBpcyByZXByZXNlbnRlZCBieSBjaHVuayBJRC4KLSAqCi0gKiBDb252ZXJ0IHRoZSBjaHVuayBJRCB0byBpbmRleCBpbnRvIHRoZSB2ZWN0b3Igd2hpY2ggZ2l2ZXMgdXMKLSAqIHRoZSBtZXRhZGF0YSBwYWdlLgotICovCi1ib29sIFdvcmtlclRocmVhZDo6UmVhZERpc2tFeGNlcHRpb25zKGNodW5rX3QgY2h1bmssIHNpemVfdCByZWFkX3NpemUpIHsKLSAgICB1aW50MzJfdCBzdHJpZGUgPSBleGNlcHRpb25zX3Blcl9hcmVhXyArIDE7Ci0gICAgc2l6ZV90IHNpemU7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4+JiB2ZWMgPSBzbmFwdXNlcmRfLT5HZXRNZXRhZGF0YVZlYygpOwotCi0gICAgLy8gQ2h1bmtJRCB0byB2ZWN0b3IgaW5kZXgKLSAgICBsbGRpdl90IGRpdnJlc3VsdCA9IGxsZGl2KGNodW5rLCBzdHJpZGUpOwotCi0gICAgaWYgKGRpdnJlc3VsdC5xdW90IDwgdmVjLnNpemUoKSkgewotICAgICAgICBzaXplID0gZXhjZXB0aW9uc19wZXJfYXJlYV8gKiBzaXplb2Yoc3RydWN0IGRpc2tfZXhjZXB0aW9uKTsKLQotICAgICAgICBpZiAocmVhZF9zaXplICE9IHNpemUpIHsKLSAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUmVhZERpc2tFeGNlcHRpb25zOiByZWFkX3NpemU6ICIgPDwgcmVhZF9zaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBkb2VzIG5vdCBtYXRjaCB3aXRoIHNpemU6ICIgPDwgc2l6ZTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQqIGJ1ZmZlciA9IGJ1ZnNpbmtfLkdldFBheWxvYWRCdWZmZXIoc2l6ZSk7Ci0gICAgICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJSZWFkRGlza0V4Y2VwdGlvbnM6IEZhaWxlZCB0byBnZXQgcGF5bG9hZCBidWZmZXIgb2Ygc2l6ZTogIiA8PCBzaXplOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgbWVtY3B5KGJ1ZmZlciwgdmVjW2RpdnJlc3VsdC5xdW90XS5nZXQoKSwgc2l6ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIFplcm9maWxsRGlza0V4Y2VwdGlvbnMocmVhZF9zaXplKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotbG9mZl90IFdvcmtlclRocmVhZDo6R2V0TWVyZ2VTdGFydE9mZnNldCh2b2lkKiBtZXJnZWRfYnVmZmVyLCB2b2lkKiB1bm1lcmdlZF9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogdW5tZXJnZWRfZXhjZXB0aW9ucykgewotICAgIGxvZmZfdCBvZmZzZXQgPSAwOwotICAgICp1bm1lcmdlZF9leGNlcHRpb25zID0gMDsKLQotICAgIHdoaWxlICgqdW5tZXJnZWRfZXhjZXB0aW9ucyA8PSBleGNlcHRpb25zX3Blcl9hcmVhXykgewotICAgICAgICBzdHJ1Y3QgZGlza19leGNlcHRpb24qIG1lcmdlZF9kZSA9Ci0gICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3QgZGlza19leGNlcHRpb24qPigoY2hhciopbWVyZ2VkX2J1ZmZlciArIG9mZnNldCk7Ci0gICAgICAgIHN0cnVjdCBkaXNrX2V4Y2VwdGlvbiogY293X2RlID0KLSAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHN0cnVjdCBkaXNrX2V4Y2VwdGlvbio+KChjaGFyKil1bm1lcmdlZF9idWZmZXIgKyBvZmZzZXQpOwotCi0gICAgICAgIC8vIFVubWVyZ2VkIG9wIGJ5IHRoZSBrZXJuZWwKLSAgICAgICAgaWYgKG1lcmdlZF9kZS0+b2xkX2NodW5rICE9IDAgfHwgbWVyZ2VkX2RlLT5uZXdfY2h1bmsgIT0gMCkgewotICAgICAgICAgICAgaWYgKCEobWVyZ2VkX2RlLT5vbGRfY2h1bmsgPT0gY293X2RlLT5vbGRfY2h1bmspKSB7Ci0gICAgICAgICAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJHZXRNZXJnZVN0YXJ0T2Zmc2V0OiBtZXJnZWRfZGUtPm9sZF9jaHVuazogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBtZXJnZWRfZGUtPm9sZF9jaHVuawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiY293X2RlLT5vbGRfY2h1bms6ICIgPDwgY293X2RlLT5vbGRfY2h1bms7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIShtZXJnZWRfZGUtPm5ld19jaHVuayA9PSBjb3dfZGUtPm5ld19jaHVuaykpIHsKLSAgICAgICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIkdldE1lcmdlU3RhcnRPZmZzZXQ6IG1lcmdlZF9kZS0+bmV3X2NodW5rOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IG1lcmdlZF9kZS0+bmV3X2NodW5rCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJjb3dfZGUtPm5ld19jaHVuazogIiA8PCBjb3dfZGUtPm5ld19jaHVuazsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9mZnNldCArPSBzaXplb2Yoc3RydWN0IGRpc2tfZXhjZXB0aW9uKTsKLSAgICAgICAgICAgICp1bm1lcmdlZF9leGNlcHRpb25zICs9IDE7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIFNOQVBfTE9HKERFQlVHKSA8PCAiVW5tZXJnZWRfRXhjZXB0aW9uczogIiA8PCAqdW5tZXJnZWRfZXhjZXB0aW9ucyA8PCAiIE9mZnNldDogIiA8PCBvZmZzZXQ7Ci0gICAgcmV0dXJuIG9mZnNldDsKLX0KLQotaW50IFdvcmtlclRocmVhZDo6R2V0TnVtYmVyT2ZNZXJnZWRPcHModm9pZCogbWVyZ2VkX2J1ZmZlciwgdm9pZCogdW5tZXJnZWRfYnVmZmVyLCBsb2ZmX3Qgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVubWVyZ2VkX2V4Y2VwdGlvbnMsIGJvb2wqIG9yZGVyZWRfb3AsIGJvb2wqIGNvbW1pdCkgewotICAgIGludCBtZXJnZWRfb3BzX2N1cl9pdGVyID0gMDsKLSAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDY0X3QsIHZvaWQqPiYgcmVhZF9haGVhZF9idWZmZXJfbWFwID0gc25hcHVzZXJkXy0+R2V0UmVhZEFoZWFkTWFwKCk7Ci0gICAgKm9yZGVyZWRfb3AgPSBmYWxzZTsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c2VjdG9yX3QsIGNvbnN0IENvd09wZXJhdGlvbio+PiYgY2h1bmtfdmVjID0gc25hcHVzZXJkXy0+R2V0Q2h1bmtWZWMoKTsKLQotICAgIC8vIEZpbmQgdGhlIG9wZXJhdGlvbnMgd2hpY2ggYXJlIG1lcmdlZCBpbiB0aGlzIGN5Y2xlLgotICAgIHdoaWxlICgodW5tZXJnZWRfZXhjZXB0aW9ucyArIG1lcmdlZF9vcHNfY3VyX2l0ZXIpIDwgZXhjZXB0aW9uc19wZXJfYXJlYV8pIHsKLSAgICAgICAgc3RydWN0IGRpc2tfZXhjZXB0aW9uKiBtZXJnZWRfZGUgPQotICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IGRpc2tfZXhjZXB0aW9uKj4oKGNoYXIqKW1lcmdlZF9idWZmZXIgKyBvZmZzZXQpOwotICAgICAgICBzdHJ1Y3QgZGlza19leGNlcHRpb24qIGNvd19kZSA9Ci0gICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3QgZGlza19leGNlcHRpb24qPigoY2hhciopdW5tZXJnZWRfYnVmZmVyICsgb2Zmc2V0KTsKLQotICAgICAgICBpZiAoIShtZXJnZWRfZGUtPm5ld19jaHVuayA9PSAwKSkgewotICAgICAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJHZXROdW1iZXJPZk1lcmdlZE9wczogSW52YWxpZCBuZXctY2h1bms6ICIgPDwgbWVyZ2VkX2RlLT5uZXdfY2h1bms7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIShtZXJnZWRfZGUtPm9sZF9jaHVuayA9PSAwKSkgewotICAgICAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJHZXROdW1iZXJPZk1lcmdlZE9wczogSW52YWxpZCBvbGQtY2h1bms6ICIgPDwgbWVyZ2VkX2RlLT5vbGRfY2h1bms7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY293X2RlLT5uZXdfY2h1bmsgIT0gMCkgewotICAgICAgICAgICAgbWVyZ2VkX29wc19jdXJfaXRlciArPSAxOwotICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemVvZihzdHJ1Y3QgZGlza19leGNlcHRpb24pOwotICAgICAgICAgICAgYXV0byBpdCA9IHN0ZDo6bG93ZXJfYm91bmQoY2h1bmtfdmVjLmJlZ2luKCksIGNodW5rX3ZlYy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKENodW5rVG9TZWN0b3IoY293X2RlLT5uZXdfY2h1bmspLCBudWxscHRyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNuYXB1c2VyZDo6Y29tcGFyZSk7Ci0KLSAgICAgICAgICAgIGlmICghKGl0ICE9IGNodW5rX3ZlYy5lbmQoKSkpIHsKLSAgICAgICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlNlY3RvciBub3QgZm91bmQ6ICIgPDwgQ2h1bmtUb1NlY3Rvcihjb3dfZGUtPm5ld19jaHVuayk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIShpdC0+Zmlyc3QgPT0gQ2h1bmtUb1NlY3Rvcihjb3dfZGUtPm5ld19jaHVuaykpKSB7Ci0gICAgICAgICAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJJbnZhbGlkIHNlY3RvcjogIiA8PCBDaHVua1RvU2VjdG9yKGNvd19kZS0+bmV3X2NodW5rKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCA9IGl0LT5zZWNvbmQ7Ci0KLSAgICAgICAgICAgIGlmIChzbmFwdXNlcmRfLT5Jc1JlYWRBaGVhZEZlYXR1cmVQcmVzZW50KCkgJiYgSXNPcmRlcmVkT3AoKmNvd19vcCkpIHsKLSAgICAgICAgICAgICAgICAqb3JkZXJlZF9vcCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgLy8gRXZlcnkgc2luZ2xlIG9yZGVyZWQgb3BlcmF0aW9uIGhhcyB0byBjb21lIGZyb20gcmVhZC1haGVhZAotICAgICAgICAgICAgICAgIC8vIGNhY2hlLgotICAgICAgICAgICAgICAgIGlmIChyZWFkX2FoZWFkX2J1ZmZlcl9tYXAuZmluZChjb3dfb3AtPm5ld19ibG9jaykgPT0gcmVhZF9haGVhZF9idWZmZXJfbWFwLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgQmxvY2s6ICIgPDwgY293X29wLT5uZXdfYmxvY2sgPDwgIiBub3QgZm91bmQgaW4gcmVhZC1haGVhZCBjYWNoZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIFNvdXJjZTogIiA8PCBjb3dfb3AtPnNvdXJjZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgZmluYWwgYmxvY2sgbWVyZ2VkIGluIHRoZSByZWFkLWFoZWFkIGJ1ZmZlcgotICAgICAgICAgICAgICAgIC8vIHJlZ2lvbiwgbm90aWZ5IHRoZSByZWFkLWFoZWFkIHRocmVhZCB0byBtYWtlIGZvcndhcmQKLSAgICAgICAgICAgICAgICAvLyBwcm9ncmVzcwotICAgICAgICAgICAgICAgIGlmIChjb3dfb3AtPm5ld19ibG9jayA9PSBzbmFwdXNlcmRfLT5HZXRGaW5hbEJsb2NrTWVyZ2VkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgKmNvbW1pdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB6ZXJvIG91dCB0byBpbmRpY2F0ZSB0aGF0IG9wZXJhdGlvbiBpcyBtZXJnZWQuCi0gICAgICAgICAgICBjb3dfZGUtPm9sZF9jaHVuayA9IDA7Ci0gICAgICAgICAgICBjb3dfZGUtPm5ld19jaHVuayA9IDA7Ci0gICAgICAgIH0gZWxzZSBpZiAoY293X2RlLT5vbGRfY2h1bmsgPT0gMCkgewotICAgICAgICAgICAgLy8gQWxyZWFkeSBtZXJnZWQgb3AgaW4gcHJldmlvdXMgaXRlcmF0aW9uIG9yCi0gICAgICAgICAgICAvLyBUaGlzIGNvdWxkIGFsc28gcmVwcmVzZW50IGEgcGFydGlhbGx5IGZpbGxlZCBhcmVhLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIElmIHRoZSBvcCB3YXMgbWVyZ2VkIGluIHByZXZpb3VzIGN5Y2xlLCB3ZSBkb24ndCBoYXZlCi0gICAgICAgICAgICAvLyB0byBjb3VudCB0aGVtLgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIkVycm9yIGluIG1lcmdlIG9wZXJhdGlvbi4gRm91bmQgaW52YWxpZCBtZXRhZGF0YTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgbWVyZ2VkX2RlLW9sZC1jaHVuazogIiA8PCBtZXJnZWRfZGUtPm9sZF9jaHVuawotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgbWVyZ2VkX2RlLW5ldy1jaHVuazogIiA8PCBtZXJnZWRfZGUtPm5ld19jaHVuawotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgY293X2RlLW9sZC1jaHVuazogIiA8PCBjb3dfZGUtPm9sZF9jaHVuawotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgY293X2RlLW5ldy1jaHVuazogIiA8PCBjb3dfZGUtPm5ld19jaHVuawotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgdW5tZXJnZWRfZXhjZXB0aW9uczogIiA8PCB1bm1lcmdlZF9leGNlcHRpb25zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBtZXJnZWRfb3BzX2N1cl9pdGVyOiAiIDw8IG1lcmdlZF9vcHNfY3VyX2l0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIG9mZnNldDogIiA8PCBvZmZzZXQ7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1lcmdlZF9vcHNfY3VyX2l0ZXI7Ci19Ci0KLWJvb2wgV29ya2VyVGhyZWFkOjpQcm9jZXNzTWVyZ2VDb21wbGV0ZShjaHVua190IGNodW5rLCB2b2lkKiBidWZmZXIpIHsKLSAgICB1aW50MzJfdCBzdHJpZGUgPSBleGNlcHRpb25zX3Blcl9hcmVhXyArIDE7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4+JiB2ZWMgPSBzbmFwdXNlcmRfLT5HZXRNZXRhZGF0YVZlYygpOwotICAgIGJvb2wgb3JkZXJlZF9vcCA9IGZhbHNlOwotICAgIGJvb2wgY29tbWl0ID0gZmFsc2U7Ci0KLSAgICAvLyBDaHVua0lEIHRvIHZlY3RvciBpbmRleAotICAgIGxsZGl2X3QgZGl2cmVzdWx0ID0gbGxkaXYoY2h1bmssIHN0cmlkZSk7Ci0KLSAgICBpZiAoIShkaXZyZXN1bHQucXVvdCA8IHZlYy5zaXplKCkpKSB7Ci0gICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUHJvY2Vzc01lcmdlQ29tcGxldGU6IEludmFsaWQgY2h1bms6ICIgPDwgY2h1bmsKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgTWV0YWRhdGEtSW5kZXg6ICIgPDwgZGl2cmVzdWx0LnF1b3QgPDwgIiBBcmVhLXNpemU6ICIgPDwgdmVjLnNpemUoKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIFNOQVBfTE9HKERFQlVHKSA8PCAiUHJvY2Vzc01lcmdlQ29tcGxldGU6IGNodW5rOiAiIDw8IGNodW5rCi0gICAgICAgICAgICAgICAgICAgIDw8ICIgTWV0YWRhdGEtSW5kZXg6ICIgPDwgZGl2cmVzdWx0LnF1b3Q7Ci0KLSAgICBpbnQgdW5tZXJnZWRfZXhjZXB0aW9ucyA9IDA7Ci0gICAgbG9mZl90IG9mZnNldCA9IEdldE1lcmdlU3RhcnRPZmZzZXQoYnVmZmVyLCB2ZWNbZGl2cmVzdWx0LnF1b3RdLmdldCgpLCAmdW5tZXJnZWRfZXhjZXB0aW9ucyk7Ci0KLSAgICBpZiAob2Zmc2V0IDwgMCkgewotICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIkdldE1lcmdlU3RhcnRPZmZzZXQgZmFpbGVkOiB1bm1lcmdlZF9leGNlcHRpb25zOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCB1bm1lcmdlZF9leGNlcHRpb25zOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaW50IG1lcmdlZF9vcHNfY3VyX2l0ZXIgPSBHZXROdW1iZXJPZk1lcmdlZE9wcyhidWZmZXIsIHZlY1tkaXZyZXN1bHQucXVvdF0uZ2V0KCksIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubWVyZ2VkX2V4Y2VwdGlvbnMsICZvcmRlcmVkX29wLCAmY29tbWl0KTsKLQotICAgIC8vIFRoZXJlIHNob3VsZCBiZSBhdCBsZWFzdCBvbmUgb3BlcmF0aW9uIG1lcmdlZCBpbiB0aGlzIGN5Y2xlCi0gICAgaWYgKCEobWVyZ2VkX29wc19jdXJfaXRlciA+IDApKSB7Ci0gICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiTWVyZ2Ugb3BlcmF0aW9uIGZhaWxlZDogIiA8PCBtZXJnZWRfb3BzX2N1cl9pdGVyOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKG9yZGVyZWRfb3ApIHsKLSAgICAgICAgaWYgKGNvbW1pdCkgewotICAgICAgICAgICAgLy8gUHVzaCB0aGUgZmx1c2hpbmcgbG9naWMgdG8gcmVhZC1haGVhZCB0aHJlYWQgc28gdGhhdCBtZXJnZSB0aHJlYWQKLSAgICAgICAgICAgIC8vIGNhbiBtYWtlIGZvcndhcmQgcHJvZ3Jlc3MuIFN5bmMgd2lsbCBoYXBwZW4gaW4gdGhlIGJhY2tncm91bmQKLSAgICAgICAgICAgIHNuYXB1c2VyZF8tPlN0YXJ0UmVhZEFoZWFkKCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICAvLyBOb24tY29weSBvcHMgYW5kIGFsbCBvcHMgaW4gb2xkZXIgQ09XIGZvcm1hdAotICAgICAgICBpZiAoIXNuYXB1c2VyZF8tPkNvbW1pdE1lcmdlKG1lcmdlZF9vcHNfY3VyX2l0ZXIpKSB7Ci0gICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIkNvbW1pdE1lcmdlIGZhaWxlZC4uLiI7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBTTkFQX0xPRyhERUJVRykgPDwgIk1lcmdlIHN1Y2Nlc3M6ICIgPDwgbWVyZ2VkX29wc19jdXJfaXRlciA8PCAiY2h1bms6ICIgPDwgY2h1bms7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIFJlYWQgSGVhZGVyIGZyb20gZG0tdXNlciBtaXNjIGRldmljZS4gVGhpcyBnaXZlcwotLy8gdXMgdGhlIHNlY3RvciBudW1iZXIgZm9yIHdoaWNoIElPIGlzIGlzc3VlZCBieSBkbS1zbmFwc2hvdCBkZXZpY2UKLWJvb2wgV29ya2VyVGhyZWFkOjpSZWFkRG1Vc2VySGVhZGVyKCkgewotICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhZEZ1bGx5KGN0cmxfZmRfLCBidWZzaW5rXy5HZXRCdWZQdHIoKSwgc2l6ZW9mKHN0cnVjdCBkbV91c2VyX2hlYWRlcikpKSB7Ci0gICAgICAgIGlmIChlcnJubyAhPSBFTk9UQkxLKSB7Ci0gICAgICAgICAgICBTTkFQX1BMT0coRVJST1IpIDw8ICJDb250cm9sLXJlYWQgZmFpbGVkIjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gU2VuZCB0aGUgcGF5bG9hZC9kYXRhIGJhY2sgdG8gZG0tdXNlciBtaXNjIGRldmljZS4KLWJvb2wgV29ya2VyVGhyZWFkOjpXcml0ZURtVXNlclBheWxvYWQoc2l6ZV90IHNpemUsIGJvb2wgaGVhZGVyX3Jlc3BvbnNlKSB7Ci0gICAgc2l6ZV90IHBheWxvYWRfc2l6ZSA9IHNpemU7Ci0gICAgdm9pZCogYnVmID0gYnVmc2lua18uR2V0UGF5bG9hZEJ1ZlB0cigpOwotICAgIGlmIChoZWFkZXJfcmVzcG9uc2UpIHsKLSAgICAgICAgcGF5bG9hZF9zaXplICs9IHNpemVvZihzdHJ1Y3QgZG1fdXNlcl9oZWFkZXIpOwotICAgICAgICBidWYgPSBidWZzaW5rXy5HZXRCdWZQdHIoKTsKLSAgICB9Ci0KLSAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OldyaXRlRnVsbHkoY3RybF9mZF8sIGJ1ZiwgcGF5bG9hZF9zaXplKSkgewotICAgICAgICBTTkFQX1BMT0coRVJST1IpIDw8ICJXcml0ZSB0byBkbS11c2VyIGZhaWxlZCBzaXplOiAiIDw8IHBheWxvYWRfc2l6ZTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFdvcmtlclRocmVhZDo6UmVhZERtVXNlclBheWxvYWQodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgewotICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhZEZ1bGx5KGN0cmxfZmRfLCBidWZmZXIsIHNpemUpKSB7Ci0gICAgICAgIFNOQVBfUExPRyhFUlJPUikgPDwgIlJlYWREbVVzZXJQYXlsb2FkIGZhaWxlZCBzaXplOiAiIDw8IHNpemU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBXb3JrZXJUaHJlYWQ6OkRtdXNlcldyaXRlUmVxdWVzdCgpIHsKLSAgICBzdHJ1Y3QgZG1fdXNlcl9oZWFkZXIqIGhlYWRlciA9IGJ1ZnNpbmtfLkdldEhlYWRlclB0cigpOwotCi0gICAgLy8gZGV2aWNlIG1hcHBlciBoYXMgdGhlIGNhcGFiaWxpdHkgdG8gYWxsb3cKLSAgICAvLyB0YXJnZXRzIHRvIGZsdXNoIHRoZSBjYWNoZSB3aGVuIHdyaXRlcyBhcmUgY29tcGxldGVkLiBUaGlzCi0gICAgLy8gaXMgY29udHJvbGxlZCBieSBlYWNoIHRhcmdldCBieSBhIGZsYWcgImZsdXNoX3N1cHBvcnRlZCIuCi0gICAgLy8gVGhpcyBmbGFnIGlzIHNldCBieSBkbS11c2VyLiBXaGVuIGZsdXNoIGlzIHN1cHBvcnRlZCwKLSAgICAvLyBhIG51bWJlciBvZiB6ZXJvLWxlbmd0aCBiaW8ncyB3aWxsIGJlIHN1Ym1pdHRlZCB0bwotICAgIC8vIHRoZSB0YXJnZXQgZm9yIHRoZSBwdXJwb3NlIG9mIGZsdXNoaW5nIGNhY2hlLiBJdCBpcyB0aGUKLSAgICAvLyByZXNwb25zaWJpbGl0eSBvZiB0aGUgdGFyZ2V0IGRyaXZlciAtIHdoaWNoIGlzIGRtLXVzZXIgaW4gdGhpcwotICAgIC8vIGNhc2UsIHRvIHJlbWFwIHRoZXNlIGJpbydzIHRvIHRoZSB1bmRlcmx5aW5nIGRldmljZS4gU2luY2UsCi0gICAgLy8gdGhlcmUgaXMgbm8gdW5kZXJseWluZyBkZXZpY2UgZm9yIGRtLXVzZXIsIHRoaXMgemVybyBsZW5ndGgKLSAgICAvLyBiaW8ncyBnZXRzIHJvdXRlZCB0byBkYWVtb24uCi0gICAgLy8KLSAgICAvLyBGbHVzaCBvcGVyYXRpb25zIGFyZSBnZW5lcmF0ZWQgcG9zdCBtZXJnZSBieSBkbS1zbmFwIGJ5IGhhdmluZwotICAgIC8vIFJFUV9QUkVGTFVTSCBmbGFnIHNldC4gU25hcHVzZXIgZGFlbW9uIGRvZXNuJ3QgaGF2ZSBhbnl0aGluZwotICAgIC8vIHRvIGZsdXNoIHBlciBzZTsgaGVuY2UsIGp1c3QgcmVzcG9uZCBiYWNrIHdpdGggYSBzdWNjZXNzIG1lc3NhZ2UuCi0gICAgaWYgKGhlYWRlci0+c2VjdG9yID09IDApIHsKLSAgICAgICAgaWYgKCEoaGVhZGVyLT5sZW4gPT0gMCkpIHsKLSAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBoZWFkZXIgbGVuZ3RoIHJlY2VpdmVkIGZyb20gc2VjdG9yIDA6ICIgPDwgaGVhZGVyLT5sZW47Ci0gICAgICAgICAgICBoZWFkZXItPnR5cGUgPSBETV9VU0VSX1JFU1BfRVJST1I7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBoZWFkZXItPnR5cGUgPSBETV9VU0VSX1JFU1BfU1VDQ0VTUzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghV3JpdGVEbVVzZXJQYXlsb2FkKDAsIHRydWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHNlY3Rvcl90LCBjb25zdCBDb3dPcGVyYXRpb24qPj4mIGNodW5rX3ZlYyA9IHNuYXB1c2VyZF8tPkdldENodW5rVmVjKCk7Ci0gICAgc2l6ZV90IHJlbWFpbmluZ19zaXplID0gaGVhZGVyLT5sZW47Ci0gICAgc2l6ZV90IHJlYWRfc2l6ZSA9IHN0ZDo6bWluKFBBWUxPQURfU0laRSwgcmVtYWluaW5nX3NpemUpOwotCi0gICAgY2h1bmtfdCBjaHVuayA9IFNlY3RvclRvQ2h1bmsoaGVhZGVyLT5zZWN0b3IpOwotICAgIGF1dG8gaXQgPSBzdGQ6Omxvd2VyX2JvdW5kKGNodW5rX3ZlYy5iZWdpbigpLCBjaHVua192ZWMuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoaGVhZGVyLT5zZWN0b3IsIG51bGxwdHIpLCBTbmFwdXNlcmQ6OmNvbXBhcmUpOwotCi0gICAgYm9vbCBub3RfZm91bmQgPSAoaXQgPT0gY2h1bmtfdmVjLmVuZCgpIHx8IGl0LT5maXJzdCAhPSBoZWFkZXItPnNlY3Rvcik7Ci0KLSAgICBpZiAobm90X2ZvdW5kKSB7Ci0gICAgICAgIHZvaWQqIGJ1ZmZlciA9IGJ1ZnNpbmtfLkdldFBheWxvYWRCdWZmZXIocmVhZF9zaXplKTsKLSAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIkRtdXNlcldyaXRlUmVxdWVzdDogRmFpbGVkIHRvIGdldCBwYXlsb2FkIGJ1ZmZlciBvZiBzaXplOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcmVhZF9zaXplOwotICAgICAgICAgICAgaGVhZGVyLT50eXBlID0gRE1fVVNFUl9SRVNQX0VSUk9SOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaGVhZGVyLT50eXBlID0gRE1fVVNFUl9SRVNQX1NVQ0NFU1M7Ci0KLSAgICAgICAgICAgIGlmICghUmVhZERtVXNlclBheWxvYWQoYnVmZmVyLCByZWFkX3NpemUpKSB7Ci0gICAgICAgICAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJSZWFkRG1Vc2VyUGF5bG9hZCBmYWlsZWQgZm9yIGNodW5rIGlkOiAiIDw8IGNodW5rCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJTZWN0b3I6ICIgPDwgaGVhZGVyLT5zZWN0b3I7Ci0gICAgICAgICAgICAgICAgaGVhZGVyLT50eXBlID0gRE1fVVNFUl9SRVNQX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaGVhZGVyLT50eXBlID09IERNX1VTRVJfUkVTUF9TVUNDRVNTICYmICFQcm9jZXNzTWVyZ2VDb21wbGV0ZShjaHVuaywgYnVmZmVyKSkgewotICAgICAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUHJvY2Vzc01lcmdlQ29tcGxldGUgZmFpbGVkIGZvciBjaHVuayBpZDogIiA8PCBjaHVuawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiU2VjdG9yOiAiIDw8IGhlYWRlci0+c2VjdG9yOwotICAgICAgICAgICAgICAgIGhlYWRlci0+dHlwZSA9IERNX1VTRVJfUkVTUF9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiRG11c2VyV3JpdGVSZXF1ZXN0OiBJbnZhbGlkIHNlY3RvciByZWNlaXZlZDogaGVhZGVyLT5zZWN0b3IiOwotICAgICAgICBoZWFkZXItPnR5cGUgPSBETV9VU0VSX1JFU1BfRVJST1I7Ci0gICAgfQotCi0gICAgaWYgKCFXcml0ZURtVXNlclBheWxvYWQoMCwgdHJ1ZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFdvcmtlclRocmVhZDo6RG11c2VyUmVhZFJlcXVlc3QoKSB7Ci0gICAgc3RydWN0IGRtX3VzZXJfaGVhZGVyKiBoZWFkZXIgPSBidWZzaW5rXy5HZXRIZWFkZXJQdHIoKTsKLSAgICBzaXplX3QgcmVtYWluaW5nX3NpemUgPSBoZWFkZXItPmxlbjsKLSAgICBsb2ZmX3Qgb2Zmc2V0ID0gMDsKLSAgICBzZWN0b3JfdCBzZWN0b3IgPSBoZWFkZXItPnNlY3RvcjsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c2VjdG9yX3QsIGNvbnN0IENvd09wZXJhdGlvbio+PiYgY2h1bmtfdmVjID0gc25hcHVzZXJkXy0+R2V0Q2h1bmtWZWMoKTsKLSAgICBib29sIGhlYWRlcl9yZXNwb25zZSA9IHRydWU7Ci0gICAgZG8gewotICAgICAgICBzaXplX3QgcmVhZF9zaXplID0gc3RkOjptaW4oUEFZTE9BRF9TSVpFLCByZW1haW5pbmdfc2l6ZSk7Ci0KLSAgICAgICAgaW50IHJldCA9IHJlYWRfc2l6ZTsKLSAgICAgICAgaGVhZGVyLT50eXBlID0gRE1fVVNFUl9SRVNQX1NVQ0NFU1M7Ci0gICAgICAgIGNodW5rX3QgY2h1bmsgPSBTZWN0b3JUb0NodW5rKGhlYWRlci0+c2VjdG9yKTsKLQotICAgICAgICAvLyBSZXF1ZXN0IHRvIHNlY3RvciAwIGlzIGFsd2F5cyBmb3Iga2VybmVsCi0gICAgICAgIC8vIHJlcHJlc2VudGF0aW9uIG9mIENPVyBoZWFkZXIuIFRoaXMgSU8gc2hvdWxkIGJlIG9ubHkKLSAgICAgICAgLy8gb25jZSBkdXJpbmcgZG0tc25hcHNob3QgZGV2aWNlIGNyZWF0aW9uLiBXZSBzaG91bGQKLSAgICAgICAgLy8gbmV2ZXIgc2VlIG11bHRpcGxlIElPIHJlcXVlc3RzLiBBZGRpdGlvbmFsbHkgdGhpcyBJTwotICAgICAgICAvLyB3aWxsIGFsd2F5cyBiZSBhIHNpbmdsZSA0ay4KLSAgICAgICAgaWYgKGhlYWRlci0+c2VjdG9yID09IDApIHsKLSAgICAgICAgICAgIGlmIChyZWFkX3NpemUgPT0gQkxPQ0tfU1opIHsKLSAgICAgICAgICAgICAgICBDb25zdHJ1Y3RLZXJuZWxDb3dIZWFkZXIoKTsKLSAgICAgICAgICAgICAgICBTTkFQX0xPRyhERUJVRykgPDwgIktlcm5lbCBoZWFkZXIgY29uc3RydWN0ZWQiOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIkludmFsaWQgcmVhZF9zaXplOiAiIDw8IHJlYWRfc2l6ZSA8PCAiIGZvciBzZWN0b3IgMCI7Ci0gICAgICAgICAgICAgICAgaGVhZGVyLT50eXBlID0gRE1fVVNFUl9SRVNQX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXV0byBpdCA9IHN0ZDo6bG93ZXJfYm91bmQoY2h1bmtfdmVjLmJlZ2luKCksIGNodW5rX3ZlYy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKGhlYWRlci0+c2VjdG9yLCBudWxscHRyKSwgU25hcHVzZXJkOjpjb21wYXJlKTsKLSAgICAgICAgICAgIGJvb2wgbm90X2ZvdW5kID0gKGl0ID09IGNodW5rX3ZlYy5lbmQoKSB8fCBpdC0+Zmlyc3QgIT0gaGVhZGVyLT5zZWN0b3IpOwotICAgICAgICAgICAgaWYgKCFvZmZzZXQgJiYgKHJlYWRfc2l6ZSA9PSBCTE9DS19TWikgJiYgbm90X2ZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFSZWFkRGlza0V4Y2VwdGlvbnMoY2h1bmssIHJlYWRfc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJSZWFkRGlza0V4Y2VwdGlvbnMgZmFpbGVkIGZvciBjaHVuayBpZDogIiA8PCBjaHVuawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlNlY3RvcjogIiA8PCBoZWFkZXItPnNlY3RvcjsKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyLT50eXBlID0gRE1fVVNFUl9SRVNQX0VSUk9SOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFNOQVBfTE9HKERFQlVHKSA8PCAiUmVhZERpc2tFeGNlcHRpb25zIHN1Y2Nlc3MgZm9yIGNodW5rIGlkOiAiIDw8IGNodW5rCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiU2VjdG9yOiAiIDw8IGhlYWRlci0+c2VjdG9yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2h1bmtfdCBudW1fc2VjdG9yc19yZWFkID0gKG9mZnNldCA+PiBTRUNUT1JfU0hJRlQpOwotCi0gICAgICAgICAgICAgICAgcmV0ID0gUmVhZERhdGEoc2VjdG9yICsgbnVtX3NlY3RvcnNfcmVhZCwgcmVhZF9zaXplKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlJlYWREYXRhIGZhaWxlZCBmb3IgY2h1bmsgaWQ6ICIgPDwgY2h1bmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgU2VjdG9yOiAiIDw8IChzZWN0b3IgKyBudW1fc2VjdG9yc19yZWFkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBzaXplOiAiIDw8IHJlYWRfc2l6ZSA8PCAiIGhlYWRlci1sZW46ICIgPDwgaGVhZGVyLT5sZW47Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlci0+dHlwZSA9IERNX1VTRVJfUkVTUF9FUlJPUjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTTkFQX0xPRyhERUJVRykgPDwgIlJlYWREYXRhIHN1Y2Nlc3MgZm9yIGNodW5rIGlkOiAiIDw8IGNodW5rCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiU2VjdG9yOiAiIDw8IGhlYWRlci0+c2VjdG9yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEp1c3QgcmV0dXJuIHRoZSBoZWFkZXIgaWYgaXQgaXMgYW4gZXJyb3IKLSAgICAgICAgaWYgKGhlYWRlci0+dHlwZSA9PSBETV9VU0VSX1JFU1BfRVJST1IpIHsKLSAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiSU8gcmVhZCByZXF1ZXN0IGZhaWxlZC4uLiI7Ci0gICAgICAgICAgICByZXQgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFoZWFkZXJfcmVzcG9uc2UpIHsKLSAgICAgICAgICAgIENIRUNLKGhlYWRlci0+dHlwZSA9PSBETV9VU0VSX1JFU1BfU1VDQ0VTUykKLSAgICAgICAgICAgICAgICAgICAgPDwgIiBmYWlsZWQgZm9yIHNlY3RvcjogIiA8PCBzZWN0b3IgPDwgIiBoZWFkZXItPmxlbjogIiA8PCBoZWFkZXItPmxlbgotICAgICAgICAgICAgICAgICAgICA8PCAiIHJlbWFpbmluZ19zaXplOiAiIDw8IHJlbWFpbmluZ19zaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRGFlbW9uIHdpbGwgbm90IGJlIHRlcm1pbmF0ZWQgaWYgdGhlcmUgaXMgYW55IGVycm9yLiBXZSB3aWxsCi0gICAgICAgIC8vIGp1c3Qgc2VuZCB0aGUgZXJyb3IgYmFjayB0byBkbS11c2VyLgotICAgICAgICBpZiAoIVdyaXRlRG1Vc2VyUGF5bG9hZChyZXQsIGhlYWRlcl9yZXNwb25zZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoZWFkZXItPnR5cGUgPT0gRE1fVVNFUl9SRVNQX0VSUk9SKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIHJlbWFpbmluZ19zaXplIC09IHJldDsKLSAgICAgICAgb2Zmc2V0ICs9IHJldDsKLSAgICAgICAgaGVhZGVyX3Jlc3BvbnNlID0gZmFsc2U7Ci0gICAgfSB3aGlsZSAocmVtYWluaW5nX3NpemUgPiAwKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFdvcmtlclRocmVhZDo6SW5pdGlhbGl6ZUJ1ZnNpbmsoKSB7Ci0gICAgLy8gQWxsb2NhdGUgdGhlIGJ1ZmZlciB3aGljaCBpcyB1c2VkIHRvIGNvbW11bmljYXRlIGJldHdlZW4KLSAgICAvLyBkYWVtb24gYW5kIGRtLXVzZXIuIFRoZSBidWZmZXIgY29tcHJpc2VzIG9mIGhlYWRlciBhbmQgYSBmaXhlZCBwYXlsb2FkLgotICAgIC8vIElmIHRoZSBkbS11c2VyIHJlcXVlc3RzIGEgYmlnIElPLCB0aGUgSU8gd2lsbCBiZSBicm9rZW4gaW50byBjaHVua3MKLSAgICAvLyBvZiBQQVlMT0FEX1NJWkUuCi0gICAgc2l6ZV90IGJ1Zl9zaXplID0gc2l6ZW9mKHN0cnVjdCBkbV91c2VyX2hlYWRlcikgKyBQQVlMT0FEX1NJWkU7Ci0gICAgYnVmc2lua18uSW5pdGlhbGl6ZShidWZfc2l6ZSk7Ci19Ci0KLWJvb2wgV29ya2VyVGhyZWFkOjpSdW5UaHJlYWQoKSB7Ci0gICAgSW5pdGlhbGl6ZUJ1ZnNpbmsoKTsKLQotICAgIGlmICghSW5pdGlhbGl6ZUZkcygpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoIUluaXRSZWFkZXIoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gU3RhcnQgc2VydmluZyBJTwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIGlmICghUHJvY2Vzc0lPUmVxdWVzdCgpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIENsb3NlRmRzKCk7Ci0gICAgcmVhZGVyXy0+Q2xvc2VDb3dGZCgpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgV29ya2VyVGhyZWFkOjpQcm9jZXNzSU9SZXF1ZXN0KCkgewotICAgIHN0cnVjdCBkbV91c2VyX2hlYWRlciogaGVhZGVyID0gYnVmc2lua18uR2V0SGVhZGVyUHRyKCk7Ci0KLSAgICBpZiAoIVJlYWREbVVzZXJIZWFkZXIoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgU05BUF9MT0coREVCVUcpIDw8ICJEYWVtb246IG1zZy0+c2VxOiAiIDw8IHN0ZDo6ZGVjIDw8IGhlYWRlci0+c2VxOwotICAgIFNOQVBfTE9HKERFQlVHKSA8PCAiRGFlbW9uOiBtc2ctPmxlbjogIiA8PCBzdGQ6OmRlYyA8PCBoZWFkZXItPmxlbjsKLSAgICBTTkFQX0xPRyhERUJVRykgPDwgIkRhZW1vbjogbXNnLT5zZWN0b3I6ICIgPDwgc3RkOjpkZWMgPDwgaGVhZGVyLT5zZWN0b3I7Ci0gICAgU05BUF9MT0coREVCVUcpIDw8ICJEYWVtb246IG1zZy0+dHlwZTogIiA8PCBzdGQ6OmRlYyA8PCBoZWFkZXItPnR5cGU7Ci0gICAgU05BUF9MT0coREVCVUcpIDw8ICJEYWVtb246IG1zZy0+ZmxhZ3M6ICIgPDwgc3RkOjpkZWMgPDwgaGVhZGVyLT5mbGFnczsKLQotICAgIHN3aXRjaCAoaGVhZGVyLT50eXBlKSB7Ci0gICAgICAgIGNhc2UgRE1fVVNFUl9SRVFfTUFQX1JFQUQ6IHsKLSAgICAgICAgICAgIGlmICghRG11c2VyUmVhZFJlcXVlc3QoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBETV9VU0VSX1JFUV9NQVBfV1JJVEU6IHsKLSAgICAgICAgICAgIGlmICghRG11c2VyV3JpdGVSZXF1ZXN0KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL2RtX3VzZXJfYmxvY2tfc2VydmVyLmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvZG1fdXNlcl9ibG9ja19zZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OTlhZDMKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL2RtX3VzZXJfYmxvY2tfc2VydmVyLmNwcApAQCAtMCwwICsxLDE1NCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlIDxzbmFwdXNlcmQvZG1fdXNlcl9ibG9ja19zZXJ2ZXIuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxzbmFwdXNlcmQvc25hcHVzZXJkX2tlcm5lbC5oPgorI2luY2x1ZGUgInNuYXB1c2VyZF9sb2dnaW5nLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBzbmFwc2hvdCB7CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZDsKKworRG1Vc2VyQmxvY2tTZXJ2ZXI6OkRtVXNlckJsb2NrU2VydmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUsIHVuaXF1ZV9mZCYmIGN0cmxfZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsZWdhdGUqIGRlbGVnYXRlLCBzaXplX3QgYnVmZmVyX3NpemUpCisgICAgOiBtaXNjX25hbWVfKG1pc2NfbmFtZSksIGN0cmxfZmRfKHN0ZDo6bW92ZShjdHJsX2ZkKSksIGRlbGVnYXRlXyhkZWxlZ2F0ZSkgeworICAgIGJ1ZmZlcl8uSW5pdGlhbGl6ZShzaXplb2Yoc3RydWN0IGRtX3VzZXJfaGVhZGVyKSwgYnVmZmVyX3NpemUpOworfQorCitib29sIERtVXNlckJsb2NrU2VydmVyOjpQcm9jZXNzUmVxdWVzdHMoKSB7CisgICAgc3RydWN0IGRtX3VzZXJfaGVhZGVyKiBoZWFkZXIgPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3QgZG1fdXNlcl9oZWFkZXIqPihidWZmZXJfLkdldEhlYWRlclB0cigpKTsKKyAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseShjdHJsX2ZkXywgaGVhZGVyLCBzaXplb2YoKmhlYWRlcikpKSB7CisgICAgICAgIGlmIChlcnJubyAhPSBFTk9UQkxLKSB7CisgICAgICAgICAgICBTTkFQX1BMT0coRVJST1IpIDw8ICJDb250cm9sLXJlYWQgZmFpbGVkIjsKKyAgICAgICAgfQorCisgICAgICAgIFNOQVBfUExPRyhERUJVRykgPDwgIlJlYWREbVVzZXJIZWFkZXIgZmFpbGVkLi4uLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBTTkFQX0xPRyhERUJVRykgPDwgIkRhZW1vbjogbXNnLT5zZXE6ICIgPDwgc3RkOjpkZWMgPDwgaGVhZGVyLT5zZXE7CisgICAgU05BUF9MT0coREVCVUcpIDw8ICJEYWVtb246IG1zZy0+bGVuOiAiIDw8IHN0ZDo6ZGVjIDw8IGhlYWRlci0+bGVuOworICAgIFNOQVBfTE9HKERFQlVHKSA8PCAiRGFlbW9uOiBtc2ctPnNlY3RvcjogIiA8PCBzdGQ6OmRlYyA8PCBoZWFkZXItPnNlY3RvcjsKKyAgICBTTkFQX0xPRyhERUJVRykgPDwgIkRhZW1vbjogbXNnLT50eXBlOiAiIDw8IHN0ZDo6ZGVjIDw8IGhlYWRlci0+dHlwZTsKKyAgICBTTkFQX0xPRyhERUJVRykgPDwgIkRhZW1vbjogbXNnLT5mbGFnczogIiA8PCBzdGQ6OmRlYyA8PCBoZWFkZXItPmZsYWdzOworCisgICAgaWYgKCFQcm9jZXNzUmVxdWVzdChoZWFkZXIpKSB7CisgICAgICAgIGlmIChoZWFkZXItPnR5cGUgIT0gRE1fVVNFUl9SRVNQX0VSUk9SKSB7CisgICAgICAgICAgICBTZW5kRXJyb3IoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIERtVXNlckJsb2NrU2VydmVyOjpQcm9jZXNzUmVxdWVzdChkbV91c2VyX2hlYWRlciogaGVhZGVyKSB7CisgICAgLy8gVXNlIHRoZSBzYW1lIGhlYWRlciBidWZmZXIgYXMgdGhlIHJlc3BvbnNlIGhlYWRlci4KKyAgICBpbnQgcmVxdWVzdF90eXBlID0gaGVhZGVyLT50eXBlOworICAgIGhlYWRlci0+dHlwZSA9IERNX1VTRVJfUkVTUF9TVUNDRVNTOworICAgIGhlYWRlcl9yZXNwb25zZV8gPSB0cnVlOworCisgICAgLy8gUmVzZXQgdGhlIG91dHB1dCBidWZmZXIuCisgICAgYnVmZmVyXy5SZXNldEJ1ZmZlck9mZnNldCgpOworCisgICAgc3dpdGNoIChyZXF1ZXN0X3R5cGUpIHsKKyAgICAgICAgY2FzZSBETV9VU0VSX1JFUV9NQVBfUkVBRDoKKyAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZV8tPlJlcXVlc3RTZWN0b3JzKGhlYWRlci0+c2VjdG9yLCBoZWFkZXItPmxlbik7CisKKyAgICAgICAgY2FzZSBETV9VU0VSX1JFUV9NQVBfV1JJVEU6CisgICAgICAgICAgICAvLyBXZSBzaG91bGQgbm90IGdldCBhbnkgd3JpdGUgcmVxdWVzdCB0byBkbS11c2VyIGFzIHdlIG1vdW50IGFsbAorICAgICAgICAgICAgLy8gcGFydGl0aW9ucyBhcyByZWFkLW9ubHkuCisgICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlVuZXhwZWN0ZWQgd3JpdGUgcmVxdWVzdCBmcm9tIGRtLXVzZXIiOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlVuZXhwZWN0ZWQgcmVxdWVzdCBmcm9tIGRtLXVzZXI6ICIgPDwgcmVxdWVzdF90eXBlOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKwordm9pZCogRG1Vc2VyQmxvY2tTZXJ2ZXI6OkdldFJlc3BvbnNlQnVmZmVyKHNpemVfdCBzaXplLCBzaXplX3QgdG9fd3JpdGUpIHsKKyAgICByZXR1cm4gYnVmZmVyXy5BY3F1aXJlQnVmZmVyKHNpemUsIHRvX3dyaXRlKTsKK30KKworYm9vbCBEbVVzZXJCbG9ja1NlcnZlcjo6U2VuZEJ1ZmZlcmVkSW8oKSB7CisgICAgcmV0dXJuIFdyaXRlRG1Vc2VyUGF5bG9hZChidWZmZXJfLkdldFBheWxvYWRCeXRlc1dyaXR0ZW4oKSk7Cit9CisKK3ZvaWQgRG1Vc2VyQmxvY2tTZXJ2ZXI6OlNlbmRFcnJvcigpIHsKKyAgICBzdHJ1Y3QgZG1fdXNlcl9oZWFkZXIqIGhlYWRlciA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHN0cnVjdCBkbV91c2VyX2hlYWRlcio+KGJ1ZmZlcl8uR2V0SGVhZGVyUHRyKCkpOworICAgIGhlYWRlci0+dHlwZSA9IERNX1VTRVJfUkVTUF9FUlJPUjsKKyAgICAvLyBUaGlzIGlzIGFuIGlzc3VlIHdpdGggdGhlIGRtLXVzZXIgaW50ZXJmYWNlLiBUaGVyZQorICAgIC8vIGlzIG5vIHdheSB0byBwcm9wYWdhdGUgdGhlIEkvTyBlcnJvciBiYWNrIHRvIGRtLXVzZXIKKyAgICAvLyBpZiB3ZSBoYXZlIGFscmVhZHkgY29tbXVuaWNhdGVkIHRoZSBoZWFkZXIgYmFjay4gSGVhZGVyCisgICAgLy8gaXMgcmVzcG9uZGVkIG9uY2UgYXQgdGhlIGJlZ2lubmluZzsgaG93ZXZlciBJL08gY2FuCisgICAgLy8gYmUgcHJvY2Vzc2VkIGluIGNodW5rcy4gSWYgd2UgZW5jb3VudGVyIGFuIEkvTyBlcnJvcgorICAgIC8vIHNvbWV3aGVyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBwcm9jZXNzaW5nLCB3ZSBjYW4ndCBjb21tdW5pY2F0ZQorICAgIC8vIHRoaXMgYmFjayB0byBkbS11c2VyLgorICAgIC8vCisgICAgLy8gVE9ETzogRml4IHRoZSBpbnRlcmZhY2UKKyAgICBDSEVDSyhoZWFkZXJfcmVzcG9uc2VfKTsKKworICAgIFdyaXRlRG1Vc2VyUGF5bG9hZCgwKTsKK30KKworYm9vbCBEbVVzZXJCbG9ja1NlcnZlcjo6V3JpdGVEbVVzZXJQYXlsb2FkKHNpemVfdCBzaXplKSB7CisgICAgc2l6ZV90IHBheWxvYWRfc2l6ZSA9IHNpemU7CisgICAgdm9pZCogYnVmID0gYnVmZmVyXy5HZXRQYXlsb2FkQnVmUHRyKCk7CisgICAgaWYgKGhlYWRlcl9yZXNwb25zZV8pIHsKKyAgICAgICAgcGF5bG9hZF9zaXplICs9IHNpemVvZihzdHJ1Y3QgZG1fdXNlcl9oZWFkZXIpOworICAgICAgICBidWYgPSBidWZmZXJfLkdldEJ1ZlB0cigpOworICAgIH0KKworICAgIGlmICghYW5kcm9pZDo6YmFzZTo6V3JpdGVGdWxseShjdHJsX2ZkXywgYnVmLCBwYXlsb2FkX3NpemUpKSB7CisgICAgICAgIFNOQVBfUExPRyhFUlJPUikgPDwgIldyaXRlIHRvIGRtLXVzZXIgZmFpbGVkIHNpemU6ICIgPDwgcGF5bG9hZF9zaXplOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gQWZ0ZXIgdGhlIGZpcnN0IGhlYWRlciBpcyBzZW50IGluIHJlc3BvbnNlIHRvIGEgcmVxdWVzdCwgd2UgY2Fubm90CisgICAgLy8gc2VuZCBhbnkgYWRkaXRpb25hbCBoZWFkZXJzLgorICAgIGhlYWRlcl9yZXNwb25zZV8gPSBmYWxzZTsKKworICAgIC8vIFJlc2V0IHRoZSBidWZmZXIgZm9yIHVzZSBieSB0aGUgbmV4dCByZXF1ZXN0LgorICAgIGJ1ZmZlcl8uUmVzZXRCdWZmZXJPZmZzZXQoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworRG1Vc2VyQmxvY2tTZXJ2ZXJPcGVuZXI6OkRtVXNlckJsb2NrU2VydmVyT3BlbmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRtX3VzZXJfcGF0aCkKKyAgICA6IG1pc2NfbmFtZV8obWlzY19uYW1lKSwgZG1fdXNlcl9wYXRoXyhkbV91c2VyX3BhdGgpIHt9CisKK3N0ZDo6dW5pcXVlX3B0cjxJQmxvY2tTZXJ2ZXI+IERtVXNlckJsb2NrU2VydmVyT3BlbmVyOjpPcGVuKElCbG9ja1NlcnZlcjo6RGVsZWdhdGUqIGRlbGVnYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlcl9zaXplKSB7CisgICAgdW5pcXVlX2ZkIGZkKG9wZW4oZG1fdXNlcl9wYXRoXy5jX3N0cigpLCBPX1JEV1IgfCBPX0NMT0VYRUMpKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIFNOQVBfUExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBvcGVuIGRtLXVzZXIgcGF0aDogIiA8PCBkbV91c2VyX3BhdGhfOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8RG1Vc2VyQmxvY2tTZXJ2ZXI+KG1pc2NfbmFtZV8sIHN0ZDo6bW92ZShmZCksIGRlbGVnYXRlLCBidWZmZXJfc2l6ZSk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxJQmxvY2tTZXJ2ZXJPcGVuZXI+IERtVXNlckJsb2NrU2VydmVyRmFjdG9yeTo6Q3JlYXRlT3BlbmVyKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lKSB7CisgICAgYXV0byBkbV9wYXRoID0gIi9kZXYvZG0tdXNlci8iICsgbWlzY19uYW1lOworICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPERtVXNlckJsb2NrU2VydmVyT3BlbmVyPihtaXNjX25hbWUsIGRtX3BhdGgpOworfQorCit9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL2luY2x1ZGUvc25hcHVzZXJkL2Jsb2NrX3NlcnZlci5oIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9pbmNsdWRlL3NuYXB1c2VyZC9ibG9ja19zZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDZiZjExCi0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9pbmNsdWRlL3NuYXB1c2VyZC9ibG9ja19zZXJ2ZXIuaApAQCAtMCwwICsxLDk1IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHNuYXBzaG90IHsKKworLy8gVGhlc2UgaW50ZXJmYWNlcyBtb2RlbCB0aGUgYmxvY2sgZGV2aWNlIGRyaXZlciBjb21wb25lbnQgb2Ygc25hcHVzZXJkIChlZywKKy8vIGRtLXVzZXIpLgorCisvLyBBbiBvcGVuIGNvbm5lY3Rpb24gdG8gYSB1c2Vyc3BhY2UgYmxvY2sgZGV2aWNlIGNvbnRyb2wKK2NsYXNzIElCbG9ja1NlcnZlciB7CisgIHB1YmxpYzoKKyAgICBjbGFzcyBEZWxlZ2F0ZSB7CisgICAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgfkRlbGVnYXRlKCkge30KKworICAgICAgICAvLyBSZXNwb25kIHRvIGEgcmVxdWVzdCBmb3IgcmVhZGluZyBhIGNvbnRpZ3VvdXMgcnVuIG9mIHNlY3RvcnMuIFRoaXMKKyAgICAgICAgLy8gY2FsbCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgY2FsbHMgdG8gR2V0UmVzcG9uc2VCdWZmZXIvQ29tbWl0QnVmZmVyCisgICAgICAgIC8vIHVudGlsIHRoZSB8c2l6ZXwgaXMgZnVsZmlsbGVkLgorICAgICAgICAvLworICAgICAgICAvLyBJZiBmYWxzZSBpcyByZXR1cm5lZCwgYW4gZXJyb3Igd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlcG9ydGVkIHVubGVzcworICAgICAgICAvLyBTZW5kRXJyb3Igd2FzIGNhbGxlZC4KKyAgICAgICAgdmlydHVhbCBib29sIFJlcXVlc3RTZWN0b3JzKHVpbnQ2NF90IHNlY3RvciwgdWludDY0X3Qgc2l6ZSkgPSAwOworICAgIH07CisKKyAgICB2aXJ0dWFsIH5JQmxvY2tTZXJ2ZXIoKSB7fQorCisgICAgLy8gUHJvY2VzcyBJL08gcmVxdWVzdHMuIFRoaXMgY2FuIGJsb2NrIHRoZSB3b3JrZXIgdGhyZWFkIHVudGlsIGVpdGhlciBhCisgICAgLy8gcmVxdWVzdCBpcyBhdmFpbGFibGUgb3IgdGhlIHVuZGVybHlpbmcgY29ubmVjdGlvbiBoYXMgYmVlbiBkZXN0cm95ZWQuCisgICAgLy8KKyAgICAvLyBUcnVlIGluZGljYXRlcyB0aGF0IG9uZSBvciBtb3JlIHJlcXVlc3RzIHdhcyBwcm9jZXNzZWQuIEZhbHNlIGluZGljYXRlcworICAgIC8vIGFuIHVucmVjb3ZlcmFibGUgY29uZGl0aW9uIGFuZCBwcm9jZXNzaW5nIHNob3VsZCBzdG9wLgorICAgIHZpcnR1YWwgYm9vbCBQcm9jZXNzUmVxdWVzdHMoKSA9IDA7CisKKyAgICAvLyBSZXR1cm4gYSBidWZmZXIgZm9yIGZ1bGZpbGxpbmcgYSBSZXF1ZXN0U2VjdG9ycyByZXF1ZXN0LiBUaGlzIGJ1ZmZlcgorICAgIC8vIGlzIHZhbGlkIHVudGlsIGNhbGxpbmcgU2VuZEJ1ZmZlcmVkSW8uIFRoaXMgY2Fubm90IGJlIGNhbGxlZCBvdXRzaWRlCisgICAgLy8gb2YgUmVxdWVzdFNlY3RvcnMoKS4KKyAgICAvLworICAgIC8vICJ0b193cml0ZSIgbXVzdCBiZSA8PSAic2l6ZSIuIElmIGl0IGlzIDwgc2l6ZSwgdGhlIGV4Y2VzcyBieXRlcyBhcmUKKyAgICAvLyBhdmFpbGFibGUgZm9yIHdyaXRpbmcsIGJ1dCB3aWxsIG5vdCBiZSBzZW5kIHZpYSBTZW5kQnVmZmVyZWRJbywgYW5kCisgICAgLy8gbWF5IGJlIHJlYWxsb2NhdGVkIGluIHRoZSBuZXh0IGNhbGwgdG8gR2V0UmVzcG9uc2VCdWZmZXIuCisgICAgLy8KKyAgICAvLyBBbGwgYnVmZmVycyByZXR1cm5lZCBhcmUgaW52YWxpZGF0ZWQgYWZ0ZXIgU2VuZEJ1ZmZlcmVkSW8gb3IgcmV0dXJuaW5nCisgICAgLy8gY29udHJvbCBmcm9tIFJlcXVlc3RTZWN0b3JzLgorICAgIHZpcnR1YWwgdm9pZCogR2V0UmVzcG9uc2VCdWZmZXIoc2l6ZV90IHNpemUsIHNpemVfdCB0b193cml0ZSkgPSAwOworCisgICAgLy8gU2VuZCBhbGwgb3V0c3RhbmRpbmcgYnVmZmVycyB0byB0aGUgZHJpdmVyLCBpbiBvcmRlci4gVGhpcyBzaG91bGQKKyAgICAvLyBiZSBjYWxsZWQgYXQgbGVhc3Qgb25jZSBpbiByZXNwb25zZSB0byBSZXF1ZXN0U2VjdG9ycy4gVGhpcyByZXR1cm5zCisgICAgLy8gb3duZXJzaGlwIG9mIGFueSBidWZmZXJzIHJldHVybmVkIGJ5IEdldFJlc3BvbnNlQnVmZmVyLgorICAgIC8vCisgICAgLy8gSWYgZmFsc2UgaXMgcmV0dXJuZWQsIGFuIGVycm9yIGlzIGF1dG9tYXRpY2FsbHkgcmVwb3J0ZWQgdG8gdGhlIGRyaXZlci4KKyAgICB2aXJ0dWFsIGJvb2wgU2VuZEJ1ZmZlcmVkSW8oKSA9IDA7CisKKyAgICB2b2lkKiBHZXRSZXNwb25zZUJ1ZmZlcihzaXplX3Qgc2l6ZSkgeyByZXR1cm4gR2V0UmVzcG9uc2VCdWZmZXIoc2l6ZSwgc2l6ZSk7IH0KK307CisKK2NsYXNzIElCbG9ja1NlcnZlck9wZW5lciB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5JQmxvY2tTZXJ2ZXJPcGVuZXIoKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBPcGVuIGEgY29ubmVjdGlvbiB0byB0aGUgc2VydmljZS4gVGhpcyBpcyBjYWxsZWQgb24gdGhlIGRhZW1vbiB0aHJlYWQuCisgICAgLy8KKyAgICAvLyBidWZmZXJfc2l6ZSBpcyB0aGUgbWF4aW11bSBhbW91bnQgb2YgYnVmZmVyZWQgSS9PIHRvIHVzZS4KKyAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxJQmxvY2tTZXJ2ZXI+IE9wZW4oSUJsb2NrU2VydmVyOjpEZWxlZ2F0ZSogZGVsZWdhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJfc2l6ZSkgPSAwOworfTsKKworY2xhc3MgSUJsb2NrU2VydmVyRmFjdG9yeSB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5JQmxvY2tTZXJ2ZXJGYWN0b3J5KCkge30KKworICAgIC8vIFJldHVybiBhIG5ldyBJQmxvY2tTZXJ2ZXJPcGVuZXIgZ2l2ZW4gYSB1bmlxdWUgZGV2aWNlIG5hbWUuCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8SUJsb2NrU2VydmVyT3BlbmVyPiBDcmVhdGVPcGVuZXIoY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSkgPSAwOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9pbmNsdWRlL3NuYXB1c2VyZC9kbV91c2VyX2Jsb2NrX3NlcnZlci5oIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9pbmNsdWRlL3NuYXB1c2VyZC9kbV91c2VyX2Jsb2NrX3NlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YzZiZmIKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL2luY2x1ZGUvc25hcHVzZXJkL2RtX3VzZXJfYmxvY2tfc2VydmVyLmgKQEAgLTAsMCArMSw2OSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8c25hcHVzZXJkL2Jsb2NrX3NlcnZlci5oPgorI2luY2x1ZGUgPHNuYXB1c2VyZC9zbmFwdXNlcmRfYnVmZmVyLmg+CisjaW5jbHVkZSA8c25hcHVzZXJkL3NuYXB1c2VyZF9rZXJuZWwuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHNuYXBzaG90IHsKKworY2xhc3MgRG1Vc2VyQmxvY2tTZXJ2ZXIgOiBwdWJsaWMgSUJsb2NrU2VydmVyIHsKKyAgcHVibGljOgorICAgIERtVXNlckJsb2NrU2VydmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUsIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCYmIGN0cmxfZmQsCisgICAgICAgICAgICAgICAgICAgICAgRGVsZWdhdGUqIGRlbGVnYXRlLCBzaXplX3QgYnVmZmVyX3NpemUpOworCisgICAgYm9vbCBQcm9jZXNzUmVxdWVzdHMoKSBvdmVycmlkZTsKKyAgICB2b2lkKiBHZXRSZXNwb25zZUJ1ZmZlcihzaXplX3Qgc2l6ZSwgc2l6ZV90IHRvX3dyaXRlKSBvdmVycmlkZTsKKyAgICBib29sIFNlbmRCdWZmZXJlZElvKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBTZW5kRXJyb3IoKTsKKworICBwcml2YXRlOgorICAgIGJvb2wgUHJvY2Vzc1JlcXVlc3QoZG1fdXNlcl9oZWFkZXIqIGhlYWRlcik7CisgICAgYm9vbCBXcml0ZURtVXNlclBheWxvYWQoc2l6ZV90IHNpemUpOworCisgICAgc3RkOjpzdHJpbmcgbWlzY19uYW1lXzsKKyAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgY3RybF9mZF87CisgICAgRGVsZWdhdGUqIGRlbGVnYXRlXzsKKworICAgIC8vIFBlci1yZXF1ZXN0IHN0YXRlLgorICAgIEJ1ZmZlclNpbmsgYnVmZmVyXzsKKyAgICBib29sIGhlYWRlcl9yZXNwb25zZV8gPSBmYWxzZTsKK307CisKK2NsYXNzIERtVXNlckJsb2NrU2VydmVyT3BlbmVyIDogcHVibGljIElCbG9ja1NlcnZlck9wZW5lciB7CisgIHB1YmxpYzoKKyAgICBEbVVzZXJCbG9ja1NlcnZlck9wZW5lcihjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgZG1fdXNlcl9wYXRoKTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxJQmxvY2tTZXJ2ZXI+IE9wZW4oSUJsb2NrU2VydmVyOjpEZWxlZ2F0ZSogZGVsZWdhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyX3NpemUpIG92ZXJyaWRlOworCisgIHByaXZhdGU6CisgICAgc3RkOjpzdHJpbmcgbWlzY19uYW1lXzsKKyAgICBzdGQ6OnN0cmluZyBkbV91c2VyX3BhdGhfOworfTsKKworY2xhc3MgRG1Vc2VyQmxvY2tTZXJ2ZXJGYWN0b3J5IDogcHVibGljIElCbG9ja1NlcnZlckZhY3RvcnkgeworICBwdWJsaWM6CisgICAgc3RkOjpzaGFyZWRfcHRyPElCbG9ja1NlcnZlck9wZW5lcj4gQ3JlYXRlT3BlbmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUpIG92ZXJyaWRlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9pbmNsdWRlL3NuYXB1c2VyZC9zbmFwdXNlcmRfYnVmZmVyLmggYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL2luY2x1ZGUvc25hcHVzZXJkL3NuYXB1c2VyZF9idWZmZXIuaAppbmRleCAyZTRjYWM2Li5jYzdjNDhjIDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL2luY2x1ZGUvc25hcHVzZXJkL3NuYXB1c2VyZF9idWZmZXIuaAorKysgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL2luY2x1ZGUvc25hcHVzZXJkL3NuYXB1c2VyZF9idWZmZXIuaApAQCAtMjUsMzcgKzI1LDQyIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2Ugc25hcHNob3QgewogCi1jbGFzcyBCdWZmZXJTaW5rIDogcHVibGljIElCeXRlU2luayB7CitjbGFzcyBCdWZmZXJTaW5rIGZpbmFsIHsKICAgcHVibGljOgotICAgIHZvaWQgSW5pdGlhbGl6ZShzaXplX3Qgc2l6ZSk7CisgICAgLy8gRG8gbm90IHJlc2VydmUgYW55IHNwYWNlIG9mIGhlYWRlciBieSBkZWZhdWx0CisgICAgdm9pZCBJbml0aWFsaXplKHNpemVfdCBzaXplKSB7IHJldHVybiBJbml0aWFsaXplKDAsIHNpemUpOyB9OworICAgIC8vIFRoaXMgYWxsb3dzIHRvIHNldCBjb25zdCBoZWFkZXJfc2l6ZV8gdG8gYmUgdXNlZCBpZiBjYWxsZXIgbmVlZHMgaXQKKyAgICAvLyBmb3IgZXhhbXBsZSwgd2hpbGUgd29ya2luZyB3aXRoIGRtX3VzZXIKKyAgICB2b2lkIEluaXRpYWxpemUoc2l6ZV90IGhlYWRlcl9zaXplLCBzaXplX3Qgc2l6ZSk7CiAgICAgdm9pZCogR2V0QnVmUHRyKCkgeyByZXR1cm4gYnVmZmVyXy5nZXQoKTsgfQogICAgIHZvaWQgQ2xlYXIoKSB7IG1lbXNldChHZXRCdWZQdHIoKSwgMCwgYnVmZmVyX3NpemVfKTsgfQogICAgIHZvaWQqIEdldFBheWxvYWRCdWZmZXIoc2l6ZV90IHNpemUpOwotICAgIHZvaWQqIEdldEJ1ZmZlcihzaXplX3QgcmVxdWVzdGVkLCBzaXplX3QqIGFjdHVhbCkgb3ZlcnJpZGU7CisgICAgdm9pZCogR2V0QnVmZmVyKHNpemVfdCByZXF1ZXN0ZWQsIHNpemVfdCogYWN0dWFsKTsKICAgICB2b2lkIFVwZGF0ZUJ1ZmZlck9mZnNldChzaXplX3Qgc2l6ZSkgeyBidWZmZXJfb2Zmc2V0XyArPSBzaXplOyB9Ci0gICAgc3RydWN0IGRtX3VzZXJfaGVhZGVyKiBHZXRIZWFkZXJQdHIoKTsKLSAgICBib29sIFJldHVybkRhdGEodm9pZCosIHNpemVfdCkgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorICAgIHZvaWQqIEdldEhlYWRlclB0cigpOwogICAgIHZvaWQgUmVzZXRCdWZmZXJPZmZzZXQoKSB7IGJ1ZmZlcl9vZmZzZXRfID0gMDsgfQogICAgIHZvaWQqIEdldFBheWxvYWRCdWZQdHIoKTsKKyAgICBsb2ZmX3QgR2V0UGF5bG9hZEJ5dGVzV3JpdHRlbigpIHsgcmV0dXJuIGJ1ZmZlcl9vZmZzZXRfOyB9CisKKyAgICAvLyBTYW1lIGFzIGNhbGxpbmcgR2V0UGF5bG9hZEJ1ZmZlciBhbmQgdGhlbiBVcGRhdGVCdWZmZXJPZmZzZXQuCisgICAgLy8KKyAgICAvLyBUaGlzIGlzIHByZWZlcnJlZCBvdmVyIEdldFBheWxvYWRCdWZmZXIgYXMgaXQgZG9lcyBub3QgcmVxdWlyZSBhCisgICAgLy8gc2VwYXJhdGUgY2FsbCB0byBVcGRhdGVCdWZmZXJPZmZzZXQuCisgICAgdm9pZCogQWNxdWlyZUJ1ZmZlcihzaXplX3Qgc2l6ZSkgeyByZXR1cm4gQWNxdWlyZUJ1ZmZlcihzaXplLCBzaXplKTsgfQorCisgICAgLy8gU2FtZSBhcyBBY3F1aXJlQnVmZmVyLCBidXQgc2VwYXJhdGVzIHRoZSByZXF1ZXN0ZWQgc2l6ZSBmcm9tIHRoZSBidWZmZXIKKyAgICAvLyBvZmZzZXQuIFRoaXMgaXMgdXNlZnVsIGZvciBhIHNpdHVhdGlvbiB3aGVyZSBhIGZ1bGwgcnVuIG9mIGRhdGEgd2lsbCBiZQorICAgIC8vIHJlYWQsIGJ1dCBvbmx5IGEgcGFydGlhbCBhbW91bnQgd2lsbCBiZSByZXR1cm5lZC4KKyAgICAvLworICAgIC8vIElmIHNpemUgIT0gdG9fd3JpdGUsIHRoZSBleGNlc3MgYnl0ZXMgbWF5IGJlIHJlYWxsb2NhdGVkIGJ5IHRoZSBuZXh0CisgICAgLy8gY2FsbCB0byBBY3F1aXJlQnVmZmVyLgorICAgIHZvaWQqIEFjcXVpcmVCdWZmZXIoc2l6ZV90IHNpemUsIHNpemVfdCB0b193cml0ZSk7CiAKICAgcHJpdmF0ZToKICAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBidWZmZXJfOwogICAgIGxvZmZfdCBidWZmZXJfb2Zmc2V0XzsKICAgICBzaXplX3QgYnVmZmVyX3NpemVfOwotfTsKLQotY2xhc3MgWG9yU2luayA6IHB1YmxpYyBJQnl0ZVNpbmsgewotICBwdWJsaWM6Ci0gICAgdm9pZCBJbml0aWFsaXplKEJ1ZmZlclNpbmsqIHNpbmssIHNpemVfdCBzaXplKTsKLSAgICB2b2lkIFJlc2V0KCk7Ci0gICAgdm9pZCogR2V0QnVmZmVyKHNpemVfdCByZXF1ZXN0ZWQsIHNpemVfdCogYWN0dWFsKSBvdmVycmlkZTsKLSAgICBib29sIFJldHVybkRhdGEodm9pZCogYnVmZmVyLCBzaXplX3QgbGVuKSBvdmVycmlkZTsKLQotICBwcml2YXRlOgotICAgIEJ1ZmZlclNpbmsqIGJ1ZnNpbmtfOwotICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IGJ1ZmZlcl87Ci0gICAgc2l6ZV90IGJ1ZmZlcl9zaXplXzsKLSAgICBzaXplX3QgcmV0dXJuZWRfOworICAgIHNpemVfdCBoZWFkZXJfc2l6ZV87CiB9OwogCiB9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvaW5jbHVkZS9zbmFwdXNlcmQvc25hcHVzZXJkX2NsaWVudC5oIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9pbmNsdWRlL3NuYXB1c2VyZC9zbmFwdXNlcmRfY2xpZW50LmgKaW5kZXggMDEwYmViMy4uZWRlOTJkZCAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9pbmNsdWRlL3NuYXB1c2VyZC9zbmFwdXNlcmRfY2xpZW50LmgKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9pbmNsdWRlL3NuYXB1c2VyZC9zbmFwdXNlcmRfY2xpZW50LmgKQEAgLTE3LDExICsxNyw3IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlIDxjaHJvbm8+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dGhyZWFkPgotI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KIApAQCAtNTMsOSArNDksMTQgQEAKICAgICBleHBsaWNpdCBTbmFwdXNlcmRDbGllbnQoYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkJiYgc29ja2ZkKTsKICAgICBTbmFwdXNlcmRDbGllbnQoKXt9OwogCisgICAgLy8gQXR0ZW1wdCB0byBjb25uZWN0IHRvIHNuYXBzdWVyZCwgd2FpdCBmb3IgdGhlIGRhZW1vbiB0byBzdGFydCBpZgorICAgIC8vIGNvbm5lY3Rpb24gZmFpbGVkLgogICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8U25hcHVzZXJkQ2xpZW50PiBDb25uZWN0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzb2NrZXRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHRpbWVvdXRfbXMpOwotCisgICAgLy8gQXR0ZW1wdCB0byBjb25uZWN0IHRvIHNuYXBzdWVyZCwgYnV0IGRvZXMgbm90IHdhaXQgZm9yIHRoZSBkYWVtb24gdG8KKyAgICAvLyBzdGFydC4KKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFNuYXB1c2VyZENsaWVudD4gVHJ5Q29ubmVjdChjb25zdCBzdGQ6OnN0cmluZyYgc29ja2V0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyB0aW1lb3V0X21zKTsKICAgICBib29sIFN0b3BTbmFwdXNlcmQoKTsKIAogICAgIC8vIEluaXRpYWxpemluZyBhIHNuYXB1c2VyZCBoYW5kbGVyIGlzIGEgdGhyZWUtc3RlcCBwcm9jZXNzOgpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9pbmNsdWRlL3NuYXB1c2VyZC9zbmFwdXNlcmRfa2VybmVsLmggYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL2luY2x1ZGUvc25hcHVzZXJkL3NuYXB1c2VyZF9rZXJuZWwuaAppbmRleCBjNTkyMjU3Li4xNDI5MWIyIDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL2luY2x1ZGUvc25hcHVzZXJkL3NuYXB1c2VyZF9rZXJuZWwuaAorKysgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL2luY2x1ZGUvc25hcHVzZXJkL3NuYXB1c2VyZF9rZXJuZWwuaApAQCAtMTQsNiArMTQsOCBAQAogCiAjcHJhZ21hIG9uY2UKIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBzbmFwc2hvdCB7CiAKQEAgLTQwLDYgKzQyLDEwIEBACiAgKiBtdWx0aXBsZSBvZiA1MTIgYnl0ZXMuIEhlbmNlIHRoZXNlIHR3byBjb25zdGFudHMuCiAgKi8KIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgU0VDVE9SX1NISUZUID0gOTsKK3N0YXRpYyBjb25zdGV4cHIgdWludDY0X3QgU0VDVE9SX1NJWkUgPSAoMVVMTCA8PCBTRUNUT1JfU0hJRlQpOworCitzdGF0aWMgY29uc3RleHByIHNpemVfdCBCTE9DS19TWiA9IDQwOTY7CitzdGF0aWMgY29uc3RleHByIHNpemVfdCBCTE9DS19TSElGVCA9IChfX2J1aWx0aW5fZmZzKEJMT0NLX1NaKSAtIDEpOwogCiB0eXBlZGVmIF9fdTY0IHNlY3Rvcl90OwogdHlwZWRlZiBzZWN0b3JfdCBjaHVua190OwpAQCAtNjYsNyArNzIsNyBAQAogCiAgICAgLyogSW4gc2VjdG9ycyAqLwogICAgIHVpbnQzMl90IGNodW5rX3NpemU7Ci19IF9fcGFja2VkOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLy8gQSBkaXNrIGV4Y2VwdGlvbiBpcyBhIG1hcHBpbmcgb2Ygb2xkX2NodW5rIHRvIG5ld19jaHVuawogLy8gb2xkX2NodW5rIGlzIHRoZSBjaHVuayBJRCBvZiBhIGRtLXNuYXBzaG90IGRldmljZS4KQEAgLTc0LDcgKzgwLDcgQEAKIHN0cnVjdCBkaXNrX2V4Y2VwdGlvbiB7CiAgICAgdWludDY0X3Qgb2xkX2NodW5rOwogICAgIHVpbnQ2NF90IG5ld19jaHVuazsKLX0gX19wYWNrZWQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvLyBDb250cm9sIHN0cnVjdHVyZXMgdG8gY29tbXVuaWNhdGUgd2l0aCBkbS11c2VyCiAvLyBJdCBjb21wcmlzZXMgb2YgaGVhZGVyIGFuZCBhIHBheWxvYWQKQEAgLTg2LDE1ICs5Miw1IEBACiAgICAgX191NjQgbGVuOwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAotc3RydWN0IGRtX3VzZXJfcGF5bG9hZCB7Ci0gICAgX191OCBidWZbXTsKLX07Ci0KLS8vIE1lc3NhZ2UgY29tcHJpc2luZyBib3RoIGhlYWRlciBhbmQgcGF5bG9hZAotc3RydWN0IGRtX3VzZXJfbWVzc2FnZSB7Ci0gICAgc3RydWN0IGRtX3VzZXJfaGVhZGVyIGhlYWRlcjsKLSAgICBzdHJ1Y3QgZG1fdXNlcl9wYXlsb2FkIHBheWxvYWQ7Ci19OwotCiB9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3NuYXB1c2VyZF9idWZmZXIuY3BwIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9zbmFwdXNlcmRfYnVmZmVyLmNwcAppbmRleCBhYjc2M2FiLi41MWIyNDkwIDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3NuYXB1c2VyZF9idWZmZXIuY3BwCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvc25hcHVzZXJkX2J1ZmZlci5jcHAKQEAgLTE1LDIzICsxNSwzOCBAQAogICovCiAKICNpbmNsdWRlIDxzbmFwdXNlcmQvc25hcHVzZXJkX2J1ZmZlci5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxzbmFwdXNlcmQvc25hcHVzZXJkX2tlcm5lbC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2Ugc25hcHNob3QgewogCi12b2lkIEJ1ZmZlclNpbms6OkluaXRpYWxpemUoc2l6ZV90IHNpemUpIHsKLSAgICBidWZmZXJfc2l6ZV8gPSBzaXplOwordm9pZCBCdWZmZXJTaW5rOjpJbml0aWFsaXplKHNpemVfdCBoZWFkZXJfc2l6ZSwgc2l6ZV90IHNpemUpIHsKKyAgICBoZWFkZXJfc2l6ZV8gPSBoZWFkZXJfc2l6ZTsKKyAgICBidWZmZXJfc2l6ZV8gPSBzaXplICsgaGVhZGVyX3NpemU7CiAgICAgYnVmZmVyX29mZnNldF8gPSAwOwotICAgIGJ1ZmZlcl8gPSBzdGQ6Om1ha2VfdW5pcXVlPHVpbnQ4X3RbXT4oc2l6ZSk7CisgICAgYnVmZmVyXyA9IHN0ZDo6bWFrZV91bmlxdWU8dWludDhfdFtdPihidWZmZXJfc2l6ZV8pOworfQorCit2b2lkKiBCdWZmZXJTaW5rOjpBY3F1aXJlQnVmZmVyKHNpemVfdCBzaXplLCBzaXplX3QgdG9fd3JpdGUpIHsKKyAgICBDSEVDSyh0b193cml0ZSA8PSBzaXplKTsKKworICAgIHZvaWQqIHB0ciA9IEdldFBheWxvYWRCdWZmZXIoc2l6ZSk7CisgICAgaWYgKCFwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIFVwZGF0ZUJ1ZmZlck9mZnNldCh0b193cml0ZSk7CisgICAgcmV0dXJuIHB0cjsKIH0KIAogdm9pZCogQnVmZmVyU2luazo6R2V0UGF5bG9hZEJ1ZmZlcihzaXplX3Qgc2l6ZSkgewotICAgIGlmICgoYnVmZmVyX3NpemVfIC0gYnVmZmVyX29mZnNldF8pIDwgc2l6ZSkgcmV0dXJuIG51bGxwdHI7Ci0KICAgICBjaGFyKiBidWZmZXIgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihHZXRCdWZQdHIoKSk7Ci0gICAgc3RydWN0IGRtX3VzZXJfbWVzc2FnZSogbXNnID0gKHN0cnVjdCBkbV91c2VyX21lc3NhZ2UqKSgmKGJ1ZmZlclswXSkpOwotICAgIHJldHVybiAoY2hhciopbXNnLT5wYXlsb2FkLmJ1ZiArIGJ1ZmZlcl9vZmZzZXRfOworCisgICAgaWYgKChidWZmZXJfc2l6ZV8gLSBidWZmZXJfb2Zmc2V0XyAtIGhlYWRlcl9zaXplXykgPCBzaXplKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gKGNoYXIqKSgmYnVmZmVyWzBdICsgaGVhZGVyX3NpemVfICsgYnVmZmVyX29mZnNldF8pOwogfQogCiB2b2lkKiBCdWZmZXJTaW5rOjpHZXRCdWZmZXIoc2l6ZV90IHJlcXVlc3RlZCwgc2l6ZV90KiBhY3R1YWwpIHsKQEAgLTQ0LDUyICs1OSwxOCBAQAogICAgIHJldHVybiBidWY7CiB9CiAKLXN0cnVjdCBkbV91c2VyX2hlYWRlciogQnVmZmVyU2luazo6R2V0SGVhZGVyUHRyKCkgewotICAgIGlmICghKHNpemVvZihzdHJ1Y3QgZG1fdXNlcl9oZWFkZXIpIDw9IGJ1ZmZlcl9zaXplXykpIHsKK3ZvaWQqIEJ1ZmZlclNpbms6OkdldEhlYWRlclB0cigpIHsKKyAgICAvLyBJZiBubyBzdWZmaWNpZW50IHNwYWNlIG9yIGhlYWRlciBub3QgcmVzZXJ2ZWQKKyAgICBpZiAoIShoZWFkZXJfc2l6ZV8gPD0gYnVmZmVyX3NpemVfKSB8fCAhaGVhZGVyX3NpemVfKSB7CiAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KICAgICBjaGFyKiBidWYgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihHZXRCdWZQdHIoKSk7Ci0gICAgc3RydWN0IGRtX3VzZXJfaGVhZGVyKiBoZWFkZXIgPSAoc3RydWN0IGRtX3VzZXJfaGVhZGVyKikoJihidWZbMF0pKTsKLSAgICByZXR1cm4gaGVhZGVyOworICAgIHJldHVybiAodm9pZCopKCYoYnVmWzBdKSk7CiB9CiAKIHZvaWQqIEJ1ZmZlclNpbms6OkdldFBheWxvYWRCdWZQdHIoKSB7CiAgICAgY2hhciogYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oR2V0QnVmUHRyKCkpOwotICAgIHN0cnVjdCBkbV91c2VyX21lc3NhZ2UqIG1zZyA9IHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IGRtX3VzZXJfbWVzc2FnZSo+KCYoYnVmZmVyWzBdKSk7Ci0gICAgcmV0dXJuIG1zZy0+cGF5bG9hZC5idWY7Ci19Ci0KLXZvaWQgWG9yU2luazo6SW5pdGlhbGl6ZShCdWZmZXJTaW5rKiBzaW5rLCBzaXplX3Qgc2l6ZSkgewotICAgIGJ1ZnNpbmtfID0gc2luazsKLSAgICBidWZmZXJfc2l6ZV8gPSBzaXplOwotICAgIHJldHVybmVkXyA9IDA7Ci0gICAgYnVmZmVyXyA9IHN0ZDo6bWFrZV91bmlxdWU8dWludDhfdFtdPihzaXplKTsKLX0KLQotdm9pZCBYb3JTaW5rOjpSZXNldCgpIHsKLSAgICByZXR1cm5lZF8gPSAwOwotfQotCi12b2lkKiBYb3JTaW5rOjpHZXRCdWZmZXIoc2l6ZV90IHJlcXVlc3RlZCwgc2l6ZV90KiBhY3R1YWwpIHsKLSAgICBpZiAocmVxdWVzdGVkID4gYnVmZmVyX3NpemVfKSB7Ci0gICAgICAgICphY3R1YWwgPSBidWZmZXJfc2l6ZV87Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKmFjdHVhbCA9IHJlcXVlc3RlZDsKLSAgICB9Ci0gICAgcmV0dXJuIGJ1ZmZlcl8uZ2V0KCk7Ci19Ci0KLWJvb2wgWG9yU2luazo6UmV0dXJuRGF0YSh2b2lkKiBidWZmZXIsIHNpemVfdCBsZW4pIHsKLSAgICB1aW50OF90KiB4b3JfZGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGJ1ZmZlcik7Ci0gICAgdWludDhfdCogYnVmZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGJ1ZnNpbmtfLT5HZXRQYXlsb2FkQnVmZmVyKGxlbiArIHJldHVybmVkXykpOwotICAgIGlmIChidWZmID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgIGJ1ZmZbcmV0dXJuZWRfICsgaV0gXj0geG9yX2RhdGFbaV07Ci0gICAgfQotICAgIHJldHVybmVkXyArPSBsZW47Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuICZidWZmZXJbaGVhZGVyX3NpemVfXTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90CmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3NuYXB1c2VyZF9jbGllbnQuY3BwIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9zbmFwdXNlcmRfY2xpZW50LmNwcAppbmRleCAzYmVkM2E0Li43YzgyMGYzIDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3NuYXB1c2VyZF9jbGllbnQuY3BwCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvc25hcHVzZXJkX2NsaWVudC5jcHAKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPGNocm9ubz4KLSNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHRocmVhZD4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CiAjaW5jbHVkZSA8ZnNfbWdyL2ZpbGVfd2FpdC5oPgorI2luY2x1ZGUgPGxpYmRtL2RtLmg+CiAjaW5jbHVkZSA8c25hcHVzZXJkL3NuYXB1c2VyZF9jbGllbnQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNjQsNiArNjUsNDAgQEAKICAgICByZXR1cm4gZXJybm8gPT0gRUNPTk5SRUZVU0VEIHx8IGVycm5vID09IEVJTlRSIHx8IGVycm5vID09IEVOT0VOVDsKIH0KIAorc3RkOjp1bmlxdWVfcHRyPFNuYXB1c2VyZENsaWVudD4gU25hcHVzZXJkQ2xpZW50OjpUcnlDb25uZWN0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzb2NrZXRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHRpbWVvdXRfbXMpIHsKKyAgICB1bmlxdWVfZmQgZmQ7CisgICAgY29uc3QgYXV0byBzdGFydCA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGZkLnJlc2V0KFRFTVBfRkFJTFVSRV9SRVRSWShzb2NrZXRfbG9jYWxfY2xpZW50KAorICAgICAgICAgICAgICAgIHNvY2tldF9uYW1lLmNfc3RyKCksIEFORFJPSURfU09DS0VUX05BTUVTUEFDRV9SRVNFUlZFRCwgU09DS19TVFJFQU0pKSk7CisgICAgICAgIGlmIChmZCA+PSAwKSB7CisgICAgICAgICAgICBhdXRvIGNsaWVudCA9IHN0ZDo6bWFrZV91bmlxdWU8U25hcHVzZXJkQ2xpZW50PihzdGQ6Om1vdmUoZmQpKTsKKyAgICAgICAgICAgIGlmICghY2xpZW50LT5WYWxpZGF0ZUNvbm5lY3Rpb24oKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNsaWVudDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXJybm8gPT0gRU5PRU5UKSB7CisgICAgICAgICAgICBMT0coSU5GTykgPDwgIkRhZW1vbiBzb2NrZXQgIiA8PCBzb2NrZXRfbmFtZQorICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZG9lcyBub3QgZXhpc3QsIHJldHVybiB3aXRob3V0IHdhaXRpbmcuIjsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGlmIChlcnJubyA9PSBFQ09OTlJFRlVTRUQpIHsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gbm93ID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CisgICAgICAgICAgICBjb25zdCBhdXRvIGVsYXBzZWQgPSBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzPihub3cgLSBzdGFydCk7CisgICAgICAgICAgICBpZiAoZWxhcHNlZCA+PSB0aW1lb3V0X21zKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVGltZWQgb3V0IGNvbm5lY3RpbmcgdG8gc25hcHVzZXJkIHNvY2tldDogIiA8PCBzb2NrZXRfbmFtZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcigxMG1zKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJjb25uZWN0IGZhaWxlZDogIiA8PCBzb2NrZXRfbmFtZTsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgfQorfQorCiBzdGQ6OnVuaXF1ZV9wdHI8U25hcHVzZXJkQ2xpZW50PiBTbmFwdXNlcmRDbGllbnQ6OkNvbm5lY3QoY29uc3Qgc3RkOjpzdHJpbmcmIHNvY2tldF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgdGltZW91dF9tcykgewogICAgIHVuaXF1ZV9mZCBmZDsKQEAgLTI3Niw2ICszMTEsMTEgQEAKICAgICB9CiAgICAgc3RkOjpzdHJpbmcgcmVzcG9uc2UgPSBSZWNlaXZlbXNnKCk7CiAKKyAgICAvLyBJZiBzZXJ2ZXIgc29ja2V0IGRpc2Nvbm5lY3RzIG1vc3QgbGlrZWx5IGJlY2F1c2Ugb2YgZGV2aWNlIHJlYm9vdCwKKyAgICAvLyB0aGVuIHdlIGp1c3QgcmV0dXJuIDAuCisgICAgaWYgKHJlc3BvbnNlLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIDAuMDsKKyAgICB9CiAgICAgcmV0dXJuIHN0ZDo6c3RvZChyZXNwb25zZSk7CiB9CiAKQEAgLTI5OSw3ICszMzksMjEgQEAKIH0KIAogc3RkOjpzdHJpbmcgU25hcHVzZXJkQ2xpZW50OjpHZXREYWVtb25BbGl2ZUluZGljYXRvclBhdGgoKSB7Ci0gICAgcmV0dXJuICIvbWV0YWRhdGEvb3RhLyIgKyBzdGQ6OnN0cmluZyhrRGFlbW9uQWxpdmVJbmRpY2F0b3IpOworICAgIHN0ZDo6c3RyaW5nIG1ldGFkYXRhX2RpcjsKKyAgICBzdGQ6OnN0cmluZyB0ZW1wX21ldGFkYXRhX21udCA9ICIvbW50L3NjcmF0Y2hfb3RhX21ldGFkYXRhX3N1cGVyIjsKKworICAgIGF1dG8mIGRtID0gOjphbmRyb2lkOjpkbTo6RGV2aWNlTWFwcGVyOjpJbnN0YW5jZSgpOworICAgIGF1dG8gcGFydGl0aW9uX25hbWUgPSBhbmRyb2lkOjpiYXNlOjpCYXNlbmFtZSh0ZW1wX21ldGFkYXRhX21udCk7CisKKyAgICBib29sIGludmFsaWRfcGFydGl0aW9uID0gKGRtLkdldFN0YXRlKHBhcnRpdGlvbl9uYW1lKSA9PSBkbTo6RG1EZXZpY2VTdGF0ZTo6SU5WQUxJRCk7CisgICAgc3RkOjpzdHJpbmcgdGVtcF9kZXZpY2U7CisgICAgaWYgKCFpbnZhbGlkX3BhcnRpdGlvbiAmJiBkbS5HZXREbURldmljZVBhdGhCeU5hbWUocGFydGl0aW9uX25hbWUsICZ0ZW1wX2RldmljZSkpIHsKKyAgICAgICAgbWV0YWRhdGFfZGlyID0gdGVtcF9tZXRhZGF0YV9tbnQgKyAiLyIgKyAib3RhLyI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWV0YWRhdGFfZGlyID0gIi9tZXRhZGF0YS9vdGEvIjsKKyAgICB9CisKKyAgICByZXR1cm4gbWV0YWRhdGFfZGlyICsgc3RkOjpzdHJpbmcoa0RhZW1vbkFsaXZlSW5kaWNhdG9yKTsKIH0KIAogYm9vbCBTbmFwdXNlcmRDbGllbnQ6OklzVHJhbnNpdGlvbmVkRGFlbW9uUmVhZHkoKSB7CmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3NuYXB1c2VyZF9kYWVtb24uY3BwIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9zbmFwdXNlcmRfZGFlbW9uLmNwcAppbmRleCBhZTIwZTFmLi4zMmUxNmNjIDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3NuYXB1c2VyZF9kYWVtb24uY3BwCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvc25hcHVzZXJkX2RhZW1vbi5jcHAKQEAgLTI5LDYgKzI5LDkgQEAKICAgICAgICAgICAgICJJZiB0cnVlLCBwZXJmb3JtIGEgc29ja2V0IGhhbmQtb2ZmIHdpdGggYW4gZXhpc3Rpbmcgc25hcHVzZXJkIGluc3RhbmNlLCB0aGVuIGV4aXQuIik7CiBERUZJTkVfYm9vbCh1c2VyX3NuYXBzaG90LCBmYWxzZSwgIklmIHRydWUsIHVzZXItc3BhY2Ugc25hcHNob3RzIGFyZSB1c2VkIik7CiBERUZJTkVfYm9vbChpb191cmluZywgZmFsc2UsICJJZiB0cnVlLCBpb191cmluZyBmZWF0dXJlIGlzIGVuYWJsZWQiKTsKK0RFRklORV9ib29sKG9fZGlyZWN0LCBmYWxzZSwgIklmIHRydWUsIGVuYWJsZSBkaXJlY3QgcmVhZHMgb24gc291cmNlIGRldmljZSIpOworREVGSU5FX2ludDMyKGNvd19vcF9tZXJnZV9zaXplLCAwLCAibnVtYmVyIG9mIG9wZXJhdGlvbnMgdG8gYmUgcHJvY2Vzc2VkIGF0IG9uY2UiKTsKK0RFRklORV9pbnQzMih3b3JrZXJfY291bnQsIDQsICJudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgdXNlZCB0byBzZXJ2ZSBJL08gcmVxdWVzdHMgdG8gZG0tdXNlciIpOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2Ugc25hcHNob3QgewpAQCAtMzgsMjAgKzQxLDIwIEBACiAgICAgY29uc3Qgc3RkOjpzdHJpbmcgdmVuZG9yX3JlbGVhc2UgPQogICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6R2V0UHJvcGVydHkoInJvLnZlbmRvci5idWlsZC52ZXJzaW9uLnJlbGVhc2Vfb3JfY29kZW5hbWUiLCBVTktOT1dOKTsKIAotICAgIC8vIE5vIHVzZXItc3BhY2Ugc25hcHNob3RzIGlmIHZlbmRvciBwYXJ0aXRpb24gaXMgb24gQW5kcm9pZCAxMgorICAgIC8vIElmIHRoZSB2ZW5kb3IgaXMgb24gQW5kcm9pZCBTLCBpbnN0YWxsIHByb2Nlc3Mgd2lsbCBmb3JjZWZ1bGx5IHRha2UgdGhlCisgICAgLy8gdXNlcnNwYWNlIHNuYXBzaG90cyBwYXRoLgorICAgIC8vCisgICAgLy8gV2Ugd2lsbCBub3QgcmVhY2ggaGVyZSBwb3N0IE9UQSByZWJvb3QgYXMgdGhlIGJpbmFyeSB3aWxsIGJlIGZyb20gdmVuZG9yCisgICAgLy8gcmFtZGlzayB3aGljaCBpcyBvbiBBbmRyb2lkIFMuCiAgICAgaWYgKHZlbmRvcl9yZWxlYXNlLmZpbmQoIjEyIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgTE9HKElORk8pIDw8ICJVc2Vyc3BhY2Ugc25hcHNob3RzIGRpc2FibGVkIGFzIHZlbmRvciBwYXJ0aXRpb24gaXMgb24gQW5kcm9pZDogIgorICAgICAgICBMT0coSU5GTykgPDwgIlVzZXJzcGFjZSBzbmFwc2hvdHMgZW5hYmxlZCBhcyB2ZW5kb3IgcGFydGl0aW9uIGlzIG9uIEFuZHJvaWQ6ICIKICAgICAgICAgICAgICAgICAgIDw8IHZlbmRvcl9yZWxlYXNlOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpHZXRCb29sUHJvcGVydHkoInJvLnZpcnR1YWxfYWIudXNlcnNwYWNlLnNuYXBzaG90cy5lbmFibGVkIiwgZmFsc2UpOwogfQogCi1ib29sIERhZW1vbjo6SXNEbVNuYXBzaG90VGVzdGluZ0VuYWJsZWQoKSB7Ci0gICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OkdldEJvb2xQcm9wZXJ0eSgic25hcHVzZXJkLnRlc3QuZG0uc25hcHNob3RzIiwgZmFsc2UpOwotfQotCiBib29sIERhZW1vbjo6U3RhcnREYWVtb24oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CiAgICAgaW50IGFyZ19zdGFydCA9IGdmbGFnczo6UGFyc2VDb21tYW5kTGluZUZsYWdzKCZhcmdjLCAmYXJndiwgdHJ1ZSk7CiAKQEAgLTY1LDE2ICs2OCwxNSBAQAogICAgIC8vIHN0YWdlIGluaXQgYW5kIGhlbmNlIHVzZSB0aGUgY29tbWFuZCBsaW5lIGZsYWdzIHRvIGdldCB0aGUgaW5mb3JtYXRpb24uCiAgICAgYm9vbCB1c2VyX3NuYXBzaG90cyA9IEZMQUdTX3VzZXJfc25hcHNob3Q7CiAgICAgaWYgKCF1c2VyX3NuYXBzaG90cykgewotICAgICAgICB1c2VyX3NuYXBzaG90cyA9ICghSXNEbVNuYXBzaG90VGVzdGluZ0VuYWJsZWQoKSAmJiBJc1VzZXJzcGFjZVNuYXBzaG90c0VuYWJsZWQoKSk7CisgICAgICAgIHVzZXJfc25hcHNob3RzID0gSXNVc2Vyc3BhY2VTbmFwc2hvdHNFbmFibGVkKCk7CiAgICAgfQotCiAgICAgaWYgKHVzZXJfc25hcHNob3RzKSB7CiAgICAgICAgIExPRyhJTkZPKSA8PCAiU3RhcnRpbmcgZGFlbW9uIGZvciB1c2VyLXNwYWNlIHNuYXBzaG90cy4uLi4uIjsKICAgICAgICAgcmV0dXJuIFN0YXJ0U2VydmVyRm9yVXNlcnNwYWNlU25hcHNob3RzKGFyZ19zdGFydCwgYXJnYywgYXJndik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgTE9HKElORk8pIDw8ICJTdGFydGluZyBkYWVtb24gZm9yIGRtLXNuYXBzaG90cy4uLi4uIjsKLSAgICAgICAgcmV0dXJuIFN0YXJ0U2VydmVyRm9yRG1TbmFwc2hvdChhcmdfc3RhcnQsIGFyZ2MsIGFyZ3YpOworICAgICAgICBMT0coRVJST1IpIDw8ICJVc2Vyc3BhY2Ugc25hcHNob3RzIG5vdCBlbmFibGVkLiBObyBzdXBwb3J0IGZvciBsZWdhY3kgc25hcHNob3RzIjsKICAgICB9CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiBib29sIERhZW1vbjo6U3RhcnRTZXJ2ZXJGb3JVc2Vyc3BhY2VTbmFwc2hvdHMoaW50IGFyZ19zdGFydCwgaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CkBAIC0xMDYsMTUgKzEwOCwxNyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiB1c2VyX3NlcnZlcl8uUnVuKCk7CiAgICAgfQotCiAgICAgZm9yIChpbnQgaSA9IGFyZ19zdGFydDsgaSA8IGFyZ2M7IGkrKykgewogICAgICAgICBhdXRvIHBhcnRzID0gYW5kcm9pZDo6YmFzZTo6U3BsaXQoYXJndltpXSwgIiwiKTsKKwogICAgICAgICBpZiAocGFydHMuc2l6ZSgpICE9IDQpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk1hbGZvcm1lZCBtZXNzYWdlLCBleHBlY3RlZCBmb3VyIHN1Yi1hcmd1bWVudHMuIjsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk1hbGZvcm1lZCBtZXNzYWdlLCBleHBlY3RlZCBhdCBsZWFzdCBmb3VyIHN1Yi1hcmd1bWVudHMuIjsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBhdXRvIGhhbmRsZXIgPSB1c2VyX3NlcnZlcl8uQWRkSGFuZGxlcihwYXJ0c1swXSwgcGFydHNbMV0sIHBhcnRzWzJdLCBwYXJ0c1szXSk7Ci0gICAgICAgIGlmICghaGFuZGxlciB8fCAhdXNlcl9zZXJ2ZXJfLlN0YXJ0SGFuZGxlcihoYW5kbGVyKSkgeworICAgICAgICBhdXRvIGhhbmRsZXIgPQorICAgICAgICAgICAgICAgIHVzZXJfc2VydmVyXy5BZGRIYW5kbGVyKHBhcnRzWzBdLCBwYXJ0c1sxXSwgcGFydHNbMl0sIHBhcnRzWzNdLCBGTEFHU193b3JrZXJfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxBR1Nfb19kaXJlY3QsIEZMQUdTX2Nvd19vcF9tZXJnZV9zaXplKTsKKyAgICAgICAgaWYgKCFoYW5kbGVyIHx8ICF1c2VyX3NlcnZlcl8uU3RhcnRIYW5kbGVyKHBhcnRzWzBdKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQpAQCAtMTMwLDQ4ICsxMzQsNiBAQAogICAgIHJldHVybiB1c2VyX3NlcnZlcl8uV2FpdEZvclNvY2tldCgpOwogfQogCi1ib29sIERhZW1vbjo6U3RhcnRTZXJ2ZXJGb3JEbVNuYXBzaG90KGludCBhcmdfc3RhcnQsIGludCBhcmdjLCBjaGFyKiogYXJndikgewotICAgIHNpZ2ZpbGxzZXQoJnNpZ25hbF9tYXNrXyk7Ci0gICAgc2lnZGVsc2V0KCZzaWduYWxfbWFza18sIFNJR0lOVCk7Ci0gICAgc2lnZGVsc2V0KCZzaWduYWxfbWFza18sIFNJR1RFUk0pOwotICAgIHNpZ2RlbHNldCgmc2lnbmFsX21hc2tfLCBTSUdVU1IxKTsKLQotICAgIC8vIE1hc2tpbmcgc2lnbmFscyBoZXJlIGVuc3VyZSB0aGF0IGFmdGVyIHRoaXMgcG9pbnQsIHdlIHdvbid0IGhhbmRsZSBJTlQvVEVSTQotICAgIC8vIHVudGlsIGFmdGVyIHdlIGNhbGwgaW50byBwcG9sbCgpCi0gICAgc2lnbmFsKFNJR0lOVCwgRGFlbW9uOjpTaWduYWxIYW5kbGVyKTsKLSAgICBzaWduYWwoU0lHVEVSTSwgRGFlbW9uOjpTaWduYWxIYW5kbGVyKTsKLSAgICBzaWduYWwoU0lHUElQRSwgRGFlbW9uOjpTaWduYWxIYW5kbGVyKTsKLSAgICBzaWduYWwoU0lHVVNSMSwgRGFlbW9uOjpTaWduYWxIYW5kbGVyKTsKLQotICAgIE1hc2tBbGxTaWduYWxzRXhjZXB0SW50QW5kVGVybSgpOwotCi0gICAgaWYgKEZMQUdTX3NvY2tldF9oYW5kb2ZmKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2ZXJfLlJ1bkZvclNvY2tldEhhbmRvZmYoKTsKLSAgICB9Ci0gICAgaWYgKCFGTEFHU19ub19zb2NrZXQpIHsKLSAgICAgICAgaWYgKCFzZXJ2ZXJfLlN0YXJ0KEZMQUdTX3NvY2tldCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2VydmVyXy5SdW4oKTsKLSAgICB9Ci0KLSAgICBmb3IgKGludCBpID0gYXJnX3N0YXJ0OyBpIDwgYXJnYzsgaSsrKSB7Ci0gICAgICAgIGF1dG8gcGFydHMgPSBhbmRyb2lkOjpiYXNlOjpTcGxpdChhcmd2W2ldLCAiLCIpOwotICAgICAgICBpZiAocGFydHMuc2l6ZSgpICE9IDMpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk1hbGZvcm1lZCBtZXNzYWdlLCBleHBlY3RlZCB0aHJlZSBzdWItYXJndW1lbnRzLiI7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgYXV0byBoYW5kbGVyID0gc2VydmVyXy5BZGRIYW5kbGVyKHBhcnRzWzBdLCBwYXJ0c1sxXSwgcGFydHNbMl0pOwotICAgICAgICBpZiAoIWhhbmRsZXIgfHwgIXNlcnZlcl8uU3RhcnRIYW5kbGVyKGhhbmRsZXIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBTa2lwIHRoZSBhY2NlcHQoKSBjYWxsIHRvIGF2b2lkIHNwdXJpb3VzIGxvZyBzcGFtLiBUaGUgc2VydmVyIHdpbGwgc3RpbGwKLSAgICAvLyBydW4gdW50aWwgYWxsIGhhbmRsZXJzIGhhdmUgY29tcGxldGVkLgotICAgIHJldHVybiBzZXJ2ZXJfLldhaXRGb3JTb2NrZXQoKTsKLX0KLQogdm9pZCBEYWVtb246Ok1hc2tBbGxTaWduYWxzRXhjZXB0SW50QW5kVGVybSgpIHsKICAgICBzaWdzZXRfdCBzaWduYWxfbWFzazsKICAgICBzaWdmaWxsc2V0KCZzaWduYWxfbWFzayk7CkBAIC0xOTgsMTYgKzE2MCwxMiBAQAogICAgIC8vIGFuZCB2ZXJpZnkgaXQgdGhyb3VnaCBhIHRlbXAgdmFyaWFibGUuCiAgICAgaWYgKHVzZXJfc2VydmVyXy5Jc1NlcnZlclJ1bm5pbmcoKSkgewogICAgICAgICB1c2VyX3NlcnZlcl8uSW50ZXJydXB0KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2VydmVyXy5JbnRlcnJ1cHQoKTsKICAgICB9CiB9CiAKIHZvaWQgRGFlbW9uOjpSZWNlaXZlZFNvY2tldFNpZ25hbCgpIHsKICAgICBpZiAodXNlcl9zZXJ2ZXJfLklzU2VydmVyUnVubmluZygpKSB7CiAgICAgICAgIHVzZXJfc2VydmVyXy5SZWNlaXZlZFNvY2tldFNpZ25hbCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNlcnZlcl8uUmVjZWl2ZWRTb2NrZXRTaWduYWwoKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvc25hcHVzZXJkX2RhZW1vbi5oIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9zbmFwdXNlcmRfZGFlbW9uLmgKaW5kZXggY2YzYjkxNy4uMzAzZTM5NCAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9zbmFwdXNlcmRfZGFlbW9uLmgKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9zbmFwdXNlcmRfZGFlbW9uLmgKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogCi0jaW5jbHVkZSAiZG0tc25hcHNob3QtbWVyZ2Uvc25hcHVzZXJkX3NlcnZlci5oIgogI2luY2x1ZGUgInVzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX3NlcnZlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0zNiwxMiArMzUsMTAgQEAKICAgICAgICAgcmV0dXJuIGluc3RhbmNlOwogICAgIH0KIAotICAgIGJvb2wgU3RhcnRTZXJ2ZXJGb3JEbVNuYXBzaG90KGludCBhcmdfc3RhcnQsIGludCBhcmdjLCBjaGFyKiogYXJndik7CiAgICAgYm9vbCBTdGFydFNlcnZlckZvclVzZXJzcGFjZVNuYXBzaG90cyhpbnQgYXJnX3N0YXJ0LCBpbnQgYXJnYywgY2hhcioqIGFyZ3YpOwogICAgIHZvaWQgSW50ZXJydXB0KCk7CiAgICAgdm9pZCBSZWNlaXZlZFNvY2tldFNpZ25hbCgpOwogICAgIGJvb2wgSXNVc2Vyc3BhY2VTbmFwc2hvdHNFbmFibGVkKCk7Ci0gICAgYm9vbCBJc0RtU25hcHNob3RUZXN0aW5nRW5hYmxlZCgpOwogICAgIGJvb2wgU3RhcnREYWVtb24oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KTsKIAogICBwcml2YXRlOgpAQCAtNTEsNyArNDgsNiBAQAogICAgIERhZW1vbihEYWVtb24gY29uc3QmKSA9IGRlbGV0ZTsKICAgICB2b2lkIG9wZXJhdG9yPShEYWVtb24gY29uc3QmKSA9IGRlbGV0ZTsKIAotICAgIFNuYXB1c2VyZFNlcnZlciBzZXJ2ZXJfOwogICAgIFVzZXJTbmFwc2hvdFNlcnZlciB1c2VyX3NlcnZlcl87CiAgICAgdm9pZCBNYXNrQWxsU2lnbmFsc0V4Y2VwdEludEFuZFRlcm0oKTsKICAgICB2b2lkIE1hc2tBbGxTaWduYWxzKCk7CmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3NuYXB1c2VyZF9leHRyYWN0b3IuY3BwIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9zbmFwdXNlcmRfZXh0cmFjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDZjZDViCi0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9zbmFwdXNlcmRfZXh0cmFjdG9yLmNwcApAQCAtMCwwICsxLDY4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgorI2luY2x1ZGUgPGdmbGFncy9nZmxhZ3MuaD4KKyNpbmNsdWRlICJ1c2VyLXNwYWNlLW1lcmdlL2V4dHJhY3Rvci5oIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOjpzdHJpbmdfbGl0ZXJhbHM7CisKK0RFRklORV9zdHJpbmcoYmFzZSwgIiIsICJCYXNlIGRldmljZS9pbWFnZSIpOworREVGSU5FX3N0cmluZyhjb3csICIiLCAiQ09XIGRldmljZS9pbWFnZSIpOworREVGSU5FX3N0cmluZyhvdXQsICIiLCAiT3V0cHV0IHBhdGgiKTsKK0RFRklORV9pbnQzMihudW1fc2VjdG9ycywgMCwgIk51bWJlciBvZiBzZWN0b3JzIHRvIHJlYWQiKTsKKworaW50IG1haW4oW1ttYXliZV91bnVzZWRdXSBpbnQgYXJnYywgW1ttYXliZV91bnVzZWRdXSBjaGFyKiogYXJndikgeworICAgIGFuZHJvaWQ6OmJhc2U6OkluaXRMb2dnaW5nKGFyZ3YpOworICAgIGdmbGFnczo6UGFyc2VDb21tYW5kTGluZUZsYWdzKCZhcmdjLCAmYXJndiwgdHJ1ZSk7CisKKyAgICBpZiAoRkxBR1Nfb3V0LmVtcHR5KCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiTWlzc2luZyAtb3V0IGFyZ3VtZW50LiI7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoRkxBR1NfYmFzZS5lbXB0eSgpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIk1pc3NpbmcgLWJhc2UgYXJndW1lbnQuIjsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChGTEFHU19jb3cuZW1wdHkoKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJtaXNzaW5nIC1vdXQgYXJndW1lbnQuIjsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICghRkxBR1NfbnVtX3NlY3RvcnMpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAibWlzc2luZyAtbnVtX3NlY3RvcnMgYXJndW1lbnQuIjsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgYW5kcm9pZDo6c25hcHNob3Q6OkV4dHJhY3RvciBleHRyYWN0b3IoRkxBR1NfYmFzZSwgRkxBR1NfY293KTsKKyAgICBpZiAoIWV4dHJhY3Rvci5Jbml0KCkpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICghZXh0cmFjdG9yLkV4dHJhY3QoRkxBR1NfbnVtX3NlY3RvcnMsIEZMQUdTX291dCkpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9zbmFwdXNlcmRfbG9nZ2luZy5oIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC9zbmFwdXNlcmRfbG9nZ2luZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNDcwY2UKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3NuYXB1c2VyZF9sb2dnaW5nLmgKQEAgLTAsMCArMSwyMCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2RlZmluZSBTTkFQX0xPRyhsZXZlbCkgTE9HKGxldmVsKSA8PCBtaXNjX25hbWVfIDw8ICI6ICIKKyNkZWZpbmUgU05BUF9QTE9HKGxldmVsKSBQTE9HKGxldmVsKSA8PCBtaXNjX25hbWVfIDw8ICI6ICIKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdGVzdGluZy9kbV91c2VyX2hhcm5lc3MuY3BwIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC90ZXN0aW5nL2RtX3VzZXJfaGFybmVzcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NhZGYyNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdGVzdGluZy9kbV91c2VyX2hhcm5lc3MuY3BwCkBAIC0wLDAgKzEsNjcgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiZG1fdXNlcl9oYXJuZXNzLmgiCisKKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxmc19tZ3IvZmlsZV93YWl0Lmg+CisjaW5jbHVkZSA8bGliZG0vZG0uaD4KKyNpbmNsdWRlIDxzbmFwdXNlcmQvZG1fdXNlcl9ibG9ja19zZXJ2ZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHNuYXBzaG90IHsKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOworCitEbVVzZXJEZXZpY2U6OkRtVXNlckRldmljZShzdGQ6OnVuaXF1ZV9wdHI8VGVtcGRldmljZT4mJiBkZXYpIDogZGV2XyhzdGQ6Om1vdmUoZGV2KSkge30KKworY29uc3Qgc3RkOjpzdHJpbmcmIERtVXNlckRldmljZTo6R2V0UGF0aCgpIHsKKyAgICByZXR1cm4gZGV2Xy0+cGF0aCgpOworfQorCitib29sIERtVXNlckRldmljZTo6RGVzdHJveSgpIHsKKyAgICByZXR1cm4gZGV2Xy0+RGVzdHJveSgpOworfQorCitEbVVzZXJUZXN0SGFybmVzczo6RG1Vc2VyVGVzdEhhcm5lc3MoKSB7CisgICAgYmxvY2tfc2VydmVyX2ZhY3RvcnlfID0gc3RkOjptYWtlX3VuaXF1ZTxEbVVzZXJCbG9ja1NlcnZlckZhY3Rvcnk+KCk7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxJVXNlckRldmljZT4gRG1Vc2VyVGVzdEhhcm5lc3M6OkNyZWF0ZVVzZXJEZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIGRldl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBudW1fc2VjdG9ycykgeworICAgIGFuZHJvaWQ6OmRtOjpEbVRhYmxlIGRtdXNlcl90YWJsZTsKKyAgICBkbXVzZXJfdGFibGUuRW1wbGFjZTxhbmRyb2lkOjpkbTo6RG1UYXJnZXRVc2VyPigwLCBudW1fc2VjdG9ycywgbWlzY19uYW1lKTsKKyAgICBhdXRvIGRldiA9IHN0ZDo6bWFrZV91bmlxdWU8VGVtcGRldmljZT4oZGV2X25hbWUsIGRtdXNlcl90YWJsZSk7CisgICAgaWYgKCFkZXYtPnZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgYXV0byBtaXNjX2RldmljZSA9ICIvZGV2L2RtLXVzZXIvIiArIG1pc2NfbmFtZTsKKyAgICBpZiAoIWFuZHJvaWQ6OmZzX21ncjo6V2FpdEZvckZpbGUobWlzY19kZXZpY2UsIDEwcykpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8RG1Vc2VyRGV2aWNlPihzdGQ6Om1vdmUoZGV2KSk7Cit9CisKK0lCbG9ja1NlcnZlckZhY3RvcnkqIERtVXNlclRlc3RIYXJuZXNzOjpHZXRCbG9ja1NlcnZlckZhY3RvcnkoKSB7CisgICAgcmV0dXJuIGJsb2NrX3NlcnZlcl9mYWN0b3J5Xy5nZXQoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC90ZXN0aW5nL2RtX3VzZXJfaGFybmVzcy5oIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC90ZXN0aW5nL2RtX3VzZXJfaGFybmVzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMjZiZWQKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3Rlc3RpbmcvZG1fdXNlcl9oYXJuZXNzLmgKQEAgLTAsMCArMSw1NCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgorCisjaW5jbHVkZSAiaGFybmVzcy5oIgorI2luY2x1ZGUgInRlbXBfZGV2aWNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBzbmFwc2hvdCB7CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZDsKKworY2xhc3MgRG1Vc2VyQmxvY2tTZXJ2ZXJGYWN0b3J5OworCitjbGFzcyBEbVVzZXJEZXZpY2UgZmluYWwgOiBwdWJsaWMgSVVzZXJEZXZpY2UgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgRG1Vc2VyRGV2aWNlKHN0ZDo6dW5pcXVlX3B0cjxUZW1wZGV2aWNlPiYmIGRldik7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIEdldFBhdGgoKSBvdmVycmlkZTsKKyAgICBib29sIERlc3Ryb3koKSBvdmVycmlkZTsKKworICBwcml2YXRlOgorICAgIHN0ZDo6dW5pcXVlX3B0cjxUZW1wZGV2aWNlPiBkZXZfOworfTsKKworY2xhc3MgRG1Vc2VyVGVzdEhhcm5lc3MgZmluYWwgOiBwdWJsaWMgSVRlc3RIYXJuZXNzIHsKKyAgcHVibGljOgorICAgIERtVXNlclRlc3RIYXJuZXNzKCk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SVVzZXJEZXZpY2U+IENyZWF0ZVVzZXJEZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIGRldl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBudW1fc2VjdG9ycykgb3ZlcnJpZGU7CisgICAgSUJsb2NrU2VydmVyRmFjdG9yeSogR2V0QmxvY2tTZXJ2ZXJGYWN0b3J5KCkgb3ZlcnJpZGU7CisgICAgYm9vbCBIYXNVc2VyRGV2aWNlKCkgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorCisgIHByaXZhdGU6CisgICAgc3RkOjp1bmlxdWVfcHRyPERtVXNlckJsb2NrU2VydmVyRmFjdG9yeT4gYmxvY2tfc2VydmVyX2ZhY3RvcnlfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC90ZXN0aW5nL2hhcm5lc3MuY3BwIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC90ZXN0aW5nL2hhcm5lc3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYWU1NDkKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3Rlc3RpbmcvaGFybmVzcy5jcHAKQEAgLTAsMCArMSwxMTYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiaGFybmVzcy5oIgorCisjaWZkZWYgX19BTkRST0lEX18KKyNpbmNsdWRlIDxsaW51eC9tZW1mZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8ZXh0NF91dGlscy9leHQ0X3V0aWxzLmg+CisjaW5jbHVkZSA8bGliZG0vbG9vcF9jb250cm9sLmg+CisjaW5jbHVkZSAic25hcHVzZXJkX2xvZ2dpbmcuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHNuYXBzaG90IHsKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOwordXNpbmcgYW5kcm9pZDo6ZG06Okxvb3BEZXZpY2U7CisKKyNpZmRlZiBfX0FORFJPSURfXworLy8gUHJlZmVyIHRoaXMgb24gZGV2aWNlIHNpbmNlIGl0IGlzIGEgcmVhbCBibG9jayBkZXZpY2UsIHdoaWNoIGlzIG1vcmUgc2ltaWxhcgorLy8gdG8gaG93IHdlIHVzZSBzbmFwdXNlcmQuCitjbGFzcyBNZW1vcnlCYWNrZWREZXZpY2UgZmluYWwgOiBwdWJsaWMgSUJhY2tpbmdEZXZpY2UgeworICBwdWJsaWM6CisgICAgYm9vbCBJbml0KHVpbnQ2NF90IHNpemUpIHsKKyAgICAgICAgbWVtZmRfLnJlc2V0KG1lbWZkX2NyZWF0ZSgic25hcHVzZXJkX3Rlc3QiLCBNRkRfQUxMT1dfU0VBTElORykpOworICAgICAgICBpZiAobWVtZmRfIDwgMCkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIm1lbWZkX2NyZWF0ZSBmYWlsZWQiOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChmdHJ1bmNhdGUobWVtZmRfLmdldCgpLCBzaXplKSA8IDApIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJmdHJ1bmNhdGUgZmFpbGVkIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmNudGwobWVtZmRfLmdldCgpLCBGX0FERF9TRUFMUywgRl9TRUFMX0dST1cgfCBGX1NFQUxfU0hSSU5LKSA8IDApIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJmY250bCBzZWFsIGZhaWxlZCI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZGV2XyA9IHN0ZDo6bWFrZV91bmlxdWU8TG9vcERldmljZT4obWVtZmRfLCAxMHMpOworICAgICAgICByZXR1cm4gZGV2Xy0+dmFsaWQoKTsKKyAgICB9CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIEdldFBhdGgoKSBvdmVycmlkZSB7IHJldHVybiBkZXZfLT5kZXZpY2UoKTsgfQorICAgIHVpbnQ2NF90IEdldFNpemUoKSBvdmVycmlkZSB7CisgICAgICAgIHVuaXF1ZV9mZCBmZChvcGVuKEdldFBhdGgoKS5jX3N0cigpLCBPX1JET05MWSB8IE9fQ0xPRVhFQykpOworICAgICAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAib3BlbiBmYWlsZWQ6ICIgPDwgR2V0UGF0aCgpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldF9ibG9ja19kZXZpY2Vfc2l6ZShmZC5nZXQoKSk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgdW5pcXVlX2ZkIG1lbWZkXzsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TG9vcERldmljZT4gZGV2XzsKK307CisjZW5kaWYKKworY2xhc3MgRmlsZUJhY2tlZERldmljZSBmaW5hbCA6IHB1YmxpYyBJQmFja2luZ0RldmljZSB7CisgIHB1YmxpYzoKKyAgICBib29sIEluaXQodWludDY0X3Qgc2l6ZSkgeworICAgICAgICBpZiAodGVtcF8uZmQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZ0cnVuY2F0ZSh0ZW1wXy5mZCwgc2l6ZSkgPCAwKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiZnRydW5jYXRlIGZhaWxlZDogIiA8PCB0ZW1wXy5wYXRoOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHBhdGhfID0gdGVtcF8ucGF0aDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIEdldFBhdGgoKSBvdmVycmlkZSB7IHJldHVybiBwYXRoXzsgfQorICAgIHVpbnQ2NF90IEdldFNpemUoKSBvdmVycmlkZSB7CisgICAgICAgIG9mZl90IG9mZiA9IGxzZWVrKHRlbXBfLmZkLCAwLCBTRUVLX0VORCk7CisgICAgICAgIGlmIChvZmYgPCAwKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAibHNlZWsgZmFpbGVkOiAiIDw8IHRlbXBfLnBhdGg7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb2ZmOworICAgIH0KKworICBwcml2YXRlOgorICAgIFRlbXBvcmFyeUZpbGUgdGVtcF87CisgICAgc3RkOjpzdHJpbmcgcGF0aF87Cit9OworCitzdGQ6OnVuaXF1ZV9wdHI8SUJhY2tpbmdEZXZpY2U+IElUZXN0SGFybmVzczo6Q3JlYXRlQmFja2luZ0RldmljZSh1aW50NjRfdCBzaXplKSB7CisjaWZkZWYgX19BTkRST0lEX18KKyAgICBhdXRvIGRldiA9IHN0ZDo6bWFrZV91bmlxdWU8TWVtb3J5QmFja2VkRGV2aWNlPigpOworI2Vsc2UKKyAgICBhdXRvIGRldiA9IHN0ZDo6bWFrZV91bmlxdWU8RmlsZUJhY2tlZERldmljZT4oKTsKKyNlbmRpZgorICAgIGlmICghZGV2LT5Jbml0KHNpemUpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gZGV2OworfQorCit9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3Rlc3RpbmcvaGFybmVzcy5oIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC90ZXN0aW5nL2hhcm5lc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmU5ZjdiCi0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC90ZXN0aW5nL2hhcm5lc3MuaApAQCAtMCwwICsxLDU2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KKyNpbmNsdWRlIDxzbmFwdXNlcmQvYmxvY2tfc2VydmVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBzbmFwc2hvdCB7CisKKy8vIEludGVyZmFjZSBmb3IgYSAiYmxvY2sgZHJpdmVyIGluIHVzZXJzcGFjZSIgZGV2aWNlLgorY2xhc3MgSVVzZXJEZXZpY2UgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB+SVVzZXJEZXZpY2UoKSB7fQorICAgIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcmIEdldFBhdGgoKSA9IDA7CisgICAgdmlydHVhbCBib29sIERlc3Ryb3koKSA9IDA7Cit9OworCisvLyBJbnRlcmZhY2UgZm9yIGFuIGZkL3RlbXAgZmlsZSB0aGF0IGlzIGEgYmxvY2sgZGV2aWNlIHdoZW4gcG9zc2libGUuCitjbGFzcyBJQmFja2luZ0RldmljZSB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5JQmFja2luZ0RldmljZSgpIHt9CisgICAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyYgR2V0UGF0aCgpID0gMDsKKyAgICB2aXJ0dWFsIHVpbnQ2NF90IEdldFNpemUoKSA9IDA7Cit9OworCitjbGFzcyBJVGVzdEhhcm5lc3MgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB+SVRlc3RIYXJuZXNzKCkge30KKyAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxJVXNlckRldmljZT4gQ3JlYXRlVXNlckRldmljZShjb25zdCBzdGQ6OnN0cmluZyYgZGV2X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBudW1fc2VjdG9ycykgPSAwOworICAgIHZpcnR1YWwgSUJsb2NrU2VydmVyRmFjdG9yeSogR2V0QmxvY2tTZXJ2ZXJGYWN0b3J5KCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBIYXNVc2VyRGV2aWNlKCkgPSAwOworICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPElCYWNraW5nRGV2aWNlPiBDcmVhdGVCYWNraW5nRGV2aWNlKHVpbnQ2NF90IHNpemUpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC90ZXN0aW5nL2hvc3RfaGFybmVzcy5jcHAgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3Rlc3RpbmcvaG9zdF9oYXJuZXNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDIzMGFkCi0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC90ZXN0aW5nL2hvc3RfaGFybmVzcy5jcHAKQEAgLTAsMCArMSwxMTIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiaG9zdF9oYXJuZXNzLmgiCisKKyNpbmNsdWRlICJzbmFwdXNlcmRfbG9nZ2luZy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugc25hcHNob3QgeworCit2b2lkIFRlc3RCbG9ja1NlcnZlclF1ZXVlOjpXYWl0Rm9yU2h1dGRvd24oKSB7CisgICAgc3RkOjp1bmlxdWVfbG9jayBsb2NrKG1fKTsKKyAgICBpZiAoc2h1dGRvd25fKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY3ZfLndhaXQobG9jaywgW3RoaXNdKCkgLT4gYm9vbCB7IHJldHVybiBzaHV0ZG93bl87IH0pOworfQorCit2b2lkIFRlc3RCbG9ja1NlcnZlclF1ZXVlOjpTaHV0ZG93bigpIHsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrIGxvY2sobV8pOworICAgIHNodXRkb3duXyA9IHRydWU7CisgICAgY3ZfLm5vdGlmeV9hbGwoKTsKK30KKworVGVzdEJsb2NrU2VydmVyOjpUZXN0QmxvY2tTZXJ2ZXIoc3RkOjpzaGFyZWRfcHRyPFRlc3RCbG9ja1NlcnZlclF1ZXVlPiBxdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUpCisgICAgOiBxdWV1ZV8ocXVldWUpLCBtaXNjX25hbWVfKG1pc2NfbmFtZSkge30KKworYm9vbCBUZXN0QmxvY2tTZXJ2ZXI6OlByb2Nlc3NSZXF1ZXN0cygpIHsKKyAgICBxdWV1ZV8tPldhaXRGb3JTaHV0ZG93bigpOworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCogVGVzdEJsb2NrU2VydmVyOjpHZXRSZXNwb25zZUJ1ZmZlcihzaXplX3Qgc2l6ZSwgc2l6ZV90IHRvX3dyaXRlKSB7CisgICAgc3RkOjpzdHJpbmcgYnVmZmVyKHNpemUsICdcMCcpOworICAgIGJ1ZmZlcmVkXy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKGJ1ZmZlciksIHRvX3dyaXRlKTsKKyAgICByZXR1cm4gYnVmZmVyZWRfLmJhY2soKS5maXJzdC5kYXRhKCk7Cit9CisKK2Jvb2wgVGVzdEJsb2NrU2VydmVyOjpTZW5kQnVmZmVyZWRJbygpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIFtkYXRhLCB0b193cml0ZV0gOiBidWZmZXJlZF8pIHsKKyAgICAgICAgc2VudF9pb18gKz0gZGF0YS5zdWJzdHIoMCwgdG9fd3JpdGUpOworICAgIH0KKyAgICBidWZmZXJlZF8uY2xlYXIoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworVGVzdEJsb2NrU2VydmVyT3BlbmVyOjpUZXN0QmxvY2tTZXJ2ZXJPcGVuZXIoc3RkOjpzaGFyZWRfcHRyPFRlc3RCbG9ja1NlcnZlclF1ZXVlPiBxdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUpCisgICAgOiBxdWV1ZV8ocXVldWUpLCBtaXNjX25hbWVfKG1pc2NfbmFtZSkge30KKworc3RkOjp1bmlxdWVfcHRyPElCbG9ja1NlcnZlcj4gVGVzdEJsb2NrU2VydmVyT3BlbmVyOjpPcGVuKElCbG9ja1NlcnZlcjo6RGVsZWdhdGUqLCBzaXplX3QpIHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxUZXN0QmxvY2tTZXJ2ZXI+KHF1ZXVlXywgbWlzY19uYW1lXyk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxUZXN0QmxvY2tTZXJ2ZXJPcGVuZXI+IFRlc3RCbG9ja1NlcnZlckZhY3Rvcnk6OkNyZWF0ZVRlc3RPcGVuZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUpIHsKKyAgICBpZiAocXVldWVzXy5jb3VudChtaXNjX25hbWUpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCBjcmVhdGUgb3BlbmVyIGZvciAiIDw8IG1pc2NfbmFtZSA8PCAiLCBhbHJlYWR5IGV4aXN0cyI7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBhdXRvIHF1ZXVlID0gc3RkOjptYWtlX3NoYXJlZDxUZXN0QmxvY2tTZXJ2ZXJRdWV1ZT4oKTsKKyAgICBxdWV1ZXNfLmVtcGxhY2UobWlzY19uYW1lLCBxdWV1ZSk7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8VGVzdEJsb2NrU2VydmVyT3BlbmVyPihxdWV1ZSwgbWlzY19uYW1lKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPElCbG9ja1NlcnZlck9wZW5lcj4gVGVzdEJsb2NrU2VydmVyRmFjdG9yeTo6Q3JlYXRlT3BlbmVyKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lKSB7CisgICAgcmV0dXJuIENyZWF0ZVRlc3RPcGVuZXIobWlzY19uYW1lKTsKK30KKworYm9vbCBUZXN0QmxvY2tTZXJ2ZXJGYWN0b3J5OjpEZWxldGVRdWV1ZShjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lKSB7CisgICAgYXV0byBpdGVyID0gcXVldWVzXy5maW5kKG1pc2NfbmFtZSk7CisgICAgaWYgKGl0ZXIgPT0gcXVldWVzXy5lbmQoKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgZGVsZXRlIHF1ZXVlICIgPDwgbWlzY19uYW1lIDw8ICIsIG5vdCBmb3VuZCI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaXRlci0+c2Vjb25kLT5TaHV0ZG93bigpOworICAgIHF1ZXVlc18uZXJhc2UoaXRlcik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK0hvc3RVc2VyRGV2aWNlOjpIb3N0VXNlckRldmljZShUZXN0QmxvY2tTZXJ2ZXJGYWN0b3J5KiBmYWN0b3J5LCBjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lKQorICAgIDogZmFjdG9yeV8oZmFjdG9yeSksIG1pc2NfbmFtZV8obWlzY19uYW1lKSB7fQorCitib29sIEhvc3RVc2VyRGV2aWNlOjpEZXN0cm95KCkgeworICAgIHJldHVybiBmYWN0b3J5Xy0+RGVsZXRlUXVldWUobWlzY19uYW1lXyk7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxJVXNlckRldmljZT4gSG9zdFRlc3RIYXJuZXNzOjpDcmVhdGVVc2VyRGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCkgeworICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEhvc3RVc2VyRGV2aWNlPigmZmFjdG9yeV8sIG1pc2NfbmFtZSk7Cit9CisKK0lCbG9ja1NlcnZlckZhY3RvcnkqIEhvc3RUZXN0SGFybmVzczo6R2V0QmxvY2tTZXJ2ZXJGYWN0b3J5KCkgeworICAgIHJldHVybiAmZmFjdG9yeV87Cit9CisKK30gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdGVzdGluZy9ob3N0X2hhcm5lc3MuaCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdGVzdGluZy9ob3N0X2hhcm5lc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzBiZDI5Ci0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC90ZXN0aW5nL2hvc3RfaGFybmVzcy5oCkBAIC0wLDAgKzEsMTA1IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJoYXJuZXNzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBzbmFwc2hvdCB7CisKK2NsYXNzIFRlc3RCbG9ja1NlcnZlclF1ZXVlIGZpbmFsIHsKKyAgcHVibGljOgorICAgIHZvaWQgV2FpdEZvclNodXRkb3duKCk7CisgICAgdm9pZCBTaHV0ZG93bigpOworCisgIHByaXZhdGU6CisgICAgc3RkOjptdXRleCBtXzsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBjdl87CisgICAgYm9vbCBzaHV0ZG93bl8gPSBmYWxzZTsKK307CisKK2NsYXNzIFRlc3RCbG9ja1NlcnZlciBmaW5hbCA6IHB1YmxpYyBJQmxvY2tTZXJ2ZXIgeworICBwdWJsaWM6CisgICAgVGVzdEJsb2NrU2VydmVyKHN0ZDo6c2hhcmVkX3B0cjxUZXN0QmxvY2tTZXJ2ZXJRdWV1ZT4gcXVldWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUpOworICAgIGJvb2wgUHJvY2Vzc1JlcXVlc3RzKCkgb3ZlcnJpZGU7CisgICAgdm9pZCogR2V0UmVzcG9uc2VCdWZmZXIoc2l6ZV90IHNpemUsIHNpemVfdCB0b193cml0ZSkgb3ZlcnJpZGU7CisgICAgYm9vbCBTZW5kQnVmZmVyZWRJbygpIG92ZXJyaWRlOworCisgICAgc3RkOjpzdHJpbmcmJiBzZW50X2lvKCkgeyByZXR1cm4gc3RkOjptb3ZlKHNlbnRfaW9fKTsgfQorCisgIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPFRlc3RCbG9ja1NlcnZlclF1ZXVlPiBxdWV1ZV87CisgICAgc3RkOjpzdHJpbmcgbWlzY19uYW1lXzsKKyAgICBzdGQ6OnN0cmluZyBzZW50X2lvXzsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHNpemVfdD4+IGJ1ZmZlcmVkXzsKK307CisKK2NsYXNzIFRlc3RCbG9ja1NlcnZlck9wZW5lciBmaW5hbCA6IHB1YmxpYyBJQmxvY2tTZXJ2ZXJPcGVuZXIgeworICBwdWJsaWM6CisgICAgVGVzdEJsb2NrU2VydmVyT3BlbmVyKHN0ZDo6c2hhcmVkX3B0cjxUZXN0QmxvY2tTZXJ2ZXJRdWV1ZT4gcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxJQmxvY2tTZXJ2ZXI+IE9wZW4oSUJsb2NrU2VydmVyOjpEZWxlZ2F0ZSogZGVsZWdhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyX3NpemUpIG92ZXJyaWRlOworCisgIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPFRlc3RCbG9ja1NlcnZlclF1ZXVlPiBxdWV1ZV87CisgICAgc3RkOjpzdHJpbmcgbWlzY19uYW1lXzsKK307CisKK2NsYXNzIFRlc3RCbG9ja1NlcnZlckZhY3RvcnkgZmluYWwgOiBwdWJsaWMgSUJsb2NrU2VydmVyRmFjdG9yeSB7CisgIHB1YmxpYzoKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SUJsb2NrU2VydmVyT3BlbmVyPiBDcmVhdGVPcGVuZXIoY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSkgb3ZlcnJpZGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRlc3RCbG9ja1NlcnZlck9wZW5lcj4gQ3JlYXRlVGVzdE9wZW5lcihjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lKTsKKyAgICBib29sIERlbGV0ZVF1ZXVlKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUpOworCisgIHByaXZhdGU6CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8VGVzdEJsb2NrU2VydmVyUXVldWU+PiBxdWV1ZXNfOworfTsKKworY2xhc3MgVGVzdEJsb2NrU2VydmVyRmFjdG9yeTsKKworY2xhc3MgSG9zdFVzZXJEZXZpY2UgZmluYWwgOiBwdWJsaWMgSVVzZXJEZXZpY2UgeworICBwdWJsaWM6CisgICAgSG9zdFVzZXJEZXZpY2UoVGVzdEJsb2NrU2VydmVyRmFjdG9yeSogZmFjdG9yeSwgY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIEdldFBhdGgoKSBvdmVycmlkZSB7IHJldHVybiBlbXB0eV9wYXRoXzsgfQorICAgIGJvb2wgRGVzdHJveSgpOworCisgIHByaXZhdGU6CisgICAgVGVzdEJsb2NrU2VydmVyRmFjdG9yeSogZmFjdG9yeV87CisgICAgc3RkOjpzdHJpbmcgbWlzY19uYW1lXzsKKyAgICBzdGQ6OnN0cmluZyBlbXB0eV9wYXRoXzsKK307CisKK2NsYXNzIEhvc3RUZXN0SGFybmVzcyBmaW5hbCA6IHB1YmxpYyBJVGVzdEhhcm5lc3MgeworICBwdWJsaWM6CisgICAgc3RkOjp1bmlxdWVfcHRyPElVc2VyRGV2aWNlPiBDcmVhdGVVc2VyRGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgbnVtX3NlY3RvcnMpIG92ZXJyaWRlOworICAgIElCbG9ja1NlcnZlckZhY3RvcnkqIEdldEJsb2NrU2VydmVyRmFjdG9yeSgpIG92ZXJyaWRlOworICAgIGJvb2wgSGFzVXNlckRldmljZSgpIG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgcHJpdmF0ZToKKyAgICBUZXN0QmxvY2tTZXJ2ZXJGYWN0b3J5IGZhY3RvcnlfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC90ZXN0aW5nL3RlbXBfZGV2aWNlLmggYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3Rlc3RpbmcvdGVtcF9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTZkM2VhCi0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC90ZXN0aW5nL3RlbXBfZGV2aWNlLmgKQEAgLTAsMCArMSw3MiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGxpYmRtL2RtLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBzbmFwc2hvdCB7CisKK3VzaW5nIGFuZHJvaWQ6OmRtOjpEZXZpY2VNYXBwZXI7Cit1c2luZyBhbmRyb2lkOjpkbTo6RG1UYWJsZTsKKworY2xhc3MgVGVtcGRldmljZSB7CisgIHB1YmxpYzoKKyAgICBUZW1wZGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBEbVRhYmxlJiB0YWJsZSkKKyAgICAgICAgOiBkbV8oRGV2aWNlTWFwcGVyOjpJbnN0YW5jZSgpKSwgbmFtZV8obmFtZSksIHZhbGlkXyhmYWxzZSkgeworICAgICAgICB2YWxpZF8gPSBkbV8uQ3JlYXRlRGV2aWNlKG5hbWUsIHRhYmxlLCAmcGF0aF8sIHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDUpKTsKKyAgICB9CisgICAgVGVtcGRldmljZShUZW1wZGV2aWNlJiYgb3RoZXIpIG5vZXhjZXB0CisgICAgICAgIDogZG1fKG90aGVyLmRtXyksIG5hbWVfKG90aGVyLm5hbWVfKSwgcGF0aF8ob3RoZXIucGF0aF8pLCB2YWxpZF8ob3RoZXIudmFsaWRfKSB7CisgICAgICAgIG90aGVyLnZhbGlkXyA9IGZhbHNlOworICAgIH0KKyAgICB+VGVtcGRldmljZSgpIHsKKyAgICAgICAgaWYgKHZhbGlkXykgeworICAgICAgICAgICAgZG1fLkRlbGV0ZURldmljZUlmRXhpc3RzKG5hbWVfKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIERlc3Ryb3koKSB7CisgICAgICAgIGlmICghdmFsaWRfKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICB2YWxpZF8gPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGRtXy5EZWxldGVEZXZpY2VJZkV4aXN0cyhuYW1lXyk7CisgICAgfQorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKCkgY29uc3QgeyByZXR1cm4gcGF0aF87IH0KKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfOyB9CisgICAgYm9vbCB2YWxpZCgpIGNvbnN0IHsgcmV0dXJuIHZhbGlkXzsgfQorCisgICAgVGVtcGRldmljZShjb25zdCBUZW1wZGV2aWNlJikgPSBkZWxldGU7CisgICAgVGVtcGRldmljZSYgb3BlcmF0b3I9KGNvbnN0IFRlbXBkZXZpY2UmKSA9IGRlbGV0ZTsKKworICAgIFRlbXBkZXZpY2UmIG9wZXJhdG9yPShUZW1wZGV2aWNlJiYgb3RoZXIpIG5vZXhjZXB0IHsKKyAgICAgICAgbmFtZV8gPSBvdGhlci5uYW1lXzsKKyAgICAgICAgdmFsaWRfID0gb3RoZXIudmFsaWRfOworICAgICAgICBvdGhlci52YWxpZF8gPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICBwcml2YXRlOgorICAgIERldmljZU1hcHBlciYgZG1fOworICAgIHN0ZDo6c3RyaW5nIG5hbWVfOworICAgIHN0ZDo6c3RyaW5nIHBhdGhfOworICAgIGJvb2wgdmFsaWRfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL2V4dHJhY3Rvci5jcHAgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2UvZXh0cmFjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjRiYTkzCi0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL2V4dHJhY3Rvci5jcHAKQEAgLTAsMCArMSw5MCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJleHRyYWN0b3IuaCIKKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgorCit1c2luZyBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQ7Cit1c2luZyBuYW1lc3BhY2Ugc3RkOjpzdHJpbmdfbGl0ZXJhbHM7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBzbmFwc2hvdCB7CisKK0V4dHJhY3Rvcjo6RXh0cmFjdG9yKGNvbnN0IHN0ZDo6c3RyaW5nJiBiYXNlX3BhdGgsIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb3dfcGF0aCkKKyAgICA6IGJhc2VfcGF0aF8oYmFzZV9wYXRoKSwgY293X3BhdGhfKGNvd19wYXRoKSwgY29udHJvbF9uYW1lXygidGVzdCIpIHt9CisKK2Jvb2wgRXh0cmFjdG9yOjpJbml0KCkgeworICAgIGF1dG8gb3BlbmVyID0gZmFjdG9yeV8uQ3JlYXRlVGVzdE9wZW5lcihjb250cm9sX25hbWVfKTsKKyAgICBoYW5kbGVyXyA9IHN0ZDo6bWFrZV9zaGFyZWQ8U25hcHNob3RIYW5kbGVyPihjb250cm9sX25hbWVfLCBjb3dfcGF0aF8sIGJhc2VfcGF0aF8sIGJhc2VfcGF0aF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbmVyLCAxLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwKTsKKyAgICBpZiAoIWhhbmRsZXJfLT5Jbml0Q293RGV2aWNlKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIWhhbmRsZXJfLT5Jbml0aWFsaXplV29ya2VycygpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZWFkX3dvcmtlcl8gPSBzdGQ6Om1ha2VfdW5pcXVlPFJlYWRXb3JrZXI+KGNvd19wYXRoXywgYmFzZV9wYXRoXywgY29udHJvbF9uYW1lXywgYmFzZV9wYXRoXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJfLT5HZXRTaGFyZWRQdHIoKSwgb3BlbmVyLCBmYWxzZSk7CisgICAgaWYgKCFyZWFkX3dvcmtlcl8tPkluaXQoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGJsb2NrX3NlcnZlcl8gPSBzdGF0aWNfY2FzdDxUZXN0QmxvY2tTZXJ2ZXIqPihyZWFkX3dvcmtlcl8tPmJsb2NrX3NlcnZlcigpKTsKKworICAgIGhhbmRsZXJfdGhyZWFkXyA9IHN0ZDo6YXN5bmMoc3RkOjpsYXVuY2g6OmFzeW5jLCAmU25hcHNob3RIYW5kbGVyOjpTdGFydCwgaGFuZGxlcl8uZ2V0KCkpOworICAgIHJldHVybiB0cnVlOworfQorCitFeHRyYWN0b3I6On5FeHRyYWN0b3IoKSB7CisgICAgZmFjdG9yeV8uRGVsZXRlUXVldWUoY29udHJvbF9uYW1lXyk7Cit9CisKK2Jvb2wgRXh0cmFjdG9yOjpFeHRyYWN0KG9mZl90IG51bV9zZWN0b3JzLCBjb25zdCBzdGQ6OnN0cmluZyYgb3V0X3BhdGgpIHsKKyAgICB1bmlxdWVfZmQgb3V0X2ZkKG9wZW4ob3V0X3BhdGguY19zdHIoKSwgT19SRFdSIHwgT19DTE9FWEVDIHwgT19UUlVOQyB8IE9fQ1JFQVQsIDA2NjQpKTsKKyAgICBpZiAob3V0X2ZkIDwgMCkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IG9wZW4gZm9yIHdyaXRpbmc6ICIgPDwgb3V0X3BhdGg7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmb3IgKG9mZl90IGkgPSAwOyBpIDwgbnVtX3NlY3RvcnM7IGkrKykgeworICAgICAgICBpZiAoIXJlYWRfd29ya2VyXy0+UmVxdWVzdFNlY3RvcnMoaSwgNTEyKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiUmVhZCBzZWN0b3IgIiA8PCBpIDw8ICIgZmFpbGVkLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gc3RkOjptb3ZlKGJsb2NrX3NlcnZlcl8tPnNlbnRfaW8oKSk7CisgICAgICAgIG9mZl90IG9mZnNldCA9IGkgKiA1MTI7CisgICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6V3JpdGVGdWxseUF0T2Zmc2V0KG91dF9mZCwgcmVzdWx0LmRhdGEoKSwgcmVzdWx0LnNpemUoKSwgb2Zmc2V0KSkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIndyaXRlIGZhaWxlZCI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9leHRyYWN0b3IuaCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9leHRyYWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTI4NWIxCi0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL2V4dHJhY3Rvci5oCkBAIC0wLDAgKzEsNTEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CisjaW5jbHVkZSAibWVyZ2Vfd29ya2VyLmgiCisjaW5jbHVkZSAicmVhZF93b3JrZXIuaCIKKyNpbmNsdWRlICJzbmFwdXNlcmRfY29yZS5oIgorI2luY2x1ZGUgInRlc3RpbmcvaG9zdF9oYXJuZXNzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBzbmFwc2hvdCB7CisKK2NsYXNzIEV4dHJhY3RvciBmaW5hbCB7CisgIHB1YmxpYzoKKyAgICBFeHRyYWN0b3IoY29uc3Qgc3RkOjpzdHJpbmcmIGJhc2VfcGF0aCwgY29uc3Qgc3RkOjpzdHJpbmcmIGNvd19wYXRoKTsKKyAgICB+RXh0cmFjdG9yKCk7CisKKyAgICBib29sIEluaXQoKTsKKyAgICBib29sIEV4dHJhY3Qob2ZmX3QgbnVtX3NlY3RvcnMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBvdXRfcGF0aCk7CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnN0cmluZyBiYXNlX3BhdGhfOworICAgIHN0ZDo6c3RyaW5nIGNvd19wYXRoXzsKKworICAgIFRlc3RCbG9ja1NlcnZlckZhY3RvcnkgZmFjdG9yeV87CisgICAgSG9zdFRlc3RIYXJuZXNzIGhhcm5lc3NfOworICAgIHN0ZDo6c3RyaW5nIGNvbnRyb2xfbmFtZV87CisgICAgc3RkOjpzaGFyZWRfcHRyPFNuYXBzaG90SGFuZGxlcj4gaGFuZGxlcl87CisgICAgc3RkOjp1bmlxdWVfcHRyPFJlYWRXb3JrZXI+IHJlYWRfd29ya2VyXzsKKyAgICBzdGQ6OmZ1dHVyZTxib29sPiBoYW5kbGVyX3RocmVhZF87CisgICAgVGVzdEJsb2NrU2VydmVyKiBibG9ja19zZXJ2ZXJfID0gbnVsbHB0cjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9oYW5kbGVyX21hbmFnZXIuY3BwIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL2hhbmRsZXJfbWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRkOWNjZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9oYW5kbGVyX21hbmFnZXIuY3BwCkBAIC0wLDAgKzEsMzg3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImhhbmRsZXJfbWFuYWdlci5oIgorCisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHN5cy9ldmVudGZkLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaW5jbHVkZSAiYW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaCIKKyNpbmNsdWRlICJtZXJnZV93b3JrZXIuaCIKKyNpbmNsdWRlICJyZWFkX3dvcmtlci5oIgorI2luY2x1ZGUgInNuYXB1c2VyZF9jb3JlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBzbmFwc2hvdCB7CisKK3N0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrTWF4TWVyZ2VUaHJlYWRzID0gMjsKKworSGFuZGxlclRocmVhZDo6SGFuZGxlclRocmVhZChzdGQ6OnNoYXJlZF9wdHI8U25hcHNob3RIYW5kbGVyPiBzbmFwdXNlcmQpCisgICAgOiBzbmFwdXNlcmRfKHNuYXB1c2VyZCksIG1pc2NfbmFtZV8oc25hcHVzZXJkXy0+R2V0TWlzY05hbWUoKSkge30KKwordm9pZCBIYW5kbGVyVGhyZWFkOjpGcmVlUmVzb3VyY2VzKCkgeworICAgIC8vIEVhY2ggd29ya2VyIHRocmVhZCBob2xkcyBhIHJlZmVyZW5jZSB0byBzbmFwdXNlcmQuCisgICAgLy8gQ2xlYXIgdGhlbSBzbyB0aGF0IGFsbCB0aGUgcmVzb3VyY2VzCisgICAgLy8gaGVsZCBieSBzbmFwdXNlcmQgaXMgcmVsZWFzZWQKKyAgICBpZiAoc25hcHVzZXJkXykgeworICAgICAgICBzbmFwdXNlcmRfLT5GcmVlUmVzb3VyY2VzKCk7CisgICAgICAgIHNuYXB1c2VyZF8gPSBudWxscHRyOworICAgIH0KK30KKworU25hcHNob3RIYW5kbGVyTWFuYWdlcjo6U25hcHNob3RIYW5kbGVyTWFuYWdlcigpIHsKKyAgICBtb25pdG9yX21lcmdlX2V2ZW50X2ZkXy5yZXNldChldmVudGZkKDAsIEVGRF9DTE9FWEVDKSk7CisgICAgaWYgKG1vbml0b3JfbWVyZ2VfZXZlbnRfZmRfID09IC0xKSB7CisgICAgICAgIFBMT0coRkFUQUwpIDw8ICJtb25pdG9yX21lcmdlX2V2ZW50X2ZkXzogZmFpbGVkIHRvIGNyZWF0ZSBldmVudGZkIjsKKyAgICB9Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyVGhyZWFkPiBTbmFwc2hvdEhhbmRsZXJNYW5hZ2VyOjpBZGRIYW5kbGVyKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgY293X2RldmljZV9wYXRoLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYmFja2luZ19kZXZpY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBiYXNlX3BhdGhfbWVyZ2UsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJQmxvY2tTZXJ2ZXJPcGVuZXI+IG9wZW5lciwgaW50IG51bV93b3JrZXJfdGhyZWFkcywgYm9vbCB1c2VfaW91cmluZywKKyAgICAgICAgYm9vbCBvX2RpcmVjdCwgdWludDMyX3QgY293X29wX21lcmdlX3NpemUpIHsKKyAgICBhdXRvIHNuYXB1c2VyZCA9IHN0ZDo6bWFrZV9zaGFyZWQ8U25hcHNob3RIYW5kbGVyPigKKyAgICAgICAgICAgIG1pc2NfbmFtZSwgY293X2RldmljZV9wYXRoLCBiYWNraW5nX2RldmljZSwgYmFzZV9wYXRoX21lcmdlLCBvcGVuZXIsIG51bV93b3JrZXJfdGhyZWFkcywKKyAgICAgICAgICAgIHVzZV9pb3VyaW5nLCBwZXJmb3JtX3ZlcmlmaWNhdGlvbl8sIG9fZGlyZWN0LCBjb3dfb3BfbWVyZ2Vfc2l6ZSk7CisgICAgaWYgKCFzbmFwdXNlcmQtPkluaXRDb3dEZXZpY2UoKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBTbmFwdXNlcmQiOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBpZiAoIXNuYXB1c2VyZC0+SW5pdGlhbGl6ZVdvcmtlcnMoKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSB3b3JrZXJzIjsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgYXV0byBoYW5kbGVyID0gc3RkOjptYWtlX3NoYXJlZDxIYW5kbGVyVGhyZWFkPihzbmFwdXNlcmQpOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobG9ja18pOworICAgICAgICBpZiAoRmluZEhhbmRsZXIoJmxvY2ssIG1pc2NfbmFtZSkgIT0gZG1fdXNlcnNfLmVuZCgpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJIYW5kbGVyIGFscmVhZHkgZXhpc3RzOiAiIDw8IG1pc2NfbmFtZTsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGRtX3VzZXJzXy5wdXNoX2JhY2soaGFuZGxlcik7CisgICAgfQorICAgIHJldHVybiBoYW5kbGVyOworfQorCitib29sIFNuYXBzaG90SGFuZGxlck1hbmFnZXI6OlN0YXJ0SGFuZGxlcihjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobG9ja18pOworICAgIGF1dG8gaXRlciA9IEZpbmRIYW5kbGVyKCZsb2NrLCBtaXNjX25hbWUpOworICAgIGlmIChpdGVyID09IGRtX3VzZXJzXy5lbmQoKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgZmluZCBoYW5kbGVyOiAiIDw8IG1pc2NfbmFtZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoISgqaXRlciktPnNuYXB1c2VyZCgpIHx8ICgqaXRlciktPnNuYXB1c2VyZCgpLT5Jc0F0dGFjaGVkKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVHJpZWQgdG8gcmUtYXR0YWNoIGNvbnRyb2wgZGV2aWNlOiAiIDw8IG1pc2NfbmFtZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIVN0YXJ0SGFuZGxlcigqaXRlcikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTbmFwc2hvdEhhbmRsZXJNYW5hZ2VyOjpTdGFydEhhbmRsZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEhhbmRsZXJUaHJlYWQ+JiBoYW5kbGVyKSB7CisgICAgaWYgKGhhbmRsZXItPnNuYXB1c2VyZCgpLT5Jc0F0dGFjaGVkKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSGFuZGxlciBhbHJlYWR5IGF0dGFjaGVkIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGhhbmRsZXItPnNuYXB1c2VyZCgpLT5BdHRhY2hDb250cm9sRGV2aWNlKCk7CisKKyAgICBoYW5kbGVyLT50aHJlYWQoKSA9IHN0ZDo6dGhyZWFkKHN0ZDo6YmluZCgmU25hcHNob3RIYW5kbGVyTWFuYWdlcjo6UnVuVGhyZWFkLCB0aGlzLCBoYW5kbGVyKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU25hcHNob3RIYW5kbGVyTWFuYWdlcjo6RGVsZXRlSGFuZGxlcihjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lKSB7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhsb2NrXyk7CisgICAgICAgIGF1dG8gaXRlciA9IEZpbmRIYW5kbGVyKCZsb2NrLCBtaXNjX25hbWUpOworICAgICAgICBpZiAoaXRlciA9PSBkbV91c2Vyc18uZW5kKCkpIHsKKyAgICAgICAgICAgIC8vIEFmdGVyIG1lcmdlIGlzIGNvbXBsZXRlZCwgd2Ugc3dhcCBkbS11c2VyIHRhYmxlIHdpdGgKKyAgICAgICAgICAgIC8vIHRoZSB1bmRlcmx5aW5nIGRtLWxpbmVhciBiYXNlIGRldmljZS4gSGVuY2UsIHdvcmtlcgorICAgICAgICAgICAgLy8gdGhyZWFkcyB3b3VsZCBoYXZlIHRlcm1pbnRlZCBhbmQgd2FzIHJlbW92ZWQgZnJvbQorICAgICAgICAgICAgLy8gdGhlIGxpc3QuCisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJDb3VsZCBub3QgZmluZCBoYW5kbGVyOiAiIDw8IG1pc2NfbmFtZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCEoKml0ZXIpLT5UaHJlYWRUZXJtaW5hdGVkKCkpIHsKKyAgICAgICAgICAgICgqaXRlciktPnNuYXB1c2VyZCgpLT5Ob3RpZnlJT1Rlcm1pbmF0ZWQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIVJlbW92ZUFuZEpvaW5IYW5kbGVyKG1pc2NfbmFtZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTbmFwc2hvdEhhbmRsZXJNYW5hZ2VyOjpSdW5UaHJlYWQoc3RkOjpzaGFyZWRfcHRyPEhhbmRsZXJUaHJlYWQ+IGhhbmRsZXIpIHsKKyAgICBMT0coSU5GTykgPDwgIkVudGVyaW5nIHRocmVhZCBmb3IgaGFuZGxlcjogIiA8PCBoYW5kbGVyLT5taXNjX25hbWUoKTsKKworICAgIHB0aHJlYWRfc2V0bmFtZV9ucChwdGhyZWFkX3NlbGYoKSwgIkhhbmRsZXIiKTsKKworICAgIGlmICghaGFuZGxlci0+c25hcHVzZXJkKCktPlN0YXJ0KCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiIEZhaWxlZCB0byBsYXVuY2ggYWxsIHdvcmtlciB0aHJlYWRzIjsKKyAgICB9CisKKyAgICBoYW5kbGVyLT5zbmFwdXNlcmQoKS0+Q2xvc2VGZHMoKTsKKyAgICBib29sIG1lcmdlX2NvbXBsZXRlZCA9IGhhbmRsZXItPnNuYXB1c2VyZCgpLT5DaGVja01lcmdlQ29tcGxldGlvblN0YXR1cygpOworICAgIGhhbmRsZXItPnNuYXB1c2VyZCgpLT5Vbm1hcEJ1ZmZlclJlZ2lvbigpOworCisgICAgYXV0byBtaXNjX25hbWUgPSBoYW5kbGVyLT5taXNjX25hbWUoKTsKKyAgICBMT0coSU5GTykgPDwgIkhhbmRsZXIgdGhyZWFkIGFib3V0IHRvIGV4aXQ6ICIgPDwgbWlzY19uYW1lOworCisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhsb2NrXyk7CisgICAgICAgIGlmIChtZXJnZV9jb21wbGV0ZWQpIHsKKyAgICAgICAgICAgIG51bV9wYXJ0aXRpb25zX21lcmdlX2NvbXBsZXRlXyArPSAxOworICAgICAgICAgICAgYWN0aXZlX21lcmdlX3RocmVhZHNfIC09IDE7CisgICAgICAgICAgICBXYWtldXBNb25pdG9yTWVyZ2VUaHJlYWQoKTsKKyAgICAgICAgfQorICAgICAgICBoYW5kbGVyLT5TZXRUaHJlYWRUZXJtaW5hdGVkKCk7CisgICAgICAgIGF1dG8gaXRlciA9IEZpbmRIYW5kbGVyKCZsb2NrLCBoYW5kbGVyLT5taXNjX25hbWUoKSk7CisgICAgICAgIGlmIChpdGVyID09IGRtX3VzZXJzXy5lbmQoKSkgeworICAgICAgICAgICAgLy8gUmVtb3ZlQW5kSm9pbkhhbmRsZXIoKSBhbHJlYWR5IHJlbW92ZWQgdXMgZnJvbSB0aGUgbGlzdCwgYW5kIGlzCisgICAgICAgICAgICAvLyBub3cgd2FpdGluZyBvbiBhIGpvaW4oKSwgc28ganVzdCByZXR1cm4uIEFkZGl0aW9uYWxseSwgcmVsZWFzZQorICAgICAgICAgICAgLy8gYWxsIHRoZSByZXNvdXJjZXMgaGVsZCBieSBzbmFwdXNlcmQgb2JqZWN0IHdoaWNoIGFyZSBzaGFyZWQKKyAgICAgICAgICAgIC8vIGJ5IHdvcmtlciB0aHJlYWRzLiBUaGlzIHNob3VsZCBiZSBkb25lIHdoZW4gdGhlIGxhc3QgcmVmZXJlbmNlCisgICAgICAgICAgICAvLyBvZiAiaGFuZGxlciIgaXMgcmVsZWFzZWQ7IGJ1dCB3ZSB3aWxsIGV4cGxpY2l0bHkgcmVsZWFzZSBoZXJlCisgICAgICAgICAgICAvLyB0byBtYWtlIHN1cmUgc25hcHVzZXJkIG9iamVjdCBpcyBmcmVlZCBhcyBpdCBpcyB0aGUgYmlnZ2VzdAorICAgICAgICAgICAgLy8gY29uc3VtZXIgb2YgbWVtb3J5IGluIHRoZSBkYWVtb24uCisgICAgICAgICAgICBoYW5kbGVyLT5GcmVlUmVzb3VyY2VzKCk7CisgICAgICAgICAgICBMT0coSU5GTykgPDwgIkV4aXRpbmcgaGFuZGxlciB0aHJlYWQgdG8gYWxsb3cgZm9yIGpvaW46ICIgPDwgbWlzY19uYW1lOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgTE9HKElORk8pIDw8ICJFeGl0aW5nIGhhbmRsZXIgdGhyZWFkIGFuZCBmcmVlaW5nIHJlc291cmNlczogIiA8PCBtaXNjX25hbWU7CisKKyAgICAgICAgaWYgKGhhbmRsZXItPnNuYXB1c2VyZCgpLT5Jc0F0dGFjaGVkKCkpIHsKKyAgICAgICAgICAgIGhhbmRsZXItPnRocmVhZCgpLmRldGFjaCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW1wb3J0YW50OiBmcmVlIHJlc291cmNlcyB3aXRoaW4gdGhlIGxvY2suIFRoaXMgZW5zdXJlcyB0aGF0IGlmCisgICAgICAgIC8vIFdhaXRGb3JEZWxldGUoKSBpcyBjYWxsZWQsIHRoZSBoYW5kbGVyIGlzIGVpdGhlciBpbiB0aGUgbGlzdCwgb3IKKyAgICAgICAgLy8gaXQncyBub3QgYW5kIGl0cyByZXNvdXJjZXMgYXJlIGd1YXJhbnRlZWQgdG8gYmUgZnJlZWQuCisgICAgICAgIGhhbmRsZXItPkZyZWVSZXNvdXJjZXMoKTsKKyAgICAgICAgZG1fdXNlcnNfLmVyYXNlKGl0ZXIpOworICAgIH0KK30KKworYm9vbCBTbmFwc2hvdEhhbmRsZXJNYW5hZ2VyOjpJbml0aWF0ZU1lcmdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhsb2NrXyk7CisgICAgYXV0byBpdGVyID0gRmluZEhhbmRsZXIoJmxvY2ssIG1pc2NfbmFtZSk7CisgICAgaWYgKGl0ZXIgPT0gZG1fdXNlcnNfLmVuZCgpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBmaW5kIGhhbmRsZXI6ICIgPDwgbWlzY19uYW1lOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIFN0YXJ0TWVyZ2UoJmxvY2ssICppdGVyKTsKK30KKworYm9vbCBTbmFwc2hvdEhhbmRsZXJNYW5hZ2VyOjpTdGFydE1lcmdlKHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiogcHJvb2Zfb2ZfbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SGFuZGxlclRocmVhZD4mIGhhbmRsZXIpIHsKKyAgICBDSEVDSyhwcm9vZl9vZl9sb2NrKTsKKworICAgIGlmICghaGFuZGxlci0+c25hcHVzZXJkKCktPklzQXR0YWNoZWQoKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJIYW5kbGVyIG5vdCBhdHRhY2hlZCB0byBkbS11c2VyIC0gTWVyZ2UgdGhyZWFkIGNhbm5vdCBiZSBzdGFydGVkIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGhhbmRsZXItPnNuYXB1c2VyZCgpLT5Nb25pdG9yTWVyZ2UoKTsKKworICAgIGlmICghbWVyZ2VfbW9uaXRvcl8uam9pbmFibGUoKSkgeworICAgICAgICBtZXJnZV9tb25pdG9yXyA9IHN0ZDo6dGhyZWFkKCZTbmFwc2hvdEhhbmRsZXJNYW5hZ2VyOjpNb25pdG9yTWVyZ2UsIHRoaXMpOworICAgIH0KKworICAgIG1lcmdlX2hhbmRsZXJzXy5wdXNoKGhhbmRsZXIpOworICAgIFdha2V1cE1vbml0b3JNZXJnZVRocmVhZCgpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFNuYXBzaG90SGFuZGxlck1hbmFnZXI6Oldha2V1cE1vbml0b3JNZXJnZVRocmVhZCgpIHsKKyAgICB1aW50NjRfdCBub3RpZnkgPSAxOworICAgIHNzaXplX3QgcmMgPSBURU1QX0ZBSUxVUkVfUkVUUlkod3JpdGUobW9uaXRvcl9tZXJnZV9ldmVudF9mZF8uZ2V0KCksICZub3RpZnksIHNpemVvZihub3RpZnkpKSk7CisgICAgaWYgKHJjIDwgMCkgeworICAgICAgICBQTE9HKEZBVEFMKSA8PCAiZmFpbGVkIHRvIG5vdGlmeSBtb25pdG9yIG1lcmdlIHRocmVhZCI7CisgICAgfQorfQorCit2b2lkIFNuYXBzaG90SGFuZGxlck1hbmFnZXI6Ok1vbml0b3JNZXJnZSgpIHsKKyAgICBwdGhyZWFkX3NldG5hbWVfbnAocHRocmVhZF9zZWxmKCksICJNZXJnZSBNb25pdG9yIik7CisgICAgd2hpbGUgKCFzdG9wX21vbml0b3JfbWVyZ2VfdGhyZWFkXykgeworICAgICAgICB1aW50NjRfdCB0ZXN0VmFsOworICAgICAgICBzc2l6ZV90IHJldCA9CisgICAgICAgICAgICAgICAgVEVNUF9GQUlMVVJFX1JFVFJZKHJlYWQobW9uaXRvcl9tZXJnZV9ldmVudF9mZF8uZ2V0KCksICZ0ZXN0VmFsLCBzaXplb2YodGVzdFZhbCkpKTsKKyAgICAgICAgaWYgKHJldCA9PSAtMSkgeworICAgICAgICAgICAgUExPRyhGQVRBTCkgPDwgIkZhaWxlZCB0byByZWFkIGZyb20gZXZlbnRmZCI7CisgICAgICAgIH0gZWxzZSBpZiAocmV0ID09IDApIHsKKyAgICAgICAgICAgIExPRyhGQVRBTCkgPDwgIkhpdCBFT0Ygb24gZXZlbnRmZCI7CisgICAgICAgIH0KKworICAgICAgICBMT0coSU5GTykgPDwgIk1vbml0b3JNZXJnZTogYWN0aXZlLW1lcmdlLXRocmVhZHM6ICIgPDwgYWN0aXZlX21lcmdlX3RocmVhZHNfOworICAgICAgICB7CisgICAgICAgICAgICBhdXRvIG51bV9tZXJnZV90aHJlYWRzID0gYW5kcm9pZDo6YmFzZTo6R2V0VWludFByb3BlcnR5PHVpbnQ+KAorICAgICAgICAgICAgICAgICAgICAicm8udmlydHVhbF9hYi5udW1fbWVyZ2VfdGhyZWFkcyIsIGtNYXhNZXJnZVRocmVhZHMpOworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobG9ja18pOworICAgICAgICAgICAgd2hpbGUgKGFjdGl2ZV9tZXJnZV90aHJlYWRzXyA8IG51bV9tZXJnZV90aHJlYWRzICYmIG1lcmdlX2hhbmRsZXJzXy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgYXV0byBoYW5kbGVyID0gbWVyZ2VfaGFuZGxlcnNfLmZyb250KCk7CisgICAgICAgICAgICAgICAgbWVyZ2VfaGFuZGxlcnNfLnBvcCgpOworCisgICAgICAgICAgICAgICAgaWYgKCFoYW5kbGVyLT5zbmFwdXNlcmQoKSkgeworICAgICAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIk1vbml0b3JNZXJnZTogc2tpcHBpbmcgZGVsZXRlZCBoYW5kbGVyOiAiIDw8IGhhbmRsZXItPm1pc2NfbmFtZSgpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIlN0YXJ0aW5nIG1lcmdlIGZvciBwYXJ0aXRpb246ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaGFuZGxlci0+c25hcHVzZXJkKCktPkdldE1pc2NOYW1lKCk7CisgICAgICAgICAgICAgICAgaGFuZGxlci0+c25hcHVzZXJkKCktPkluaXRpYXRlTWVyZ2UoKTsKKyAgICAgICAgICAgICAgICBhY3RpdmVfbWVyZ2VfdGhyZWFkc18gKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIExPRyhJTkZPKSA8PCAiRXhpdGluZyBNb25pdG9yTWVyZ2U6IHNpemU6ICIgPDwgbWVyZ2VfaGFuZGxlcnNfLnNpemUoKTsKK30KKworc3RkOjpzdHJpbmcgU25hcHNob3RIYW5kbGVyTWFuYWdlcjo6R2V0TWVyZ2VTdGF0dXMoY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGxvY2tfKTsKKyAgICBhdXRvIGl0ZXIgPSBGaW5kSGFuZGxlcigmbG9jaywgbWlzY19uYW1lKTsKKyAgICBpZiAoaXRlciA9PSBkbV91c2Vyc18uZW5kKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IGZpbmQgaGFuZGxlcjogIiA8PCBtaXNjX25hbWU7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisKKyAgICByZXR1cm4gKCppdGVyKS0+c25hcHVzZXJkKCktPkdldE1lcmdlU3RhdHVzKCk7Cit9CisKK2RvdWJsZSBTbmFwc2hvdEhhbmRsZXJNYW5hZ2VyOjpHZXRNZXJnZVBlcmNlbnRhZ2UoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobG9ja18pOworCisgICAgZG91YmxlIHBlcmNlbnRhZ2UgPSAwLjA7CisgICAgaW50IG4gPSAwOworCisgICAgZm9yIChhdXRvIGl0ZXIgPSBkbV91c2Vyc18uYmVnaW4oKTsgaXRlciAhPSBkbV91c2Vyc18uZW5kKCk7IGl0ZXIrKykgeworICAgICAgICBhdXRvJiB0aCA9ICgqaXRlciktPnRocmVhZCgpOworICAgICAgICBpZiAodGguam9pbmFibGUoKSkgeworICAgICAgICAgICAgLy8gTWVyZ2UgcGVyY2VudGFnZSBieSBpbmRpdmlkdWFsIHBhcnRpdGlvbnMgd2hlcmVpbiBtZXJnZSBpcyBzdGlsbAorICAgICAgICAgICAgLy8gaW4tcHJvZ3Jlc3MKKyAgICAgICAgICAgIHBlcmNlbnRhZ2UgKz0gKCppdGVyKS0+c25hcHVzZXJkKCktPkdldE1lcmdlUGVyY2VudGFnZSgpOworICAgICAgICAgICAgbiArPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2FsY3VsYXRlIGZpbmFsIG1lcmdlIGluY2x1ZGluZyB0aG9zZSBwYXJ0aXRpb25zIHdoZXJlIG1lcmdlIHdhcyBhbHJlYWR5CisgICAgLy8gY29tcGxldGVkIC0gbnVtX3BhcnRpdGlvbnNfbWVyZ2VfY29tcGxldGVfIHdpbGwgdHJhY2sgdGhlbSB3aGVuIGVhY2gKKyAgICAvLyB0aHJlYWQgZXhpc3RzIGluIFJ1blRocmVhZC4KKyAgICBpbnQgdG90YWxfcGFydGl0aW9ucyA9IG4gKyBudW1fcGFydGl0aW9uc19tZXJnZV9jb21wbGV0ZV87CisKKyAgICBpZiAodG90YWxfcGFydGl0aW9ucykgeworICAgICAgICBwZXJjZW50YWdlID0gKChudW1fcGFydGl0aW9uc19tZXJnZV9jb21wbGV0ZV8gKiAxMDAuMCkgKyBwZXJjZW50YWdlKSAvIHRvdGFsX3BhcnRpdGlvbnM7CisgICAgfQorCisgICAgTE9HKERFQlVHKSA8PCAiTWVyZ2UgJTogIiA8PCBwZXJjZW50YWdlCisgICAgICAgICAgICAgICA8PCAiIG51bV9wYXJ0aXRpb25zX21lcmdlX2NvbXBsZXRlXzogIiA8PCBudW1fcGFydGl0aW9uc19tZXJnZV9jb21wbGV0ZV8KKyAgICAgICAgICAgICAgIDw8ICIgdG90YWxfcGFydGl0aW9uczogIiA8PCB0b3RhbF9wYXJ0aXRpb25zIDw8ICIgbjogIiA8PCBuOworICAgIHJldHVybiBwZXJjZW50YWdlOworfQorCitib29sIFNuYXBzaG90SGFuZGxlck1hbmFnZXI6OkdldFZlcmlmaWNhdGlvblN0YXR1cygpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhsb2NrXyk7CisKKyAgICBib29sIHN0YXR1cyA9IHRydWU7CisgICAgZm9yIChhdXRvIGl0ZXIgPSBkbV91c2Vyc18uYmVnaW4oKTsgaXRlciAhPSBkbV91c2Vyc18uZW5kKCk7IGl0ZXIrKykgeworICAgICAgICBhdXRvJiB0aCA9ICgqaXRlciktPnRocmVhZCgpOworICAgICAgICBpZiAodGguam9pbmFibGUoKSAmJiBzdGF0dXMpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9ICgqaXRlciktPnNuYXB1c2VyZCgpLT5DaGVja1BhcnRpdGlvblZlcmlmaWNhdGlvbigpICYmIHN0YXR1czsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHJldHVybiBpbW1lZGlhdGVseSBpZiB0aGVyZSBpcyBhIGZhaWx1cmUKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2Jvb2wgU25hcHNob3RIYW5kbGVyTWFuYWdlcjo6UmVtb3ZlQW5kSm9pbkhhbmRsZXIoY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyVGhyZWFkPiBoYW5kbGVyOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobG9ja18pOworCisgICAgICAgIGF1dG8gaXRlciA9IEZpbmRIYW5kbGVyKCZsb2NrLCBtaXNjX25hbWUpOworICAgICAgICBpZiAoaXRlciA9PSBkbV91c2Vyc18uZW5kKCkpIHsKKyAgICAgICAgICAgIC8vIENsaWVudCBhbHJlYWR5IGRlbGV0ZWQuCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBoYW5kbGVyID0gc3RkOjptb3ZlKCppdGVyKTsKKyAgICAgICAgZG1fdXNlcnNfLmVyYXNlKGl0ZXIpOworICAgIH0KKworICAgIGF1dG8mIHRoID0gaGFuZGxlci0+dGhyZWFkKCk7CisgICAgaWYgKHRoLmpvaW5hYmxlKCkpIHsKKyAgICAgICAgdGguam9pbigpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTbmFwc2hvdEhhbmRsZXJNYW5hZ2VyOjpUZXJtaW5hdGVNZXJnZVRocmVhZHMoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGd1YXJkKGxvY2tfKTsKKworICAgIGZvciAoYXV0byBpdGVyID0gZG1fdXNlcnNfLmJlZ2luKCk7IGl0ZXIgIT0gZG1fdXNlcnNfLmVuZCgpOyBpdGVyKyspIHsKKyAgICAgICAgaWYgKCEoKml0ZXIpLT5UaHJlYWRUZXJtaW5hdGVkKCkpIHsKKyAgICAgICAgICAgICgqaXRlciktPnNuYXB1c2VyZCgpLT5Ob3RpZnlJT1Rlcm1pbmF0ZWQoKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBTbmFwc2hvdEhhbmRsZXJNYW5hZ2VyOjpKb2luQWxsVGhyZWFkcygpIHsKKyAgICAvLyBBY3F1aXJlIHRoZSB0aHJlYWQgbGlzdCB3aXRoaW4gdGhlIGxvY2suCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEhhbmRsZXJUaHJlYWQ+PiBkbV91c2VyczsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBndWFyZChsb2NrXyk7CisgICAgICAgIGRtX3VzZXJzID0gc3RkOjptb3ZlKGRtX3VzZXJzXyk7CisgICAgfQorCisgICAgZm9yIChhdXRvJiBjbGllbnQgOiBkbV91c2VycykgeworICAgICAgICBhdXRvJiB0aCA9IGNsaWVudC0+dGhyZWFkKCk7CisKKyAgICAgICAgaWYgKHRoLmpvaW5hYmxlKCkpIHRoLmpvaW4oKTsKKyAgICB9CisKKyAgICBpZiAobWVyZ2VfbW9uaXRvcl8uam9pbmFibGUoKSkgeworICAgICAgICBzdG9wX21vbml0b3JfbWVyZ2VfdGhyZWFkXyA9IHRydWU7CisgICAgICAgIFdha2V1cE1vbml0b3JNZXJnZVRocmVhZCgpOworCisgICAgICAgIG1lcmdlX21vbml0b3JfLmpvaW4oKTsKKyAgICB9Cit9CisKK2F1dG8gU25hcHNob3RIYW5kbGVyTWFuYWdlcjo6RmluZEhhbmRsZXIoc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+KiBwcm9vZl9vZl9sb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lKSAtPiBIYW5kbGVyTGlzdDo6aXRlcmF0b3IgeworICAgIENIRUNLKHByb29mX29mX2xvY2spOworCisgICAgZm9yIChhdXRvIGl0ZXIgPSBkbV91c2Vyc18uYmVnaW4oKTsgaXRlciAhPSBkbV91c2Vyc18uZW5kKCk7IGl0ZXIrKykgeworICAgICAgICBpZiAoKCppdGVyKS0+bWlzY19uYW1lKCkgPT0gbWlzY19uYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gaXRlcjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZG1fdXNlcnNfLmVuZCgpOworfQorCit9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2UvaGFuZGxlcl9tYW5hZ2VyLmggYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2UvaGFuZGxlcl9tYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNmNWQ1YwotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9oYW5kbGVyX21hbmFnZXIuaApAQCAtMCwwICsxLDEzNyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHF1ZXVlPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgorI2luY2x1ZGUgPHNuYXB1c2VyZC9ibG9ja19zZXJ2ZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHNuYXBzaG90IHsKKworY2xhc3MgU25hcHNob3RIYW5kbGVyOworCitjbGFzcyBIYW5kbGVyVGhyZWFkIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IEhhbmRsZXJUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFNuYXBzaG90SGFuZGxlcj4gc25hcHVzZXJkKTsKKworICAgIHZvaWQgRnJlZVJlc291cmNlcygpOworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxTbmFwc2hvdEhhbmRsZXI+JiBzbmFwdXNlcmQoKSBjb25zdCB7IHJldHVybiBzbmFwdXNlcmRfOyB9CisgICAgc3RkOjp0aHJlYWQmIHRocmVhZCgpIHsgcmV0dXJuIHRocmVhZF87IH0KKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUoKSBjb25zdCB7IHJldHVybiBtaXNjX25hbWVfOyB9CisgICAgYm9vbCBUaHJlYWRUZXJtaW5hdGVkKCkgeyByZXR1cm4gdGhyZWFkX3Rlcm1pbmF0ZWRfOyB9CisgICAgdm9pZCBTZXRUaHJlYWRUZXJtaW5hdGVkKCkgeyB0aHJlYWRfdGVybWluYXRlZF8gPSB0cnVlOyB9CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnRocmVhZCB0aHJlYWRfOworICAgIHN0ZDo6c2hhcmVkX3B0cjxTbmFwc2hvdEhhbmRsZXI+IHNuYXB1c2VyZF87CisgICAgc3RkOjpzdHJpbmcgbWlzY19uYW1lXzsKKyAgICBib29sIHRocmVhZF90ZXJtaW5hdGVkXyA9IGZhbHNlOworfTsKKworY2xhc3MgSVNuYXBzaG90SGFuZGxlck1hbmFnZXIgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB+SVNuYXBzaG90SGFuZGxlck1hbmFnZXIoKSB7fQorCisgICAgLy8gQWRkIGEgbmV3IHNuYXBzaG90IGhhbmRsZXIgYnV0IGRvIG5vdCBzdGFydCBzZXJ2aW5nIHJlcXVlc3RzIHlldC4KKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyVGhyZWFkPiBBZGRIYW5kbGVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGNvd19kZXZpY2VfcGF0aCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBiYWNraW5nX2RldmljZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGJhc2VfcGF0aF9tZXJnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJQmxvY2tTZXJ2ZXJPcGVuZXI+IG9wZW5lciwgaW50IG51bV93b3JrZXJfdGhyZWFkcywgYm9vbCB1c2VfaW91cmluZywKKyAgICAgICAgICAgIGJvb2wgb19kaXJlY3QsIHVpbnQzMl90IGNvd19vcF9tZXJnZV9zaXplKSA9IDA7CisKKyAgICAvLyBTdGFydCBzZXJ2aW5nIHJlcXVlc3RzIG9uIGEgc25hcHNob3QgaGFuZGxlci4KKyAgICB2aXJ0dWFsIGJvb2wgU3RhcnRIYW5kbGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUpID0gMDsKKworICAgIC8vIFN0b3Agc2VydmluZyByZXF1ZXN0cyBvbiBhIHNuYXBzaG90IGhhbmRsZXIgYW5kIHJlbW92ZSBpdC4KKyAgICB2aXJ0dWFsIGJvb2wgRGVsZXRlSGFuZGxlcihjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lKSA9IDA7CisKKyAgICAvLyBCZWdpbiBtZXJnaW5nIGJsb2NrcyBvbiB0aGUgZ2l2ZW4gc25hcHNob3QgaGFuZGxlci4KKyAgICB2aXJ0dWFsIGJvb2wgSW5pdGlhdGVNZXJnZShjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lKSA9IDA7CisKKyAgICAvLyBSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyBhIHN0YXR1cyBjb2RlIGluZGljYXRpbmcgdGhlIG1lcmdlIHN0YXR1cworICAgIC8vIG9uIHRoZSBoYW5kbGVyLiBSZXR1cm5zIGVtcHR5IG9uIGVycm9yLgorICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0TWVyZ2VTdGF0dXMoY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSkgPSAwOworCisgICAgLy8gV2FpdCB1bnRpbCBhbGwgaGFuZGxlcnMgaGF2ZSB0ZXJtaW5hdGVkLgorICAgIHZpcnR1YWwgdm9pZCBKb2luQWxsVGhyZWFkcygpID0gMDsKKworICAgIC8vIFN0b3AgYW55IGluLXByb2dyZXNzIG1lcmdlIHRocmVhZHMuCisgICAgdmlydHVhbCB2b2lkIFRlcm1pbmF0ZU1lcmdlVGhyZWFkcygpID0gMDsKKworICAgIC8vIFJldHVybnMgdGhlIG1lcmdlIHByb2dyZXNzIGFjcm9zcyBhbGwgbWVyZ2luZyBzbmFwc2hvdCBoYW5kbGVycy4KKyAgICB2aXJ0dWFsIGRvdWJsZSBHZXRNZXJnZVBlcmNlbnRhZ2UoKSA9IDA7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgYWxsIHNuYXBzaG90cyBoYXZlIHZlcmlmaWVkLgorICAgIHZpcnR1YWwgYm9vbCBHZXRWZXJpZmljYXRpb25TdGF0dXMoKSA9IDA7CisKKyAgICAvLyBEaXNhYmxlIHBhcnRpdGlvbiB2ZXJpZmljYXRpb24KKyAgICB2aXJ0dWFsIHZvaWQgRGlzYWJsZVZlcmlmaWNhdGlvbigpID0gMDsKK307CisKK2NsYXNzIFNuYXBzaG90SGFuZGxlck1hbmFnZXIgZmluYWwgOiBwdWJsaWMgSVNuYXBzaG90SGFuZGxlck1hbmFnZXIgeworICBwdWJsaWM6CisgICAgU25hcHNob3RIYW5kbGVyTWFuYWdlcigpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyVGhyZWFkPiBBZGRIYW5kbGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvd19kZXZpY2VfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYmFja2luZ19kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJhc2VfcGF0aF9tZXJnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SUJsb2NrU2VydmVyT3BlbmVyPiBvcGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV93b3JrZXJfdGhyZWFkcywgYm9vbCB1c2VfaW91cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9fZGlyZWN0LCB1aW50MzJfdCBjb3dfb3BfbWVyZ2Vfc2l6ZSkgb3ZlcnJpZGU7CisgICAgYm9vbCBTdGFydEhhbmRsZXIoY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSkgb3ZlcnJpZGU7CisgICAgYm9vbCBEZWxldGVIYW5kbGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUpIG92ZXJyaWRlOworICAgIGJvb2wgSW5pdGlhdGVNZXJnZShjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lKSBvdmVycmlkZTsKKyAgICBzdGQ6OnN0cmluZyBHZXRNZXJnZVN0YXR1cyhjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lKSBvdmVycmlkZTsKKyAgICB2b2lkIEpvaW5BbGxUaHJlYWRzKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBUZXJtaW5hdGVNZXJnZVRocmVhZHMoKSBvdmVycmlkZTsKKyAgICBkb3VibGUgR2V0TWVyZ2VQZXJjZW50YWdlKCkgb3ZlcnJpZGU7CisgICAgYm9vbCBHZXRWZXJpZmljYXRpb25TdGF0dXMoKSBvdmVycmlkZTsKKyAgICB2b2lkIERpc2FibGVWZXJpZmljYXRpb24oKSBvdmVycmlkZSB7IHBlcmZvcm1fdmVyaWZpY2F0aW9uXyA9IGZhbHNlOyB9CisKKyAgcHJpdmF0ZToKKyAgICBib29sIFN0YXJ0SGFuZGxlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SGFuZGxlclRocmVhZD4mIGhhbmRsZXIpOworICAgIHZvaWQgUnVuVGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyVGhyZWFkPiBoYW5kbGVyKTsKKyAgICBib29sIFN0YXJ0TWVyZ2Uoc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+KiBwcm9vZl9vZl9sb2NrLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SGFuZGxlclRocmVhZD4mIGhhbmRsZXIpOworICAgIHZvaWQgTW9uaXRvck1lcmdlKCk7CisgICAgdm9pZCBXYWtldXBNb25pdG9yTWVyZ2VUaHJlYWQoKTsKKyAgICBib29sIFJlbW92ZUFuZEpvaW5IYW5kbGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUpOworCisgICAgLy8gRmluZCBhIEhhbmRsZXJUaHJlYWQgd2l0aGluIGEgbG9jay4KKyAgICB1c2luZyBIYW5kbGVyTGlzdCA9IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyVGhyZWFkPj47CisgICAgSGFuZGxlckxpc3Q6Oml0ZXJhdG9yIEZpbmRIYW5kbGVyKHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiogcHJvb2Zfb2ZfbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSk7CisKKyAgICBzdGQ6Om11dGV4IGxvY2tfOworICAgIEhhbmRsZXJMaXN0IGRtX3VzZXJzXzsKKworICAgIGJvb2wgc3RvcF9tb25pdG9yX21lcmdlX3RocmVhZF8gPSBmYWxzZTsKKyAgICBpbnQgYWN0aXZlX21lcmdlX3RocmVhZHNfID0gMDsKKyAgICBzdGQ6OnRocmVhZCBtZXJnZV9tb25pdG9yXzsKKyAgICBpbnQgbnVtX3BhcnRpdGlvbnNfbWVyZ2VfY29tcGxldGVfID0gMDsKKyAgICBzdGQ6OnF1ZXVlPHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyVGhyZWFkPj4gbWVyZ2VfaGFuZGxlcnNfOworICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBtb25pdG9yX21lcmdlX2V2ZW50X2ZkXzsKKyAgICBib29sIHBlcmZvcm1fdmVyaWZpY2F0aW9uXyA9IHRydWU7Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX21lcmdlLmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9tZXJnZV93b3JrZXIuY3BwCnNpbWlsYXJpdHkgaW5kZXggNzklCnJlbmFtZSBmcm9tIGZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfbWVyZ2UuY3BwCnJlbmFtZSB0byBmc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2UvbWVyZ2Vfd29ya2VyLmNwcAppbmRleCBkNTdmNDM0Li5hMGM1YzY2IDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX21lcmdlLmNwcAorKysgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2UvbWVyZ2Vfd29ya2VyLmNwcApAQCAtMTQsNyArMTQsMTQgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxsaWJzbmFwc2hvdC9jb3dfZm9ybWF0Lmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KKworI2luY2x1ZGUgIm1lcmdlX3dvcmtlci5oIgogI2luY2x1ZGUgInNuYXB1c2VyZF9jb3JlLmgiCisjaW5jbHVkZSAidXRpbGl0eS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2Ugc25hcHNob3QgewpAQCAtMjMsNDUgKzMwLDcwIEBACiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6ZG07CiB1c2luZyBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQ7CiAKLWludCBXb3JrZXI6OlByZXBhcmVNZXJnZSh1aW50NjRfdCogc291cmNlX29mZnNldCwgaW50KiBwZW5kaW5nX29wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBDb3dPcGVyYXRpb24qPiogcmVwbGFjZV96ZXJvX3ZlYykgeworTWVyZ2VXb3JrZXI6Ok1lcmdlV29ya2VyKGNvbnN0IHN0ZDo6c3RyaW5nJiBjb3dfZGV2aWNlLCBjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBiYXNlX3BhdGhfbWVyZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFNuYXBzaG90SGFuZGxlcj4gc25hcHVzZXJkLCB1aW50MzJfdCBjb3dfb3BfbWVyZ2Vfc2l6ZSkKKyAgICA6IFdvcmtlcihjb3dfZGV2aWNlLCBtaXNjX25hbWUsIGJhc2VfcGF0aF9tZXJnZSwgc25hcHVzZXJkKSwKKyAgICAgIGNvd19vcF9tZXJnZV9zaXplXyhjb3dfb3BfbWVyZ2Vfc2l6ZSkge30KKworaW50IE1lcmdlV29ya2VyOjpQcmVwYXJlTWVyZ2UodWludDY0X3QqIHNvdXJjZV9vZmZzZXQsIGludCogcGVuZGluZ19vcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBDb3dPcGVyYXRpb24qPiogcmVwbGFjZV96ZXJvX3ZlYykgewogICAgIGludCBudW1fb3BzID0gKnBlbmRpbmdfb3BzOworICAgIC8vIDAgaW5kaWNhdGVzIHJvLnZpcnR1YWxfYWIuY293X29wX21lcmdlX3NpemUgd2FzIG5vdCBzZXQgaW4gdGhlIGJ1aWxkCisgICAgaWYgKGNvd19vcF9tZXJnZV9zaXplXyAhPSAwKSB7CisgICAgICAgIG51bV9vcHMgPSBzdGQ6Om1pbihjb3dfb3BfbWVyZ2Vfc2l6ZV8sIHN0YXRpY19jYXN0PHVpbnQzMl90PigqcGVuZGluZ19vcHMpKTsKKyAgICB9CisKICAgICBpbnQgbnJfY29uc2VjdXRpdmUgPSAwOwogICAgIGJvb2wgY2hlY2tPcmRlcmVkT3AgPSAocmVwbGFjZV96ZXJvX3ZlYyA9PSBudWxscHRyKTsKKyAgICBzaXplX3QgbnVtX2Jsb2NrcyA9IDE7CiAKICAgICBkbyB7Ci0gICAgICAgIGlmICghY293b3BfaXRlcl8tPkRvbmUoKSAmJiBudW1fb3BzKSB7Ci0gICAgICAgICAgICBjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCA9ICZjb3dvcF9pdGVyXy0+R2V0KCk7CisgICAgICAgIGlmICghY293b3BfaXRlcl8tPkF0RW5kKCkgJiYgbnVtX29wcykgeworICAgICAgICAgICAgY29uc3QgQ293T3BlcmF0aW9uKiBjb3dfb3AgPSBjb3dvcF9pdGVyXy0+R2V0KCk7CiAgICAgICAgICAgICBpZiAoY2hlY2tPcmRlcmVkT3AgJiYgIUlzT3JkZXJlZE9wKCpjb3dfb3ApKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICpzb3VyY2Vfb2Zmc2V0ID0gY293X29wLT5uZXdfYmxvY2sgKiBCTE9DS19TWjsKKyAgICAgICAgICAgICpzb3VyY2Vfb2Zmc2V0ID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGNvd19vcC0+bmV3X2Jsb2NrKSAqIEJMT0NLX1NaOwogICAgICAgICAgICAgaWYgKCFjaGVja09yZGVyZWRPcCkgewogICAgICAgICAgICAgICAgIHJlcGxhY2VfemVyb192ZWMtPnB1c2hfYmFjayhjb3dfb3ApOworICAgICAgICAgICAgICAgIGlmIChjb3dfb3AtPnR5cGUoKSA9PSBrQ293UmVwbGFjZU9wKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbnVtYmVyIG9mIGJsb2NrcyB0aGlzIG9wIGhhcyBjb21wcmVzc2VkCisgICAgICAgICAgICAgICAgICAgIG51bV9ibG9ja3MgPSAoQ293T3BDb21wcmVzc2lvblNpemUoY293X29wLCBCTE9DS19TWikgLyBCTE9DS19TWik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBjb3dvcF9pdGVyXy0+TmV4dCgpOwotICAgICAgICAgICAgbnVtX29wcyAtPSAxOwotICAgICAgICAgICAgbnJfY29uc2VjdXRpdmUgPSAxOworICAgICAgICAgICAgbnVtX29wcyAtPSBudW1fYmxvY2tzOworICAgICAgICAgICAgbnJfY29uc2VjdXRpdmUgPSBudW1fYmxvY2tzOwogCi0gICAgICAgICAgICB3aGlsZSAoIWNvd29wX2l0ZXJfLT5Eb25lKCkgJiYgbnVtX29wcykgewotICAgICAgICAgICAgICAgIGNvbnN0IENvd09wZXJhdGlvbiogb3AgPSAmY293b3BfaXRlcl8tPkdldCgpOworICAgICAgICAgICAgd2hpbGUgKCFjb3dvcF9pdGVyXy0+QXRFbmQoKSAmJiBudW1fb3BzKSB7CisgICAgICAgICAgICAgICAgY29uc3QgQ293T3BlcmF0aW9uKiBvcCA9IGNvd29wX2l0ZXJfLT5HZXQoKTsKICAgICAgICAgICAgICAgICBpZiAoY2hlY2tPcmRlcmVkT3AgJiYgIUlzT3JkZXJlZE9wKCpvcCkpIHsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgdWludDY0X3QgbmV4dF9vZmZzZXQgPSBvcC0+bmV3X2Jsb2NrICogQkxPQ0tfU1o7CisgICAgICAgICAgICAgICAgdWludDY0X3QgbmV4dF9vZmZzZXQgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4ob3AtPm5ld19ibG9jaykgKiBCTE9DS19TWjsKICAgICAgICAgICAgICAgICBpZiAobmV4dF9vZmZzZXQgIT0gKCpzb3VyY2Vfb2Zmc2V0ICsgbnJfY29uc2VjdXRpdmUgKiBCTE9DS19TWikpIHsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKCFjaGVja09yZGVyZWRPcCkgeworICAgICAgICAgICAgICAgICAgICBpZiAob3AtPnR5cGUoKSA9PSBrQ293UmVwbGFjZU9wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBudW1fYmxvY2tzID0gKENvd09wQ29tcHJlc3Npb25TaXplKG9wLCBCTE9DS19TWikgLyBCTE9DS19TWik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVtX29wcyA8IG51bV9ibG9ja3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHplcm8gb3AKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bV9ibG9ja3MgPSAxOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VfemVyb192ZWMtPnB1c2hfYmFjayhvcCk7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgbnJfY29uc2VjdXRpdmUgKz0gMTsKLSAgICAgICAgICAgICAgICBudW1fb3BzIC09IDE7CisgICAgICAgICAgICAgICAgbnJfY29uc2VjdXRpdmUgKz0gbnVtX2Jsb2NrczsKKyAgICAgICAgICAgICAgICBudW1fb3BzIC09IG51bV9ibG9ja3M7CiAgICAgICAgICAgICAgICAgY293b3BfaXRlcl8tPk5leHQoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNzAsMjIgKzEwMiwyMiBAQAogICAgIHJldHVybiBucl9jb25zZWN1dGl2ZTsKIH0KIAotYm9vbCBXb3JrZXI6Ok1lcmdlUmVwbGFjZVplcm9PcHMoKSB7Ci0gICAgLy8gRmx1c2ggYWZ0ZXIgbWVyZ2luZyAyTUIuIFNpbmNlIGFsbCBvcHMgYXJlIGluZGVwZW5kZW50IGFuZCB0aGVyZSBpcyBubworYm9vbCBNZXJnZVdvcmtlcjo6TWVyZ2VSZXBsYWNlWmVyb09wcygpIHsKKyAgICAvLyBGbHVzaCBhZnRlciBtZXJnaW5nIDFNQi4gU2luY2UgYWxsIG9wcyBhcmUgaW5kZXBlbmRlbnQgYW5kIHRoZXJlIGlzIG5vCiAgICAgLy8gZGVwZW5kZW5jeSBiZXR3ZWVuIENPVyBvcHMsIHdlIHdpbGwgZmx1c2ggdGhlIGRhdGEgYW5kIHRoZSBudW1iZXIKICAgICAvLyBvZiBvcHMgbWVyZ2VkIGluIENPVyBibG9jayBkZXZpY2UuIElmIHRoZXJlIGlzIGEgY3Jhc2gsIHdlIHdpbGwKICAgICAvLyBlbmQgdXAgcmVwbGF5aW5nIHNvbWUgb2YgdGhlIENPVyBvcHMgd2hpY2ggd2VyZSBhbHJlYWR5IG1lcmdlZC4gVGhhdCBpcwogICAgIC8vIG9rLgogICAgIC8vCi0gICAgLy8gQWx0aG91Z2ggaW5jcmVhc2luZyB0aGlzIGdyZWF0ZXIgdGhhbiAyTUIgbWF5IGhlbHAgaW4gaW1wcm92aW5nIG1lcmdlCisgICAgLy8gQWx0aG91Z2ggaW5jcmVhc2luZyB0aGlzIGdyZWF0ZXIgdGhhbiAxTUIgbWF5IGhlbHAgaW4gaW1wcm92aW5nIG1lcmdlCiAgICAgLy8gdGltZXM7IGhvd2V2ZXIsIG9uIGRldmljZXMgd2l0aCBsb3cgbWVtb3J5LCB0aGlzIGNhbiBiZSBwcm9ibGVtYXRpYwogICAgIC8vIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIG1lcmdlIHRocmVhZHMgaW4gcGFyYWxsZWwuCi0gICAgaW50IHRvdGFsX29wc19tZXJnZWRfcGVyX2NvbW1pdCA9IChQQVlMT0FEX0JVRkZFUl9TWiAvIEJMT0NLX1NaKSAqIDI7CisgICAgaW50IHRvdGFsX29wc19tZXJnZWRfcGVyX2NvbW1pdCA9IChQQVlMT0FEX0JVRkZFUl9TWiAvIEJMT0NLX1NaKTsKICAgICBpbnQgbnVtX29wc19tZXJnZWQgPSAwOwogCiAgICAgU05BUF9MT0coSU5GTykgPDwgIk1lcmdlUmVwbGFjZVplcm9PcHMgc3RhcnRlZC4uLi4iOwogCi0gICAgd2hpbGUgKCFjb3dvcF9pdGVyXy0+RG9uZSgpKSB7CisgICAgd2hpbGUgKCFjb3dvcF9pdGVyXy0+QXRFbmQoKSkgewogICAgICAgICBpbnQgbnVtX29wcyA9IFBBWUxPQURfQlVGRkVSX1NaIC8gQkxPQ0tfU1o7CiAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IENvd09wZXJhdGlvbio+IHJlcGxhY2VfemVyb192ZWM7CiAgICAgICAgIHVpbnQ2NF90IHNvdXJjZV9vZmZzZXQ7CkBAIC05MywyNiArMTI1LDMzIEBACiAgICAgICAgIGludCBsaW5lYXJfYmxvY2tzID0gUHJlcGFyZU1lcmdlKCZzb3VyY2Vfb2Zmc2V0LCAmbnVtX29wcywgJnJlcGxhY2VfemVyb192ZWMpOwogICAgICAgICBpZiAobGluZWFyX2Jsb2NrcyA9PSAwKSB7CiAgICAgICAgICAgICAvLyBNZXJnZSBjb21wbGV0ZQotICAgICAgICAgICAgQ0hFQ0soY293b3BfaXRlcl8tPkRvbmUoKSk7CisgICAgICAgICAgICBDSEVDSyhjb3dvcF9pdGVyXy0+QXRFbmQoKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVwbGFjZV96ZXJvX3ZlYy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgY29uc3QgQ293T3BlcmF0aW9uKiBjb3dfb3AgPSByZXBsYWNlX3plcm9fdmVjW2ldOwotICAgICAgICAgICAgaWYgKGNvd19vcC0+dHlwZSA9PSBrQ293UmVwbGFjZU9wKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFQcm9jZXNzUmVwbGFjZU9wKGNvd19vcCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJNZXJnZSAtIFJlcGxhY2VPcCBmYWlsZWQgZm9yIGJsb2NrOiAiIDw8IGNvd19vcC0+bmV3X2Jsb2NrOworICAgICAgICAgICAgaWYgKGNvd19vcC0+dHlwZSgpID09IGtDb3dSZXBsYWNlT3ApIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyX3NpemUgPSBDb3dPcENvbXByZXNzaW9uU2l6ZShjb3dfb3AsIEJMT0NLX1NaKTsKKyAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIgPSBidWZzaW5rXy5BY3F1aXJlQnVmZmVyKGJ1ZmZlcl9zaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIkFjcXVpcmVCdWZmZXIgZmFpbGVkIGluIE1lcmdlUmVwbGFjZU9wcyI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgZW50aXJlIGNvbXByZXNzZWQgYnVmZmVyIHNwYW5uaW5nIG11bHRpcGxlIGJsb2NrcworICAgICAgICAgICAgICAgIGlmICghcmVhZGVyXy0+UmVhZERhdGEoY293X29wLCBidWZmZXIsIGJ1ZmZlcl9zaXplKSkgeworICAgICAgICAgICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIkZhaWxlZCB0byByZWFkIENPVyBpbiBtZXJnZSI7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIENIRUNLKGNvd19vcC0+dHlwZSA9PSBrQ293WmVyb09wKTsKLSAgICAgICAgICAgICAgICBpZiAoIVByb2Nlc3NaZXJvT3AoKSkgewotICAgICAgICAgICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIk1lcmdlIFplcm9PcCBmYWlsZWQuIjsKKyAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIgPSBidWZzaW5rXy5BY3F1aXJlQnVmZmVyKEJMT0NLX1NaKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIkFjcXVpcmVCdWZmZXIgZmFpbGVkIGluIE1lcmdlUmVwbGFjZU9wcyI7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ0hFQ0soY293X29wLT50eXBlKCkgPT0ga0Nvd1plcm9PcCk7CisgICAgICAgICAgICAgICAgbWVtc2V0KGJ1ZmZlciwgMCwgQkxPQ0tfU1opOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBidWZzaW5rXy5VcGRhdGVCdWZmZXJPZmZzZXQoQkxPQ0tfU1opOwogICAgICAgICB9CiAKICAgICAgICAgc2l6ZV90IGlvX3NpemUgPSBsaW5lYXJfYmxvY2tzICogQkxPQ0tfU1o7CkBAIC0xMjcsNyArMTY2LDcgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCi0gICAgICAgIG51bV9vcHNfbWVyZ2VkICs9IGxpbmVhcl9ibG9ja3M7CisgICAgICAgIG51bV9vcHNfbWVyZ2VkICs9IHJlcGxhY2VfemVyb192ZWMuc2l6ZSgpOwogCiAgICAgICAgIGlmIChudW1fb3BzX21lcmdlZCA+PSB0b3RhbF9vcHNfbWVyZ2VkX3Blcl9jb21taXQpIHsKICAgICAgICAgICAgIC8vIEZsdXNoIHRoZSBkYXRhCkBAIC0xNDgsOCArMTg3LDggQEAKICAgICAgICAgYnVmc2lua18uUmVzZXRCdWZmZXJPZmZzZXQoKTsKIAogICAgICAgICBpZiAoc25hcHVzZXJkXy0+SXNJT1Rlcm1pbmF0ZWQoKSkgewotICAgICAgICAgICAgU05BUF9MT0coRVJST1IpCi0gICAgICAgICAgICAgICAgICAgIDw8ICJNZXJnZVJlcGxhY2VaZXJvT3BzOiBXb3JrZXIgdGhyZWFkcyB0ZXJtaW5hdGVkIC0gc2h1dHRpbmcgZG93biBtZXJnZSI7CisgICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIk1lcmdlUmVwbGFjZVplcm9PcHM6IE1lcmdlV29ya2VyIHRocmVhZHMgdGVybWluYXRlZCAtIHNodXR0aW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZG93biBtZXJnZSI7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNzMsMTUgKzIxMiwxNSBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIFdvcmtlcjo6TWVyZ2VPcmRlcmVkT3BzQXN5bmMoKSB7Citib29sIE1lcmdlV29ya2VyOjpNZXJnZU9yZGVyZWRPcHNBc3luYygpIHsKICAgICB2b2lkKiBtYXBwZWRfYWRkciA9IHNuYXB1c2VyZF8tPkdldE1hcHBlZEFkZHIoKTsKICAgICB2b2lkKiByZWFkX2FoZWFkX2J1ZmZlciA9CiAgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkKj4oKGNoYXIqKW1hcHBlZF9hZGRyICsgc25hcHVzZXJkXy0+R2V0QnVmZmVyRGF0YU9mZnNldCgpKTsKIAogICAgIFNOQVBfTE9HKElORk8pIDw8ICJNZXJnZU9yZGVyZWRPcHNBc3luYyBzdGFydGVkLi4uLiI7CiAKLSAgICB3aGlsZSAoIWNvd29wX2l0ZXJfLT5Eb25lKCkpIHsKLSAgICAgICAgY29uc3QgQ293T3BlcmF0aW9uKiBjb3dfb3AgPSAmY293b3BfaXRlcl8tPkdldCgpOworICAgIHdoaWxlICghY293b3BfaXRlcl8tPkF0RW5kKCkpIHsKKyAgICAgICAgY29uc3QgQ293T3BlcmF0aW9uKiBjb3dfb3AgPSBjb3dvcF9pdGVyXy0+R2V0KCk7CiAgICAgICAgIGlmICghSXNPcmRlcmVkT3AoKmNvd19vcCkpIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xOTAsNiArMjI5LDcgQEAKICAgICAgICAgLy8gV2FpdCBmb3IgUkEgdGhyZWFkIHRvIG5vdGlmeSB0aGF0IHRoZSBtZXJnZSB3aW5kb3cKICAgICAgICAgLy8gaXMgcmVhZHkgZm9yIG1lcmdpbmcuCiAgICAgICAgIGlmICghc25hcHVzZXJkXy0+V2FpdEZvck1lcmdlQmVnaW4oKSkgeworICAgICAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJGYWlsZWQgd2FpdGluZyBmb3IgbWVyZ2UgdG8gYmVnaW4iOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKQEAgLTI5NSw3ICszMzUsNyBAQAogICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIGZhbGxiYWNrIHRvIHN5bmNocm9ub3VzIEkvTy4KICAgICAgICAgICAgICAgICAgICAgcmV0ID0gaW9fdXJpbmdfd2FpdF9jcWUocmluZ18uZ2V0KCksICZjcWUpOwogICAgICAgICAgICAgICAgICAgICBpZiAocmV0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIk1lcmdlOiBpb191cmluZ193YWl0X2NxZSBmYWlsZWQ6ICIgPDwgcmV0OworICAgICAgICAgICAgICAgICAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJNZXJnZTogaW9fdXJpbmdfd2FpdF9jcWUgZmFpbGVkOiAiIDw8IHN0cmVycm9yKC1yZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMzU0LDE1ICszOTQsMTUgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBXb3JrZXI6Ok1lcmdlT3JkZXJlZE9wcygpIHsKK2Jvb2wgTWVyZ2VXb3JrZXI6Ok1lcmdlT3JkZXJlZE9wcygpIHsKICAgICB2b2lkKiBtYXBwZWRfYWRkciA9IHNuYXB1c2VyZF8tPkdldE1hcHBlZEFkZHIoKTsKICAgICB2b2lkKiByZWFkX2FoZWFkX2J1ZmZlciA9CiAgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkKj4oKGNoYXIqKW1hcHBlZF9hZGRyICsgc25hcHVzZXJkXy0+R2V0QnVmZmVyRGF0YU9mZnNldCgpKTsKIAogICAgIFNOQVBfTE9HKElORk8pIDw8ICJNZXJnZU9yZGVyZWRPcHMgc3RhcnRlZC4uLi4iOwogCi0gICAgd2hpbGUgKCFjb3dvcF9pdGVyXy0+RG9uZSgpKSB7Ci0gICAgICAgIGNvbnN0IENvd09wZXJhdGlvbiogY293X29wID0gJmNvd29wX2l0ZXJfLT5HZXQoKTsKKyAgICB3aGlsZSAoIWNvd29wX2l0ZXJfLT5BdEVuZCgpKSB7CisgICAgICAgIGNvbnN0IENvd09wZXJhdGlvbiogY293X29wID0gY293b3BfaXRlcl8tPkdldCgpOwogICAgICAgICBpZiAoIUlzT3JkZXJlZE9wKCpjb3dfb3ApKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtNDM5LDExICs0NzksMTEgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBXb3JrZXI6OkFzeW5jTWVyZ2UoKSB7Citib29sIE1lcmdlV29ya2VyOjpBc3luY01lcmdlKCkgewogICAgIGlmICghTWVyZ2VPcmRlcmVkT3BzQXN5bmMoKSkgewogICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIk1lcmdlT3JkZXJlZE9wc0FzeW5jIGZhaWxlZCAtIEZhbGxpbmcgYmFjayB0byBzeW5jaHJvbm91cyBJL08iOwogICAgICAgICAvLyBSZXNldCB0aGUgaXRlciBzbyB0aGF0IHdlIHJldHJ5IHRoZSBtZXJnZQotICAgICAgICB3aGlsZSAoYmxvY2tzX21lcmdlZF9pbl9ncm91cF8gJiYgIWNvd29wX2l0ZXJfLT5SRG9uZSgpKSB7CisgICAgICAgIHdoaWxlIChibG9ja3NfbWVyZ2VkX2luX2dyb3VwXyAmJiAhY293b3BfaXRlcl8tPkF0QmVnaW4oKSkgewogICAgICAgICAgICAgY293b3BfaXRlcl8tPlByZXYoKTsKICAgICAgICAgICAgIGJsb2Nrc19tZXJnZWRfaW5fZ3JvdXBfIC09IDE7CiAgICAgICAgIH0KQEAgLTQ1NSw3ICs0OTUsNyBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIFdvcmtlcjo6U3luY01lcmdlKCkgeworYm9vbCBNZXJnZVdvcmtlcjo6U3luY01lcmdlKCkgewogICAgIGlmICghTWVyZ2VPcmRlcmVkT3BzKCkpIHsKICAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJNZXJnZSBmYWlsZWQgZm9yIG9yZGVyZWQgb3BzIjsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNDY1LDcgKzUwNSw3IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgV29ya2VyOjpNZXJnZSgpIHsKK2Jvb2wgTWVyZ2VXb3JrZXI6Ok1lcmdlKCkgewogICAgIGNvd29wX2l0ZXJfID0gcmVhZGVyXy0+R2V0T3BJdGVyKHRydWUpOwogCiAgICAgYm9vbCByZXRyeSA9IGZhbHNlOwpAQCAtNTExLDcgKzU1MSw3IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgV29ya2VyOjpJbml0aWFsaXplSW91cmluZygpIHsKK2Jvb2wgTWVyZ2VXb3JrZXI6OkluaXRpYWxpemVJb3VyaW5nKCkgewogICAgIGlmICghc25hcHVzZXJkXy0+SXNJb3VyaW5nU3VwcG9ydGVkKCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTUzMCwyNSArNTcwLDM1IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgV29ya2VyOjpGaW5hbGl6ZUlvdXJpbmcoKSB7Cit2b2lkIE1lcmdlV29ya2VyOjpGaW5hbGl6ZUlvdXJpbmcoKSB7CiAgICAgaWYgKG1lcmdlX2FzeW5jXykgewogICAgICAgICBpb191cmluZ19xdWV1ZV9leGl0KHJpbmdfLmdldCgpKTsKICAgICB9CiB9CiAKLWJvb2wgV29ya2VyOjpSdW5NZXJnZVRocmVhZCgpIHsKK2Jvb2wgTWVyZ2VXb3JrZXI6OlJ1bigpIHsKICAgICBTTkFQX0xPRyhERUJVRykgPDwgIldhaXRpbmcgZm9yIG1lcmdlIGJlZ2luLi4uIjsKKworICAgIHB0aHJlYWRfc2V0bmFtZV9ucChwdGhyZWFkX3NlbGYoKSwgIk1lcmdlV29ya2VyIik7CisKICAgICBpZiAoIXNuYXB1c2VyZF8tPldhaXRGb3JNZXJnZUJlZ2luKCkpIHsKLSAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJNZXJnZSB0ZXJtaW5hdGVkIGVhcmx5Li4uIjsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQorICAgIGF1dG8gbWVyZ2VfdGhyZWFkX3ByaW9yaXR5ID0gYW5kcm9pZDo6YmFzZTo6R2V0VWludFByb3BlcnR5PHVpbnQzMl90PigKKyAgICAgICAgICAgICJyby52aXJ0dWFsX2FiLm1lcmdlX3RocmVhZF9wcmlvcml0eSIsIEFORFJPSURfUFJJT1JJVFlfQkFDS0dST1VORCk7CiAKLSAgICBpZiAoc2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCBnZXR0aWQoKSwga05pY2VWYWx1ZUZvck1lcmdlVGhyZWFkcykpIHsKLSAgICAgICAgU05BUF9QTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHNldCBwcmlvcml0eSBmb3IgVElEOiAiIDw8IGdldHRpZCgpOworICAgIGlmICghU2V0VGhyZWFkUHJpb3JpdHkobWVyZ2VfdGhyZWFkX3ByaW9yaXR5KSkgeworICAgICAgICBTTkFQX1BMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gc2V0IHRocmVhZCBwcmlvcml0eSI7CisgICAgfQorCisgICAgaWYgKCFTZXRQcm9maWxlcyh7IkNQVVNFVF9TUF9CQUNLR1JPVU5EIn0pKSB7CisgICAgICAgIFNOQVBfUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBhc3NpZ24gdGFzayBwcm9maWxlIHRvIE1lcmdld29ya2VyIHRocmVhZCI7CiAgICAgfQogCiAgICAgU05BUF9MT0coSU5GTykgPDwgIk1lcmdlIHN0YXJ0aW5nLi4iOwogCisgICAgYnVmc2lua18uSW5pdGlhbGl6ZShQQVlMT0FEX0JVRkZFUl9TWik7CisKICAgICBpZiAoIUluaXQoKSkgewogICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIk1lcmdlIHRocmVhZCBpbml0aWFsaXphdGlvbiBmYWlsZWQuLi4iOwogICAgICAgICBzbmFwdXNlcmRfLT5NZXJnZUZhaWxlZCgpOwpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL21lcmdlX3dvcmtlci5oIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL21lcmdlX3dvcmtlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExOTM1MmQKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2UvbWVyZ2Vfd29ya2VyLmgKQEAgLTAsMCArMSw2MSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIndvcmtlci5oIgorCisjaW5jbHVkZSA8bGlidXJpbmcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHNuYXBzaG90IHsKKworY2xhc3MgTWVyZ2VXb3JrZXIgOiBwdWJsaWMgV29ya2VyIHsKKyAgcHVibGljOgorICAgIE1lcmdlV29ya2VyKGNvbnN0IHN0ZDo6c3RyaW5nJiBjb3dfZGV2aWNlLCBjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBiYXNlX3BhdGhfbWVyZ2UsIHN0ZDo6c2hhcmVkX3B0cjxTbmFwc2hvdEhhbmRsZXI+IHNuYXB1c2VyZCwKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBjb3dfb3BfbWVyZ2Vfc2l6ZSk7CisgICAgYm9vbCBSdW4oKTsKKworICBwcml2YXRlOgorICAgIGludCBQcmVwYXJlTWVyZ2UodWludDY0X3QqIHNvdXJjZV9vZmZzZXQsIGludCogcGVuZGluZ19vcHMsCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBDb3dPcGVyYXRpb24qPiogcmVwbGFjZV96ZXJvX3ZlYyA9IG51bGxwdHIpOworICAgIGJvb2wgTWVyZ2VSZXBsYWNlWmVyb09wcygpOworICAgIGJvb2wgTWVyZ2VPcmRlcmVkT3BzKCk7CisgICAgYm9vbCBNZXJnZU9yZGVyZWRPcHNBc3luYygpOworICAgIGJvb2wgTWVyZ2UoKTsKKyAgICBib29sIEFzeW5jTWVyZ2UoKTsKKyAgICBib29sIFN5bmNNZXJnZSgpOworICAgIGJvb2wgSW5pdGlhbGl6ZUlvdXJpbmcoKTsKKyAgICB2b2lkIEZpbmFsaXplSW91cmluZygpOworCisgIHByaXZhdGU6CisgICAgQnVmZmVyU2luayBidWZzaW5rXzsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SUNvd09wSXRlcj4gY293b3BfaXRlcl87CisgICAgc3RkOjp1bmlxdWVfcHRyPHN0cnVjdCBpb191cmluZz4gcmluZ187CisgICAgc2l6ZV90IHJhX2Jsb2NrX2luZGV4XyA9IDA7CisgICAgdWludDY0X3QgYmxvY2tzX21lcmdlZF9pbl9ncm91cF8gPSAwOworICAgIGJvb2wgbWVyZ2VfYXN5bmNfID0gZmFsc2U7CisgICAgLy8gUXVldWUgZGVwdGggb2YgOCBzZWVtcyBvcHRpbWFsLiBXZSBkb24ndCB3YW50CisgICAgLy8gdG8gaGF2ZSBhIGh1Z2UgZGVwdGggYXMgaXQgbWF5IHB1dCBtb3JlIG1lbW9yeSBwcmVzc3VyZQorICAgIC8vIG9uIHRoZSBrZXJuZWwgd29ya2VyIHRocmVhZHMgZ2l2ZW4gdGhhdCB3ZSB1c2UKKyAgICAvLyBJT1NRRV9BU1lOQyBmbGFnIC0gQVNZTkMgZmxhZ3MgY2FuIHBvdGVudGlhbGx5CisgICAgLy8gcmVzdWx0IGluIEVJTlRSOyBTaW5jZSB3ZSBkb24ndCByZXN0YXJ0CisgICAgLy8gc3lzY2FsbHMgYW5kIGZhbGxiYWNrIHRvIHN5bmNocm9ub3VzIEkvTywgd2UKKyAgICAvLyBkb24ndCB3YW50IGh1Z2UgcXVldWUgZGVwdGgKKyAgICBpbnQgcXVldWVfZGVwdGhfID0gODsKKyAgICB1aW50MzJfdCBjb3dfb3BfbWVyZ2Vfc2l6ZV8gPSAwOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL3JlYWRfd29ya2VyLmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9yZWFkX3dvcmtlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM3NjdkNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9yZWFkX3dvcmtlci5jcHAKQEAgLTAsMCArMSw2NzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KKworI2luY2x1ZGUgPGxpYnNuYXBzaG90L2Nvd19mb3JtYXQuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNpbmNsdWRlICJyZWFkX3dvcmtlci5oIgorI2luY2x1ZGUgInNuYXB1c2VyZF9jb3JlLmgiCisjaW5jbHVkZSAidXNlci1zcGFjZS1tZXJnZS93b3JrZXIuaCIKKyNpbmNsdWRlICJ1dGlsaXR5LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBzbmFwc2hvdCB7CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmRtOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOworCit2b2lkIFJlYWRXb3JrZXI6OkNsb3NlRmRzKCkgeworICAgIGJsb2NrX3NlcnZlcl8gPSB7fTsKKyAgICBiYWNraW5nX3N0b3JlX2ZkXyA9IHt9OworICAgIGJhY2tpbmdfc3RvcmVfZGlyZWN0X2ZkXyA9IHt9OworICAgIFdvcmtlcjo6Q2xvc2VGZHMoKTsKK30KKworUmVhZFdvcmtlcjo6UmVhZFdvcmtlcihjb25zdCBzdGQ6OnN0cmluZyYgY293X2RldmljZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGJhY2tpbmdfZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgYmFzZV9wYXRoX21lcmdlLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U25hcHNob3RIYW5kbGVyPiBzbmFwdXNlcmQsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJQmxvY2tTZXJ2ZXJPcGVuZXI+IG9wZW5lciwgYm9vbCBkaXJlY3RfcmVhZCkKKyAgICA6IFdvcmtlcihjb3dfZGV2aWNlLCBtaXNjX25hbWUsIGJhc2VfcGF0aF9tZXJnZSwgc25hcHVzZXJkKSwKKyAgICAgIGJhY2tpbmdfc3RvcmVfZGV2aWNlXyhiYWNraW5nX2RldmljZSksCisgICAgICBkaXJlY3RfcmVhZF8oZGlyZWN0X3JlYWQpLAorICAgICAgYmxvY2tfc2VydmVyX29wZW5lcl8ob3BlbmVyKSwKKyAgICAgIGFsaWduZWRfYnVmZmVyXyhzdGQ6OnVuaXF1ZV9wdHI8dm9pZCwgZGVjbHR5cGUoJjo6ZnJlZSk+KG51bGxwdHIsICY6OmZyZWUpKSB7fQorCisvLyBTdGFydCB0aGUgcmVwbGFjZSBvcGVyYXRpb24uIFRoaXMgd2lsbCByZWFkIHRoZQorLy8gaW50ZXJuYWwgQ09XIGZvcm1hdCBhbmQgaWYgdGhlIGJsb2NrIGlzIGNvbXByZXNzZWQsCisvLyBpdCB3aWxsIGJlIGRlLWNvbXByZXNzZWQuCitib29sIFJlYWRXb3JrZXI6OlByb2Nlc3NSZXBsYWNlT3AoY29uc3QgQ293T3BlcmF0aW9uKiBjb3dfb3AsIHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9zaXplKSB7CisgICAgaWYgKCFyZWFkZXJfLT5SZWFkRGF0YShjb3dfb3AsIGJ1ZmZlciwgYnVmZmVyX3NpemUpKSB7CisgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUHJvY2Vzc1JlcGxhY2VPcCBmYWlsZWQgZm9yIGJsb2NrICIgPDwgY293X29wLT5uZXdfYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgYnVmZmVyX3NpemU6ICIgPDwgYnVmZmVyX3NpemU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUmVhZFdvcmtlcjo6UmVhZEZyb21Tb3VyY2VEZXZpY2UoY29uc3QgQ293T3BlcmF0aW9uKiBjb3dfb3AsIHZvaWQqIGJ1ZmZlcikgeworICAgIHVpbnQ2NF90IG9mZnNldDsKKyAgICBpZiAoIXJlYWRlcl8tPkdldFNvdXJjZU9mZnNldChjb3dfb3AsICZvZmZzZXQpKSB7CisgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUmVhZEZyb21Tb3VyY2VEZXZpY2U6IEZhaWxlZCB0byBnZXQgc291cmNlIG9mZnNldCI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgU05BUF9MT0coREVCVUcpIDw8ICIgUmVhZEZyb21CYXNlRGV2aWNlLi4uOiBuZXctYmxvY2s6ICIgPDwgY293X29wLT5uZXdfYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgPDwgIiBPcDogIiA8PCAqY293X29wOworCisgICAgaWYgKGRpcmVjdF9yZWFkXyAmJiBJc0Jsb2NrQWxpZ25lZChvZmZzZXQpKSB7CisgICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhZEZ1bGx5QXRPZmZzZXQoYmFja2luZ19zdG9yZV9kaXJlY3RfZmRfLCBhbGlnbmVkX2J1ZmZlcl8uZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkxPQ0tfU1osIG9mZnNldCkpIHsKKyAgICAgICAgICAgIFNOQVBfUExPRyhFUlJPUikgPDwgIk9fRElSRUNUIFJlYWQgZmFpbGVkIGF0IG9mZnNldDogIiA8PCBvZmZzZXQ7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjptZW1jcHkoYnVmZmVyLCBhbGlnbmVkX2J1ZmZlcl8uZ2V0KCksIEJMT0NLX1NaKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHlBdE9mZnNldChiYWNraW5nX3N0b3JlX2ZkXywgYnVmZmVyLCBCTE9DS19TWiwgb2Zmc2V0KSkgeworICAgICAgICBzdGQ6OnN0cmluZyBvcDsKKyAgICAgICAgaWYgKGNvd19vcC0+dHlwZSgpID09IGtDb3dDb3B5T3ApCisgICAgICAgICAgICBvcCA9ICJDb3B5LW9wIjsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBvcCA9ICJYb3Itb3AiOworICAgICAgICB9CisgICAgICAgIFNOQVBfUExPRyhFUlJPUikgPDwgb3AgPDwgIiBmYWlsZWQuIFJlYWQgZnJvbSBiYWNraW5nIHN0b3JlOiAiIDw8IGJhY2tpbmdfc3RvcmVfZGV2aWNlXworICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJhdCBibG9jayA6IiA8PCBvZmZzZXQgLyBCTE9DS19TWiA8PCAiIG9mZnNldDoiIDw8IG9mZnNldCAlIEJMT0NLX1NaOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFN0YXJ0IHRoZSBjb3B5IG9wZXJhdGlvbi4gVGhpcyB3aWxsIHJlYWQgdGhlIGJhY2tpbmcKKy8vIGJsb2NrIGRldmljZSB3aGljaCBpcyByZXByZXNlbnRlZCBieSBjb3dfb3AtPnNvdXJjZS4KK2Jvb2wgUmVhZFdvcmtlcjo6UHJvY2Vzc0NvcHlPcChjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCwgdm9pZCogYnVmZmVyKSB7CisgICAgaWYgKCFSZWFkRnJvbVNvdXJjZURldmljZShjb3dfb3AsIGJ1ZmZlcikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBSZWFkV29ya2VyOjpQcm9jZXNzWG9yT3AoY29uc3QgQ293T3BlcmF0aW9uKiBjb3dfb3AsIHZvaWQqIGJ1ZmZlcikgeworICAgIHVzaW5nIFdvcmRUeXBlID0gc3RkOjpjb25kaXRpb25hbF90PHNpemVvZih2b2lkKikgPT0gc2l6ZW9mKHVpbnQ2NF90KSwgdWludDY0X3QsIHVpbnQzMl90PjsKKworICAgIGlmICghUmVhZEZyb21Tb3VyY2VEZXZpY2UoY293X29wLCBidWZmZXIpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoeG9yX2J1ZmZlcl8uZW1wdHkoKSkgeworICAgICAgICB4b3JfYnVmZmVyXy5yZXNpemUoQkxPQ0tfU1opOworICAgIH0KKyAgICBDSEVDSyh4b3JfYnVmZmVyXy5zaXplKCkgPT0gQkxPQ0tfU1opOworCisgICAgc3NpemVfdCBzaXplID0gcmVhZGVyXy0+UmVhZERhdGEoY293X29wLCB4b3JfYnVmZmVyXy5kYXRhKCksIHhvcl9idWZmZXJfLnNpemUoKSk7CisgICAgaWYgKHNpemUgIT0gQkxPQ0tfU1opIHsKKyAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJQcm9jZXNzWG9yT3AgZmFpbGVkIGZvciBibG9jayAiIDw8IGNvd19vcC0+bmV3X2Jsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCByZXR1cm4gdmFsdWU6ICIgPDwgc2l6ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGF1dG8geG9yX2luID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBXb3JkVHlwZSo+KHhvcl9idWZmZXJfLmRhdGEoKSk7CisgICAgYXV0byB4b3Jfb3V0ID0gcmVpbnRlcnByZXRfY2FzdDxXb3JkVHlwZSo+KGJ1ZmZlcik7CisgICAgYXV0byBudW1fd29yZHMgPSBCTE9DS19TWiAvIHNpemVvZihXb3JkVHlwZSk7CisKKyAgICBmb3IgKGF1dG8gaSA9IDA7IGkgPCBudW1fd29yZHM7IGkrKykgeworICAgICAgICB4b3Jfb3V0W2ldIF49IHhvcl9pbltpXTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUmVhZFdvcmtlcjo6UHJvY2Vzc1plcm9PcCh2b2lkKiBidWZmZXIpIHsKKyAgICBtZW1zZXQoYnVmZmVyLCAwLCBCTE9DS19TWik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUmVhZFdvcmtlcjo6UHJvY2Vzc09yZGVyZWRPcChjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCwgdm9pZCogYnVmZmVyKSB7CisgICAgTUVSR0VfR1JPVVBfU1RBVEUgc3RhdGUgPSBzbmFwdXNlcmRfLT5Qcm9jZXNzTWVyZ2luZ0Jsb2NrKGNvd19vcC0+bmV3X2Jsb2NrLCBidWZmZXIpOworCisgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICBjYXNlIE1FUkdFX0dST1VQX1NUQVRFOjpHUk9VUF9NRVJHRV9DT01QTEVURUQ6IHsKKyAgICAgICAgICAgIC8vIE1lcmdlIGlzIGNvbXBsZXRlZCBmb3IgdGhpcyBDT1cgb3A7IGp1c3QgcmVhZCBkaXJlY3RseSBmcm9tCisgICAgICAgICAgICAvLyB0aGUgYmFzZSBkZXZpY2UKKyAgICAgICAgICAgIFNOQVBfTE9HKERFQlVHKSA8PCAiTWVyZ2UtY29tcGxldGVkOiBSZWFkaW5nIGZyb20gYmFzZSBkZXZpY2Ugc2VjdG9yOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKGNvd19vcC0+bmV3X2Jsb2NrID4+IFNFQ1RPUl9TSElGVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIEJsb2NrLW51bWJlcjogIiA8PCBjb3dfb3AtPm5ld19ibG9jazsKKyAgICAgICAgICAgIGlmICghUmVhZERhdGFGcm9tQmFzZURldmljZShDaHVua1RvU2VjdG9yKGNvd19vcC0+bmV3X2Jsb2NrKSwgYnVmZmVyLCBCTE9DS19TWikpIHsKKyAgICAgICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlJlYWREYXRhRnJvbUJhc2VEZXZpY2UgYXQgc2VjdG9yOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChjb3dfb3AtPm5ld19ibG9jayA+PiBTRUNUT1JfU0hJRlQpIDw8ICIgYWZ0ZXIgbWVyZ2UtY29tcGxldGUuIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIE1FUkdFX0dST1VQX1NUQVRFOjpHUk9VUF9NRVJHRV9QRU5ESU5HOiB7CisgICAgICAgICAgICBib29sIHJldDsKKyAgICAgICAgICAgIGlmIChjb3dfb3AtPnR5cGUoKSA9PSBrQ293Q29weU9wKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gUHJvY2Vzc0NvcHlPcChjb3dfb3AsIGJ1ZmZlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldCA9IFByb2Nlc3NYb3JPcChjb3dfb3AsIGJ1ZmZlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEkvTyBpcyBjb21wbGV0ZSAtIGRlY3JlbWVudCB0aGUgcmVmY291bnQgaXJyZXNwZWN0aXZlIG9mIHRoZSByZXR1cm4KKyAgICAgICAgICAgIC8vIHN0YXR1cworICAgICAgICAgICAgc25hcHVzZXJkXy0+Tm90aWZ5SU9Db21wbGV0aW9uKGNvd19vcC0+bmV3X2Jsb2NrKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gV2UgYWxyZWFkeSBoYXZlIHRoZSBkYXRhIGluIHRoZSBidWZmZXIgcmV0cmlldmVkIGZyb20gUkEgdGhyZWFkLgorICAgICAgICAvLyBOb3RoaW5nIHRvIHByb2Nlc3MgZnVydGhlci4KKyAgICAgICAgY2FzZSBNRVJHRV9HUk9VUF9TVEFURTo6R1JPVVBfTUVSR0VfUkFfUkVBRFk6IHsKKyAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIE1FUkdFX0dST1VQX1NUQVRFOjpHUk9VUF9NRVJHRV9JTl9QUk9HUkVTUzogeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgLy8gQWxsIG90aGVyIHN0YXRlcywgZmFpbCB0aGUgSS9PIHZpeiAoR1JPVVBfTUVSR0VfRkFJTEVEIGFuZCBHUk9VUF9JTlZBTElEKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFJlYWRXb3JrZXI6OlByb2Nlc3NDb3dPcChjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCwgdm9pZCogYnVmZmVyKSB7CisgICAgaWYgKGNvd19vcCA9PSBudWxscHRyKSB7CisgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUHJvY2Vzc0Nvd09wOiBJbnZhbGlkIGNvd19vcCI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGNvd19vcC0+dHlwZSgpKSB7CisgICAgICAgIGNhc2Uga0Nvd1JlcGxhY2VPcDogeworICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlcl9zaXplID0gQ293T3BDb21wcmVzc2lvblNpemUoY293X29wLCBCTE9DS19TWik7CisgICAgICAgICAgICB1aW50OF90IGNodW5rW2J1ZmZlcl9zaXplXTsKKyAgICAgICAgICAgIGlmICghUHJvY2Vzc1JlcGxhY2VPcChjb3dfb3AsIGNodW5rLCBidWZmZXJfc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6Om1lbWNweShidWZmZXIsIGNodW5rLCBCTE9DS19TWik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga0Nvd1plcm9PcDogeworICAgICAgICAgICAgcmV0dXJuIFByb2Nlc3NaZXJvT3AoYnVmZmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga0Nvd0NvcHlPcDoKKyAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgY2FzZSBrQ293WG9yT3A6IHsKKyAgICAgICAgICAgIHJldHVybiBQcm9jZXNzT3JkZXJlZE9wKGNvd19vcCwgYnVmZmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiVW5rbm93biBvcGVyYXRpb24tdHlwZSBmb3VuZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvd19vcC0+dHlwZSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUmVhZFdvcmtlcjo6SW5pdCgpIHsKKyAgICBpZiAoIVdvcmtlcjo6SW5pdCgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBzaXplX3QgY29tcHJlc3Npb25fZmFjdG9yID0gcmVhZGVyXy0+R2V0TWF4Q29tcHJlc3Npb25TaXplKCk7CisgICAgaWYgKCFjb21wcmVzc2lvbl9mYWN0b3IpIHsKKyAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJDb21wcmVzc2lvbiBmYWN0b3IgaXMgc2V0IHRvIDAgd2hpY2ggaXMgaW52YWxpZC4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGRlY29tcHJlc3NlZF9idWZmZXJfID0gc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KGNvbXByZXNzaW9uX2ZhY3Rvcik7CisKKyAgICBiYWNraW5nX3N0b3JlX2ZkXy5yZXNldChvcGVuKGJhY2tpbmdfc3RvcmVfZGV2aWNlXy5jX3N0cigpLCBPX1JET05MWSkpOworICAgIGlmIChiYWNraW5nX3N0b3JlX2ZkXyA8IDApIHsKKyAgICAgICAgU05BUF9QTE9HKEVSUk9SKSA8PCAiT3BlbiBGYWlsZWQ6ICIgPDwgYmFja2luZ19zdG9yZV9kZXZpY2VfOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGRpcmVjdF9yZWFkXykgeworICAgICAgICBiYWNraW5nX3N0b3JlX2RpcmVjdF9mZF8ucmVzZXQob3BlbihiYWNraW5nX3N0b3JlX2RldmljZV8uY19zdHIoKSwgT19SRE9OTFkgfCBPX0RJUkVDVCkpOworICAgICAgICBpZiAoYmFja2luZ19zdG9yZV9kaXJlY3RfZmRfIDwgMCkgeworICAgICAgICAgICAgU05BUF9QTE9HKEVSUk9SKSA8PCAiT3BlbiBGYWlsZWQgd2l0aCBPX0RJUkVDVDogIiA8PCBiYWNraW5nX3N0b3JlX2RpcmVjdF9mZF87CisgICAgICAgICAgICBkaXJlY3RfcmVhZF8gPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZvaWQqIGFsaWduZWRfYWRkcjsKKyAgICAgICAgICAgIHNzaXplX3QgcGFnZV9zaXplID0gZ2V0cGFnZXNpemUoKTsKKyAgICAgICAgICAgIGlmIChwb3NpeF9tZW1hbGlnbigmYWxpZ25lZF9hZGRyLCBwYWdlX3NpemUsIHBhZ2Vfc2l6ZSkgPCAwKSB7CisgICAgICAgICAgICAgICAgZGlyZWN0X3JlYWRfID0gZmFsc2U7CisgICAgICAgICAgICAgICAgU05BUF9QTE9HKEVSUk9SKSA8PCAicG9zaXhfbWVtYWxpZ24gZmFpbGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgcGFnZV9zaXplOiAiIDw8IHBhZ2Vfc2l6ZSA8PCAiIHJlYWRfc3o6ICIgPDwgcGFnZV9zaXplOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhbGlnbmVkX2J1ZmZlcl8ucmVzZXQoYWxpZ25lZF9hZGRyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGJsb2NrX3NlcnZlcl8gPSBibG9ja19zZXJ2ZXJfb3BlbmVyXy0+T3Blbih0aGlzLCBQQVlMT0FEX0JVRkZFUl9TWik7CisgICAgaWYgKCFibG9ja19zZXJ2ZXJfKSB7CisgICAgICAgIFNOQVBfUExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBvcGVuIGJsb2NrIHNlcnZlciI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUmVhZFdvcmtlcjo6UnVuKCkgeworICAgIFNOQVBfTE9HKElORk8pIDw8ICJQcm9jZXNzaW5nIHNuYXBzaG90IEkvTyByZXF1ZXN0cy4uLi4iOworCisgICAgcHRocmVhZF9zZXRuYW1lX25wKHB0aHJlYWRfc2VsZigpLCAiUmVhZFdvcmtlciIpOworICAgIGF1dG8gd29ya2VyX3RocmVhZF9wcmlvcml0eSA9IGFuZHJvaWQ6OmJhc2U6OkdldFVpbnRQcm9wZXJ0eTx1aW50MzJfdD4oCisgICAgICAgICAgICAicm8udmlydHVhbF9hYi53b3JrZXJfdGhyZWFkX3ByaW9yaXR5IiwgQU5EUk9JRF9QUklPUklUWV9OT1JNQUwpOworCisgICAgaWYgKCFTZXRUaHJlYWRQcmlvcml0eSh3b3JrZXJfdGhyZWFkX3ByaW9yaXR5KSkgeworICAgICAgICBTTkFQX1BMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gc2V0IHRocmVhZCBwcmlvcml0eSI7CisgICAgfQorCisgICAgLy8gU3RhcnQgc2VydmluZyBJTworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmICghYmxvY2tfc2VydmVyXy0+UHJvY2Vzc1JlcXVlc3RzKCkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgQ2xvc2VGZHMoKTsKKyAgICByZWFkZXJfLT5DbG9zZUNvd0ZkKCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBSZWFkV29ya2VyOjpSZWFkRGF0YUZyb21CYXNlRGV2aWNlKHNlY3Rvcl90IHNlY3Rvciwgdm9pZCogYnVmZmVyLCBzaXplX3QgcmVhZF9zaXplKSB7CisgICAgQ0hFQ0socmVhZF9zaXplIDw9IEJMT0NLX1NaKTsKKworICAgIGxvZmZfdCBvZmZzZXQgPSBzZWN0b3IgPDwgU0VDVE9SX1NISUZUOworICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhZEZ1bGx5QXRPZmZzZXQoYmFzZV9wYXRoX21lcmdlX2ZkXywgYnVmZmVyLCByZWFkX3NpemUsIG9mZnNldCkpIHsKKyAgICAgICAgU05BUF9QTE9HKEVSUk9SKSA8PCAiUmVhZERhdGFGcm9tQmFzZURldmljZSBmYWlsZWQuIGZkOiAiIDw8IGJhc2VfcGF0aF9tZXJnZV9mZF8KKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiYXQgc2VjdG9yIDoiIDw8IHNlY3RvciA8PCAiIHNpemU6ICIgPDwgcmVhZF9zaXplOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUmVhZFdvcmtlcjo6R2V0Q293T3BCbG9ja09mZnNldChjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCwgdWludDY0X3QgaW9fYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmX3QqIGJsb2NrX29mZnNldCkgeworICAgIC8vIElmIHRoaXMgaXMgYSByZXBsYWNlIG9wLCBnZXQgdGhlIGJsb2NrIG9mZnNldCBvZiB0aGlzIEkvTworICAgIC8vIGJsb2NrLiBNdWx0aS1ibG9jayBjb21wcmVzc2lvbiBpcyBzdXBwb3J0ZWQgb25seSBmb3IKKyAgICAvLyBSZXBsYWNlIG9wcy4KKyAgICAvLworICAgIC8vIE5vdGU6IFRoaXMgY2FuIGJlIGV4dGVuZGVkIHdoZW4gd2Ugc3VwcG9ydCBDT1BZIGFuZCBYT1Igb3BzIGRvd24gdGhlCisgICAgLy8gbGluZSBhcyB0aGUgYmxvY2tzIGFyZSBtb3N0bHkgY29udGlndW91cy4KKyAgICBpZiAoY293X29wICYmIGNvd19vcC0+dHlwZSgpID09IGtDb3dSZXBsYWNlT3ApIHsKKyAgICAgICAgcmV0dXJuIEdldEJsb2NrT2Zmc2V0KGNvd19vcCwgaW9fYmxvY2ssIEJMT0NLX1NaLCBibG9ja19vZmZzZXQpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUmVhZFdvcmtlcjo6UmVhZEFsaWduZWRTZWN0b3Ioc2VjdG9yX3Qgc2VjdG9yLCBzaXplX3Qgc3opIHsKKyAgICBzaXplX3QgcmVtYWluaW5nX3NpemUgPSBzejsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c2VjdG9yX3QsIGNvbnN0IENvd09wZXJhdGlvbio+PiYgY2h1bmtfdmVjID0gc25hcHVzZXJkXy0+R2V0Q2h1bmtWZWMoKTsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGRvIHsKKyAgICAgICAgLy8gUHJvY2VzcyAxTUIgcGF5bG9hZCBhdCBhIHRpbWUKKyAgICAgICAgc2l6ZV90IHJlYWRfc2l6ZSA9IHN0ZDo6bWluKFBBWUxPQURfQlVGRkVSX1NaLCByZW1haW5pbmdfc2l6ZSk7CisKKyAgICAgICAgc2l6ZV90IHRvdGFsX2J5dGVzX3JlYWQgPSAwOworICAgICAgICBjb25zdCBDb3dPcGVyYXRpb24qIHByZXZfb3AgPSBudWxscHRyOworICAgICAgICB3aGlsZSAocmVhZF9zaXplKSB7CisgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIGV2ZXJ5IDRrIGJsb2NrIHRvIHZlcmlmeSBpZiBpdCBpcworICAgICAgICAgICAgLy8gcHJlc2VudCBpbiB0aGUgbWFwcGluZy4KKyAgICAgICAgICAgIHNpemVfdCBzaXplID0gc3RkOjptaW4oQkxPQ0tfU1osIHJlYWRfc2l6ZSk7CisKKyAgICAgICAgICAgIGF1dG8gaXQgPSBzdGQ6Omxvd2VyX2JvdW5kKGNodW5rX3ZlYy5iZWdpbigpLCBjaHVua192ZWMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihzZWN0b3IsIG51bGxwdHIpLCBTbmFwc2hvdEhhbmRsZXI6OmNvbXBhcmUpOworICAgICAgICAgICAgY29uc3QgYm9vbCBzZWN0b3Jfbm90X2ZvdW5kID0gKGl0ID09IGNodW5rX3ZlYy5lbmQoKSB8fCBpdC0+Zmlyc3QgIT0gc2VjdG9yKTsKKworICAgICAgICAgICAgdm9pZCogYnVmZmVyID0gYmxvY2tfc2VydmVyXy0+R2V0UmVzcG9uc2VCdWZmZXIoQkxPQ0tfU1osIHNpemUpOworICAgICAgICAgICAgaWYgKCFidWZmZXIpIHsKKyAgICAgICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIkFjcXVpcmVCdWZmZXIgZmFpbGVkIGluIFJlYWRBbGlnbmVkU2VjdG9yIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzZWN0b3Jfbm90X2ZvdW5kKSB7CisgICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgNGsgYmxvY2sKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBpb19ibG9jayA9IFNlY3RvclRvQ2h1bmsoc2VjdG9yKTsKKyAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHByZXZpb3VzIGl0ZXJhdG9yLiBTaW5jZSB0aGUgdmVjdG9yIGlzIHNvcnRlZCwgdGhlCisgICAgICAgICAgICAgICAgLy8gbG9va3VwIG9mIHRoaXMgc2VjdG9yIGNhbiBmYWxsIGluIGEgcmFuZ2Ugb2YgYmxvY2tzIGlmCisgICAgICAgICAgICAgICAgLy8gQ293T3BlcmF0aW9uIGhhcyBjb21wcmVzc2VkIG11bHRpcGxlIGJsb2Nrcy4KKyAgICAgICAgICAgICAgICBpZiAoaXQgIT0gY2h1bmtfdmVjLmJlZ2luKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjphZHZhbmNlKGl0LCAtMSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYm9vbCBpc19tYXBwaW5nX3ByZXNlbnQgPSB0cnVlOworCisgICAgICAgICAgICAgICAgLy8gVmVjdG9yIGl0c2VsZiBpcyBlbXB0eS4gVGhpcyBjYW4gaGFwcGVuIGlmIHRoZSBibG9jayB3YXMgbm90CisgICAgICAgICAgICAgICAgLy8gY2hhbmdlZCBwZXIgdGhlIE9UQSBvciBpZiB0aGUgbWVyZ2Ugd2FzIGFscmVhZHkgY29tcGxldGUgYnV0CisgICAgICAgICAgICAgICAgLy8gc25hcHNob3QgdGFibGUgd2FzIG5vdCB5ZXQgY29sbGFwc2VkLgorICAgICAgICAgICAgICAgIGlmIChpdCA9PSBjaHVua192ZWMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaXNfbWFwcGluZ19wcmVzZW50ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29uc3QgQ293T3BlcmF0aW9uKiBjb3dfb3AgPSBudWxscHRyOworICAgICAgICAgICAgICAgIC8vIFJlbGF0aXZlIG9mZnNldCB3aXRoaW4gdGhlIGNvbXByZXNzZWQgbXVsdGlwbGUgYmxvY2tzCisgICAgICAgICAgICAgICAgb2ZmX3QgYmxvY2tfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoaXNfbWFwcGluZ19wcmVzZW50KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbmVhcmVzdCBvcGVyYXRpb24gZm91bmQgaW4gdGhlIHZlY3RvcgorICAgICAgICAgICAgICAgICAgICBjb3dfb3AgPSBpdC0+c2Vjb25kOworICAgICAgICAgICAgICAgICAgICBpc19tYXBwaW5nX3ByZXNlbnQgPSBHZXRDb3dPcEJsb2NrT2Zmc2V0KGNvd19vcCwgaW9fYmxvY2ssICZibG9ja19vZmZzZXQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFRodXMsIHdlIGhhdmUgYSBjYXNlIHdoZXJlaW4gc2VjdG9yIHdhcyBub3QgZm91bmQgaW4gdGhlIHNvcnRlZAorICAgICAgICAgICAgICAgIC8vIHZlY3RvcjsgaG93ZXZlciwgd2UgaW5kZWVkIGhhdmUgYSBtYXBwaW5nIG9mIHRoaXMgc2VjdG9yCisgICAgICAgICAgICAgICAgLy8gZW1iZWRkZWQgaW4gb25lIG9mIHRoZSBDb3dPcGVyYXRpb24gd2hpY2ggc3BhbnMgbXVsdGlwbGUKKyAgICAgICAgICAgICAgICAvLyBibG9jayBzaXplLgorICAgICAgICAgICAgICAgIGlmIChpc19tYXBwaW5nX3ByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYmxvY2tfb2Zmc2V0ID0gMCB3b3VsZCBtZWFuIHRoYXQgdGhlIENvd09wZXJhdGlvbiBzaG91bGQKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBiZSBpbiB0aGUgc29ydGVkIHZlY3Rvci4gSGVuY2UsIGxvb2t1cCBzaG91bGQKKyAgICAgICAgICAgICAgICAgICAgLy8gaGF2ZSBhbHJlYWR5IGZvdW5kIGl0LiBJZiBub3QsIHRoaXMgaXMgYSBidWcuCisgICAgICAgICAgICAgICAgICAgIGlmIChibG9ja19vZmZzZXQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU05BUF9MT0coRVJST1IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJHZXRCbG9ja09mZnNldCByZXR1cm5lZCBvZmZzZXQgMCBmb3IgaW9fYmxvY2s6ICIgPDwgaW9fYmxvY2s7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIENvd09wZXJhdGlvbiBhY3R1YWwgY29tcHJlc3Npb24gc2l6ZQorICAgICAgICAgICAgICAgICAgICBzaXplX3QgY29tcHJlc3Npb25fc2l6ZSA9IENvd09wQ29tcHJlc3Npb25TaXplKGNvd19vcCwgQkxPQ0tfU1opOworICAgICAgICAgICAgICAgICAgICAvLyBPZmZzZXQgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiB0aGUgY29tcHJlc3Npb24gc2l6ZQorICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2tfb2Zmc2V0ID4gY29tcHJlc3Npb25fc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJJbnZhbGlkIEkvTyBibG9jayBmb3VuZC4gaW9fYmxvY2s6ICIgPDwgaW9fYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIENvd09wZXJhdGlvbi1uZXctYmxvY2s6ICIgPDwgY293X29wLT5uZXdfYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGNvbXByZXNzaW9uLXNpemU6ICIgPDwgY29tcHJlc3Npb25fc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIENhY2hlZCBjb3B5IG9mIHRoZSBwcmV2aW91cyBpdGVyYXRpb24uIEp1c3QgcmV0cmlldmUgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZfb3AgJiYgcHJldl9vcC0+bmV3X2Jsb2NrID09IGNvd19vcC0+bmV3X2Jsb2NrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1lbWNweShidWZmZXIsIChjaGFyKilkZWNvbXByZXNzZWRfYnVmZmVyXy5nZXQoKSArIGJsb2NrX29mZnNldCwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGRhdGEgZnJvbSB0aGUgZGlzayBiYXNlZCBvbiB0aGUgY29tcHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghUHJvY2Vzc1JlcGxhY2VPcChjb3dfb3AsIGRlY29tcHJlc3NlZF9idWZmZXJfLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uX3NpemUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29weSB0aGUgZGF0YSBmcm9tIHRoZSBkZWNvbXByZXNzZWQgYnVmZmVyIHJlbGF0aXZlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byB0aGUgaS9vIGJsb2NrIG9mZnNldC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWVtY3B5KGJ1ZmZlciwgKGNoYXIqKWRlY29tcHJlc3NlZF9idWZmZXJfLmdldCgpICsgYmxvY2tfb2Zmc2V0LCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhY2hlIHRoaXMgQ293T3BlcmF0aW9uIHBvaW50ZXIgZm9yIHN1Y2Nlc3NpdmUgSS9PCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcGVyYXRpb24uIFNpbmNlIHRoZSByZXF1ZXN0IGlzIHNlcXVlbnRpYWwgYW5kIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmxvY2sgaXMgYWxyZWFkeSBkZWNvbXByZXNzZWQsIHN1YnNlcXVlc3QgSS9PIGJsb2NrcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuIGZldGNoIHRoZSBkYXRhIGRpcmVjdGx5IGZyb20gdGhpcyBkZWNvbXByZXNzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfb3AgPSBjb3dfb3A7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBCbG9jayBub3QgZm91bmQgaW4gbWFwIC0gd2hpY2ggbWVhbnMgdGhpcyBibG9jayB3YXMgbm90CisgICAgICAgICAgICAgICAgICAgIC8vIGNoYW5nZWQgYXMgcGVyIHRoZSBPVEEuIEp1c3Qgcm91dGUgdGhlIEkvTyB0byB0aGUgYmFzZQorICAgICAgICAgICAgICAgICAgICAvLyBkZXZpY2UuCisgICAgICAgICAgICAgICAgICAgIGlmICghUmVhZERhdGFGcm9tQmFzZURldmljZShzZWN0b3IsIGJ1ZmZlciwgc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUmVhZERhdGFGcm9tQmFzZURldmljZSBmYWlsZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldCA9IHNpemU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFdlIGZvdW5kIHRoZSBzZWN0b3IgaW4gbWFwcGluZy4gQ2hlY2sgdGhlIHR5cGUgb2YgQ09XIE9QIGFuZAorICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgaXQuCisgICAgICAgICAgICAgICAgaWYgKCFQcm9jZXNzQ293T3AoaXQtPnNlY29uZCwgYnVmZmVyKSkgeworICAgICAgICAgICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiUHJvY2Vzc0Nvd09wIGZhaWxlZCwgc2VjdG9yID0gIiA8PCBzZWN0b3IgPDwgIiwgc2l6ZSA9ICIgPDwgc3o7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXQgPSBzdGQ6Om1pbihCTE9DS19TWiwgcmVhZF9zaXplKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVhZF9zaXplIC09IHJldDsKKyAgICAgICAgICAgIHRvdGFsX2J5dGVzX3JlYWQgKz0gcmV0OworICAgICAgICAgICAgc2VjdG9yICs9IChyZXQgPj4gU0VDVE9SX1NISUZUKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghU2VuZEJ1ZmZlcmVkSW8oKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgU05BUF9MT0coREVCVUcpIDw8ICJTZW5kQnVmZmVyZWRJbyBzdWNjZXNzIHRvdGFsX2J5dGVzX3JlYWQ6ICIgPDwgdG90YWxfYnl0ZXNfcmVhZAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiByZW1haW5pbmdfc2l6ZTogIiA8PCByZW1haW5pbmdfc2l6ZTsKKyAgICAgICAgcmVtYWluaW5nX3NpemUgLT0gdG90YWxfYnl0ZXNfcmVhZDsKKyAgICB9IHdoaWxlIChyZW1haW5pbmdfc2l6ZSA+IDApOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUmVhZFdvcmtlcjo6SXNNYXBwaW5nUHJlc2VudChjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCwgbG9mZl90IHJlcXVlc3RlZF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9mZl90IGNvd19vcF9vZmZzZXQpIHsKKyAgICBjb25zdCBib29sIHJlcGxhY2Vfb3AgPSAoY293X29wLT50eXBlKCkgPT0ga0Nvd1JlcGxhY2VPcCk7CisgICAgaWYgKHJlcGxhY2Vfb3ApIHsKKyAgICAgICAgc2l6ZV90IG1heF9jb21wcmVzc2VkX3NpemUgPSBDb3dPcENvbXByZXNzaW9uU2l6ZShjb3dfb3AsIEJMT0NLX1NaKTsKKyAgICAgICAgaWYgKChyZXF1ZXN0ZWRfb2Zmc2V0ID49IGNvd19vcF9vZmZzZXQpICYmCisgICAgICAgICAgICAocmVxdWVzdGVkX29mZnNldCA8IChjb3dfb3Bfb2Zmc2V0ICsgbWF4X2NvbXByZXNzZWRfc2l6ZSkpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2ludCBSZWFkV29ya2VyOjpSZWFkVW5hbGlnbmVkU2VjdG9yKAorICAgICAgICBzZWN0b3JfdCBzZWN0b3IsIHNpemVfdCBzaXplLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c2VjdG9yX3QsIGNvbnN0IENvd09wZXJhdGlvbio+Pjo6aXRlcmF0b3ImIGl0KSB7CisgICAgU05BUF9MT0coREVCVUcpIDw8ICJSZWFkVW5hbGlnbmVkU2VjdG9yOiBzZWN0b3IgIiA8PCBzZWN0b3IgPDwgIiBzaXplOiAiIDw8IHNpemUKKyAgICAgICAgICAgICAgICAgICAgPDwgIiBBbGlnbmVkIHNlY3RvcjogIiA8PCBpdC0+Zmlyc3Q7CisKKyAgICBsb2ZmX3QgcmVxdWVzdGVkX29mZnNldCA9IHNlY3RvciA8PCBTRUNUT1JfU0hJRlQ7CisgICAgbG9mZl90IGZpbmFsX29mZnNldCA9IChpdC0+Zmlyc3QpIDw8IFNFQ1RPUl9TSElGVDsKKworICAgIGNvbnN0IENvd09wZXJhdGlvbiogY293X29wID0gaXQtPnNlY29uZDsKKyAgICBpZiAoSXNNYXBwaW5nUHJlc2VudChjb3dfb3AsIHJlcXVlc3RlZF9vZmZzZXQsIGZpbmFsX29mZnNldCkpIHsKKyAgICAgICAgc2l6ZV90IGJ1ZmZlcl9zaXplID0gQ293T3BDb21wcmVzc2lvblNpemUoY293X29wLCBCTE9DS19TWik7CisgICAgICAgIHVpbnQ4X3QgY2h1bmtbYnVmZmVyX3NpemVdOworICAgICAgICAvLyBSZWFkIHRoZSBlbnRpcmUgZGVjb21wcmVzc2VkIGJ1ZmZlciBiYXNlZCBvbiB0aGUgYmxvY2stc2l6ZQorICAgICAgICBpZiAoIVByb2Nlc3NSZXBsYWNlT3AoY293X29wLCBjaHVuaywgYnVmZmVyX3NpemUpKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZV90IHNraXBfb2Zmc2V0ID0gKHJlcXVlc3RlZF9vZmZzZXQgLSBmaW5hbF9vZmZzZXQpOworICAgICAgICBzaXplX3Qgd3JpdGVfc3ogPSBzdGQ6Om1pbihzaXplLCBidWZmZXJfc2l6ZSAtIHNraXBfb2Zmc2V0KTsKKworICAgICAgICBhdXRvIGJ1ZmZlciA9CisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oYmxvY2tfc2VydmVyXy0+R2V0UmVzcG9uc2VCdWZmZXIoQkxPQ0tfU1osIHdyaXRlX3N6KSk7CisgICAgICAgIGlmICghYnVmZmVyKSB7CisgICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlJlYWRVbmFsaWduZWRTZWN0b3IgZmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciI7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6Om1lbWNweShidWZmZXIsIChjaGFyKiljaHVuayArIHNraXBfb2Zmc2V0LCB3cml0ZV9zeik7CisgICAgICAgIHJldHVybiB3cml0ZV9zejsKKyAgICB9CisKKyAgICBpbnQgbnVtX3NlY3RvcnNfc2tpcCA9IHNlY3RvciAtIGl0LT5maXJzdDsKKyAgICBzaXplX3Qgc2tpcF9zaXplID0gbnVtX3NlY3RvcnNfc2tpcCA8PCBTRUNUT1JfU0hJRlQ7CisgICAgc2l6ZV90IHdyaXRlX3NpemUgPSBzdGQ6Om1pbihzaXplLCBCTE9DS19TWiAtIHNraXBfc2l6ZSk7CisgICAgYXV0byBidWZmZXIgPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oYmxvY2tfc2VydmVyXy0+R2V0UmVzcG9uc2VCdWZmZXIoQkxPQ0tfU1osIHdyaXRlX3NpemUpKTsKKyAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlByb2Nlc3NDb3dPcCBmYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIjsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmICghUHJvY2Vzc0Nvd09wKGl0LT5zZWNvbmQsIGJ1ZmZlcikpIHsKKyAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJSZWFkVW5hbGlnbmVkU2VjdG9yOiAiIDw8IHNlY3RvciA8PCAiIGZhaWxlZCBvZiBzaXplOiAiIDw8IHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgQWxpZ25lZCBzZWN0b3I6ICIgPDwgaXQtPmZpcnN0OworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKHNraXBfc2l6ZSkgeworICAgICAgICBpZiAoc2tpcF9zaXplID09IEJMT0NLX1NaKSB7CisgICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIkludmFsaWQgdW4tYWxpZ25lZCBJTyByZXF1ZXN0IGF0IHNlY3RvcjogIiA8PCBzZWN0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIEJhc2Utc2VjdG9yOiAiIDw8IGl0LT5maXJzdDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBtZW1tb3ZlKGJ1ZmZlciwgYnVmZmVyICsgc2tpcF9zaXplLCB3cml0ZV9zaXplKTsKKyAgICB9CisgICAgcmV0dXJuIHdyaXRlX3NpemU7Cit9CisKK2Jvb2wgUmVhZFdvcmtlcjo6UmVhZFVuYWxpZ25lZFNlY3RvcihzZWN0b3JfdCBzZWN0b3IsIHNpemVfdCBzaXplKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHNlY3Rvcl90LCBjb25zdCBDb3dPcGVyYXRpb24qPj4mIGNodW5rX3ZlYyA9IHNuYXB1c2VyZF8tPkdldENodW5rVmVjKCk7CisKKyAgICBhdXRvIGl0ID0gc3RkOjpsb3dlcl9ib3VuZChjaHVua192ZWMuYmVnaW4oKSwgY2h1bmtfdmVjLmVuZCgpLCBzdGQ6Om1ha2VfcGFpcihzZWN0b3IsIG51bGxwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNuYXBzaG90SGFuZGxlcjo6Y29tcGFyZSk7CisKKyAgICAvLyB8LS0tLS0tLXwtLS0tLS0tfC0tLS0tLS18CisgICAgLy8gMCAgICAgICAxICAgICAgIDIgICAgICAgMworICAgIC8vCisgICAgLy8gQmxvY2sgMCAtIG9wIDEKKyAgICAvLyBCbG9jayAxIC0gb3AgMgorICAgIC8vIEJsb2NrIDIgLSBvcCAzCisgICAgLy8KKyAgICAvLyBjaHVua192ZWMgd2lsbCBoYXZlIGJsb2NrIDAsIDEsIDIgd2hpY2ggbWFwcyB0byByZWxhdmFudCBDT1cgb3BzLgorICAgIC8vCisgICAgLy8gRWFjaCBibG9jayBpcyA0ayBieXRlcy4gVGh1cywgdGhlIGxhc3QgYmxvY2sgd2lsbCBzcGFuIDggc2VjdG9ycworICAgIC8vIHJhbmdpbmcgdGlsbCBibG9jayAzIChIb3dldmVyLCBibG9jayAzIHdvbid0IGJlIGluIGNodW5rX3ZlYyBhcworICAgIC8vIGl0IGRvZXNuJ3QgaGF2ZSBhbnkgbWFwcGluZyB0byBDT1cgb3BzLiBOb3csIGlmIHdlIGdldCBhbiBJL08gcmVxdWVzdCBmb3IgYSBzZWN0b3IKKyAgICAvLyBzcGFubmluZyBiZXR3ZWVuIGJsb2NrIDIgYW5kIGJsb2NrIDMsIHdlIG5lZWQgdG8gc3RlcCBiYWNrCisgICAgLy8gYW5kIGdldCBob2xkIG9mIHRoZSBsYXN0IGVsZW1lbnQuCisgICAgLy8KKyAgICAvLyBBZGRpdGlvbmFsbHksIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHJlcXVlc3RlZCBzZWN0b3IgaXMKKyAgICAvLyBpbmRlZWQgd2l0aGluIHRoZSByYW5nZSBvZiB0aGUgZmluYWwgc2VjdG9yLiBJdCBpcyBwZXJmZWN0bHkgdmFsaWQKKyAgICAvLyB0byBnZXQgYW4gSS9PIHJlcXVlc3QgZm9yIGJsb2NrIDMgYW5kIGJleW9uZCB3aGljaCBhcmUgbm90IG1hcHBlZAorICAgIC8vIHRvIGFueSBDT1cgb3BzLiBJbiB0aGF0IGNhc2UsIHdlIGp1c3QgbmVlZCB0byByZWFkIGZyb20gdGhlIGJhc2UKKyAgICAvLyBkZXZpY2UuCisgICAgYm9vbCBtZXJnZV9jb21wbGV0ZSA9IGZhbHNlOworICAgIGlmIChpdCA9PSBjaHVua192ZWMuZW5kKCkpIHsKKyAgICAgICAgaWYgKGNodW5rX3ZlYy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAvLyBJL08gcmVxdWVzdCBiZXlvbmQgdGhlIGxhc3QgbWFwcGVkIHNlY3RvcgorICAgICAgICAgICAgaXQgPSBzdGQ6OnByZXYoY2h1bmtfdmVjLmVuZCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGEgcGFydGl0aW9uIG1lcmdlIGlzIGNvbXBsZXRlIGJ1dCBzbmFwc2hvdAorICAgICAgICAgICAgLy8gc3RhdGUgaW4gL21ldGFkYXRhIGlzIG5vdCB5ZXQgZGVsZXRlZDsgZHVyaW5nIHRoaXMgd2luZG93IGlmIHRoZQorICAgICAgICAgICAgLy8gZGV2aWNlIGlzIHJlYm9vdGVkLCBzdWJzZXF1ZW50IGF0dGVtcHQgd2lsbCBtb3VudCB0aGUgc25hcHNob3QuCisgICAgICAgICAgICAvLyBIb3dldmVyLCBzaW5jZSB0aGUgbWVyZ2Ugd2FzIGNvbXBsZXRlZCB3ZSB3b3VsZG4ndCBoYXZlIGFueQorICAgICAgICAgICAgLy8gbWFwcGluZyB0byBDT1cgb3BzIHRodXMgY2h1bmtfdmVjIHdpbGwgYmUgZW1wdHkuIEluIHRoYXQgY2FzZSwKKyAgICAgICAgICAgIC8vIG1hcmsgdGhpcyBhcyBtZXJnZV9jb21wbGV0ZSBhbmQgcm91dGUgdGhlIEkvTyB0byB0aGUgYmFzZSBkZXZpY2UuCisgICAgICAgICAgICBtZXJnZV9jb21wbGV0ZSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGl0LT5maXJzdCAhPSBzZWN0b3IpIHsKKyAgICAgICAgaWYgKGl0ICE9IGNodW5rX3ZlYy5iZWdpbigpKSB7CisgICAgICAgICAgICAtLWl0OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFJlYWRBbGlnbmVkU2VjdG9yKHNlY3Rvciwgc2l6ZSk7CisgICAgfQorCisgICAgbG9mZl90IHJlcXVlc3RlZF9vZmZzZXQgPSBzZWN0b3IgPDwgU0VDVE9SX1NISUZUOworCisgICAgbG9mZl90IGZpbmFsX29mZnNldCA9IDA7CisgICAgaWYgKCFtZXJnZV9jb21wbGV0ZSkgeworICAgICAgICBmaW5hbF9vZmZzZXQgPSBpdC0+Zmlyc3QgPDwgU0VDVE9SX1NISUZUOworICAgIH0KKworICAgIC8vIFNpbmNlIGEgQ09XIG9wIHNwYW4gNGsgYmxvY2sgc2l6ZSwgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgcmVxdWVzdGVkCisgICAgLy8gb2Zmc2V0IGlzIHdpdGhpbiB0aGUgNGsgcmVnaW9uLiBDb25zaWRlciB0aGUgZm9sbG93aW5nIGNhc2U6CisgICAgLy8KKyAgICAvLyB8LS0tLS0tLXwtLS0tLS0tfC0tLS0tLS18CisgICAgLy8gMCAgICAgICAxICAgICAgIDIgICAgICAgMworICAgIC8vCisgICAgLy8gQmxvY2sgMCAtIG9wIDEKKyAgICAvLyBCbG9jayAxIC0gb3AgMgorICAgIC8vCisgICAgLy8gV2UgaGF2ZSBhbiBJL08gcmVxdWVzdCBmb3IgYSBzZWN0b3IgYmV0d2VlbiBibG9jayAyIGFuZCBibG9jayAzLiBIb3dldmVyLAorICAgIC8vIHdlIGhhdmUgbWFwcGluZyB0byBDT1cgb3BzIG9ubHkgZm9yIGJsb2NrIDAgYW5kIGJsb2NrIDEuIFRodXMsIHRoZQorICAgIC8vIHJlcXVlc3RlZCBvZmZzZXQgaW4gdGhpcyBjYXNlIGlzIGJleW9uZCB0aGUgbGFzdCBtYXBwZWQgQ09XIG9wIHNpemUgKHdoaWNoCisgICAgLy8gaXMgYmxvY2sgMSBpbiB0aGlzIGNhc2UpLgorCisgICAgc2l6ZV90IHJlbWFpbmluZ19zaXplID0gc2l6ZTsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGNvbnN0IENvd09wZXJhdGlvbiogY293X29wID0gaXQtPnNlY29uZDsKKyAgICBpZiAoIW1lcmdlX2NvbXBsZXRlICYmIChyZXF1ZXN0ZWRfb2Zmc2V0ID49IGZpbmFsX29mZnNldCkgJiYKKyAgICAgICAgKCgocmVxdWVzdGVkX29mZnNldCAtIGZpbmFsX29mZnNldCkgPCBCTE9DS19TWikgfHwKKyAgICAgICAgIElzTWFwcGluZ1ByZXNlbnQoY293X29wLCByZXF1ZXN0ZWRfb2Zmc2V0LCBmaW5hbF9vZmZzZXQpKSkgeworICAgICAgICAvLyBSZWFkIHRoZSBwYXJ0aWFsIHVuLWFsaWduZWQgZGF0YQorICAgICAgICByZXQgPSBSZWFkVW5hbGlnbmVkU2VjdG9yKHNlY3RvciwgcmVtYWluaW5nX3NpemUsIGl0KTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUmVhZFVuYWxpZ25lZFNlY3RvciBmYWlsZWQgZm9yIHNlY3RvcjogIiA8PCBzZWN0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHNpemU6ICIgPDwgc2l6ZSA8PCAiIGl0LT5zZWN0b3I6ICIgPDwgaXQtPmZpcnN0OworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmVtYWluaW5nX3NpemUgLT0gcmV0OworICAgICAgICBzZWN0b3IgKz0gKHJldCA+PiBTRUNUT1JfU0hJRlQpOworCisgICAgICAgIC8vIFNlbmQgdGhlIGRhdGEgYmFjaworICAgICAgICBpZiAoIVNlbmRCdWZmZXJlZElvKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHdlIHN0aWxsIGhhdmUgcGVuZGluZyBkYXRhIHRvIGJlIHByb2Nlc3NlZCwgdGhpcyB3aWxsIGJlIGFsaWduZWQgSS9PCisgICAgICAgIGlmIChyZW1haW5pbmdfc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIFJlYWRBbGlnbmVkU2VjdG9yKHNlY3RvciwgcmVtYWluaW5nX3NpemUpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhpcyBpcyBhbGwgYWJvdXQgaGFuZGxpbmcgSS9PIHJlcXVlc3QgdG8gYmUgcm91dGVkIHRvIGJhc2UgZGV2aWNlCisgICAgICAgIC8vIGFzIHRoZSBJL08gaXMgbm90IG1hcHBlZCB0byBhbnkgb2YgdGhlIENPVyBvcHMuCisgICAgICAgIGxvZmZfdCBhbGlnbmVkX29mZnNldCA9IHJlcXVlc3RlZF9vZmZzZXQ7CisgICAgICAgIC8vIEFsaWduIHRvIG5lYXJlc3QgNGsKKyAgICAgICAgYWxpZ25lZF9vZmZzZXQgKz0gQkxPQ0tfU1ogLSAxOworICAgICAgICBhbGlnbmVkX29mZnNldCAmPSB+KEJMT0NLX1NaIC0gMSk7CisgICAgICAgIC8vIEZpbmQgdGhlIGRpZmYgb2YgdGhlIGFsaWduZWQgb2Zmc2V0CisgICAgICAgIHNpemVfdCBkaWZmX3NpemUgPSBhbGlnbmVkX29mZnNldCAtIHJlcXVlc3RlZF9vZmZzZXQ7CisgICAgICAgIENIRUNLKGRpZmZfc2l6ZSA8PSBCTE9DS19TWik7CisKKyAgICAgICAgc2l6ZV90IHJlYWRfc2l6ZSA9IHN0ZDo6bWluKHJlbWFpbmluZ19zaXplLCBkaWZmX3NpemUpOworICAgICAgICB2b2lkKiBidWZmZXIgPSBibG9ja19zZXJ2ZXJfLT5HZXRSZXNwb25zZUJ1ZmZlcihCTE9DS19TWiwgcmVhZF9zaXplKTsKKyAgICAgICAgaWYgKCFidWZmZXIpIHsKKyAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiQWNxdWlyZUJ1ZmZlciBmYWlsZWQgaW4gUmVhZFVuYWxpZ25lZFNlY3RvciI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFSZWFkRGF0YUZyb21CYXNlRGV2aWNlKHNlY3RvciwgYnVmZmVyLCByZWFkX3NpemUpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFTZW5kQnVmZmVyZWRJbygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVtYWluaW5nX3NpemUgPj0gZGlmZl9zaXplKSB7CisgICAgICAgICAgICByZW1haW5pbmdfc2l6ZSAtPSBkaWZmX3NpemU7CisgICAgICAgICAgICBzaXplX3QgbnVtX3NlY3RvcnNfcmVhZCA9IChkaWZmX3NpemUgPj4gU0VDVE9SX1NISUZUKTsKKyAgICAgICAgICAgIHNlY3RvciArPSBudW1fc2VjdG9yc19yZWFkOworICAgICAgICAgICAgQ0hFQ0soSXNCbG9ja0FsaWduZWQoc2VjdG9yIDw8IFNFQ1RPUl9TSElGVCkpOworCisgICAgICAgICAgICAvLyBJZiB3ZSBzdGlsbCBoYXZlIHBlbmRpbmcgZGF0YSB0byBiZSBwcm9jZXNzZWQsIHRoaXMgd2lsbCBiZSBhbGlnbmVkIEkvTworICAgICAgICAgICAgcmV0dXJuIFJlYWRBbGlnbmVkU2VjdG9yKHNlY3RvciwgcmVtYWluaW5nX3NpemUpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUmVhZFdvcmtlcjo6UmVxdWVzdFNlY3RvcnModWludDY0X3Qgc2VjdG9yLCB1aW50NjRfdCBsZW4pIHsKKyAgICAvLyBVbmFsaWduZWQgSS9PIHJlcXVlc3QKKyAgICBpZiAoIUlzQmxvY2tBbGlnbmVkKHNlY3RvciA8PCBTRUNUT1JfU0hJRlQpKSB7CisgICAgICAgIHJldHVybiBSZWFkVW5hbGlnbmVkU2VjdG9yKHNlY3RvciwgbGVuKTsKKyAgICB9CisKKyAgICByZXR1cm4gUmVhZEFsaWduZWRTZWN0b3Ioc2VjdG9yLCBsZW4pOworfQorCitib29sIFJlYWRXb3JrZXI6OlNlbmRCdWZmZXJlZElvKCkgeworICAgIHJldHVybiBibG9ja19zZXJ2ZXJfLT5TZW5kQnVmZmVyZWRJbygpOworfQorCit9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2UvcmVhZF93b3JrZXIuaCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9yZWFkX3dvcmtlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3OGQ4MDkKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2UvcmVhZF93b3JrZXIuaApAQCAtMCwwICsxLDc4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHNuYXB1c2VyZC9ibG9ja19zZXJ2ZXIuaD4KKyNpbmNsdWRlICJ3b3JrZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHNuYXBzaG90IHsKKworY2xhc3MgUmVhZFdvcmtlciA6IHB1YmxpYyBXb3JrZXIsIHB1YmxpYyBJQmxvY2tTZXJ2ZXI6OkRlbGVnYXRlIHsKKyAgcHVibGljOgorICAgIFJlYWRXb3JrZXIoY29uc3Qgc3RkOjpzdHJpbmcmIGNvd19kZXZpY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBiYWNraW5nX2RldmljZSwKKyAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBiYXNlX3BhdGhfbWVyZ2UsCisgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U25hcHNob3RIYW5kbGVyPiBzbmFwdXNlcmQsCisgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SUJsb2NrU2VydmVyT3BlbmVyPiBvcGVuZXIsIGJvb2wgZGlyZWN0X3JlYWQgPSBmYWxzZSk7CisKKyAgICBib29sIFJ1bigpOworICAgIGJvb2wgSW5pdCgpIG92ZXJyaWRlOworICAgIHZvaWQgQ2xvc2VGZHMoKSBvdmVycmlkZTsKKyAgICBib29sIFJlcXVlc3RTZWN0b3JzKHVpbnQ2NF90IHNlY3RvciwgdWludDY0X3Qgc2l6ZSkgb3ZlcnJpZGU7CisKKyAgICBJQmxvY2tTZXJ2ZXIqIGJsb2NrX3NlcnZlcigpIGNvbnN0IHsgcmV0dXJuIGJsb2NrX3NlcnZlcl8uZ2V0KCk7IH0KKworICBwcml2YXRlOgorICAgIGJvb2wgU2VuZEJ1ZmZlcmVkSW8oKTsKKworICAgIGJvb2wgUHJvY2Vzc0Nvd09wKGNvbnN0IENvd09wZXJhdGlvbiogY293X29wLCB2b2lkKiBidWZmZXIpOworICAgIGJvb2wgUHJvY2Vzc1hvck9wKGNvbnN0IENvd09wZXJhdGlvbiogY293X29wLCB2b2lkKiBidWZmZXIpOworICAgIGJvb2wgUHJvY2Vzc09yZGVyZWRPcChjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCwgdm9pZCogYnVmZmVyKTsKKyAgICBib29sIFByb2Nlc3NDb3B5T3AoY29uc3QgQ293T3BlcmF0aW9uKiBjb3dfb3AsIHZvaWQqIGJ1ZmZlcik7CisgICAgYm9vbCBQcm9jZXNzUmVwbGFjZU9wKGNvbnN0IENvd09wZXJhdGlvbiogY293X29wLCB2b2lkKiBidWZmZXIsIHNpemVfdCBidWZmZXJfc2l6ZSk7CisgICAgYm9vbCBQcm9jZXNzWmVyb09wKHZvaWQqIGJ1ZmZlcik7CisKKyAgICBib29sIElzTWFwcGluZ1ByZXNlbnQoY29uc3QgQ293T3BlcmF0aW9uKiBjb3dfb3AsIGxvZmZfdCByZXF1ZXN0ZWRfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBsb2ZmX3QgY293X29wX29mZnNldCk7CisgICAgYm9vbCBHZXRDb3dPcEJsb2NrT2Zmc2V0KGNvbnN0IENvd09wZXJhdGlvbiogY293X29wLCB1aW50NjRfdCBpb19ibG9jaywgb2ZmX3QqIGJsb2NrX29mZnNldCk7CisgICAgYm9vbCBSZWFkQWxpZ25lZFNlY3RvcihzZWN0b3JfdCBzZWN0b3IsIHNpemVfdCBzeik7CisgICAgYm9vbCBSZWFkVW5hbGlnbmVkU2VjdG9yKHNlY3Rvcl90IHNlY3Rvciwgc2l6ZV90IHNpemUpOworICAgIGludCBSZWFkVW5hbGlnbmVkU2VjdG9yKHNlY3Rvcl90IHNlY3Rvciwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHNlY3Rvcl90LCBjb25zdCBDb3dPcGVyYXRpb24qPj46Oml0ZXJhdG9yJiBpdCk7CisgICAgYm9vbCBSZWFkRnJvbVNvdXJjZURldmljZShjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCwgdm9pZCogYnVmZmVyKTsKKyAgICBib29sIFJlYWREYXRhRnJvbUJhc2VEZXZpY2Uoc2VjdG9yX3Qgc2VjdG9yLCB2b2lkKiBidWZmZXIsIHNpemVfdCByZWFkX3NpemUpOworCisgICAgY29uc3RleHByIGJvb2wgSXNCbG9ja0FsaWduZWQodWludDY0X3Qgc2l6ZSkgeyByZXR1cm4gKChzaXplICYgKEJMT0NLX1NaIC0gMSkpID09IDApOyB9CisgICAgY29uc3RleHByIHNlY3Rvcl90IENodW5rVG9TZWN0b3IoY2h1bmtfdCBjaHVuaykgeyByZXR1cm4gY2h1bmsgPDwgQ0hVTktfU0hJRlQ7IH0KKyAgICBjb25zdGV4cHIgY2h1bmtfdCBTZWN0b3JUb0NodW5rKHNlY3Rvcl90IHNlY3RvcikgeyByZXR1cm4gc2VjdG9yID4+IENIVU5LX1NISUZUOyB9CisKKyAgICBzdGQ6OnN0cmluZyBiYWNraW5nX3N0b3JlX2RldmljZV87CisgICAgdW5pcXVlX2ZkIGJhY2tpbmdfc3RvcmVfZmRfOworICAgIHVuaXF1ZV9mZCBiYWNraW5nX3N0b3JlX2RpcmVjdF9mZF87CisgICAgYm9vbCBkaXJlY3RfcmVhZF8gPSBmYWxzZTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJQmxvY2tTZXJ2ZXJPcGVuZXI+IGJsb2NrX3NlcnZlcl9vcGVuZXJfOworICAgIHN0ZDo6dW5pcXVlX3B0cjxJQmxvY2tTZXJ2ZXI+IGJsb2NrX3NlcnZlcl87CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB4b3JfYnVmZmVyXzsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dm9pZCwgZGVjbHR5cGUoJjo6ZnJlZSk+IGFsaWduZWRfYnVmZmVyXzsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBkZWNvbXByZXNzZWRfYnVmZmVyXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfY29yZS5jcHAgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX2NvcmUuY3BwCmluZGV4IDJjMjAxZmYuLjdjOWE2NGUgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfY29yZS5jcHAKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL3NuYXB1c2VyZF9jb3JlLmNwcApAQCAtMTYsMTIgKzE2LDE1IEBACiAKICNpbmNsdWRlICJzbmFwdXNlcmRfY29yZS5oIgogCi0jaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KLQogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9jaHJvbm9fdXRpbHMuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zY29wZWd1YXJkLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KKyNpbmNsdWRlIDxzbmFwdXNlcmQvZG1fdXNlcl9ibG9ja19zZXJ2ZXIuaD4KKworI2luY2x1ZGUgIm1lcmdlX3dvcmtlci5oIgorI2luY2x1ZGUgInJlYWRfd29ya2VyLmgiCisjaW5jbHVkZSAidXRpbGl0eS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2Ugc25hcHNob3QgewpAQCAtMzIsMjMgKzM1LDI2IEBACiAKIFNuYXBzaG90SGFuZGxlcjo6U25hcHNob3RIYW5kbGVyKHN0ZDo6c3RyaW5nIG1pc2NfbmFtZSwgc3RkOjpzdHJpbmcgY293X2RldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGJhY2tpbmdfZGV2aWNlLCBzdGQ6OnN0cmluZyBiYXNlX3BhdGhfbWVyZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3dvcmtlcl90aHJlYWRzLCBib29sIHVzZV9pb3VyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwZXJmb3JtX3ZlcmlmaWNhdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElCbG9ja1NlcnZlck9wZW5lcj4gb3BlbmVyLCBpbnQgbnVtX3dvcmtlcl90aHJlYWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfaW91cmluZywgYm9vbCBwZXJmb3JtX3ZlcmlmaWNhdGlvbiwgYm9vbCBvX2RpcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvd19vcF9tZXJnZV9zaXplKSB7CiAgICAgbWlzY19uYW1lXyA9IHN0ZDo6bW92ZShtaXNjX25hbWUpOwogICAgIGNvd19kZXZpY2VfID0gc3RkOjptb3ZlKGNvd19kZXZpY2UpOwogICAgIGJhY2tpbmdfc3RvcmVfZGV2aWNlXyA9IHN0ZDo6bW92ZShiYWNraW5nX2RldmljZSk7Ci0gICAgY29udHJvbF9kZXZpY2VfID0gIi9kZXYvZG0tdXNlci8iICsgbWlzY19uYW1lXzsKKyAgICBibG9ja19zZXJ2ZXJfb3BlbmVyXyA9IHN0ZDo6bW92ZShvcGVuZXIpOwogICAgIGJhc2VfcGF0aF9tZXJnZV8gPSBzdGQ6Om1vdmUoYmFzZV9wYXRoX21lcmdlKTsKICAgICBudW1fd29ya2VyX3RocmVhZHNfID0gbnVtX3dvcmtlcl90aHJlYWRzOwogICAgIGlzX2lvX3VyaW5nX2VuYWJsZWRfID0gdXNlX2lvdXJpbmc7CiAgICAgcGVyZm9ybV92ZXJpZmljYXRpb25fID0gcGVyZm9ybV92ZXJpZmljYXRpb247CisgICAgb19kaXJlY3RfID0gb19kaXJlY3Q7CisgICAgY293X29wX21lcmdlX3NpemVfID0gY293X29wX21lcmdlX3NpemU7CiB9CiAKIGJvb2wgU25hcHNob3RIYW5kbGVyOjpJbml0aWFsaXplV29ya2VycygpIHsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV93b3JrZXJfdGhyZWFkc187IGkrKykgewotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8V29ya2VyPiB3dCA9Ci0gICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxXb3JrZXI+KGNvd19kZXZpY2VfLCBiYWNraW5nX3N0b3JlX2RldmljZV8sIGNvbnRyb2xfZGV2aWNlXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzY19uYW1lXywgYmFzZV9wYXRoX21lcmdlXywgR2V0U2hhcmVkUHRyKCkpOworICAgICAgICBhdXRvIHd0ID0gc3RkOjptYWtlX3VuaXF1ZTxSZWFkV29ya2VyPihjb3dfZGV2aWNlXywgYmFja2luZ19zdG9yZV9kZXZpY2VfLCBtaXNjX25hbWVfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX3BhdGhfbWVyZ2VfLCBHZXRTaGFyZWRQdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfc2VydmVyX29wZW5lcl8sIG9fZGlyZWN0Xyk7CiAgICAgICAgIGlmICghd3QtPkluaXQoKSkgewogICAgICAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJUaHJlYWQgaW5pdGlhbGl6YXRpb24gZmFpbGVkIjsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTU2LDEyICs2MiwxMSBAQAogCiAgICAgICAgIHdvcmtlcl90aHJlYWRzXy5wdXNoX2JhY2soc3RkOjptb3ZlKHd0KSk7CiAgICAgfQotCi0gICAgbWVyZ2VfdGhyZWFkXyA9IHN0ZDo6bWFrZV91bmlxdWU8V29ya2VyPihjb3dfZGV2aWNlXywgYmFja2luZ19zdG9yZV9kZXZpY2VfLCBjb250cm9sX2RldmljZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNjX25hbWVfLCBiYXNlX3BhdGhfbWVyZ2VfLCBHZXRTaGFyZWRQdHIoKSk7CisgICAgbWVyZ2VfdGhyZWFkXyA9IHN0ZDo6bWFrZV91bmlxdWU8TWVyZ2VXb3JrZXI+KGNvd19kZXZpY2VfLCBtaXNjX25hbWVfLCBiYXNlX3BhdGhfbWVyZ2VfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRTaGFyZWRQdHIoKSwgY293X29wX21lcmdlX3NpemVfKTsKIAogICAgIHJlYWRfYWhlYWRfdGhyZWFkXyA9IHN0ZDo6bWFrZV91bmlxdWU8UmVhZEFoZWFkPihjb3dfZGV2aWNlXywgYmFja2luZ19zdG9yZV9kZXZpY2VfLCBtaXNjX25hbWVfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRTaGFyZWRQdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFNoYXJlZFB0cigpLCBjb3dfb3BfbWVyZ2Vfc2l6ZV8pOwogCiAgICAgdXBkYXRlX3ZlcmlmeV8gPSBzdGQ6Om1ha2VfdW5pcXVlPFVwZGF0ZVZlcmlmeT4obWlzY19uYW1lXyk7CiAKQEAgLTc5LDYgKzg0LDEwIEBACiAgICAgU05BUF9MT0coREVCVUcpIDw8ICJNZXJnZS1jb21wbGV0ZSAlOiAiIDw8IG1lcmdlX2NvbXBsZXRpb25fcGVyY2VudGFnZV8KICAgICAgICAgICAgICAgICAgICAgPDwgIiBudW1fbWVyZ2Vfb3BzOiAiIDw8IGNoLT5udW1fbWVyZ2Vfb3BzCiAgICAgICAgICAgICAgICAgICAgIDw8ICIgdG90YWwtb3BzOiAiIDw8IHJlYWRlcl8tPmdldF9udW1fdG90YWxfZGF0YV9vcHMoKTsKKworICAgIGlmIChjaC0+bnVtX21lcmdlX29wcyA9PSByZWFkZXJfLT5nZXRfbnVtX3RvdGFsX2RhdGFfb3BzKCkpIHsKKyAgICAgICAgTWFya01lcmdlQ29tcGxldGUoKTsKKyAgICB9CiB9CiAKIGJvb2wgU25hcHNob3RIYW5kbGVyOjpDb21taXRNZXJnZShpbnQgbnVtX21lcmdlX29wcykgewpAQCAtOTgsMTUgKzEwNywxNCBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmVhZGVyXy0+VXBkYXRlTWVyZ2VPcHNDb21wbGV0ZWQobnVtX21lcmdlX29wcyk7Ci0gICAgICAgIENvd0hlYWRlciBoZWFkZXI7Ci0gICAgICAgIHJlYWRlcl8tPkdldEhlYWRlcigmaGVhZGVyKTsKKyAgICAgICAgY29uc3QgYXV0byYgaGVhZGVyID0gcmVhZGVyXy0+R2V0SGVhZGVyKCk7CiAKICAgICAgICAgaWYgKGxzZWVrKGNvd19mZF8uZ2V0KCksIDAsIFNFRUtfU0VUKSA8IDApIHsKICAgICAgICAgICAgIFNOQVBfUExPRyhFUlJPUikgPDwgImxzZWVrIGZhaWxlZCI7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OldyaXRlRnVsbHkoY293X2ZkXywgJmhlYWRlciwgc2l6ZW9mKENvd0hlYWRlcikpKSB7CisgICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6V3JpdGVGdWxseShjb3dfZmRfLCAmaGVhZGVyLCBoZWFkZXIucHJlZml4LmhlYWRlcl9zaXplKSkgewogICAgICAgICAgICAgU05BUF9QTE9HKEVSUk9SKSA8PCAiV3JpdGUgdG8gaGVhZGVyIGZhaWxlZCI7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KQEAgLTE1NCw3ICsxNjIsNiBAQAogCiBib29sIFNuYXBzaG90SGFuZGxlcjo6UmVhZE1ldGFkYXRhKCkgewogICAgIHJlYWRlcl8gPSBzdGQ6Om1ha2VfdW5pcXVlPENvd1JlYWRlcj4oQ293UmVhZGVyOjpSZWFkZXJGbGFnczo6VVNFUlNQQUNFX01FUkdFLCB0cnVlKTsKLSAgICBDb3dIZWFkZXIgaGVhZGVyOwogICAgIENvd09wdGlvbnMgb3B0aW9uczsKIAogICAgIFNOQVBfTE9HKERFQlVHKSA8PCAiUmVhZE1ldGFkYXRhOiBQYXJzaW5nIGNvdyBmaWxlIjsKQEAgLTE2NCwxNyArMTcxLDE3IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoIXJlYWRlcl8tPkdldEhlYWRlcigmaGVhZGVyKSkgewotICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBnZXQgaGVhZGVyIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQorICAgIGNvbnN0IGF1dG8mIGhlYWRlciA9IHJlYWRlcl8tPkdldEhlYWRlcigpOwogICAgIGlmICghKGhlYWRlci5ibG9ja19zaXplID09IEJMT0NLX1NaKSkgewogICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIkludmFsaWQgaGVhZGVyIGJsb2NrIHNpemUgZm91bmQ6ICIgPDwgaGVhZGVyLmJsb2NrX3NpemU7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBTTkFQX0xPRyhJTkZPKSA8PCAiTWVyZ2Utb3BzOiAiIDw8IGhlYWRlci5udW1fbWVyZ2Vfb3BzOworICAgIGlmIChoZWFkZXIubnVtX21lcmdlX29wcykgeworICAgICAgICByZXN1bWVfbWVyZ2VfID0gdHJ1ZTsKKyAgICAgICAgU05BUF9MT0coSU5GTykgPDwgIlJlc3VtZSBTbmFwc2hvdC1tZXJnZSI7CisgICAgfQogCiAgICAgaWYgKCFNbWFwTWV0YWRhdGEoKSkgewogICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIm1tYXAgZmFpbGVkIjsKQEAgLTE5MSwxNiArMTk4LDE2IEBACiAKICAgICBzaXplX3QgY29weV9vcHMgPSAwLCByZXBsYWNlX29wcyA9IDAsIHplcm9fb3BzID0gMCwgeG9yX29wcyA9IDA7CiAKLSAgICB3aGlsZSAoIWNvd29wX2l0ZXItPkRvbmUoKSkgewotICAgICAgICBjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCA9ICZjb3dvcF9pdGVyLT5HZXQoKTsKKyAgICB3aGlsZSAoIWNvd29wX2l0ZXItPkF0RW5kKCkpIHsKKyAgICAgICAgY29uc3QgQ293T3BlcmF0aW9uKiBjb3dfb3AgPSBjb3dvcF9pdGVyLT5HZXQoKTsKIAotICAgICAgICBpZiAoY293X29wLT50eXBlID09IGtDb3dDb3B5T3ApIHsKKyAgICAgICAgaWYgKGNvd19vcC0+dHlwZSgpID09IGtDb3dDb3B5T3ApIHsKICAgICAgICAgICAgIGNvcHlfb3BzICs9IDE7Ci0gICAgICAgIH0gZWxzZSBpZiAoY293X29wLT50eXBlID09IGtDb3dSZXBsYWNlT3ApIHsKKyAgICAgICAgfSBlbHNlIGlmIChjb3dfb3AtPnR5cGUoKSA9PSBrQ293UmVwbGFjZU9wKSB7CiAgICAgICAgICAgICByZXBsYWNlX29wcyArPSAxOwotICAgICAgICB9IGVsc2UgaWYgKGNvd19vcC0+dHlwZSA9PSBrQ293WmVyb09wKSB7CisgICAgICAgIH0gZWxzZSBpZiAoY293X29wLT50eXBlKCkgPT0ga0Nvd1plcm9PcCkgewogICAgICAgICAgICAgemVyb19vcHMgKz0gMTsKLSAgICAgICAgfSBlbHNlIGlmIChjb3dfb3AtPnR5cGUgPT0ga0Nvd1hvck9wKSB7CisgICAgICAgIH0gZWxzZSBpZiAoY293X29wLT50eXBlKCkgPT0ga0Nvd1hvck9wKSB7CiAgICAgICAgICAgICB4b3Jfb3BzICs9IDE7CiAgICAgICAgIH0KIApAQCAtMjQ0LDEyICsyNTEsMTEgQEAKIH0KIAogYm9vbCBTbmFwc2hvdEhhbmRsZXI6Ok1tYXBNZXRhZGF0YSgpIHsKLSAgICBDb3dIZWFkZXIgaGVhZGVyOwotICAgIHJlYWRlcl8tPkdldEhlYWRlcigmaGVhZGVyKTsKKyAgICBjb25zdCBhdXRvJiBoZWFkZXIgPSByZWFkZXJfLT5HZXRIZWFkZXIoKTsKIAotICAgIHRvdGFsX21hcHBlZF9hZGRyX2xlbmd0aF8gPSBoZWFkZXIuaGVhZGVyX3NpemUgKyBCVUZGRVJfUkVHSU9OX0RFRkFVTFRfU0laRTsKKyAgICB0b3RhbF9tYXBwZWRfYWRkcl9sZW5ndGhfID0gaGVhZGVyLnByZWZpeC5oZWFkZXJfc2l6ZSArIEJVRkZFUl9SRUdJT05fREVGQVVMVF9TSVpFOwogCi0gICAgaWYgKGhlYWRlci5tYWpvcl92ZXJzaW9uID49IDIgJiYgaGVhZGVyLmJ1ZmZlcl9zaXplID4gMCkgeworICAgIGlmIChoZWFkZXIucHJlZml4Lm1ham9yX3ZlcnNpb24gPj0gMiAmJiBoZWFkZXIuYnVmZmVyX3NpemUgPiAwKSB7CiAgICAgICAgIHNjcmF0Y2hfc3BhY2VfID0gdHJ1ZTsKICAgICB9CiAKQEAgLTI4NSwyMCArMjkxLDYgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHVuaXF1ZV9mZCBmZChURU1QX0ZBSUxVUkVfUkVUUlkob3BlbihiYXNlX3BhdGhfbWVyZ2VfLmNfc3RyKCksIE9fUkRPTkxZIHwgT19DTE9FWEVDKSkpOwotICAgIGlmIChmZCA8IDApIHsKLSAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJDYW5ub3Qgb3BlbiBibG9jayBkZXZpY2UiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdWludDY0X3QgZGV2X3N6ID0gZ2V0X2Jsb2NrX2RldmljZV9zaXplKGZkLmdldCgpKTsKLSAgICBpZiAoIWRldl9zeikgewotICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBmaW5kIGJsb2NrIGRldmljZSBzaXplOiAiIDw8IGJhc2VfcGF0aF9tZXJnZV87Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBudW1fc2VjdG9yc18gPSBkZXZfc3ogPj4gU0VDVE9SX1NISUZUOwotCiAgICAgcmV0dXJuIFJlYWRNZXRhZGF0YSgpOwogfQogCkBAIC0zMTIsMjEgKzMwNCwyNiBAQAogICAgIGlmIChyYV90aHJlYWRfKSB7CiAgICAgICAgIHJhX3RocmVhZF9zdGF0dXMgPQogICAgICAgICAgICAgICAgIHN0ZDo6YXN5bmMoc3RkOjpsYXVuY2g6OmFzeW5jLCAmUmVhZEFoZWFkOjpSdW5UaHJlYWQsIHJlYWRfYWhlYWRfdGhyZWFkXy5nZXQoKSk7Ci0KLSAgICAgICAgU05BUF9MT0coSU5GTykgPDwgIlJlYWQtYWhlYWQgdGhyZWFkIHN0YXJ0ZWQuLi4iOworICAgICAgICAvLyBJZiB0aGlzIGlzIGEgbWVyZ2UtcmVzdW1lIHBhdGgsIHdhaXQgdW50aWwgUkEgdGhyZWFkIGlzIGZ1bGx5IHVwIGFzCisgICAgICAgIC8vIHRoZSBkYXRhIGhhcyB0byBiZSByZS1jb25zdHJ1Y3RlZCBmcm9tIHRoZSBzY3JhdGNoIHNwYWNlLgorICAgICAgICBpZiAocmVzdW1lX21lcmdlXyAmJiBTaG91bGRSZWNvbnN0cnVjdERhdGFGcm9tQ293KCkpIHsKKyAgICAgICAgICAgIFdhaXRGb3JSYVRocmVhZFRvU3RhcnQoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8vIExhdW5jaCB3b3JrZXIgdGhyZWFkcwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd29ya2VyX3RocmVhZHNfLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIHRocmVhZHMuZW1wbGFjZV9iYWNrKAotICAgICAgICAgICAgICAgIHN0ZDo6YXN5bmMoc3RkOjpsYXVuY2g6OmFzeW5jLCAmV29ya2VyOjpSdW5UaHJlYWQsIHdvcmtlcl90aHJlYWRzX1tpXS5nZXQoKSkpOworICAgICAgICAgICAgICAgIHN0ZDo6YXN5bmMoc3RkOjpsYXVuY2g6OmFzeW5jLCAmUmVhZFdvcmtlcjo6UnVuLCB3b3JrZXJfdGhyZWFkc19baV0uZ2V0KCkpKTsKICAgICB9CiAKICAgICBzdGQ6OmZ1dHVyZTxib29sPiBtZXJnZV90aHJlYWQgPQotICAgICAgICAgICAgc3RkOjphc3luYyhzdGQ6OmxhdW5jaDo6YXN5bmMsICZXb3JrZXI6OlJ1bk1lcmdlVGhyZWFkLCBtZXJnZV90aHJlYWRfLmdldCgpKTsKKyAgICAgICAgICAgIHN0ZDo6YXN5bmMoc3RkOjpsYXVuY2g6OmFzeW5jLCAmTWVyZ2VXb3JrZXI6OlJ1biwgbWVyZ2VfdGhyZWFkXy5nZXQoKSk7CiAKICAgICAvLyBOb3cgdGhhdCB0aGUgd29ya2VyIHRocmVhZHMgYXJlIHVwLCBzY2FuIHRoZSBwYXJ0aXRpb25zLgotICAgIGlmIChwZXJmb3JtX3ZlcmlmaWNhdGlvbl8pIHsKKyAgICAvLyBJZiB0aGUgc25hcHNob3QtbWVyZ2UgaXMgYmVpbmcgcmVzdW1lZCwgdGhlcmUgaXMgbm8gbmVlZCB0byBzY2FuIGFzIHRoZQorICAgIC8vIGN1cnJlbnQgc2xvdCBpcyBhbHJlYWR5IG1hcmtlZCBhcyBib290IGNvbXBsZXRlLgorICAgIGlmIChwZXJmb3JtX3ZlcmlmaWNhdGlvbl8gJiYgIXJlc3VtZV9tZXJnZV8pIHsKICAgICAgICAgdXBkYXRlX3ZlcmlmeV8tPlZlcmlmeVVwZGF0ZVBhcnRpdGlvbigpOwogICAgIH0KIApAQCAtMzY3LDEwICszNjQsOSBAQAogfQogCiB1aW50NjRfdCBTbmFwc2hvdEhhbmRsZXI6OkdldEJ1ZmZlck1ldGFkYXRhT2Zmc2V0KCkgewotICAgIENvd0hlYWRlciBoZWFkZXI7Ci0gICAgcmVhZGVyXy0+R2V0SGVhZGVyKCZoZWFkZXIpOworICAgIGNvbnN0IGF1dG8mIGhlYWRlciA9IHJlYWRlcl8tPkdldEhlYWRlcigpOwogCi0gICAgcmV0dXJuIChoZWFkZXIuaGVhZGVyX3NpemUgKyBzaXplb2YoQnVmZmVyU3RhdGUpKTsKKyAgICByZXR1cm4gKGhlYWRlci5wcmVmaXguaGVhZGVyX3NpemUgKyBzaXplb2YoQnVmZmVyU3RhdGUpKTsKIH0KIAogLyoKQEAgLTM4Myw4ICszNzksNyBAQAogICoKICAqLwogc2l6ZV90IFNuYXBzaG90SGFuZGxlcjo6R2V0QnVmZmVyTWV0YWRhdGFTaXplKCkgewotICAgIENvd0hlYWRlciBoZWFkZXI7Ci0gICAgcmVhZGVyXy0+R2V0SGVhZGVyKCZoZWFkZXIpOworICAgIGNvbnN0IGF1dG8mIGhlYWRlciA9IHJlYWRlcl8tPkdldEhlYWRlcigpOwogICAgIHNpemVfdCBidWZmZXJfc2l6ZSA9IGhlYWRlci5idWZmZXJfc2l6ZTsKIAogICAgIC8vIElmIHRoZXJlIGlzIG5vIHNjcmF0Y2ggc3BhY2UsIHRoZW4ganVzdCB1c2UgdGhlCkBAIC0zOTcsMTggKzM5MiwxNiBAQAogfQogCiBzaXplX3QgU25hcHNob3RIYW5kbGVyOjpHZXRCdWZmZXJEYXRhT2Zmc2V0KCkgewotICAgIENvd0hlYWRlciBoZWFkZXI7Ci0gICAgcmVhZGVyXy0+R2V0SGVhZGVyKCZoZWFkZXIpOworICAgIGNvbnN0IGF1dG8mIGhlYWRlciA9IHJlYWRlcl8tPkdldEhlYWRlcigpOwogCi0gICAgcmV0dXJuIChoZWFkZXIuaGVhZGVyX3NpemUgKyBHZXRCdWZmZXJNZXRhZGF0YVNpemUoKSk7CisgICAgcmV0dXJuIChoZWFkZXIucHJlZml4LmhlYWRlcl9zaXplICsgR2V0QnVmZmVyTWV0YWRhdGFTaXplKCkpOwogfQogCiAvKgogICogKDJNQiAtIDhLID0gMjA4ODk2MCBieXRlcykgd2lsbCBiZSB0aGUgYnVmZmVyIHJlZ2lvbiB0byBob2xkIHRoZSBkYXRhLgogICovCiBzaXplX3QgU25hcHNob3RIYW5kbGVyOjpHZXRCdWZmZXJEYXRhU2l6ZSgpIHsKLSAgICBDb3dIZWFkZXIgaGVhZGVyOwotICAgIHJlYWRlcl8tPkdldEhlYWRlcigmaGVhZGVyKTsKKyAgICBjb25zdCBhdXRvJiBoZWFkZXIgPSByZWFkZXJfLT5HZXRIZWFkZXIoKTsKICAgICBzaXplX3QgYnVmZmVyX3NpemUgPSBoZWFkZXIuYnVmZmVyX3NpemU7CiAKICAgICAvLyBJZiB0aGVyZSBpcyBubyBzY3JhdGNoIHNwYWNlLCB0aGVuIGp1c3QgdXNlIHRoZQpAQCAtNDIxLDM2ICs0MTQsMTUgQEAKIH0KIAogc3RydWN0IEJ1ZmZlclN0YXRlKiBTbmFwc2hvdEhhbmRsZXI6OkdldEJ1ZmZlclN0YXRlKCkgewotICAgIENvd0hlYWRlciBoZWFkZXI7Ci0gICAgcmVhZGVyXy0+R2V0SGVhZGVyKCZoZWFkZXIpOworICAgIGNvbnN0IGF1dG8mIGhlYWRlciA9IHJlYWRlcl8tPkdldEhlYWRlcigpOwogCiAgICAgc3RydWN0IEJ1ZmZlclN0YXRlKiByYV9zdGF0ZSA9Ci0gICAgICAgICAgICByZWludGVycHJldF9jYXN0PHN0cnVjdCBCdWZmZXJTdGF0ZSo+KChjaGFyKiltYXBwZWRfYWRkcl8gKyBoZWFkZXIuaGVhZGVyX3NpemUpOworICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3QgQnVmZmVyU3RhdGUqPigoY2hhciopbWFwcGVkX2FkZHJfICsgaGVhZGVyLnByZWZpeC5oZWFkZXJfc2l6ZSk7CiAgICAgcmV0dXJuIHJhX3N0YXRlOwogfQogCiBib29sIFNuYXBzaG90SGFuZGxlcjo6SXNJb3VyaW5nU3VwcG9ydGVkKCkgewotICAgIHN0cnVjdCB1dHNuYW1lIHV0czsKLSAgICB1bnNpZ25lZCBpbnQgbWFqb3IsIG1pbm9yOwotCi0gICAgaWYgKGFuZHJvaWQ6OmJhc2U6OkdldEJvb2xQcm9wZXJ0eSgic25hcHVzZXJkLnRlc3QuaW9fdXJpbmcuZm9yY2VfZGlzYWJsZSIsIGZhbHNlKSkgewotICAgICAgICBTTkFQX0xPRyhJTkZPKSA8PCAiaW9fdXJpbmcgZGlzYWJsZWQgZm9yIHRlc3RpbmciOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKCh1bmFtZSgmdXRzKSAhPSAwKSB8fCAoc3NjYW5mKHV0cy5yZWxlYXNlLCAiJXUuJXUiLCAmbWFqb3IsICZtaW5vcikgIT0gMikpIHsKLSAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJDb3VsZCBub3QgcGFyc2UgdGhlIGtlcm5lbCB2ZXJzaW9uIGZyb20gdW5hbWUuICIKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW9fdXJpbmcgbm90IHN1cHBvcnRlZCI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBXZSB3aWxsIG9ubHkgc3VwcG9ydCBrZXJuZWxzIGZyb20gNS42IG9ud2FyZHMgYXMgSU9TUUVfQVNZTkMgZmxhZyBhbmQKLSAgICAvLyBJT19VUklOR19PUF9SRUFEL1dSSVRFIG9wY29kZXMgd2VyZSBpbnRyb2R1Y2VkIG9ubHkgb24gNS42IGtlcm5lbAotICAgIGlmIChtYWpvciA+PSA1KSB7Ci0gICAgICAgIGlmIChtYWpvciA9PSA1ICYmIG1pbm9yIDwgNikgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKKyAgICBpZiAoIUtlcm5lbFN1cHBvcnRzSW9VcmluZygpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTQ2NSw1ICs0MzcsMzEgQEAKICAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6R2V0Qm9vbFByb3BlcnR5KCJyby52aXJ0dWFsX2FiLmlvX3VyaW5nLmVuYWJsZWQiLCBmYWxzZSk7CiB9CiAKK2Jvb2wgU25hcHNob3RIYW5kbGVyOjpDaGVja1BhcnRpdGlvblZlcmlmaWNhdGlvbigpIHsKKyAgICByZXR1cm4gdXBkYXRlX3ZlcmlmeV8tPkNoZWNrUGFydGl0aW9uVmVyaWZpY2F0aW9uKCk7Cit9CisKK3ZvaWQgU25hcHNob3RIYW5kbGVyOjpGcmVlUmVzb3VyY2VzKCkgeworICAgIHdvcmtlcl90aHJlYWRzXy5jbGVhcigpOworICAgIHJlYWRfYWhlYWRfdGhyZWFkXyA9IG51bGxwdHI7CisgICAgbWVyZ2VfdGhyZWFkXyA9IG51bGxwdHI7Cit9CisKK3VpbnQ2NF90IFNuYXBzaG90SGFuZGxlcjo6R2V0TnVtU2VjdG9ycygpIGNvbnN0IHsKKyAgICB1bmlxdWVfZmQgZmQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oYmFzZV9wYXRoX21lcmdlXy5jX3N0cigpLCBPX1JET05MWSB8IE9fQ0xPRVhFQykpKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiQ2Fubm90IG9wZW4gYmFzZSBwYXRoOiAiIDw8IGJhc2VfcGF0aF9tZXJnZV87CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1aW50NjRfdCBkZXZfc3ogPSBnZXRfYmxvY2tfZGV2aWNlX3NpemUoZmQuZ2V0KCkpOworICAgIGlmICghZGV2X3N6KSB7CisgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGZpbmQgYmxvY2sgZGV2aWNlIHNpemU6ICIgPDwgYmFzZV9wYXRoX21lcmdlXzsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiBkZXZfc3ogLyBTRUNUT1JfU0laRTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90CiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL3NuYXB1c2VyZF9jb3JlLmggYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX2NvcmUuaAppbmRleCA3NzdhYTA3Li5jN2RlOTk1IDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX2NvcmUuaAorKysgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX2NvcmUuaApAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPGxpbWl0cz4KICNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxvc3RyZWFtPgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx0aHJlYWQ+CiAjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KQEAgLTQyLDEwICs0MywxMyBAQAogI2luY2x1ZGUgPGxpYmRtL2RtLmg+CiAjaW5jbHVkZSA8bGlic25hcHNob3QvY293X3JlYWRlci5oPgogI2luY2x1ZGUgPGxpYnNuYXBzaG90L2Nvd193cml0ZXIuaD4KLSNpbmNsdWRlIDxsaWJ1cmluZy5oPgorI2luY2x1ZGUgPHNuYXB1c2VyZC9ibG9ja19zZXJ2ZXIuaD4KICNpbmNsdWRlIDxzbmFwdXNlcmQvc25hcHVzZXJkX2J1ZmZlci5oPgogI2luY2x1ZGUgPHNuYXB1c2VyZC9zbmFwdXNlcmRfa2VybmVsLmg+CiAjaW5jbHVkZSA8c3RvcmFnZV9saXRlcmFscy9zdG9yYWdlX2xpdGVyYWxzLmg+CisjaW5jbHVkZSA8c3lzdGVtL3RocmVhZF9kZWZzLmg+CisjaW5jbHVkZSAic25hcHVzZXJkX3JlYWRhaGVhZC5oIgorI2luY2x1ZGUgInNuYXB1c2VyZF92ZXJpZnkuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHNuYXBzaG90IHsKQEAgLTU5LDIxICs2MywyMSBAQAogCiBzdGF0aWMgY29uc3RleHByIGludCBrTnVtV29ya2VyVGhyZWFkcyA9IDQ7CiAKLXN0YXRpYyBjb25zdGV4cHIgaW50IGtOaWNlVmFsdWVGb3JNZXJnZVRocmVhZHMgPSAtNTsKLQogI2RlZmluZSBTTkFQX0xPRyhsZXZlbCkgTE9HKGxldmVsKSA8PCBtaXNjX25hbWVfIDw8ICI6ICIKICNkZWZpbmUgU05BUF9QTE9HKGxldmVsKSBQTE9HKGxldmVsKSA8PCBtaXNjX25hbWVfIDw8ICI6ICIKIAogZW51bSBjbGFzcyBNRVJHRV9JT19UUkFOU0lUSU9OIHsKKyAgICBJTlZBTElELAogICAgIE1FUkdFX1JFQURZLAogICAgIE1FUkdFX0JFR0lOLAogICAgIE1FUkdFX0ZBSUxFRCwKICAgICBNRVJHRV9DT01QTEVURSwKICAgICBJT19URVJNSU5BVEVELAotICAgIFJFQURfQUhFQURfRkFJTFVSRSwKKyAgICBSRUFEX0FIRUFEX0ZBSUxVUkUKIH07CiAKLWNsYXNzIFNuYXBzaG90SGFuZGxlcjsKK2NsYXNzIE1lcmdlV29ya2VyOworY2xhc3MgUmVhZFdvcmtlcjsKIAogZW51bSBjbGFzcyBNRVJHRV9HUk9VUF9TVEFURSB7CiAgICAgR1JPVVBfTUVSR0VfUEVORElORywKQEAgLTk2LDIxOSArMTAwLDE4IEBACiAgICAgICAgIDogbWVyZ2Vfc3RhdGVfKHN0YXRlKSwgbnVtX2lvc19pbl9wcm9ncmVzcyhuX2lvcykge30KIH07CiAKLWNsYXNzIFJlYWRBaGVhZCB7Ci0gIHB1YmxpYzoKLSAgICBSZWFkQWhlYWQoY29uc3Qgc3RkOjpzdHJpbmcmIGNvd19kZXZpY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBiYWNraW5nX2RldmljZSwKLSAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSwgc3RkOjpzaGFyZWRfcHRyPFNuYXBzaG90SGFuZGxlcj4gc25hcHVzZXJkKTsKLSAgICBib29sIFJ1blRocmVhZCgpOwotCi0gIHByaXZhdGU6Ci0gICAgdm9pZCBJbml0aWFsaXplUkFJdGVyKCk7Ci0gICAgYm9vbCBSQUl0ZXJEb25lKCk7Ci0gICAgdm9pZCBSQUl0ZXJOZXh0KCk7Ci0gICAgdm9pZCBSQVJlc2V0SXRlcih1aW50NjRfdCBudW1fYmxvY2tzKTsKLSAgICBjb25zdCBDb3dPcGVyYXRpb24qIEdldFJBT3BJdGVyKCk7Ci0KLSAgICB2b2lkIEluaXRpYWxpemVCdWZmZXIoKTsKLSAgICBib29sIEluaXRSZWFkZXIoKTsKLSAgICBib29sIEluaXRpYWxpemVGZHMoKTsKLQotICAgIHZvaWQgQ2xvc2VGZHMoKSB7IGJhY2tpbmdfc3RvcmVfZmRfID0ge307IH0KLQotICAgIGJvb2wgUmVhZEFoZWFkSU9TdGFydCgpOwotICAgIGludCBQcmVwYXJlTmV4dFJlYWRBaGVhZCh1aW50NjRfdCogc291cmNlX29mZnNldCwgaW50KiBwZW5kaW5nX29wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+JiBibG9ja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IENvd09wZXJhdGlvbio+JiB4b3Jfb3BfdmVjKTsKLSAgICBib29sIFJlY29uc3RydWN0RGF0YUZyb21Db3coKTsKLSAgICB2b2lkIENoZWNrT3ZlcmxhcChjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCk7Ci0KLSAgICBib29sIFJlYWRBaGVhZEFzeW5jSU8oKTsKLSAgICBib29sIFJlYXBJb0NvbXBsZXRpb25zKGludCBwZW5kaW5nX2lvc190b19jb21wbGV0ZSk7Ci0gICAgYm9vbCBSZWFkWG9yRGF0YShzaXplX3QgYmxvY2tfaW5kZXgsIHNpemVfdCB4b3Jfb3BfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBDb3dPcGVyYXRpb24qPiYgeG9yX29wX3ZlYyk7Ci0gICAgdm9pZCBQcm9jZXNzWG9yRGF0YShzaXplX3QmIGJsb2NrX3hvcl9pbmRleCwgc2l6ZV90JiB4b3JfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBDb3dPcGVyYXRpb24qPiYgeG9yX29wX3ZlYywgdm9pZCogYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgbG9mZl90JiBidWZmZXJfb2Zmc2V0KTsKLSAgICB2b2lkIFVwZGF0ZVNjcmF0Y2hNZXRhZGF0YSgpOwotCi0gICAgYm9vbCBSZWFkQWhlYWRTeW5jSU8oKTsKLSAgICBib29sIEluaXRpYWxpemVJb3VyaW5nKCk7Ci0gICAgdm9pZCBGaW5hbGl6ZUlvdXJpbmcoKTsKLQotICAgIHZvaWQqIHJlYWRfYWhlYWRfYnVmZmVyXzsKLSAgICB2b2lkKiBtZXRhZGF0YV9idWZmZXJfOwotCi0gICAgc3RkOjp1bmlxdWVfcHRyPElDb3dPcEl0ZXI+IGNvd29wX2l0ZXJfOwotCi0gICAgc3RkOjpzdHJpbmcgY293X2RldmljZV87Ci0gICAgc3RkOjpzdHJpbmcgYmFja2luZ19zdG9yZV9kZXZpY2VfOwotICAgIHN0ZDo6c3RyaW5nIG1pc2NfbmFtZV87Ci0KLSAgICB1bmlxdWVfZmQgY293X2ZkXzsKLSAgICB1bmlxdWVfZmQgYmFja2luZ19zdG9yZV9mZF87Ci0KLSAgICBzdGQ6OnNoYXJlZF9wdHI8U25hcHNob3RIYW5kbGVyPiBzbmFwdXNlcmRfOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxDb3dSZWFkZXI+IHJlYWRlcl87Ci0KLSAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8dWludDY0X3Q+IGRlc3RfYmxvY2tzXzsKLSAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8dWludDY0X3Q+IHNvdXJjZV9ibG9ja3NfOwotICAgIGJvb2wgb3ZlcmxhcF87Ci0gICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IGJsb2Nrc187Ci0gICAgaW50IHRvdGFsX2Jsb2Nrc19tZXJnZWRfID0gMDsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiByYV90ZW1wX2J1ZmZlcl87Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gcmFfdGVtcF9tZXRhX2J1ZmZlcl87Ci0gICAgQnVmZmVyU2luayBidWZzaW5rXzsKLQotICAgIHVpbnQ2NF90IHRvdGFsX3JhX2Jsb2Nrc19jb21wbGV0ZWRfID0gMDsKLSAgICBib29sIHJlYWRfYWhlYWRfYXN5bmNfID0gZmFsc2U7Ci0gICAgLy8gUXVldWUgZGVwdGggb2YgOCBzZWVtcyBvcHRpbWFsLiBXZSBkb24ndCB3YW50Ci0gICAgLy8gdG8gaGF2ZSBhIGh1Z2UgZGVwdGggYXMgaXQgbWF5IHB1dCBtb3JlIG1lbW9yeSBwcmVzc3VyZQotICAgIC8vIG9uIHRoZSBrZXJuZWwgd29ya2VyIHRocmVhZHMgZ2l2ZW4gdGhhdCB3ZSB1c2UKLSAgICAvLyBJT1NRRV9BU1lOQyBmbGFnIC0gQVNZTkMgZmxhZ3MgY2FuIHBvdGVudGlhbGx5Ci0gICAgLy8gcmVzdWx0IGluIEVJTlRSOyBTaW5jZSB3ZSBkb24ndCByZXN0YXJ0Ci0gICAgLy8gc3lzY2FsbHMgYW5kIGZhbGxiYWNrIHRvIHN5bmNocm9ub3VzIEkvTywgd2UKLSAgICAvLyBkb24ndCB3YW50IGh1Z2UgcXVldWUgZGVwdGgKLSAgICBpbnQgcXVldWVfZGVwdGhfID0gODsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8c3RydWN0IGlvX3VyaW5nPiByaW5nXzsKLX07Ci0KLWNsYXNzIFVwZGF0ZVZlcmlmeSB7Ci0gIHB1YmxpYzoKLSAgICBVcGRhdGVWZXJpZnkoY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSk7Ci0gICAgdm9pZCBWZXJpZnlVcGRhdGVQYXJ0aXRpb24oKTsKLSAgICBib29sIENoZWNrUGFydGl0aW9uVmVyaWZpY2F0aW9uKCk7Ci0KLSAgcHJpdmF0ZToKLSAgICBlbnVtIGNsYXNzIFVwZGF0ZVZlcmlmeVN0YXRlIHsKLSAgICAgICAgVkVSSUZZX1VOS05PV04sCi0gICAgICAgIFZFUklGWV9GQUlMRUQsCi0gICAgICAgIFZFUklGWV9TVUNDRVNTLAotICAgIH07Ci0KLSAgICBzdGQ6OnN0cmluZyBtaXNjX25hbWVfOwotICAgIFVwZGF0ZVZlcmlmeVN0YXRlIHN0YXRlXzsKLSAgICBzdGQ6Om11dGV4IG1fbG9ja187Ci0gICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbV9jdl87Ci0KLSAgICBpbnQga01pblRocmVhZHNUb1ZlcmlmeSA9IDE7Ci0gICAgaW50IGtNYXhUaHJlYWRzVG9WZXJpZnkgPSA0OwotICAgIHVpbnQ2NF90IGtUaHJlc2hvbGRTaXplID0gNTEyX01pQjsKLSAgICB1aW50NjRfdCBrQmxvY2tTaXplVmVyaWZ5ID0gMV9NaUI7Ci0KLSAgICBib29sIElzQmxvY2tBbGlnbmVkKHVpbnQ2NF90IHJlYWRfc2l6ZSkgeyByZXR1cm4gKChyZWFkX3NpemUgJiAoQkxPQ0tfU1ogLSAxKSkgPT0gMCk7IH0KLSAgICB2b2lkIFVwZGF0ZVBhcnRpdGlvblZlcmlmaWNhdGlvblN0YXRlKFVwZGF0ZVZlcmlmeVN0YXRlIHN0YXRlKTsKLSAgICBib29sIFZlcmlmeVBhcnRpdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgcGFydGl0aW9uX25hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBkbV9ibG9ja19kZXZpY2UpOwotICAgIGJvb2wgVmVyaWZ5QmxvY2tzKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJ0aXRpb25fbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGRtX2Jsb2NrX2RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICBvZmZfdCBvZmZzZXQsIGludCBza2lwX2Jsb2NrcywgdWludDY0X3QgZGV2X3N6KTsKLX07Ci0KLWNsYXNzIFdvcmtlciB7Ci0gIHB1YmxpYzoKLSAgICBXb3JrZXIoY29uc3Qgc3RkOjpzdHJpbmcmIGNvd19kZXZpY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBiYWNraW5nX2RldmljZSwKLSAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRyb2xfZGV2aWNlLCBjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lLAotICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYmFzZV9wYXRoX21lcmdlLCBzdGQ6OnNoYXJlZF9wdHI8U25hcHNob3RIYW5kbGVyPiBzbmFwdXNlcmQpOwotICAgIGJvb2wgUnVuVGhyZWFkKCk7Ci0gICAgYm9vbCBSdW5NZXJnZVRocmVhZCgpOwotICAgIGJvb2wgSW5pdCgpOwotCi0gIHByaXZhdGU6Ci0gICAgLy8gSW5pdGlhbGl6YXRpb24KLSAgICB2b2lkIEluaXRpYWxpemVCdWZzaW5rKCk7Ci0gICAgYm9vbCBJbml0aWFsaXplRmRzKCk7Ci0gICAgYm9vbCBJbml0UmVhZGVyKCk7Ci0gICAgdm9pZCBDbG9zZUZkcygpIHsKLSAgICAgICAgY3RybF9mZF8gPSB7fTsKLSAgICAgICAgYmFja2luZ19zdG9yZV9mZF8gPSB7fTsKLSAgICAgICAgYmFzZV9wYXRoX21lcmdlX2ZkXyA9IHt9OwotICAgIH0KLQotICAgIC8vIEZ1bmN0aW9ucyBpbnRlcmFjdGluZyB3aXRoIGRtLXVzZXIKLSAgICBib29sIFJlYWREbVVzZXJIZWFkZXIoKTsKLSAgICBib29sIFdyaXRlRG1Vc2VyUGF5bG9hZChzaXplX3Qgc2l6ZSwgYm9vbCBoZWFkZXJfcmVzcG9uc2UpOwotICAgIGJvb2wgRG11c2VyUmVhZFJlcXVlc3QoKTsKLQotICAgIC8vIElPIFBhdGgKLSAgICBib29sIFByb2Nlc3NJT1JlcXVlc3QoKTsKLSAgICBib29sIElzQmxvY2tBbGlnbmVkKHNpemVfdCBzaXplKSB7IHJldHVybiAoKHNpemUgJiAoQkxPQ0tfU1ogLSAxKSkgPT0gMCk7IH0KLQotICAgIGJvb2wgUmVhZERhdGFGcm9tQmFzZURldmljZShzZWN0b3JfdCBzZWN0b3IsIHNpemVfdCByZWFkX3NpemUpOwotICAgIGJvb2wgUmVhZEZyb21Tb3VyY2VEZXZpY2UoY29uc3QgQ293T3BlcmF0aW9uKiBjb3dfb3ApOwotCi0gICAgYm9vbCBSZWFkQWxpZ25lZFNlY3RvcihzZWN0b3JfdCBzZWN0b3IsIHNpemVfdCBzeiwgYm9vbCBoZWFkZXJfcmVzcG9uc2UpOwotICAgIGJvb2wgUmVhZFVuYWxpZ25lZFNlY3RvcihzZWN0b3JfdCBzZWN0b3IsIHNpemVfdCBzaXplKTsKLSAgICBpbnQgUmVhZFVuYWxpZ25lZFNlY3RvcihzZWN0b3JfdCBzZWN0b3IsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzZWN0b3JfdCwgY29uc3QgQ293T3BlcmF0aW9uKj4+OjppdGVyYXRvciYgaXQpOwotICAgIGJvb2wgUmVzcG9uZElPRXJyb3IoYm9vbCBoZWFkZXJfcmVzcG9uc2UpOwotCi0gICAgLy8gUHJvY2Vzc2luZyBDT1cgb3BlcmF0aW9ucwotICAgIGJvb2wgUHJvY2Vzc0Nvd09wKGNvbnN0IENvd09wZXJhdGlvbiogY293X29wKTsKLSAgICBib29sIFByb2Nlc3NSZXBsYWNlT3AoY29uc3QgQ293T3BlcmF0aW9uKiBjb3dfb3ApOwotICAgIGJvb2wgUHJvY2Vzc1plcm9PcCgpOwotCi0gICAgLy8gSGFuZGxlcyBDb3B5IGFuZCBYb3IKLSAgICBib29sIFByb2Nlc3NDb3B5T3AoY29uc3QgQ293T3BlcmF0aW9uKiBjb3dfb3ApOwotICAgIGJvb2wgUHJvY2Vzc1hvck9wKGNvbnN0IENvd09wZXJhdGlvbiogY293X29wKTsKLSAgICBib29sIFByb2Nlc3NPcmRlcmVkT3AoY29uc3QgQ293T3BlcmF0aW9uKiBjb3dfb3ApOwotCi0gICAgLy8gTWVyZ2UgcmVsYXRlZCBvcHMKLSAgICBib29sIE1lcmdlKCk7Ci0gICAgYm9vbCBBc3luY01lcmdlKCk7Ci0gICAgYm9vbCBTeW5jTWVyZ2UoKTsKLSAgICBib29sIE1lcmdlT3JkZXJlZE9wcygpOwotICAgIGJvb2wgTWVyZ2VPcmRlcmVkT3BzQXN5bmMoKTsKLSAgICBib29sIE1lcmdlUmVwbGFjZVplcm9PcHMoKTsKLSAgICBpbnQgUHJlcGFyZU1lcmdlKHVpbnQ2NF90KiBzb3VyY2Vfb2Zmc2V0LCBpbnQqIHBlbmRpbmdfb3BzLAotICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgQ293T3BlcmF0aW9uKj4qIHJlcGxhY2VfemVyb192ZWMgPSBudWxscHRyKTsKLQotICAgIHNlY3Rvcl90IENodW5rVG9TZWN0b3IoY2h1bmtfdCBjaHVuaykgeyByZXR1cm4gY2h1bmsgPDwgQ0hVTktfU0hJRlQ7IH0KLSAgICBjaHVua190IFNlY3RvclRvQ2h1bmsoc2VjdG9yX3Qgc2VjdG9yKSB7IHJldHVybiBzZWN0b3IgPj4gQ0hVTktfU0hJRlQ7IH0KLQotICAgIGJvb2wgSW5pdGlhbGl6ZUlvdXJpbmcoKTsKLSAgICB2b2lkIEZpbmFsaXplSW91cmluZygpOwotCi0gICAgc3RkOjp1bmlxdWVfcHRyPENvd1JlYWRlcj4gcmVhZGVyXzsKLSAgICBCdWZmZXJTaW5rIGJ1ZnNpbmtfOwotICAgIFhvclNpbmsgeG9yc2lua187Ci0KLSAgICBzdGQ6OnN0cmluZyBjb3dfZGV2aWNlXzsKLSAgICBzdGQ6OnN0cmluZyBiYWNraW5nX3N0b3JlX2RldmljZV87Ci0gICAgc3RkOjpzdHJpbmcgY29udHJvbF9kZXZpY2VfOwotICAgIHN0ZDo6c3RyaW5nIG1pc2NfbmFtZV87Ci0gICAgc3RkOjpzdHJpbmcgYmFzZV9wYXRoX21lcmdlXzsKLQotICAgIHVuaXF1ZV9mZCBjb3dfZmRfOwotICAgIHVuaXF1ZV9mZCBiYWNraW5nX3N0b3JlX2ZkXzsKLSAgICB1bmlxdWVfZmQgYmFzZV9wYXRoX21lcmdlX2ZkXzsKLSAgICB1bmlxdWVfZmQgY3RybF9mZF87Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8SUNvd09wSXRlcj4gY293b3BfaXRlcl87Ci0gICAgc2l6ZV90IHJhX2Jsb2NrX2luZGV4XyA9IDA7Ci0gICAgdWludDY0X3QgYmxvY2tzX21lcmdlZF9pbl9ncm91cF8gPSAwOwotICAgIGJvb2wgbWVyZ2VfYXN5bmNfID0gZmFsc2U7Ci0gICAgLy8gUXVldWUgZGVwdGggb2YgOCBzZWVtcyBvcHRpbWFsLiBXZSBkb24ndCB3YW50Ci0gICAgLy8gdG8gaGF2ZSBhIGh1Z2UgZGVwdGggYXMgaXQgbWF5IHB1dCBtb3JlIG1lbW9yeSBwcmVzc3VyZQotICAgIC8vIG9uIHRoZSBrZXJuZWwgd29ya2VyIHRocmVhZHMgZ2l2ZW4gdGhhdCB3ZSB1c2UKLSAgICAvLyBJT1NRRV9BU1lOQyBmbGFnIC0gQVNZTkMgZmxhZ3MgY2FuIHBvdGVudGlhbGx5Ci0gICAgLy8gcmVzdWx0IGluIEVJTlRSOyBTaW5jZSB3ZSBkb24ndCByZXN0YXJ0Ci0gICAgLy8gc3lzY2FsbHMgYW5kIGZhbGxiYWNrIHRvIHN5bmNocm9ub3VzIEkvTywgd2UKLSAgICAvLyBkb24ndCB3YW50IGh1Z2UgcXVldWUgZGVwdGgKLSAgICBpbnQgcXVldWVfZGVwdGhfID0gODsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8c3RydWN0IGlvX3VyaW5nPiByaW5nXzsKLQotICAgIHN0ZDo6c2hhcmVkX3B0cjxTbmFwc2hvdEhhbmRsZXI+IHNuYXB1c2VyZF87Ci19OwotCiBjbGFzcyBTbmFwc2hvdEhhbmRsZXIgOiBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxTbmFwc2hvdEhhbmRsZXI+IHsKICAgcHVibGljOgogICAgIFNuYXBzaG90SGFuZGxlcihzdGQ6OnN0cmluZyBtaXNjX25hbWUsIHN0ZDo6c3RyaW5nIGNvd19kZXZpY2UsIHN0ZDo6c3RyaW5nIGJhY2tpbmdfZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBiYXNlX3BhdGhfbWVyZ2UsIGludCBudW1fd29ya2VycywgYm9vbCB1c2VfaW91cmluZywKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBwZXJmb3JtX3ZlcmlmaWNhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGJhc2VfcGF0aF9tZXJnZSwgc3RkOjpzaGFyZWRfcHRyPElCbG9ja1NlcnZlck9wZW5lcj4gb3BlbmVyLAorICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3dvcmtlcnMsIGJvb2wgdXNlX2lvdXJpbmcsIGJvb2wgcGVyZm9ybV92ZXJpZmljYXRpb24sIGJvb2wgb19kaXJlY3QsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvd19vcF9tZXJnZV9zaXplKTsKICAgICBib29sIEluaXRDb3dEZXZpY2UoKTsKICAgICBib29sIFN0YXJ0KCk7CiAKICAgICBjb25zdCBzdGQ6OnN0cmluZyYgR2V0Q29udHJvbERldmljZVBhdGgoKSB7IHJldHVybiBjb250cm9sX2RldmljZV87IH0KICAgICBjb25zdCBzdGQ6OnN0cmluZyYgR2V0TWlzY05hbWUoKSB7IHJldHVybiBtaXNjX25hbWVfOyB9Ci0gICAgY29uc3QgdWludDY0X3QmIEdldE51bVNlY3RvcnMoKSB7IHJldHVybiBudW1fc2VjdG9yc187IH0KKyAgICB1aW50NjRfdCBHZXROdW1TZWN0b3JzKCkgY29uc3Q7CiAgICAgY29uc3QgYm9vbCYgSXNBdHRhY2hlZCgpIGNvbnN0IHsgcmV0dXJuIGF0dGFjaGVkXzsgfQogICAgIHZvaWQgQXR0YWNoQ29udHJvbERldmljZSgpIHsgYXR0YWNoZWRfID0gdHJ1ZTsgfQogCkBAIC0zMTYsMTEgKzExOSw3IEBACiAgICAgYm9vbCBDb21taXRNZXJnZShpbnQgbnVtX21lcmdlX29wcyk7CiAKICAgICB2b2lkIENsb3NlRmRzKCkgeyBjb3dfZmRfID0ge307IH0KLSAgICB2b2lkIEZyZWVSZXNvdXJjZXMoKSB7Ci0gICAgICAgIHdvcmtlcl90aHJlYWRzXy5jbGVhcigpOwotICAgICAgICByZWFkX2FoZWFkX3RocmVhZF8gPSBudWxscHRyOwotICAgICAgICBtZXJnZV90aHJlYWRfID0gbnVsbHB0cjsKLSAgICB9CisgICAgdm9pZCBGcmVlUmVzb3VyY2VzKCk7CiAKICAgICBib29sIEluaXRpYWxpemVXb3JrZXJzKCk7CiAgICAgc3RkOjp1bmlxdWVfcHRyPENvd1JlYWRlcj4gQ2xvbmVSZWFkZXJGb3JXb3JrZXIoKTsKQEAgLTM0Nyw2ICsxNDYsOCBAQAogICAgIHZvaWQgV2FrZXVwTW9uaXRvck1lcmdlVGhyZWFkKCk7CiAgICAgdm9pZCBXYWl0Rm9yTWVyZ2VDb21wbGV0ZSgpOwogICAgIGJvb2wgV2FpdEZvck1lcmdlQmVnaW4oKTsKKyAgICB2b2lkIFJhVGhyZWFkU3RhcnRlZCgpOworICAgIHZvaWQgV2FpdEZvclJhVGhyZWFkVG9TdGFydCgpOwogICAgIHZvaWQgTm90aWZ5UkFGb3JNZXJnZVJlYWR5KCk7CiAgICAgYm9vbCBXYWl0Rm9yTWVyZ2VSZWFkeSgpOwogICAgIHZvaWQgTWVyZ2VGYWlsZWQoKTsKQEAgLTM1OCw2ICsxNTksNyBAQAogCiAgICAgYm9vbCBTaG91bGRSZWNvbnN0cnVjdERhdGFGcm9tQ293KCkgeyByZXR1cm4gcG9wdWxhdGVfZGF0YV9mcm9tX2Nvd187IH0KICAgICB2b2lkIEZpbmlzaFJlY29uc3RydWN0RGF0YUZyb21Db3coKSB7IHBvcHVsYXRlX2RhdGFfZnJvbV9jb3dfID0gZmFsc2U7IH0KKyAgICB2b2lkIE1hcmtNZXJnZUNvbXBsZXRlKCk7CiAgICAgLy8gUmV0dXJuIHRoZSBzbmFwc2hvdCBzdGF0dXMKICAgICBzdGQ6OnN0cmluZyBHZXRNZXJnZVN0YXR1cygpOwogCkBAIC0zODMsNyArMTg1LDcgQEAKICAgICBNRVJHRV9HUk9VUF9TVEFURSBQcm9jZXNzTWVyZ2luZ0Jsb2NrKHVpbnQ2NF90IG5ld19ibG9jaywgdm9pZCogYnVmZmVyKTsKIAogICAgIGJvb2wgSXNJb3VyaW5nU3VwcG9ydGVkKCk7Ci0gICAgYm9vbCBDaGVja1BhcnRpdGlvblZlcmlmaWNhdGlvbigpIHsgcmV0dXJuIHVwZGF0ZV92ZXJpZnlfLT5DaGVja1BhcnRpdGlvblZlcmlmaWNhdGlvbigpOyB9CisgICAgYm9vbCBDaGVja1BhcnRpdGlvblZlcmlmaWNhdGlvbigpOwogCiAgIHByaXZhdGU6CiAgICAgYm9vbCBSZWFkTWV0YWRhdGEoKTsKQEAgLTQwNSw4ICsyMDcsNiBAQAogCiAgICAgdW5pcXVlX2ZkIGNvd19mZF87CiAKLSAgICB1aW50NjRfdCBudW1fc2VjdG9yc187Ci0KICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q293UmVhZGVyPiByZWFkZXJfOwogCiAgICAgLy8gY2h1bmtfdmVjIHN0b3JlcyB0aGUgcHNldWRvIG1hcHBpbmcgb2Ygc2VjdG9yCkBAIC00MTksMTIgKzIxOSwxMyBAQAogICAgIHZvaWQqIG1hcHBlZF9hZGRyXzsKICAgICBzaXplX3QgdG90YWxfbWFwcGVkX2FkZHJfbGVuZ3RoXzsKIAotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxXb3JrZXI+PiB3b3JrZXJfdGhyZWFkc187CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFJlYWRXb3JrZXI+PiB3b3JrZXJfdGhyZWFkc187CiAgICAgLy8gUmVhZC1haGVhZCByZWxhdGVkCiAgICAgYm9vbCBwb3B1bGF0ZV9kYXRhX2Zyb21fY293XyA9IGZhbHNlOwogICAgIGJvb2wgcmFfdGhyZWFkXyA9IGZhbHNlOworICAgIGJvb2wgcmFfdGhyZWFkX3N0YXJ0ZWRfID0gZmFsc2U7CiAgICAgaW50IHRvdGFsX3JhX2Jsb2Nrc19tZXJnZWRfID0gMDsKLSAgICBNRVJHRV9JT19UUkFOU0lUSU9OIGlvX3N0YXRlXzsKKyAgICBNRVJHRV9JT19UUkFOU0lUSU9OIGlvX3N0YXRlXyA9IE1FUkdFX0lPX1RSQU5TSVRJT046OklOVkFMSUQ7CiAgICAgc3RkOjp1bmlxdWVfcHRyPFJlYWRBaGVhZD4gcmVhZF9haGVhZF90aHJlYWRfOwogICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50NjRfdCwgdm9pZCo+IHJlYWRfYWhlYWRfYnVmZmVyX21hcF87CiAKQEAgLTQzNCw3ICsyMzUsNyBAQAogICAgIC8vIE1lcmdlIEJsb2NrIHN0YXRlCiAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPE1lcmdlR3JvdXBTdGF0ZT4+IG1lcmdlX2Jsa19zdGF0ZV87CiAKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8V29ya2VyPiBtZXJnZV90aHJlYWRfOworICAgIHN0ZDo6dW5pcXVlX3B0cjxNZXJnZVdvcmtlcj4gbWVyZ2VfdGhyZWFkXzsKICAgICBkb3VibGUgbWVyZ2VfY29tcGxldGlvbl9wZXJjZW50YWdlXzsKIAogICAgIGJvb2wgbWVyZ2VfaW5pdGlhdGVkXyA9IGZhbHNlOwpAQCAtNDQ0LDEwICsyNDUsMTYgQEAKICAgICBib29sIHNjcmF0Y2hfc3BhY2VfID0gZmFsc2U7CiAgICAgaW50IG51bV93b3JrZXJfdGhyZWFkc18gPSBrTnVtV29ya2VyVGhyZWFkczsKICAgICBib29sIHBlcmZvcm1fdmVyaWZpY2F0aW9uXyA9IHRydWU7Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8c3RydWN0IGlvX3VyaW5nPiByaW5nXzsKKyAgICBib29sIHJlc3VtZV9tZXJnZV8gPSBmYWxzZTsKKyAgICBib29sIG1lcmdlX2NvbXBsZXRlXyA9IGZhbHNlOworICAgIGJvb2wgb19kaXJlY3RfID0gZmFsc2U7CisgICAgdWludDMyX3QgY293X29wX21lcmdlX3NpemVfID0gMDsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8VXBkYXRlVmVyaWZ5PiB1cGRhdGVfdmVyaWZ5XzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SUJsb2NrU2VydmVyT3BlbmVyPiBibG9ja19zZXJ2ZXJfb3BlbmVyXzsKIH07CiAKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBNRVJHRV9JT19UUkFOU0lUSU9OIHZhbHVlKTsKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKG9mZl90KSA9PSBzaXplb2YodWludDY0X3QpKTsKKwogfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90CiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL3NuYXB1c2VyZF9kbV91c2VyLmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfZG1fdXNlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMGY3MTEuLjAwMDAwMDAKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL3NuYXB1c2VyZF9kbV91c2VyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInNuYXB1c2VyZF9jb3JlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBzbmFwc2hvdCB7Ci0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmRtOwotdXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOwotCi1Xb3JrZXI6Oldvcmtlcihjb25zdCBzdGQ6OnN0cmluZyYgY293X2RldmljZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGJhY2tpbmdfZGV2aWNlLAotICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRyb2xfZGV2aWNlLCBjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lLAotICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJhc2VfcGF0aF9tZXJnZSwgc3RkOjpzaGFyZWRfcHRyPFNuYXBzaG90SGFuZGxlcj4gc25hcHVzZXJkKSB7Ci0gICAgY293X2RldmljZV8gPSBjb3dfZGV2aWNlOwotICAgIGJhY2tpbmdfc3RvcmVfZGV2aWNlXyA9IGJhY2tpbmdfZGV2aWNlOwotICAgIGNvbnRyb2xfZGV2aWNlXyA9IGNvbnRyb2xfZGV2aWNlOwotICAgIG1pc2NfbmFtZV8gPSBtaXNjX25hbWU7Ci0gICAgYmFzZV9wYXRoX21lcmdlXyA9IGJhc2VfcGF0aF9tZXJnZTsKLSAgICBzbmFwdXNlcmRfID0gc25hcHVzZXJkOwotfQotCi1ib29sIFdvcmtlcjo6SW5pdGlhbGl6ZUZkcygpIHsKLSAgICBiYWNraW5nX3N0b3JlX2ZkXy5yZXNldChvcGVuKGJhY2tpbmdfc3RvcmVfZGV2aWNlXy5jX3N0cigpLCBPX1JET05MWSkpOwotICAgIGlmIChiYWNraW5nX3N0b3JlX2ZkXyA8IDApIHsKLSAgICAgICAgU05BUF9QTE9HKEVSUk9SKSA8PCAiT3BlbiBGYWlsZWQ6ICIgPDwgYmFja2luZ19zdG9yZV9kZXZpY2VfOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY293X2ZkXy5yZXNldChvcGVuKGNvd19kZXZpY2VfLmNfc3RyKCksIE9fUkRXUikpOwotICAgIGlmIChjb3dfZmRfIDwgMCkgewotICAgICAgICBTTkFQX1BMT0coRVJST1IpIDw8ICJPcGVuIEZhaWxlZDogIiA8PCBjb3dfZGV2aWNlXzsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGN0cmxfZmRfLnJlc2V0KG9wZW4oY29udHJvbF9kZXZpY2VfLmNfc3RyKCksIE9fUkRXUikpOwotICAgIGlmIChjdHJsX2ZkXyA8IDApIHsKLSAgICAgICAgU05BUF9QTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIG9wZW4gIiA8PCBjb250cm9sX2RldmljZV87Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBCYXNlIGRldmljZSB1c2VkIGJ5IG1lcmdlIHRocmVhZAotICAgIGJhc2VfcGF0aF9tZXJnZV9mZF8ucmVzZXQob3BlbihiYXNlX3BhdGhfbWVyZ2VfLmNfc3RyKCksIE9fUkRXUikpOwotICAgIGlmIChiYXNlX3BhdGhfbWVyZ2VfZmRfIDwgMCkgewotICAgICAgICBTTkFQX1BMT0coRVJST1IpIDw8ICJPcGVuIEZhaWxlZDogIiA8PCBiYXNlX3BhdGhfbWVyZ2VfOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgV29ya2VyOjpJbml0UmVhZGVyKCkgewotICAgIHJlYWRlcl8gPSBzbmFwdXNlcmRfLT5DbG9uZVJlYWRlckZvcldvcmtlcigpOwotCi0gICAgaWYgKCFyZWFkZXJfLT5Jbml0Rm9yTWVyZ2Uoc3RkOjptb3ZlKGNvd19mZF8pKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi0vLyBTdGFydCB0aGUgcmVwbGFjZSBvcGVyYXRpb24uIFRoaXMgd2lsbCByZWFkIHRoZQotLy8gaW50ZXJuYWwgQ09XIGZvcm1hdCBhbmQgaWYgdGhlIGJsb2NrIGlzIGNvbXByZXNzZWQsCi0vLyBpdCB3aWxsIGJlIGRlLWNvbXByZXNzZWQuCi1ib29sIFdvcmtlcjo6UHJvY2Vzc1JlcGxhY2VPcChjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCkgewotICAgIGlmICghcmVhZGVyXy0+UmVhZERhdGEoKmNvd19vcCwgJmJ1ZnNpbmtfKSkgewotICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlByb2Nlc3NSZXBsYWNlT3AgZmFpbGVkIGZvciBibG9jayAiIDw8IGNvd19vcC0+bmV3X2Jsb2NrOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgV29ya2VyOjpSZWFkRnJvbVNvdXJjZURldmljZShjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCkgewotICAgIHZvaWQqIGJ1ZmZlciA9IGJ1ZnNpbmtfLkdldFBheWxvYWRCdWZmZXIoQkxPQ0tfU1opOwotICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgewotICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlJlYWRGcm9tQmFzZURldmljZTogRmFpbGVkIHRvIGdldCBwYXlsb2FkIGJ1ZmZlciI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgU05BUF9MT0coREVCVUcpIDw8ICIgUmVhZEZyb21CYXNlRGV2aWNlLi4uOiBuZXctYmxvY2s6ICIgPDwgY293X29wLT5uZXdfYmxvY2sKLSAgICAgICAgICAgICAgICAgICAgPDwgIiBTb3VyY2U6ICIgPDwgY293X29wLT5zb3VyY2U7Ci0gICAgdWludDY0X3Qgb2Zmc2V0ID0gY293X29wLT5zb3VyY2U7Ci0gICAgaWYgKGNvd19vcC0+dHlwZSA9PSBrQ293Q29weU9wKSB7Ci0gICAgICAgIG9mZnNldCAqPSBCTE9DS19TWjsKLSAgICB9Ci0gICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHlBdE9mZnNldChiYWNraW5nX3N0b3JlX2ZkXywgYnVmZmVyLCBCTE9DS19TWiwgb2Zmc2V0KSkgewotICAgICAgICBzdGQ6OnN0cmluZyBvcDsKLSAgICAgICAgaWYgKGNvd19vcC0+dHlwZSA9PSBrQ293Q29weU9wKQotICAgICAgICAgICAgb3AgPSAiQ29weS1vcCI7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgb3AgPSAiWG9yLW9wIjsKLSAgICAgICAgfQotICAgICAgICBTTkFQX1BMT0coRVJST1IpIDw8IG9wIDw8ICIgZmFpbGVkLiBSZWFkIGZyb20gYmFja2luZyBzdG9yZTogIiA8PCBiYWNraW5nX3N0b3JlX2RldmljZV8KLSAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiYXQgYmxvY2sgOiIgPDwgb2Zmc2V0IC8gQkxPQ0tfU1ogPDwgIiBvZmZzZXQ6IiA8PCBvZmZzZXQgJSBCTE9DS19TWjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi0vLyBTdGFydCB0aGUgY29weSBvcGVyYXRpb24uIFRoaXMgd2lsbCByZWFkIHRoZSBiYWNraW5nCi0vLyBibG9jayBkZXZpY2Ugd2hpY2ggaXMgcmVwcmVzZW50ZWQgYnkgY293X29wLT5zb3VyY2UuCi1ib29sIFdvcmtlcjo6UHJvY2Vzc0NvcHlPcChjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCkgewotICAgIGlmICghUmVhZEZyb21Tb3VyY2VEZXZpY2UoY293X29wKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgV29ya2VyOjpQcm9jZXNzWG9yT3AoY29uc3QgQ293T3BlcmF0aW9uKiBjb3dfb3ApIHsKLSAgICBpZiAoIVJlYWRGcm9tU291cmNlRGV2aWNlKGNvd19vcCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICB4b3JzaW5rXy5SZXNldCgpOwotICAgIGlmICghcmVhZGVyXy0+UmVhZERhdGEoKmNvd19vcCwgJnhvcnNpbmtfKSkgewotICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlByb2Nlc3NYb3JPcCBmYWlsZWQgZm9yIGJsb2NrICIgPDwgY293X29wLT5uZXdfYmxvY2s7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBXb3JrZXI6OlByb2Nlc3NaZXJvT3AoKSB7Ci0gICAgLy8gWmVybyBvdXQgdGhlIGVudGlyZSBibG9jawotICAgIHZvaWQqIGJ1ZmZlciA9IGJ1ZnNpbmtfLkdldFBheWxvYWRCdWZmZXIoQkxPQ0tfU1opOwotICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgewotICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlByb2Nlc3NaZXJvT3A6IEZhaWxlZCB0byBnZXQgcGF5bG9hZCBidWZmZXIiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgbWVtc2V0KGJ1ZmZlciwgMCwgQkxPQ0tfU1opOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFdvcmtlcjo6UHJvY2Vzc09yZGVyZWRPcChjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCkgewotICAgIHZvaWQqIGJ1ZmZlciA9IGJ1ZnNpbmtfLkdldFBheWxvYWRCdWZmZXIoQkxPQ0tfU1opOwotICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgewotICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlByb2Nlc3NPcmRlcmVkT3A6IEZhaWxlZCB0byBnZXQgcGF5bG9hZCBidWZmZXIiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgTUVSR0VfR1JPVVBfU1RBVEUgc3RhdGUgPSBzbmFwdXNlcmRfLT5Qcm9jZXNzTWVyZ2luZ0Jsb2NrKGNvd19vcC0+bmV3X2Jsb2NrLCBidWZmZXIpOwotCi0gICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICBjYXNlIE1FUkdFX0dST1VQX1NUQVRFOjpHUk9VUF9NRVJHRV9DT01QTEVURUQ6IHsKLSAgICAgICAgICAgIC8vIE1lcmdlIGlzIGNvbXBsZXRlZCBmb3IgdGhpcyBDT1cgb3A7IGp1c3QgcmVhZCBkaXJlY3RseSBmcm9tCi0gICAgICAgICAgICAvLyB0aGUgYmFzZSBkZXZpY2UKLSAgICAgICAgICAgIFNOQVBfTE9HKERFQlVHKSA8PCAiTWVyZ2UtY29tcGxldGVkOiBSZWFkaW5nIGZyb20gYmFzZSBkZXZpY2Ugc2VjdG9yOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKGNvd19vcC0+bmV3X2Jsb2NrID4+IFNFQ1RPUl9TSElGVCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIEJsb2NrLW51bWJlcjogIiA8PCBjb3dfb3AtPm5ld19ibG9jazsKLSAgICAgICAgICAgIGlmICghUmVhZERhdGFGcm9tQmFzZURldmljZShDaHVua1RvU2VjdG9yKGNvd19vcC0+bmV3X2Jsb2NrKSwgQkxPQ0tfU1opKSB7Ci0gICAgICAgICAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJSZWFkRGF0YUZyb21CYXNlRGV2aWNlIGF0IHNlY3RvcjogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoY293X29wLT5uZXdfYmxvY2sgPj4gU0VDVE9SX1NISUZUKSA8PCAiIGFmdGVyIG1lcmdlLWNvbXBsZXRlLiI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBNRVJHRV9HUk9VUF9TVEFURTo6R1JPVVBfTUVSR0VfUEVORElORzogewotICAgICAgICAgICAgYm9vbCByZXQ7Ci0gICAgICAgICAgICBpZiAoY293X29wLT50eXBlID09IGtDb3dDb3B5T3ApIHsKLSAgICAgICAgICAgICAgICByZXQgPSBQcm9jZXNzQ29weU9wKGNvd19vcCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldCA9IFByb2Nlc3NYb3JPcChjb3dfb3ApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJL08gaXMgY29tcGxldGUgLSBkZWNyZW1lbnQgdGhlIHJlZmNvdW50IGlycmVzcGVjdGl2ZSBvZiB0aGUgcmV0dXJuCi0gICAgICAgICAgICAvLyBzdGF0dXMKLSAgICAgICAgICAgIHNuYXB1c2VyZF8tPk5vdGlmeUlPQ29tcGxldGlvbihjb3dfb3AtPm5ld19ibG9jayk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgICAgIC8vIFdlIGFscmVhZHkgaGF2ZSB0aGUgZGF0YSBpbiB0aGUgYnVmZmVyIHJldHJpZXZlZCBmcm9tIFJBIHRocmVhZC4KLSAgICAgICAgLy8gTm90aGluZyB0byBwcm9jZXNzIGZ1cnRoZXIuCi0gICAgICAgIGNhc2UgTUVSR0VfR1JPVVBfU1RBVEU6OkdST1VQX01FUkdFX1JBX1JFQURZOiB7Ci0gICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBNRVJHRV9HUk9VUF9TVEFURTo6R1JPVVBfTUVSR0VfSU5fUFJPR1JFU1M6IHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIC8vIEFsbCBvdGhlciBzdGF0ZXMsIGZhaWwgdGhlIEkvTyB2aXogKEdST1VQX01FUkdFX0ZBSUxFRCBhbmQgR1JPVVBfSU5WQUxJRCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBXb3JrZXI6OlByb2Nlc3NDb3dPcChjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCkgewotICAgIGlmIChjb3dfb3AgPT0gbnVsbHB0cikgewotICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlByb2Nlc3NDb3dPcDogSW52YWxpZCBjb3dfb3AiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc3dpdGNoIChjb3dfb3AtPnR5cGUpIHsKLSAgICAgICAgY2FzZSBrQ293UmVwbGFjZU9wOiB7Ci0gICAgICAgICAgICByZXR1cm4gUHJvY2Vzc1JlcGxhY2VPcChjb3dfb3ApOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrQ293WmVyb09wOiB7Ci0gICAgICAgICAgICByZXR1cm4gUHJvY2Vzc1plcm9PcCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrQ293Q29weU9wOgotICAgICAgICAgICAgW1tmYWxsdGhyb3VnaF1dOwotICAgICAgICBjYXNlIGtDb3dYb3JPcDogewotICAgICAgICAgICAgcmV0dXJuIFByb2Nlc3NPcmRlcmVkT3AoY293X29wKTsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiVW5rbm93biBvcGVyYXRpb24tdHlwZSBmb3VuZDogIiA8PCBjb3dfb3AtPnR5cGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIFdvcmtlcjo6SW5pdGlhbGl6ZUJ1ZnNpbmsoKSB7Ci0gICAgLy8gQWxsb2NhdGUgdGhlIGJ1ZmZlciB3aGljaCBpcyB1c2VkIHRvIGNvbW11bmljYXRlIGJldHdlZW4KLSAgICAvLyBkYWVtb24gYW5kIGRtLXVzZXIuIFRoZSBidWZmZXIgY29tcHJpc2VzIG9mIGhlYWRlciBhbmQgYSBmaXhlZCBwYXlsb2FkLgotICAgIC8vIElmIHRoZSBkbS11c2VyIHJlcXVlc3RzIGEgYmlnIElPLCB0aGUgSU8gd2lsbCBiZSBicm9rZW4gaW50byBjaHVua3MKLSAgICAvLyBvZiBQQVlMT0FEX0JVRkZFUl9TWi4KLSAgICBzaXplX3QgYnVmX3NpemUgPSBzaXplb2Yoc3RydWN0IGRtX3VzZXJfaGVhZGVyKSArIFBBWUxPQURfQlVGRkVSX1NaOwotICAgIGJ1ZnNpbmtfLkluaXRpYWxpemUoYnVmX3NpemUpOwotfQotCi1ib29sIFdvcmtlcjo6SW5pdCgpIHsKLSAgICBJbml0aWFsaXplQnVmc2luaygpOwotICAgIHhvcnNpbmtfLkluaXRpYWxpemUoJmJ1ZnNpbmtfLCBCTE9DS19TWik7Ci0KLSAgICBpZiAoIUluaXRpYWxpemVGZHMoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKCFJbml0UmVhZGVyKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFdvcmtlcjo6UnVuVGhyZWFkKCkgewotICAgIFNOQVBfTE9HKElORk8pIDw8ICJQcm9jZXNzaW5nIHNuYXBzaG90IEkvTyByZXF1ZXN0cy4uLi4iOwotCi0gICAgaWYgKHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgZ2V0dGlkKCksIGtOaWNlVmFsdWVGb3JNZXJnZVRocmVhZHMpKSB7Ci0gICAgICAgIFNOQVBfUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBzZXQgcHJpb3JpdHkgZm9yIFRJRDogIiA8PCBnZXR0aWQoKTsKLSAgICB9Ci0KLSAgICAvLyBTdGFydCBzZXJ2aW5nIElPCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgaWYgKCFQcm9jZXNzSU9SZXF1ZXN0KCkpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQ2xvc2VGZHMoKTsKLSAgICByZWFkZXJfLT5DbG9zZUNvd0ZkKCk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gUmVhZCBIZWFkZXIgZnJvbSBkbS11c2VyIG1pc2MgZGV2aWNlLiBUaGlzIGdpdmVzCi0vLyB1cyB0aGUgc2VjdG9yIG51bWJlciBmb3Igd2hpY2ggSU8gaXMgaXNzdWVkIGJ5IGRtLXNuYXBzaG90IGRldmljZQotYm9vbCBXb3JrZXI6OlJlYWREbVVzZXJIZWFkZXIoKSB7Ci0gICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHkoY3RybF9mZF8sIGJ1ZnNpbmtfLkdldEJ1ZlB0cigpLCBzaXplb2Yoc3RydWN0IGRtX3VzZXJfaGVhZGVyKSkpIHsKLSAgICAgICAgaWYgKGVycm5vICE9IEVOT1RCTEspIHsKLSAgICAgICAgICAgIFNOQVBfUExPRyhFUlJPUikgPDwgIkNvbnRyb2wtcmVhZCBmYWlsZWQiOwotICAgICAgICB9Ci0KLSAgICAgICAgU05BUF9QTE9HKERFQlVHKSA8PCAiUmVhZERtVXNlckhlYWRlciBmYWlsZWQuLi4uIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi0vLyBTZW5kIHRoZSBwYXlsb2FkL2RhdGEgYmFjayB0byBkbS11c2VyIG1pc2MgZGV2aWNlLgotYm9vbCBXb3JrZXI6OldyaXRlRG1Vc2VyUGF5bG9hZChzaXplX3Qgc2l6ZSwgYm9vbCBoZWFkZXJfcmVzcG9uc2UpIHsKLSAgICBzaXplX3QgcGF5bG9hZF9zaXplID0gc2l6ZTsKLSAgICB2b2lkKiBidWYgPSBidWZzaW5rXy5HZXRQYXlsb2FkQnVmUHRyKCk7Ci0gICAgaWYgKGhlYWRlcl9yZXNwb25zZSkgewotICAgICAgICBwYXlsb2FkX3NpemUgKz0gc2l6ZW9mKHN0cnVjdCBkbV91c2VyX2hlYWRlcik7Ci0gICAgICAgIGJ1ZiA9IGJ1ZnNpbmtfLkdldEJ1ZlB0cigpOwotICAgIH0KLQotICAgIGlmICghYW5kcm9pZDo6YmFzZTo6V3JpdGVGdWxseShjdHJsX2ZkXywgYnVmLCBwYXlsb2FkX3NpemUpKSB7Ci0gICAgICAgIFNOQVBfUExPRyhFUlJPUikgPDwgIldyaXRlIHRvIGRtLXVzZXIgZmFpbGVkIHNpemU6ICIgPDwgcGF5bG9hZF9zaXplOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgV29ya2VyOjpSZWFkRGF0YUZyb21CYXNlRGV2aWNlKHNlY3Rvcl90IHNlY3Rvciwgc2l6ZV90IHJlYWRfc2l6ZSkgewotICAgIENIRUNLKHJlYWRfc2l6ZSA8PSBCTE9DS19TWik7Ci0KLSAgICB2b2lkKiBidWZmZXIgPSBidWZzaW5rXy5HZXRQYXlsb2FkQnVmZmVyKEJMT0NLX1NaKTsKLSAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKLSAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJSZWFkRnJvbUJhc2VEZXZpY2U6IEZhaWxlZCB0byBnZXQgcGF5bG9hZCBidWZmZXIiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgbG9mZl90IG9mZnNldCA9IHNlY3RvciA8PCBTRUNUT1JfU0hJRlQ7Ci0gICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHlBdE9mZnNldChiYXNlX3BhdGhfbWVyZ2VfZmRfLCBidWZmZXIsIHJlYWRfc2l6ZSwgb2Zmc2V0KSkgewotICAgICAgICBTTkFQX1BMT0coRVJST1IpIDw8ICJSZWFkRGF0YUZyb21CYXNlRGV2aWNlIGZhaWxlZC4gZmQ6ICIgPDwgYmFzZV9wYXRoX21lcmdlX2ZkXwotICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJhdCBzZWN0b3IgOiIgPDwgc2VjdG9yIDw8ICIgc2l6ZTogIiA8PCByZWFkX3NpemU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBXb3JrZXI6OlJlYWRBbGlnbmVkU2VjdG9yKHNlY3Rvcl90IHNlY3Rvciwgc2l6ZV90IHN6LCBib29sIGhlYWRlcl9yZXNwb25zZSkgewotICAgIHN0cnVjdCBkbV91c2VyX2hlYWRlciogaGVhZGVyID0gYnVmc2lua18uR2V0SGVhZGVyUHRyKCk7Ci0gICAgc2l6ZV90IHJlbWFpbmluZ19zaXplID0gc3o7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHNlY3Rvcl90LCBjb25zdCBDb3dPcGVyYXRpb24qPj4mIGNodW5rX3ZlYyA9IHNuYXB1c2VyZF8tPkdldENodW5rVmVjKCk7Ci0gICAgYm9vbCBpb19lcnJvciA9IGZhbHNlOwotICAgIGludCByZXQgPSAwOwotCi0gICAgZG8gewotICAgICAgICAvLyBQcm9jZXNzIDFNQiBwYXlsb2FkIGF0IGEgdGltZQotICAgICAgICBzaXplX3QgcmVhZF9zaXplID0gc3RkOjptaW4oUEFZTE9BRF9CVUZGRVJfU1osIHJlbWFpbmluZ19zaXplKTsKLQotICAgICAgICBoZWFkZXItPnR5cGUgPSBETV9VU0VSX1JFU1BfU1VDQ0VTUzsKLSAgICAgICAgc2l6ZV90IHRvdGFsX2J5dGVzX3JlYWQgPSAwOwotICAgICAgICBpb19lcnJvciA9IGZhbHNlOwotICAgICAgICBidWZzaW5rXy5SZXNldEJ1ZmZlck9mZnNldCgpOwotCi0gICAgICAgIHdoaWxlIChyZWFkX3NpemUpIHsKLSAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgZXZlcnkgNGsgYmxvY2sgdG8gdmVyaWZ5IGlmIGl0IGlzCi0gICAgICAgICAgICAvLyBwcmVzZW50IGluIHRoZSBtYXBwaW5nLgotICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBzdGQ6Om1pbihCTE9DS19TWiwgcmVhZF9zaXplKTsKLQotICAgICAgICAgICAgYXV0byBpdCA9IHN0ZDo6bG93ZXJfYm91bmQoY2h1bmtfdmVjLmJlZ2luKCksIGNodW5rX3ZlYy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKHNlY3RvciwgbnVsbHB0ciksIFNuYXBzaG90SGFuZGxlcjo6Y29tcGFyZSk7Ci0gICAgICAgICAgICBib29sIG5vdF9mb3VuZCA9IChpdCA9PSBjaHVua192ZWMuZW5kKCkgfHwgaXQtPmZpcnN0ICE9IHNlY3Rvcik7Ci0KLSAgICAgICAgICAgIGlmIChub3RfZm91bmQpIHsKLSAgICAgICAgICAgICAgICAvLyBCbG9jayBub3QgZm91bmQgaW4gbWFwIC0gd2hpY2ggbWVhbnMgdGhpcyBibG9jayB3YXMgbm90Ci0gICAgICAgICAgICAgICAgLy8gY2hhbmdlZCBhcyBwZXIgdGhlIE9UQS4gSnVzdCByb3V0ZSB0aGUgSS9PIHRvIHRoZSBiYXNlCi0gICAgICAgICAgICAgICAgLy8gZGV2aWNlLgotICAgICAgICAgICAgICAgIGlmICghUmVhZERhdGFGcm9tQmFzZURldmljZShzZWN0b3IsIHNpemUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUmVhZERhdGFGcm9tQmFzZURldmljZSBmYWlsZWQiOwotICAgICAgICAgICAgICAgICAgICBoZWFkZXItPnR5cGUgPSBETV9VU0VSX1JFU1BfRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0ID0gc2l6ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgZm91bmQgdGhlIHNlY3RvciBpbiBtYXBwaW5nLiBDaGVjayB0aGUgdHlwZSBvZiBDT1cgT1AgYW5kCi0gICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBpdC4KLSAgICAgICAgICAgICAgICBpZiAoIVByb2Nlc3NDb3dPcChpdC0+c2Vjb25kKSkgewotICAgICAgICAgICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlByb2Nlc3NDb3dPcCBmYWlsZWQiOwotICAgICAgICAgICAgICAgICAgICBoZWFkZXItPnR5cGUgPSBETV9VU0VSX1JFU1BfRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0ID0gQkxPQ0tfU1o7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEp1c3QgcmV0dXJuIHRoZSBoZWFkZXIgaWYgaXQgaXMgYW4gZXJyb3IKLSAgICAgICAgICAgIGlmIChoZWFkZXItPnR5cGUgPT0gRE1fVVNFUl9SRVNQX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFSZXNwb25kSU9FcnJvcihoZWFkZXJfcmVzcG9uc2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpb19lcnJvciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlYWRfc2l6ZSAtPSByZXQ7Ci0gICAgICAgICAgICB0b3RhbF9ieXRlc19yZWFkICs9IHJldDsKLSAgICAgICAgICAgIHNlY3RvciArPSAocmV0ID4+IFNFQ1RPUl9TSElGVCk7Ci0gICAgICAgICAgICBidWZzaW5rXy5VcGRhdGVCdWZmZXJPZmZzZXQocmV0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaW9fZXJyb3IpIHsKLSAgICAgICAgICAgIGlmICghV3JpdGVEbVVzZXJQYXlsb2FkKHRvdGFsX2J5dGVzX3JlYWQsIGhlYWRlcl9yZXNwb25zZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFNOQVBfTE9HKERFQlVHKSA8PCAiV3JpdGVEbVVzZXJQYXlsb2FkIHN1Y2Nlc3MgdG90YWxfYnl0ZXNfcmVhZDogIiA8PCB0b3RhbF9ieXRlc19yZWFkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBoZWFkZXItcmVzcG9uc2U6ICIgPDwgaGVhZGVyX3Jlc3BvbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiByZW1haW5pbmdfc2l6ZTogIiA8PCByZW1haW5pbmdfc2l6ZTsKLSAgICAgICAgICAgIGhlYWRlcl9yZXNwb25zZSA9IGZhbHNlOwotICAgICAgICAgICAgcmVtYWluaW5nX3NpemUgLT0gdG90YWxfYnl0ZXNfcmVhZDsKLSAgICAgICAgfQotICAgIH0gd2hpbGUgKHJlbWFpbmluZ19zaXplID4gMCAmJiAhaW9fZXJyb3IpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWludCBXb3JrZXI6OlJlYWRVbmFsaWduZWRTZWN0b3IoCi0gICAgICAgIHNlY3Rvcl90IHNlY3Rvciwgc2l6ZV90IHNpemUsCi0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzZWN0b3JfdCwgY29uc3QgQ293T3BlcmF0aW9uKj4+OjppdGVyYXRvciYgaXQpIHsKLSAgICBzaXplX3Qgc2tpcF9zZWN0b3Jfc2l6ZSA9IDA7Ci0KLSAgICBTTkFQX0xPRyhERUJVRykgPDwgIlJlYWRVbmFsaWduZWRTZWN0b3I6IHNlY3RvciAiIDw8IHNlY3RvciA8PCAiIHNpemU6ICIgPDwgc2l6ZQotICAgICAgICAgICAgICAgICAgICA8PCAiIEFsaWduZWQgc2VjdG9yOiAiIDw8IGl0LT5maXJzdDsKLQotICAgIGlmICghUHJvY2Vzc0Nvd09wKGl0LT5zZWNvbmQpKSB7Ci0gICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUmVhZFVuYWxpZ25lZFNlY3RvcjogIiA8PCBzZWN0b3IgPDwgIiBmYWlsZWQgb2Ygc2l6ZTogIiA8PCBzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiIEFsaWduZWQgc2VjdG9yOiAiIDw8IGl0LT5maXJzdDsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGludCBudW1fc2VjdG9yc19za2lwID0gc2VjdG9yIC0gaXQtPmZpcnN0OwotCi0gICAgaWYgKG51bV9zZWN0b3JzX3NraXAgPiAwKSB7Ci0gICAgICAgIHNraXBfc2VjdG9yX3NpemUgPSBudW1fc2VjdG9yc19za2lwIDw8IFNFQ1RPUl9TSElGVDsKLSAgICAgICAgY2hhciogYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYnVmc2lua18uR2V0QnVmUHRyKCkpOwotICAgICAgICBzdHJ1Y3QgZG1fdXNlcl9tZXNzYWdlKiBtc2cgPSAoc3RydWN0IGRtX3VzZXJfbWVzc2FnZSopKCYoYnVmZmVyWzBdKSk7Ci0KLSAgICAgICAgaWYgKHNraXBfc2VjdG9yX3NpemUgPT0gQkxPQ0tfU1opIHsKLSAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiSW52YWxpZCB1bi1hbGlnbmVkIElPIHJlcXVlc3QgYXQgc2VjdG9yOiAiIDw8IHNlY3RvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgQmFzZS1zZWN0b3I6ICIgPDwgaXQtPmZpcnN0OwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgbWVtbW92ZShtc2ctPnBheWxvYWQuYnVmLCAoY2hhciopbXNnLT5wYXlsb2FkLmJ1ZiArIHNraXBfc2VjdG9yX3NpemUsCi0gICAgICAgICAgICAgICAgKEJMT0NLX1NaIC0gc2tpcF9zZWN0b3Jfc2l6ZSkpOwotICAgIH0KLQotICAgIGJ1ZnNpbmtfLlJlc2V0QnVmZmVyT2Zmc2V0KCk7Ci0gICAgcmV0dXJuIHN0ZDo6bWluKHNpemUsIChCTE9DS19TWiAtIHNraXBfc2VjdG9yX3NpemUpKTsKLX0KLQotYm9vbCBXb3JrZXI6OlJlYWRVbmFsaWduZWRTZWN0b3Ioc2VjdG9yX3Qgc2VjdG9yLCBzaXplX3Qgc2l6ZSkgewotICAgIHN0cnVjdCBkbV91c2VyX2hlYWRlciogaGVhZGVyID0gYnVmc2lua18uR2V0SGVhZGVyUHRyKCk7Ci0gICAgaGVhZGVyLT50eXBlID0gRE1fVVNFUl9SRVNQX1NVQ0NFU1M7Ci0gICAgYnVmc2lua18uUmVzZXRCdWZmZXJPZmZzZXQoKTsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c2VjdG9yX3QsIGNvbnN0IENvd09wZXJhdGlvbio+PiYgY2h1bmtfdmVjID0gc25hcHVzZXJkXy0+R2V0Q2h1bmtWZWMoKTsKLQotICAgIGF1dG8gaXQgPSBzdGQ6Omxvd2VyX2JvdW5kKGNodW5rX3ZlYy5iZWdpbigpLCBjaHVua192ZWMuZW5kKCksIHN0ZDo6bWFrZV9wYWlyKHNlY3RvciwgbnVsbHB0ciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU25hcHNob3RIYW5kbGVyOjpjb21wYXJlKTsKLQotICAgIC8vIHwtLS0tLS0tfC0tLS0tLS18LS0tLS0tLXwKLSAgICAvLyAwICAgICAgIDEgICAgICAgMiAgICAgICAzCi0gICAgLy8KLSAgICAvLyBCbG9jayAwIC0gb3AgMQotICAgIC8vIEJsb2NrIDEgLSBvcCAyCi0gICAgLy8gQmxvY2sgMiAtIG9wIDMKLSAgICAvLwotICAgIC8vIGNodW5rX3ZlYyB3aWxsIGhhdmUgYmxvY2sgMCwgMSwgMiB3aGljaCBtYXBzIHRvIHJlbGF2YW50IENPVyBvcHMuCi0gICAgLy8KLSAgICAvLyBFYWNoIGJsb2NrIGlzIDRrIGJ5dGVzLiBUaHVzLCB0aGUgbGFzdCBibG9jayB3aWxsIHNwYW4gOCBzZWN0b3JzCi0gICAgLy8gcmFuZ2luZyB0aWxsIGJsb2NrIDMgKEhvd2V2ZXIsIGJsb2NrIDMgd29uJ3QgYmUgaW4gY2h1bmtfdmVjIGFzCi0gICAgLy8gaXQgZG9lc24ndCBoYXZlIGFueSBtYXBwaW5nIHRvIENPVyBvcHMuIE5vdywgaWYgd2UgZ2V0IGFuIEkvTyByZXF1ZXN0IGZvciBhIHNlY3RvcgotICAgIC8vIHNwYW5uaW5nIGJldHdlZW4gYmxvY2sgMiBhbmQgYmxvY2sgMywgd2UgbmVlZCB0byBzdGVwIGJhY2sKLSAgICAvLyBhbmQgZ2V0IGhvbGQgb2YgdGhlIGxhc3QgZWxlbWVudC4KLSAgICAvLwotICAgIC8vIEFkZGl0aW9uYWxseSwgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgcmVxdWVzdGVkIHNlY3RvciBpcwotICAgIC8vIGluZGVlZCB3aXRoaW4gdGhlIHJhbmdlIG9mIHRoZSBmaW5hbCBzZWN0b3IuIEl0IGlzIHBlcmZlY3RseSB2YWxpZAotICAgIC8vIHRvIGdldCBhbiBJL08gcmVxdWVzdCBmb3IgYmxvY2sgMyBhbmQgYmV5b25kIHdoaWNoIGFyZSBub3QgbWFwcGVkCi0gICAgLy8gdG8gYW55IENPVyBvcHMuIEluIHRoYXQgY2FzZSwgd2UganVzdCBuZWVkIHRvIHJlYWQgZnJvbSB0aGUgYmFzZQotICAgIC8vIGRldmljZS4KLSAgICBib29sIG1lcmdlX2NvbXBsZXRlID0gZmFsc2U7Ci0gICAgYm9vbCBoZWFkZXJfcmVzcG9uc2UgPSB0cnVlOwotICAgIGlmIChpdCA9PSBjaHVua192ZWMuZW5kKCkpIHsKLSAgICAgICAgaWYgKGNodW5rX3ZlYy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAvLyBJL08gcmVxdWVzdCBiZXlvbmQgdGhlIGxhc3QgbWFwcGVkIHNlY3RvcgotICAgICAgICAgICAgaXQgPSBzdGQ6OnByZXYoY2h1bmtfdmVjLmVuZCgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGEgcGFydGl0aW9uIG1lcmdlIGlzIGNvbXBsZXRlIGJ1dCBzbmFwc2hvdAotICAgICAgICAgICAgLy8gc3RhdGUgaW4gL21ldGFkYXRhIGlzIG5vdCB5ZXQgZGVsZXRlZDsgZHVyaW5nIHRoaXMgd2luZG93IGlmIHRoZQotICAgICAgICAgICAgLy8gZGV2aWNlIGlzIHJlYm9vdGVkLCBzdWJzZXF1ZW50IGF0dGVtcHQgd2lsbCBtb3VudCB0aGUgc25hcHNob3QuCi0gICAgICAgICAgICAvLyBIb3dldmVyLCBzaW5jZSB0aGUgbWVyZ2Ugd2FzIGNvbXBsZXRlZCB3ZSB3b3VsZG4ndCBoYXZlIGFueQotICAgICAgICAgICAgLy8gbWFwcGluZyB0byBDT1cgb3BzIHRodXMgY2h1bmtfdmVjIHdpbGwgYmUgZW1wdHkuIEluIHRoYXQgY2FzZSwKLSAgICAgICAgICAgIC8vIG1hcmsgdGhpcyBhcyBtZXJnZV9jb21wbGV0ZSBhbmQgcm91dGUgdGhlIEkvTyB0byB0aGUgYmFzZSBkZXZpY2UuCi0gICAgICAgICAgICBtZXJnZV9jb21wbGV0ZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGl0LT5maXJzdCAhPSBzZWN0b3IpIHsKLSAgICAgICAgaWYgKGl0ICE9IGNodW5rX3ZlYy5iZWdpbigpKSB7Ci0gICAgICAgICAgICAtLWl0OwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIFJlYWRBbGlnbmVkU2VjdG9yKHNlY3Rvciwgc2l6ZSwgaGVhZGVyX3Jlc3BvbnNlKTsKLSAgICB9Ci0KLSAgICBsb2ZmX3QgcmVxdWVzdGVkX29mZnNldCA9IHNlY3RvciA8PCBTRUNUT1JfU0hJRlQ7Ci0KLSAgICBsb2ZmX3QgZmluYWxfb2Zmc2V0ID0gMDsKLSAgICBpZiAoIW1lcmdlX2NvbXBsZXRlKSB7Ci0gICAgICAgIGZpbmFsX29mZnNldCA9IGl0LT5maXJzdCA8PCBTRUNUT1JfU0hJRlQ7Ci0gICAgfQotCi0gICAgLy8gU2luY2UgYSBDT1cgb3Agc3BhbiA0ayBibG9jayBzaXplLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSByZXF1ZXN0ZWQKLSAgICAvLyBvZmZzZXQgaXMgd2l0aGluIHRoZSA0ayByZWdpb24uIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgY2FzZToKLSAgICAvLwotICAgIC8vIHwtLS0tLS0tfC0tLS0tLS18LS0tLS0tLXwKLSAgICAvLyAwICAgICAgIDEgICAgICAgMiAgICAgICAzCi0gICAgLy8KLSAgICAvLyBCbG9jayAwIC0gb3AgMQotICAgIC8vIEJsb2NrIDEgLSBvcCAyCi0gICAgLy8KLSAgICAvLyBXZSBoYXZlIGFuIEkvTyByZXF1ZXN0IGZvciBhIHNlY3RvciBiZXR3ZWVuIGJsb2NrIDIgYW5kIGJsb2NrIDMuIEhvd2V2ZXIsCi0gICAgLy8gd2UgaGF2ZSBtYXBwaW5nIHRvIENPVyBvcHMgb25seSBmb3IgYmxvY2sgMCBhbmQgYmxvY2sgMS4gVGh1cywgdGhlCi0gICAgLy8gcmVxdWVzdGVkIG9mZnNldCBpbiB0aGlzIGNhc2UgaXMgYmV5b25kIHRoZSBsYXN0IG1hcHBlZCBDT1cgb3Agc2l6ZSAod2hpY2gKLSAgICAvLyBpcyBibG9jayAxIGluIHRoaXMgY2FzZSkuCi0KLSAgICBzaXplX3QgdG90YWxfYnl0ZXNfcmVhZCA9IDA7Ci0gICAgc2l6ZV90IHJlbWFpbmluZ19zaXplID0gc2l6ZTsKLSAgICBpbnQgcmV0ID0gMDsKLSAgICBpZiAoIW1lcmdlX2NvbXBsZXRlICYmIChyZXF1ZXN0ZWRfb2Zmc2V0ID49IGZpbmFsX29mZnNldCkgJiYKLSAgICAgICAgKHJlcXVlc3RlZF9vZmZzZXQgLSBmaW5hbF9vZmZzZXQpIDwgQkxPQ0tfU1opIHsKLSAgICAgICAgLy8gUmVhZCB0aGUgcGFydGlhbCB1bi1hbGlnbmVkIGRhdGEKLSAgICAgICAgcmV0ID0gUmVhZFVuYWxpZ25lZFNlY3RvcihzZWN0b3IsIHJlbWFpbmluZ19zaXplLCBpdCk7Ci0gICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlJlYWRVbmFsaWduZWRTZWN0b3IgZmFpbGVkIGZvciBzZWN0b3I6ICIgPDwgc2VjdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBzaXplOiAiIDw8IHNpemUgPDwgIiBpdC0+c2VjdG9yOiAiIDw8IGl0LT5maXJzdDsKLSAgICAgICAgICAgIHJldHVybiBSZXNwb25kSU9FcnJvcihoZWFkZXJfcmVzcG9uc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVtYWluaW5nX3NpemUgLT0gcmV0OwotICAgICAgICB0b3RhbF9ieXRlc19yZWFkICs9IHJldDsKLSAgICAgICAgc2VjdG9yICs9IChyZXQgPj4gU0VDVE9SX1NISUZUKTsKLQotICAgICAgICAvLyBTZW5kIHRoZSBkYXRhIGJhY2sKLSAgICAgICAgaWYgKCFXcml0ZURtVXNlclBheWxvYWQodG90YWxfYnl0ZXNfcmVhZCwgaGVhZGVyX3Jlc3BvbnNlKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaGVhZGVyX3Jlc3BvbnNlID0gZmFsc2U7Ci0gICAgICAgIC8vIElmIHdlIHN0aWxsIGhhdmUgcGVuZGluZyBkYXRhIHRvIGJlIHByb2Nlc3NlZCwgdGhpcyB3aWxsIGJlIGFsaWduZWQgSS9PCi0gICAgICAgIGlmIChyZW1haW5pbmdfc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIFJlYWRBbGlnbmVkU2VjdG9yKHNlY3RvciwgcmVtYWluaW5nX3NpemUsIGhlYWRlcl9yZXNwb25zZSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICAvLyBUaGlzIGlzIGFsbCBhYm91dCBoYW5kbGluZyBJL08gcmVxdWVzdCB0byBiZSByb3V0ZWQgdG8gYmFzZSBkZXZpY2UKLSAgICAgICAgLy8gYXMgdGhlIEkvTyBpcyBub3QgbWFwcGVkIHRvIGFueSBvZiB0aGUgQ09XIG9wcy4KLSAgICAgICAgbG9mZl90IGFsaWduZWRfb2Zmc2V0ID0gcmVxdWVzdGVkX29mZnNldDsKLSAgICAgICAgLy8gQWxpZ24gdG8gbmVhcmVzdCA0awotICAgICAgICBhbGlnbmVkX29mZnNldCArPSBCTE9DS19TWiAtIDE7Ci0gICAgICAgIGFsaWduZWRfb2Zmc2V0ICY9IH4oQkxPQ0tfU1ogLSAxKTsKLSAgICAgICAgLy8gRmluZCB0aGUgZGlmZiBvZiB0aGUgYWxpZ25lZCBvZmZzZXQKLSAgICAgICAgc2l6ZV90IGRpZmZfc2l6ZSA9IGFsaWduZWRfb2Zmc2V0IC0gcmVxdWVzdGVkX29mZnNldDsKLSAgICAgICAgQ0hFQ0soZGlmZl9zaXplIDw9IEJMT0NLX1NaKTsKLSAgICAgICAgaWYgKHJlbWFpbmluZ19zaXplIDwgZGlmZl9zaXplKSB7Ci0gICAgICAgICAgICBpZiAoIVJlYWREYXRhRnJvbUJhc2VEZXZpY2Uoc2VjdG9yLCByZW1haW5pbmdfc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uZElPRXJyb3IoaGVhZGVyX3Jlc3BvbnNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRvdGFsX2J5dGVzX3JlYWQgKz0gcmVtYWluaW5nX3NpemU7Ci0KLSAgICAgICAgICAgIGlmICghV3JpdGVEbVVzZXJQYXlsb2FkKHRvdGFsX2J5dGVzX3JlYWQsIGhlYWRlcl9yZXNwb25zZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIVJlYWREYXRhRnJvbUJhc2VEZXZpY2Uoc2VjdG9yLCBkaWZmX3NpemUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbmRJT0Vycm9yKGhlYWRlcl9yZXNwb25zZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRvdGFsX2J5dGVzX3JlYWQgKz0gZGlmZl9zaXplOwotCi0gICAgICAgICAgICBpZiAoIVdyaXRlRG1Vc2VyUGF5bG9hZCh0b3RhbF9ieXRlc19yZWFkLCBoZWFkZXJfcmVzcG9uc2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZW1haW5pbmdfc2l6ZSAtPSBkaWZmX3NpemU7Ci0gICAgICAgICAgICBzaXplX3QgbnVtX3NlY3RvcnNfcmVhZCA9IChkaWZmX3NpemUgPj4gU0VDVE9SX1NISUZUKTsKLSAgICAgICAgICAgIHNlY3RvciArPSBudW1fc2VjdG9yc19yZWFkOwotICAgICAgICAgICAgQ0hFQ0soSXNCbG9ja0FsaWduZWQoc2VjdG9yIDw8IFNFQ1RPUl9TSElGVCkpOwotICAgICAgICAgICAgaGVhZGVyX3Jlc3BvbnNlID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIC8vIElmIHdlIHN0aWxsIGhhdmUgcGVuZGluZyBkYXRhIHRvIGJlIHByb2Nlc3NlZCwgdGhpcyB3aWxsIGJlIGFsaWduZWQgSS9PCi0gICAgICAgICAgICByZXR1cm4gUmVhZEFsaWduZWRTZWN0b3Ioc2VjdG9yLCByZW1haW5pbmdfc2l6ZSwgaGVhZGVyX3Jlc3BvbnNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFdvcmtlcjo6UmVzcG9uZElPRXJyb3IoYm9vbCBoZWFkZXJfcmVzcG9uc2UpIHsKLSAgICBzdHJ1Y3QgZG1fdXNlcl9oZWFkZXIqIGhlYWRlciA9IGJ1ZnNpbmtfLkdldEhlYWRlclB0cigpOwotICAgIGhlYWRlci0+dHlwZSA9IERNX1VTRVJfUkVTUF9FUlJPUjsKLSAgICAvLyBUaGlzIGlzIGFuIGlzc3VlIHdpdGggdGhlIGRtLXVzZXIgaW50ZXJmYWNlLiBUaGVyZQotICAgIC8vIGlzIG5vIHdheSB0byBwcm9wYWdhdGUgdGhlIEkvTyBlcnJvciBiYWNrIHRvIGRtLXVzZXIKLSAgICAvLyBpZiB3ZSBoYXZlIGFscmVhZHkgY29tbXVuaWNhdGVkIHRoZSBoZWFkZXIgYmFjay4gSGVhZGVyCi0gICAgLy8gaXMgcmVzcG9uZGVkIG9uY2UgYXQgdGhlIGJlZ2lubmluZzsgaG93ZXZlciBJL08gY2FuCi0gICAgLy8gYmUgcHJvY2Vzc2VkIGluIGNodW5rcy4gSWYgd2UgZW5jb3VudGVyIGFuIEkvTyBlcnJvcgotICAgIC8vIHNvbWV3aGVyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBwcm9jZXNzaW5nLCB3ZSBjYW4ndCBjb21tdW5pY2F0ZQotICAgIC8vIHRoaXMgYmFjayB0byBkbS11c2VyLgotICAgIC8vCi0gICAgLy8gVE9ETzogRml4IHRoZSBpbnRlcmZhY2UKLSAgICBDSEVDSyhoZWFkZXJfcmVzcG9uc2UpOwotCi0gICAgaWYgKCFXcml0ZURtVXNlclBheWxvYWQoMCwgaGVhZGVyX3Jlc3BvbnNlKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byBwcm9jZXNzIGZ1cnRoZXIgYXMgd2UgaGF2ZSBhbHJlYWR5IHNlZW4KLSAgICAvLyBhbiBJL08gZXJyb3IKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBXb3JrZXI6OkRtdXNlclJlYWRSZXF1ZXN0KCkgewotICAgIHN0cnVjdCBkbV91c2VyX2hlYWRlciogaGVhZGVyID0gYnVmc2lua18uR2V0SGVhZGVyUHRyKCk7Ci0KLSAgICAvLyBVbmFsaWduZWQgSS9PIHJlcXVlc3QKLSAgICBpZiAoIUlzQmxvY2tBbGlnbmVkKGhlYWRlci0+c2VjdG9yIDw8IFNFQ1RPUl9TSElGVCkpIHsKLSAgICAgICAgcmV0dXJuIFJlYWRVbmFsaWduZWRTZWN0b3IoaGVhZGVyLT5zZWN0b3IsIGhlYWRlci0+bGVuKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gUmVhZEFsaWduZWRTZWN0b3IoaGVhZGVyLT5zZWN0b3IsIGhlYWRlci0+bGVuLCB0cnVlKTsKLX0KLQotYm9vbCBXb3JrZXI6OlByb2Nlc3NJT1JlcXVlc3QoKSB7Ci0gICAgc3RydWN0IGRtX3VzZXJfaGVhZGVyKiBoZWFkZXIgPSBidWZzaW5rXy5HZXRIZWFkZXJQdHIoKTsKLQotICAgIGlmICghUmVhZERtVXNlckhlYWRlcigpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBTTkFQX0xPRyhERUJVRykgPDwgIkRhZW1vbjogbXNnLT5zZXE6ICIgPDwgc3RkOjpkZWMgPDwgaGVhZGVyLT5zZXE7Ci0gICAgU05BUF9MT0coREVCVUcpIDw8ICJEYWVtb246IG1zZy0+bGVuOiAiIDw8IHN0ZDo6ZGVjIDw8IGhlYWRlci0+bGVuOwotICAgIFNOQVBfTE9HKERFQlVHKSA8PCAiRGFlbW9uOiBtc2ctPnNlY3RvcjogIiA8PCBzdGQ6OmRlYyA8PCBoZWFkZXItPnNlY3RvcjsKLSAgICBTTkFQX0xPRyhERUJVRykgPDwgIkRhZW1vbjogbXNnLT50eXBlOiAiIDw8IHN0ZDo6ZGVjIDw8IGhlYWRlci0+dHlwZTsKLSAgICBTTkFQX0xPRyhERUJVRykgPDwgIkRhZW1vbjogbXNnLT5mbGFnczogIiA8PCBzdGQ6OmRlYyA8PCBoZWFkZXItPmZsYWdzOwotCi0gICAgc3dpdGNoIChoZWFkZXItPnR5cGUpIHsKLSAgICAgICAgY2FzZSBETV9VU0VSX1JFUV9NQVBfUkVBRDogewotICAgICAgICAgICAgaWYgKCFEbXVzZXJSZWFkUmVxdWVzdCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIERNX1VTRVJfUkVRX01BUF9XUklURTogewotICAgICAgICAgICAgLy8gVE9ETzogV2Ugc2hvdWxkIG5vdCBnZXQgYW55IHdyaXRlIHJlcXVlc3QKLSAgICAgICAgICAgIC8vIHRvIGRtLXVzZXIgYXMgd2UgbW91bnQgYWxsIHBhcnRpdGlvbnMKLSAgICAgICAgICAgIC8vIGFzIHJlYWQtb25seS4gTmVlZCB0byB2ZXJpZnkgaG93IGFyZSBUUklNIGNvbW1hbmRzCi0gICAgICAgICAgICAvLyBoYW5kbGVkIGR1cmluZyBtb3VudC4KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX3JlYWRhaGVhZC5jcHAgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX3JlYWRhaGVhZC5jcHAKaW5kZXggZmJlNTdkMi4uMzAwN2Q0NSAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL3NuYXB1c2VyZF9yZWFkYWhlYWQuY3BwCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfcmVhZGFoZWFkLmNwcApAQCAtMTQsNyArMTQsMTMgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlICJzbmFwdXNlcmRfcmVhZGFoZWFkLmgiCisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNpbmNsdWRlICJhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oIgogI2luY2x1ZGUgInNuYXB1c2VyZF9jb3JlLmgiCisjaW5jbHVkZSAidXRpbGl0eS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2Ugc25hcHNob3QgewpAQCAtMjQsMjIgKzMwLDI3IEBACiB1c2luZyBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQ7CiAKIFJlYWRBaGVhZDo6UmVhZEFoZWFkKGNvbnN0IHN0ZDo6c3RyaW5nJiBjb3dfZGV2aWNlLCBjb25zdCBzdGQ6OnN0cmluZyYgYmFja2luZ19kZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lLCBzdGQ6OnNoYXJlZF9wdHI8U25hcHNob3RIYW5kbGVyPiBzbmFwdXNlcmQpIHsKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUsIHN0ZDo6c2hhcmVkX3B0cjxTbmFwc2hvdEhhbmRsZXI+IHNuYXB1c2VyZCwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvd19vcF9tZXJnZV9zaXplKSB7CiAgICAgY293X2RldmljZV8gPSBjb3dfZGV2aWNlOwogICAgIGJhY2tpbmdfc3RvcmVfZGV2aWNlXyA9IGJhY2tpbmdfZGV2aWNlOwogICAgIG1pc2NfbmFtZV8gPSBtaXNjX25hbWU7CiAgICAgc25hcHVzZXJkXyA9IHNuYXB1c2VyZDsKKyAgICBjb3dfb3BfbWVyZ2Vfc2l6ZV8gPSBjb3dfb3BfbWVyZ2Vfc2l6ZTsKIH0KIAogdm9pZCBSZWFkQWhlYWQ6OkNoZWNrT3ZlcmxhcChjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCkgewotICAgIHVpbnQ2NF90IHNvdXJjZV9ibG9jayA9IGNvd19vcC0+c291cmNlOwotICAgIHVpbnQ2NF90IHNvdXJjZV9vZmZzZXQgPSAwOwotICAgIGlmIChjb3dfb3AtPnR5cGUgPT0ga0Nvd1hvck9wKSB7Ci0gICAgICAgIHNvdXJjZV9ibG9jayAvPSBCTE9DS19TWjsKLSAgICAgICAgc291cmNlX29mZnNldCA9IGNvd19vcC0+c291cmNlICUgQkxPQ0tfU1o7CisgICAgdWludDY0X3Qgc291cmNlX29mZnNldDsKKyAgICBpZiAoIXJlYWRlcl8tPkdldFNvdXJjZU9mZnNldChjb3dfb3AsICZzb3VyY2Vfb2Zmc2V0KSkgeworICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlJlYWRBaGVhZCBvcGVyYXRpb24gaGFzIG5vIHNvdXJjZSBvZmZzZXQ6ICIgPDwgKmNvd19vcDsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KKworICAgIHVpbnQ2NF90IHNvdXJjZV9ibG9jayA9IEdldEJsb2NrRnJvbU9mZnNldChoZWFkZXJfLCBzb3VyY2Vfb2Zmc2V0KTsKKyAgICBib29sIG1pc2FsaWduZWQgPSAoR2V0QmxvY2tSZWxhdGl2ZU9mZnNldChoZWFkZXJfLCBzb3VyY2Vfb2Zmc2V0KSAhPSAwKTsKKwogICAgIGlmIChkZXN0X2Jsb2Nrc18uY291bnQoY293X29wLT5uZXdfYmxvY2spIHx8IHNvdXJjZV9ibG9ja3NfLmNvdW50KHNvdXJjZV9ibG9jaykgfHwKLSAgICAgICAgKHNvdXJjZV9vZmZzZXQgPiAwICYmIHNvdXJjZV9ibG9ja3NfLmNvdW50KHNvdXJjZV9ibG9jayArIDEpKSkgeworICAgICAgICAobWlzYWxpZ25lZCAmJiBzb3VyY2VfYmxvY2tzXy5jb3VudChzb3VyY2VfYmxvY2sgKyAxKSkpIHsKICAgICAgICAgb3ZlcmxhcF8gPSB0cnVlOwogICAgIH0KIApAQCAtNTQsOCArNjUsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiYgYmxvY2tzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgQ293T3BlcmF0aW9uKj4mIHhvcl9vcF92ZWMpIHsKICAgICBpbnQgbnVtX29wcyA9ICpwZW5kaW5nX29wczsKLSAgICBpbnQgbnJfY29uc2VjdXRpdmUgPSAwOworICAgIGlmIChjb3dfb3BfbWVyZ2Vfc2l6ZV8gIT0gMCkgeworICAgICAgICBudW1fb3BzID0gc3RkOjptaW4oc3RhdGljX2Nhc3Q8aW50Pihjb3dfb3BfbWVyZ2Vfc2l6ZV8pLCAqcGVuZGluZ19vcHMpOworICAgIH0KIAorICAgIGludCBucl9jb25zZWN1dGl2ZSA9IDA7CiAgICAgYm9vbCBpc19vcHNfcHJlc2VudCA9ICghUkFJdGVyRG9uZSgpICYmIG51bV9vcHMpOwogCiAgICAgaWYgKCFpc19vcHNfcHJlc2VudCkgewpAQCAtNjQsMTEgKzc4LDEyIEBACiAKICAgICAvLyBHZXQgdGhlIGZpcnN0IGJsb2NrIHdpdGggb2Zmc2V0CiAgICAgY29uc3QgQ293T3BlcmF0aW9uKiBjb3dfb3AgPSBHZXRSQU9wSXRlcigpOwotICAgICpzb3VyY2Vfb2Zmc2V0ID0gY293X29wLT5zb3VyY2U7CiAKLSAgICBpZiAoY293X29wLT50eXBlID09IGtDb3dDb3B5T3ApIHsKLSAgICAgICAgKnNvdXJjZV9vZmZzZXQgKj0gQkxPQ0tfU1o7Ci0gICAgfSBlbHNlIGlmIChjb3dfb3AtPnR5cGUgPT0ga0Nvd1hvck9wKSB7CisgICAgaWYgKCFyZWFkZXJfLT5HZXRTb3VyY2VPZmZzZXQoY293X29wLCBzb3VyY2Vfb2Zmc2V0KSkgeworICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlByZXBhcmVOZXh0UmVhZEFoZWFkIG9wZXJhdGlvbiBoYXMgbm8gc291cmNlIG9mZnNldDogIiA8PCAqY293X29wOworICAgICAgICByZXR1cm4gbnJfY29uc2VjdXRpdmU7CisgICAgfQorICAgIGlmIChjb3dfb3AtPnR5cGUoKSA9PSBrQ293WG9yT3ApIHsKICAgICAgICAgeG9yX29wX3ZlYy5wdXNoX2JhY2soY293X29wKTsKICAgICB9CiAKQEAgLTg2LDEwICsxMDEsMTAgQEAKICAgICAgKi8KICAgICB3aGlsZSAoIVJBSXRlckRvbmUoKSAmJiBudW1fb3BzKSB7CiAgICAgICAgIGNvbnN0IENvd09wZXJhdGlvbiogb3AgPSBHZXRSQU9wSXRlcigpOwotICAgICAgICB1aW50NjRfdCBuZXh0X29mZnNldCA9IG9wLT5zb3VyY2U7Ci0KLSAgICAgICAgaWYgKGNvd19vcC0+dHlwZSA9PSBrQ293Q29weU9wKSB7Ci0gICAgICAgICAgICBuZXh0X29mZnNldCAqPSBCTE9DS19TWjsKKyAgICAgICAgdWludDY0X3QgbmV4dF9vZmZzZXQ7CisgICAgICAgIGlmICghcmVhZGVyXy0+R2V0U291cmNlT2Zmc2V0KG9wLCAmbmV4dF9vZmZzZXQpKSB7CisgICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlByZXBhcmVOZXh0UmVhZEFoZWFkIG9wZXJhdGlvbiBoYXMgbm8gc291cmNlIG9mZnNldDogIiA8PCAqY293X29wOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBDaGVjayBmb3IgY29uc2VjdXRpdmUgYmxvY2tzCkBAIC05Nyw3ICsxMTIsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAob3AtPnR5cGUgPT0ga0Nvd1hvck9wKSB7CisgICAgICAgIGlmIChvcC0+dHlwZSgpID09IGtDb3dYb3JPcCkgewogICAgICAgICAgICAgeG9yX29wX3ZlYy5wdXNoX2JhY2sob3ApOwogICAgICAgICB9CiAKQEAgLTExNCw2ICsxMjksMjQgQEAKICAgICByZXR1cm4gbnJfY29uc2VjdXRpdmU7CiB9CiAKK2NsYXNzIFtbbm9kaXNjYXJkXV0gQXV0b05vdGlmeVJlYWRBaGVhZEZhaWxlZCB7CisgIHB1YmxpYzoKKyAgICBBdXRvTm90aWZ5UmVhZEFoZWFkRmFpbGVkKHN0ZDo6c2hhcmVkX3B0cjxTbmFwc2hvdEhhbmRsZXI+IHNuYXB1c2VyZCkgOiBzbmFwdXNlcmRfKHNuYXB1c2VyZCkge30KKworICAgIH5BdXRvTm90aWZ5UmVhZEFoZWFkRmFpbGVkKCkgeworICAgICAgICBpZiAoY2FuY2VsbGVkXykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNuYXB1c2VyZF8tPlJlYWRBaGVhZElPRmFpbGVkKCk7CisgICAgfQorCisgICAgdm9pZCBDYW5jZWwoKSB7IGNhbmNlbGxlZF8gPSB0cnVlOyB9CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U25hcHNob3RIYW5kbGVyPiBzbmFwdXNlcmRfOworICAgIGJvb2wgY2FuY2VsbGVkXyA9IGZhbHNlOworfTsKKwogYm9vbCBSZWFkQWhlYWQ6OlJlY29uc3RydWN0RGF0YUZyb21Db3coKSB7CiAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCB2b2lkKj4mIHJlYWRfYWhlYWRfYnVmZmVyX21hcCA9IHNuYXB1c2VyZF8tPkdldFJlYWRBaGVhZE1hcCgpOwogICAgIGxvZmZfdCBtZXRhZGF0YV9vZmZzZXQgPSAwOwpAQCAtMTQ1LDYgKzE3OCw4IEBACiAgICAgICAgIG1ldGFkYXRhX29mZnNldCArPSBzaXplb2Yoc3RydWN0IFNjcmF0Y2hNZXRhZGF0YSk7CiAgICAgfQogCisgICAgQXV0b05vdGlmeVJlYWRBaGVhZEZhaWxlZCBub3RpZnlfcmVhZF9haGVhZF9mYWlsZWQoc25hcHVzZXJkXyk7CisKICAgICAvLyBXZSBhcmUgZG9uZSByZS1jb25zdHJ1Y3RpbmcgdGhlIG1hcHBpbmc7IGhvd2V2ZXIsIHdlIG5lZWQgdG8gbWFrZSBzdXJlCiAgICAgLy8gYWxsIHRoZSBDT1cgb3BlcmF0aW9ucyB0by1iZSBtZXJnZWQgYXJlIHByZXNlbnQgaW4gdGhlIHJlLWNvbnN0cnVjdGVkCiAgICAgLy8gbWFwcGluZy4KQEAgLTE2Miw3ICsxOTcsNiBAQAogICAgICAgICBpZiAoIShudW1fb3BzID09IDApKSB7CiAgICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlJlY29uc3RydWN0RGF0YUZyb21Db3cgZmFpbGVkLiBOb3QgYWxsIG9wcyByZWNvdmVyZCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBQZW5kaW5nIG9wczogIiA8PCBudW1fb3BzOwotICAgICAgICAgICAgc25hcHVzZXJkXy0+UmVhZEFoZWFkSU9GYWlsZWQoKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCkBAIC0xNzUsMTEgKzIwOSwxMiBAQAogCiAgICAgaWYgKCFzbmFwdXNlcmRfLT5SZWFkQWhlYWRJT0NvbXBsZXRlZCh0cnVlKSkgewogICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlJlYWRBaGVhZElPQ29tcGxldGVkIGZhaWxlZC4uLiI7Ci0gICAgICAgIHNuYXB1c2VyZF8tPlJlYWRBaGVhZElPRmFpbGVkKCk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICBzbmFwdXNlcmRfLT5SYVRocmVhZFN0YXJ0ZWQoKTsKICAgICBTTkFQX0xPRyhJTkZPKSA8PCAiUmVjb25zdHJ1Y3REYXRhRnJvbUNvdyBzdWNjZXNzIjsKKyAgICBub3RpZnlfcmVhZF9haGVhZF9mYWlsZWQuQ2FuY2VsKCk7CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKQEAgLTQwMiw3ICs0MzcsNyBAQAogICAgICAgICAvLyB3aWxsIGZhbGxiYWNrIHRvIHN5bmNocm9ub3VzIEkvTy4KICAgICAgICAgaW50IHJldCA9IGlvX3VyaW5nX3dhaXRfY3FlKHJpbmdfLmdldCgpLCAmY3FlKTsKICAgICAgICAgaWYgKHJldCkgewotICAgICAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJSZWFkLWFoZWFkIC0gaW9fdXJpbmdfd2FpdF9jcWUgZmFpbGVkOiAiIDw8IHJldDsKKyAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUmVhZC1haGVhZCAtIGlvX3VyaW5nX3dhaXRfY3FlIGZhaWxlZDogIiA8PCBzdHJlcnJvcigtcmV0KTsKICAgICAgICAgICAgIHN0YXR1cyA9IGZhbHNlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTQyMyw2ICs0NTgsNyBAQAogdm9pZCBSZWFkQWhlYWQ6OlByb2Nlc3NYb3JEYXRhKHNpemVfdCYgYmxvY2tfeG9yX2luZGV4LCBzaXplX3QmIHhvcl9pbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBDb3dPcGVyYXRpb24qPiYgeG9yX29wX3ZlYywgdm9pZCogYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZmZfdCYgYnVmZmVyX29mZnNldCkgeworICAgIHVzaW5nIFdvcmRUeXBlID0gc3RkOjpjb25kaXRpb25hbF90PHNpemVvZih2b2lkKikgPT0gc2l6ZW9mKHVpbnQ2NF90KSwgdWludDY0X3QsIHVpbnQzMl90PjsKICAgICBsb2ZmX3QgeG9yX2J1Zl9vZmZzZXQgPSAwOwogCiAgICAgd2hpbGUgKGJsb2NrX3hvcl9pbmRleCA8IGJsb2Nrc18uc2l6ZSgpKSB7CkBAIC00MzUsMTMgKzQ3MSwxNCBAQAogICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBibG9jayBpcyBhbiBYT1Igb3AKICAgICAgICAgICAgIGlmICh4b3Jfb3AtPm5ld19ibG9jayA9PSBuZXdfYmxvY2spIHsKICAgICAgICAgICAgICAgICAvLyBQb2ludGVyIHRvIHRoZSBkYXRhIHJlYWQgZnJvbSBiYXNlIGRldmljZQotICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGJ1ZnB0cik7CisgICAgICAgICAgICAgICAgYXV0byBidWZmZXJfd29yZHMgPSByZWludGVycHJldF9jYXN0PFdvcmRUeXBlKj4oYnVmcHRyKTsKICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHhvcidlZCBkYXRhIHJlYWQgZnJvbSBDT1cgZGV2aWNlCi0gICAgICAgICAgICAgICAgdWludDhfdCogeG9yX2RhdGEgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigoY2hhciopYnVmc2lua18uR2V0UGF5bG9hZEJ1ZlB0cigpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhvcl9idWZfb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBhdXRvIHhvcl9kYXRhX3dvcmRzID0gcmVpbnRlcnByZXRfY2FzdDxXb3JkVHlwZSo+KAorICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKWJ1ZnNpbmtfLkdldFBheWxvYWRCdWZQdHIoKSArIHhvcl9idWZfb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBhdXRvIG51bV93b3JkcyA9IEJMT0NLX1NaIC8gc2l6ZW9mKFdvcmRUeXBlKTsKIAotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGJ5dGVfb2Zmc2V0ID0gMDsgYnl0ZV9vZmZzZXQgPCBCTE9DS19TWjsgYnl0ZV9vZmZzZXQrKykgewotICAgICAgICAgICAgICAgICAgICBidWZmZXJbYnl0ZV9vZmZzZXRdIF49IHhvcl9kYXRhW2J5dGVfb2Zmc2V0XTsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8gaSA9IDA7IGkgPCBudW1fd29yZHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBidWZmZXJfd29yZHNbaV0gXj0geG9yX2RhdGFfd29yZHNbaV07CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gTW92ZSB0byBuZXh0IFhPUiBvcApAQCAtNDY3LDE0ICs1MDQsMjAgQEAKICAgICAgICAgaWYgKHhvcl9vcF9pbmRleCA8IHhvcl9vcF92ZWMuc2l6ZSgpKSB7CiAgICAgICAgICAgICBjb25zdCBDb3dPcGVyYXRpb24qIHhvcl9vcCA9IHhvcl9vcF92ZWNbeG9yX29wX2luZGV4XTsKICAgICAgICAgICAgIGlmICh4b3Jfb3AtPm5ld19ibG9jayA9PSBuZXdfYmxvY2spIHsKLSAgICAgICAgICAgICAgICBpZiAoIXJlYWRlcl8tPlJlYWREYXRhKCp4b3Jfb3AsICZidWZzaW5rXykpIHsKKyAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIgPSBidWZzaW5rXy5BY3F1aXJlQnVmZmVyKEJMT0NLX1NaKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlJlYWRBaGVhZCAtIGZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgZm9yIGJsb2NrOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB4b3Jfb3AtPm5ld19ibG9jazsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3NpemVfdCBydiA9IHJlYWRlcl8tPlJlYWREYXRhKHhvcl9vcCwgYnVmZmVyLCBCTE9DS19TWik7IHJ2ICE9IEJMT0NLX1NaKSB7CiAgICAgICAgICAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgUmVhZEFoZWFkIC0gWG9yT3AgUmVhZCBmYWlsZWQgZm9yIGJsb2NrOiAiIDw8IHhvcl9vcC0+bmV3X2Jsb2NrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgUmVhZEFoZWFkIC0gWG9yT3AgUmVhZCBmYWlsZWQgZm9yIGJsb2NrOiAiIDw8IHhvcl9vcC0+bmV3X2Jsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgcmV0dXJuIHZhbHVlOiAiIDw8IHJ2OwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgeG9yX29wX2luZGV4ICs9IDE7Ci0gICAgICAgICAgICAgICAgYnVmc2lua18uVXBkYXRlQnVmZmVyT2Zmc2V0KEJMT0NLX1NaKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBibG9ja19pbmRleCArPSAxOwpAQCAtNDkyLDYgKzUzNSw4IEBACiAgICAgYmxvY2tzXy5jbGVhcigpOwogICAgIHN0ZDo6dmVjdG9yPGNvbnN0IENvd09wZXJhdGlvbio+IHhvcl9vcF92ZWM7CiAKKyAgICBBdXRvTm90aWZ5UmVhZEFoZWFkRmFpbGVkIG5vdGlmeV9yZWFkX2FoZWFkX2ZhaWxlZChzbmFwdXNlcmRfKTsKKwogICAgIGJ1ZnNpbmtfLlJlc2V0QnVmZmVyT2Zmc2V0KCk7CiAKICAgICAvLyBOdW1iZXIgb2Ygb3BzIHRvIGJlIG1lcmdlZCBpbiB0aGlzIHdpbmRvdy4gVGhpcyBpcyBhIGZpeGVkIHNpemUKQEAgLTUxOCw4ICs1NjMsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIG9mZnNldCA6IiA8PCBzb3VyY2Vfb2Zmc2V0ICUgQkxPQ0tfU1oKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBidWZmZXJfb2Zmc2V0IDogIiA8PCBidWZmZXJfb2Zmc2V0IDw8ICIgaW9fc2l6ZSA6ICIgPDwgaW9fc2l6ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGJ1Zi1hZGRyIDogIiA8PCByZWFkX2FoZWFkX2J1ZmZlcl87Ci0KLSAgICAgICAgICAgIHNuYXB1c2VyZF8tPlJlYWRBaGVhZElPRmFpbGVkKCk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIApAQCAtNTMwLDYgKzU3Myw3IEBACiAKICAgICAvLyBEb25lIHdpdGggbWVyZ2luZyBvcmRlcmVkIG9wcwogICAgIGlmIChSQUl0ZXJEb25lKCkgJiYgdG90YWxfYmxvY2tzX21lcmdlZF8gPT0gMCkgeworICAgICAgICBub3RpZnlfcmVhZF9haGVhZF9mYWlsZWQuQ2FuY2VsKCk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIApAQCAtNTYwLDIwICs2MDQsMjUgQEAKICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgYmxvY2sgaXMgYW4gWE9SIG9wCiAgICAgICAgICAgICBpZiAoeG9yX29wLT5uZXdfYmxvY2sgPT0gbmV3X2Jsb2NrKSB7CiAgICAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgeG9yJ2VkIGRhdGEgZnJvbSBDT1cKLSAgICAgICAgICAgICAgICBpZiAoIXJlYWRlcl8tPlJlYWREYXRhKCp4b3Jfb3AsICZidWZzaW5rKSkgeworICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciA9IGJ1ZnNpbmsuR2V0UGF5bG9hZEJ1ZmZlcihCTE9DS19TWik7CisgICAgICAgICAgICAgICAgaWYgKCFidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJSZWFkQWhlYWQgLSBmYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3NpemVfdCBydiA9IHJlYWRlcl8tPlJlYWREYXRhKHhvcl9vcCwgYnVmZmVyLCBCTE9DS19TWik7IHJ2ICE9IEJMT0NLX1NaKSB7CiAgICAgICAgICAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgUmVhZEFoZWFkIC0gWG9yT3AgUmVhZCBmYWlsZWQgZm9yIGJsb2NrOiAiIDw8IHhvcl9vcC0+bmV3X2Jsb2NrOwotICAgICAgICAgICAgICAgICAgICBzbmFwdXNlcmRfLT5SZWFkQWhlYWRJT0ZhaWxlZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgUmVhZEFoZWFkIC0gWG9yT3AgUmVhZCBmYWlsZWQgZm9yIGJsb2NrOiAiIDw8IHhvcl9vcC0+bmV3X2Jsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgcmV0dXJuIHZhbHVlOiAiIDw8IHJ2OwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gdGhlIGRhdGEgcmVhZCBmcm9tIGJhc2UgZGV2aWNlCi0gICAgICAgICAgICAgICAgdWludDhfdCogYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oYnVmcHRyKTsKKyAgICAgICAgICAgICAgICB1aW50OF90KiByZWFkX2J1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGJ1ZnB0cik7CiAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSB4b3InZWQgZGF0YSByZWFkIGZyb20gQ09XIGRldmljZQogICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHhvcl9kYXRhID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oYnVmc2luay5HZXRQYXlsb2FkQnVmUHRyKCkpOwogCiAgICAgICAgICAgICAgICAgLy8gUmV0cmlldmUgdGhlIG9yaWdpbmFsIGRhdGEKICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBieXRlX29mZnNldCA9IDA7IGJ5dGVfb2Zmc2V0IDwgQkxPQ0tfU1o7IGJ5dGVfb2Zmc2V0KyspIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyW2J5dGVfb2Zmc2V0XSBePSB4b3JfZGF0YVtieXRlX29mZnNldF07CisgICAgICAgICAgICAgICAgICAgIHJlYWRfYnVmZmVyW2J5dGVfb2Zmc2V0XSBePSB4b3JfZGF0YVtieXRlX29mZnNldF07CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gTW92ZSB0byBuZXh0IFhPUiBvcApAQCAtNjA0LDYgKzY1Myw3IEBACiAgICAgYm0tPm5ld19ibG9jayA9IDA7CiAgICAgYm0tPmZpbGVfb2Zmc2V0ID0gMDsKIAorICAgIG5vdGlmeV9yZWFkX2FoZWFkX2ZhaWxlZC5DYW5jZWwoKTsKICAgICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtNjUyLDYgKzcwMiw3IEBACiAgICAgLy8gd2luZG93LiBJZiB0aGVyZSBpcyBhIGNyYXNoIGR1cmluZyB0aGlzIHRpbWUgZnJhbWUsIG1lcmdlIHNob3VsZCByZXN1bWUKICAgICAvLyBiYXNlZCBvbiB0aGUgY29udGVudHMgb2YgdGhlIHNjcmF0Y2ggc3BhY2UuCiAgICAgaWYgKCFzbmFwdXNlcmRfLT5XYWl0Rm9yTWVyZ2VSZWFkeSgpKSB7CisgICAgICAgIFNOQVBfTE9HKFZFUkJPU0UpIDw8ICJSZWFkQWhlYWQgZmFpbGVkIHRvIHdhaXQgZm9yIG1lcmdlIHJlYWR5IjsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtNjc0LDkgKzcyNSwxMyBAQAogICAgIHRvdGFsX3JhX2Jsb2Nrc19jb21wbGV0ZWRfICs9IHRvdGFsX2Jsb2Nrc19tZXJnZWRfOwogICAgIHNuYXB1c2VyZF8tPlNldE1lcmdlZEJsb2NrQ291bnRGb3JOZXh0Q29tbWl0KHRvdGFsX2Jsb2Nrc19tZXJnZWRfKTsKIAotICAgIC8vIEZsdXNoIHRoZSBkYXRhIG9ubHkgaWYgd2UgaGF2ZSBhIG92ZXJsYXBwaW5nIGJsb2NrcyBpbiB0aGUgcmVnaW9uCisgICAgLy8gRmx1c2ggdGhlIHNjcmF0Y2ggZGF0YSAtIFRlY2huaWNhbGx5LCB3ZSBzaG91bGQgZmx1c2ggb25seSBmb3Igb3ZlcmxhcHBpbmcKKyAgICAvLyBibG9ja3M7IEhvd2V2ZXIsIHNpbmNlIHRoaXMgcmVnaW9uIGlzIG1tYXAnZWQsIHRoZSBkaXJ0eSBwYWdlcyBjYW4gc3RpbGwKKyAgICAvLyBnZXQgZmx1c2hlZCB0byBkaXNrIGF0IGFueSByYW5kb20gcG9pbnQgaW4gdGltZS4gSW5zdGVhZCwgbWFrZSBzdXJlCisgICAgLy8gdGhlIGRhdGEgaW4gc2NyYXRjaCBpcyBpbiB0aGUgY29ycmVjdCBzdGF0ZSBiZWZvcmUgbWVyZ2UgdGhyZWFkIHJlc3VtZXMuCisgICAgLy8KICAgICAvLyBOb3RpZnkgdGhlIE1lcmdlIHRocmVhZCB0byByZXN1bWUgbWVyZ2luZyB0aGlzIHdpbmRvdwotICAgIGlmICghc25hcHVzZXJkXy0+UmVhZEFoZWFkSU9Db21wbGV0ZWQob3ZlcmxhcF8pKSB7CisgICAgaWYgKCFzbmFwdXNlcmRfLT5SZWFkQWhlYWRJT0NvbXBsZXRlZCh0cnVlKSkgewogICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIlJlYWRBaGVhZElPQ29tcGxldGVkIGZhaWxlZC4uLiI7CiAgICAgICAgIHNuYXB1c2VyZF8tPlJlYWRBaGVhZElPRmFpbGVkKCk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTcxMyw2ICs3NjgsMTAgQEAKIH0KIAogYm9vbCBSZWFkQWhlYWQ6OlJ1blRocmVhZCgpIHsKKyAgICBTTkFQX0xPRyhJTkZPKSA8PCAiUmVhZEFoZWFkIHRocmVhZCBzdGFydGVkLiI7CisKKyAgICBwdGhyZWFkX3NldG5hbWVfbnAocHRocmVhZF9zZWxmKCksICJSZWFkQWhlYWQiKTsKKwogICAgIGlmICghSW5pdGlhbGl6ZUZkcygpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC03MjcsMTAgKzc4NiwxNSBAQAogCiAgICAgSW5pdGlhbGl6ZUlvdXJpbmcoKTsKIAotICAgIGlmIChzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIGdldHRpZCgpLCBrTmljZVZhbHVlRm9yTWVyZ2VUaHJlYWRzKSkgewotICAgICAgICBTTkFQX1BMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gc2V0IHByaW9yaXR5IGZvciBUSUQ6ICIgPDwgZ2V0dGlkKCk7CisgICAgaWYgKCFTZXRUaHJlYWRQcmlvcml0eShBTkRST0lEX1BSSU9SSVRZX0JBQ0tHUk9VTkQpKSB7CisgICAgICAgIFNOQVBfUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBzZXQgdGhyZWFkIHByaW9yaXR5IjsKICAgICB9CiAKKyAgICBpZiAoIVNldFByb2ZpbGVzKHsiQ1BVU0VUX1NQX0JBQ0tHUk9VTkQifSkpIHsKKyAgICAgICAgU05BUF9QTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGFzc2lnbiB0YXNrIHByb2ZpbGUgdG8gcmVhZGFoZWFkIHRocmVhZCI7CisgICAgfQorCisgICAgU05BUF9MT0coSU5GTykgPDwgIlJlYWRBaGVhZCBwcm9jZXNzaW5nLiI7CiAgICAgd2hpbGUgKCFSQUl0ZXJEb25lKCkpIHsKICAgICAgICAgaWYgKCFSZWFkQWhlYWRJT1N0YXJ0KCkpIHsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNzQxLDcgKzgwNSw3IEBACiAgICAgQ2xvc2VGZHMoKTsKICAgICByZWFkZXJfLT5DbG9zZUNvd0ZkKCk7CiAKLSAgICBTTkFQX0xPRyhJTkZPKSA8PCAiIFJlYWRBaGVhZCB0aHJlYWQgdGVybWluYXRpbmcuLi4uIjsKKyAgICBTTkFQX0xPRyhJTkZPKSA8PCAiIFJlYWRBaGVhZCB0aHJlYWQgdGVybWluYXRpbmcuIjsKICAgICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtNzY4LDYgKzgzMiw3IEBACiAgICAgaWYgKCFyZWFkZXJfLT5Jbml0Rm9yTWVyZ2Uoc3RkOjptb3ZlKGNvd19mZF8pKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQorICAgIGhlYWRlcl8gPSByZWFkZXJfLT5HZXRIZWFkZXIoKTsKICAgICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtNzc2LDcgKzg0MSw3IEBACiB9CiAKIGJvb2wgUmVhZEFoZWFkOjpSQUl0ZXJEb25lKCkgewotICAgIGlmIChjb3dvcF9pdGVyXy0+RG9uZSgpKSB7CisgICAgaWYgKGNvd29wX2l0ZXJfLT5BdEVuZCgpKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIApAQCAtNzk0LDE1ICs4NTksMTQgQEAKIH0KIAogdm9pZCBSZWFkQWhlYWQ6OlJBUmVzZXRJdGVyKHVpbnQ2NF90IG51bV9ibG9ja3MpIHsKLSAgICB3aGlsZSAobnVtX2Jsb2NrcyAmJiAhY293b3BfaXRlcl8tPlJEb25lKCkpIHsKKyAgICB3aGlsZSAobnVtX2Jsb2NrcyAmJiAhY293b3BfaXRlcl8tPkF0QmVnaW4oKSkgewogICAgICAgICBjb3dvcF9pdGVyXy0+UHJldigpOwogICAgICAgICBudW1fYmxvY2tzIC09IDE7CiAgICAgfQogfQogCiBjb25zdCBDb3dPcGVyYXRpb24qIFJlYWRBaGVhZDo6R2V0UkFPcEl0ZXIoKSB7Ci0gICAgY29uc3QgQ293T3BlcmF0aW9uKiBjb3dfb3AgPSAmY293b3BfaXRlcl8tPkdldCgpOwotICAgIHJldHVybiBjb3dfb3A7CisgICAgcmV0dXJuIGNvd29wX2l0ZXJfLT5HZXQoKTsKIH0KIAogdm9pZCBSZWFkQWhlYWQ6OkluaXRpYWxpemVCdWZmZXIoKSB7CmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX3JlYWRhaGVhZC5oIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL3NuYXB1c2VyZF9yZWFkYWhlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODg1Yzk2Ci0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL3NuYXB1c2VyZF9yZWFkYWhlYWQuaApAQCAtMCwwICsxLDExNSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgorI2luY2x1ZGUgPGxpYnNuYXBzaG90L2Nvd19yZWFkZXIuaD4KKyNpbmNsdWRlIDxsaWJ1cmluZy5oPgorI2luY2x1ZGUgPHNuYXB1c2VyZC9zbmFwdXNlcmRfYnVmZmVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBzbmFwc2hvdCB7CisKK2NsYXNzIFNuYXBzaG90SGFuZGxlcjsKKworY2xhc3MgUmVhZEFoZWFkIHsKKyAgcHVibGljOgorICAgIFJlYWRBaGVhZChjb25zdCBzdGQ6OnN0cmluZyYgY293X2RldmljZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGJhY2tpbmdfZGV2aWNlLAorICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lLCBzdGQ6OnNoYXJlZF9wdHI8U25hcHNob3RIYW5kbGVyPiBzbmFwdXNlcmQsCisgICAgICAgICAgICAgIHVpbnQzMl90IGNvd19vcF9tZXJnZV9zaXplKTsKKyAgICBib29sIFJ1blRocmVhZCgpOworCisgIHByaXZhdGU6CisgICAgdm9pZCBJbml0aWFsaXplUkFJdGVyKCk7CisgICAgYm9vbCBSQUl0ZXJEb25lKCk7CisgICAgdm9pZCBSQUl0ZXJOZXh0KCk7CisgICAgdm9pZCBSQVJlc2V0SXRlcih1aW50NjRfdCBudW1fYmxvY2tzKTsKKyAgICBjb25zdCBDb3dPcGVyYXRpb24qIEdldFJBT3BJdGVyKCk7CisKKyAgICB2b2lkIEluaXRpYWxpemVCdWZmZXIoKTsKKyAgICBib29sIEluaXRSZWFkZXIoKTsKKyAgICBib29sIEluaXRpYWxpemVGZHMoKTsKKworICAgIHZvaWQgQ2xvc2VGZHMoKSB7IGJhY2tpbmdfc3RvcmVfZmRfID0ge307IH0KKworICAgIGJvb2wgUmVhZEFoZWFkSU9TdGFydCgpOworICAgIGludCBQcmVwYXJlTmV4dFJlYWRBaGVhZCh1aW50NjRfdCogc291cmNlX29mZnNldCwgaW50KiBwZW5kaW5nX29wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+JiBibG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IENvd09wZXJhdGlvbio+JiB4b3Jfb3BfdmVjKTsKKyAgICBib29sIFJlY29uc3RydWN0RGF0YUZyb21Db3coKTsKKyAgICB2b2lkIENoZWNrT3ZlcmxhcChjb25zdCBDb3dPcGVyYXRpb24qIGNvd19vcCk7CisKKyAgICBib29sIFJlYWRBaGVhZEFzeW5jSU8oKTsKKyAgICBib29sIFJlYXBJb0NvbXBsZXRpb25zKGludCBwZW5kaW5nX2lvc190b19jb21wbGV0ZSk7CisgICAgYm9vbCBSZWFkWG9yRGF0YShzaXplX3QgYmxvY2tfaW5kZXgsIHNpemVfdCB4b3Jfb3BfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBDb3dPcGVyYXRpb24qPiYgeG9yX29wX3ZlYyk7CisgICAgdm9pZCBQcm9jZXNzWG9yRGF0YShzaXplX3QmIGJsb2NrX3hvcl9pbmRleCwgc2l6ZV90JiB4b3JfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBDb3dPcGVyYXRpb24qPiYgeG9yX29wX3ZlYywgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgbG9mZl90JiBidWZmZXJfb2Zmc2V0KTsKKyAgICB2b2lkIFVwZGF0ZVNjcmF0Y2hNZXRhZGF0YSgpOworCisgICAgYm9vbCBSZWFkQWhlYWRTeW5jSU8oKTsKKyAgICBib29sIEluaXRpYWxpemVJb3VyaW5nKCk7CisgICAgdm9pZCBGaW5hbGl6ZUlvdXJpbmcoKTsKKworICAgIHZvaWQqIHJlYWRfYWhlYWRfYnVmZmVyXzsKKyAgICB2b2lkKiBtZXRhZGF0YV9idWZmZXJfOworCisgICAgc3RkOjp1bmlxdWVfcHRyPElDb3dPcEl0ZXI+IGNvd29wX2l0ZXJfOworCisgICAgc3RkOjpzdHJpbmcgY293X2RldmljZV87CisgICAgc3RkOjpzdHJpbmcgYmFja2luZ19zdG9yZV9kZXZpY2VfOworICAgIHN0ZDo6c3RyaW5nIG1pc2NfbmFtZV87CisKKyAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgY293X2ZkXzsKKyAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgYmFja2luZ19zdG9yZV9mZF87CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U25hcHNob3RIYW5kbGVyPiBzbmFwdXNlcmRfOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDb3dSZWFkZXI+IHJlYWRlcl87CisgICAgQ293SGVhZGVyIGhlYWRlcl87CisKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8dWludDY0X3Q+IGRlc3RfYmxvY2tzXzsKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8dWludDY0X3Q+IHNvdXJjZV9ibG9ja3NfOworICAgIGJvb2wgb3ZlcmxhcF87CisgICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IGJsb2Nrc187CisgICAgaW50IHRvdGFsX2Jsb2Nrc19tZXJnZWRfID0gMDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiByYV90ZW1wX2J1ZmZlcl87CisgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gcmFfdGVtcF9tZXRhX2J1ZmZlcl87CisgICAgQnVmZmVyU2luayBidWZzaW5rXzsKKworICAgIHVpbnQ2NF90IHRvdGFsX3JhX2Jsb2Nrc19jb21wbGV0ZWRfID0gMDsKKyAgICBib29sIHJlYWRfYWhlYWRfYXN5bmNfID0gZmFsc2U7CisgICAgLy8gUXVldWUgZGVwdGggb2YgOCBzZWVtcyBvcHRpbWFsLiBXZSBkb24ndCB3YW50CisgICAgLy8gdG8gaGF2ZSBhIGh1Z2UgZGVwdGggYXMgaXQgbWF5IHB1dCBtb3JlIG1lbW9yeSBwcmVzc3VyZQorICAgIC8vIG9uIHRoZSBrZXJuZWwgd29ya2VyIHRocmVhZHMgZ2l2ZW4gdGhhdCB3ZSB1c2UKKyAgICAvLyBJT1NRRV9BU1lOQyBmbGFnIC0gQVNZTkMgZmxhZ3MgY2FuIHBvdGVudGlhbGx5CisgICAgLy8gcmVzdWx0IGluIEVJTlRSOyBTaW5jZSB3ZSBkb24ndCByZXN0YXJ0CisgICAgLy8gc3lzY2FsbHMgYW5kIGZhbGxiYWNrIHRvIHN5bmNocm9ub3VzIEkvTywgd2UKKyAgICAvLyBkb24ndCB3YW50IGh1Z2UgcXVldWUgZGVwdGgKKyAgICBpbnQgcXVldWVfZGVwdGhfID0gODsKKyAgICB1aW50MzJfdCBjb3dfb3BfbWVyZ2Vfc2l6ZV87CisgICAgc3RkOjp1bmlxdWVfcHRyPHN0cnVjdCBpb191cmluZz4gcmluZ187Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugc25hcHNob3QKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX3NlcnZlci5jcHAgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX3NlcnZlci5jcHAKaW5kZXggYjdjZTIxMC4uM2JiOGEzMCAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL3NuYXB1c2VyZF9zZXJ2ZXIuY3BwCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfc2VydmVyLmNwcApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9zeXN0ZW1fcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCkBAIC0zMSwxMSArMzIsMTAgQEAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc2NvcGVndWFyZC5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CiAjaW5jbHVkZSA8ZnNfbWdyL2ZpbGVfd2FpdC5oPgorI2luY2x1ZGUgPHNuYXB1c2VyZC9kbV91c2VyX2Jsb2NrX3NlcnZlci5oPgogI2luY2x1ZGUgPHNuYXB1c2VyZC9zbmFwdXNlcmRfY2xpZW50Lmg+CiAjaW5jbHVkZSAic25hcHVzZXJkX3NlcnZlci5oIgotCi0jZGVmaW5lIF9SRUFMTFlfSU5DTFVERV9TWVNfX1NZU1RFTV9QUk9QRVJUSUVTX0hfCi0jaW5jbHVkZSA8c3lzL19zeXN0ZW1fcHJvcGVydGllcy5oPgorI2luY2x1ZGUgInVzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX2NvcmUuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHNuYXBzaG90IHsKQEAgLTQ1LDI4ICs0NSwxMCBAQAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQ7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQ7CiAKLURhZW1vbk9wcyBVc2VyU25hcHNob3RTZXJ2ZXI6OlJlc29sdmVvcChzdGQ6OnN0cmluZyYgaW5wdXQpIHsKLSAgICBpZiAoaW5wdXQgPT0gImluaXQiKSByZXR1cm4gRGFlbW9uT3BzOjpJTklUOwotICAgIGlmIChpbnB1dCA9PSAic3RhcnQiKSByZXR1cm4gRGFlbW9uT3BzOjpTVEFSVDsKLSAgICBpZiAoaW5wdXQgPT0gInN0b3AiKSByZXR1cm4gRGFlbW9uT3BzOjpTVE9QOwotICAgIGlmIChpbnB1dCA9PSAicXVlcnkiKSByZXR1cm4gRGFlbW9uT3BzOjpRVUVSWTsKLSAgICBpZiAoaW5wdXQgPT0gImRlbGV0ZSIpIHJldHVybiBEYWVtb25PcHM6OkRFTEVURTsKLSAgICBpZiAoaW5wdXQgPT0gImRldGFjaCIpIHJldHVybiBEYWVtb25PcHM6OkRFVEFDSDsKLSAgICBpZiAoaW5wdXQgPT0gInN1cHBvcnRzIikgcmV0dXJuIERhZW1vbk9wczo6U1VQUE9SVFM7Ci0gICAgaWYgKGlucHV0ID09ICJpbml0aWF0ZV9tZXJnZSIpIHJldHVybiBEYWVtb25PcHM6OklOSVRJQVRFOwotICAgIGlmIChpbnB1dCA9PSAibWVyZ2VfcGVyY2VudCIpIHJldHVybiBEYWVtb25PcHM6OlBFUkNFTlRBR0U7Ci0gICAgaWYgKGlucHV0ID09ICJnZXRzdGF0dXMiKSByZXR1cm4gRGFlbW9uT3BzOjpHRVRTVEFUVVM7Ci0gICAgaWYgKGlucHV0ID09ICJ1cGRhdGUtdmVyaWZ5IikgcmV0dXJuIERhZW1vbk9wczo6VVBEQVRFX1ZFUklGWTsKLQotICAgIHJldHVybiBEYWVtb25PcHM6OklOVkFMSUQ7Ci19Ci0KIFVzZXJTbmFwc2hvdFNlcnZlcjo6VXNlclNuYXBzaG90U2VydmVyKCkgewotICAgIG1vbml0b3JfbWVyZ2VfZXZlbnRfZmRfLnJlc2V0KGV2ZW50ZmQoMCwgRUZEX0NMT0VYRUMpKTsKLSAgICBpZiAobW9uaXRvcl9tZXJnZV9ldmVudF9mZF8gPT0gLTEpIHsKLSAgICAgICAgUExPRyhGQVRBTCkgPDwgIm1vbml0b3JfbWVyZ2VfZXZlbnRfZmRfOiBmYWlsZWQgdG8gY3JlYXRlIGV2ZW50ZmQiOwotICAgIH0KICAgICB0ZXJtaW5hdGluZ18gPSBmYWxzZTsKKyAgICBoYW5kbGVyc18gPSBzdGQ6Om1ha2VfdW5pcXVlPFNuYXBzaG90SGFuZGxlck1hbmFnZXI+KCk7CisgICAgYmxvY2tfc2VydmVyX2ZhY3RvcnlfID0gc3RkOjptYWtlX3VuaXF1ZTxEbVVzZXJCbG9ja1NlcnZlckZhY3Rvcnk+KCk7CiB9CiAKIFVzZXJTbmFwc2hvdFNlcnZlcjo6flVzZXJTbmFwc2hvdFNlcnZlcigpIHsKQEAgLTk5LDEyICs4MSw5IEBACiAKIHZvaWQgVXNlclNuYXBzaG90U2VydmVyOjpTaHV0ZG93blRocmVhZHMoKSB7CiAgICAgdGVybWluYXRpbmdfID0gdHJ1ZTsKLSAgICBKb2luQWxsVGhyZWFkcygpOworICAgIGhhbmRsZXJzXy0+Sm9pbkFsbFRocmVhZHMoKTsKIH0KIAotSGFuZGxlclRocmVhZDo6SGFuZGxlclRocmVhZChzdGQ6OnNoYXJlZF9wdHI8U25hcHNob3RIYW5kbGVyPiBzbmFwdXNlcmQpCi0gICAgOiBzbmFwdXNlcmRfKHNuYXB1c2VyZCksIG1pc2NfbmFtZV8oc25hcHVzZXJkXy0+R2V0TWlzY05hbWUoKSkge30KLQogYm9vbCBVc2VyU25hcHNob3RTZXJ2ZXI6OlNlbmRtc2coYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgZmQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpIHsKICAgICBzc2l6ZV90IHJldCA9IFRFTVBfRkFJTFVSRV9SRVRSWShzZW5kKGZkLmdldCgpLCBtc2cuZGF0YSgpLCBtc2cuc2l6ZSgpLCBNU0dfTk9TSUdOQUwpKTsKICAgICBpZiAocmV0IDwgMCkgewpAQCAtMTM1LDIyNiArMTE0LDEyMyBAQAogCiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG91dDsKICAgICBQYXJzZW1zZyhzdHIsIGRlbGltLCBvdXQpOwotICAgIERhZW1vbk9wcyBvcCA9IFJlc29sdmVvcChvdXRbMF0pOwogCi0gICAgc3dpdGNoIChvcCkgewotICAgICAgICBjYXNlIERhZW1vbk9wczo6SU5JVDogewotICAgICAgICAgICAgLy8gTWVzc2FnZSBmb3JtYXQ6Ci0gICAgICAgICAgICAvLyBpbml0LDxtaXNjX25hbWU+LDxjb3dfZGV2aWNlX3BhdGg+LDxiYWNraW5nX2RldmljZT4sPGJhc2VfcGF0aF9tZXJnZT4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBSZWFkcyB0aGUgbWV0YWRhdGEgYW5kIHNlbmQgdGhlIG51bWJlciBvZiBzZWN0b3JzCi0gICAgICAgICAgICBpZiAob3V0LnNpemUoKSAhPSA1KSB7Ci0gICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTWFsZm9ybWVkIGluaXQgbWVzc2FnZSwgIiA8PCBvdXQuc2l6ZSgpIDw8ICIgcGFydHMiOwotICAgICAgICAgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCAiZmFpbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhdXRvIGhhbmRsZXIgPSBBZGRIYW5kbGVyKG91dFsxXSwgb3V0WzJdLCBvdXRbM10sIG91dFs0XSk7Ci0gICAgICAgICAgICBpZiAoIWhhbmRsZXIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgImZhaWwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXV0byByZXR2YWwgPSAic3VjY2VzcywiICsgc3RkOjp0b19zdHJpbmcoaGFuZGxlci0+c25hcHVzZXJkKCktPkdldE51bVNlY3RvcnMoKSk7Ci0gICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgcmV0dmFsKTsKLSAgICAgICAgfQotICAgICAgICBjYXNlIERhZW1vbk9wczo6U1RBUlQ6IHsKLSAgICAgICAgICAgIC8vIE1lc3NhZ2UgZm9ybWF0OgotICAgICAgICAgICAgLy8gc3RhcnQsPG1pc2NfbmFtZT4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBTdGFydCB0aGUgbmV3IHRocmVhZCB3aGljaCBiaW5kcyB0byBkbS11c2VyIG1pc2MgZGV2aWNlCi0gICAgICAgICAgICBpZiAob3V0LnNpemUoKSAhPSAyKSB7Ci0gICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTWFsZm9ybWVkIHN0YXJ0IG1lc3NhZ2UsICIgPDwgb3V0LnNpemUoKSA8PCAiIHBhcnRzIjsKLSAgICAgICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgImZhaWwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobG9ja18pOwotICAgICAgICAgICAgYXV0byBpdGVyID0gRmluZEhhbmRsZXIoJmxvY2ssIG91dFsxXSk7Ci0gICAgICAgICAgICBpZiAoaXRlciA9PSBkbV91c2Vyc18uZW5kKCkpIHsKLSAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgZmluZCBoYW5kbGVyOiAiIDw8IG91dFsxXTsKLSAgICAgICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgImZhaWwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghKCppdGVyKS0+c25hcHVzZXJkKCkgfHwgKCppdGVyKS0+c25hcHVzZXJkKCktPklzQXR0YWNoZWQoKSkgewotICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlRyaWVkIHRvIHJlLWF0dGFjaCBjb250cm9sIGRldmljZTogIiA8PCBvdXRbMV07Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNlbmRtc2coZmQsICJmYWlsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIVN0YXJ0SGFuZGxlcigqaXRlcikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgImZhaWwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCAic3VjY2VzcyIpOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRGFlbW9uT3BzOjpTVE9QOiB7Ci0gICAgICAgICAgICAvLyBNZXNzYWdlIGZvcm1hdDogc3RvcAotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIFN0b3AgYWxsIHRoZSB0aHJlYWRzIGdyYWNlZnVsbHkgYW5kIHRoZW4gc2h1dGRvd24gdGhlCi0gICAgICAgICAgICAvLyBtYWluIHRocmVhZAotICAgICAgICAgICAgU2V0VGVybWluYXRpbmcoKTsKLSAgICAgICAgICAgIFNodXRkb3duVGhyZWFkcygpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBEYWVtb25PcHM6OlFVRVJZOiB7Ci0gICAgICAgICAgICAvLyBNZXNzYWdlIGZvcm1hdDogcXVlcnkKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBBcyBwYXJ0IG9mIHRyYW5zaXRpb24sIFNlY29uZCBzdGFnZSBkYWVtb24gd2lsbCBiZQotICAgICAgICAgICAgLy8gY3JlYXRlZCBiZWZvcmUgdGVybWluYXRpbmcgdGhlIGZpcnN0IHN0YWdlIGRhZW1vbi4gSGVuY2UsCi0gICAgICAgICAgICAvLyBmb3IgYSBicmllZiBwZXJpb2QgY2xpZW50IG1heSBoYXZlIHRvIGRpc3RpZ3Vpc2ggYmV0d2VlbgotICAgICAgICAgICAgLy8gZmlyc3Qgc3RhZ2UgZGFlbW9uIGFuZCBzZWNvbmQgc3RhZ2UgZGFlbW9uLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIFNlY29uZCBzdGFnZSBkYWVtb24gaXMgbWFya2VkIGFzIGFjdGl2ZSBhbmQgaGVuY2Ugd2lsbAotICAgICAgICAgICAgLy8gYmUgcmVhZHkgdG8gcmVjZWl2ZSBjb250cm9sIG1lc3NhZ2UuCi0gICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgR2V0RGFlbW9uU3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRGFlbW9uT3BzOjpERUxFVEU6IHsKLSAgICAgICAgICAgIC8vIE1lc3NhZ2UgZm9ybWF0OgotICAgICAgICAgICAgLy8gZGVsZXRlLDxtaXNjX25hbWU+Ci0gICAgICAgICAgICBpZiAob3V0LnNpemUoKSAhPSAyKSB7Ci0gICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTWFsZm9ybWVkIGRlbGV0ZSBtZXNzYWdlLCAiIDw8IG91dC5zaXplKCkgPDwgIiBwYXJ0cyI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNlbmRtc2coZmQsICJmYWlsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobG9ja18pOwotICAgICAgICAgICAgICAgIGF1dG8gaXRlciA9IEZpbmRIYW5kbGVyKCZsb2NrLCBvdXRbMV0pOwotICAgICAgICAgICAgICAgIGlmIChpdGVyID09IGRtX3VzZXJzXy5lbmQoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBBZnRlciBtZXJnZSBpcyBjb21wbGV0ZWQsIHdlIHN3YXAgZG0tdXNlciB0YWJsZSB3aXRoCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSB1bmRlcmx5aW5nIGRtLWxpbmVhciBiYXNlIGRldmljZS4gSGVuY2UsIHdvcmtlcgotICAgICAgICAgICAgICAgICAgICAvLyB0aHJlYWRzIHdvdWxkIGhhdmUgdGVybWludGVkIGFuZCB3YXMgcmVtb3ZlZCBmcm9tCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsaXN0LgotICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJDb3VsZCBub3QgZmluZCBoYW5kbGVyOiAiIDw8IG91dFsxXTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNlbmRtc2coZmQsICJzdWNjZXNzIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCEoKml0ZXIpLT5UaHJlYWRUZXJtaW5hdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgKCppdGVyKS0+c25hcHVzZXJkKCktPk5vdGlmeUlPVGVybWluYXRlZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghUmVtb3ZlQW5kSm9pbkhhbmRsZXIob3V0WzFdKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCAiZmFpbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFNlbmRtc2coZmQsICJzdWNjZXNzIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBEYWVtb25PcHM6OkRFVEFDSDogewotICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobG9ja18pOwotICAgICAgICAgICAgVGVybWluYXRlTWVyZ2VUaHJlYWRzKCZsb2NrKTsKLSAgICAgICAgICAgIHRlcm1pbmF0aW5nXyA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBjYXNlIERhZW1vbk9wczo6U1VQUE9SVFM6IHsKLSAgICAgICAgICAgIGlmIChvdXQuc2l6ZSgpICE9IDIpIHsKLSAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJNYWxmb3JtZWQgc3VwcG9ydHMgbWVzc2FnZSwgIiA8PCBvdXQuc2l6ZSgpIDw8ICIgcGFydHMiOwotICAgICAgICAgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCAiZmFpbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG91dFsxXSA9PSAic2Vjb25kX3N0YWdlX3NvY2tldF9oYW5kb2ZmIikgewotICAgICAgICAgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCAic3VjY2VzcyIpOwotICAgICAgICAgICAgfQorICAgIGNvbnN0IGF1dG8mIGNtZCA9IG91dFswXTsKKyAgICBpZiAoY21kID09ICJpbml0IikgeworICAgICAgICAvLyBNZXNzYWdlIGZvcm1hdDoKKyAgICAgICAgLy8gaW5pdCw8bWlzY19uYW1lPiw8Y293X2RldmljZV9wYXRoPiw8YmFja2luZ19kZXZpY2U+LDxiYXNlX3BhdGhfbWVyZ2U+CisgICAgICAgIC8vCisgICAgICAgIC8vIFJlYWRzIHRoZSBtZXRhZGF0YSBhbmQgc2VuZCB0aGUgbnVtYmVyIG9mIHNlY3RvcnMKKyAgICAgICAgaWYgKG91dC5zaXplKCkgIT0gNSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTWFsZm9ybWVkIGluaXQgbWVzc2FnZSwgIiA8PCBvdXQuc2l6ZSgpIDw8ICIgcGFydHMiOwogICAgICAgICAgICAgcmV0dXJuIFNlbmRtc2coZmQsICJmYWlsIik7CiAgICAgICAgIH0KLSAgICAgICAgY2FzZSBEYWVtb25PcHM6OklOSVRJQVRFOiB7Ci0gICAgICAgICAgICBpZiAob3V0LnNpemUoKSAhPSAyKSB7Ci0gICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTWFsZm9ybWVkIGluaXRpYXRlLW1lcmdlIG1lc3NhZ2UsICIgPDwgb3V0LnNpemUoKSA8PCAiIHBhcnRzIjsKLSAgICAgICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgImZhaWwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvdXRbMF0gPT0gImluaXRpYXRlX21lcmdlIikgewotICAgICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGxvY2tfKTsKLSAgICAgICAgICAgICAgICBhdXRvIGl0ZXIgPSBGaW5kSGFuZGxlcigmbG9jaywgb3V0WzFdKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlciA9PSBkbV91c2Vyc18uZW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IGZpbmQgaGFuZGxlcjogIiA8PCBvdXRbMV07Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCAiZmFpbCIpOwotICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmICghU3RhcnRNZXJnZSgmbG9jaywgKml0ZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCAiZmFpbCIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCAic3VjY2VzcyIpOwotICAgICAgICAgICAgfQorICAgICAgICBhdXRvIGhhbmRsZXIgPSBBZGRIYW5kbGVyKG91dFsxXSwgb3V0WzJdLCBvdXRbM10sIG91dFs0XSwgc3RkOjpudWxsb3B0KTsKKyAgICAgICAgaWYgKCFoYW5kbGVyKSB7CiAgICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgImZhaWwiKTsKICAgICAgICAgfQotICAgICAgICBjYXNlIERhZW1vbk9wczo6UEVSQ0VOVEFHRTogewotICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobG9ja18pOwotICAgICAgICAgICAgZG91YmxlIHBlcmNlbnRhZ2UgPSBHZXRNZXJnZVBlcmNlbnRhZ2UoJmxvY2spOwogCi0gICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgc3RkOjp0b19zdHJpbmcocGVyY2VudGFnZSkpOworICAgICAgICBhdXRvIG51bV9zZWN0b3JzID0gaGFuZGxlci0+c25hcHVzZXJkKCktPkdldE51bVNlY3RvcnMoKTsKKyAgICAgICAgaWYgKCFudW1fc2VjdG9ycykgeworICAgICAgICAgICAgcmV0dXJuIFNlbmRtc2coZmQsICJmYWlsIik7CiAgICAgICAgIH0KLSAgICAgICAgY2FzZSBEYWVtb25PcHM6OkdFVFNUQVRVUzogewotICAgICAgICAgICAgLy8gTWVzc2FnZSBmb3JtYXQ6Ci0gICAgICAgICAgICAvLyBnZXRzdGF0dXMsPG1pc2NfbmFtZT4KLSAgICAgICAgICAgIGlmIChvdXQuc2l6ZSgpICE9IDIpIHsKLSAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJNYWxmb3JtZWQgZGVsZXRlIG1lc3NhZ2UsICIgPDwgb3V0LnNpemUoKSA8PCAiIHBhcnRzIjsKLSAgICAgICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgInNuYXBzaG90LW1lcmdlLWZhaWxlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGxvY2tfKTsKLSAgICAgICAgICAgICAgICBhdXRvIGl0ZXIgPSBGaW5kSGFuZGxlcigmbG9jaywgb3V0WzFdKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlciA9PSBkbV91c2Vyc18uZW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IGZpbmQgaGFuZGxlcjogIiA8PCBvdXRbMV07Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCAic25hcHNob3QtbWVyZ2UtZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWVyZ2Vfc3RhdHVzID0gR2V0TWVyZ2VTdGF0dXMoKml0ZXIpOwotICAgICAgICAgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCBtZXJnZV9zdGF0dXMpOwotICAgICAgICAgICAgfQorICAgICAgICBhdXRvIHJldHZhbCA9ICJzdWNjZXNzLCIgKyBzdGQ6OnRvX3N0cmluZyhudW1fc2VjdG9ycyk7CisgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCByZXR2YWwpOworICAgIH0gZWxzZSBpZiAoY21kID09ICJzdGFydCIpIHsKKyAgICAgICAgLy8gTWVzc2FnZSBmb3JtYXQ6CisgICAgICAgIC8vIHN0YXJ0LDxtaXNjX25hbWU+CisgICAgICAgIC8vCisgICAgICAgIC8vIFN0YXJ0IHRoZSBuZXcgdGhyZWFkIHdoaWNoIGJpbmRzIHRvIGRtLXVzZXIgbWlzYyBkZXZpY2UKKyAgICAgICAgaWYgKG91dC5zaXplKCkgIT0gMikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTWFsZm9ybWVkIHN0YXJ0IG1lc3NhZ2UsICIgPDwgb3V0LnNpemUoKSA8PCAiIHBhcnRzIjsKKyAgICAgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCAiZmFpbCIpOwogICAgICAgICB9Ci0gICAgICAgIGNhc2UgRGFlbW9uT3BzOjpVUERBVEVfVkVSSUZZOiB7Ci0gICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhsb2NrXyk7Ci0gICAgICAgICAgICBpZiAoIVVwZGF0ZVZlcmlmaWNhdGlvbigmbG9jaykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgImZhaWwiKTsKLSAgICAgICAgICAgIH0KIAorICAgICAgICBpZiAoIWhhbmRsZXJzXy0+U3RhcnRIYW5kbGVyKG91dFsxXSkpIHsKKyAgICAgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCAiZmFpbCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCAic3VjY2VzcyIpOworICAgIH0gZWxzZSBpZiAoY21kID09ICJzdG9wIikgeworICAgICAgICAvLyBNZXNzYWdlIGZvcm1hdDogc3RvcAorICAgICAgICAvLworICAgICAgICAvLyBTdG9wIGFsbCB0aGUgdGhyZWFkcyBncmFjZWZ1bGx5IGFuZCB0aGVuIHNodXRkb3duIHRoZQorICAgICAgICAvLyBtYWluIHRocmVhZAorICAgICAgICBTZXRUZXJtaW5hdGluZygpOworICAgICAgICBTaHV0ZG93blRocmVhZHMoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChjbWQgPT0gInF1ZXJ5IikgeworICAgICAgICAvLyBNZXNzYWdlIGZvcm1hdDogcXVlcnkKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQXMgcGFydCBvZiB0cmFuc2l0aW9uLCBTZWNvbmQgc3RhZ2UgZGFlbW9uIHdpbGwgYmUKKyAgICAgICAgLy8gY3JlYXRlZCBiZWZvcmUgdGVybWluYXRpbmcgdGhlIGZpcnN0IHN0YWdlIGRhZW1vbi4gSGVuY2UsCisgICAgICAgIC8vIGZvciBhIGJyaWVmIHBlcmlvZCBjbGllbnQgbWF5IGhhdmUgdG8gZGlzdGlndWlzaCBiZXR3ZWVuCisgICAgICAgIC8vIGZpcnN0IHN0YWdlIGRhZW1vbiBhbmQgc2Vjb25kIHN0YWdlIGRhZW1vbi4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2Vjb25kIHN0YWdlIGRhZW1vbiBpcyBtYXJrZWQgYXMgYWN0aXZlIGFuZCBoZW5jZSB3aWxsCisgICAgICAgIC8vIGJlIHJlYWR5IHRvIHJlY2VpdmUgY29udHJvbCBtZXNzYWdlLgorICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgR2V0RGFlbW9uU3RhdHVzKCkpOworICAgIH0gZWxzZSBpZiAoY21kID09ICJkZWxldGUiKSB7CisgICAgICAgIC8vIE1lc3NhZ2UgZm9ybWF0OgorICAgICAgICAvLyBkZWxldGUsPG1pc2NfbmFtZT4KKyAgICAgICAgaWYgKG91dC5zaXplKCkgIT0gMikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTWFsZm9ybWVkIGRlbGV0ZSBtZXNzYWdlLCAiIDw8IG91dC5zaXplKCkgPDwgIiBwYXJ0cyI7CisgICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgImZhaWwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWhhbmRsZXJzXy0+RGVsZXRlSGFuZGxlcihvdXRbMV0pKSB7CisgICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgImZhaWwiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgInN1Y2Nlc3MiKTsKKyAgICB9IGVsc2UgaWYgKGNtZCA9PSAiZGV0YWNoIikgeworICAgICAgICBoYW5kbGVyc18tPlRlcm1pbmF0ZU1lcmdlVGhyZWFkcygpOworICAgICAgICB0ZXJtaW5hdGluZ18gPSB0cnVlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKGNtZCA9PSAic3VwcG9ydHMiKSB7CisgICAgICAgIGlmIChvdXQuc2l6ZSgpICE9IDIpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk1hbGZvcm1lZCBzdXBwb3J0cyBtZXNzYWdlLCAiIDw8IG91dC5zaXplKCkgPDwgIiBwYXJ0cyI7CisgICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgImZhaWwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob3V0WzFdID09ICJzZWNvbmRfc3RhZ2Vfc29ja2V0X2hhbmRvZmYiKSB7CiAgICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgInN1Y2Nlc3MiKTsKICAgICAgICAgfQotICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJSZWNlaXZlZCB1bmtub3duIG1lc3NhZ2UgdHlwZSBmcm9tIGNsaWVudCI7Ci0gICAgICAgICAgICBTZW5kbXNnKGZkLCAiZmFpbCIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgImZhaWwiKTsKKyAgICB9IGVsc2UgaWYgKGNtZCA9PSAiaW5pdGlhdGVfbWVyZ2UiKSB7CisgICAgICAgIGlmIChvdXQuc2l6ZSgpICE9IDIpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk1hbGZvcm1lZCBpbml0aWF0ZS1tZXJnZSBtZXNzYWdlLCAiIDw8IG91dC5zaXplKCkgPDwgIiBwYXJ0cyI7CisgICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgImZhaWwiKTsKICAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBVc2VyU25hcHNob3RTZXJ2ZXI6OlJ1blRocmVhZChzdGQ6OnNoYXJlZF9wdHI8SGFuZGxlclRocmVhZD4gaGFuZGxlcikgewotICAgIExPRyhJTkZPKSA8PCAiRW50ZXJpbmcgdGhyZWFkIGZvciBoYW5kbGVyOiAiIDw8IGhhbmRsZXItPm1pc2NfbmFtZSgpOwotCi0gICAgaWYgKCFoYW5kbGVyLT5zbmFwdXNlcmQoKS0+U3RhcnQoKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICIgRmFpbGVkIHRvIGxhdW5jaCBhbGwgd29ya2VyIHRocmVhZHMiOwotICAgIH0KLQotICAgIGhhbmRsZXItPnNuYXB1c2VyZCgpLT5DbG9zZUZkcygpOwotICAgIGJvb2wgbWVyZ2VfY29tcGxldGVkID0gaGFuZGxlci0+c25hcHVzZXJkKCktPkNoZWNrTWVyZ2VDb21wbGV0aW9uU3RhdHVzKCk7Ci0gICAgaGFuZGxlci0+c25hcHVzZXJkKCktPlVubWFwQnVmZmVyUmVnaW9uKCk7Ci0KLSAgICBhdXRvIG1pc2NfbmFtZSA9IGhhbmRsZXItPm1pc2NfbmFtZSgpOwotICAgIExPRyhJTkZPKSA8PCAiSGFuZGxlciB0aHJlYWQgYWJvdXQgdG8gZXhpdDogIiA8PCBtaXNjX25hbWU7Ci0KLSAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGxvY2tfKTsKLSAgICAgICAgaWYgKG1lcmdlX2NvbXBsZXRlZCkgewotICAgICAgICAgICAgbnVtX3BhcnRpdGlvbnNfbWVyZ2VfY29tcGxldGVfICs9IDE7Ci0gICAgICAgICAgICBhY3RpdmVfbWVyZ2VfdGhyZWFkc18gLT0gMTsKLSAgICAgICAgICAgIFdha2V1cE1vbml0b3JNZXJnZVRocmVhZCgpOworICAgICAgICBpZiAob3V0WzBdID09ICJpbml0aWF0ZV9tZXJnZSIpIHsKKyAgICAgICAgICAgIGlmICghaGFuZGxlcnNfLT5Jbml0aWF0ZU1lcmdlKG91dFsxXSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gU2VuZG1zZyhmZCwgImZhaWwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCAic3VjY2VzcyIpOwogICAgICAgICB9Ci0gICAgICAgIGhhbmRsZXItPlNldFRocmVhZFRlcm1pbmF0ZWQoKTsKLSAgICAgICAgYXV0byBpdGVyID0gRmluZEhhbmRsZXIoJmxvY2ssIGhhbmRsZXItPm1pc2NfbmFtZSgpKTsKLSAgICAgICAgaWYgKGl0ZXIgPT0gZG1fdXNlcnNfLmVuZCgpKSB7Ci0gICAgICAgICAgICAvLyBSZW1vdmVBbmRKb2luSGFuZGxlcigpIGFscmVhZHkgcmVtb3ZlZCB1cyBmcm9tIHRoZSBsaXN0LCBhbmQgaXMKLSAgICAgICAgICAgIC8vIG5vdyB3YWl0aW5nIG9uIGEgam9pbigpLCBzbyBqdXN0IHJldHVybi4gQWRkaXRpb25hbGx5LCByZWxlYXNlCi0gICAgICAgICAgICAvLyBhbGwgdGhlIHJlc291cmNlcyBoZWxkIGJ5IHNuYXB1c2VyZCBvYmplY3Qgd2hpY2ggYXJlIHNoYXJlZAotICAgICAgICAgICAgLy8gYnkgd29ya2VyIHRocmVhZHMuIFRoaXMgc2hvdWxkIGJlIGRvbmUgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2UKLSAgICAgICAgICAgIC8vIG9mICJoYW5kbGVyIiBpcyByZWxlYXNlZDsgYnV0IHdlIHdpbGwgZXhwbGljaXRseSByZWxlYXNlIGhlcmUKLSAgICAgICAgICAgIC8vIHRvIG1ha2Ugc3VyZSBzbmFwdXNlcmQgb2JqZWN0IGlzIGZyZWVkIGFzIGl0IGlzIHRoZSBiaWdnZXN0Ci0gICAgICAgICAgICAvLyBjb25zdW1lciBvZiBtZW1vcnkgaW4gdGhlIGRhZW1vbi4KLSAgICAgICAgICAgIGhhbmRsZXItPkZyZWVSZXNvdXJjZXMoKTsKLSAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiRXhpdGluZyBoYW5kbGVyIHRocmVhZCB0byBhbGxvdyBmb3Igam9pbjogIiA8PCBtaXNjX25hbWU7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCAiZmFpbCIpOworICAgIH0gZWxzZSBpZiAoY21kID09ICJtZXJnZV9wZXJjZW50IikgeworICAgICAgICBkb3VibGUgcGVyY2VudGFnZSA9IGhhbmRsZXJzXy0+R2V0TWVyZ2VQZXJjZW50YWdlKCk7CisgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCBzdGQ6OnRvX3N0cmluZyhwZXJjZW50YWdlKSk7CisgICAgfSBlbHNlIGlmIChjbWQgPT0gImdldHN0YXR1cyIpIHsKKyAgICAgICAgLy8gTWVzc2FnZSBmb3JtYXQ6CisgICAgICAgIC8vIGdldHN0YXR1cyw8bWlzY19uYW1lPgorICAgICAgICBpZiAob3V0LnNpemUoKSAhPSAyKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJNYWxmb3JtZWQgZGVsZXRlIG1lc3NhZ2UsICIgPDwgb3V0LnNpemUoKSA8PCAiIHBhcnRzIjsKKyAgICAgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCAic25hcHNob3QtbWVyZ2UtZmFpbGVkIik7CiAgICAgICAgIH0KLQotICAgICAgICBMT0coSU5GTykgPDwgIkV4aXRpbmcgaGFuZGxlciB0aHJlYWQgYW5kIGZyZWVpbmcgcmVzb3VyY2VzOiAiIDw8IG1pc2NfbmFtZTsKLQotICAgICAgICBpZiAoaGFuZGxlci0+c25hcHVzZXJkKCktPklzQXR0YWNoZWQoKSkgewotICAgICAgICAgICAgaGFuZGxlci0+dGhyZWFkKCkuZGV0YWNoKCk7CisgICAgICAgIGF1dG8gc3RhdHVzID0gaGFuZGxlcnNfLT5HZXRNZXJnZVN0YXR1cyhvdXRbMV0pOworICAgICAgICBpZiAoc3RhdHVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCAic25hcHNob3QtbWVyZ2UtZmFpbGVkIik7CiAgICAgICAgIH0KLQotICAgICAgICAvLyBJbXBvcnRhbnQ6IGZyZWUgcmVzb3VyY2VzIHdpdGhpbiB0aGUgbG9jay4gVGhpcyBlbnN1cmVzIHRoYXQgaWYKLSAgICAgICAgLy8gV2FpdEZvckRlbGV0ZSgpIGlzIGNhbGxlZCwgdGhlIGhhbmRsZXIgaXMgZWl0aGVyIGluIHRoZSBsaXN0LCBvcgotICAgICAgICAvLyBpdCdzIG5vdCBhbmQgaXRzIHJlc291cmNlcyBhcmUgZ3VhcmFudGVlZCB0byBiZSBmcmVlZC4KLSAgICAgICAgaGFuZGxlci0+RnJlZVJlc291cmNlcygpOwotICAgICAgICBkbV91c2Vyc18uZXJhc2UoaXRlcik7CisgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCBzdGF0dXMpOworICAgIH0gZWxzZSBpZiAoY21kID09ICJ1cGRhdGUtdmVyaWZ5IikgeworICAgICAgICBpZiAoIWhhbmRsZXJzXy0+R2V0VmVyaWZpY2F0aW9uU3RhdHVzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCAiZmFpbCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBTZW5kbXNnKGZkLCAic3VjY2VzcyIpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlJlY2VpdmVkIHVua25vd24gbWVzc2FnZSB0eXBlIGZyb20gY2xpZW50IjsKKyAgICAgICAgU2VuZG1zZyhmZCwgImZhaWwiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIH0KIApAQCAtNDIzLDI4ICsyOTksMTAgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIEpvaW5BbGxUaHJlYWRzKCk7CisgICAgaGFuZGxlcnNfLT5Kb2luQWxsVGhyZWFkcygpOwogICAgIHJldHVybiB0cnVlOwogfQogCi12b2lkIFVzZXJTbmFwc2hvdFNlcnZlcjo6Sm9pbkFsbFRocmVhZHMoKSB7Ci0gICAgLy8gQWNxdWlyZSB0aGUgdGhyZWFkIGxpc3Qgd2l0aGluIHRoZSBsb2NrLgotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyVGhyZWFkPj4gZG1fdXNlcnM7Ci0gICAgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gZ3VhcmQobG9ja18pOwotICAgICAgICBkbV91c2VycyA9IHN0ZDo6bW92ZShkbV91c2Vyc18pOwotICAgIH0KLQotICAgIGZvciAoYXV0byYgY2xpZW50IDogZG1fdXNlcnMpIHsKLSAgICAgICAgYXV0byYgdGggPSBjbGllbnQtPnRocmVhZCgpOwotCi0gICAgICAgIGlmICh0aC5qb2luYWJsZSgpKSB0aC5qb2luKCk7Ci0gICAgfQotCi0gICAgc3RvcF9tb25pdG9yX21lcmdlX3RocmVhZF8gPSB0cnVlOwotICAgIFdha2V1cE1vbml0b3JNZXJnZVRocmVhZCgpOwotfQotCiB2b2lkIFVzZXJTbmFwc2hvdFNlcnZlcjo6QWRkV2F0Y2hlZEZkKGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIGZkLCBpbnQgZXZlbnRzKSB7CiAgICAgc3RydWN0IHBvbGxmZCBwID0ge307CiAgICAgcC5mZCA9IGZkLmdldCgpOwpAQCAtNDg0LDEwICszNDIsMTEgQEAKICAgICBTZXRUZXJtaW5hdGluZygpOwogfQogCi1zdGQ6OnNoYXJlZF9wdHI8SGFuZGxlclRocmVhZD4gVXNlclNuYXBzaG90U2VydmVyOjpBZGRIYW5kbGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb3dfZGV2aWNlX3BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBiYWNraW5nX2RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJhc2VfcGF0aF9tZXJnZSkgeworc3RkOjpzaGFyZWRfcHRyPEhhbmRsZXJUaHJlYWQ+IFVzZXJTbmFwc2hvdFNlcnZlcjo6QWRkSGFuZGxlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGNvd19kZXZpY2VfcGF0aCwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJhY2tpbmdfZGV2aWNlLCBjb25zdCBzdGQ6OnN0cmluZyYgYmFzZV9wYXRoX21lcmdlLAorICAgICAgICBzdGQ6Om9wdGlvbmFsPHVpbnQzMl90PiBudW1fd29ya2VyX3RocmVhZHMsIGNvbnN0IGJvb2wgb19kaXJlY3QsCisgICAgICAgIHVpbnQzMl90IGNvd19vcF9tZXJnZV9zaXplKSB7CiAgICAgLy8gV2Ugd2lsbCBuZWVkIG11bHRpcGxlIHdvcmtlciB0aHJlYWRzIG9ubHkgZHVyaW5nCiAgICAgLy8gZGV2aWNlIGJvb3QgYWZ0ZXIgT1RBLiBGb3IgYWxsIG90aGVyIHB1cnBvc2VzLAogICAgIC8vIG9uZSB0aHJlYWQgaXMgc3VmZmljaWVudC4gV2UgZG9uJ3Qgd2FudCB0byBjb25zdW1lCkBAIC00OTYsMTk1ICszNTUsMjggQEAKICAgICAvLwogICAgIC8vIER1cmluZyBib290IHVwLCB3ZSBuZWVkIG11bHRpcGxlIHRocmVhZHMgcHJpbWFyaWx5IGZvcgogICAgIC8vIHVwZGF0ZS12ZXJpZmljYXRpb24uCi0gICAgaW50IG51bV93b3JrZXJfdGhyZWFkcyA9IGtOdW1Xb3JrZXJUaHJlYWRzOworICAgIGlmICghbnVtX3dvcmtlcl90aHJlYWRzLmhhc192YWx1ZSgpKSB7CisgICAgICAgIG51bV93b3JrZXJfdGhyZWFkcyA9IGtOdW1Xb3JrZXJUaHJlYWRzOworICAgIH0KICAgICBpZiAoaXNfc29ja2V0X3ByZXNlbnRfKSB7CiAgICAgICAgIG51bV93b3JrZXJfdGhyZWFkcyA9IDE7CiAgICAgfQogCi0gICAgYm9vbCBwZXJmb3JtX3ZlcmlmaWNhdGlvbiA9IHRydWU7Ci0gICAgaWYgKGFuZHJvaWQ6OmJhc2U6OkVuZHNXaXRoKG1pc2NfbmFtZSwgIi1pbml0IikgfHwgaXNfc29ja2V0X3ByZXNlbnRfKSB7Ci0gICAgICAgIHBlcmZvcm1fdmVyaWZpY2F0aW9uID0gZmFsc2U7CisgICAgaWYgKGFuZHJvaWQ6OmJhc2U6OkVuZHNXaXRoKG1pc2NfbmFtZSwgIi1pbml0IikgfHwgaXNfc29ja2V0X3ByZXNlbnRfIHx8CisgICAgICAgIChhY2Nlc3Moa0Jvb3RTbmFwc2hvdHNXaXRob3V0U2xvdFN3aXRjaCwgRl9PSykgPT0gMCkpIHsKKyAgICAgICAgaGFuZGxlcnNfLT5EaXNhYmxlVmVyaWZpY2F0aW9uKCk7CiAgICAgfQogCi0gICAgYXV0byBzbmFwdXNlcmQgPSBzdGQ6Om1ha2Vfc2hhcmVkPFNuYXBzaG90SGFuZGxlcj4obWlzY19uYW1lLCBjb3dfZGV2aWNlX3BhdGgsIGJhY2tpbmdfZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfcGF0aF9tZXJnZSwgbnVtX3dvcmtlcl90aHJlYWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvX3VyaW5nX2VuYWJsZWRfLCBwZXJmb3JtX3ZlcmlmaWNhdGlvbik7Ci0gICAgaWYgKCFzbmFwdXNlcmQtPkluaXRDb3dEZXZpY2UoKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBTbmFwdXNlcmQiOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9CisgICAgYXV0byBvcGVuZXIgPSBibG9ja19zZXJ2ZXJfZmFjdG9yeV8tPkNyZWF0ZU9wZW5lcihtaXNjX25hbWUpOwogCi0gICAgaWYgKCFzbmFwdXNlcmQtPkluaXRpYWxpemVXb3JrZXJzKCkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGluaXRpYWxpemUgd29ya2VycyI7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLQotICAgIGF1dG8gaGFuZGxlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8SGFuZGxlclRocmVhZD4oc25hcHVzZXJkKTsKLSAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGxvY2tfKTsKLSAgICAgICAgaWYgKEZpbmRIYW5kbGVyKCZsb2NrLCBtaXNjX25hbWUpICE9IGRtX3VzZXJzXy5lbmQoKSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSGFuZGxlciBhbHJlYWR5IGV4aXN0czogIiA8PCBtaXNjX25hbWU7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAgICAgfQotICAgICAgICBkbV91c2Vyc18ucHVzaF9iYWNrKGhhbmRsZXIpOwotICAgIH0KLSAgICByZXR1cm4gaGFuZGxlcjsKLX0KLQotYm9vbCBVc2VyU25hcHNob3RTZXJ2ZXI6OlN0YXJ0SGFuZGxlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SGFuZGxlclRocmVhZD4mIGhhbmRsZXIpIHsKLSAgICBpZiAoaGFuZGxlci0+c25hcHVzZXJkKCktPklzQXR0YWNoZWQoKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJIYW5kbGVyIGFscmVhZHkgYXR0YWNoZWQiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaGFuZGxlci0+c25hcHVzZXJkKCktPkF0dGFjaENvbnRyb2xEZXZpY2UoKTsKLQotICAgIGhhbmRsZXItPnRocmVhZCgpID0gc3RkOjp0aHJlYWQoc3RkOjpiaW5kKCZVc2VyU25hcHNob3RTZXJ2ZXI6OlJ1blRocmVhZCwgdGhpcywgaGFuZGxlcikpOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFVzZXJTbmFwc2hvdFNlcnZlcjo6U3RhcnRNZXJnZShzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4qIHByb29mX29mX2xvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SGFuZGxlclRocmVhZD4mIGhhbmRsZXIpIHsKLSAgICBDSEVDSyhwcm9vZl9vZl9sb2NrKTsKLQotICAgIGlmICghaGFuZGxlci0+c25hcHVzZXJkKCktPklzQXR0YWNoZWQoKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJIYW5kbGVyIG5vdCBhdHRhY2hlZCB0byBkbS11c2VyIC0gTWVyZ2UgdGhyZWFkIGNhbm5vdCBiZSBzdGFydGVkIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGhhbmRsZXItPnNuYXB1c2VyZCgpLT5Nb25pdG9yTWVyZ2UoKTsKLQotICAgIGlmICghaXNfbWVyZ2VfbW9uaXRvcl9zdGFydGVkXy5oYXNfdmFsdWUoKSkgewotICAgICAgICBzdGQ6OnRocmVhZCgmVXNlclNuYXBzaG90U2VydmVyOjpNb25pdG9yTWVyZ2UsIHRoaXMpLmRldGFjaCgpOwotICAgICAgICBpc19tZXJnZV9tb25pdG9yX3N0YXJ0ZWRfID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBtZXJnZV9oYW5kbGVyc18ucHVzaChoYW5kbGVyKTsKLSAgICBXYWtldXBNb25pdG9yTWVyZ2VUaHJlYWQoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYXV0byBVc2VyU25hcHNob3RTZXJ2ZXI6OkZpbmRIYW5kbGVyKHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiogcHJvb2Zfb2ZfbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lKSAtPiBIYW5kbGVyTGlzdDo6aXRlcmF0b3IgewotICAgIENIRUNLKHByb29mX29mX2xvY2spOwotCi0gICAgZm9yIChhdXRvIGl0ZXIgPSBkbV91c2Vyc18uYmVnaW4oKTsgaXRlciAhPSBkbV91c2Vyc18uZW5kKCk7IGl0ZXIrKykgewotICAgICAgICBpZiAoKCppdGVyKS0+bWlzY19uYW1lKCkgPT0gbWlzY19uYW1lKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXRlcjsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZG1fdXNlcnNfLmVuZCgpOwotfQotCi12b2lkIFVzZXJTbmFwc2hvdFNlcnZlcjo6VGVybWluYXRlTWVyZ2VUaHJlYWRzKHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiogcHJvb2Zfb2ZfbG9jaykgewotICAgIENIRUNLKHByb29mX29mX2xvY2spOwotCi0gICAgZm9yIChhdXRvIGl0ZXIgPSBkbV91c2Vyc18uYmVnaW4oKTsgaXRlciAhPSBkbV91c2Vyc18uZW5kKCk7IGl0ZXIrKykgewotICAgICAgICBpZiAoISgqaXRlciktPlRocmVhZFRlcm1pbmF0ZWQoKSkgewotICAgICAgICAgICAgKCppdGVyKS0+c25hcHVzZXJkKCktPk5vdGlmeUlPVGVybWluYXRlZCgpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGQ6OnN0cmluZyBVc2VyU25hcHNob3RTZXJ2ZXI6OkdldE1lcmdlU3RhdHVzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyVGhyZWFkPiYgaGFuZGxlcikgewotICAgIHJldHVybiBoYW5kbGVyLT5zbmFwdXNlcmQoKS0+R2V0TWVyZ2VTdGF0dXMoKTsKLX0KLQotZG91YmxlIFVzZXJTbmFwc2hvdFNlcnZlcjo6R2V0TWVyZ2VQZXJjZW50YWdlKHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiogcHJvb2Zfb2ZfbG9jaykgewotICAgIENIRUNLKHByb29mX29mX2xvY2spOwotICAgIGRvdWJsZSBwZXJjZW50YWdlID0gMC4wOwotICAgIGludCBuID0gMDsKLQotICAgIGZvciAoYXV0byBpdGVyID0gZG1fdXNlcnNfLmJlZ2luKCk7IGl0ZXIgIT0gZG1fdXNlcnNfLmVuZCgpOyBpdGVyKyspIHsKLSAgICAgICAgYXV0byYgdGggPSAoKml0ZXIpLT50aHJlYWQoKTsKLSAgICAgICAgaWYgKHRoLmpvaW5hYmxlKCkpIHsKLSAgICAgICAgICAgIC8vIE1lcmdlIHBlcmNlbnRhZ2UgYnkgaW5kaXZpZHVhbCBwYXJ0aXRpb25zIHdoZXJlaW4gbWVyZ2UgaXMgc3RpbGwKLSAgICAgICAgICAgIC8vIGluLXByb2dyZXNzCi0gICAgICAgICAgICBwZXJjZW50YWdlICs9ICgqaXRlciktPnNuYXB1c2VyZCgpLT5HZXRNZXJnZVBlcmNlbnRhZ2UoKTsKLSAgICAgICAgICAgIG4gKz0gMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIENhbGN1bGF0ZSBmaW5hbCBtZXJnZSBpbmNsdWRpbmcgdGhvc2UgcGFydGl0aW9ucyB3aGVyZSBtZXJnZSB3YXMgYWxyZWFkeQotICAgIC8vIGNvbXBsZXRlZCAtIG51bV9wYXJ0aXRpb25zX21lcmdlX2NvbXBsZXRlXyB3aWxsIHRyYWNrIHRoZW0gd2hlbiBlYWNoCi0gICAgLy8gdGhyZWFkIGV4aXN0cyBpbiBSdW5UaHJlYWQuCi0gICAgaW50IHRvdGFsX3BhcnRpdGlvbnMgPSBuICsgbnVtX3BhcnRpdGlvbnNfbWVyZ2VfY29tcGxldGVfOwotCi0gICAgaWYgKHRvdGFsX3BhcnRpdGlvbnMpIHsKLSAgICAgICAgcGVyY2VudGFnZSA9ICgobnVtX3BhcnRpdGlvbnNfbWVyZ2VfY29tcGxldGVfICogMTAwLjApICsgcGVyY2VudGFnZSkgLyB0b3RhbF9wYXJ0aXRpb25zOwotICAgIH0KLQotICAgIExPRyhERUJVRykgPDwgIk1lcmdlICU6ICIgPDwgcGVyY2VudGFnZQotICAgICAgICAgICAgICAgPDwgIiBudW1fcGFydGl0aW9uc19tZXJnZV9jb21wbGV0ZV86ICIgPDwgbnVtX3BhcnRpdGlvbnNfbWVyZ2VfY29tcGxldGVfCi0gICAgICAgICAgICAgICA8PCAiIHRvdGFsX3BhcnRpdGlvbnM6ICIgPDwgdG90YWxfcGFydGl0aW9ucyA8PCAiIG46ICIgPDwgbjsKLSAgICByZXR1cm4gcGVyY2VudGFnZTsKLX0KLQotYm9vbCBVc2VyU25hcHNob3RTZXJ2ZXI6OlJlbW92ZUFuZEpvaW5IYW5kbGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUpIHsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8SGFuZGxlclRocmVhZD4gaGFuZGxlcjsKLSAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGxvY2tfKTsKLQotICAgICAgICBhdXRvIGl0ZXIgPSBGaW5kSGFuZGxlcigmbG9jaywgbWlzY19uYW1lKTsKLSAgICAgICAgaWYgKGl0ZXIgPT0gZG1fdXNlcnNfLmVuZCgpKSB7Ci0gICAgICAgICAgICAvLyBDbGllbnQgYWxyZWFkeSBkZWxldGVkLgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaGFuZGxlciA9IHN0ZDo6bW92ZSgqaXRlcik7Ci0gICAgICAgIGRtX3VzZXJzXy5lcmFzZShpdGVyKTsKLSAgICB9Ci0KLSAgICBhdXRvJiB0aCA9IGhhbmRsZXItPnRocmVhZCgpOwotICAgIGlmICh0aC5qb2luYWJsZSgpKSB7Ci0gICAgICAgIHRoLmpvaW4oKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgVXNlclNuYXBzaG90U2VydmVyOjpXYWtldXBNb25pdG9yTWVyZ2VUaHJlYWQoKSB7Ci0gICAgdWludDY0X3Qgbm90aWZ5ID0gMTsKLSAgICBzc2l6ZV90IHJjID0gVEVNUF9GQUlMVVJFX1JFVFJZKHdyaXRlKG1vbml0b3JfbWVyZ2VfZXZlbnRfZmRfLmdldCgpLCAmbm90aWZ5LCBzaXplb2Yobm90aWZ5KSkpOwotICAgIGlmIChyYyA8IDApIHsKLSAgICAgICAgUExPRyhGQVRBTCkgPDwgImZhaWxlZCB0byBub3RpZnkgbW9uaXRvciBtZXJnZSB0aHJlYWQiOwotICAgIH0KLX0KLQotdm9pZCBVc2VyU25hcHNob3RTZXJ2ZXI6Ok1vbml0b3JNZXJnZSgpIHsKLSAgICB3aGlsZSAoIXN0b3BfbW9uaXRvcl9tZXJnZV90aHJlYWRfKSB7Ci0gICAgICAgIHVpbnQ2NF90IHRlc3RWYWw7Ci0gICAgICAgIHNzaXplX3QgcmV0ID0KLSAgICAgICAgICAgICAgICBURU1QX0ZBSUxVUkVfUkVUUlkocmVhZChtb25pdG9yX21lcmdlX2V2ZW50X2ZkXy5nZXQoKSwgJnRlc3RWYWwsIHNpemVvZih0ZXN0VmFsKSkpOwotICAgICAgICBpZiAocmV0ID09IC0xKSB7Ci0gICAgICAgICAgICBQTE9HKEZBVEFMKSA8PCAiRmFpbGVkIHRvIHJlYWQgZnJvbSBldmVudGZkIjsKLSAgICAgICAgfSBlbHNlIGlmIChyZXQgPT0gMCkgewotICAgICAgICAgICAgTE9HKEZBVEFMKSA8PCAiSGl0IEVPRiBvbiBldmVudGZkIjsKLSAgICAgICAgfQotCi0gICAgICAgIExPRyhJTkZPKSA8PCAiTW9uaXRvck1lcmdlOiBhY3RpdmUtbWVyZ2UtdGhyZWFkczogIiA8PCBhY3RpdmVfbWVyZ2VfdGhyZWFkc187Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGxvY2tfKTsKLSAgICAgICAgICAgIHdoaWxlIChhY3RpdmVfbWVyZ2VfdGhyZWFkc18gPCBrTWF4TWVyZ2VUaHJlYWRzICYmIG1lcmdlX2hhbmRsZXJzXy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgYXV0byBoYW5kbGVyID0gbWVyZ2VfaGFuZGxlcnNfLmZyb250KCk7Ci0gICAgICAgICAgICAgICAgbWVyZ2VfaGFuZGxlcnNfLnBvcCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKCFoYW5kbGVyLT5zbmFwdXNlcmQoKSkgewotICAgICAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIk1vbml0b3JNZXJnZTogc2tpcHBpbmcgZGVsZXRlZCBoYW5kbGVyOiAiIDw8IGhhbmRsZXItPm1pc2NfbmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIlN0YXJ0aW5nIG1lcmdlIGZvciBwYXJ0aXRpb246ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaGFuZGxlci0+c25hcHVzZXJkKCktPkdldE1pc2NOYW1lKCk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlci0+c25hcHVzZXJkKCktPkluaXRpYXRlTWVyZ2UoKTsKLSAgICAgICAgICAgICAgICBhY3RpdmVfbWVyZ2VfdGhyZWFkc18gKz0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIExPRyhJTkZPKSA8PCAiRXhpdGluZyBNb25pdG9yTWVyZ2U6IHNpemU6ICIgPDwgbWVyZ2VfaGFuZGxlcnNfLnNpemUoKTsKKyAgICByZXR1cm4gaGFuZGxlcnNfLT5BZGRIYW5kbGVyKG1pc2NfbmFtZSwgY293X2RldmljZV9wYXRoLCBiYWNraW5nX2RldmljZSwgYmFzZV9wYXRoX21lcmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbmVyLCBudW1fd29ya2VyX3RocmVhZHMudmFsdWUoKSwgaW9fdXJpbmdfZW5hYmxlZF8sIG9fZGlyZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY293X29wX21lcmdlX3NpemUpOwogfQogCiBib29sIFVzZXJTbmFwc2hvdFNlcnZlcjo6V2FpdEZvclNvY2tldCgpIHsKLSAgICBhdXRvIHNjb3BlX2d1YXJkID0gYW5kcm9pZDo6YmFzZTo6bWFrZV9zY29wZV9ndWFyZChbdGhpc10oKSAtPiB2b2lkIHsgSm9pbkFsbFRocmVhZHMoKTsgfSk7CisgICAgYXV0byBzY29wZV9ndWFyZCA9CisgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjptYWtlX3Njb3BlX2d1YXJkKFt0aGlzXSgpIC0+IHZvaWQgeyBoYW5kbGVyc18tPkpvaW5BbGxUaHJlYWRzKCk7IH0pOwogCiAgICAgYXV0byBzb2NrZXRfcGF0aCA9IEFORFJPSURfU09DS0VUX0RJUiAiLyJzICsga1NuYXB1c2VyZFNvY2tldFByb3h5OwogCkBAIC03ODEsMjEgKzQ3Myw4IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgVXNlclNuYXBzaG90U2VydmVyOjpVcGRhdGVWZXJpZmljYXRpb24oc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+KiBwcm9vZl9vZl9sb2NrKSB7Ci0gICAgQ0hFQ0socHJvb2Zfb2ZfbG9jayk7Ci0KLSAgICBib29sIHN0YXR1cyA9IHRydWU7Ci0gICAgZm9yIChhdXRvIGl0ZXIgPSBkbV91c2Vyc18uYmVnaW4oKTsgaXRlciAhPSBkbV91c2Vyc18uZW5kKCk7IGl0ZXIrKykgewotICAgICAgICBhdXRvJiB0aCA9ICgqaXRlciktPnRocmVhZCgpOwotICAgICAgICBpZiAodGguam9pbmFibGUoKSAmJiBzdGF0dXMpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9ICgqaXRlciktPnNuYXB1c2VyZCgpLT5DaGVja1BhcnRpdGlvblZlcmlmaWNhdGlvbigpICYmIHN0YXR1czsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHJldHVybiBpbW1lZGlhdGVseSBpZiB0aGVyZSBpcyBhIGZhaWx1cmUKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBzdGF0dXM7Citib29sIFVzZXJTbmFwc2hvdFNlcnZlcjo6U3RhcnRIYW5kbGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUpIHsKKyAgICByZXR1cm4gaGFuZGxlcnNfLT5TdGFydEhhbmRsZXIobWlzY19uYW1lKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90CmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX3NlcnZlci5oIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL3NuYXB1c2VyZF9zZXJ2ZXIuaAppbmRleCAxMmMzOTAzLi5mMDAyZThkIDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX3NlcnZlci5oCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfc2VydmVyLmgKQEAgLTMxLDU1ICszMSwxNyBAQAogI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KKyNpbmNsdWRlIDxzbmFwdXNlcmQvYmxvY2tfc2VydmVyLmg+CisjaW5jbHVkZSAiaGFuZGxlcl9tYW5hZ2VyLmgiCiAjaW5jbHVkZSAic25hcHVzZXJkX2NvcmUuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHNuYXBzaG90IHsKIAogc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrTWF4UGFja2V0U2l6ZSA9IDUxMjsKLXN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrTWF4TWVyZ2VUaHJlYWRzID0gMjsKIAotZW51bSBjbGFzcyBEYWVtb25PcHMgewotICAgIElOSVQsCi0gICAgU1RBUlQsCi0gICAgUVVFUlksCi0gICAgU1RPUCwKLSAgICBERUxFVEUsCi0gICAgREVUQUNILAotICAgIFNVUFBPUlRTLAotICAgIElOSVRJQVRFLAotICAgIFBFUkNFTlRBR0UsCi0gICAgR0VUU1RBVFVTLAotICAgIFVQREFURV9WRVJJRlksCi0gICAgSU5WQUxJRCwKLX07Ci0KLWNsYXNzIEhhbmRsZXJUaHJlYWQgewotICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgSGFuZGxlclRocmVhZChzdGQ6OnNoYXJlZF9wdHI8U25hcHNob3RIYW5kbGVyPiBzbmFwdXNlcmQpOwotCi0gICAgdm9pZCBGcmVlUmVzb3VyY2VzKCkgewotICAgICAgICAvLyBFYWNoIHdvcmtlciB0aHJlYWQgaG9sZHMgYSByZWZlcmVuY2UgdG8gc25hcHVzZXJkLgotICAgICAgICAvLyBDbGVhciB0aGVtIHNvIHRoYXQgYWxsIHRoZSByZXNvdXJjZXMKLSAgICAgICAgLy8gaGVsZCBieSBzbmFwdXNlcmQgaXMgcmVsZWFzZWQKLSAgICAgICAgaWYgKHNuYXB1c2VyZF8pIHsKLSAgICAgICAgICAgIHNuYXB1c2VyZF8tPkZyZWVSZXNvdXJjZXMoKTsKLSAgICAgICAgICAgIHNuYXB1c2VyZF8gPSBudWxscHRyOwotICAgICAgICB9Ci0gICAgfQotICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxTbmFwc2hvdEhhbmRsZXI+JiBzbmFwdXNlcmQoKSBjb25zdCB7IHJldHVybiBzbmFwdXNlcmRfOyB9Ci0gICAgc3RkOjp0aHJlYWQmIHRocmVhZCgpIHsgcmV0dXJuIHRocmVhZF87IH0KLQotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUoKSBjb25zdCB7IHJldHVybiBtaXNjX25hbWVfOyB9Ci0gICAgYm9vbCBUaHJlYWRUZXJtaW5hdGVkKCkgeyByZXR1cm4gdGhyZWFkX3Rlcm1pbmF0ZWRfOyB9Ci0gICAgdm9pZCBTZXRUaHJlYWRUZXJtaW5hdGVkKCkgeyB0aHJlYWRfdGVybWluYXRlZF8gPSB0cnVlOyB9Ci0KLSAgcHJpdmF0ZToKLSAgICBzdGQ6OnRocmVhZCB0aHJlYWRfOwotICAgIHN0ZDo6c2hhcmVkX3B0cjxTbmFwc2hvdEhhbmRsZXI+IHNuYXB1c2VyZF87Ci0gICAgc3RkOjpzdHJpbmcgbWlzY19uYW1lXzsKLSAgICBib29sIHRocmVhZF90ZXJtaW5hdGVkXyA9IGZhbHNlOwotfTsKK3N0YXRpYyBjb25zdGV4cHIgY2hhciBrQm9vdFNuYXBzaG90c1dpdGhvdXRTbG90U3dpdGNoW10gPQorICAgICAgICAiL21ldGFkYXRhL290YS9zbmFwc2hvdC1ib290LXdpdGhvdXQtc2xvdC1zd2l0Y2giOwogCiBjbGFzcyBVc2VyU25hcHNob3RTZXJ2ZXIgewogICBwcml2YXRlOgpAQCAtODgsMjEgKzUwLDEzIEBACiAgICAgdm9sYXRpbGUgYm9vbCByZWNlaXZlZF9zb2NrZXRfc2lnbmFsXyA9IGZhbHNlOwogICAgIHN0ZDo6dmVjdG9yPHN0cnVjdCBwb2xsZmQ+IHdhdGNoZWRfZmRzXzsKICAgICBib29sIGlzX3NvY2tldF9wcmVzZW50XyA9IGZhbHNlOwotICAgIGludCBudW1fcGFydGl0aW9uc19tZXJnZV9jb21wbGV0ZV8gPSAwOwotICAgIGludCBhY3RpdmVfbWVyZ2VfdGhyZWFkc18gPSAwOwotICAgIGJvb2wgc3RvcF9tb25pdG9yX21lcmdlX3RocmVhZF8gPSBmYWxzZTsKICAgICBib29sIGlzX3NlcnZlcl9ydW5uaW5nXyA9IGZhbHNlOwogICAgIGJvb2wgaW9fdXJpbmdfZW5hYmxlZF8gPSBmYWxzZTsKLSAgICBzdGQ6Om9wdGlvbmFsPGJvb2w+IGlzX21lcmdlX21vbml0b3Jfc3RhcnRlZF87Ci0KLSAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgbW9uaXRvcl9tZXJnZV9ldmVudF9mZF87CisgICAgc3RkOjp1bmlxdWVfcHRyPElTbmFwc2hvdEhhbmRsZXJNYW5hZ2VyPiBoYW5kbGVyc187CisgICAgc3RkOjp1bmlxdWVfcHRyPElCbG9ja1NlcnZlckZhY3Rvcnk+IGJsb2NrX3NlcnZlcl9mYWN0b3J5XzsKIAogICAgIHN0ZDo6bXV0ZXggbG9ja187CiAKLSAgICB1c2luZyBIYW5kbGVyTGlzdCA9IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyVGhyZWFkPj47Ci0gICAgSGFuZGxlckxpc3QgZG1fdXNlcnNfOwotICAgIHN0ZDo6cXVldWU8c3RkOjpzaGFyZWRfcHRyPEhhbmRsZXJUaHJlYWQ+PiBtZXJnZV9oYW5kbGVyc187Ci0KICAgICB2b2lkIEFkZFdhdGNoZWRGZChhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBmZCwgaW50IGV2ZW50cyk7CiAgICAgdm9pZCBBY2NlcHRDbGllbnQoKTsKICAgICBib29sIEhhbmRsZUNsaWVudChhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBmZCwgaW50IHJldmVudHMpOwpAQCAtMTExLDI4ICs2NSwxNCBAQAogICAgIGJvb2wgUmVjZWl2ZW1zZyhhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBmZCwgY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7CiAKICAgICB2b2lkIFNodXRkb3duVGhyZWFkcygpOwotICAgIGJvb2wgUmVtb3ZlQW5kSm9pbkhhbmRsZXIoY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRyb2xfZGV2aWNlKTsKLSAgICBEYWVtb25PcHMgUmVzb2x2ZW9wKHN0ZDo6c3RyaW5nJiBpbnB1dCk7CiAgICAgc3RkOjpzdHJpbmcgR2V0RGFlbW9uU3RhdHVzKCk7CiAgICAgdm9pZCBQYXJzZW1zZyhzdGQ6OnN0cmluZyBjb25zdCYgbXNnLCBjb25zdCBjaGFyIGRlbGltLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIG91dCk7CiAKICAgICBib29sIElzVGVybWluYXRpbmcoKSB7IHJldHVybiB0ZXJtaW5hdGluZ187IH0KIAotICAgIHZvaWQgUnVuVGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyVGhyZWFkPiBoYW5kbGVyKTsKLSAgICB2b2lkIE1vbml0b3JNZXJnZSgpOwotCiAgICAgdm9pZCBKb2luQWxsVGhyZWFkcygpOwogICAgIGJvb2wgU3RhcnRXaXRoU29ja2V0KGJvb2wgc3RhcnRfbGlzdGVuaW5nKTsKIAotICAgIC8vIEZpbmQgYSBIYW5kbGVyVGhyZWFkIHdpdGhpbiBhIGxvY2suCi0gICAgSGFuZGxlckxpc3Q6Oml0ZXJhdG9yIEZpbmRIYW5kbGVyKHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiogcHJvb2Zfb2ZfbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pc2NfbmFtZSk7Ci0KLSAgICBkb3VibGUgR2V0TWVyZ2VQZXJjZW50YWdlKHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiogcHJvb2Zfb2ZfbG9jayk7Ci0gICAgdm9pZCBUZXJtaW5hdGVNZXJnZVRocmVhZHMoc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+KiBwcm9vZl9vZl9sb2NrKTsKLQotICAgIGJvb2wgVXBkYXRlVmVyaWZpY2F0aW9uKHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiogcHJvb2Zfb2ZfbG9jayk7Ci0KICAgcHVibGljOgogICAgIFVzZXJTbmFwc2hvdFNlcnZlcigpOwogICAgIH5Vc2VyU25hcHNob3RTZXJ2ZXIoKTsKQEAgLTE0NiwxMyArODYsMTIgQEAKICAgICBzdGQ6OnNoYXJlZF9wdHI8SGFuZGxlclRocmVhZD4gQWRkSGFuZGxlcihjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb3dfZGV2aWNlX3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJhY2tpbmdfZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBiYXNlX3BhdGhfbWVyZ2UpOwotICAgIGJvb2wgU3RhcnRIYW5kbGVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyVGhyZWFkPiYgaGFuZGxlcik7Ci0gICAgYm9vbCBTdGFydE1lcmdlKHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiogcHJvb2Zfb2ZfbG9jaywKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEhhbmRsZXJUaHJlYWQ+JiBoYW5kbGVyKTsKLSAgICBzdGQ6OnN0cmluZyBHZXRNZXJnZVN0YXR1cyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SGFuZGxlclRocmVhZD4mIGhhbmRsZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBiYXNlX3BhdGhfbWVyZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvcHRpb25hbDx1aW50MzJfdD4gbnVtX3dvcmtlcl90aHJlYWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb19kaXJlY3QgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb3dfb3BfbWVyZ2Vfc2l6ZSA9IDApOworICAgIGJvb2wgU3RhcnRIYW5kbGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaXNjX25hbWUpOwogCi0gICAgdm9pZCBXYWtldXBNb25pdG9yTWVyZ2VUaHJlYWQoKTsKICAgICB2b2lkIFNldFRlcm1pbmF0aW5nKCkgeyB0ZXJtaW5hdGluZ18gPSB0cnVlOyB9CiAgICAgdm9pZCBSZWNlaXZlZFNvY2tldFNpZ25hbCgpIHsgcmVjZWl2ZWRfc29ja2V0X3NpZ25hbF8gPSB0cnVlOyB9CiAgICAgdm9pZCBTZXRTZXJ2ZXJSdW5uaW5nKCkgeyBpc19zZXJ2ZXJfcnVubmluZ18gPSB0cnVlOyB9CmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX3Rlc3QuY3BwIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL3NuYXB1c2VyZF90ZXN0LmNwcAppbmRleCAxNDIxNDAzLi40ZGZiOWJmIDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX3Rlc3QuY3BwCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfdGVzdC5jcHAKQEAgLTE3LDcgKzE3LDYgQEAKIAogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tZW1mZC5oPgogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KQEAgLTM3LDEyICszNiwxNiBAQAogI2luY2x1ZGUgPGxpYmRtL2RtLmg+CiAjaW5jbHVkZSA8bGliZG0vbG9vcF9jb250cm9sLmg+CiAjaW5jbHVkZSA8bGlic25hcHNob3QvY293X3dyaXRlci5oPgotI2luY2x1ZGUgPHNuYXB1c2VyZC9zbmFwdXNlcmRfY2xpZW50Lmg+CisjaW5jbHVkZSA8c25hcHVzZXJkL2RtX3VzZXJfYmxvY2tfc2VydmVyLmg+CiAjaW5jbHVkZSA8c3RvcmFnZV9saXRlcmFscy9zdG9yYWdlX2xpdGVyYWxzLmg+Ci0KKyNpbmNsdWRlICJoYW5kbGVyX21hbmFnZXIuaCIKKyNpbmNsdWRlICJtZXJnZV93b3JrZXIuaCIKKyNpbmNsdWRlICJyZWFkX3dvcmtlci5oIgogI2luY2x1ZGUgInNuYXB1c2VyZF9jb3JlLmgiCi0KLURFRklORV9zdHJpbmcoZm9yY2VfY29uZmlnLCAiIiwgIkZvcmNlIHRlc3RpbmcgbW9kZSB3aXRoIGlvdXJpbmcgZGlzYWJsZWQiKTsKKyNpbmNsdWRlICJ0ZXN0aW5nL2RtX3VzZXJfaGFybmVzcy5oIgorI2luY2x1ZGUgInRlc3RpbmcvaG9zdF9oYXJuZXNzLmgiCisjaW5jbHVkZSAidGVzdGluZy90ZW1wX2RldmljZS5oIgorI2luY2x1ZGUgInV0aWxpdHkuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHNuYXBzaG90IHsKQEAgLTUzLDIwNCArNTYsNjkgQEAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpkbTsKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyB0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlOwordXNpbmcgdGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0OwordXNpbmcgdGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzczsKK3VzaW5nIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTsKIAotc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtTbmFwdXNlcmRTb2NrZXRUZXN0W10gPSAic25hcHVzZXJkVGVzdCI7Ci0KLWNsYXNzIFRlbXBkZXZpY2UgewotICBwdWJsaWM6Ci0gICAgVGVtcGRldmljZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgRG1UYWJsZSYgdGFibGUpCi0gICAgICAgIDogZG1fKERldmljZU1hcHBlcjo6SW5zdGFuY2UoKSksIG5hbWVfKG5hbWUpLCB2YWxpZF8oZmFsc2UpIHsKLSAgICAgICAgdmFsaWRfID0gZG1fLkNyZWF0ZURldmljZShuYW1lLCB0YWJsZSwgJnBhdGhfLCBzdGQ6OmNocm9ubzo6c2Vjb25kcyg1KSk7Ci0gICAgfQotICAgIFRlbXBkZXZpY2UoVGVtcGRldmljZSYmIG90aGVyKSBub2V4Y2VwdAotICAgICAgICA6IGRtXyhvdGhlci5kbV8pLCBuYW1lXyhvdGhlci5uYW1lXyksIHBhdGhfKG90aGVyLnBhdGhfKSwgdmFsaWRfKG90aGVyLnZhbGlkXykgewotICAgICAgICBvdGhlci52YWxpZF8gPSBmYWxzZTsKLSAgICB9Ci0gICAgflRlbXBkZXZpY2UoKSB7Ci0gICAgICAgIGlmICh2YWxpZF8pIHsKLSAgICAgICAgICAgIGRtXy5EZWxldGVEZXZpY2UobmFtZV8pOwotICAgICAgICB9Ci0gICAgfQotICAgIGJvb2wgRGVzdHJveSgpIHsKLSAgICAgICAgaWYgKCF2YWxpZF8pIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICB2YWxpZF8gPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGRtXy5EZWxldGVEZXZpY2UobmFtZV8pOwotICAgIH0KLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCgpIGNvbnN0IHsgcmV0dXJuIHBhdGhfOyB9Ci0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQotICAgIGJvb2wgdmFsaWQoKSBjb25zdCB7IHJldHVybiB2YWxpZF87IH0KLQotICAgIFRlbXBkZXZpY2UoY29uc3QgVGVtcGRldmljZSYpID0gZGVsZXRlOwotICAgIFRlbXBkZXZpY2UmIG9wZXJhdG9yPShjb25zdCBUZW1wZGV2aWNlJikgPSBkZWxldGU7Ci0KLSAgICBUZW1wZGV2aWNlJiBvcGVyYXRvcj0oVGVtcGRldmljZSYmIG90aGVyKSBub2V4Y2VwdCB7Ci0gICAgICAgIG5hbWVfID0gb3RoZXIubmFtZV87Ci0gICAgICAgIHZhbGlkXyA9IG90aGVyLnZhbGlkXzsKLSAgICAgICAgb3RoZXIudmFsaWRfID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBEZXZpY2VNYXBwZXImIGRtXzsKLSAgICBzdGQ6OnN0cmluZyBuYW1lXzsKLSAgICBzdGQ6OnN0cmluZyBwYXRoXzsKLSAgICBib29sIHZhbGlkXzsKK3N0cnVjdCBUZXN0UGFyYW0geworICAgIGJvb2wgaW9fdXJpbmc7CisgICAgYm9vbCBvX2RpcmVjdDsKKyAgICBzdGQ6OnN0cmluZyBjb21wcmVzc2lvbjsKKyAgICBpbnQgYmxvY2tfc2l6ZTsKKyAgICBpbnQgbnVtX3RocmVhZHM7CisgICAgdWludDMyX3QgY293X29wX21lcmdlX3NpemU7CiB9OwogCi1jbGFzcyBTbmFwdXNlcmRUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gIHB1YmxpYzoKLSAgICBib29sIFNldHVwRGVmYXVsdCgpOwotICAgIGJvb2wgU2V0dXBPcmRlcmVkT3BzKCk7Ci0gICAgYm9vbCBTZXR1cE9yZGVyZWRPcHNJbnZlcnRlZCgpOwotICAgIGJvb2wgU2V0dXBDb3B5T3ZlcmxhcF8xKCk7Ci0gICAgYm9vbCBTZXR1cENvcHlPdmVybGFwXzIoKTsKLSAgICBib29sIE1lcmdlKCk7Ci0gICAgdm9pZCBWYWxpZGF0ZU1lcmdlKCk7Ci0gICAgdm9pZCBSZWFkU25hcHNob3REZXZpY2VBbmRWYWxpZGF0ZSgpOwotICAgIHZvaWQgU2h1dGRvd24oKTsKLSAgICB2b2lkIE1lcmdlSW50ZXJydXB0KCk7Ci0gICAgdm9pZCBNZXJnZUludGVycnVwdEZpeGVkKGludCBkdXJhdGlvbik7Ci0gICAgdm9pZCBNZXJnZUludGVycnVwdFJhbmRvbWx5KGludCBtYXhfZHVyYXRpb24pOwotICAgIHZvaWQgU3RhcnRNZXJnZSgpOwotICAgIHZvaWQgQ2hlY2tNZXJnZUNvbXBsZXRpb24oKTsKLQotICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBrU2VjdG9yU2l6ZSA9IDUxMjsKLQorY2xhc3MgU25hcHVzZXJkVGVzdEJhc2UgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPFRlc3RQYXJhbT4gewogICBwcm90ZWN0ZWQ6Ci0gICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHt9Ci0gICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsgU2h1dGRvd24oKTsgfQotCi0gIHByaXZhdGU6Ci0gICAgdm9pZCBTZXR1cEltcGwoKTsKLQotICAgIHZvaWQgU2ltdWxhdGVEYWVtb25SZXN0YXJ0KCk7Ci0KLSAgICB2b2lkIENyZWF0ZUNvd0RldmljZSgpOwotICAgIHZvaWQgQ3JlYXRlQ293RGV2aWNlT3JkZXJlZE9wcygpOwotICAgIHZvaWQgQ3JlYXRlQ293RGV2aWNlT3JkZXJlZE9wc0ludmVydGVkKCk7Ci0gICAgdm9pZCBDcmVhdGVDb3dEZXZpY2VXaXRoQ29weU92ZXJsYXBfMSgpOwotICAgIHZvaWQgQ3JlYXRlQ293RGV2aWNlV2l0aENvcHlPdmVybGFwXzIoKTsKLSAgICBib29sIFNldHVwRGFlbW9uKCk7CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlOwogICAgIHZvaWQgQ3JlYXRlQmFzZURldmljZSgpOwotICAgIHZvaWQgSW5pdENvd0RldmljZSgpOworICAgIHZvaWQgQ3JlYXRlQ293RGV2aWNlKCk7CiAgICAgdm9pZCBTZXREZXZpY2VDb250cm9sTmFtZSgpOwotICAgIHZvaWQgSW5pdERhZW1vbigpOwotICAgIHZvaWQgQ3JlYXRlRG1Vc2VyRGV2aWNlKCk7Ci0gICAgdm9pZCBTdGFydFNuYXB1c2VyZERhZW1vbigpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxJQ293V3JpdGVyPiBDcmVhdGVDb3dEZXZpY2VJbnRlcm5hbCgpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxJQ293V3JpdGVyPiBDcmVhdGVWM0NvdygpOwogCi0gICAgdW5pcXVlX3B0cjxMb29wRGV2aWNlPiBiYXNlX2xvb3BfOwotICAgIHVuaXF1ZV9wdHI8VGVtcGRldmljZT4gZG11c2VyX2Rldl87CisgICAgdW5pcXVlX2ZkIEdldENvd0ZkKCkgeyByZXR1cm4gdW5pcXVlX2Zke2R1cChjb3dfc3lzdGVtXy0+ZmQpfTsgfQogCisgICAgc3RkOjp1bmlxdWVfcHRyPElUZXN0SGFybmVzcz4gaGFybmVzc187CisgICAgc2l6ZV90IHNpemVfID0gMTBfTWlCOworICAgIGludCB0b3RhbF9iYXNlX3NpemVfID0gMDsKICAgICBzdGQ6OnN0cmluZyBzeXN0ZW1fZGV2aWNlX2N0cmxfbmFtZV87CiAgICAgc3RkOjpzdHJpbmcgc3lzdGVtX2RldmljZV9uYW1lXzsKIAorICAgIHVuaXF1ZV9wdHI8SUJhY2tpbmdEZXZpY2U+IGJhc2VfZGV2XzsKICAgICB1bmlxdWVfZmQgYmFzZV9mZF87CisKICAgICBzdGQ6OnVuaXF1ZV9wdHI8VGVtcG9yYXJ5RmlsZT4gY293X3N5c3RlbV87Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFNuYXB1c2VyZENsaWVudD4gY2xpZW50XzsKKwogICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IG9yaWdfYnVmZmVyXzsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBtZXJnZWRfYnVmZmVyXzsKLSAgICBib29sIHNldHVwX29rXyA9IGZhbHNlOwotICAgIGJvb2wgbWVyZ2Vfb2tfID0gZmFsc2U7Ci0gICAgc2l6ZV90IHNpemVfID0gMTAwX01pQjsKLSAgICBpbnQgY293X251bV9zZWN0b3JzXzsKLSAgICBpbnQgdG90YWxfYmFzZV9zaXplXzsKIH07CiAKLXN0YXRpYyB1bmlxdWVfZmQgQ3JlYXRlVGVtcEZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHNpemVfdCBzaXplKSB7Ci0gICAgdW5pcXVlX2ZkIGZkKHN5c2NhbGwoX19OUl9tZW1mZF9jcmVhdGUsIG5hbWUuY19zdHIoKSwgTUZEX0FMTE9XX1NFQUxJTkcpKTsKLSAgICBpZiAoZmQgPCAwKSB7Ci0gICAgICAgIHJldHVybiB7fTsKLSAgICB9Ci0gICAgaWYgKHNpemUpIHsKLSAgICAgICAgaWYgKGZ0cnVuY2F0ZShmZCwgc2l6ZSkgPCAwKSB7Ci0gICAgICAgICAgICBwZXJyb3IoImZ0cnVuY2F0ZSIpOwotICAgICAgICAgICAgcmV0dXJuIHt9OwotICAgICAgICB9Ci0gICAgICAgIGlmIChmY250bChmZCwgRl9BRERfU0VBTFMsIEZfU0VBTF9HUk9XIHwgRl9TRUFMX1NIUklOSykgPCAwKSB7Ci0gICAgICAgICAgICBwZXJyb3IoImZjbnRsIik7Ci0gICAgICAgICAgICByZXR1cm4ge307Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZkOwordm9pZCBTbmFwdXNlcmRUZXN0QmFzZTo6U2V0VXAoKSB7CisjaWYgX19BTkRST0lEX18KKyAgICBoYXJuZXNzXyA9IHN0ZDo6bWFrZV91bmlxdWU8RG1Vc2VyVGVzdEhhcm5lc3M+KCk7CisjZWxzZQorICAgIGhhcm5lc3NfID0gc3RkOjptYWtlX3VuaXF1ZTxIb3N0VGVzdEhhcm5lc3M+KCk7CisjZW5kaWYKIH0KIAotdm9pZCBTbmFwdXNlcmRUZXN0OjpTaHV0ZG93bigpIHsKLSAgICBBU1NFUlRfVFJVRShkbXVzZXJfZGV2Xy0+RGVzdHJveSgpKTsKLQotICAgIGF1dG8gbWlzY19kZXZpY2UgPSAiL2Rldi9kbS11c2VyLyIgKyBzeXN0ZW1fZGV2aWNlX2N0cmxfbmFtZV87Ci0gICAgQVNTRVJUX1RSVUUoY2xpZW50Xy0+V2FpdEZvckRldmljZURlbGV0ZShzeXN0ZW1fZGV2aWNlX2N0cmxfbmFtZV8pKTsKLSAgICBBU1NFUlRfVFJVRShhbmRyb2lkOjpmc19tZ3I6OldhaXRGb3JGaWxlRGVsZXRlZChtaXNjX2RldmljZSwgMTBzKSk7Ci0gICAgQVNTRVJUX1RSVUUoY2xpZW50Xy0+RGV0YWNoU25hcHVzZXJkKCkpOwordm9pZCBTbmFwdXNlcmRUZXN0QmFzZTo6VGVhckRvd24oKSB7CisgICAgY293X3N5c3RlbV8gPSBudWxscHRyOwogfQogCi1ib29sIFNuYXB1c2VyZFRlc3Q6OlNldHVwRGVmYXVsdCgpIHsKLSAgICBTZXR1cEltcGwoKTsKLSAgICByZXR1cm4gc2V0dXBfb2tfOwotfQotCi1ib29sIFNuYXB1c2VyZFRlc3Q6OlNldHVwT3JkZXJlZE9wcygpIHsKLSAgICBDcmVhdGVCYXNlRGV2aWNlKCk7Ci0gICAgQ3JlYXRlQ293RGV2aWNlT3JkZXJlZE9wcygpOwotICAgIHJldHVybiBTZXR1cERhZW1vbigpOwotfQotCi1ib29sIFNuYXB1c2VyZFRlc3Q6OlNldHVwT3JkZXJlZE9wc0ludmVydGVkKCkgewotICAgIENyZWF0ZUJhc2VEZXZpY2UoKTsKLSAgICBDcmVhdGVDb3dEZXZpY2VPcmRlcmVkT3BzSW52ZXJ0ZWQoKTsKLSAgICByZXR1cm4gU2V0dXBEYWVtb24oKTsKLX0KLQotYm9vbCBTbmFwdXNlcmRUZXN0OjpTZXR1cENvcHlPdmVybGFwXzEoKSB7Ci0gICAgQ3JlYXRlQmFzZURldmljZSgpOwotICAgIENyZWF0ZUNvd0RldmljZVdpdGhDb3B5T3ZlcmxhcF8xKCk7Ci0gICAgcmV0dXJuIFNldHVwRGFlbW9uKCk7Ci19Ci0KLWJvb2wgU25hcHVzZXJkVGVzdDo6U2V0dXBDb3B5T3ZlcmxhcF8yKCkgewotICAgIENyZWF0ZUJhc2VEZXZpY2UoKTsKLSAgICBDcmVhdGVDb3dEZXZpY2VXaXRoQ29weU92ZXJsYXBfMigpOwotICAgIHJldHVybiBTZXR1cERhZW1vbigpOwotfQotCi1ib29sIFNuYXB1c2VyZFRlc3Q6OlNldHVwRGFlbW9uKCkgewotICAgIFNldERldmljZUNvbnRyb2xOYW1lKCk7Ci0KLSAgICBTdGFydFNuYXB1c2VyZERhZW1vbigpOwotCi0gICAgQ3JlYXRlRG1Vc2VyRGV2aWNlKCk7Ci0gICAgSW5pdENvd0RldmljZSgpOwotICAgIEluaXREYWVtb24oKTsKLQotICAgIHNldHVwX29rXyA9IHRydWU7Ci0KLSAgICByZXR1cm4gc2V0dXBfb2tfOwotfQotCi12b2lkIFNuYXB1c2VyZFRlc3Q6OlN0YXJ0U25hcHVzZXJkRGFlbW9uKCkgewotICAgIHBpZF90IHBpZCA9IGZvcmsoKTsKLSAgICBBU1NFUlRfR0UocGlkLCAwKTsKLSAgICBpZiAocGlkID09IDApIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgYXJnMCA9ICIvc3lzdGVtL2Jpbi9zbmFwdXNlcmQiOwotICAgICAgICBzdGQ6OnN0cmluZyBhcmcxID0gIi1zb2NrZXQ9InMgKyBrU25hcHVzZXJkU29ja2V0VGVzdDsKLSAgICAgICAgY2hhciogY29uc3QgYXJndltdID0ge2FyZzAuZGF0YSgpLCBhcmcxLmRhdGEoKSwgbnVsbHB0cn07Ci0gICAgICAgIEFTU0VSVF9HRShleGVjdihhcmcwLmNfc3RyKCksIGFyZ3YpLCAwKTsKLSAgICB9IGVsc2UgewotICAgICAgICBjbGllbnRfID0gU25hcHVzZXJkQ2xpZW50OjpDb25uZWN0KGtTbmFwdXNlcmRTb2NrZXRUZXN0LCAxMHMpOwotICAgICAgICBBU1NFUlRfTkUoY2xpZW50XywgbnVsbHB0cik7Ci0gICAgfQotfQotCi12b2lkIFNuYXB1c2VyZFRlc3Q6OkNyZWF0ZUJhc2VEZXZpY2UoKSB7Ci0gICAgdW5pcXVlX2ZkIHJuZF9mZDsKLQordm9pZCBTbmFwdXNlcmRUZXN0QmFzZTo6Q3JlYXRlQmFzZURldmljZSgpIHsKICAgICB0b3RhbF9iYXNlX3NpemVfID0gKHNpemVfICogNSk7Ci0gICAgYmFzZV9mZF8gPSBDcmVhdGVUZW1wRmlsZSgiYmFzZV9kZXZpY2UiLCB0b3RhbF9iYXNlX3NpemVfKTsKKworICAgIGJhc2VfZGV2XyA9IGhhcm5lc3NfLT5DcmVhdGVCYWNraW5nRGV2aWNlKHRvdGFsX2Jhc2Vfc2l6ZV8pOworICAgIEFTU0VSVF9ORShiYXNlX2Rldl8sIG51bGxwdHIpOworCisgICAgYmFzZV9mZF8ucmVzZXQob3BlbihiYXNlX2Rldl8tPkdldFBhdGgoKS5jX3N0cigpLCBPX1JEV1IgfCBPX0NMT0VYRUMpKTsKICAgICBBU1NFUlRfR0UoYmFzZV9mZF8sIDApOwogCi0gICAgcm5kX2ZkLnJlc2V0KG9wZW4oIi9kZXYvcmFuZG9tIiwgT19SRE9OTFkpKTsKLSAgICBBU1NFUlRfVFJVRShybmRfZmQgPiAwKTsKKyAgICB1bmlxdWVfZmQgcm5kX2ZkKG9wZW4oIi9kZXYvcmFuZG9tIiwgT19SRE9OTFkpKTsKKyAgICBBU1NFUlRfR0Uocm5kX2ZkLCAwKTsKIAogICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IHJhbmRvbV9idWZmZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPHVpbnQ4X3RbXT4oMV9NaUIpOwogCkBAIC0yNjAsMTMgKzEyOCwyNDYgQEAKICAgICB9CiAKICAgICBBU1NFUlRfRVEobHNlZWsoYmFzZV9mZF8sIDAsIFNFRUtfU0VUKSwgMCk7Cit9CiAKLSAgICBiYXNlX2xvb3BfID0gc3RkOjptYWtlX3VuaXF1ZTxMb29wRGV2aWNlPihiYXNlX2ZkXywgMTBzKTsKLSAgICBBU1NFUlRfVFJVRShiYXNlX2xvb3BfLT52YWxpZCgpKTsKK3N0ZDo6dW5pcXVlX3B0cjxJQ293V3JpdGVyPiBTbmFwdXNlcmRUZXN0QmFzZTo6Q3JlYXRlQ293RGV2aWNlSW50ZXJuYWwoKSB7CisgICAgc3RkOjpzdHJpbmcgcGF0aCA9IGFuZHJvaWQ6OmJhc2U6OkdldEV4ZWN1dGFibGVEaXJlY3RvcnkoKTsKKyAgICBjb3dfc3lzdGVtXyA9IHN0ZDo6bWFrZV91bmlxdWU8VGVtcG9yYXJ5RmlsZT4ocGF0aCk7CisKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5jb21wcmVzc2lvbiA9ICJneiI7CisKKyAgICByZXR1cm4gQ3JlYXRlQ293V3JpdGVyKDIsIG9wdGlvbnMsIEdldENvd0ZkKCkpOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8SUNvd1dyaXRlcj4gU25hcHVzZXJkVGVzdEJhc2U6OkNyZWF0ZVYzQ293KCkgeworICAgIGNvbnN0IFRlc3RQYXJhbSBwYXJhbXMgPSBHZXRQYXJhbSgpOworCisgICAgQ293T3B0aW9ucyBvcHRpb25zOworICAgIG9wdGlvbnMub3BfY291bnRfbWF4ID0gMTAwMDAwOworICAgIG9wdGlvbnMuY29tcHJlc3Npb24gPSBwYXJhbXMuY29tcHJlc3Npb247CisgICAgb3B0aW9ucy5udW1fY29tcHJlc3NfdGhyZWFkcyA9IHBhcmFtcy5udW1fdGhyZWFkczsKKyAgICBvcHRpb25zLmJhdGNoX3dyaXRlID0gdHJ1ZTsKKyAgICBvcHRpb25zLmNvbXByZXNzaW9uX2ZhY3RvciA9IHBhcmFtcy5ibG9ja19zaXplOworCisgICAgc3RkOjpzdHJpbmcgcGF0aCA9IGFuZHJvaWQ6OmJhc2U6OkdldEV4ZWN1dGFibGVEaXJlY3RvcnkoKTsKKyAgICBjb3dfc3lzdGVtXyA9IHN0ZDo6bWFrZV91bmlxdWU8VGVtcG9yYXJ5RmlsZT4ocGF0aCk7CisKKyAgICByZXR1cm4gQ3JlYXRlQ293V3JpdGVyKDMsIG9wdGlvbnMsIEdldENvd0ZkKCkpOworfQorCit2b2lkIFNuYXB1c2VyZFRlc3RCYXNlOjpDcmVhdGVDb3dEZXZpY2UoKSB7CisgICAgdW5pcXVlX2ZkIHJuZF9mZDsKKyAgICBsb2ZmX3Qgb2Zmc2V0ID0gMDsKKworICAgIGF1dG8gd3JpdGVyID0gQ3JlYXRlQ293RGV2aWNlSW50ZXJuYWwoKTsKKyAgICBBU1NFUlRfTkUod3JpdGVyLCBudWxscHRyKTsKKworICAgIHJuZF9mZC5yZXNldChvcGVuKCIvZGV2L3JhbmRvbSIsIE9fUkRPTkxZKSk7CisgICAgQVNTRVJUX1RSVUUocm5kX2ZkID4gMCk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiByYW5kb21fYnVmZmVyXzFfID0gc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KHNpemVfKTsKKworICAgIC8vIEZpbGwgcmFuZG9tIGRhdGEKKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IChzaXplXyAvIDFfTWlCKTsgaisrKSB7CisgICAgICAgIEFTU0VSVF9FUShSZWFkRnVsbHlBdE9mZnNldChybmRfZmQsIChjaGFyKilyYW5kb21fYnVmZmVyXzFfLmdldCgpICsgb2Zmc2V0LCAxX01pQiwgMCksCisgICAgICAgICAgICAgICAgICB0cnVlKTsKKworICAgICAgICBvZmZzZXQgKz0gMV9NaUI7CisgICAgfQorCisgICAgc2l6ZV90IG51bV9ibG9ja3MgPSBzaXplXyAvIHdyaXRlci0+R2V0QmxvY2tTaXplKCk7CisgICAgc2l6ZV90IGJsa19lbmRfY29weSA9IG51bV9ibG9ja3MgKiAyOworICAgIHNpemVfdCBzb3VyY2VfYmxrID0gbnVtX2Jsb2NrcyAtIDE7CisgICAgc2l6ZV90IGJsa19zcmNfY29weSA9IGJsa19lbmRfY29weSAtIDE7CisKKyAgICB1aW50MzJfdCBzZXF1ZW5jZVtudW1fYmxvY2tzICogMl07CisgICAgLy8gU2VxdWVuY2UgZm9yIENvcHkgb3BzCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspIHsKKyAgICAgICAgc2VxdWVuY2VbaV0gPSBudW1fYmxvY2tzIC0gMSAtIGk7CisgICAgfQorICAgIC8vIFNlcXVlbmNlIGZvciBYb3Igb3BzCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspIHsKKyAgICAgICAgc2VxdWVuY2VbbnVtX2Jsb2NrcyArIGldID0gNSAqIG51bV9ibG9ja3MgLSAxIC0gaTsKKyAgICB9CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRTZXF1ZW5jZURhdGEoMiAqIG51bV9ibG9ja3MsIHNlcXVlbmNlKSk7CisKKyAgICBzaXplX3QgeCA9IG51bV9ibG9ja3M7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRDb3B5KHNvdXJjZV9ibGssIGJsa19zcmNfY29weSkpOworICAgICAgICB4IC09IDE7CisgICAgICAgIGlmICh4ID09IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHNvdXJjZV9ibGsgLT0gMTsKKyAgICAgICAgYmxrX3NyY19jb3B5IC09IDE7CisgICAgfQorCisgICAgc291cmNlX2JsayA9IG51bV9ibG9ja3M7CisgICAgYmxrX3NyY19jb3B5ID0gYmxrX2VuZF9jb3B5OworCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRSYXdCbG9ja3Moc291cmNlX2JsaywgcmFuZG9tX2J1ZmZlcl8xXy5nZXQoKSwgc2l6ZV8pKTsKKworICAgIHNpemVfdCBibGtfemVyb19jb3B5X3N0YXJ0ID0gc291cmNlX2JsayArIG51bV9ibG9ja3M7CisgICAgc2l6ZV90IGJsa196ZXJvX2NvcHlfZW5kID0gYmxrX3plcm9fY29weV9zdGFydCArIG51bV9ibG9ja3M7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFplcm9CbG9ja3MoYmxrX3plcm9fY29weV9zdGFydCwgbnVtX2Jsb2NrcykpOworCisgICAgc2l6ZV90IGJsa19yYW5kb20yX3JlcGxhY2Vfc3RhcnQgPSBibGtfemVyb19jb3B5X2VuZDsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkUmF3QmxvY2tzKGJsa19yYW5kb20yX3JlcGxhY2Vfc3RhcnQsIHJhbmRvbV9idWZmZXJfMV8uZ2V0KCksIHNpemVfKSk7CisKKyAgICBzaXplX3QgYmxrX3hvcl9zdGFydCA9IGJsa19yYW5kb20yX3JlcGxhY2Vfc3RhcnQgKyBudW1fYmxvY2tzOworICAgIHNpemVfdCB4b3Jfb2Zmc2V0ID0gQkxPQ0tfU1ogLyAyOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWG9yQmxvY2tzKGJsa194b3Jfc3RhcnQsIHJhbmRvbV9idWZmZXJfMV8uZ2V0KCksIHNpemVfLCBudW1fYmxvY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhvcl9vZmZzZXQpKTsKKworICAgIC8vIEZsdXNoIG9wZXJhdGlvbnMKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOworICAgIC8vIENvbnN0cnVjdCB0aGUgYnVmZmVyIHJlcXVpcmVkIGZvciB2YWxpZGF0aW9uCisgICAgb3JpZ19idWZmZXJfID0gc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KHRvdGFsX2Jhc2Vfc2l6ZV8pOworICAgIHN0ZDo6c3RyaW5nIHplcm9fYnVmZmVyKHNpemVfLCAwKTsKKyAgICBBU1NFUlRfRVEoYW5kcm9pZDo6YmFzZTo6UmVhZEZ1bGx5QXRPZmZzZXQoYmFzZV9mZF8sIG9yaWdfYnVmZmVyXy5nZXQoKSwgc2l6ZV8sIHNpemVfKSwgdHJ1ZSk7CisgICAgbWVtY3B5KChjaGFyKilvcmlnX2J1ZmZlcl8uZ2V0KCkgKyBzaXplXywgcmFuZG9tX2J1ZmZlcl8xXy5nZXQoKSwgc2l6ZV8pOworICAgIG1lbWNweSgoY2hhciopb3JpZ19idWZmZXJfLmdldCgpICsgKHNpemVfICogMiksICh2b2lkKil6ZXJvX2J1ZmZlci5jX3N0cigpLCBzaXplXyk7CisgICAgbWVtY3B5KChjaGFyKilvcmlnX2J1ZmZlcl8uZ2V0KCkgKyAoc2l6ZV8gKiAzKSwgcmFuZG9tX2J1ZmZlcl8xXy5nZXQoKSwgc2l6ZV8pOworICAgIEFTU0VSVF9FUShhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHlBdE9mZnNldChiYXNlX2ZkXywgJm9yaWdfYnVmZmVyXy5nZXQoKVtzaXplXyAqIDRdLCBzaXplXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV8gKyB4b3Jfb2Zmc2V0KSwKKyAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplXzsgaSsrKSB7CisgICAgICAgIG9yaWdfYnVmZmVyXy5nZXQoKVsoc2l6ZV8gKiA0KSArIGldID0KKyAgICAgICAgICAgICAgICAodWludDhfdCkob3JpZ19idWZmZXJfLmdldCgpWyhzaXplXyAqIDQpICsgaV0gXiByYW5kb21fYnVmZmVyXzFfLmdldCgpW2ldKTsKKyAgICB9Cit9CisKK3ZvaWQgU25hcHVzZXJkVGVzdEJhc2U6OlNldERldmljZUNvbnRyb2xOYW1lKCkgeworICAgIHN5c3RlbV9kZXZpY2VfbmFtZV8uY2xlYXIoKTsKKyAgICBzeXN0ZW1fZGV2aWNlX2N0cmxfbmFtZV8uY2xlYXIoKTsKKworICAgIHN0ZDo6c3RyaW5nIHN0cihjb3dfc3lzdGVtXy0+cGF0aCk7CisgICAgc3RkOjpzaXplX3QgZm91bmQgPSBzdHIuZmluZF9sYXN0X29mKCIvXFwiKTsKKyAgICBBU1NFUlRfTkUoZm91bmQsIHN0ZDo6c3RyaW5nOjpucG9zKTsKKyAgICBzeXN0ZW1fZGV2aWNlX25hbWVfID0gc3RyLnN1YnN0cihmb3VuZCArIDEpOworCisgICAgc3lzdGVtX2RldmljZV9jdHJsX25hbWVfID0gc3lzdGVtX2RldmljZV9uYW1lXyArICItY3RybCI7Cit9CisKK2NsYXNzIFNuYXB1c2VyZFRlc3QgOiBwdWJsaWMgU25hcHVzZXJkVGVzdEJhc2UgeworICBwdWJsaWM6CisgICAgdm9pZCBTZXR1cERlZmF1bHQoKTsKKyAgICB2b2lkIFNldHVwT3JkZXJlZE9wcygpOworICAgIHZvaWQgU2V0dXBPcmRlcmVkT3BzSW52ZXJ0ZWQoKTsKKyAgICB2b2lkIFNldHVwQ29weU92ZXJsYXBfMSgpOworICAgIHZvaWQgU2V0dXBDb3B5T3ZlcmxhcF8yKCk7CisgICAgdm9pZCBTZXR1cERldmljZUZvclBhc3N0aHJvdWdoKCk7CisgICAgYm9vbCBNZXJnZSgpOworICAgIHZvaWQgVmFsaWRhdGVNZXJnZSgpOworICAgIHZvaWQgUmVhZFNuYXBzaG90RGV2aWNlQW5kVmFsaWRhdGUoKTsKKyAgICB2b2lkIFJlYWRTbmFwc2hvdEFuZFZhbGlkYXRlT3ZlcmxhcHBpbmdCbG9ja3MoKTsKKyAgICB2b2lkIFNodXRkb3duKCk7CisgICAgdm9pZCBNZXJnZUludGVycnVwdCgpOworICAgIHZvaWQgTWVyZ2VJbnRlcnJ1cHRGaXhlZChpbnQgZHVyYXRpb24pOworICAgIHZvaWQgTWVyZ2VJbnRlcnJ1cHRBbmRWYWxpZGF0ZShpbnQgZHVyYXRpb24pOworICAgIHZvaWQgTWVyZ2VJbnRlcnJ1cHRSYW5kb21seShpbnQgbWF4X2R1cmF0aW9uKTsKKyAgICBib29sIFN0YXJ0TWVyZ2UoKTsKKyAgICB2b2lkIENoZWNrTWVyZ2VDb21wbGV0aW9uKCk7CisKKyAgICBzdGF0aWMgY29uc3QgdWludDY0X3Qga1NlY3RvclNpemUgPSA1MTI7CisKKyAgcHJvdGVjdGVkOgorICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZTsKKyAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIFNldHVwSW1wbCgpOworCisgICAgdm9pZCBTaW11bGF0ZURhZW1vblJlc3RhcnQoKTsKKworICAgIHZvaWQgQ3JlYXRlQ293RGV2aWNlV2l0aE5vQmxvY2tDaGFuZ2VzKCk7CisgICAgdm9pZCBWYWxpZGF0ZURldmljZVdpdGhOb0Jsb2NrQ2hhbmdlcygpOworCisgICAgdm9pZCBDcmVhdGVDb3dEZXZpY2VPcmRlcmVkT3BzKCk7CisgICAgdm9pZCBDcmVhdGVDb3dEZXZpY2VPcmRlcmVkT3BzSW52ZXJ0ZWQoKTsKKyAgICB2b2lkIENyZWF0ZUNvd0RldmljZVdpdGhDb3B5T3ZlcmxhcF8xKCk7CisgICAgdm9pZCBDcmVhdGVDb3dEZXZpY2VXaXRoQ29weU92ZXJsYXBfMigpOworICAgIHZvaWQgU2V0dXBEYWVtb24oKTsKKyAgICB2b2lkIEluaXRDb3dEZXZpY2UoKTsKKyAgICB2b2lkIEluaXREYWVtb24oKTsKKyAgICB2b2lkIENyZWF0ZVVzZXJEZXZpY2UoKTsKKworICAgIHVuaXF1ZV9wdHI8SVVzZXJEZXZpY2U+IGRtdXNlcl9kZXZfOworCisgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gbWVyZ2VkX2J1ZmZlcl87CisgICAgc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90SGFuZGxlck1hbmFnZXI+IGhhbmRsZXJzXzsKKyAgICBpbnQgY293X251bV9zZWN0b3JzXzsKK307CisKK3ZvaWQgU25hcHVzZXJkVGVzdDo6U2V0VXAoKSB7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU25hcHVzZXJkVGVzdEJhc2U6OlNldFVwKCkpOworICAgIGhhbmRsZXJzXyA9IHN0ZDo6bWFrZV91bmlxdWU8U25hcHNob3RIYW5kbGVyTWFuYWdlcj4oKTsKK30KKwordm9pZCBTbmFwdXNlcmRUZXN0OjpUZWFyRG93bigpIHsKKyAgICBTbmFwdXNlcmRUZXN0QmFzZTo6VGVhckRvd24oKTsKKyAgICBTaHV0ZG93bigpOworfQorCit2b2lkIFNuYXB1c2VyZFRlc3Q6OlNodXRkb3duKCkgeworICAgIGlmIChkbXVzZXJfZGV2XykgeworICAgICAgICBBU1NFUlRfVFJVRShkbXVzZXJfZGV2Xy0+RGVzdHJveSgpKTsKKyAgICB9CisKKyAgICBhdXRvIG1pc2NfZGV2aWNlID0gIi9kZXYvZG0tdXNlci8iICsgc3lzdGVtX2RldmljZV9jdHJsX25hbWVfOworICAgIEFTU0VSVF9UUlVFKGhhbmRsZXJzXy0+RGVsZXRlSGFuZGxlcihzeXN0ZW1fZGV2aWNlX2N0cmxfbmFtZV8pKTsKKyAgICBBU1NFUlRfVFJVRShhbmRyb2lkOjpmc19tZ3I6OldhaXRGb3JGaWxlRGVsZXRlZChtaXNjX2RldmljZSwgMTBzKSk7CisgICAgaGFuZGxlcnNfLT5UZXJtaW5hdGVNZXJnZVRocmVhZHMoKTsKKyAgICBoYW5kbGVyc18tPkpvaW5BbGxUaHJlYWRzKCk7CisgICAgaGFuZGxlcnNfID0gc3RkOjptYWtlX3VuaXF1ZTxTbmFwc2hvdEhhbmRsZXJNYW5hZ2VyPigpOworfQorCit2b2lkIFNuYXB1c2VyZFRlc3Q6OlNldHVwRGVmYXVsdCgpIHsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShTZXR1cEltcGwoKSk7Cit9CisKK3ZvaWQgU25hcHVzZXJkVGVzdDo6U2V0dXBPcmRlcmVkT3BzKCkgeworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKENyZWF0ZUJhc2VEZXZpY2UoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoQ3JlYXRlQ293RGV2aWNlT3JkZXJlZE9wcygpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShTZXR1cERhZW1vbigpKTsKK30KKwordm9pZCBTbmFwdXNlcmRUZXN0OjpTZXR1cERldmljZUZvclBhc3N0aHJvdWdoKCkgeworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKENyZWF0ZUJhc2VEZXZpY2UoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoQ3JlYXRlQ293RGV2aWNlV2l0aE5vQmxvY2tDaGFuZ2VzKCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNldHVwRGFlbW9uKCkpOworfQorCit2b2lkIFNuYXB1c2VyZFRlc3Q6OlNldHVwT3JkZXJlZE9wc0ludmVydGVkKCkgeworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKENyZWF0ZUJhc2VEZXZpY2UoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoQ3JlYXRlQ293RGV2aWNlT3JkZXJlZE9wc0ludmVydGVkKCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNldHVwRGFlbW9uKCkpOworfQorCit2b2lkIFNuYXB1c2VyZFRlc3Q6OlNldHVwQ29weU92ZXJsYXBfMSgpIHsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShDcmVhdGVCYXNlRGV2aWNlKCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKENyZWF0ZUNvd0RldmljZVdpdGhDb3B5T3ZlcmxhcF8xKCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNldHVwRGFlbW9uKCkpOworfQorCit2b2lkIFNuYXB1c2VyZFRlc3Q6OlNldHVwQ29weU92ZXJsYXBfMigpIHsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShDcmVhdGVCYXNlRGV2aWNlKCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKENyZWF0ZUNvd0RldmljZVdpdGhDb3B5T3ZlcmxhcF8yKCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNldHVwRGFlbW9uKCkpOworfQorCit2b2lkIFNuYXB1c2VyZFRlc3Q6OlNldHVwRGFlbW9uKCkgeworICAgIFNldERldmljZUNvbnRyb2xOYW1lKCk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShDcmVhdGVVc2VyRGV2aWNlKCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXRDb3dEZXZpY2UoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdERhZW1vbigpKTsKIH0KIAogdm9pZCBTbmFwdXNlcmRUZXN0OjpSZWFkU25hcHNob3REZXZpY2VBbmRWYWxpZGF0ZSgpIHsKLSAgICB1bmlxdWVfZmQgZmQob3BlbihkbXVzZXJfZGV2Xy0+cGF0aCgpLmNfc3RyKCksIE9fUkRPTkxZKSk7CisgICAgdW5pcXVlX2ZkIGZkKG9wZW4oZG11c2VyX2Rldl8tPkdldFBhdGgoKS5jX3N0cigpLCBPX1JET05MWSkpOwogICAgIEFTU0VSVF9HRShmZCwgMCk7CiAgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gc25hcHVzZXJkX2J1ZmZlciA9IHN0ZDo6bWFrZV91bmlxdWU8dWludDhfdFtdPihzaXplXyk7CiAKQEAgLTI5NiwyMyArMzk3LDg3IEBACiAgICAgQVNTRVJUX0VRKG1lbWNtcChzbmFwdXNlcmRfYnVmZmVyLmdldCgpLCAoY2hhciopb3JpZ19idWZmZXJfLmdldCgpICsgKHNpemVfICogNCksIHNpemVfKSwgMCk7CiB9CiAKK3ZvaWQgU25hcHVzZXJkVGVzdDo6UmVhZFNuYXBzaG90QW5kVmFsaWRhdGVPdmVybGFwcGluZ0Jsb2NrcygpIHsKKyAgICAvLyBPcGVuIENPVyBkZXZpY2UKKyAgICB1bmlxdWVfZmQgZmQob3Blbihjb3dfc3lzdGVtXy0+cGF0aCwgT19SRE9OTFkpKTsKKyAgICBBU1NFUlRfR0UoZmQsIDApOworCisgICAgQ293UmVhZGVyIHJlYWRlcjsKKyAgICBBU1NFUlRfVFJVRShyZWFkZXIuUGFyc2UoZmQpKTsKKworICAgIGNvbnN0IGF1dG8mIGhlYWRlciA9IHJlYWRlci5HZXRIZWFkZXIoKTsKKyAgICBzaXplX3QgdG90YWxfbWFwcGVkX2FkZHJfbGVuZ3RoID0gaGVhZGVyLnByZWZpeC5oZWFkZXJfc2l6ZSArIEJVRkZFUl9SRUdJT05fREVGQVVMVF9TSVpFOworCisgICAgQVNTRVJUX0dFKGhlYWRlci5wcmVmaXgubWFqb3JfdmVyc2lvbiwgMik7CisKKyAgICB2b2lkKiBtYXBwZWRfYWRkciA9IG1tYXAoTlVMTCwgdG90YWxfbWFwcGVkX2FkZHJfbGVuZ3RoLCBQUk9UX1JFQUQsIE1BUF9TSEFSRUQsIGZkLmdldCgpLCAwKTsKKyAgICBBU1NFUlRfTkUobWFwcGVkX2FkZHIsIE1BUF9GQUlMRUQpOworCisgICAgYm9vbCBwb3B1bGF0ZV9kYXRhX2Zyb21fc2NyYXRjaCA9IGZhbHNlOworICAgIHN0cnVjdCBCdWZmZXJTdGF0ZSogcmFfc3RhdGUgPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3QgQnVmZmVyU3RhdGUqPigoY2hhciopbWFwcGVkX2FkZHIgKyBoZWFkZXIucHJlZml4LmhlYWRlcl9zaXplKTsKKyAgICBpZiAocmFfc3RhdGUtPnJlYWRfYWhlYWRfc3RhdGUgPT0ga0Nvd1JlYWRBaGVhZERvbmUpIHsKKyAgICAgICAgcG9wdWxhdGVfZGF0YV9mcm9tX3NjcmF0Y2ggPSB0cnVlOworICAgIH0KKworICAgIHNpemVfdCBudW1fbWVyZ2Vfb3BzID0gaGVhZGVyLm51bV9tZXJnZV9vcHM7CisgICAgLy8gV2UgaGF2ZSBzb21lIHBhcnRpYWwgbWVyZ2Ugb3BlcmF0aW9ucyBjb21wbGV0ZWQuCisgICAgLy8gVG8gdGVzdCB0aGUgbWVyZ2UtcmVzdW1lIHBhdGgsIGZvcmNlZnVsbHkgY29ycnVwdCB0aGUgZGF0YSBvZiB0aGUgYmFzZQorICAgIC8vIGRldmljZSBmb3IgdGhlIG9mZnNldHMgd2hlcmUgdGhlIG1lcmdlIGlzIHN0aWxsIHBlbmRpbmcuCisgICAgaWYgKG51bV9tZXJnZV9vcHMgJiYgcG9wdWxhdGVfZGF0YV9mcm9tX3NjcmF0Y2gpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgY29ycnVwdF9idWZmZXIoNDA5NiwgMCk7CisgICAgICAgIC8vIENvcnJ1cHQgdHdvIGJsb2NrcyBmcm9tIHRoZSBwb2ludCB3aGVyZSB0aGUgbWVyZ2UgaGFzIHRvIGJlIHJlc3VtZWQgYnkKKyAgICAgICAgLy8gd3JpdGluZyBkb3duIHplcm9lJ3MuCisgICAgICAgIC8vCisgICAgICAgIC8vIE5vdywgc2luY2UgdGhpcyBpcyBhIG1lcmdlLXJlc3VtZSBwYXRoLCB0aGUgImNvcnJlY3QiIGRhdGEgc2hvdWxkIGJlCisgICAgICAgIC8vIGluIHRoZSBzY3JhdGNoIHNwYWNlIG9mIHRoZSBDT1cgZGV2aWNlLiBXaGVuIHRoZXJlIGlzIGFuIEkvTyByZXF1ZXN0CisgICAgICAgIC8vIGZyb20gdGhlIHNuYXBzaG90IGRldmljZSwgdGhlIGRhdGEgaGFzIHRvIGJlIHJldHJpZXZlZCBmcm9tIHRoZQorICAgICAgICAvLyBzY3JhdGNoIHNwYWNlLiBJZiBub3QgYW5kIEkvTyBpcyByb3V0ZWQgdG8gdGhlIGJhc2UgZGV2aWNlLCB3ZQorICAgICAgICAvLyBtYXkgZW5kIHVwIHdpdGggY29ycnVwdGlvbi4KKyAgICAgICAgb2ZmX3QgY29ycnVwdF9vZmZzZXQgPSAobnVtX21lcmdlX29wcyArIDIpICogNDA5NjsKKworICAgICAgICBpZiAoY29ycnVwdF9vZmZzZXQgPCBzaXplXykgeworICAgICAgICAgICAgQVNTRVJUX0VRKGFuZHJvaWQ6OmJhc2U6OldyaXRlRnVsbHlBdE9mZnNldChiYXNlX2ZkXywgKHZvaWQqKWNvcnJ1cHRfYnVmZmVyLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwOTYsIGNvcnJ1cHRfb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgICAgIGNvcnJ1cHRfb2Zmc2V0IC09IDQwOTY7CisgICAgICAgICAgICBBU1NFUlRfRVEoYW5kcm9pZDo6YmFzZTo6V3JpdGVGdWxseUF0T2Zmc2V0KGJhc2VfZmRfLCAodm9pZCopY29ycnVwdF9idWZmZXIuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDA5NiwgY29ycnVwdF9vZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICAgICAgZnN5bmMoYmFzZV9mZF8uZ2V0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGltZSB0byByZWFkIHRoZSBzbmFwc2hvdCBkZXZpY2UuCisgICAgdW5pcXVlX2ZkIHNuYXBzaG90X2ZkKG9wZW4oZG11c2VyX2Rldl8tPkdldFBhdGgoKS5jX3N0cigpLCBPX1JET05MWSB8IE9fRElSRUNUIHwgT19TWU5DKSk7CisgICAgQVNTRVJUX0dFKHNuYXBzaG90X2ZkLCAwKTsKKworICAgIHZvaWQqIGJ1ZmZfYWRkcjsKKyAgICBBU1NFUlRfRVEocG9zaXhfbWVtYWxpZ24oJmJ1ZmZfYWRkciwgNDA5Niwgc2l6ZV8pLCAwKTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjx2b2lkLCBkZWNsdHlwZSgmOjpmcmVlKT4gc25hcHNob3RfYnVmZmVyKGJ1ZmZfYWRkciwgOjpmcmVlKTsKKworICAgIC8vIFNjYW4gdGhlIGVudGlyZSBzbmFwc2hvdCBkZXZpY2UgYW5kIHJlYWQgdGhlIGRhdGEgYW5kIHZlcmlmeSBkYXRhCisgICAgLy8gaW50ZWdyaXR5LiBTaW5jZSB0aGUgYmFzZSBkZXZpY2Ugd2FzIGZvcmNlZnVsbHkgY29ycnVwdGVkLCB0aGUgZGF0YSBmcm9tCisgICAgLy8gdGhpcyBzY2FuIHNob3VsZCBiZSByZXRyaWV2ZWQgZnJvbSBzY3JhdGNoIHNwYWNlIG9mIHRoZSBDT1cgcGFydGl0aW9uLgorICAgIC8vCisgICAgLy8gRnVydGhlcm1vcmUsIGFmdGVyIHRoZSBtZXJnZSBpcyBjb21wbGV0ZSwgYmFzZSBkZXZpY2UgZGF0YSBpcyBhZ2FpbgorICAgIC8vIHZlcmlmaWVkIGFzIHRoZSBhZm9yZW1lbnRpb25lZCBjb3JydXB0ZWQgYmxvY2tzIGFyZW4ndCBwZXJzaXN0ZWQuCisgICAgQVNTRVJUX0VRKFJlYWRGdWxseUF0T2Zmc2V0KHNuYXBzaG90X2ZkLCBzbmFwc2hvdF9idWZmZXIuZ2V0KCksIHNpemVfLCAwKSwgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1lbWNtcChzbmFwc2hvdF9idWZmZXIuZ2V0KCksIG9yaWdfYnVmZmVyXy5nZXQoKSwgc2l6ZV8pLCAwKTsKK30KKwogdm9pZCBTbmFwdXNlcmRUZXN0OjpDcmVhdGVDb3dEZXZpY2VXaXRoQ29weU92ZXJsYXBfMigpIHsKLSAgICBzdGQ6OnN0cmluZyBwYXRoID0gYW5kcm9pZDo6YmFzZTo6R2V0RXhlY3V0YWJsZURpcmVjdG9yeSgpOwotICAgIGNvd19zeXN0ZW1fID0gc3RkOjptYWtlX3VuaXF1ZTxUZW1wb3JhcnlGaWxlPihwYXRoKTsKKyAgICBhdXRvIHdyaXRlciA9IENyZWF0ZUNvd0RldmljZUludGVybmFsKCk7CisgICAgQVNTRVJUX05FKHdyaXRlciwgbnVsbHB0cik7CiAKLSAgICBDb3dPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5jb21wcmVzc2lvbiA9ICJneiI7Ci0gICAgQ293V3JpdGVyIHdyaXRlcihvcHRpb25zKTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5Jbml0aWFsaXplKGNvd19zeXN0ZW1fLT5mZCkpOwotCi0gICAgc2l6ZV90IG51bV9ibG9ja3MgPSBzaXplXyAvIG9wdGlvbnMuYmxvY2tfc2l6ZTsKKyAgICBzaXplX3QgbnVtX2Jsb2NrcyA9IHNpemVfIC8gd3JpdGVyLT5HZXRCbG9ja1NpemUoKTsKICAgICBzaXplX3QgeCA9IG51bV9ibG9ja3M7CiAgICAgc2l6ZV90IGJsa19zcmNfY29weSA9IDA7CiAKICAgICAvLyBDcmVhdGUgb3ZlcmxhcHBpbmcgY29weSBvcGVyYXRpb25zCiAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoYmxrX3NyY19jb3B5LCBibGtfc3JjX2NvcHkgKyAxKSk7CisgICAgICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkQ29weShibGtfc3JjX2NvcHksIGJsa19zcmNfY29weSArIDEpKTsKICAgICAgICAgeCAtPSAxOwogICAgICAgICBpZiAoeCA9PSAxKSB7CiAgICAgICAgICAgICBicmVhazsKQEAgLTMyMSw3ICs0ODYsNyBAQAogICAgIH0KIAogICAgIC8vIEZsdXNoIG9wZXJhdGlvbnMKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuRmluYWxpemUoKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKIAogICAgIC8vIENvbnN0cnVjdCB0aGUgYnVmZmVyIHJlcXVpcmVkIGZvciB2YWxpZGF0aW9uCiAgICAgb3JpZ19idWZmZXJfID0gc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KHRvdGFsX2Jhc2Vfc2l6ZV8pOwpAQCAtMzQ4LDIzICs1MTMsNTggQEAKICAgICB9CiB9CiAKK3ZvaWQgU25hcHVzZXJkVGVzdDo6Q3JlYXRlQ293RGV2aWNlV2l0aE5vQmxvY2tDaGFuZ2VzKCkgeworICAgIGF1dG8gd3JpdGVyID0gQ3JlYXRlQ293RGV2aWNlSW50ZXJuYWwoKTsKKyAgICBBU1NFUlRfTkUod3JpdGVyLCBudWxscHRyKTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IGJ1ZmZlciA9IHN0ZDo6bWFrZV91bmlxdWU8dWludDhfdFtdPihCTE9DS19TWik7CisgICAgc3RkOjptZW1zZXQoYnVmZmVyLmdldCgpLCAnQScsIEJMT0NLX1NaKTsKKworICAgIC8vIFRoaXMgdGVzdCBmb2N1c3NlcyBvbiBub3QgY2hhbmdpbmcgYWxsIHRoZSBibG9ja3MgdGhlcmVieSB2YWxpZGF0aW5nCisgICAgLy8gdGhlIHBhc3MtdGhyb3VnaCBJL08KKworICAgIC8vIFJlcGxhY2UgdGhlIGZpcnN0IGJsb2NrCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRSYXdCbG9ja3MoMSwgYnVmZmVyLmdldCgpLCBCTE9DS19TWikpOworCisgICAgLy8gU2V0IHplcm8gYmxvY2sgb2YgQmxvY2sgMworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWmVyb0Jsb2NrcygzLCAxKSk7CisKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOworICAgIG9yaWdfYnVmZmVyXyA9IHN0ZDo6bWFrZV91bmlxdWU8dWludDhfdFtdPih0b3RhbF9iYXNlX3NpemVfKTsKKworICAgIC8vIFJlYWQgdGhlIGVudGlyZSBiYXNlIGRldmljZQorICAgIEFTU0VSVF9FUShhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHlBdE9mZnNldChiYXNlX2ZkXywgb3JpZ19idWZmZXJfLmdldCgpLCB0b3RhbF9iYXNlX3NpemVfLCAwKSwKKyAgICAgICAgICAgICAgdHJ1ZSk7CisKKyAgICBvZmZfdCBvZmZzZXQgPSBCTE9DS19TWjsKKyAgICBzdGQ6Om1lbWNweShvcmlnX2J1ZmZlcl8uZ2V0KCkgKyBvZmZzZXQsIGJ1ZmZlci5nZXQoKSwgQkxPQ0tfU1opOworICAgIG9mZnNldCA9IDMgKiBCTE9DS19TWjsKKyAgICBzdGQ6Om1lbXNldChvcmlnX2J1ZmZlcl8uZ2V0KCkgKyBvZmZzZXQsIDAsIEJMT0NLX1NaKTsKK30KKwordm9pZCBTbmFwdXNlcmRUZXN0OjpWYWxpZGF0ZURldmljZVdpdGhOb0Jsb2NrQ2hhbmdlcygpIHsKKyAgICB1bmlxdWVfZmQgZmQob3BlbihkbXVzZXJfZGV2Xy0+R2V0UGF0aCgpLmNfc3RyKCksIE9fUkRPTkxZKSk7CisgICAgQVNTRVJUX0dFKGZkLCAwKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBzbmFwc2hvdF9idWZmZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPHVpbnQ4X3RbXT4oc2l6ZV8pOworICAgIHN0ZDo6bWVtc2V0KHNuYXBzaG90X2J1ZmZlci5nZXQoKSwgJ0InLCBzaXplXyk7CisKKyAgICAvLyBBbGwgdGhlIEkvTyByZXF1ZXN0IHNob3VsZCBiZSBhIHBhc3MgdGhyb3VnaCB0byBiYXNlIGRldmljZSBleGNlcHQgZm9yCisgICAgLy8gQmxvY2sgMSBhbmQgQmxvY2sgMy4KKyAgICBBU1NFUlRfRVEoUmVhZEZ1bGx5QXRPZmZzZXQoZmQsIHNuYXBzaG90X2J1ZmZlci5nZXQoKSwgc2l6ZV8sIDApLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobWVtY21wKHNuYXBzaG90X2J1ZmZlci5nZXQoKSwgb3JpZ19idWZmZXJfLmdldCgpLCBzaXplXyksIDApOworfQorCiB2b2lkIFNuYXB1c2VyZFRlc3Q6OkNyZWF0ZUNvd0RldmljZVdpdGhDb3B5T3ZlcmxhcF8xKCkgewotICAgIHN0ZDo6c3RyaW5nIHBhdGggPSBhbmRyb2lkOjpiYXNlOjpHZXRFeGVjdXRhYmxlRGlyZWN0b3J5KCk7Ci0gICAgY293X3N5c3RlbV8gPSBzdGQ6Om1ha2VfdW5pcXVlPFRlbXBvcmFyeUZpbGU+KHBhdGgpOworICAgIGF1dG8gd3JpdGVyID0gQ3JlYXRlQ293RGV2aWNlSW50ZXJuYWwoKTsKKyAgICBBU1NFUlRfTkUod3JpdGVyLCBudWxscHRyKTsKIAotICAgIENvd09wdGlvbnMgb3B0aW9uczsKLSAgICBvcHRpb25zLmNvbXByZXNzaW9uID0gImd6IjsKLSAgICBDb3dXcml0ZXIgd3JpdGVyKG9wdGlvbnMpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkluaXRpYWxpemUoY293X3N5c3RlbV8tPmZkKSk7Ci0KLSAgICBzaXplX3QgbnVtX2Jsb2NrcyA9IHNpemVfIC8gb3B0aW9ucy5ibG9ja19zaXplOworICAgIHNpemVfdCBudW1fYmxvY2tzID0gc2l6ZV8gLyB3cml0ZXItPkdldEJsb2NrU2l6ZSgpOwogICAgIHNpemVfdCB4ID0gbnVtX2Jsb2NrczsKICAgICBzaXplX3QgYmxrX3NyY19jb3B5ID0gbnVtX2Jsb2NrcyAtIDE7CiAKICAgICAvLyBDcmVhdGUgb3ZlcmxhcHBpbmcgY29weSBvcGVyYXRpb25zCiAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoYmxrX3NyY19jb3B5ICsgMSwgYmxrX3NyY19jb3B5KSk7CisgICAgICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkQ29weShibGtfc3JjX2NvcHkgKyAxLCBibGtfc3JjX2NvcHkpKTsKICAgICAgICAgeCAtPSAxOwogICAgICAgICBpZiAoeCA9PSAwKSB7CiAgICAgICAgICAgICBBU1NFUlRfRVEoYmxrX3NyY19jb3B5LCAwKTsKQEAgLTM3NCw3ICs1NzQsNyBAQAogICAgIH0KIAogICAgIC8vIEZsdXNoIG9wZXJhdGlvbnMKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuRmluYWxpemUoKSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKIAogICAgIC8vIENvbnN0cnVjdCB0aGUgYnVmZmVyIHJlcXVpcmVkIGZvciB2YWxpZGF0aW9uCiAgICAgb3JpZ19idWZmZXJfID0gc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KHRvdGFsX2Jhc2Vfc2l6ZV8pOwpAQCAtMzg0LDEwICs1ODQsMTEgQEAKICAgICAgICAgICAgICAgdHJ1ZSk7CiAKICAgICAvLyBNZXJnZWQgb3BlcmF0aW9ucwotICAgIEFTU0VSVF9FUShhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHlBdE9mZnNldChiYXNlX2ZkXywgb3JpZ19idWZmZXJfLmdldCgpLCBvcHRpb25zLmJsb2NrX3NpemUsIDApLAorICAgIEFTU0VSVF9FUShhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHlBdE9mZnNldChiYXNlX2ZkXywgb3JpZ19idWZmZXJfLmdldCgpLCB3cml0ZXItPkdldEJsb2NrU2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSwKICAgICAgICAgICAgICAgdHJ1ZSk7CiAgICAgQVNTRVJUX0VRKGFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseUF0T2Zmc2V0KAotICAgICAgICAgICAgICAgICAgICAgIGJhc2VfZmRfLCAoY2hhciopb3JpZ19idWZmZXJfLmdldCgpICsgb3B0aW9ucy5ibG9ja19zaXplLCBzaXplXywgMCksCisgICAgICAgICAgICAgICAgICAgICAgYmFzZV9mZF8sIChjaGFyKilvcmlnX2J1ZmZlcl8uZ2V0KCkgKyB3cml0ZXItPkdldEJsb2NrU2l6ZSgpLCBzaXplXywgMCksCiAgICAgICAgICAgICAgIHRydWUpOwogfQogCkBAIC0zOTUsOCArNTk2LDggQEAKICAgICB1bmlxdWVfZmQgcm5kX2ZkOwogICAgIGxvZmZfdCBvZmZzZXQgPSAwOwogCi0gICAgc3RkOjpzdHJpbmcgcGF0aCA9IGFuZHJvaWQ6OmJhc2U6OkdldEV4ZWN1dGFibGVEaXJlY3RvcnkoKTsKLSAgICBjb3dfc3lzdGVtXyA9IHN0ZDo6bWFrZV91bmlxdWU8VGVtcG9yYXJ5RmlsZT4ocGF0aCk7CisgICAgYXV0byB3cml0ZXIgPSBDcmVhdGVDb3dEZXZpY2VJbnRlcm5hbCgpOworICAgIEFTU0VSVF9ORSh3cml0ZXIsIG51bGxwdHIpOwogCiAgICAgcm5kX2ZkLnJlc2V0KG9wZW4oIi9kZXYvcmFuZG9tIiwgT19SRE9OTFkpKTsKICAgICBBU1NFUlRfVFJVRShybmRfZmQgPiAwKTsKQEAgLTQxMSwxMyArNjEyLDcgQEAKICAgICAgICAgb2Zmc2V0ICs9IDFfTWlCOwogICAgIH0KIAotICAgIENvd09wdGlvbnMgb3B0aW9uczsKLSAgICBvcHRpb25zLmNvbXByZXNzaW9uID0gImd6IjsKLSAgICBDb3dXcml0ZXIgd3JpdGVyKG9wdGlvbnMpOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkluaXRpYWxpemUoY293X3N5c3RlbV8tPmZkKSk7Ci0KLSAgICBzaXplX3QgbnVtX2Jsb2NrcyA9IHNpemVfIC8gb3B0aW9ucy5ibG9ja19zaXplOworICAgIHNpemVfdCBudW1fYmxvY2tzID0gc2l6ZV8gLyB3cml0ZXItPkdldEJsb2NrU2l6ZSgpOwogICAgIHNpemVfdCBibGtfZW5kX2NvcHkgPSBudW1fYmxvY2tzICogMzsKICAgICBzaXplX3Qgc291cmNlX2JsayA9IG51bV9ibG9ja3MgLSAxOwogICAgIHNpemVfdCBibGtfc3JjX2NvcHkgPSBibGtfZW5kX2NvcHkgLSAxOwpAQCAtNDI1LDcgKzYyMCw3IEBACiAKICAgICBzaXplX3QgeCA9IG51bV9ibG9ja3M7CiAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZENvcHkoc291cmNlX2JsaywgYmxrX3NyY19jb3B5KSk7CisgICAgICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkQ29weShzb3VyY2VfYmxrLCBibGtfc3JjX2NvcHkpKTsKICAgICAgICAgeCAtPSAxOwogICAgICAgICBpZiAoeCA9PSAwKSB7CiAgICAgICAgICAgICBicmVhazsKQEAgLTQzNSwxMiArNjMwLDEyIEBACiAgICAgfQogCiAgICAgZm9yIChzaXplX3QgaSA9IG51bV9ibG9ja3M7IGkgPiAwOyBpLS0pIHsKLSAgICAgICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFhvckJsb2NrcyhudW1fYmxvY2tzICsgaSAtIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJhbmRvbV9idWZmZXJfMV8uZ2V0KClbb3B0aW9ucy5ibG9ja19zaXplICogKGkgLSAxKV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5ibG9ja19zaXplLCAyICogbnVtX2Jsb2NrcyArIGkgLSAxLCB4b3Jfb2Zmc2V0KSk7CisgICAgICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWG9yQmxvY2tzKAorICAgICAgICAgICAgICAgIG51bV9ibG9ja3MgKyBpIC0gMSwgJnJhbmRvbV9idWZmZXJfMV8uZ2V0KClbd3JpdGVyLT5HZXRCbG9ja1NpemUoKSAqIChpIC0gMSldLAorICAgICAgICAgICAgICAgIHdyaXRlci0+R2V0QmxvY2tTaXplKCksIDIgKiBudW1fYmxvY2tzICsgaSAtIDEsIHhvcl9vZmZzZXQpKTsKICAgICB9CiAgICAgLy8gRmx1c2ggb3BlcmF0aW9ucwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5GaW5hbGl6ZSgpKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOwogICAgIC8vIENvbnN0cnVjdCB0aGUgYnVmZmVyIHJlcXVpcmVkIGZvciB2YWxpZGF0aW9uCiAgICAgb3JpZ19idWZmZXJfID0gc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KHRvdGFsX2Jhc2Vfc2l6ZV8pOwogICAgIC8vIFJlYWQgdGhlIGVudGlyZSBiYXNlIGRldmljZQpAQCAtNDU4LDggKzY1Myw4IEBACiAgICAgdW5pcXVlX2ZkIHJuZF9mZDsKICAgICBsb2ZmX3Qgb2Zmc2V0ID0gMDsKIAotICAgIHN0ZDo6c3RyaW5nIHBhdGggPSBhbmRyb2lkOjpiYXNlOjpHZXRFeGVjdXRhYmxlRGlyZWN0b3J5KCk7Ci0gICAgY293X3N5c3RlbV8gPSBzdGQ6Om1ha2VfdW5pcXVlPFRlbXBvcmFyeUZpbGU+KHBhdGgpOworICAgIGF1dG8gd3JpdGVyID0gQ3JlYXRlQ293RGV2aWNlSW50ZXJuYWwoKTsKKyAgICBBU1NFUlRfTkUod3JpdGVyLCBudWxscHRyKTsKIAogICAgIHJuZF9mZC5yZXNldChvcGVuKCIvZGV2L3JhbmRvbSIsIE9fUkRPTkxZKSk7CiAgICAgQVNTRVJUX1RSVUUocm5kX2ZkID4gMCk7CkBAIC00NzUsMjAgKzY3MCwxNCBAQAogICAgIH0KICAgICBtZW1zZXQocmFuZG9tX2J1ZmZlcl8xXy5nZXQoKSwgMCwgc2l6ZV8pOwogCi0gICAgQ293T3B0aW9ucyBvcHRpb25zOwotICAgIG9wdGlvbnMuY29tcHJlc3Npb24gPSAiZ3oiOwotICAgIENvd1dyaXRlciB3cml0ZXIob3B0aW9ucyk7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuSW5pdGlhbGl6ZShjb3dfc3lzdGVtXy0+ZmQpKTsKLQotICAgIHNpemVfdCBudW1fYmxvY2tzID0gc2l6ZV8gLyBvcHRpb25zLmJsb2NrX3NpemU7CisgICAgc2l6ZV90IG51bV9ibG9ja3MgPSBzaXplXyAvIHdyaXRlci0+R2V0QmxvY2tTaXplKCk7CiAgICAgc2l6ZV90IHggPSBudW1fYmxvY2tzOwogICAgIHNpemVfdCBzb3VyY2VfYmxrID0gMDsKICAgICBzaXplX3QgYmxrX3NyY19jb3B5ID0gMiAqIG51bV9ibG9ja3M7CiAgICAgdWludDE2X3QgeG9yX29mZnNldCA9IDU7CiAKICAgICB3aGlsZSAoMSkgewotICAgICAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weShzb3VyY2VfYmxrLCBibGtfc3JjX2NvcHkpKTsKKyAgICAgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRDb3B5KHNvdXJjZV9ibGssIGJsa19zcmNfY29weSkpOwogCiAgICAgICAgIHggLT0gMTsKICAgICAgICAgaWYgKHggPT0gMCkgewpAQCAtNDk4LDEwICs2ODcsMTAgQEAKICAgICAgICAgYmxrX3NyY19jb3B5ICs9IDE7CiAgICAgfQogCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFhvckJsb2NrcyhudW1fYmxvY2tzLCByYW5kb21fYnVmZmVyXzFfLmdldCgpLCBzaXplXywgMiAqIG51bV9ibG9ja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4b3Jfb2Zmc2V0KSk7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRYb3JCbG9ja3MobnVtX2Jsb2NrcywgcmFuZG9tX2J1ZmZlcl8xXy5nZXQoKSwgc2l6ZV8sIDIgKiBudW1fYmxvY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhvcl9vZmZzZXQpKTsKICAgICAvLyBGbHVzaCBvcGVyYXRpb25zCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkZpbmFsaXplKCkpOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+RmluYWxpemUoKSk7CiAgICAgLy8gQ29uc3RydWN0IHRoZSBidWZmZXIgcmVxdWlyZWQgZm9yIHZhbGlkYXRpb24KICAgICBvcmlnX2J1ZmZlcl8gPSBzdGQ6Om1ha2VfdW5pcXVlPHVpbnQ4X3RbXT4odG90YWxfYmFzZV9zaXplXyk7CiAgICAgLy8gUmVhZCB0aGUgZW50aXJlIGJhc2UgZGV2aWNlCkBAIC01MTUsMTQ0ICs3MDQsMzkgQEAKICAgICB9CiB9CiAKLXZvaWQgU25hcHVzZXJkVGVzdDo6Q3JlYXRlQ293RGV2aWNlKCkgewotICAgIHVuaXF1ZV9mZCBybmRfZmQ7Ci0gICAgbG9mZl90IG9mZnNldCA9IDA7Ci0KLSAgICBzdGQ6OnN0cmluZyBwYXRoID0gYW5kcm9pZDo6YmFzZTo6R2V0RXhlY3V0YWJsZURpcmVjdG9yeSgpOwotICAgIGNvd19zeXN0ZW1fID0gc3RkOjptYWtlX3VuaXF1ZTxUZW1wb3JhcnlGaWxlPihwYXRoKTsKLQotICAgIHJuZF9mZC5yZXNldChvcGVuKCIvZGV2L3JhbmRvbSIsIE9fUkRPTkxZKSk7Ci0gICAgQVNTRVJUX1RSVUUocm5kX2ZkID4gMCk7Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiByYW5kb21fYnVmZmVyXzFfID0gc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KHNpemVfKTsKLQotICAgIC8vIEZpbGwgcmFuZG9tIGRhdGEKLSAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IChzaXplXyAvIDFfTWlCKTsgaisrKSB7Ci0gICAgICAgIEFTU0VSVF9FUShSZWFkRnVsbHlBdE9mZnNldChybmRfZmQsIChjaGFyKilyYW5kb21fYnVmZmVyXzFfLmdldCgpICsgb2Zmc2V0LCAxX01pQiwgMCksCi0gICAgICAgICAgICAgICAgICB0cnVlKTsKLQotICAgICAgICBvZmZzZXQgKz0gMV9NaUI7Ci0gICAgfQotCi0gICAgQ293T3B0aW9ucyBvcHRpb25zOwotICAgIG9wdGlvbnMuY29tcHJlc3Npb24gPSAiZ3oiOwotICAgIENvd1dyaXRlciB3cml0ZXIob3B0aW9ucyk7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuSW5pdGlhbGl6ZShjb3dfc3lzdGVtXy0+ZmQpKTsKLQotICAgIHNpemVfdCBudW1fYmxvY2tzID0gc2l6ZV8gLyBvcHRpb25zLmJsb2NrX3NpemU7Ci0gICAgc2l6ZV90IGJsa19lbmRfY29weSA9IG51bV9ibG9ja3MgKiAyOwotICAgIHNpemVfdCBzb3VyY2VfYmxrID0gbnVtX2Jsb2NrcyAtIDE7Ci0gICAgc2l6ZV90IGJsa19zcmNfY29weSA9IGJsa19lbmRfY29weSAtIDE7Ci0KLSAgICB1aW50MzJfdCBzZXF1ZW5jZVtudW1fYmxvY2tzICogMl07Ci0gICAgLy8gU2VxdWVuY2UgZm9yIENvcHkgb3BzCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspIHsKLSAgICAgICAgc2VxdWVuY2VbaV0gPSBudW1fYmxvY2tzIC0gMSAtIGk7Ci0gICAgfQotICAgIC8vIFNlcXVlbmNlIGZvciBYb3Igb3BzCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspIHsKLSAgICAgICAgc2VxdWVuY2VbbnVtX2Jsb2NrcyArIGldID0gNSAqIG51bV9ibG9ja3MgLSAxIC0gaTsKLSAgICB9Ci0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFNlcXVlbmNlRGF0YSgyICogbnVtX2Jsb2Nrcywgc2VxdWVuY2UpKTsKLQotICAgIHNpemVfdCB4ID0gbnVtX2Jsb2NrczsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkQ29weShzb3VyY2VfYmxrLCBibGtfc3JjX2NvcHkpKTsKLSAgICAgICAgeCAtPSAxOwotICAgICAgICBpZiAoeCA9PSAwKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBzb3VyY2VfYmxrIC09IDE7Ci0gICAgICAgIGJsa19zcmNfY29weSAtPSAxOwotICAgIH0KLQotICAgIHNvdXJjZV9ibGsgPSBudW1fYmxvY2tzOwotICAgIGJsa19zcmNfY29weSA9IGJsa19lbmRfY29weTsKLQotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5BZGRSYXdCbG9ja3Moc291cmNlX2JsaywgcmFuZG9tX2J1ZmZlcl8xXy5nZXQoKSwgc2l6ZV8pKTsKLQotICAgIHNpemVfdCBibGtfemVyb19jb3B5X3N0YXJ0ID0gc291cmNlX2JsayArIG51bV9ibG9ja3M7Ci0gICAgc2l6ZV90IGJsa196ZXJvX2NvcHlfZW5kID0gYmxrX3plcm9fY29weV9zdGFydCArIG51bV9ibG9ja3M7Ci0KLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWmVyb0Jsb2NrcyhibGtfemVyb19jb3B5X3N0YXJ0LCBudW1fYmxvY2tzKSk7Ci0KLSAgICBzaXplX3QgYmxrX3JhbmRvbTJfcmVwbGFjZV9zdGFydCA9IGJsa196ZXJvX2NvcHlfZW5kOwotCi0gICAgQVNTRVJUX1RSVUUod3JpdGVyLkFkZFJhd0Jsb2NrcyhibGtfcmFuZG9tMl9yZXBsYWNlX3N0YXJ0LCByYW5kb21fYnVmZmVyXzFfLmdldCgpLCBzaXplXykpOwotCi0gICAgc2l6ZV90IGJsa194b3Jfc3RhcnQgPSBibGtfcmFuZG9tMl9yZXBsYWNlX3N0YXJ0ICsgbnVtX2Jsb2NrczsKLSAgICBzaXplX3QgeG9yX29mZnNldCA9IEJMT0NLX1NaIC8gMjsKLSAgICBBU1NFUlRfVFJVRSh3cml0ZXIuQWRkWG9yQmxvY2tzKGJsa194b3Jfc3RhcnQsIHJhbmRvbV9idWZmZXJfMV8uZ2V0KCksIHNpemVfLCBudW1fYmxvY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG9yX29mZnNldCkpOwotCi0gICAgLy8gRmx1c2ggb3BlcmF0aW9ucwotICAgIEFTU0VSVF9UUlVFKHdyaXRlci5GaW5hbGl6ZSgpKTsKLSAgICAvLyBDb25zdHJ1Y3QgdGhlIGJ1ZmZlciByZXF1aXJlZCBmb3IgdmFsaWRhdGlvbgotICAgIG9yaWdfYnVmZmVyXyA9IHN0ZDo6bWFrZV91bmlxdWU8dWludDhfdFtdPih0b3RhbF9iYXNlX3NpemVfKTsKLSAgICBzdGQ6OnN0cmluZyB6ZXJvX2J1ZmZlcihzaXplXywgMCk7Ci0gICAgQVNTRVJUX0VRKGFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseUF0T2Zmc2V0KGJhc2VfZmRfLCBvcmlnX2J1ZmZlcl8uZ2V0KCksIHNpemVfLCBzaXplXyksIHRydWUpOwotICAgIG1lbWNweSgoY2hhciopb3JpZ19idWZmZXJfLmdldCgpICsgc2l6ZV8sIHJhbmRvbV9idWZmZXJfMV8uZ2V0KCksIHNpemVfKTsKLSAgICBtZW1jcHkoKGNoYXIqKW9yaWdfYnVmZmVyXy5nZXQoKSArIChzaXplXyAqIDIpLCAodm9pZCopemVyb19idWZmZXIuY19zdHIoKSwgc2l6ZV8pOwotICAgIG1lbWNweSgoY2hhciopb3JpZ19idWZmZXJfLmdldCgpICsgKHNpemVfICogMyksIHJhbmRvbV9idWZmZXJfMV8uZ2V0KCksIHNpemVfKTsKLSAgICBBU1NFUlRfRVEoYW5kcm9pZDo6YmFzZTo6UmVhZEZ1bGx5QXRPZmZzZXQoYmFzZV9mZF8sICZvcmlnX2J1ZmZlcl8uZ2V0KClbc2l6ZV8gKiA0XSwgc2l6ZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfICsgeG9yX29mZnNldCksCi0gICAgICAgICAgICAgIHRydWUpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZV87IGkrKykgewotICAgICAgICBvcmlnX2J1ZmZlcl8uZ2V0KClbKHNpemVfICogNCkgKyBpXSA9Ci0gICAgICAgICAgICAgICAgKHVpbnQ4X3QpKG9yaWdfYnVmZmVyXy5nZXQoKVsoc2l6ZV8gKiA0KSArIGldIF4gcmFuZG9tX2J1ZmZlcl8xXy5nZXQoKVtpXSk7Ci0gICAgfQotfQotCiB2b2lkIFNuYXB1c2VyZFRlc3Q6OkluaXRDb3dEZXZpY2UoKSB7Ci0gICAgdWludDY0X3QgbnVtX3NlY3RvcnMgPSBjbGllbnRfLT5Jbml0RG1Vc2VyQ293KHN5c3RlbV9kZXZpY2VfY3RybF9uYW1lXywgY293X3N5c3RlbV8tPnBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfbG9vcF8tPmRldmljZSgpLCBiYXNlX2xvb3BfLT5kZXZpY2UoKSk7Ci0gICAgQVNTRVJUX05FKG51bV9zZWN0b3JzLCAwKTsKKyAgICBhdXRvIGZhY3RvcnkgPSBoYXJuZXNzXy0+R2V0QmxvY2tTZXJ2ZXJGYWN0b3J5KCk7CisgICAgYXV0byBvcGVuZXIgPSBmYWN0b3J5LT5DcmVhdGVPcGVuZXIoc3lzdGVtX2RldmljZV9jdHJsX25hbWVfKTsKKyAgICBoYW5kbGVyc18tPkRpc2FibGVWZXJpZmljYXRpb24oKTsKKyAgICBjb25zdCBUZXN0UGFyYW0gcGFyYW1zID0gR2V0UGFyYW0oKTsKKyAgICBhdXRvIGhhbmRsZXIgPSBoYW5kbGVyc18tPkFkZEhhbmRsZXIoCisgICAgICAgICAgICBzeXN0ZW1fZGV2aWNlX2N0cmxfbmFtZV8sIGNvd19zeXN0ZW1fLT5wYXRoLCBiYXNlX2Rldl8tPkdldFBhdGgoKSwgYmFzZV9kZXZfLT5HZXRQYXRoKCksCisgICAgICAgICAgICBvcGVuZXIsIDEsIHBhcmFtcy5pb191cmluZywgcGFyYW1zLm9fZGlyZWN0LCBwYXJhbXMuY293X29wX21lcmdlX3NpemUpOworICAgIEFTU0VSVF9ORShoYW5kbGVyLCBudWxscHRyKTsKKyAgICBBU1NFUlRfTkUoaGFuZGxlci0+c25hcHVzZXJkKCksIG51bGxwdHIpOworI2lmZGVmIF9fQU5EUk9JRF9fCisgICAgQVNTRVJUX05FKGhhbmRsZXItPnNuYXB1c2VyZCgpLT5HZXROdW1TZWN0b3JzKCksIDApOworI2VuZGlmCiB9CiAKLXZvaWQgU25hcHVzZXJkVGVzdDo6U2V0RGV2aWNlQ29udHJvbE5hbWUoKSB7Ci0gICAgc3lzdGVtX2RldmljZV9uYW1lXy5jbGVhcigpOwotICAgIHN5c3RlbV9kZXZpY2VfY3RybF9uYW1lXy5jbGVhcigpOwotCi0gICAgc3RkOjpzdHJpbmcgc3RyKGNvd19zeXN0ZW1fLT5wYXRoKTsKLSAgICBzdGQ6OnNpemVfdCBmb3VuZCA9IHN0ci5maW5kX2xhc3Rfb2YoIi9cXCIpOwotICAgIEFTU0VSVF9ORShmb3VuZCwgc3RkOjpzdHJpbmc6Om5wb3MpOwotICAgIHN5c3RlbV9kZXZpY2VfbmFtZV8gPSBzdHIuc3Vic3RyKGZvdW5kICsgMSk7Ci0KLSAgICBzeXN0ZW1fZGV2aWNlX2N0cmxfbmFtZV8gPSBzeXN0ZW1fZGV2aWNlX25hbWVfICsgIi1jdHJsIjsKLX0KLQotdm9pZCBTbmFwdXNlcmRUZXN0OjpDcmVhdGVEbVVzZXJEZXZpY2UoKSB7Ci0gICAgdW5pcXVlX2ZkIGZkKFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKGJhc2VfbG9vcF8tPmRldmljZSgpLmNfc3RyKCksIE9fUkRPTkxZIHwgT19DTE9FWEVDKSkpOwotICAgIEFTU0VSVF9UUlVFKGZkID4gMCk7Ci0KLSAgICB1aW50NjRfdCBkZXZfc3ogPSBnZXRfYmxvY2tfZGV2aWNlX3NpemUoZmQuZ2V0KCkpOwotICAgIEFTU0VSVF9UUlVFKGRldl9zeiA+IDApOwordm9pZCBTbmFwdXNlcmRUZXN0OjpDcmVhdGVVc2VyRGV2aWNlKCkgeworICAgIGF1dG8gZGV2X3N6ID0gYmFzZV9kZXZfLT5HZXRTaXplKCk7CisgICAgQVNTRVJUX05FKGRldl9zeiwgMCk7CiAKICAgICBjb3dfbnVtX3NlY3RvcnNfID0gZGV2X3N6ID4+IDk7CiAKLSAgICBEbVRhYmxlIGRtdXNlcl90YWJsZTsKLSAgICBBU1NFUlRfVFJVRShkbXVzZXJfdGFibGUuQWRkVGFyZ2V0KAotICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxEbVRhcmdldFVzZXI+KDAsIGNvd19udW1fc2VjdG9yc18sIHN5c3RlbV9kZXZpY2VfY3RybF9uYW1lXykpKTsKLSAgICBBU1NFUlRfVFJVRShkbXVzZXJfdGFibGUudmFsaWQoKSk7Ci0KLSAgICBkbXVzZXJfZGV2XyA9IHN0ZDo6bWFrZV91bmlxdWU8VGVtcGRldmljZT4oc3lzdGVtX2RldmljZV9uYW1lXywgZG11c2VyX3RhYmxlKTsKLSAgICBBU1NFUlRfVFJVRShkbXVzZXJfZGV2Xy0+dmFsaWQoKSk7Ci0gICAgQVNTRVJUX0ZBTFNFKGRtdXNlcl9kZXZfLT5wYXRoKCkuZW1wdHkoKSk7Ci0KLSAgICBhdXRvIG1pc2NfZGV2aWNlID0gIi9kZXYvZG0tdXNlci8iICsgc3lzdGVtX2RldmljZV9jdHJsX25hbWVfOwotICAgIEFTU0VSVF9UUlVFKGFuZHJvaWQ6OmZzX21ncjo6V2FpdEZvckZpbGUobWlzY19kZXZpY2UsIDEwcykpOworICAgIGRtdXNlcl9kZXZfID0gaGFybmVzc18tPkNyZWF0ZVVzZXJEZXZpY2Uoc3lzdGVtX2RldmljZV9uYW1lXywgc3lzdGVtX2RldmljZV9jdHJsX25hbWVfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY293X251bV9zZWN0b3JzXyk7CisgICAgQVNTRVJUX05FKGRtdXNlcl9kZXZfLCBudWxscHRyKTsKIH0KIAogdm9pZCBTbmFwdXNlcmRUZXN0OjpJbml0RGFlbW9uKCkgewotICAgIGJvb2wgb2sgPSBjbGllbnRfLT5BdHRhY2hEbVVzZXIoc3lzdGVtX2RldmljZV9jdHJsX25hbWVfKTsKLSAgICBBU1NFUlRfVFJVRShvayk7CisgICAgQVNTRVJUX1RSVUUoaGFuZGxlcnNfLT5TdGFydEhhbmRsZXIoc3lzdGVtX2RldmljZV9jdHJsX25hbWVfKSk7CiB9CiAKIHZvaWQgU25hcHVzZXJkVGVzdDo6Q2hlY2tNZXJnZUNvbXBsZXRpb24oKSB7CiAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgZG91YmxlIHBlcmNlbnRhZ2UgPSBjbGllbnRfLT5HZXRNZXJnZVBlcmNlbnQoKTsKKyAgICAgICAgZG91YmxlIHBlcmNlbnRhZ2UgPSBoYW5kbGVyc18tPkdldE1lcmdlUGVyY2VudGFnZSgpOwogICAgICAgICBpZiAoKGludClwZXJjZW50YWdlID09IDEwMCkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTY2MiwzMCArNzQ2LDI2IEBACiB9CiAKIHZvaWQgU25hcHVzZXJkVGVzdDo6U2V0dXBJbXBsKCkgewotICAgIENyZWF0ZUJhc2VEZXZpY2UoKTsKLSAgICBDcmVhdGVDb3dEZXZpY2UoKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShDcmVhdGVCYXNlRGV2aWNlKCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKENyZWF0ZUNvd0RldmljZSgpKTsKIAogICAgIFNldERldmljZUNvbnRyb2xOYW1lKCk7CiAKLSAgICBTdGFydFNuYXB1c2VyZERhZW1vbigpOwotCi0gICAgQ3JlYXRlRG1Vc2VyRGV2aWNlKCk7Ci0gICAgSW5pdENvd0RldmljZSgpOwotICAgIEluaXREYWVtb24oKTsKLQotICAgIHNldHVwX29rXyA9IHRydWU7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoQ3JlYXRlVXNlckRldmljZSgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0Q293RGV2aWNlKCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEluaXREYWVtb24oKSk7CiB9CiAKIGJvb2wgU25hcHVzZXJkVGVzdDo6TWVyZ2UoKSB7Ci0gICAgU3RhcnRNZXJnZSgpOworICAgIGlmICghU3RhcnRNZXJnZSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAgICAgQ2hlY2tNZXJnZUNvbXBsZXRpb24oKTsKLSAgICBtZXJnZV9va18gPSB0cnVlOwotICAgIHJldHVybiBtZXJnZV9va187CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgU25hcHVzZXJkVGVzdDo6U3RhcnRNZXJnZSgpIHsKLSAgICBib29sIG9rID0gY2xpZW50Xy0+SW5pdGlhdGVNZXJnZShzeXN0ZW1fZGV2aWNlX2N0cmxfbmFtZV8pOwotICAgIEFTU0VSVF9UUlVFKG9rKTsKK2Jvb2wgU25hcHVzZXJkVGVzdDo6U3RhcnRNZXJnZSgpIHsKKyAgICByZXR1cm4gaGFuZGxlcnNfLT5Jbml0aWF0ZU1lcmdlKHN5c3RlbV9kZXZpY2VfY3RybF9uYW1lXyk7CiB9CiAKIHZvaWQgU25hcHVzZXJkVGVzdDo6VmFsaWRhdGVNZXJnZSgpIHsKQEAgLTY5NiwxODMgKzc3Niw3NjkgQEAKIH0KIAogdm9pZCBTbmFwdXNlcmRUZXN0OjpTaW11bGF0ZURhZW1vblJlc3RhcnQoKSB7Ci0gICAgU2h1dGRvd24oKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShTaHV0ZG93bigpKTsKICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoNTAwbXMpOwogICAgIFNldERldmljZUNvbnRyb2xOYW1lKCk7Ci0gICAgU3RhcnRTbmFwdXNlcmREYWVtb24oKTsKLSAgICBDcmVhdGVEbVVzZXJEZXZpY2UoKTsKLSAgICBJbml0Q293RGV2aWNlKCk7Ci0gICAgSW5pdERhZW1vbigpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKENyZWF0ZVVzZXJEZXZpY2UoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdENvd0RldmljZSgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0RGFlbW9uKCkpOwogfQogCiB2b2lkIFNuYXB1c2VyZFRlc3Q6Ok1lcmdlSW50ZXJydXB0UmFuZG9tbHkoaW50IG1heF9kdXJhdGlvbikgewogICAgIHN0ZDo6c3JhbmQoc3RkOjp0aW1lKG51bGxwdHIpKTsKLSAgICBTdGFydE1lcmdlKCk7CisgICAgQVNTRVJUX1RSVUUoU3RhcnRNZXJnZSgpKTsKIAogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgewogICAgICAgICBpbnQgZHVyYXRpb24gPSBzdGQ6OnJhbmQoKSAlIG1heF9kdXJhdGlvbjsKICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoZHVyYXRpb24pKTsKLSAgICAgICAgU2ltdWxhdGVEYWVtb25SZXN0YXJ0KCk7Ci0gICAgICAgIFN0YXJ0TWVyZ2UoKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2ltdWxhdGVEYWVtb25SZXN0YXJ0KCkpOworICAgICAgICBBU1NFUlRfVFJVRShTdGFydE1lcmdlKCkpOwogICAgIH0KIAotICAgIFNpbXVsYXRlRGFlbW9uUmVzdGFydCgpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNpbXVsYXRlRGFlbW9uUmVzdGFydCgpKTsKICAgICBBU1NFUlRfVFJVRShNZXJnZSgpKTsKIH0KIAogdm9pZCBTbmFwdXNlcmRUZXN0OjpNZXJnZUludGVycnVwdEZpeGVkKGludCBkdXJhdGlvbikgewotICAgIFN0YXJ0TWVyZ2UoKTsKKyAgICBBU1NFUlRfVFJVRShTdGFydE1lcmdlKCkpOwogCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTsgaSsrKSB7CiAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKGR1cmF0aW9uKSk7Ci0gICAgICAgIFNpbXVsYXRlRGFlbW9uUmVzdGFydCgpOwotICAgICAgICBTdGFydE1lcmdlKCk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNpbXVsYXRlRGFlbW9uUmVzdGFydCgpKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoU3RhcnRNZXJnZSgpKTsKICAgICB9CiAKLSAgICBTaW11bGF0ZURhZW1vblJlc3RhcnQoKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShTaW11bGF0ZURhZW1vblJlc3RhcnQoKSk7CisgICAgQVNTRVJUX1RSVUUoTWVyZ2UoKSk7Cit9CisKK3ZvaWQgU25hcHVzZXJkVGVzdDo6TWVyZ2VJbnRlcnJ1cHRBbmRWYWxpZGF0ZShpbnQgZHVyYXRpb24pIHsKKyAgICBBU1NFUlRfVFJVRShTdGFydE1lcmdlKCkpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNTsgaSsrKSB7CisgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKGR1cmF0aW9uKSk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNpbXVsYXRlRGFlbW9uUmVzdGFydCgpKTsKKyAgICAgICAgUmVhZFNuYXBzaG90QW5kVmFsaWRhdGVPdmVybGFwcGluZ0Jsb2NrcygpOworICAgICAgICBBU1NFUlRfVFJVRShTdGFydE1lcmdlKCkpOworICAgIH0KKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNpbXVsYXRlRGFlbW9uUmVzdGFydCgpKTsKICAgICBBU1NFUlRfVFJVRShNZXJnZSgpKTsKIH0KIAogdm9pZCBTbmFwdXNlcmRUZXN0OjpNZXJnZUludGVycnVwdCgpIHsKICAgICAvLyBJbnRlcnJ1cHQgbWVyZ2UgYXQgdmFyaW91cyBpbnRlcnZhbHMKLSAgICBTdGFydE1lcmdlKCk7CisgICAgQVNTRVJUX1RSVUUoU3RhcnRNZXJnZSgpKTsKICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoMjUwbXMpOwotICAgIFNpbXVsYXRlRGFlbW9uUmVzdGFydCgpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNpbXVsYXRlRGFlbW9uUmVzdGFydCgpKTsKIAotICAgIFN0YXJ0TWVyZ2UoKTsKKyAgICBBU1NFUlRfVFJVRShTdGFydE1lcmdlKCkpOwogICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcigyNTBtcyk7Ci0gICAgU2ltdWxhdGVEYWVtb25SZXN0YXJ0KCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2ltdWxhdGVEYWVtb25SZXN0YXJ0KCkpOwogCi0gICAgU3RhcnRNZXJnZSgpOworICAgIEFTU0VSVF9UUlVFKFN0YXJ0TWVyZ2UoKSk7CiAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKDE1MG1zKTsKLSAgICBTaW11bGF0ZURhZW1vblJlc3RhcnQoKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShTaW11bGF0ZURhZW1vblJlc3RhcnQoKSk7CiAKLSAgICBTdGFydE1lcmdlKCk7CisgICAgQVNTRVJUX1RSVUUoU3RhcnRNZXJnZSgpKTsKICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoMTAwbXMpOwotICAgIFNpbXVsYXRlRGFlbW9uUmVzdGFydCgpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNpbXVsYXRlRGFlbW9uUmVzdGFydCgpKTsKIAotICAgIFN0YXJ0TWVyZ2UoKTsKKyAgICBBU1NFUlRfVFJVRShTdGFydE1lcmdlKCkpOwogICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2Zvcig4MDBtcyk7Ci0gICAgU2ltdWxhdGVEYWVtb25SZXN0YXJ0KCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2ltdWxhdGVEYWVtb25SZXN0YXJ0KCkpOwogCi0gICAgU3RhcnRNZXJnZSgpOworICAgIEFTU0VSVF9UUlVFKFN0YXJ0TWVyZ2UoKSk7CiAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKDYwMG1zKTsKLSAgICBTaW11bGF0ZURhZW1vblJlc3RhcnQoKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShTaW11bGF0ZURhZW1vblJlc3RhcnQoKSk7CiAKICAgICBBU1NFUlRfVFJVRShNZXJnZSgpKTsKIH0KIAotVEVTVF9GKFNuYXB1c2VyZFRlc3QsIFNuYXBzaG90X0lPX1RFU1QpIHsKLSAgICBBU1NFUlRfVFJVRShTZXR1cERlZmF1bHQoKSk7CitURVNUX1AoU25hcHVzZXJkVGVzdCwgU25hcHNob3RfUGFzc3Rocm91Z2gpIHsKKyAgICBpZiAoIWhhcm5lc3NfLT5IYXNVc2VyRGV2aWNlKCkpIHsKKyAgICAgICAgR1RFU1RfU0tJUCgpIDw8ICJTa2lwcGluZyBzbmFwc2hvdCByZWFkOyBub3Qgc3VwcG9ydGVkIjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2V0dXBEZXZpY2VGb3JQYXNzdGhyb3VnaCgpKTsKICAgICAvLyBJL08gYmVmb3JlIG1lcmdlCi0gICAgUmVhZFNuYXBzaG90RGV2aWNlQW5kVmFsaWRhdGUoKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShWYWxpZGF0ZURldmljZVdpdGhOb0Jsb2NrQ2hhbmdlcygpKTsKICAgICBBU1NFUlRfVFJVRShNZXJnZSgpKTsKICAgICBWYWxpZGF0ZU1lcmdlKCk7CiAgICAgLy8gSS9PIGFmdGVyIG1lcmdlIC0gZGFlbW9uIHNob3VsZCByZWFkIGRpcmVjdGx5CiAgICAgLy8gZnJvbSBiYXNlIGRldmljZQotICAgIFJlYWRTbmFwc2hvdERldmljZUFuZFZhbGlkYXRlKCk7Ci0gICAgU2h1dGRvd24oKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShWYWxpZGF0ZURldmljZVdpdGhOb0Jsb2NrQ2hhbmdlcygpKTsKIH0KIAotVEVTVF9GKFNuYXB1c2VyZFRlc3QsIFNuYXBzaG90X01FUkdFX0lPX1RFU1QpIHsKLSAgICBBU1NFUlRfVFJVRShTZXR1cERlZmF1bHQoKSk7CitURVNUX1AoU25hcHVzZXJkVGVzdCwgU25hcHNob3RfSU9fVEVTVCkgeworICAgIGlmICghaGFybmVzc18tPkhhc1VzZXJEZXZpY2UoKSkgeworICAgICAgICBHVEVTVF9TS0lQKCkgPDwgIlNraXBwaW5nIHNuYXBzaG90IHJlYWQ7IG5vdCBzdXBwb3J0ZWQiOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShTZXR1cERlZmF1bHQoKSk7CisgICAgLy8gSS9PIGJlZm9yZSBtZXJnZQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFJlYWRTbmFwc2hvdERldmljZUFuZFZhbGlkYXRlKCkpOworICAgIEFTU0VSVF9UUlVFKE1lcmdlKCkpOworICAgIFZhbGlkYXRlTWVyZ2UoKTsKKyAgICAvLyBJL08gYWZ0ZXIgbWVyZ2UgLSBkYWVtb24gc2hvdWxkIHJlYWQgZGlyZWN0bHkKKyAgICAvLyBmcm9tIGJhc2UgZGV2aWNlCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoUmVhZFNuYXBzaG90RGV2aWNlQW5kVmFsaWRhdGUoKSk7Cit9CisKK1RFU1RfUChTbmFwdXNlcmRUZXN0LCBTbmFwc2hvdF9NRVJHRV9JT19URVNUKSB7CisgICAgaWYgKCFoYXJuZXNzXy0+SGFzVXNlckRldmljZSgpKSB7CisgICAgICAgIEdURVNUX1NLSVAoKSA8PCAiU2tpcHBpbmcgc25hcHNob3QgcmVhZDsgbm90IHN1cHBvcnRlZCI7CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNldHVwRGVmYXVsdCgpKTsKICAgICAvLyBJc3N1ZSBJL08gYmVmb3JlIG1lcmdlIGJlZ2lucwotICAgIHN0ZDo6YXN5bmMoc3RkOjpsYXVuY2g6OmFzeW5jLCAmU25hcHVzZXJkVGVzdDo6UmVhZFNuYXBzaG90RGV2aWNlQW5kVmFsaWRhdGUsIHRoaXMpOworICAgIGF1dG8gcmVhZF9mdXR1cmUgPQorICAgICAgICAgICAgc3RkOjphc3luYyhzdGQ6OmxhdW5jaDo6YXN5bmMsICZTbmFwdXNlcmRUZXN0OjpSZWFkU25hcHNob3REZXZpY2VBbmRWYWxpZGF0ZSwgdGhpcyk7CiAgICAgLy8gU3RhcnQgdGhlIG1lcmdlCiAgICAgQVNTRVJUX1RSVUUoTWVyZ2UoKSk7CiAgICAgVmFsaWRhdGVNZXJnZSgpOwotICAgIFNodXRkb3duKCk7CisgICAgcmVhZF9mdXR1cmUud2FpdCgpOwogfQogCi1URVNUX0YoU25hcHVzZXJkVGVzdCwgU25hcHNob3RfTUVSR0VfSU9fVEVTVF8xKSB7Ci0gICAgQVNTRVJUX1RSVUUoU2V0dXBEZWZhdWx0KCkpOworVEVTVF9QKFNuYXB1c2VyZFRlc3QsIFNuYXBzaG90X01FUkdFX0lPX1RFU1RfMSkgeworICAgIGlmICghaGFybmVzc18tPkhhc1VzZXJEZXZpY2UoKSkgeworICAgICAgICBHVEVTVF9TS0lQKCkgPDwgIlNraXBwaW5nIHNuYXBzaG90IHJlYWQ7IG5vdCBzdXBwb3J0ZWQiOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShTZXR1cERlZmF1bHQoKSk7CiAgICAgLy8gU3RhcnQgdGhlIG1lcmdlCi0gICAgU3RhcnRNZXJnZSgpOworICAgIEFTU0VSVF9UUlVFKFN0YXJ0TWVyZ2UoKSk7CiAgICAgLy8gSXNzdWUgSS9PIGluIHBhcmFsbGVsIHdoZW4gbWVyZ2UgaXMgaW4tcHJvZ3Jlc3MKLSAgICBzdGQ6OmFzeW5jKHN0ZDo6bGF1bmNoOjphc3luYywgJlNuYXB1c2VyZFRlc3Q6OlJlYWRTbmFwc2hvdERldmljZUFuZFZhbGlkYXRlLCB0aGlzKTsKKyAgICBhdXRvIHJlYWRfZnV0dXJlID0KKyAgICAgICAgICAgIHN0ZDo6YXN5bmMoc3RkOjpsYXVuY2g6OmFzeW5jLCAmU25hcHVzZXJkVGVzdDo6UmVhZFNuYXBzaG90RGV2aWNlQW5kVmFsaWRhdGUsIHRoaXMpOwogICAgIENoZWNrTWVyZ2VDb21wbGV0aW9uKCk7CiAgICAgVmFsaWRhdGVNZXJnZSgpOwotICAgIFNodXRkb3duKCk7CisgICAgcmVhZF9mdXR1cmUud2FpdCgpOwogfQogCi1URVNUX0YoU25hcHVzZXJkVGVzdCwgU25hcHNob3RfTWVyZ2VfUmVzdW1lKSB7Ci0gICAgQVNTRVJUX1RSVUUoU2V0dXBEZWZhdWx0KCkpOwotICAgIE1lcmdlSW50ZXJydXB0KCk7CitURVNUX1AoU25hcHVzZXJkVGVzdCwgU25hcHNob3RfTWVyZ2VfUmVzdW1lKSB7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2V0dXBEZWZhdWx0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKE1lcmdlSW50ZXJydXB0KCkpOwogICAgIFZhbGlkYXRlTWVyZ2UoKTsKLSAgICBTaHV0ZG93bigpOwogfQogCi1URVNUX0YoU25hcHVzZXJkVGVzdCwgU25hcHNob3RfQ09QWV9PdmVybGFwX1RFU1RfMSkgewotICAgIEFTU0VSVF9UUlVFKFNldHVwQ29weU92ZXJsYXBfMSgpKTsKK1RFU1RfUChTbmFwdXNlcmRUZXN0LCBTbmFwc2hvdF9DT1BZX092ZXJsYXBfVEVTVF8xKSB7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2V0dXBDb3B5T3ZlcmxhcF8xKCkpOwogICAgIEFTU0VSVF9UUlVFKE1lcmdlKCkpOwogICAgIFZhbGlkYXRlTWVyZ2UoKTsKLSAgICBTaHV0ZG93bigpOwogfQogCi1URVNUX0YoU25hcHVzZXJkVGVzdCwgU25hcHNob3RfQ09QWV9PdmVybGFwX1RFU1RfMikgewotICAgIEFTU0VSVF9UUlVFKFNldHVwQ29weU92ZXJsYXBfMigpKTsKK1RFU1RfUChTbmFwdXNlcmRUZXN0LCBTbmFwc2hvdF9DT1BZX092ZXJsYXBfVEVTVF8yKSB7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2V0dXBDb3B5T3ZlcmxhcF8yKCkpOwogICAgIEFTU0VSVF9UUlVFKE1lcmdlKCkpOwogICAgIFZhbGlkYXRlTWVyZ2UoKTsKLSAgICBTaHV0ZG93bigpOwogfQogCi1URVNUX0YoU25hcHVzZXJkVGVzdCwgU25hcHNob3RfQ09QWV9PdmVybGFwX01lcmdlX1Jlc3VtZV9URVNUKSB7Ci0gICAgQVNTRVJUX1RSVUUoU2V0dXBDb3B5T3ZlcmxhcF8xKCkpOwotICAgIE1lcmdlSW50ZXJydXB0KCk7CitURVNUX1AoU25hcHVzZXJkVGVzdCwgU25hcHNob3RfQ09QWV9PdmVybGFwX01lcmdlX1Jlc3VtZV9URVNUKSB7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2V0dXBDb3B5T3ZlcmxhcF8xKCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKE1lcmdlSW50ZXJydXB0KCkpOwogICAgIFZhbGlkYXRlTWVyZ2UoKTsKLSAgICBTaHV0ZG93bigpOwogfQogCi1URVNUX0YoU25hcHVzZXJkVGVzdCwgU25hcHNob3RfTWVyZ2VfQ3Jhc2hfRml4ZWRfT3JkZXJlZCkgewotICAgIEFTU0VSVF9UUlVFKFNldHVwT3JkZXJlZE9wcygpKTsKLSAgICBNZXJnZUludGVycnVwdEZpeGVkKDMwMCk7CitURVNUX1AoU25hcHVzZXJkVGVzdCwgU25hcHNob3RfQ09QWV9PdmVybGFwX01lcmdlX1Jlc3VtZV9JT19WYWxpZGF0ZV9URVNUKSB7CisgICAgaWYgKCFoYXJuZXNzXy0+SGFzVXNlckRldmljZSgpKSB7CisgICAgICAgIEdURVNUX1NLSVAoKSA8PCAiU2tpcHBpbmcgc25hcHNob3QgcmVhZDsgbm90IHN1cHBvcnRlZCI7CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNldHVwQ29weU92ZXJsYXBfMigpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShNZXJnZUludGVycnVwdEZpeGVkKDMwMCkpOwogICAgIFZhbGlkYXRlTWVyZ2UoKTsKLSAgICBTaHV0ZG93bigpOwogfQogCi1URVNUX0YoU25hcHVzZXJkVGVzdCwgU25hcHNob3RfTWVyZ2VfQ3Jhc2hfUmFuZG9tX09yZGVyZWQpIHsKLSAgICBBU1NFUlRfVFJVRShTZXR1cE9yZGVyZWRPcHMoKSk7Ci0gICAgTWVyZ2VJbnRlcnJ1cHRSYW5kb21seSg1MDApOworVEVTVF9QKFNuYXB1c2VyZFRlc3QsIFNuYXBzaG90X01lcmdlX0NyYXNoX0ZpeGVkX09yZGVyZWQpIHsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShTZXR1cE9yZGVyZWRPcHMoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoTWVyZ2VJbnRlcnJ1cHRGaXhlZCgzMDApKTsKICAgICBWYWxpZGF0ZU1lcmdlKCk7Ci0gICAgU2h1dGRvd24oKTsKIH0KIAotVEVTVF9GKFNuYXB1c2VyZFRlc3QsIFNuYXBzaG90X01lcmdlX0NyYXNoX0ZpeGVkX0ludmVydGVkKSB7Ci0gICAgQVNTRVJUX1RSVUUoU2V0dXBPcmRlcmVkT3BzSW52ZXJ0ZWQoKSk7Ci0gICAgTWVyZ2VJbnRlcnJ1cHRGaXhlZCg1MCk7CitURVNUX1AoU25hcHVzZXJkVGVzdCwgU25hcHNob3RfTWVyZ2VfQ3Jhc2hfUmFuZG9tX09yZGVyZWQpIHsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShTZXR1cE9yZGVyZWRPcHMoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoTWVyZ2VJbnRlcnJ1cHRSYW5kb21seSg1MDApKTsKICAgICBWYWxpZGF0ZU1lcmdlKCk7Ci0gICAgU2h1dGRvd24oKTsKIH0KIAotVEVTVF9GKFNuYXB1c2VyZFRlc3QsIFNuYXBzaG90X01lcmdlX0NyYXNoX1JhbmRvbV9JbnZlcnRlZCkgewotICAgIEFTU0VSVF9UUlVFKFNldHVwT3JkZXJlZE9wc0ludmVydGVkKCkpOwotICAgIE1lcmdlSW50ZXJydXB0UmFuZG9tbHkoNTApOworVEVTVF9QKFNuYXB1c2VyZFRlc3QsIFNuYXBzaG90X01lcmdlX0NyYXNoX0ZpeGVkX0ludmVydGVkKSB7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2V0dXBPcmRlcmVkT3BzSW52ZXJ0ZWQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoTWVyZ2VJbnRlcnJ1cHRGaXhlZCg1MCkpOwogICAgIFZhbGlkYXRlTWVyZ2UoKTsKLSAgICBTaHV0ZG93bigpOwogfQogCitURVNUX1AoU25hcHVzZXJkVGVzdCwgU25hcHNob3RfTWVyZ2VfQ3Jhc2hfUmFuZG9tX0ludmVydGVkKSB7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2V0dXBPcmRlcmVkT3BzSW52ZXJ0ZWQoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoTWVyZ2VJbnRlcnJ1cHRSYW5kb21seSg1MCkpOworICAgIFZhbGlkYXRlTWVyZ2UoKTsKK30KKworY2xhc3MgU25hcHVzZXJkVmFyaWFibGVCbG9ja1NpemVUZXN0IDogcHVibGljIFNuYXB1c2VyZFRlc3QgeworICBwdWJsaWM6CisgICAgdm9pZCBTZXR1cENvd1YzRm9yVmFyaWFibGVCbG9ja1NpemUoKTsKKyAgICB2b2lkIFJlYWRTbmFwc2hvdFdpdGhWYXJpYWJsZUJsb2NrU2l6ZSgpOworCisgIHByb3RlY3RlZDoKKyAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlOworCisgICAgdm9pZCBDcmVhdGVWM0Nvd0RldmljZUZvclZhcmlhYmxlQmxvY2tTaXplKCk7Cit9OworCit2b2lkIFNuYXB1c2VyZFZhcmlhYmxlQmxvY2tTaXplVGVzdDo6U2V0dXBDb3dWM0ZvclZhcmlhYmxlQmxvY2tTaXplKCkgeworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKENyZWF0ZUJhc2VEZXZpY2UoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoQ3JlYXRlVjNDb3dEZXZpY2VGb3JWYXJpYWJsZUJsb2NrU2l6ZSgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShTZXR1cERhZW1vbigpKTsKK30KKwordm9pZCBTbmFwdXNlcmRWYXJpYWJsZUJsb2NrU2l6ZVRlc3Q6OkNyZWF0ZVYzQ293RGV2aWNlRm9yVmFyaWFibGVCbG9ja1NpemUoKSB7CisgICAgYXV0byB3cml0ZXIgPSBDcmVhdGVWM0NvdygpOworCisgICAgQVNTRVJUX05FKHdyaXRlciwgbnVsbHB0cik7CisgICAgc2l6ZV90IHRvdGFsX2RhdGFfdG9fd3JpdGUgPSBzaXplXzsKKworICAgIHNpemVfdCB0b3RhbF9ibG9ja3NfdG9fd3JpdGUgPSB0b3RhbF9kYXRhX3RvX3dyaXRlIC8gQkxPQ0tfU1o7CisgICAgc2l6ZV90IG51bV9ibG9ja3NfcGVyX29wID0gdG90YWxfYmxvY2tzX3RvX3dyaXRlIC8gNDsKKyAgICBzaXplX3Qgc291cmNlX2Jsb2NrID0gMDsKKworICAgIHNpemVfdCBzZXFfbGVuID0gbnVtX2Jsb2Nrc19wZXJfb3A7CisgICAgdWludDMyX3Qgc2VxdWVuY2Vbc2VxX2xlbl07CisgICAgc2l6ZV90IHhvcl9ibG9ja19zdGFydCA9IHNlcV9sZW4gKiAzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2VxX2xlbjsgaSsrKSB7CisgICAgICAgIHNlcXVlbmNlW2ldID0geG9yX2Jsb2NrX3N0YXJ0ICsgaTsKKyAgICB9CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRTZXF1ZW5jZURhdGEoc2VxX2xlbiwgc2VxdWVuY2UpKTsKKworICAgIHNpemVfdCB0b3RhbF9yZXBsYWNlX2Jsb2NrcyA9IG51bV9ibG9ja3NfcGVyX29wOworICAgIC8vIFdyaXRlIHNvbWUgZGF0YSB3aGljaCBjYW4gYmUgY29tcHJlc3NlZAorICAgIHN0ZDo6c3RyaW5nIGRhdGE7CisgICAgZGF0YS5yZXNpemUodG90YWxfcmVwbGFjZV9ibG9ja3MgKiBCTE9DS19TWiwgJ1wwJyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkYXRhLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGRhdGFbaV0gPSBzdGF0aWNfY2FzdDxjaGFyPignQScgKyBpIC8gQkxPQ0tfU1opOworICAgIH0KKyAgICAvLyBSRVBMQUNFIG9wcworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkUmF3QmxvY2tzKHNvdXJjZV9ibG9jaywgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKSk7CisKKyAgICB0b3RhbF9ibG9ja3NfdG9fd3JpdGUgLT0gdG90YWxfcmVwbGFjZV9ibG9ja3M7CisgICAgc291cmNlX2Jsb2NrID0gc291cmNlX2Jsb2NrICsgdG90YWxfcmVwbGFjZV9ibG9ja3M7CisKKyAgICAvLyBaRVJPIG9wcworICAgIHNpemVfdCB0b3RhbF96ZXJvX2Jsb2NrcyA9IHRvdGFsX2Jsb2Nrc190b193cml0ZSAvIDM7CisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRaZXJvQmxvY2tzKHNvdXJjZV9ibG9jaywgdG90YWxfemVyb19ibG9ja3MpKTsKKworICAgIHRvdGFsX2Jsb2Nrc190b193cml0ZSAtPSB0b3RhbF96ZXJvX2Jsb2NrczsKKyAgICBzb3VyY2VfYmxvY2sgPSBzb3VyY2VfYmxvY2sgKyB0b3RhbF96ZXJvX2Jsb2NrczsKKworICAgIC8vIEdlbmVyYXRlIHNvbWUgcmFuZG9tIGRhdGEgd2hlcmVpbiBmZXcgYmxvY2tzIGNhbm5vdCBiZSBjb21wcmVzc2VkLgorICAgIC8vIFRoaXMgaXMgdG8gdGVzdCB0aGUgSS9PIHBhdGggZm9yIHRob3NlIGJsb2NrcyB3aGljaCBhcmVuJ3QgY29tcHJlc3NlZC4KKyAgICBzaXplX3QgdG90YWxfcmFuZG9tX2RhdGFfYmxvY2tzID0gdG90YWxfYmxvY2tzX3RvX3dyaXRlIC8gMjsKKyAgICB1bmlxdWVfZmQgcm5kX2ZkKG9wZW4oIi9kZXYvcmFuZG9tIiwgT19SRE9OTFkpKTsKKworICAgIEFTU0VSVF9HRShybmRfZmQsIDApOworICAgIHN0ZDo6c3RyaW5nIHJhbmRvbV9idWZmZXI7CisgICAgcmFuZG9tX2J1ZmZlci5yZXNpemUodG90YWxfcmFuZG9tX2RhdGFfYmxvY2tzICogQkxPQ0tfU1osICdcMCcpOworICAgIEFTU0VSVF9FUSgKKyAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseUF0T2Zmc2V0KHJuZF9mZCwgcmFuZG9tX2J1ZmZlci5kYXRhKCksIHJhbmRvbV9idWZmZXIuc2l6ZSgpLCAwKSwKKyAgICAgICAgICAgIHRydWUpOworICAgIC8vIFJFUExBQ0Ugb3BzCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRSYXdCbG9ja3Moc291cmNlX2Jsb2NrLCByYW5kb21fYnVmZmVyLmRhdGEoKSwgcmFuZG9tX2J1ZmZlci5zaXplKCkpKTsKKworICAgIHRvdGFsX2Jsb2Nrc190b193cml0ZSAtPSB0b3RhbF9yYW5kb21fZGF0YV9ibG9ja3M7CisgICAgc291cmNlX2Jsb2NrID0gc291cmNlX2Jsb2NrICsgdG90YWxfcmFuZG9tX2RhdGFfYmxvY2tzOworCisgICAgLy8gWE9SIG9wcyB3aWxsIGFsd2F5cyBiZSA0ayBibG9ja3MKKyAgICBzdGQ6OnN0cmluZyB4b3JfYnVmZmVyOworICAgIHhvcl9idWZmZXIucmVzaXplKHRvdGFsX2Jsb2Nrc190b193cml0ZSAqIEJMT0NLX1NaLCAnXDAnKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHhvcl9idWZmZXIuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgeG9yX2J1ZmZlcltpXSA9IHN0YXRpY19jYXN0PGNoYXI+KCdDJyArIGkgLyBCTE9DS19TWik7CisgICAgfQorICAgIHNpemVfdCB4b3Jfb2Zmc2V0ID0gMjE7CisgICAgc3RkOjpzdHJpbmcgc291cmNlX2J1ZmZlcjsKKyAgICBzb3VyY2VfYnVmZmVyLnJlc2l6ZSh0b3RhbF9ibG9ja3NfdG9fd3JpdGUgKiBCTE9DS19TWiwgJ1wwJyk7CisgICAgQVNTRVJUX0VRKGFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseUF0T2Zmc2V0KGJhc2VfZmRfLCBzb3VyY2VfYnVmZmVyLmRhdGEoKSwgc291cmNlX2J1ZmZlci5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfICsgeG9yX29mZnNldCksCisgICAgICAgICAgICAgIHRydWUpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgeG9yX2J1ZmZlci5zaXplKCk7IGkrKykgeworICAgICAgICB4b3JfYnVmZmVyW2ldIF49IHNvdXJjZV9idWZmZXJbaV07CisgICAgfQorCisgICAgQVNTRVJUX0VRKHhvcl9ibG9ja19zdGFydCwgc291cmNlX2Jsb2NrKTsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWG9yQmxvY2tzKHNvdXJjZV9ibG9jaywgeG9yX2J1ZmZlci5kYXRhKCksIHhvcl9idWZmZXIuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplXyAvIEJMT0NLX1NaKSwgeG9yX29mZnNldCkpOworICAgIC8vIEZsdXNoIG9wZXJhdGlvbnMKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkZpbmFsaXplKCkpOworCisgICAgLy8gQ29uc3RydWN0IHRoZSBidWZmZXIgcmVxdWlyZWQgZm9yIHZhbGlkYXRpb24KKyAgICBvcmlnX2J1ZmZlcl8gPSBzdGQ6Om1ha2VfdW5pcXVlPHVpbnQ4X3RbXT4odG90YWxfYmFzZV9zaXplXyk7CisKKyAgICAvLyBSZWFkIHRoZSBlbnRpcmUgYmFzZSBkZXZpY2UKKyAgICBBU1NFUlRfRVEoYW5kcm9pZDo6YmFzZTo6UmVhZEZ1bGx5QXRPZmZzZXQoYmFzZV9mZF8sIG9yaWdfYnVmZmVyXy5nZXQoKSwgdG90YWxfYmFzZV9zaXplXywgMCksCisgICAgICAgICAgICAgIHRydWUpOworCisgICAgLy8gUkVQTEFDRSBvcHMgd2hpY2ggYXJlIGNvbXByZXNzZWQKKyAgICBzdGQ6Om1lbWNweShvcmlnX2J1ZmZlcl8uZ2V0KCksIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7CisgICAgc2l6ZV90IG9mZnNldCA9IGRhdGEuc2l6ZSgpOworCisgICAgLy8gWkVSTyBvcHMKKyAgICBzdGQ6OnN0cmluZyB6ZXJvX2J1ZmZlcih0b3RhbF96ZXJvX2Jsb2NrcyAqIEJMT0NLX1NaLCAwKTsKKyAgICBzdGQ6Om1lbWNweSgoY2hhciopb3JpZ19idWZmZXJfLmdldCgpICsgb2Zmc2V0LCAodm9pZCopemVyb19idWZmZXIuY19zdHIoKSwgemVyb19idWZmZXIuc2l6ZSgpKTsKKyAgICBvZmZzZXQgKz0gemVyb19idWZmZXIuc2l6ZSgpOworCisgICAgLy8gUkVQTEFDRSBvcHMgLSBSYW5kb20gYnVmZmVycyB3aGljaCBhcmVuJ3QgY29tcHJlc3NlZAorICAgIHN0ZDo6bWVtY3B5KChjaGFyKilvcmlnX2J1ZmZlcl8uZ2V0KCkgKyBvZmZzZXQsIHJhbmRvbV9idWZmZXIuY19zdHIoKSwgcmFuZG9tX2J1ZmZlci5zaXplKCkpOworICAgIG9mZnNldCArPSByYW5kb21fYnVmZmVyLnNpemUoKTsKKworICAgIC8vIFhPUiBPcHMgd2hpY2ggZGVmYXVsdCB0byA0ayBibG9jayBzaXplIGNvbXByZXNzaW9uIGlycmVzcGVjdGl2ZSBvZgorICAgIC8vIGNvbXByZXNzaW9uIGZhY3RvcgorICAgIEFTU0VSVF9FUShhbmRyb2lkOjpiYXNlOjpSZWFkRnVsbHlBdE9mZnNldChiYXNlX2ZkXywgKGNoYXIqKW9yaWdfYnVmZmVyXy5nZXQoKSArIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG9yX2J1ZmZlci5zaXplKCksIHNpemVfICsgeG9yX29mZnNldCksCisgICAgICAgICAgICAgIHRydWUpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgeG9yX2J1ZmZlci5zaXplKCk7IGkrKykgeworICAgICAgICBvcmlnX2J1ZmZlcl8uZ2V0KClbb2Zmc2V0ICsgaV0gPSAodWludDhfdCkob3JpZ19idWZmZXJfLmdldCgpW29mZnNldCArIGldIF4geG9yX2J1ZmZlcltpXSk7CisgICAgfQorfQorCit2b2lkIFNuYXB1c2VyZFZhcmlhYmxlQmxvY2tTaXplVGVzdDo6UmVhZFNuYXBzaG90V2l0aFZhcmlhYmxlQmxvY2tTaXplKCkgeworICAgIHVuaXF1ZV9mZCBmZChvcGVuKGRtdXNlcl9kZXZfLT5HZXRQYXRoKCkuY19zdHIoKSwgT19SRE9OTFkgfCBPX0RJUkVDVCkpOworICAgIEFTU0VSVF9HRShmZCwgMCk7CisKKyAgICB2b2lkKiBhZGRyOworICAgIHNzaXplX3QgcGFnZV9zaXplID0gZ2V0cGFnZXNpemUoKTsKKyAgICBBU1NFUlRfRVEocG9zaXhfbWVtYWxpZ24oJmFkZHIsIHBhZ2Vfc2l6ZSwgc2l6ZV8pLCAwKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dm9pZCwgZGVjbHR5cGUoJjo6ZnJlZSk+IHNuYXBzaG90X2J1ZmZlcihhZGRyLCA6OmZyZWUpOworCisgICAgY29uc3QgVGVzdFBhcmFtIHBhcmFtcyA9IEdldFBhcmFtKCk7CisKKyAgICAvLyBJc3N1ZSBJL08gcmVxdWVzdCB3aXRoIHZhcmlvdXMgYmxvY2sgc2l6ZXMKKyAgICBzaXplX3QgbnVtX2Jsb2NrcyA9IHNpemVfIC8gcGFyYW1zLmJsb2NrX3NpemU7CisgICAgb2ZmX3Qgb2Zmc2V0ID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bV9ibG9ja3M7IGkrKykgeworICAgICAgICBBU1NFUlRfRVEoUmVhZEZ1bGx5QXRPZmZzZXQoZmQsIChjaGFyKilzbmFwc2hvdF9idWZmZXIuZ2V0KCkgKyBvZmZzZXQsIHBhcmFtcy5ibG9ja19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICBvZmZzZXQgKz0gcGFyYW1zLmJsb2NrX3NpemU7CisgICAgfQorICAgIC8vIFZhbGlkYXRlIGJ1ZmZlcgorICAgIEFTU0VSVF9FUShtZW1jbXAoc25hcHNob3RfYnVmZmVyLmdldCgpLCBvcmlnX2J1ZmZlcl8uZ2V0KCksIHNpemVfKSwgMCk7CisKKyAgICAvLyBSZXNldCB0aGUgYnVmZmVyCisgICAgc3RkOjptZW1zZXQoc25hcHNob3RfYnVmZmVyLmdldCgpLCAwLCBzaXplXyk7CisKKyAgICAvLyBSZWFkIG9uZSBmdWxsIGNodW5rIGluIGEgc2luZ2xlIHNob3QgYW5kIHJlLXZhbGlkYXRlLgorICAgIEFTU0VSVF9FUShSZWFkRnVsbHlBdE9mZnNldChmZCwgc25hcHNob3RfYnVmZmVyLmdldCgpLCBzaXplXywgMCksIHRydWUpOworICAgIEFTU0VSVF9FUShtZW1jbXAoc25hcHNob3RfYnVmZmVyLmdldCgpLCBvcmlnX2J1ZmZlcl8uZ2V0KCksIHNpemVfKSwgMCk7CisKKyAgICAvLyBSZXNldCB0aGUgYnVmZmVyCisgICAgc3RkOjptZW1zZXQoc25hcHNob3RfYnVmZmVyLmdldCgpLCAwLCBzaXplXyk7CisKKyAgICAvLyBCdWZmZXJlZCBJL08gdGVzdAorICAgIGZkLnJlc2V0KG9wZW4oZG11c2VyX2Rldl8tPkdldFBhdGgoKS5jX3N0cigpLCBPX1JET05MWSkpOworICAgIEFTU0VSVF9HRShmZCwgMCk7CisKKyAgICAvLyBUcnkgbm90IHRvIGNhY2hlCisgICAgcG9zaXhfZmFkdmlzZShmZC5nZXQoKSwgMCwgc2l6ZV8sIFBPU0lYX0ZBRFZfRE9OVE5FRUQpOworCisgICAgc2l6ZV90IG51bV9ibG9ja3NfcGVyX29wID0gKHNpemVfIC8gQkxPQ0tfU1opIC8gNDsKKyAgICBvZmZzZXQgPSBudW1fYmxvY2tzX3Blcl9vcCAqIEJMT0NLX1NaOworICAgIHNpemVfdCByZWFkX3NpemUgPSAxMDE5OyAgLy8gYnl0ZXMKKyAgICBvZmZzZXQgLT0gMTExOworCisgICAgLy8gSXNzdWUgYSB1bi1hbGlnbmVkIHJlYWQgd2hpY2ggY3Jvc3NlcyB0aGUgYm91bmRhcnkgYmV0d2VlbiBhIFJFUExBQ0UgYmxvY2sgYW5kIGEgWkVSTworICAgIC8vIGJsb2NrLgorICAgIEFTU0VSVF9FUShSZWFkRnVsbHlBdE9mZnNldChmZCwgc25hcHNob3RfYnVmZmVyLmdldCgpLCByZWFkX3NpemUsIG9mZnNldCksIHRydWUpOworCisgICAgLy8gVmFsaWRhdGUgdGhlIGRhdGEKKyAgICBBU1NFUlRfRVEoc3RkOjptZW1jbXAoc25hcHNob3RfYnVmZmVyLmdldCgpLCAoY2hhciopb3JpZ19idWZmZXJfLmdldCgpICsgb2Zmc2V0LCByZWFkX3NpemUpLCAwKTsKKworICAgIG9mZnNldCA9IChudW1fYmxvY2tzX3Blcl9vcCAqIDMpICogQkxPQ0tfU1o7CisgICAgb2Zmc2V0IC09IChCTE9DS19TWiAtIDExOSk7CisgICAgcmVhZF9zaXplID0gODExMTsKKworICAgIC8vIElzc3VlIGFuIHVuLWFsaWduZWQgcmVhZCB3aGljaCBjcm9zc2VzIHRoZSBib3VuZGFyeSBiZXR3ZWVuIGEgUkVQTEFDRSBibG9jayBvZiByYW5kb20KKyAgICAvLyB1bi1jb21wcmVzc2VkIGRhdGEgYW5kIGEgWE9SIGJsb2NrCisgICAgQVNTRVJUX0VRKFJlYWRGdWxseUF0T2Zmc2V0KGZkLCBzbmFwc2hvdF9idWZmZXIuZ2V0KCksIHJlYWRfc2l6ZSwgb2Zmc2V0KSwgdHJ1ZSk7CisKKyAgICAvLyBWYWxpZGF0ZSB0aGUgZGF0YQorICAgIEFTU0VSVF9FUShzdGQ6Om1lbWNtcChzbmFwc2hvdF9idWZmZXIuZ2V0KCksIChjaGFyKilvcmlnX2J1ZmZlcl8uZ2V0KCkgKyBvZmZzZXQsIHJlYWRfc2l6ZSksIDApOworCisgICAgLy8gUmVzZXQgdGhlIGJ1ZmZlcgorICAgIHN0ZDo6bWVtc2V0KHNuYXBzaG90X2J1ZmZlci5nZXQoKSwgMCwgc2l6ZV8pOworCisgICAgLy8gUmVhZCBqdXN0IG9uZSBieXRlIGF0IGFuIG9kZCBvZmZzZXQgd2hpY2ggaXMgYSBSRVBMQUNFIG9wCisgICAgb2Zmc2V0ID0gMTk7CisgICAgcmVhZF9zaXplID0gMTsKKyAgICBBU1NFUlRfRVEoUmVhZEZ1bGx5QXRPZmZzZXQoZmQsIHNuYXBzaG90X2J1ZmZlci5nZXQoKSwgcmVhZF9zaXplLCBvZmZzZXQpLCB0cnVlKTsKKyAgICAvLyBWYWxpZGF0ZSB0aGUgZGF0YQorICAgIEFTU0VSVF9FUShzdGQ6Om1lbWNtcChzbmFwc2hvdF9idWZmZXIuZ2V0KCksIChjaGFyKilvcmlnX2J1ZmZlcl8uZ2V0KCkgKyBvZmZzZXQsIHJlYWRfc2l6ZSksIDApOworCisgICAgLy8gUmVzZXQgdGhlIGJ1ZmZlcgorICAgIHN0ZDo6bWVtc2V0KHNuYXBzaG90X2J1ZmZlci5nZXQoKSwgMCwgc2l6ZV8pOworCisgICAgLy8gUmVhZCBhIGJsb2NrIHdoaWNoIGhhcyBubyBtYXBwaW5nIHRvIGEgQ09XIG9wZXJhdGlvbi4gVGhpcyByZWFkIHNob3VsZCBiZQorICAgIC8vIGEgcGFzcy10aHJvdWdoIHRvIHRoZSB1bmRlcmx5aW5nIGJhc2UgZGV2aWNlLgorICAgIG9mZnNldCA9IHNpemVfICsgOTM0MjsKKyAgICByZWFkX3NpemUgPSAzMDsKKyAgICBBU1NFUlRfRVEoUmVhZEZ1bGx5QXRPZmZzZXQoZmQsIHNuYXBzaG90X2J1ZmZlci5nZXQoKSwgcmVhZF9zaXplLCBvZmZzZXQpLCB0cnVlKTsKKyAgICAvLyBWYWxpZGF0ZSB0aGUgZGF0YQorICAgIEFTU0VSVF9FUShzdGQ6Om1lbWNtcChzbmFwc2hvdF9idWZmZXIuZ2V0KCksIChjaGFyKilvcmlnX2J1ZmZlcl8uZ2V0KCkgKyBvZmZzZXQsIHJlYWRfc2l6ZSksIDApOworfQorCit2b2lkIFNuYXB1c2VyZFZhcmlhYmxlQmxvY2tTaXplVGVzdDo6U2V0VXAoKSB7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU25hcHVzZXJkVGVzdDo6U2V0VXAoKSk7Cit9CisKK3ZvaWQgU25hcHVzZXJkVmFyaWFibGVCbG9ja1NpemVUZXN0OjpUZWFyRG93bigpIHsKKyAgICBTbmFwdXNlcmRUZXN0OjpUZWFyRG93bigpOworfQorCitURVNUX1AoU25hcHVzZXJkVmFyaWFibGVCbG9ja1NpemVUZXN0LCBTbmFwc2hvdF9UZXN0X1ZhcmlhYmxlX0Jsb2NrX1NpemUpIHsKKyAgICBpZiAoIWhhcm5lc3NfLT5IYXNVc2VyRGV2aWNlKCkpIHsKKyAgICAgICAgR1RFU1RfU0tJUCgpIDw8ICJTa2lwcGluZyBzbmFwc2hvdCByZWFkOyBub3Qgc3VwcG9ydGVkIjsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2V0dXBDb3dWM0ZvclZhcmlhYmxlQmxvY2tTaXplKCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFJlYWRTbmFwc2hvdFdpdGhWYXJpYWJsZUJsb2NrU2l6ZSgpKTsKKyAgICBBU1NFUlRfVFJVRShTdGFydE1lcmdlKCkpOworICAgIENoZWNrTWVyZ2VDb21wbGV0aW9uKCk7CisgICAgVmFsaWRhdGVNZXJnZSgpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFJlYWRTbmFwc2hvdFdpdGhWYXJpYWJsZUJsb2NrU2l6ZSgpKTsKK30KKworY2xhc3MgSGFuZGxlclRlc3QgOiBwdWJsaWMgU25hcHVzZXJkVGVzdEJhc2UgeworICBwcm90ZWN0ZWQ6CisgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlOworICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZTsKKworICAgIHZvaWQgU2V0VXBWMkNvdygpOworICAgIHZvaWQgSW5pdGlhbGl6ZURldmljZSgpOworICAgIEFzc2VydGlvblJlc3VsdCBSZWFkU2VjdG9ycyhzZWN0b3JfdCBzZWN0b3IsIHVpbnQ2NF90IHNpemUsIHZvaWQqIGJ1ZmZlcik7CisKKyAgICBUZXN0QmxvY2tTZXJ2ZXJGYWN0b3J5IGZhY3RvcnlfOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUZXN0QmxvY2tTZXJ2ZXJPcGVuZXI+IG9wZW5lcl87CisgICAgc3RkOjpzaGFyZWRfcHRyPFNuYXBzaG90SGFuZGxlcj4gaGFuZGxlcl87CisgICAgc3RkOjp1bmlxdWVfcHRyPFJlYWRXb3JrZXI+IHJlYWRfd29ya2VyXzsKKyAgICBUZXN0QmxvY2tTZXJ2ZXIqIGJsb2NrX3NlcnZlcl87CisgICAgc3RkOjpmdXR1cmU8Ym9vbD4gaGFuZGxlcl90aHJlYWRfOworfTsKKwordm9pZCBIYW5kbGVyVGVzdDo6U2V0VXBWMkNvdygpIHsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShDcmVhdGVDb3dEZXZpY2UoKSk7Cit9CisKK3ZvaWQgSGFuZGxlclRlc3Q6OkluaXRpYWxpemVEZXZpY2UoKSB7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2V0RGV2aWNlQ29udHJvbE5hbWUoKSk7CisKKyAgICBvcGVuZXJfID0gZmFjdG9yeV8uQ3JlYXRlVGVzdE9wZW5lcihzeXN0ZW1fZGV2aWNlX2N0cmxfbmFtZV8pOworICAgIEFTU0VSVF9ORShvcGVuZXJfLCBudWxscHRyKTsKKworICAgIGNvbnN0IFRlc3RQYXJhbSBwYXJhbXMgPSBHZXRQYXJhbSgpOworICAgIGhhbmRsZXJfID0gc3RkOjptYWtlX3NoYXJlZDxTbmFwc2hvdEhhbmRsZXI+KAorICAgICAgICAgICAgc3lzdGVtX2RldmljZV9jdHJsX25hbWVfLCBjb3dfc3lzdGVtXy0+cGF0aCwgYmFzZV9kZXZfLT5HZXRQYXRoKCksIGJhc2VfZGV2Xy0+R2V0UGF0aCgpLAorICAgICAgICAgICAgb3BlbmVyXywgMSwgZmFsc2UsIGZhbHNlLCBwYXJhbXMub19kaXJlY3QsIHBhcmFtcy5jb3dfb3BfbWVyZ2Vfc2l6ZSk7CisgICAgQVNTRVJUX1RSVUUoaGFuZGxlcl8tPkluaXRDb3dEZXZpY2UoKSk7CisgICAgQVNTRVJUX1RSVUUoaGFuZGxlcl8tPkluaXRpYWxpemVXb3JrZXJzKCkpOworCisgICAgcmVhZF93b3JrZXJfID0gc3RkOjptYWtlX3VuaXF1ZTxSZWFkV29ya2VyPihjb3dfc3lzdGVtXy0+cGF0aCwgYmFzZV9kZXZfLT5HZXRQYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW1fZGV2aWNlX2N0cmxfbmFtZV8sIGJhc2VfZGV2Xy0+R2V0UGF0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcl8tPkdldFNoYXJlZFB0cigpLCBvcGVuZXJfKTsKKyAgICBBU1NFUlRfVFJVRShyZWFkX3dvcmtlcl8tPkluaXQoKSk7CisgICAgYmxvY2tfc2VydmVyXyA9IHN0YXRpY19jYXN0PFRlc3RCbG9ja1NlcnZlcio+KHJlYWRfd29ya2VyXy0+YmxvY2tfc2VydmVyKCkpOworCisgICAgaGFuZGxlcl90aHJlYWRfID0gc3RkOjphc3luYyhzdGQ6OmxhdW5jaDo6YXN5bmMsICZTbmFwc2hvdEhhbmRsZXI6OlN0YXJ0LCBoYW5kbGVyXy5nZXQoKSk7Cit9CisKK3ZvaWQgSGFuZGxlclRlc3Q6OlNldFVwKCkgeworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNuYXB1c2VyZFRlc3RCYXNlOjpTZXRVcCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShDcmVhdGVCYXNlRGV2aWNlKCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNldFVwVjJDb3coKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoSW5pdGlhbGl6ZURldmljZSgpKTsKK30KKwordm9pZCBIYW5kbGVyVGVzdDo6VGVhckRvd24oKSB7CisgICAgQVNTRVJUX1RSVUUoZmFjdG9yeV8uRGVsZXRlUXVldWUoc3lzdGVtX2RldmljZV9jdHJsX25hbWVfKSk7CisgICAgQVNTRVJUX1RSVUUoaGFuZGxlcl90aHJlYWRfLmdldCgpKTsKKyAgICBTbmFwdXNlcmRUZXN0QmFzZTo6VGVhckRvd24oKTsKK30KKworQXNzZXJ0aW9uUmVzdWx0IEhhbmRsZXJUZXN0OjpSZWFkU2VjdG9ycyhzZWN0b3JfdCBzZWN0b3IsIHVpbnQ2NF90IHNpemUsIHZvaWQqIGJ1ZmZlcikgeworICAgIGlmICghcmVhZF93b3JrZXJfLT5SZXF1ZXN0U2VjdG9ycyhzZWN0b3IsIHNpemUpKSB7CisgICAgICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgInJlcXVlc3Qgc2VjdG9ycyBmYWlsZWQiOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9IHN0ZDo6bW92ZShibG9ja19zZXJ2ZXJfLT5zZW50X2lvKCkpOworICAgIGlmIChyZXN1bHQuc2l6ZSgpICE9IHNpemUpIHsKKyAgICAgICAgcmV0dXJuIEFzc2VydGlvbkZhaWx1cmUoKSA8PCAic2l6ZSBtaXNtYXRjaCBpbiByZXN1bHQsIGdvdCAiIDw8IHJlc3VsdC5zaXplKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBleHBlY3RlZCAiIDw8IHNpemU7CisgICAgfQorCisgICAgbWVtY3B5KGJ1ZmZlciwgcmVzdWx0LmRhdGEoKSwgc2l6ZSk7CisgICAgcmV0dXJuIEFzc2VydGlvblN1Y2Nlc3MoKTsKK30KKworLy8gVGhpcyB0ZXN0IG1pcnJvcnMgUmVhZFNuYXBzaG90RGV2aWNlQW5kVmFsaWRhdGUuCitURVNUX1AoSGFuZGxlclRlc3QsIFJlYWQpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBzbmFwdXNlcmRfYnVmZmVyID0gc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KHNpemVfKTsKKworICAgIC8vIENPUFkKKyAgICBsb2ZmX3Qgb2Zmc2V0ID0gMDsKKyAgICBBU1NFUlRfVFJVRShSZWFkU2VjdG9ycyhvZmZzZXQgLyBTRUNUT1JfU0laRSwgc2l6ZV8sIHNuYXB1c2VyZF9idWZmZXIuZ2V0KCkpKTsKKyAgICBBU1NFUlRfRVEobWVtY21wKHNuYXB1c2VyZF9idWZmZXIuZ2V0KCksIG9yaWdfYnVmZmVyXy5nZXQoKSwgc2l6ZV8pLCAwKTsKKworICAgIC8vIFJFUExBQ0UKKyAgICBvZmZzZXQgKz0gc2l6ZV87CisgICAgQVNTRVJUX1RSVUUoUmVhZFNlY3RvcnMob2Zmc2V0IC8gU0VDVE9SX1NJWkUsIHNpemVfLCBzbmFwdXNlcmRfYnVmZmVyLmdldCgpKSk7CisgICAgQVNTRVJUX0VRKG1lbWNtcChzbmFwdXNlcmRfYnVmZmVyLmdldCgpLCAoY2hhciopb3JpZ19idWZmZXJfLmdldCgpICsgc2l6ZV8sIHNpemVfKSwgMCk7CisKKyAgICAvLyBaRVJPCisgICAgb2Zmc2V0ICs9IHNpemVfOworICAgIEFTU0VSVF9UUlVFKFJlYWRTZWN0b3JzKG9mZnNldCAvIFNFQ1RPUl9TSVpFLCBzaXplXywgc25hcHVzZXJkX2J1ZmZlci5nZXQoKSkpOworICAgIEFTU0VSVF9FUShtZW1jbXAoc25hcHVzZXJkX2J1ZmZlci5nZXQoKSwgKGNoYXIqKW9yaWdfYnVmZmVyXy5nZXQoKSArIChzaXplXyAqIDIpLCBzaXplXyksIDApOworCisgICAgLy8gUkVQTEFDRQorICAgIG9mZnNldCArPSBzaXplXzsKKyAgICBBU1NFUlRfVFJVRShSZWFkU2VjdG9ycyhvZmZzZXQgLyBTRUNUT1JfU0laRSwgc2l6ZV8sIHNuYXB1c2VyZF9idWZmZXIuZ2V0KCkpKTsKKyAgICBBU1NFUlRfRVEobWVtY21wKHNuYXB1c2VyZF9idWZmZXIuZ2V0KCksIChjaGFyKilvcmlnX2J1ZmZlcl8uZ2V0KCkgKyAoc2l6ZV8gKiAzKSwgc2l6ZV8pLCAwKTsKKworICAgIC8vIFhPUgorICAgIG9mZnNldCArPSBzaXplXzsKKyAgICBBU1NFUlRfVFJVRShSZWFkU2VjdG9ycyhvZmZzZXQgLyBTRUNUT1JfU0laRSwgc2l6ZV8sIHNuYXB1c2VyZF9idWZmZXIuZ2V0KCkpKTsKKyAgICBBU1NFUlRfRVEobWVtY21wKHNuYXB1c2VyZF9idWZmZXIuZ2V0KCksIChjaGFyKilvcmlnX2J1ZmZlcl8uZ2V0KCkgKyAoc2l6ZV8gKiA0KSwgc2l6ZV8pLCAwKTsKK30KKworVEVTVF9QKEhhbmRsZXJUZXN0LCBSZWFkVW5hbGlnbmVkU2VjdG9yKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gc25hcHVzZXJkX2J1ZmZlciA9IHN0ZDo6bWFrZV91bmlxdWU8dWludDhfdFtdPihCTE9DS19TWik7CisKKyAgICBBU1NFUlRfVFJVRShSZWFkU2VjdG9ycygxLCBCTE9DS19TWiwgc25hcHVzZXJkX2J1ZmZlci5nZXQoKSkpOworICAgIEFTU0VSVF9FUShtZW1jbXAoc25hcHVzZXJkX2J1ZmZlci5nZXQoKSwgb3JpZ19idWZmZXJfLmdldCgpICsgU0VDVE9SX1NJWkUsIEJMT0NLX1NaKSwgMCk7Cit9CisKK1RFU1RfUChIYW5kbGVyVGVzdCwgUmVhZFVuYWxpZ25lZFNpemUpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBzbmFwdXNlcmRfYnVmZmVyID0gc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KFNFQ1RPUl9TSVpFKTsKKworICAgIEFTU0VSVF9UUlVFKFJlYWRTZWN0b3JzKDAsIFNFQ1RPUl9TSVpFLCBzbmFwdXNlcmRfYnVmZmVyLmdldCgpKSk7CisgICAgQVNTRVJUX0VRKG1lbWNtcChzbmFwdXNlcmRfYnVmZmVyLmdldCgpLCBvcmlnX2J1ZmZlcl8uZ2V0KCksIFNFQ1RPUl9TSVpFKSwgMCk7Cit9CisKK2NsYXNzIEhhbmRsZXJUZXN0VjMgOiBwdWJsaWMgSGFuZGxlclRlc3QgeworICBwdWJsaWM6CisgICAgdm9pZCBSZWFkU25hcHNob3RXaXRoVmFyaWFibGVCbG9ja1NpemUoKTsKKworICBwcm90ZWN0ZWQ6CisgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlOworICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZTsKKyAgICB2b2lkIFNldFVwVjNDb3coKTsKK307CisKK3ZvaWQgSGFuZGxlclRlc3RWMzo6U2V0VXAoKSB7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU25hcHVzZXJkVGVzdEJhc2U6OlNldFVwKCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKENyZWF0ZUJhc2VEZXZpY2UoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoU2V0VXBWM0NvdygpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShJbml0aWFsaXplRGV2aWNlKCkpOworfQorCit2b2lkIEhhbmRsZXJUZXN0VjM6OlRlYXJEb3duKCkgeworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKEhhbmRsZXJUZXN0OjpUZWFyRG93bigpKTsKK30KKwordm9pZCBIYW5kbGVyVGVzdFYzOjpTZXRVcFYzQ293KCkgeworICAgIGF1dG8gd3JpdGVyID0gQ3JlYXRlVjNDb3coKTsKKworICAgIEFTU0VSVF9ORSh3cml0ZXIsIG51bGxwdHIpOworICAgIHNpemVfdCB0b3RhbF9kYXRhX3RvX3dyaXRlID0gc2l6ZV87CisKKyAgICBzaXplX3QgdG90YWxfYmxvY2tzX3RvX3dyaXRlID0gdG90YWxfZGF0YV90b193cml0ZSAvIEJMT0NLX1NaOworICAgIHNpemVfdCBudW1fYmxvY2tzX3Blcl9vcCA9IHRvdGFsX2Jsb2Nrc190b193cml0ZSAvIDQ7CisgICAgc2l6ZV90IHNvdXJjZV9ibG9jayA9IDA7CisKKyAgICBzaXplX3QgdG90YWxfcmVwbGFjZV9ibG9ja3MgPSBudW1fYmxvY2tzX3Blcl9vcDsKKyAgICAvLyBXcml0ZSBzb21lIGRhdGEgd2hpY2ggY2FuIGJlIGNvbXByZXNzZWQKKyAgICBzdGQ6OnN0cmluZyBkYXRhOworICAgIGRhdGEucmVzaXplKHRvdGFsX3JlcGxhY2VfYmxvY2tzICogQkxPQ0tfU1osICdcMCcpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGF0YS5zaXplKCk7IGkrKykgeworICAgICAgICBkYXRhW2ldID0gc3RhdGljX2Nhc3Q8Y2hhcj4oJ0EnICsgaSAvIEJMT0NLX1NaKTsKKyAgICB9CisgICAgLy8gUkVQTEFDRSBvcHMKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPkFkZFJhd0Jsb2Nrcyhzb3VyY2VfYmxvY2ssIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSkpOworCisgICAgdG90YWxfYmxvY2tzX3RvX3dyaXRlIC09IHRvdGFsX3JlcGxhY2VfYmxvY2tzOworICAgIHNvdXJjZV9ibG9jayA9IHNvdXJjZV9ibG9jayArIHRvdGFsX3JlcGxhY2VfYmxvY2tzOworCisgICAgLy8gWkVSTyBvcHMKKyAgICBzaXplX3QgdG90YWxfemVyb19ibG9ja3MgPSB0b3RhbF9ibG9ja3NfdG9fd3JpdGUgLyAzOworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+QWRkWmVyb0Jsb2Nrcyhzb3VyY2VfYmxvY2ssIHRvdGFsX3plcm9fYmxvY2tzKSk7CisKKyAgICB0b3RhbF9ibG9ja3NfdG9fd3JpdGUgLT0gdG90YWxfemVyb19ibG9ja3M7CisgICAgc291cmNlX2Jsb2NrID0gc291cmNlX2Jsb2NrICsgdG90YWxfemVyb19ibG9ja3M7CisKKyAgICAvLyBHZW5lcmF0ZSBzb21lIHJhbmRvbSBkYXRhIHdoZXJlaW4gZmV3IGJsb2NrcyBjYW5ub3QgYmUgY29tcHJlc3NlZC4KKyAgICAvLyBUaGlzIGlzIHRvIHRlc3QgdGhlIEkvTyBwYXRoIGZvciB0aG9zZSBibG9ja3Mgd2hpY2ggYXJlbid0IGNvbXByZXNzZWQuCisgICAgc2l6ZV90IHRvdGFsX3JhbmRvbV9kYXRhX2Jsb2NrcyA9IHRvdGFsX2Jsb2Nrc190b193cml0ZTsKKyAgICB1bmlxdWVfZmQgcm5kX2ZkKG9wZW4oIi9kZXYvcmFuZG9tIiwgT19SRE9OTFkpKTsKKworICAgIEFTU0VSVF9HRShybmRfZmQsIDApOworICAgIHN0ZDo6c3RyaW5nIHJhbmRvbV9idWZmZXI7CisgICAgcmFuZG9tX2J1ZmZlci5yZXNpemUodG90YWxfcmFuZG9tX2RhdGFfYmxvY2tzICogQkxPQ0tfU1osICdcMCcpOworICAgIEFTU0VSVF9FUSgKKyAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseUF0T2Zmc2V0KHJuZF9mZCwgcmFuZG9tX2J1ZmZlci5kYXRhKCksIHJhbmRvbV9idWZmZXIuc2l6ZSgpLCAwKSwKKyAgICAgICAgICAgIHRydWUpOworICAgIC8vIFJFUExBQ0Ugb3BzCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5BZGRSYXdCbG9ja3Moc291cmNlX2Jsb2NrLCByYW5kb21fYnVmZmVyLmRhdGEoKSwgcmFuZG9tX2J1ZmZlci5zaXplKCkpKTsKKyAgICAvLyBGbHVzaCBvcGVyYXRpb25zCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5GaW5hbGl6ZSgpKTsKKworICAgIC8vIENvbnN0cnVjdCB0aGUgYnVmZmVyIHJlcXVpcmVkIGZvciB2YWxpZGF0aW9uCisgICAgb3JpZ19idWZmZXJfID0gc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KHRvdGFsX2Jhc2Vfc2l6ZV8pOworCisgICAgLy8gUmVhZCB0aGUgZW50aXJlIGJhc2UgZGV2aWNlCisgICAgQVNTRVJUX0VRKGFuZHJvaWQ6OmJhc2U6OlJlYWRGdWxseUF0T2Zmc2V0KGJhc2VfZmRfLCBvcmlnX2J1ZmZlcl8uZ2V0KCksIHRvdGFsX2Jhc2Vfc2l6ZV8sIDApLAorICAgICAgICAgICAgICB0cnVlKTsKKworICAgIC8vIFJFUExBQ0Ugb3BzIHdoaWNoIGFyZSBjb21wcmVzc2VkCisgICAgc3RkOjptZW1jcHkob3JpZ19idWZmZXJfLmdldCgpLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOworICAgIHNpemVfdCBvZmZzZXQgPSBkYXRhLnNpemUoKTsKKworICAgIC8vIFpFUk8gb3BzCisgICAgc3RkOjpzdHJpbmcgemVyb19idWZmZXIodG90YWxfemVyb19ibG9ja3MgKiBCTE9DS19TWiwgMCk7CisgICAgc3RkOjptZW1jcHkoKGNoYXIqKW9yaWdfYnVmZmVyXy5nZXQoKSArIG9mZnNldCwgKHZvaWQqKXplcm9fYnVmZmVyLmNfc3RyKCksIHplcm9fYnVmZmVyLnNpemUoKSk7CisgICAgb2Zmc2V0ICs9IHplcm9fYnVmZmVyLnNpemUoKTsKKworICAgIC8vIFJFUExBQ0Ugb3BzIC0gUmFuZG9tIGJ1ZmZlcnMgd2hpY2ggYXJlbid0IGNvbXByZXNzZWQKKyAgICBzdGQ6Om1lbWNweSgoY2hhciopb3JpZ19idWZmZXJfLmdldCgpICsgb2Zmc2V0LCByYW5kb21fYnVmZmVyLmNfc3RyKCksIHJhbmRvbV9idWZmZXIuc2l6ZSgpKTsKK30KKworVEVTVF9QKEhhbmRsZXJUZXN0VjMsIFJlYWQpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBzbmFwdXNlcmRfYnVmZmVyID0gc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KHNpemVfKTsKKworICAgIHNpemVfdCByZWFkX3NpemUgPSBTRUNUT1JfU0laRTsKKyAgICBvZmZfdCBvZmZzZXQgPSAwOworICAgIC8vIFJlYWQgdGhlIGZpcnN0IHNlY3RvcgorICAgIEFTU0VSVF9UUlVFKFJlYWRTZWN0b3JzKDEsIHJlYWRfc2l6ZSwgc25hcHVzZXJkX2J1ZmZlci5nZXQoKSkpOworICAgIC8vIFZhbGlkYXRlIHRoZSBkYXRhCisgICAgQVNTRVJUX0VRKHN0ZDo6bWVtY21wKHNuYXB1c2VyZF9idWZmZXIuZ2V0KCksIG9yaWdfYnVmZmVyXy5nZXQoKSwgcmVhZF9zaXplKSwgMCk7CisKKyAgICAvLyBSZWFkIHRoZSBzZWNvbmQgYmxvY2sgYXQgb2Zmc2V0IDc2ODAgKFNlY3RvciAxNSkuIFRoaXMgd2lsbCBtYXAgdG8gdGhlCisgICAgLy8gZmlyc3QgQ09XIG9wZXJhdGlvbiBmb3IgdmFyaWFibGUgYmxvY2sgc2l6ZQorICAgIG9mZnNldCArPSAoKChCTE9DS19TWiAqIDIpIC0gU0VDVE9SX1NJWkUpKTsKKyAgICByZWFkX3NpemUgPSBCTE9DS19TWjsgIC8vIFNwYW4gYWNyb3NzIHR3byBSRVBMQUNFIG9wcworICAgIEFTU0VSVF9UUlVFKFJlYWRTZWN0b3JzKG9mZnNldCAvIFNFQ1RPUl9TSVpFLCByZWFkX3NpemUsIHNuYXB1c2VyZF9idWZmZXIuZ2V0KCkpKTsKKyAgICAvLyBWYWxpZGF0ZSB0aGUgZGF0YQorICAgIEFTU0VSVF9FUShzdGQ6Om1lbWNtcChzbmFwdXNlcmRfYnVmZmVyLmdldCgpLCAoY2hhciopb3JpZ19idWZmZXJfLmdldCgpICsgb2Zmc2V0LCByZWFkX3NpemUpLAorICAgICAgICAgICAgICAwKTsKKworICAgIC8vIEZpbGwgc29tZSBvdGhlciBkYXRhIHNpbmNlIHdlIGFyZSBnb2luZyB0byByZWFkIHplcm8gYmxvY2tzCisgICAgc3RkOjptZW1zZXQoc25hcHVzZXJkX2J1ZmZlci5nZXQoKSwgJ1onLCBzaXplXyk7CisKKyAgICBzaXplX3QgbnVtX2Jsb2Nrc19wZXJfb3AgPSAoc2l6ZV8gLyBCTE9DS19TWikgLyA0OworICAgIG9mZnNldCA9IG51bV9ibG9ja3NfcGVyX29wICogQkxPQ0tfU1o7CisgICAgLy8gSXNzdWUgcmVhZCBzcGFubmluZyBiZXR3ZWVuIGEgUkVQTEFDRSBvcCBhbmQgWkVSTyBvcHMuIFRoZSBzdGFydGluZyBwb2ludAorICAgIC8vIGlzIHRoZSBsYXN0IFJFUExBQ0Ugb3AgYXQgc2VjdG9yIDUxMTgKKyAgICBvZmZzZXQgLT0gKFNFQ1RPUl9TSVpFICogMik7CisgICAgLy8gVGhpcyB3aWxsIG1ha2Ugc3VyZSBpdCBmYWxscyBiYWNrIHRvIGFsaWduZWQgcmVhZHMgYWZ0ZXIgcmVhZGluZyB0aGUKKyAgICAvLyBmaXJzdCB1bmFsaWduZWQgYmxvY2sKKyAgICByZWFkX3NpemUgPSBCTE9DS19TWiAqIDY7CisgICAgQVNTRVJUX1RSVUUoUmVhZFNlY3RvcnMob2Zmc2V0IC8gU0VDVE9SX1NJWkUsIHJlYWRfc2l6ZSwgc25hcHVzZXJkX2J1ZmZlci5nZXQoKSkpOworICAgIC8vIFZhbGlkYXRlIHRoZSBkYXRhCisgICAgQVNTRVJUX0VRKHN0ZDo6bWVtY21wKHNuYXB1c2VyZF9idWZmZXIuZ2V0KCksIChjaGFyKilvcmlnX2J1ZmZlcl8uZ2V0KCkgKyBvZmZzZXQsIHJlYWRfc2l6ZSksCisgICAgICAgICAgICAgIDApOworCisgICAgLy8gSXNzdWUgSS9PIHJlcXVlc3QgYXQgdGhlIGxhc3QgYmxvY2suIFRoZSBmaXJzdCBjaHVuayBvZiAoU0VDVE9SX1NJWkUgKiAyKQorICAgIC8vIHdpbGwgYmUgZnJvbSBSRVBMQUNFIG9wIHdoaWNoIGhhcyByYW5kb20gYnVmZmVycworICAgIG9mZnNldCA9IChzaXplXyAtIChTRUNUT1JfU0laRSAqIDIpKTsKKyAgICAvLyBSZXF1ZXN0IHdpbGwgc3BhbiBiZXlvbmQgdGhlIENPVyBtYXBwaW5nLCB0aGVyZWJ5IGZldGNoaW5nIGRhdGEgZnJvbSBiYXNlCisgICAgLy8gZGV2aWNlLgorICAgIHJlYWRfc2l6ZSA9IEJMT0NLX1NaICogODsKKyAgICBBU1NFUlRfVFJVRShSZWFkU2VjdG9ycyhvZmZzZXQgLyBTRUNUT1JfU0laRSwgcmVhZF9zaXplLCBzbmFwdXNlcmRfYnVmZmVyLmdldCgpKSk7CisgICAgLy8gVmFsaWRhdGUgdGhlIGRhdGEKKyAgICBBU1NFUlRfRVEoc3RkOjptZW1jbXAoc25hcHVzZXJkX2J1ZmZlci5nZXQoKSwgKGNoYXIqKW9yaWdfYnVmZmVyXy5nZXQoKSArIG9mZnNldCwgcmVhZF9zaXplKSwKKyAgICAgICAgICAgICAgMCk7CisKKyAgICAvLyBJc3N1ZSBJL08gcmVxdWVzdCB3aGljaCBhcmUgbm90IG1hcHBlZCB0byBhbnkgQ09XIG9wZXJhdGlvbnMKKyAgICBvZmZzZXQgPSAoc2l6ZV8gKyAoU0VDVE9SX1NJWkUgKiAzKSk7CisgICAgcmVhZF9zaXplID0gQkxPQ0tfU1ogKiAzOworICAgIEFTU0VSVF9UUlVFKFJlYWRTZWN0b3JzKG9mZnNldCAvIFNFQ1RPUl9TSVpFLCByZWFkX3NpemUsIHNuYXB1c2VyZF9idWZmZXIuZ2V0KCkpKTsKKyAgICAvLyBWYWxpZGF0ZSB0aGUgZGF0YQorICAgIEFTU0VSVF9FUShzdGQ6Om1lbWNtcChzbmFwdXNlcmRfYnVmZmVyLmdldCgpLCAoY2hhciopb3JpZ19idWZmZXJfLmdldCgpICsgb2Zmc2V0LCByZWFkX3NpemUpLAorICAgICAgICAgICAgICAwKTsKK30KKworc3RkOjp2ZWN0b3I8Ym9vbD4gR2V0SW9VcmluZ0NvbmZpZ3MoKSB7CisjaWYgX19BTkRST0lEX18KKyAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OkdldEJvb2xQcm9wZXJ0eSgicm8udmlydHVhbF9hYi5pb191cmluZy5lbmFibGVkIiwgZmFsc2UpKSB7CisgICAgICAgIHJldHVybiB7ZmFsc2V9OworICAgIH0KKyNlbmRpZgorICAgIGlmICghS2VybmVsU3VwcG9ydHNJb1VyaW5nKCkpIHsKKyAgICAgICAgcmV0dXJuIHtmYWxzZX07CisgICAgfQorICAgIHJldHVybiB7ZmFsc2UsIHRydWV9OworfQorCitzdGQ6OnZlY3RvcjxUZXN0UGFyYW0+IEdldFRlc3RDb25maWdzKCkgeworICAgIHN0ZDo6dmVjdG9yPFRlc3RQYXJhbT4gdGVzdFBhcmFtczsKKyAgICBzdGQ6OnZlY3Rvcjxib29sPiB1cmluZ19jb25maWdzID0gR2V0SW9VcmluZ0NvbmZpZ3MoKTsKKworICAgIGZvciAoYm9vbCBjb25maWcgOiB1cmluZ19jb25maWdzKSB7CisgICAgICAgIFRlc3RQYXJhbSBwYXJhbTsKKyAgICAgICAgcGFyYW0uaW9fdXJpbmcgPSBjb25maWc7CisgICAgICAgIHBhcmFtLm9fZGlyZWN0ID0gZmFsc2U7CisgICAgICAgIHRlc3RQYXJhbXMucHVzaF9iYWNrKHN0ZDo6bW92ZShwYXJhbSkpOworICAgIH0KKworICAgIGZvciAoYm9vbCBjb25maWcgOiB1cmluZ19jb25maWdzKSB7CisgICAgICAgIFRlc3RQYXJhbSBwYXJhbTsKKyAgICAgICAgcGFyYW0uaW9fdXJpbmcgPSBjb25maWc7CisgICAgICAgIHBhcmFtLm9fZGlyZWN0ID0gdHJ1ZTsKKyAgICAgICAgdGVzdFBhcmFtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHBhcmFtKSk7CisgICAgfQorICAgIHJldHVybiB0ZXN0UGFyYW1zOworfQorCitzdGQ6OnZlY3RvcjxUZXN0UGFyYW0+IEdldFZhcmlhYmxlQmxvY2tUZXN0Q29uZmlncygpIHsKKyAgICBzdGQ6OnZlY3RvcjxUZXN0UGFyYW0+IHRlc3RQYXJhbXM7CisKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IGJsb2NrX3NpemVzID0gezQwOTYsIDgxOTIsIDE2Mzg0LCAzMjc2OCwgNjU1MzYsIDEzMTA3Mn07CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbXByZXNzaW9uX2FsZ28gPSB7Im5vbmUiLCAibHo0IiwgInpzdGQiLCAiZ3oifTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IHRocmVhZHMgPSB7MSwgMn07CisgICAgc3RkOjp2ZWN0b3I8Ym9vbD4gdXJpbmdfY29uZmlncyA9IEdldElvVXJpbmdDb25maWdzKCk7CisKKyAgICAvLyBUaGlzIHNob3VsZCB0ZXN0IDk2IGNvbWJpbmF0aW9uIGFuZCB2YWxpZGF0ZXMgdGhlIEkvTyBwYXRoCisgICAgZm9yIChhdXRvIGJsb2NrIDogYmxvY2tfc2l6ZXMpIHsKKyAgICAgICAgZm9yIChhdXRvIGNvbXByZXNzaW9uIDogY29tcHJlc3Npb25fYWxnbykgeworICAgICAgICAgICAgZm9yIChhdXRvIHRocmVhZCA6IHRocmVhZHMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8gaW9fdXJpbmcgOiB1cmluZ19jb25maWdzKSB7CisgICAgICAgICAgICAgICAgICAgIFRlc3RQYXJhbSBwYXJhbTsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0uYmxvY2tfc2l6ZSA9IGJsb2NrOworICAgICAgICAgICAgICAgICAgICBwYXJhbS5jb21wcmVzc2lvbiA9IGNvbXByZXNzaW9uOworICAgICAgICAgICAgICAgICAgICBwYXJhbS5udW1fdGhyZWFkcyA9IHRocmVhZDsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0uaW9fdXJpbmcgPSBpb191cmluZzsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0ub19kaXJlY3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0uY293X29wX21lcmdlX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICB0ZXN0UGFyYW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUocGFyYW0pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdGVzdFBhcmFtczsKK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKElvLCBTbmFwdXNlcmRWYXJpYWJsZUJsb2NrU2l6ZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXNJbihHZXRWYXJpYWJsZUJsb2NrVGVzdENvbmZpZ3MoKSkpOworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKElvLCBIYW5kbGVyVGVzdFYzLCA6OnRlc3Rpbmc6OlZhbHVlc0luKEdldFZhcmlhYmxlQmxvY2tUZXN0Q29uZmlncygpKSk7CitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoSW8sIFNuYXB1c2VyZFRlc3QsIDo6dGVzdGluZzo6VmFsdWVzSW4oR2V0VGVzdENvbmZpZ3MoKSkpOworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKElvLCBIYW5kbGVyVGVzdCwgOjp0ZXN0aW5nOjpWYWx1ZXNJbihHZXRUZXN0Q29uZmlncygpKSk7CisKIH0gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CiAgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CiAKKyNpZmRlZiBfX0FORFJPSURfXworICAgIGlmICghYW5kcm9pZDo6c25hcHNob3Q6OkNhblVzZVVzZXJzcGFjZVNuYXBzaG90cygpIHx8CisgICAgICAgIGFuZHJvaWQ6OnNuYXBzaG90OjpJc1ZlbmRvckZyb21BbmRyb2lkMTIoKSkgeworICAgICAgICBzdGQ6OmNlcnIgPDwgInNuYXB1c2VyZF90ZXN0IG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2VcbiI7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyNlbmRpZgorCiAgICAgZ2ZsYWdzOjpQYXJzZUNvbW1hbmRMaW5lRmxhZ3MoJmFyZ2MsICZhcmd2LCBmYWxzZSk7CiAKLSAgICBhbmRyb2lkOjpiYXNlOjpTZXRQcm9wZXJ0eSgiY3RsLnN0b3AiLCAic25hcHVzZXJkIik7Ci0KLSAgICBpZiAoRkxBR1NfZm9yY2VfY29uZmlnID09ICJpb3VyaW5nX2Rpc2FibGVkIikgewotICAgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlNldFByb3BlcnR5KCJzbmFwdXNlcmQudGVzdC5pb191cmluZy5mb3JjZV9kaXNhYmxlIiwgIjEiKSkgewotICAgICAgICAgICAgcmV0dXJuIHRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKQotICAgICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gZGlzYWJsZSBwcm9wZXJ0eTogc25hcHVzZXJkLnRlc3QuaW9fdXJpbmcuZGlzYWJsZWQiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50IHJldCA9IFJVTl9BTExfVEVTVFMoKTsKLQotICAgIGlmIChGTEFHU19mb3JjZV9jb25maWcgPT0gImlvdXJpbmdfZGlzYWJsZWQiKSB7Ci0gICAgICAgIGFuZHJvaWQ6OmJhc2U6OlNldFByb3BlcnR5KCJzbmFwdXNlcmQudGVzdC5pb191cmluZy5mb3JjZV9kaXNhYmxlIiwgIjAiKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0OworICAgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7CiB9CmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX3RyYW5zaXRpb25zLmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfdHJhbnNpdGlvbnMuY3BwCmluZGV4IDI4YzlmNjguLjcxNGM2NDEgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfdHJhbnNpdGlvbnMuY3BwCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfdHJhbnNpdGlvbnMuY3BwCkBAIC0xODksMzMgKzE4OSwzMiBAQAogICAgIGN2Lm5vdGlmeV9hbGwoKTsKIH0KIAorc3RhdGljIGlubGluZSBib29sIElzTWVyZ2VCZWdpbkVycm9yKE1FUkdFX0lPX1RSQU5TSVRJT04gaW9fc3RhdGUpIHsKKyAgICByZXR1cm4gaW9fc3RhdGUgPT0gTUVSR0VfSU9fVFJBTlNJVElPTjo6UkVBRF9BSEVBRF9GQUlMVVJFIHx8CisgICAgICAgICAgIGlvX3N0YXRlID09IE1FUkdFX0lPX1RSQU5TSVRJT046OklPX1RFUk1JTkFURUQ7Cit9CisKIC8vIEludm9rZWQgYnkgTWVyZ2UgdGhyZWFkIC0gV2FpdHMgb24gUkEgdGhyZWFkIHRvIHJlc3VtZSBtZXJnaW5nLiBXaWxsCiAvLyBiZSB3YWtlbiB1cCBSQSB0aHJlYWQuCiBib29sIFNuYXBzaG90SGFuZGxlcjo6V2FpdEZvck1lcmdlQmVnaW4oKSB7Ci0gICAgewotICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobG9ja18pOwotICAgICAgICB3aGlsZSAoIU1lcmdlSW5pdGlhdGVkKCkpIHsKLSAgICAgICAgICAgIGN2LndhaXQobG9jayk7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKGxvY2tfKTsKIAotICAgICAgICAgICAgaWYgKGlvX3N0YXRlXyA9PSBNRVJHRV9JT19UUkFOU0lUSU9OOjpSRUFEX0FIRUFEX0ZBSUxVUkUgfHwKLSAgICAgICAgICAgICAgICBpb19zdGF0ZV8gPT0gTUVSR0VfSU9fVFJBTlNJVElPTjo6SU9fVEVSTUlOQVRFRCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgIGN2LndhaXQobG9jaywgW3RoaXNdKCkgLT4gYm9vbCB7IHJldHVybiBNZXJnZUluaXRpYXRlZCgpIHx8IElzTWVyZ2VCZWdpbkVycm9yKGlvX3N0YXRlXyk7IH0pOwogCi0gICAgICAgIHdoaWxlICghKGlvX3N0YXRlXyA9PSBNRVJHRV9JT19UUkFOU0lUSU9OOjpNRVJHRV9CRUdJTiB8fAotICAgICAgICAgICAgICAgICBpb19zdGF0ZV8gPT0gTUVSR0VfSU9fVFJBTlNJVElPTjo6UkVBRF9BSEVBRF9GQUlMVVJFIHx8Ci0gICAgICAgICAgICAgICAgIGlvX3N0YXRlXyA9PSBNRVJHRV9JT19UUkFOU0lUSU9OOjpJT19URVJNSU5BVEVEKSkgewotICAgICAgICAgICAgY3Yud2FpdChsb2NrKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpb19zdGF0ZV8gPT0gTUVSR0VfSU9fVFJBTlNJVElPTjo6UkVBRF9BSEVBRF9GQUlMVVJFIHx8Ci0gICAgICAgICAgICBpb19zdGF0ZV8gPT0gTUVSR0VfSU9fVFJBTlNJVElPTjo6SU9fVEVSTUlOQVRFRCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgaWYgKElzTWVyZ2VCZWdpbkVycm9yKGlvX3N0YXRlXykpIHsKKyAgICAgICAgU05BUF9MT0coVkVSQk9TRSkgPDwgIldhaXRGb3JNZXJnZUJlZ2luIGZhaWxlZCB3aXRoIHN0YXRlOiAiIDw8IGlvX3N0YXRlXzsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KKworICAgIGN2LndhaXQobG9jaywgW3RoaXNdKCkgLT4gYm9vbCB7CisgICAgICAgIHJldHVybiBpb19zdGF0ZV8gPT0gTUVSR0VfSU9fVFJBTlNJVElPTjo6TUVSR0VfQkVHSU4gfHwgSXNNZXJnZUJlZ2luRXJyb3IoaW9fc3RhdGVfKTsKKyAgICB9KTsKKworICAgIGlmIChJc01lcmdlQmVnaW5FcnJvcihpb19zdGF0ZV8pKSB7CisgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiV2FpdEZvck1lcmdlQmVnaW4gZmFpbGVkIHdpdGggc3RhdGU6ICIgPDwgaW9fc3RhdGVfOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOwogfQogCiAvLyBJbnZva2VkIGJ5IFJBIHRocmVhZCAtIEZsdXNoZXMgdGhlIFJBIGJsb2NrIHRvIHNjcmF0Y2ggc3BhY2UgaWYgbmVjZXNzYXJ5CkBAIC0yNzcsNiArMjc2LDkgQEAKICAgICAgICAgaWYgKGlvX3N0YXRlXyA9PSBNRVJHRV9JT19UUkFOU0lUSU9OOjpNRVJHRV9GQUlMRUQgfHwKICAgICAgICAgICAgIGlvX3N0YXRlXyA9PSBNRVJHRV9JT19UUkFOU0lUSU9OOjpNRVJHRV9DT01QTEVURSB8fAogICAgICAgICAgICAgaW9fc3RhdGVfID09IE1FUkdFX0lPX1RSQU5TSVRJT046OklPX1RFUk1JTkFURUQpIHsKKyAgICAgICAgICAgIGlmIChpb19zdGF0ZV8gPT0gTUVSR0VfSU9fVFJBTlNJVElPTjo6TUVSR0VfRkFJTEVEKSB7CisgICAgICAgICAgICAgICAgU05BUF9MT0coRVJST1IpIDw8ICJXYWl0IGZvciBtZXJnZSByZWFkeSBmYWlsZWQ6ICIgPDwgaW9fc3RhdGVfOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMzY2LDEwICszNjgsMzYgQEAKICAgICB9CiB9CiAKK3ZvaWQgU25hcHNob3RIYW5kbGVyOjpSYVRocmVhZFN0YXJ0ZWQoKSB7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKGxvY2tfKTsKKyAgICByYV90aHJlYWRfc3RhcnRlZF8gPSB0cnVlOworfQorCit2b2lkIFNuYXBzaG90SGFuZGxlcjo6V2FpdEZvclJhVGhyZWFkVG9TdGFydCgpIHsKKyAgICBhdXRvIG5vdyA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOworICAgIGF1dG8gZGVhZGxpbmUgPSBub3cgKyAzczsKKyAgICB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhsb2NrXyk7CisgICAgICAgIHdoaWxlICghcmFfdGhyZWFkX3N0YXJ0ZWRfKSB7CisgICAgICAgICAgICBhdXRvIHN0YXR1cyA9IGN2LndhaXRfdW50aWwobG9jaywgZGVhZGxpbmUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBzdGQ6OmN2X3N0YXR1czo6dGltZW91dCkgeworICAgICAgICAgICAgICAgIFNOQVBfTE9HKEVSUk9SKSA8PCAiUmVhZC1haGVhZCB0aHJlYWQgZGlkIG5vdCBzdGFydCI7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFNuYXBzaG90SGFuZGxlcjo6TWFya01lcmdlQ29tcGxldGUoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobG9ja18pOworICAgIG1lcmdlX2NvbXBsZXRlXyA9IHRydWU7Cit9CisKIHN0ZDo6c3RyaW5nIFNuYXBzaG90SGFuZGxlcjo6R2V0TWVyZ2VTdGF0dXMoKSB7CiAgICAgYm9vbCBtZXJnZV9ub3RfaW5pdGlhdGVkID0gZmFsc2U7CiAgICAgYm9vbCBtZXJnZV9tb25pdG9yZWQgPSBmYWxzZTsKICAgICBib29sIG1lcmdlX2ZhaWxlZCA9IGZhbHNlOworICAgIGJvb2wgbWVyZ2VfY29tcGxldGUgPSBmYWxzZTsKIAogICAgIHsKICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobG9ja18pOwpAQCAtMzg1LDEwICs0MTMsOSBAQAogICAgICAgICBpZiAoaW9fc3RhdGVfID09IE1FUkdFX0lPX1RSQU5TSVRJT046Ok1FUkdFX0ZBSUxFRCkgewogICAgICAgICAgICAgbWVyZ2VfZmFpbGVkID0gdHJ1ZTsKICAgICAgICAgfQotICAgIH0KIAotICAgIHN0cnVjdCBDb3dIZWFkZXIqIGNoID0gcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3QgQ293SGVhZGVyKj4obWFwcGVkX2FkZHJfKTsKLSAgICBib29sIG1lcmdlX2NvbXBsZXRlID0gKGNoLT5udW1fbWVyZ2Vfb3BzID09IHJlYWRlcl8tPmdldF9udW1fdG90YWxfZGF0YV9vcHMoKSk7CisgICAgICAgIG1lcmdlX2NvbXBsZXRlID0gbWVyZ2VfY29tcGxldGVfOworICAgIH0KIAogICAgIGlmIChtZXJnZV9ub3RfaW5pdGlhdGVkKSB7CiAgICAgICAgIC8vIE1lcmdlIHdhcyBub3QgaW5pdGlhdGVkIHlldDsgaG93ZXZlciwgd2UgaGF2ZSBtZXJnZSBjb21wbGV0aW9uCkBAIC00MjQsNyArNDUxLDYgQEAKICAgICAgICAgcmV0dXJuICJzbmFwc2hvdC1tZXJnZS1mYWlsZWQiOwogICAgIH0KIAotICAgIC8vIE1lcmdlIGNvbXBsZXRlCiAgICAgaWYgKG1lcmdlX2NvbXBsZXRlKSB7CiAgICAgICAgIHJldHVybiAic25hcHNob3QtbWVyZ2UtY29tcGxldGUiOwogICAgIH0KQEAgLTYxOCw3ICs2NDQsNiBAQAogICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50NjRfdCwgdm9pZCo+OjppdGVyYXRvciBpdCA9IHJlYWRfYWhlYWRfYnVmZmVyX21hcF8uZmluZChibG9jayk7CiAKICAgICBpZiAoaXQgPT0gcmVhZF9haGVhZF9idWZmZXJfbWFwXy5lbmQoKSkgewotICAgICAgICBTTkFQX0xPRyhFUlJPUikgPDwgIkJsb2NrOiAiIDw8IGJsb2NrIDw8ICIgbm90IGZvdW5kIGluIFJBIGJ1ZmZlciI7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTY0Miw2ICs2NjcsMTMgQEAKICAgICAgICAgTUVSR0VfR1JPVVBfU1RBVEUgc3RhdGUgPSBibGtfc3RhdGUtPm1lcmdlX3N0YXRlXzsKICAgICAgICAgc3dpdGNoIChzdGF0ZSkgewogICAgICAgICAgICAgY2FzZSBNRVJHRV9HUk9VUF9TVEFURTo6R1JPVVBfTUVSR0VfUEVORElORzogeworICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBtZXJnZS1yZXN1bWUgcGF0aCwgY2hlY2sgaWYgdGhlIGRhdGEgaXMKKyAgICAgICAgICAgICAgICAvLyBhdmFpbGFibGUgZnJvbSBzY3JhdGNoIHNwYWNlLiBEYXRhIGZyb20gc2NyYXRjaCBzcGFjZSB0YWtlcworICAgICAgICAgICAgICAgIC8vIGhpZ2hlciBwcmVjZWRlbmNlIHRoYW4gZnJvbSBzb3VyY2UgZGV2aWNlIGZvciBvdmVybGFwcGluZworICAgICAgICAgICAgICAgIC8vIGJsb2Nrcy4KKyAgICAgICAgICAgICAgICBpZiAocmVzdW1lX21lcmdlXyAmJiBHZXRSQUJ1ZmZlcigmbG9jaywgbmV3X2Jsb2NrLCBidWZmZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoTUVSR0VfR1JPVVBfU1RBVEU6OkdST1VQX01FUkdFX0lOX1BST0dSRVNTKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYmxrX3N0YXRlLT5udW1faW9zX2luX3Byb2dyZXNzICs9IDE7ICAvLyByZWYgY291bnQKICAgICAgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CiAgICAgICAgICAgICB9CkBAIC02NjgsNSArNzAwLDI2IEBACiAgICAgfQogfQogCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgTUVSR0VfSU9fVFJBTlNJVElPTiB2YWx1ZSkgeworICAgIHN3aXRjaCAodmFsdWUpIHsKKyAgICAgICAgY2FzZSBNRVJHRV9JT19UUkFOU0lUSU9OOjpJTlZBTElEOgorICAgICAgICAgICAgcmV0dXJuIG9zIDw8ICJJTlZBTElEIjsKKyAgICAgICAgY2FzZSBNRVJHRV9JT19UUkFOU0lUSU9OOjpNRVJHRV9SRUFEWToKKyAgICAgICAgICAgIHJldHVybiBvcyA8PCAiTUVSR0VfUkVBRFkiOworICAgICAgICBjYXNlIE1FUkdFX0lPX1RSQU5TSVRJT046Ok1FUkdFX0JFR0lOOgorICAgICAgICAgICAgcmV0dXJuIG9zIDw8ICJNRVJHRV9CRUdJTiI7CisgICAgICAgIGNhc2UgTUVSR0VfSU9fVFJBTlNJVElPTjo6TUVSR0VfRkFJTEVEOgorICAgICAgICAgICAgcmV0dXJuIG9zIDw8ICJNRVJHRV9GQUlMRUQiOworICAgICAgICBjYXNlIE1FUkdFX0lPX1RSQU5TSVRJT046Ok1FUkdFX0NPTVBMRVRFOgorICAgICAgICAgICAgcmV0dXJuIG9zIDw8ICJNRVJHRV9DT01QTEVURSI7CisgICAgICAgIGNhc2UgTUVSR0VfSU9fVFJBTlNJVElPTjo6SU9fVEVSTUlOQVRFRDoKKyAgICAgICAgICAgIHJldHVybiBvcyA8PCAiSU9fVEVSTUlOQVRFRCI7CisgICAgICAgIGNhc2UgTUVSR0VfSU9fVFJBTlNJVElPTjo6UkVBRF9BSEVBRF9GQUlMVVJFOgorICAgICAgICAgICAgcmV0dXJuIG9zIDw8ICJSRUFEX0FIRUFEX0ZBSUxVUkUiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIG9zIDw8ICJ1bmtub3duIjsKKyAgICB9Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfdmVyaWZ5LmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfdmVyaWZ5LmNwcAppbmRleCAxOGMxZGZjLi45NTdjNmE4IDEwMDY0NAotLS0gYS9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX3ZlcmlmeS5jcHAKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL3NuYXB1c2VyZF92ZXJpZnkuY3BwCkBAIC0xNCwxMiArMTQsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlICJzbmFwdXNlcmRfY29yZS5oIgorI2luY2x1ZGUgInNuYXB1c2VyZF92ZXJpZnkuaCIKIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9jaHJvbm9fdXRpbHMuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc2NvcGVndWFyZC5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CiAKKyNpbmNsdWRlICJhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oIgorI2luY2x1ZGUgInNuYXB1c2VyZF9jb3JlLmgiCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBzbmFwc2hvdCB7CiAKQEAgLTEwMiw3ICsxMDUsOSBAQAogICAgIH0KIAogICAgIGxvZmZfdCBmaWxlX29mZnNldCA9IG9mZnNldDsKLSAgICBjb25zdCB1aW50NjRfdCByZWFkX3N6ID0ga0Jsb2NrU2l6ZVZlcmlmeTsKKyAgICBhdXRvIHZlcmlmeV9ibG9ja19zaXplID0gYW5kcm9pZDo6YmFzZTo6R2V0VWludFByb3BlcnR5PHVpbnQ+KCJyby52aXJ0dWFsX2FiLnZlcmlmeV9ibG9ja19zaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtCbG9ja1NpemVWZXJpZnkpOworICAgIGNvbnN0IHVpbnQ2NF90IHJlYWRfc3ogPSB2ZXJpZnlfYmxvY2tfc2l6ZTsKIAogICAgIHZvaWQqIGFkZHI7CiAgICAgc3NpemVfdCBwYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpOwpAQCAtMTI4LDcgKzEzMyw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBieXRlc19yZWFkICs9IHRvX3JlYWQ7Ci0gICAgICAgIGZpbGVfb2Zmc2V0ICs9IChza2lwX2Jsb2NrcyAqIGtCbG9ja1NpemVWZXJpZnkpOworICAgICAgICBmaWxlX29mZnNldCArPSAoc2tpcF9ibG9ja3MgKiB2ZXJpZnlfYmxvY2tfc2l6ZSk7CiAgICAgICAgIGlmIChmaWxlX29mZnNldCA+PSBkZXZfc3opIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xODIsNyArMTg3LDkgQEAKICAgICAgKiBsYXRlbmN5LgogICAgICAqLwogICAgIGludCBudW1fdGhyZWFkcyA9IGtNaW5UaHJlYWRzVG9WZXJpZnk7Ci0gICAgaWYgKGRldl9zeiA+IGtUaHJlc2hvbGRTaXplKSB7CisgICAgYXV0byB2ZXJpZnlfdGhyZXNob2xkX3NpemUgPSBhbmRyb2lkOjpiYXNlOjpHZXRVaW50UHJvcGVydHk8dWludD4oCisgICAgICAgICAgICAicm8udmlydHVhbF9hYi52ZXJpZnlfdGhyZXNob2xkX3NpemUiLCBrVGhyZXNob2xkU2l6ZSk7CisgICAgaWYgKGRldl9zeiA+IHZlcmlmeV90aHJlc2hvbGRfc2l6ZSkgewogICAgICAgICBudW1fdGhyZWFkcyA9IGtNYXhUaHJlYWRzVG9WZXJpZnk7CiAgICAgfQogCkBAIC0xOTAsMTEgKzE5NywxMyBAQAogICAgIG9mZl90IHN0YXJ0X29mZnNldCA9IDA7CiAgICAgY29uc3QgaW50IHNraXBfYmxvY2tzID0gbnVtX3RocmVhZHM7CiAKKyAgICBhdXRvIHZlcmlmeV9ibG9ja19zaXplID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OkdldFVpbnRQcm9wZXJ0eSgicm8udmlydHVhbF9hYi52ZXJpZnlfYmxvY2tfc2l6ZSIsIGtCbG9ja1NpemVWZXJpZnkpOwogICAgIHdoaWxlIChudW1fdGhyZWFkcykgewogICAgICAgICB0aHJlYWRzLmVtcGxhY2VfYmFjayhzdGQ6OmFzeW5jKHN0ZDo6bGF1bmNoOjphc3luYywgJlVwZGF0ZVZlcmlmeTo6VmVyaWZ5QmxvY2tzLCB0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbl9uYW1lLCBkbV9ibG9ja19kZXZpY2UsIHN0YXJ0X29mZnNldCwgc2tpcF9ibG9ja3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2X3N6KSk7Ci0gICAgICAgIHN0YXJ0X29mZnNldCArPSBrQmxvY2tTaXplVmVyaWZ5OworICAgICAgICBzdGFydF9vZmZzZXQgKz0gdmVyaWZ5X2Jsb2NrX3NpemU7CiAgICAgICAgIG51bV90aHJlYWRzIC09IDE7CiAgICAgICAgIGlmIChzdGFydF9vZmZzZXQgPj0gZGV2X3N6KSB7CiAgICAgICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXNlci1zcGFjZS1tZXJnZS9zbmFwdXNlcmRfdmVyaWZ5LmggYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX3ZlcmlmeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOTkwODUKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvc25hcHVzZXJkX3ZlcmlmeS5oCkBAIC0wLDAgKzEsODEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxzbmFwdXNlcmQvc25hcHVzZXJkX2tlcm5lbC5oPgorI2luY2x1ZGUgPHN0b3JhZ2VfbGl0ZXJhbHMvc3RvcmFnZV9saXRlcmFscy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugc25hcHNob3QgeworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6c3RvcmFnZV9saXRlcmFsczsKKworY2xhc3MgVXBkYXRlVmVyaWZ5IHsKKyAgcHVibGljOgorICAgIFVwZGF0ZVZlcmlmeShjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lKTsKKyAgICB2b2lkIFZlcmlmeVVwZGF0ZVBhcnRpdGlvbigpOworICAgIGJvb2wgQ2hlY2tQYXJ0aXRpb25WZXJpZmljYXRpb24oKTsKKworICBwcml2YXRlOgorICAgIGVudW0gY2xhc3MgVXBkYXRlVmVyaWZ5U3RhdGUgeworICAgICAgICBWRVJJRllfVU5LTk9XTiwKKyAgICAgICAgVkVSSUZZX0ZBSUxFRCwKKyAgICAgICAgVkVSSUZZX1NVQ0NFU1MsCisgICAgfTsKKworICAgIHN0ZDo6c3RyaW5nIG1pc2NfbmFtZV87CisgICAgVXBkYXRlVmVyaWZ5U3RhdGUgc3RhdGVfOworICAgIHN0ZDo6bXV0ZXggbV9sb2NrXzsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtX2N2XzsKKworICAgIC8qCisgICAgICogU2Nhbm5pbmcgb2YgcGFydGl0aW9ucyBpcyBhbiBleHBlbnNpdmUgb3BlcmF0aW9uIGJvdGggaW4gdGVybXMgb2YgbWVtb3J5CisgICAgICogYW5kIENQVSB1c2FnZS4gVGhlIGdvYWwgaGVyZSBpcyB0byBzY2FuIHRoZSBwYXJ0aXRpb25zIGZhc3QgZW5vdWdoIHdpdGhvdXQKKyAgICAgKiBzaWduaWZpY2FudCBpbmNyZWFzZSBpbiB0aGUgYm9vdCB0aW1lLgorICAgICAqCisgICAgICogUGFydGl0aW9ucyBzdWNoIGFzIHN5c3RlbSwgcHJvZHVjdCB3aGljaCBtYXkgYmUgaHVnZSBhbmQgbWF5IG5lZWQgbXVsdGlwbGUKKyAgICAgKiB0aHJlYWRzIHRvIHNwZWVkIHVwIHRoZSB2ZXJpZmljYXRpb24gcHJvY2Vzcy4gVXNpbmcgbXVsdGlwbGUgdGhyZWFkcyBmb3IKKyAgICAgKiBhbGwgcGFydGl0aW9ucyBtYXkgaW5jcmVhc2UgQ1BVIHVzYWdlIHNpZ25pZmljYW50bHkuIEhlbmNlLCBsaW1pdCB0aGF0IHRvCisgICAgICogMSB0aHJlYWQgcGVyIHBhcnRpdGlvbi4KKyAgICAgKgorICAgICAqIFRoZXNlIG51bWJlcnMgd2VyZSBkZXJpdmVkIGJ5IG1vbml0b3JpbmcgdGhlIG1lbW9yeSBhbmQgQ1BVIHByZXNzdXJlCisgICAgICogKC9wcm9jL3ByZXNzdXJlL3tjcHUsbWVtb3J5fTsgYW5kIG1vbml0b3JpbmcgdGhlIEluYWN0aXZlKGZpbGUpIGFuZAorICAgICAqIEFjdGl2ZShmaWxlKSBwYWdlcyBmcm9tIC9wcm9jL21lbWluZm8uCisgICAgICoKKyAgICAgKiBBZGRpdGlvbmFsbHksIGZvciBsb3cgbWVtb3J5IGRldmljZXMsIGl0IGlzIGFkdmlzaWJsZSB0byB1c2UgT19ESVJFQ1QKKyAgICAgKiBmdWNudGlvbmFsaXR5IGZvciBzb3VyY2UgYmxvY2sgZGV2aWNlLgorICAgICAqLworICAgIGludCBrTWluVGhyZWFkc1RvVmVyaWZ5ID0gMTsKKyAgICBpbnQga01heFRocmVhZHNUb1ZlcmlmeSA9IDM7CisgICAgdWludDY0X3Qga1RocmVzaG9sZFNpemUgPSA3NTBfTWlCOworICAgIHVpbnQ2NF90IGtCbG9ja1NpemVWZXJpZnkgPSAyX01pQjsKKworICAgIGJvb2wgSXNCbG9ja0FsaWduZWQodWludDY0X3QgcmVhZF9zaXplKSB7IHJldHVybiAoKHJlYWRfc2l6ZSAmIChCTE9DS19TWiAtIDEpKSA9PSAwKTsgfQorICAgIHZvaWQgVXBkYXRlUGFydGl0aW9uVmVyaWZpY2F0aW9uU3RhdGUoVXBkYXRlVmVyaWZ5U3RhdGUgc3RhdGUpOworICAgIGJvb2wgVmVyaWZ5UGFydGl0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJ0aXRpb25fbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGRtX2Jsb2NrX2RldmljZSk7CisgICAgYm9vbCBWZXJpZnlCbG9ja3MoY29uc3Qgc3RkOjpzdHJpbmcmIHBhcnRpdGlvbl9uYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgZG1fYmxvY2tfZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgIG9mZl90IG9mZnNldCwgaW50IHNraXBfYmxvY2tzLCB1aW50NjRfdCBkZXZfc3opOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL3dvcmtlci5jcHAgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvd29ya2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTIwOGZiCi0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL3dvcmtlci5jcHAKQEAgLTAsMCArMSw2OSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJ3b3JrZXIuaCIKKworI2luY2x1ZGUgInNuYXB1c2VyZF9jb3JlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBzbmFwc2hvdCB7CisKK1dvcmtlcjo6V29ya2VyKGNvbnN0IHN0ZDo6c3RyaW5nJiBjb3dfZGV2aWNlLCBjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJhc2VfcGF0aF9tZXJnZSwgc3RkOjpzaGFyZWRfcHRyPFNuYXBzaG90SGFuZGxlcj4gc25hcHVzZXJkKSB7CisgICAgY293X2RldmljZV8gPSBjb3dfZGV2aWNlOworICAgIG1pc2NfbmFtZV8gPSBtaXNjX25hbWU7CisgICAgYmFzZV9wYXRoX21lcmdlXyA9IGJhc2VfcGF0aF9tZXJnZTsKKyAgICBzbmFwdXNlcmRfID0gc25hcHVzZXJkOworfQorCitib29sIFdvcmtlcjo6SW5pdCgpIHsKKyAgICBpZiAoIUluaXRpYWxpemVGZHMoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFJbml0UmVhZGVyKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFdvcmtlcjo6SW5pdFJlYWRlcigpIHsKKyAgICByZWFkZXJfID0gc25hcHVzZXJkXy0+Q2xvbmVSZWFkZXJGb3JXb3JrZXIoKTsKKworICAgIGlmICghcmVhZGVyXy0+SW5pdEZvck1lcmdlKHN0ZDo6bW92ZShjb3dfZmRfKSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBXb3JrZXI6OkluaXRpYWxpemVGZHMoKSB7CisgICAgY293X2ZkXy5yZXNldChvcGVuKGNvd19kZXZpY2VfLmNfc3RyKCksIE9fUkRXUikpOworICAgIGlmIChjb3dfZmRfIDwgMCkgeworICAgICAgICBTTkFQX1BMT0coRVJST1IpIDw8ICJPcGVuIEZhaWxlZDogIiA8PCBjb3dfZGV2aWNlXzsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIEJhc2UgZGV2aWNlIHVzZWQgYnkgbWVyZ2UgdGhyZWFkCisgICAgYmFzZV9wYXRoX21lcmdlX2ZkXy5yZXNldChvcGVuKGJhc2VfcGF0aF9tZXJnZV8uY19zdHIoKSwgT19SRFdSKSk7CisgICAgaWYgKGJhc2VfcGF0aF9tZXJnZV9mZF8gPCAwKSB7CisgICAgICAgIFNOQVBfUExPRyhFUlJPUikgPDwgIk9wZW4gRmFpbGVkOiAiIDw8IGJhc2VfcGF0aF9tZXJnZV87CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL3dvcmtlci5oIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91c2VyLXNwYWNlLW1lcmdlL3dvcmtlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4OWQxYjQKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGlic25hcHNob3Qvc25hcHVzZXJkL3VzZXItc3BhY2UtbWVyZ2Uvd29ya2VyLmgKQEAgLTAsMCArMSw2MiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgorI2luY2x1ZGUgPGxpYnNuYXBzaG90L2Nvd19yZWFkZXIuaD4KKyNpbmNsdWRlIDxzbmFwdXNlcmQvc25hcHVzZXJkX2J1ZmZlci5oPgorI2luY2x1ZGUgPHNuYXB1c2VyZC9zbmFwdXNlcmRfa2VybmVsLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBzbmFwc2hvdCB7CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZDsKKworY2xhc3MgU25hcHNob3RIYW5kbGVyOworCitjbGFzcyBXb3JrZXIgeworICBwdWJsaWM6CisgICAgV29ya2VyKGNvbnN0IHN0ZDo6c3RyaW5nJiBjb3dfZGV2aWNlLCBjb25zdCBzdGQ6OnN0cmluZyYgbWlzY19uYW1lLAorICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYmFzZV9wYXRoX21lcmdlLCBzdGQ6OnNoYXJlZF9wdHI8U25hcHNob3RIYW5kbGVyPiBzbmFwdXNlcmQpOworICAgIHZpcnR1YWwgfldvcmtlcigpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgYm9vbCBJbml0KCk7CisKKyAgcHJvdGVjdGVkOgorICAgIGJvb2wgSW5pdGlhbGl6ZUZkcygpOworICAgIGJvb2wgSW5pdFJlYWRlcigpOworICAgIHZpcnR1YWwgdm9pZCBDbG9zZUZkcygpIHsgYmFzZV9wYXRoX21lcmdlX2ZkXyA9IHt9OyB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q293UmVhZGVyPiByZWFkZXJfOworCisgICAgc3RkOjpzdHJpbmcgbWlzY19uYW1lXzsgIC8vIE5lZWRlZCBmb3IgU05BUF9MT0cuCisKKyAgICB1bmlxdWVfZmQgYmFzZV9wYXRoX21lcmdlX2ZkXzsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxTbmFwc2hvdEhhbmRsZXI+IHNuYXB1c2VyZF87CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnN0cmluZyBjb3dfZGV2aWNlXzsKKyAgICBzdGQ6OnN0cmluZyBiYXNlX3BhdGhfbWVyZ2VfOworICAgIHVuaXF1ZV9mZCBjb3dfZmRfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91dGlsaXR5LmNwcCBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXRpbGl0eS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ0ZjVhYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXRpbGl0eS5jcHAKQEAgLTAsMCArMSwxMDIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAidXRpbGl0eS5oIgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGxpYmRtL2RtLmg+CisjaW5jbHVkZSA8cHJvY2Vzc2dyb3VwL3Byb2Nlc3Nncm91cC5oPgorCisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBzbmFwc2hvdCB7CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZDsKK3VzaW5nIGFuZHJvaWQ6OmRtOjpEZXZpY2VNYXBwZXI7CisKK2Jvb2wgU2V0VGhyZWFkUHJpb3JpdHkoW1ttYXliZV91bnVzZWRdXSBpbnQgcHJpb3JpdHkpIHsKKyNpZmRlZiBfX0FORFJPSURfXworICAgIHJldHVybiBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIGdldHRpZCgpLCBwcmlvcml0eSkgIT0gLTE7CisjZWxzZQorICAgIHJldHVybiB0cnVlOworI2VuZGlmCit9CisKK2Jvb2wgU2V0UHJvZmlsZXMoW1ttYXliZV91bnVzZWRdXSBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8c3RkOjpzdHJpbmdfdmlldz4gcHJvZmlsZXMpIHsKKyNpZmRlZiBfX0FORFJPSURfXworICAgIGlmIChzZXRnaWQoQUlEX1NZU1RFTSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gU2V0VGFza1Byb2ZpbGVzKGdldHRpZCgpLCBwcm9maWxlcyk7CisjZWxzZQorICAgIHJldHVybiB0cnVlOworI2VuZGlmCit9CisKK2Jvb2wgS2VybmVsU3VwcG9ydHNJb1VyaW5nKCkgeworICAgIHN0cnVjdCB1dHNuYW1lIHV0cyB7fTsKKyAgICB1bnNpZ25lZCBpbnQgbWFqb3IsIG1pbm9yOworCisgICAgdW5hbWUoJnV0cyk7CisgICAgaWYgKHNzY2FuZih1dHMucmVsZWFzZSwgIiV1LiV1IiwgJm1ham9yLCAmbWlub3IpICE9IDIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFdlIHdpbGwgb25seSBzdXBwb3J0IGtlcm5lbHMgZnJvbSA1LjYgb253YXJkcyBhcyBJT1NRRV9BU1lOQyBmbGFnIGFuZAorICAgIC8vIElPX1VSSU5HX09QX1JFQUQvV1JJVEUgb3Bjb2RlcyB3ZXJlIGludHJvZHVjZWQgb25seSBvbiA1LjYga2VybmVsCisgICAgcmV0dXJuIG1ham9yID4gNSB8fCAobWFqb3IgPT0gNSAmJiBtaW5vciA+PSA2KTsKK30KKworYm9vbCBHZXRVc2Vyc3BhY2VTbmFwc2hvdHNFbmFibGVkUHJvcGVydHkoKSB7CisgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OkdldEJvb2xQcm9wZXJ0eSgicm8udmlydHVhbF9hYi51c2Vyc3BhY2Uuc25hcHNob3RzLmVuYWJsZWQiLCBmYWxzZSk7Cit9CisKK2Jvb2wgS2VybmVsU3VwcG9ydHNDb21wcmVzc2VkU25hcHNob3RzKCkgeworICAgIGF1dG8mIGRtID0gRGV2aWNlTWFwcGVyOjpJbnN0YW5jZSgpOworICAgIHJldHVybiBkbS5HZXRUYXJnZXRCeU5hbWUoInVzZXIiLCBudWxscHRyKTsKK30KKworYm9vbCBJc1ZlbmRvckZyb21BbmRyb2lkMTIoKSB7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgVU5LTk9XTiA9ICJ1bmtub3duIjsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyB2ZW5kb3JfcmVsZWFzZSA9CisgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpHZXRQcm9wZXJ0eSgicm8udmVuZG9yLmJ1aWxkLnZlcnNpb24ucmVsZWFzZV9vcl9jb2RlbmFtZSIsIFVOS05PV04pOworCisgICAgaWYgKHZlbmRvcl9yZWxlYXNlLmZpbmQoIjEyIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDYW5Vc2VVc2Vyc3BhY2VTbmFwc2hvdHMoKSB7CisgICAgaWYgKCFHZXRVc2Vyc3BhY2VTbmFwc2hvdHNFbmFibGVkUHJvcGVydHkoKSkgeworICAgICAgICBMT0coSU5GTykgPDwgIlZpcnR1YWwgQS9CIC0gVXNlcnNwYWNlIHNuYXBzaG90cyBkaXNhYmxlZCI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIUtlcm5lbFN1cHBvcnRzQ29tcHJlc3NlZFNuYXBzaG90cygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlVzZXJzcGFjZSBzbmFwc2hvdHMgcmVxdWVzdGVkLCBidXQgbm8ga2VybmVsIHN1cHBvcnQgaXMgYXZhaWxhYmxlLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXRpbGl0eS5oIGIvZnNfbWdyL2xpYnNuYXBzaG90L3NuYXB1c2VyZC91dGlsaXR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBiZTQxOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC9zbmFwdXNlcmQvdXRpbGl0eS5oCkBAIC0wLDAgKzEsMzMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisjaW5jbHVkZSA8c3RyaW5nX3ZpZXc+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBzbmFwc2hvdCB7CisKK2Jvb2wgU2V0VGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KTsKK2Jvb2wgU2V0UHJvZmlsZXMoc3RkOjppbml0aWFsaXplcl9saXN0PHN0ZDo6c3RyaW5nX3ZpZXc+IHByb2ZpbGVzKTsKK2Jvb2wgS2VybmVsU3VwcG9ydHNJb1VyaW5nKCk7CisKK2Jvb2wgR2V0VXNlcnNwYWNlU25hcHNob3RzRW5hYmxlZFByb3BlcnR5KCk7Citib29sIEtlcm5lbFN1cHBvcnRzQ29tcHJlc3NlZFNuYXBzaG90cygpOworYm9vbCBDYW5Vc2VVc2Vyc3BhY2VTbmFwc2hvdHMoKTsKK2Jvb2wgSXNWZW5kb3JGcm9tQW5kcm9pZDEyKCk7CisKK30gIC8vIG5hbWVzcGFjZSBzbmFwc2hvdAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC90ZXN0X2hlbHBlcnMuY3BwIGIvZnNfbWdyL2xpYnNuYXBzaG90L3Rlc3RfaGVscGVycy5jcHAKaW5kZXggOWYxZDY3Ni4uMmVhYzM0NyAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L3Rlc3RfaGVscGVycy5jcHAKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3Rlc3RfaGVscGVycy5jcHAKQEAgLTEzMCwxMiArMTMwLDcgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotc3RkOjpzdHJpbmcgSGFzaFNuYXBzaG90KElTbmFwc2hvdFdyaXRlciogd3JpdGVyKSB7Ci0gICAgYXV0byByZWFkZXIgPSB3cml0ZXItPk9wZW5SZWFkZXIoKTsKLSAgICBpZiAoIXJlYWRlcikgewotICAgICAgICByZXR1cm4ge307Ci0gICAgfQotCitzdGQ6OnN0cmluZyBIYXNoU25hcHNob3QoSUNvd1dyaXRlcjo6RmlsZURlc2NyaXB0b3IqIHJlYWRlcikgewogICAgIFNIQTI1Nl9DVFggY3R4OwogICAgIFNIQTI1Nl9Jbml0KCZjdHgpOwogCkBAIC0yMTQsNjggKzIwOSw2IEBACiAgICAgcmV0dXJuIHBhcnRpdGlvbl91cGRhdGUtPm11dGFibGVfbmV3X3BhcnRpdGlvbl9pbmZvKCktPnNpemUoKTsKIH0KIAotQXNzZXJ0aW9uUmVzdWx0IExvd1NwYWNlVXNlcmRhdGE6OkluaXQodWludDY0X3QgbWF4X2ZyZWVfc3BhY2UpIHsKLSAgICBhdXRvIHJlcyA9IFJlYWRVc2VyZGF0YVN0YXRzKCk7Ci0gICAgaWYgKCFyZXMpIHJldHVybiByZXM7Ci0KLSAgICAvLyBUcnkgdG8gZmlsbCB1cCB0aGUgZGlzayBhcyBtdWNoIGFzIHBvc3NpYmxlIHVudGlsIGZyZWVfc3BhY2VfIDw9IG1heF9mcmVlX3NwYWNlLgotICAgIGJpZ19maWxlXyA9IHN0ZDo6bWFrZV91bmlxdWU8VGVtcG9yYXJ5RmlsZT4oKTsKLSAgICBpZiAoYmlnX2ZpbGVfLT5mZCA9PSAtMSkgewotICAgICAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IHN0cmVycm9yKGVycm5vKTsKLSAgICB9Ci0gICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpTdGFydHNXaXRoKGJpZ19maWxlXy0+cGF0aCwga1VzZXJEYXRhRGV2aWNlKSkgewotICAgICAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8ICJUZW1wIGZpbGUgYWxsb2NhdGVkIHRvICIgPDwgYmlnX2ZpbGVfLT5wYXRoIDw8ICIsIG5vdCBpbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwga1VzZXJEYXRhRGV2aWNlOwotICAgIH0KLSAgICB1aW50NjRfdCBuZXh0X2NvbnN1bWUgPSBzdGQ6Om1pbihzdGQ6Om1heChhdmFpbGFibGVfc3BhY2VfLCBtYXhfZnJlZV9zcGFjZSkgLSBtYXhfZnJlZV9zcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDY0X3Qpc3RkOjpudW1lcmljX2xpbWl0czxvZmZfdD46Om1heCgpKTsKLSAgICBvZmZfdCBhbGxvY2F0ZWQgPSAwOwotICAgIHdoaWxlIChuZXh0X2NvbnN1bWUgPiAwICYmIGZyZWVfc3BhY2VfID4gbWF4X2ZyZWVfc3BhY2UpIHsKLSAgICAgICAgaW50IHN0YXR1cyA9IGZhbGxvY2F0ZShiaWdfZmlsZV8tPmZkLCAwLCBhbGxvY2F0ZWQsIG5leHRfY29uc3VtZSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gLTEgJiYgZXJybm8gPT0gRU5PU1BDKSB7Ci0gICAgICAgICAgICBuZXh0X2NvbnN1bWUgLz0gMjsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gLTEpIHsKLSAgICAgICAgICAgIHJldHVybiBBc3NlcnRpb25GYWlsdXJlKCkgPDwgc3RyZXJyb3IoZXJybm8pOwotICAgICAgICB9Ci0gICAgICAgIGFsbG9jYXRlZCArPSBuZXh0X2NvbnN1bWU7Ci0KLSAgICAgICAgcmVzID0gUmVhZFVzZXJkYXRhU3RhdHMoKTsKLSAgICAgICAgaWYgKCFyZXMpIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgTE9HKElORk8pIDw8IGFsbG9jYXRlZCA8PCAiIGJ5dGVzIGFsbG9jYXRlZCB0byAiIDw8IGJpZ19maWxlXy0+cGF0aDsKLSAgICBpbml0aWFsaXplZF8gPSB0cnVlOwotICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Ci19Ci0KLUFzc2VydGlvblJlc3VsdCBMb3dTcGFjZVVzZXJkYXRhOjpSZWFkVXNlcmRhdGFTdGF0cygpIHsKLSAgICBzdHJ1Y3Qgc3RhdHZmcyBidWY7Ci0gICAgaWYgKHN0YXR2ZnMoa1VzZXJEYXRhRGV2aWNlLCAmYnVmKSA9PSAtMSkgewotICAgICAgICByZXR1cm4gQXNzZXJ0aW9uRmFpbHVyZSgpIDw8IHN0cmVycm9yKGVycm5vKTsKLSAgICB9Ci0gICAgYnNpemVfID0gYnVmLmZfYnNpemU7Ci0gICAgZnJlZV9zcGFjZV8gPSBic2l6ZV8gKiBidWYuZl9iZnJlZTsKLSAgICBhdmFpbGFibGVfc3BhY2VfID0gYnNpemVfICogYnVmLmZfYmF2YWlsOwotICAgIHJldHVybiBBc3NlcnRpb25TdWNjZXNzKCk7Ci19Ci0KLXVpbnQ2NF90IExvd1NwYWNlVXNlcmRhdGE6OmZyZWVfc3BhY2UoKSBjb25zdCB7Ci0gICAgQ0hFQ0soaW5pdGlhbGl6ZWRfKTsKLSAgICByZXR1cm4gZnJlZV9zcGFjZV87Ci19Ci0KLXVpbnQ2NF90IExvd1NwYWNlVXNlcmRhdGE6OmF2YWlsYWJsZV9zcGFjZSgpIGNvbnN0IHsKLSAgICBDSEVDSyhpbml0aWFsaXplZF8pOwotICAgIHJldHVybiBhdmFpbGFibGVfc3BhY2VfOwotfQotCi11aW50NjRfdCBMb3dTcGFjZVVzZXJkYXRhOjpic2l6ZSgpIGNvbnN0IHsKLSAgICBDSEVDSyhpbml0aWFsaXplZF8pOwotICAgIHJldHVybiBic2l6ZV87Ci19Ci0KIGJvb2wgSXNWaXJ0dWFsQWJFbmFibGVkKCkgewogICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpHZXRCb29sUHJvcGVydHkoInJvLnZpcnR1YWxfYWIuZW5hYmxlZCIsIGZhbHNlKTsKIH0KZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC90b29scy9BbmRyb2lkLmJwIGIvZnNfbWdyL2xpYnNuYXBzaG90L3Rvb2xzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFjOTJjMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC90b29scy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDYgQEAKKworY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiY293X2JlbmNobWFyayIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImZzX21ncl9kZWZhdWx0cyIsCisgICAgICAgICJsaWJzbmFwc2hvdF9jb3dfZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbImNvd19iZW5jaG1hcmsuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic25hcHNob3RfY293IiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKK30KKworCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJ3cml0ZV9jb3ciLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJmc19tZ3JfZGVmYXVsdHMiLAorICAgICAgICAibGlic25hcHNob3RfY293X2RlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJ3cml0ZV9jb3cuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic25hcHNob3RfY293IiwKKyAgICAgICAgImxpYmdmbGFncyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIGNmbGFnczogWyItV2Vycm9yIl0sCit9CmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3QvdG9vbHMvY293X2JlbmNobWFyay5jcHAgYi9mc19tZ3IvbGlic25hcHNob3QvdG9vbHMvY293X2JlbmNobWFyay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI0NjNjOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC90b29scy9jb3dfYmVuY2htYXJrLmNwcApAQCAtMCwwICsxLDIwMiBAQAorLy8KKy8vIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8KKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxyYW5kb20+CisKKyNpbmNsdWRlIDxsaWJzbmFwc2hvdC9jb3dfY29tcHJlc3MuaD4KKyNpbmNsdWRlIDxsaWJzbmFwc2hvdC9jb3dfZm9ybWF0Lmg+CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBCTE9DS19TWiA9IDQwOTY7CitzdGF0aWMgY29uc3QgdWludDMyX3QgU0VFRF9OVU1CRVIgPSAxMDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHNuYXBzaG90IHsKKworc3RhdGljIHN0ZDo6c3RyaW5nIENvbXByZXNzaW9uVG9TdHJpbmcoQ293Q29tcHJlc3Npb24mIGNvbXByZXNzaW9uKSB7CisgICAgc3RkOjpzdHJpbmcgb3V0cHV0OworICAgIHN3aXRjaCAoY29tcHJlc3Npb24uYWxnb3JpdGhtKSB7CisgICAgICAgIGNhc2Uga0Nvd0NvbXByZXNzQnJvdGxpOgorICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiYnJvdGxpIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrQ293Q29tcHJlc3NHejoKKyAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoImd6Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrQ293Q29tcHJlc3NMejQ6CisgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJsejQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtDb3dDb21wcmVzc1pzdGQ6CisgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJ6c3RkIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrQ293Q29tcHJlc3NOb25lOgorICAgICAgICAgICAgcmV0dXJuICJObyBDb21wcmVzc2lvbiI7CisgICAgfQorICAgIG91dHB1dC5hcHBlbmQoIiAiICsgc3RkOjp0b19zdHJpbmcoY29tcHJlc3Npb24uY29tcHJlc3Npb25fbGV2ZWwpKTsKKyAgICByZXR1cm4gb3V0cHV0OworfQorCit2b2lkIE9uZVNob3RDb21wcmVzc2lvblRlc3QoKSB7CisgICAgc3RkOjpjb3V0IDw8ICJcbi0tLS0tLS1PbmUgU2hvdCBDb21wcmVzc29yIFBlcmYgQW5hbHlzaXMtLS0tLS0tXG4iOworCisgICAgc3RkOjp2ZWN0b3I8Q293Q29tcHJlc3Npb24+IGNvbXByZXNzaW9uX2xpc3QgPSB7CisgICAgICAgICAgICB7a0Nvd0NvbXByZXNzTHo0LCAwfSwgICAgIHtrQ293Q29tcHJlc3NCcm90bGksIDF9LCB7a0Nvd0NvbXByZXNzQnJvdGxpLCAzfSwKKyAgICAgICAgICAgIHtrQ293Q29tcHJlc3NCcm90bGksIDExfSwge2tDb3dDb21wcmVzc1pzdGQsIDN9LCAgIHtrQ293Q29tcHJlc3Nac3RkLCA2fSwKKyAgICAgICAgICAgIHtrQ293Q29tcHJlc3Nac3RkLCA5fSwgICAge2tDb3dDb21wcmVzc1pzdGQsIDIyfSwgIHtrQ293Q29tcHJlc3NHeiwgMX0sCisgICAgICAgICAgICB7a0Nvd0NvbXByZXNzR3osIDN9LCAgICAgIHtrQ293Q29tcHJlc3NHeiwgNn0sICAgICB7a0Nvd0NvbXByZXNzR3osIDl9fTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8SUNvbXByZXNzb3I+PiBjb21wcmVzc29yczsKKyAgICBmb3IgKGF1dG8gaSA6IGNvbXByZXNzaW9uX2xpc3QpIHsKKyAgICAgICAgY29tcHJlc3NvcnMuZW1wbGFjZV9iYWNrKElDb21wcmVzc29yOjpDcmVhdGUoaSwgQkxPQ0tfU1opKTsKKyAgICB9CisKKyAgICAvLyBBbGxvY2F0ZSBhIGJ1ZmZlciBvZiBzaXplIDggYmxvY2tzLgorICAgIHN0ZDo6YXJyYXk8Y2hhciwgMzI3Njg+IGJ1ZmZlcjsKKworICAgIC8vIEdlbmVyYXRlIGEgcmFuZG9tIDRrIGJ1ZmZlciBvZiBjaGFyYWN0ZXJzCisgICAgc3RkOjpkZWZhdWx0X3JhbmRvbV9lbmdpbmUgZ2VuKFNFRURfTlVNQkVSKTsKKyAgICBzdGQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxpbnQ+IGRpc3RyaWJ1dGlvbigwLCAxMCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWZmZXIuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgYnVmZmVyW2ldID0gc3RhdGljX2Nhc3Q8Y2hhcj4oZGlzdHJpYnV0aW9uKGdlbikpOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxkb3VibGUsIHN0ZDo6c3RyaW5nPj4gbGF0ZW5jaWVzOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxkb3VibGUsIHN0ZDo6c3RyaW5nPj4gcmF0aW9zOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb21wcmVzc29ycy5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBhdXRvIHN0YXJ0ID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNvbXByZXNzZWRfZGF0YSA9CisgICAgICAgICAgICAgICAgY29tcHJlc3NvcnNbaV0tPkNvbXByZXNzKGJ1ZmZlci5kYXRhKCksIGJ1ZmZlci5zaXplKCkpOworICAgICAgICBjb25zdCBhdXRvIGVuZCA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOworICAgICAgICBjb25zdCBhdXRvIGxhdGVuY3kgPQorICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjpuYW5vc2Vjb25kcz4oZW5kIC0gc3RhcnQpIC8gMTAwMC4wOworICAgICAgICBjb25zdCBkb3VibGUgY29tcHJlc3Npb25fcmF0aW8gPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90Pihjb21wcmVzc2VkX2RhdGEuc2l6ZSgpKSAqIDEuMDAgLyBidWZmZXIuc2l6ZSgpOworCisgICAgICAgIHN0ZDo6Y291dCA8PCAiTWV0cmljcyBmb3IgIiA8PCBDb21wcmVzc2lvblRvU3RyaW5nKGNvbXByZXNzaW9uX2xpc3RbaV0pIDw8ICI6IGxhdGVuY3kgLT4gIgorICAgICAgICAgICAgICAgICAgPDwgbGF0ZW5jeS5jb3VudCgpIDw8ICJtcyAiCisgICAgICAgICAgICAgICAgICA8PCAiIGNvbXByZXNzaW9uIHJhdGlvIC0+IiA8PCBjb21wcmVzc2lvbl9yYXRpbyA8PCAiIFxuIjsKKworICAgICAgICBsYXRlbmNpZXMuZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKGxhdGVuY3kuY291bnQoKSwgQ29tcHJlc3Npb25Ub1N0cmluZyhjb21wcmVzc2lvbl9saXN0W2ldKSkpOworICAgICAgICByYXRpb3MuZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKGNvbXByZXNzaW9uX3JhdGlvLCBDb21wcmVzc2lvblRvU3RyaW5nKGNvbXByZXNzaW9uX2xpc3RbaV0pKSk7CisgICAgfQorCisgICAgaW50IGJlc3Rfc3BlZWQgPSAwOworICAgIGludCBiZXN0X3JhdGlvID0gMDsKKworICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbGF0ZW5jaWVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChsYXRlbmNpZXNbaV0uZmlyc3QgPCBsYXRlbmNpZXNbYmVzdF9zcGVlZF0uZmlyc3QpIHsKKyAgICAgICAgICAgIGJlc3Rfc3BlZWQgPSBpOworICAgICAgICB9CisgICAgICAgIGlmIChyYXRpb3NbaV0uZmlyc3QgPCByYXRpb3NbYmVzdF9yYXRpb10uZmlyc3QpIHsKKyAgICAgICAgICAgIGJlc3RfcmF0aW8gPSBpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjpjb3V0IDw8ICJCRVNUIFNQRUVEOiAiIDw8IGxhdGVuY2llc1tiZXN0X3NwZWVkXS5maXJzdCA8PCAibXMgIgorICAgICAgICAgICAgICA8PCBsYXRlbmNpZXNbYmVzdF9zcGVlZF0uc2Vjb25kIDw8ICJcbiI7CisgICAgc3RkOjpjb3V0IDw8ICJCRVNUIFJBVElPOiAiIDw8IHJhdGlvc1tiZXN0X3JhdGlvXS5maXJzdCA8PCAiICIgPDwgcmF0aW9zW2Jlc3RfcmF0aW9dLnNlY29uZAorICAgICAgICAgICAgICA8PCAiXG4iOworfQorCit2b2lkIEluY3JlbWVudGFsQ29tcHJlc3Npb25UZXN0KCkgeworICAgIHN0ZDo6Y291dCA8PCAiXG4tLS0tLS0tSW5jcmVtZW50YWwgQ29tcHJlc3NvciBQZXJmIEFuYWx5c2lzLS0tLS0tLVxuIjsKKworICAgIHN0ZDo6dmVjdG9yPENvd0NvbXByZXNzaW9uPiBjb21wcmVzc2lvbl9saXN0ID0geworICAgICAgICAgICAge2tDb3dDb21wcmVzc0x6NCwgMH0sICAgICB7a0Nvd0NvbXByZXNzQnJvdGxpLCAxfSwge2tDb3dDb21wcmVzc0Jyb3RsaSwgM30sCisgICAgICAgICAgICB7a0Nvd0NvbXByZXNzQnJvdGxpLCAxMX0sIHtrQ293Q29tcHJlc3Nac3RkLCAzfSwgICB7a0Nvd0NvbXByZXNzWnN0ZCwgNn0sCisgICAgICAgICAgICB7a0Nvd0NvbXByZXNzWnN0ZCwgOX0sICAgIHtrQ293Q29tcHJlc3Nac3RkLCAyMn0sICB7a0Nvd0NvbXByZXNzR3osIDF9LAorICAgICAgICAgICAge2tDb3dDb21wcmVzc0d6LCAzfSwgICAgICB7a0Nvd0NvbXByZXNzR3osIDZ9LCAgICAge2tDb3dDb21wcmVzc0d6LCA5fX07CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPElDb21wcmVzc29yPj4gY29tcHJlc3NvcnM7CisgICAgZm9yIChhdXRvIGkgOiBjb21wcmVzc2lvbl9saXN0KSB7CisgICAgICAgIGNvbXByZXNzb3JzLmVtcGxhY2VfYmFjayhJQ29tcHJlc3Nvcjo6Q3JlYXRlKGksIEJMT0NLX1NaKSk7CisgICAgfQorCisgICAgLy8gQWxsb2NhdGUgYSBidWZmZXIgb2Ygc2l6ZSA4IGJsb2Nrcy4KKyAgICBzdGQ6OmFycmF5PGNoYXIsIDMyNzY4PiBidWZmZXI7CisKKyAgICAvLyBHZW5lcmF0ZSBhIHJhbmRvbSA0ayBidWZmZXIgb2YgY2hhcmFjdGVycworICAgIHN0ZDo6ZGVmYXVsdF9yYW5kb21fZW5naW5lIGdlbihTRUVEX05VTUJFUik7CisgICAgc3RkOjp1bmlmb3JtX2ludF9kaXN0cmlidXRpb248aW50PiBkaXN0cmlidXRpb24oMCwgMTApOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVmZmVyLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGJ1ZmZlcltpXSA9IHN0YXRpY19jYXN0PGNoYXI+KGRpc3RyaWJ1dGlvbihnZW4pKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8ZG91YmxlLCBzdGQ6OnN0cmluZz4+IGxhdGVuY2llczsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8ZG91YmxlLCBzdGQ6OnN0cmluZz4+IHJhdGlvczsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29tcHJlc3NvcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8dWludDhfdD4+IGNvbXByZXNzZWRfZGF0YV92ZWM7CisgICAgICAgIGludCBudW1fYmxvY2tzID0gYnVmZmVyLnNpemUoKSAvIEJMT0NLX1NaOworICAgICAgICBjb25zdCB1aW50OF90KiBpdGVyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oYnVmZmVyLmRhdGEoKSk7CisKKyAgICAgICAgY29uc3QgYXV0byBzdGFydCA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOworICAgICAgICB3aGlsZSAobnVtX2Jsb2NrcyA+IDApIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNvbXByZXNzZWRfZGF0YSA9IGNvbXByZXNzb3JzW2ldLT5Db21wcmVzcyhpdGVyLCBCTE9DS19TWik7CisgICAgICAgICAgICBjb21wcmVzc2VkX2RhdGFfdmVjLmVtcGxhY2VfYmFjayhjb21wcmVzc2VkX2RhdGEpOworICAgICAgICAgICAgbnVtX2Jsb2Nrcy0tOworICAgICAgICAgICAgaXRlciArPSBCTE9DS19TWjsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IGF1dG8gZW5kID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CisgICAgICAgIGNvbnN0IGF1dG8gbGF0ZW5jeSA9CisgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzPihlbmQgLSBzdGFydCkgLyAxMDAwLjA7CisKKyAgICAgICAgc2l6ZV90IHNpemUgPSAwOworICAgICAgICBmb3IgKGF1dG8mIGkgOiBjb21wcmVzc2VkX2RhdGFfdmVjKSB7CisgICAgICAgICAgICBzaXplICs9IGkuc2l6ZSgpOworICAgICAgICB9CisgICAgICAgIGNvbnN0IGRvdWJsZSBjb21wcmVzc2lvbl9yYXRpbyA9IHNpemUgKiAxLjAwIC8gYnVmZmVyLnNpemUoKTsKKworICAgICAgICBzdGQ6OmNvdXQgPDwgIk1ldHJpY3MgZm9yICIgPDwgQ29tcHJlc3Npb25Ub1N0cmluZyhjb21wcmVzc2lvbl9saXN0W2ldKSA8PCAiOiBsYXRlbmN5IC0+ICIKKyAgICAgICAgICAgICAgICAgIDw8IGxhdGVuY3kuY291bnQoKSA8PCAibXMgIgorICAgICAgICAgICAgICAgICAgPDwgIiBjb21wcmVzc2lvbiByYXRpbyAtPiIgPDwgY29tcHJlc3Npb25fcmF0aW8gPDwgIiBcbiI7CisKKyAgICAgICAgbGF0ZW5jaWVzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihsYXRlbmN5LmNvdW50KCksIENvbXByZXNzaW9uVG9TdHJpbmcoY29tcHJlc3Npb25fbGlzdFtpXSkpKTsKKyAgICAgICAgcmF0aW9zLmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihjb21wcmVzc2lvbl9yYXRpbywgQ29tcHJlc3Npb25Ub1N0cmluZyhjb21wcmVzc2lvbl9saXN0W2ldKSkpOworICAgIH0KKworICAgIGludCBiZXN0X3NwZWVkID0gMDsKKyAgICBpbnQgYmVzdF9yYXRpbyA9IDA7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IGxhdGVuY2llcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobGF0ZW5jaWVzW2ldLmZpcnN0IDwgbGF0ZW5jaWVzW2Jlc3Rfc3BlZWRdLmZpcnN0KSB7CisgICAgICAgICAgICBiZXN0X3NwZWVkID0gaTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmF0aW9zW2ldLmZpcnN0IDwgcmF0aW9zW2Jlc3RfcmF0aW9dLmZpcnN0KSB7CisgICAgICAgICAgICBiZXN0X3JhdGlvID0gaTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiQkVTVCBTUEVFRDogIiA8PCBsYXRlbmNpZXNbYmVzdF9zcGVlZF0uZmlyc3QgPDwgIm1zICIKKyAgICAgICAgICAgICAgPDwgbGF0ZW5jaWVzW2Jlc3Rfc3BlZWRdLnNlY29uZCA8PCAiXG4iOworICAgIHN0ZDo6Y291dCA8PCAiQkVTVCBSQVRJTzogIiA8PCByYXRpb3NbYmVzdF9yYXRpb10uZmlyc3QgPDwgIiAiIDw8IHJhdGlvc1tiZXN0X3JhdGlvXS5zZWNvbmQKKyAgICAgICAgICAgICAgPDwgIlxuIjsKK30KKworfSAgLy8gbmFtZXNwYWNlIHNuYXBzaG90Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitpbnQgbWFpbigpIHsKKyAgICBhbmRyb2lkOjpzbmFwc2hvdDo6T25lU2hvdENvbXByZXNzaW9uVGVzdCgpOworICAgIGFuZHJvaWQ6OnNuYXBzaG90OjpJbmNyZW1lbnRhbENvbXByZXNzaW9uVGVzdCgpOworCisgICAgcmV0dXJuIDA7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3Rvb2xzL3Rlc3RkYXRhL2Nvd192MiBiL2ZzX21nci9saWJzbmFwc2hvdC90b29scy90ZXN0ZGF0YS9jb3dfdjIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYzN2RmYwotLS0gL2Rldi9udWxsCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC90b29scy90ZXN0ZGF0YS9jb3dfdjIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3Rvb2xzL3Rlc3RkYXRhL2luY29tcHJlc3NpYmxlX2Jsb2NrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3Rvb2xzL3Rlc3RkYXRhL2luY29tcHJlc3NpYmxlX2Jsb2NrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNDVjZDAKLS0tIC9kZXYvbnVsbAorKysgYi9mc19tZ3IvbGlic25hcHNob3QvdG9vbHMvdGVzdGRhdGEvaW5jb21wcmVzc2libGVfYmxvY2sKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYnNuYXBzaG90L3Rvb2xzL3dyaXRlX2Nvdy5jcHAgYi9mc19tZ3IvbGlic25hcHNob3QvdG9vbHMvd3JpdGVfY293LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDUxMTc0Ci0tLSAvZGV2L251bGwKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3Rvb2xzL3dyaXRlX2Nvdy5jcHAKQEAgLTAsMCArMSwxMTQgQEAKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy8vCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGxpYnNuYXBzaG90L2Nvd19jb21wcmVzcy5oPgorI2luY2x1ZGUgPGxpYnNuYXBzaG90L2Nvd19mb3JtYXQuaD4KKyNpbmNsdWRlIDxsaWJzbmFwc2hvdC9jb3dfd3JpdGVyLmg+CisKKyNpbmNsdWRlIDxnZmxhZ3MvZ2ZsYWdzLmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlICJhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmgiCisKK0RFRklORV9ib29sKHNpbGVudCwgZmFsc2UsICJSdW4gc2lsZW50bHkiKTsKK0RFRklORV9pbnQzMih3cml0ZXJfdmVyc2lvbiwgMiwgIndoaWNoIHZlcnNpb24gb2YgQ09XIHdyaXRlciB0byBiZSB1c2VkIik7CitERUZJTkVfYm9vbCh3cml0ZV9sZWdhY3ksIGZhbHNlLAorICAgICAgICAgICAgIldyaXRlcyBhIGxlZ2FjeSBjb3dfdjIgaW4gY3VycmVudCBkaXJlY3RvcnksIHRoaXMgY293IHdhcyB1c2VkIHRvIHRlc3QgYmFja3dhcmRzICIKKyAgICAgICAgICAgICJjb21wYXRpYmlsaXR5IGJldHdlZW4gdmVyc2lvbiAyIGFuZCB2ZXJzaW9uIDMiKTsKK0RFRklORV9ib29sKHdyaXRlX2hlYWRlciwgZmFsc2UsICJUZXN0IHJlYWRpbmcvd3JpdGluZyBqdXN0IHRoZSBoZWFkZXIiKTsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpzbmFwc2hvdDsKKworLy8gVGhpcyB3cml0ZXMgYSBzaW1wbGUgY293IHYyIGZpbGUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiBUaGlzIGZpbGUgd2lsbCBzZXJ2ZSBhcyB0ZXN0ZGF0YSBmb3IKKy8vIGVuc3VyaW5nIG91ciB2MyBjb3cgcmVhZGVyIHdpbGwgYmUgYWJsZSB0byByZWFkIGEgY293IGZpbGUgY3JlYXRlZCBieSB0aGUgdjIgd3JpdGVyLgorLy8KKy8vIFdBUk5JTkc6IFdlIHNob3VsZCBub3QgYmUgb3ZlcnJpZGluZyB0aGlzIHRlc3QgZmlsZSwgYXMgaXQgd2lsbCBzZXJ2ZSBhcyBoaXN0b3JpYyBtYXJrZXIgZm9yIHdoYXQKKy8vIGEgZGV2aWNlIHdpdGggb2xkIHdyaXRlcl92MiB3aWxsIHdyaXRlIGFzIGEgY293Lgorc3RhdGljIHZvaWQgd3JpdGVfbGVnYWN5X2Nvd192MigpIHsKKyAgICBDb3dPcHRpb25zIG9wdGlvbnM7CisgICAgb3B0aW9ucy5jbHVzdGVyX29wcyA9IDU7CisgICAgb3B0aW9ucy5udW1fbWVyZ2Vfb3BzID0gMTsKKyAgICBzdGQ6OnN0cmluZyBkYXRhID0gIlRoaXMgaXMgc29tZSBkYXRhLCBiZWxpZXZlIGl0IjsKKyAgICBkYXRhLnJlc2l6ZShvcHRpb25zLmJsb2NrX3NpemUsICdcMCcpOworCisgICAgY2hhciBjd2RfYnVmZmVyWzEwMjRdOworICAgIHNpemVfdCBjd2RfYnVmZmVyX3NpemUgPSBzaXplb2YoY3dkX2J1ZmZlcik7CisKKyAgICAvLyBHZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgcGF0aC4KKyAgICBjaGFyKiBlcnIgPSBnZXRjd2QoY3dkX2J1ZmZlciwgY3dkX2J1ZmZlcl9zaXplKTsKKyAgICBpZiAoIWVycikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDb3VsZG4ndCBnZXQgY3VycmVudCBkaXJlY3RvcnkiOworICAgIH0KKyAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgZmQob3BlbihzdHJjYXQoY3dkX2J1ZmZlciwgIi9jb3dfdjIiKSwgT19DUkVBVCB8IE9fUkRXUiwgMDY2NikpOworICAgIGlmIChmZC5nZXQoKSA9PSAtMSkgeworICAgICAgICBMT0coRkFUQUwpIDw8ICJjb3VsZG4ndCBvcGVuIHRtcF9jb3ciOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SUNvd1dyaXRlcj4gd3JpdGVyID0gQ3JlYXRlQ293V3JpdGVyKDIsIG9wdGlvbnMsIHN0ZDo6bW92ZShmZCkpOworICAgIHdyaXRlci0+QWRkQ29weSgwLCA1KTsKKyAgICB3cml0ZXItPkFkZFJhd0Jsb2NrcygyLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOworICAgIHdyaXRlci0+QWRkTGFiZWwoMSk7CisgICAgd3JpdGVyLT5BZGRYb3JCbG9ja3MoNTAsIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSwgMjQsIDEwKTsKKyAgICB3cml0ZXItPkFkZFplcm9CbG9ja3MoNSwgMTApOworICAgIHdyaXRlci0+QWRkTGFiZWwoMik7CisgICAgd3JpdGVyLT5GaW5hbGl6ZSgpOworfQorCitzdGF0aWMgYm9vbCBXcml0ZUNvdyhjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgeworICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBmZChvcGVuKHBhdGguY19zdHIoKSwgT19SRE9OTFkpKTsKKyAgICBmZC5yZXNldChvcGVuKHBhdGguY19zdHIoKSwgT19SRFdSIHwgT19DUkVBVCB8IE9fVFJVTkMsIDA2NjQpKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJjb3VsZCBub3Qgb3BlbiAiIDw8IHBhdGggPDwgIiBmb3Igd3JpdGluZyI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQ293T3B0aW9ucyBvcHRpb25zOworICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSAiVGhpcyBpcyBzb21lIGRhdGEsIGJlbGlldmUgaXQiOworICAgIGRhdGEucmVzaXplKG9wdGlvbnMuYmxvY2tfc2l6ZSwgJ1wwJyk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SUNvd1dyaXRlcj4gd3JpdGVyID0KKyAgICAgICAgICAgIENyZWF0ZUNvd1dyaXRlcihGTEFHU193cml0ZXJfdmVyc2lvbiwgb3B0aW9ucywgc3RkOjptb3ZlKGZkKSk7CisgICAgaWYgKCF3cml0ZXIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHdyaXRlci0+QWRkQ29weSgwLCA1KTsKKyAgICB3cml0ZXItPkFkZFJhd0Jsb2NrcygyLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOworICAgIHdyaXRlci0+QWRkTGFiZWwoMSk7CisgICAgd3JpdGVyLT5BZGRYb3JCbG9ja3MoNTAsIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSwgMjQsIDEwKTsKKyAgICB3cml0ZXItPkFkZFplcm9CbG9ja3MoNSwgMTApOworICAgIHdyaXRlci0+QWRkTGFiZWwoMik7CisgICAgd3JpdGVyLT5GaW5hbGl6ZSgpOworCisgICAgaWYgKCFGTEFHU19zaWxlbnQpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJXcml0aW5nIENPVyB3aXRoIHdyaXRlciB2IiA8PCBGTEFHU193cml0ZXJfdmVyc2lvbiA8PCAiXG4iOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBnZmxhZ3M6OlBhcnNlQ29tbWFuZExpbmVGbGFncygmYXJnYywgJmFyZ3YsIHRydWUpOworICAgIGlmIChGTEFHU193cml0ZV9sZWdhY3kpIHsKKyAgICAgICAgd3JpdGVfbGVnYWN5X2Nvd192MigpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGFyZ2MgPCAyKSB7CisgICAgICAgIGdmbGFnczo6U2hvd1VzYWdlV2l0aEZsYWdzKGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKCFXcml0ZUNvdyhhcmd2WzFdKSkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3QvdXRpbGl0eS5jcHAgYi9mc19tZ3IvbGlic25hcHNob3QvdXRpbGl0eS5jcHAKaW5kZXggMWZmYTg5Yy4uN2VhYWNhOSAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L3V0aWxpdHkuY3BwCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC91dGlsaXR5LmNwcApAQCAtMTk5LDcgKzE5OSw3IEBACiB9CiAKIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBOb3cmKSB7Ci0gICAgc3RydWN0IHRtIG5vdyB7fTsKKyAgICBzdHJ1Y3QgdG0gbm93e307CiAgICAgdGltZV90IHQgPSB0aW1lKG51bGxwdHIpOwogICAgIGxvY2FsdGltZV9yKCZ0LCAmbm93KTsKICAgICByZXR1cm4gb3MgPDwgc3RkOjpwdXRfdGltZSgmbm93LCAiJVklbSVkLSVIJU0lUyIpOwpAQCAtMjMwLDExICsyMzAsNyBAQAogICAgIHJldHVybiBmZXRjaGVyLT5HZXRCb29sUHJvcGVydHkoInJvLnZpcnR1YWxfYWIudXNlcnNwYWNlLnNuYXBzaG90cy5lbmFibGVkIiwgZmFsc2UpOwogfQogCi1ib29sIENhblVzZVVzZXJzcGFjZVNuYXBzaG90cygpIHsKLSAgICBpZiAoIUdldFVzZXJzcGFjZVNuYXBzaG90c0VuYWJsZWRQcm9wZXJ0eSgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KK2Jvb2wgSXNWZW5kb3JGcm9tQW5kcm9pZDEyKCkgewogICAgIGF1dG8gZmV0Y2hlciA9IElQcm9wZXJ0eUZldGNoZXI6OkdldEluc3RhbmNlKCk7CiAKICAgICBjb25zdCBzdGQ6OnN0cmluZyBVTktOT1dOID0gInVua25vd24iOwpAQCAtMjQzLDggKzIzOSwxNSBAQAogCiAgICAgLy8gTm8gdXNlci1zcGFjZSBzbmFwc2hvdHMgaWYgdmVuZG9yIHBhcnRpdGlvbiBpcyBvbiBBbmRyb2lkIDEyCiAgICAgaWYgKHZlbmRvcl9yZWxlYXNlLmZpbmQoIjEyIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgTE9HKElORk8pIDw8ICJVc2Vyc3BhY2Ugc25hcHNob3RzIGRpc2FibGVkIGFzIHZlbmRvciBwYXJ0aXRpb24gaXMgb24gQW5kcm9pZDogIgotICAgICAgICAgICAgICAgICAgPDwgdmVuZG9yX3JlbGVhc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDYW5Vc2VVc2Vyc3BhY2VTbmFwc2hvdHMoKSB7CisgICAgaWYgKCFHZXRVc2Vyc3BhY2VTbmFwc2hvdHNFbmFibGVkUHJvcGVydHkoKSkgeworICAgICAgICBMT0coSU5GTykgPDwgIlZpcnR1YWwgQS9CIC0gVXNlcnNwYWNlIHNuYXBzaG90cyBkaXNhYmxlZCI7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTI2OSw2ICsyNzIsMTEgQEAKICAgICByZXR1cm4gZmV0Y2hlci0+R2V0Qm9vbFByb3BlcnR5KCJyby52aXJ0dWFsX2FiLmNvbXByZXNzaW9uLnhvci5lbmFibGVkIiwgZmFsc2UpOwogfQogCitib29sIEdldE9EaXJlY3RFbmFibGVkUHJvcGVydHkoKSB7CisgICAgYXV0byBmZXRjaGVyID0gSVByb3BlcnR5RmV0Y2hlcjo6R2V0SW5zdGFuY2UoKTsKKyAgICByZXR1cm4gZmV0Y2hlci0+R2V0Qm9vbFByb3BlcnR5KCJyby52aXJ0dWFsX2FiLm9fZGlyZWN0LmVuYWJsZWQiLCBmYWxzZSk7Cit9CisKIHN0ZDo6c3RyaW5nIEdldE90aGVyUGFydGl0aW9uTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgewogICAgIGF1dG8gc3VmZml4ID0gYW5kcm9pZDo6ZnNfbWdyOjpHZXRQYXJ0aXRpb25TbG90U3VmZml4KG5hbWUpOwogICAgIENIRUNLKHN1ZmZpeCA9PSAiX2EiIHx8IHN1ZmZpeCA9PSAiX2IiKTsKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJzbmFwc2hvdC91dGlsaXR5LmggYi9mc19tZ3IvbGlic25hcHNob3QvdXRpbGl0eS5oCmluZGV4IDM3MGYzYzQuLjdkYWU5NDIgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJzbmFwc2hvdC91dGlsaXR5LmgKKysrIGIvZnNfbWdyL2xpYnNuYXBzaG90L3V0aWxpdHkuaApAQCAtMTMzLDkgKzEzMywxMSBAQAogYm9vbCBHZXRVc2Vyc3BhY2VTbmFwc2hvdHNFbmFibGVkUHJvcGVydHkoKTsKIGJvb2wgR2V0SW91cmluZ0VuYWJsZWRQcm9wZXJ0eSgpOwogYm9vbCBHZXRYb3JDb21wcmVzc2lvbkVuYWJsZWRQcm9wZXJ0eSgpOworYm9vbCBHZXRPRGlyZWN0RW5hYmxlZFByb3BlcnR5KCk7CiAKIGJvb2wgQ2FuVXNlVXNlcnNwYWNlU25hcHNob3RzKCk7CiBib29sIElzRG1TbmFwc2hvdFRlc3RpbmdFbmFibGVkKCk7Citib29sIElzVmVuZG9yRnJvbUFuZHJvaWQxMigpOwogCiAvLyBTd2FwIHRoZSBzdWZmaXggb2YgYSBwYXJ0aXRpb24gbmFtZS4KIHN0ZDo6c3RyaW5nIEdldE90aGVyUGFydGl0aW9uTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSk7CmRpZmYgLS1naXQgYS9mc19tZ3IvbGlic25hcHNob3QvdnRzX290YV9jb25maWdfdGVzdC5jcHAgYi9mc19tZ3IvbGlic25hcHNob3QvdnRzX290YV9jb25maWdfdGVzdC5jcHAKaW5kZXggZDM4N2ViMy4uYjU2MThjNCAxMDA3NTUKLS0tIGEvZnNfbWdyL2xpYnNuYXBzaG90L3Z0c19vdGFfY29uZmlnX3Rlc3QuY3BwCisrKyBiL2ZzX21nci9saWJzbmFwc2hvdC92dHNfb3RhX2NvbmZpZ190ZXN0LmNwcApAQCAtMjEsNiArMjEsNyBAQAogICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpHZXRJbnRQcm9wZXJ0eSgicm8udmVuZG9yLmFwaV9sZXZlbCIsIC0xKTsKIH0KIAorLy8gQFZzclRlc3QgPSAzLjcuNgogVEVTVChWQUIsIEVuYWJsZWQpIHsKICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OkdldEJvb2xQcm9wZXJ0eSgicm8uYnVpbGQuYWJfdXBkYXRlIiwgZmFsc2UpICYmIChHZXRWc3JMZXZlbCgpIDwgX19BTkRST0lEX0FQSV9UX18pKSB7CiAgICAgICAgIEdURVNUX1NLSVAoKTsKZGlmZiAtLWdpdCBhL2ZzX21nci90ZXN0cy9BbmRyb2lkLmJwIGIvZnNfbWdyL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggYjliYWUyNS4uMDQxNzYyZiAxMDA2NDQKLS0tIGEvZnNfbWdyL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvZnNfbWdyL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDcgQEAKIAogcGFja2FnZSB7CiAgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbIkFuZHJvaWQtQXBhY2hlLTIuMCJdLAorICAgIGRlZmF1bHRfdGVhbTogInRyZW5keV90ZWFtX2FuZHJvaWRfa2VybmVsIiwKIH0KIAogY2NfdGVzdCB7CkBAIC0zOCw3ICszOSw4IEBACiAgICAgXSwKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGliZnNfbWdyIiwKLSAgICAgICAgImxpYmZzdGFiIiwKKyAgICAgICAgImxpYmdtb2NrIiwKKyAgICAgICAgImxpYmd0ZXN0IiwKICAgICBdLAogICAgIHNyY3M6IFsKICAgICAgICAgImZpbGVfd2FpdF90ZXN0LmNwcCIsCkBAIC0xMDksNyArMTExLDYgQEAKICAgICBdLAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJmc19tZ3IiLAotICAgICAgICAibGliZnN0YWIiLAogICAgICAgICAibGliZ21vY2siLAogICAgICAgICAibGliZ3Rlc3QiLAogICAgIF0sCmRpZmYgLS1naXQgYS9mc19tZ3IvdGVzdHMvQW5kcm9pZFRlc3QueG1sIGIvZnNfbWdyL3Rlc3RzL0FuZHJvaWRUZXN0LnhtbAppbmRleCBkZTgzNWIzLi4xYzA2ZWJkIDEwMDY0NAotLS0gYS9mc19tZ3IvdGVzdHMvQW5kcm9pZFRlc3QueG1sCisrKyBiL2ZzX21nci90ZXN0cy9BbmRyb2lkVGVzdC54bWwKQEAgLTE2LDYgKzE2LDcgQEAKICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9InBhcmFtZXRlciIgdmFsdWU9Im5vdF9pbnN0YW50X2FwcCIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9InBhcmFtZXRlciIgdmFsdWU9Im11bHRpX2FiaSIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImNvbmZpZy1kZXNjcmlwdG9yOm1ldGFkYXRhIiBrZXk9InBhcmFtZXRlciIgdmFsdWU9InNlY29uZGFyeV91c2VyIiAvPgorICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0icGFyYW1ldGVyIiB2YWx1ZT0ic2Vjb25kYXJ5X3VzZXJfb25fc2Vjb25kYXJ5X2Rpc3BsYXkiIC8+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5GaWxlUHVzaGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iQ3RzRnNNZ3JUZXN0Q2FzZXMtPi9kYXRhL2xvY2FsL3RtcC9DdHNGc01nclRlc3RDYXNlcyIgLz4KZGlmZiAtLWdpdCBhL2ZzX21nci90ZXN0cy9hZGItcmVtb3VudC10ZXN0LnNoIGIvZnNfbWdyL3Rlc3RzL2FkYi1yZW1vdW50LXRlc3Quc2gKaW5kZXggYzg3ZTU2NC4uNTI2Yzc2MSAxMDA3NTUKLS0tIGEvZnNfbWdyL3Rlc3RzL2FkYi1yZW1vdW50LXRlc3Quc2gKKysrIGIvZnNfbWdyL3Rlc3RzL2FkYi1yZW1vdW50LXRlc3Quc2gKQEAgLTEwODEsNyArMTA4MSw5IEBACiBMT0cgUlVOICJUZXN0aW5nIGFkYiBkaXNhYmxlLXZlcml0eSAtUiIKIAogVD0kKGFkYl9kYXRlKQotYWRiX3N1IGRpc2FibGUtdmVyaXR5IC1SID4mMiB8fAorYWRiX3N1IGRpc2FibGUtdmVyaXR5IC1SID4mMgorZXJyPSR7P30KK1tbICR7ZXJyfSAtZXEgMCB8fCAke2Vycn0gLWVxIDI1NSBdXSB8fAogICBkaWUgLXQgIiR7VH0iICJkaXNhYmxlLXZlcml0eSAtUiBmYWlsZWQiCiBzbGVlcCAyCiBhZGJfd2FpdCAiJHtBREJfV0FJVH0iIHx8CkBAIC0xMTkyLDcgKzExOTQsOSBAQAogTE9HIFJVTiAiVGVzdGluZyBhZGIgcmVtb3VudCAtUiIKIAogVD0kKGFkYl9kYXRlKQotYWRiX3N1IHJlbW91bnQgLVIgPC9kZXYvbnVsbCA+JjIgfHwKK2FkYl9zdSByZW1vdW50IC1SIDwvZGV2L251bGwgPiYyCitlcnI9JHs/fQorW1sgJHtlcnJ9IC1lcSAwIHx8ICR7ZXJyfSAtZXEgMjU1IF1dIHx8CiAgIGRpZSAtdCAiJHtUfSIgImFkYiByZW1vdW50IC1SIGZhaWxlZCIKIHNsZWVwIDIKIGFkYl93YWl0ICIke0FEQl9XQUlUfSIgfHwKQEAgLTEyMzMsNiArMTIzNywxMiBAQAogYWRiX3NoIGdyZXAgLXEgIiAvdmVuZG9yIFteIF0qIHJ3LCIgL3Byb2MvbW91bnRzIDwvZGV2L251bGwgJiYKICAgZGllICIvdmVuZG9yIGlzIG5vdCBSTyIKIAorZGF0YV9kZXZpY2U9JChhZGJfc2ggYXdrICckMiA9PSAiL2RhdGEiIHsgcHJpbnQgJDE7IGV4aXQgfScgL3Byb2MvbW91bnRzKQorUk89JChhZGJfc2ggZ3JlcCAiIHJvLCIgL3Byb2MvbW91bnRzIDwvZGV2L251bGwgfAorICAgIGdyZXAgLXYgIl4ke2RhdGFfZGV2aWNlfSIgfAorICAgIHNraXBfYWRtaW5pc3RyYXRpdmVfbW91bnRzIHwKKyAgICBhd2sgJ3sgcHJpbnQgJDEgfScpCisKIFQ9JChhZGJfZGF0ZSkKIGFkYiByZW1vdW50ID4mMiB8fAogICBkaWUgLXQgIiR7VH0iICJhZGIgcmVtb3VudCIKQEAgLTEyNDEsNiArMTI1MSwxMiBAQAogYWRiX3NoIGdyZXAgLXEgIiAvdmVuZG9yIFteIF0qIHJ3LCIgL3Byb2MvbW91bnRzIDwvZGV2L251bGwgfHwKICAgZGllIC10ICIke1R9IiAiL3ZlbmRvciBpcyBub3QgUlciCiAKKyMgT25seSBmaW5kIG1vdW50cyB0aGF0IGFyZSByZW1vdW50ZWQgUk8gLT4gUlcKK1JXPSQoYWRiX3NoIGdyZXAgIiBydywiIC9wcm9jL21vdW50cyA8L2Rldi9udWxsIHwKKyAgICBncmVwIC12ICJeJHtkYXRhX2RldmljZX0iIHwKKyAgICBza2lwX2FkbWluaXN0cmF0aXZlX21vdW50cyB8CisgICAgZ3JlcCAtRSAiXigkKGpvaW5fd2l0aCAnfCcgJHtST30pKSAiKQorCiBzY3JhdGNoX29uX3N1cGVyPWZhbHNlCiBpZiAke292ZXJsYXlmc19uZWVkZWR9OyB0aGVuCiAgIGlzX292ZXJsYXlmc19tb3VudGVkIC9zeXN0ZW0gfHwKQEAgLTEyODcsMjcgKzEzMDMsMTkgQEAKICAgICBmaQogICBkb25lCiAKLSAgZGF0YV9kZXZpY2U9JChhZGJfc2ggYXdrICckMiA9PSAiL2RhdGEiIHsgcHJpbnQgJDE7IGV4aXQgfScgL3Byb2MvbW91bnRzKQogICAjIEtJU1MgKHdlIGRvIG5vdCBzdXBwb3J0IHN1Yi1tb3VudHMgZm9yIHN5c3RlbSBwYXJ0aXRpb25zIGN1cnJlbnRseSkKICAgYWRiX3NoIGdyZXAgIl5vdmVybGF5ICIgL3Byb2MvbW91bnRzIDwvZGV2L251bGwgfAogICAgIGdyZXAgLXZFICJeb3ZlcmxheS4qIC8oYXBleHxzeXN0ZW18dmVuZG9yKS9bXiBdIiB8CiAgICAgZ3JlcCAiIG92ZXJsYXkgcm8sIiAmJgogICAgIGRpZSAiZXhwZWN0ZWQgb3ZlcmxheSB0byBiZSBSVyBhZnRlciByZW1vdW50IgotICBhZGJfc2ggZ3JlcCAtdiBub2F0aW1lIC9wcm9jL21vdW50cyA8L2Rldi9udWxsIHwKLSAgICBncmVwIC12ICJeJHtkYXRhX2RldmljZX0iIHwKLSAgICBza2lwX2FkbWluaXN0cmF0aXZlX21vdW50cyB8Ci0gICAgZ3JlcCAtdiAnIHJvLCcgJiYKLSAgICBkaWUgIm1vdW50cyBhcmUgbm90IG5vYXRpbWUiCiAKLSAgRD0kKGFkYl9zaCBncmVwICIgcncsIiAvcHJvYy9tb3VudHMgPC9kZXYvbnVsbCB8Ci0gICAgICBncmVwIC12ICJeJHtkYXRhX2RldmljZX0iIHwKLSAgICAgIHNraXBfYWRtaW5pc3RyYXRpdmVfbW91bnRzIHwKKyAgRD0kKGVjaG8gIiR7Uld9IiB8CiAgICAgICBhd2sgJ3sgcHJpbnQgJDEgfScgfAogICAgICAgc2VkICdzfC9kZXYvcm9vdHwvfCcgfAogICAgICAgc29ydCAtdSkKICAgaWYgWyAtbiAiJHtEfSIgXTsgdGhlbgogICAgIGFkYl9zaCBkZiAtayAke0R9IDwvZGV2L251bGwgfAotICAgICAgc2VkIC1lICdzL15GaWxlc3lzdGVtICAgICAgL0ZpbGVzeXN0ZW0gKHJ3KSAvJworICAgICAgc2VkIC1lICdzL15GaWxlc3lzdGVtICAgICAvRmlsZXN5c3RlbSAocncpLycKICAgZmkgPiYyCiAgIGZvciBkIGluICR7RH07IGRvCiAgICAgaWYgYWRiX3NoIHR1bmUyZnMgLWwgIiR7ZH0iIDwvZGV2L251bGwgMj4mMSB8IGdyZXAgLXEgIkZpbGVzeXN0ZW0gZmVhdHVyZXM6LipzaGFyZWRfYmxvY2tzIiB8fApAQCAtMTMxOSw2ICsxMzI3LDEwIEBACiAgIGlzX292ZXJsYXlmc19tb3VudGVkICYmIGRpZSAtdCAiJHtUfSIgInVuZXhwZWN0ZWQgb3ZlcmxheSB0YWtlb3ZlciIKIGZpCiAKK2VjaG8gLW4gIiR7Uld9IiB8CisgIGdyZXAgLXYgbm9hdGltZSAmJgorICBkaWUgIm1vdW50cyAocncpIGFyZSBub3Qgbm9hdGltZSIKKwogTE9HIE9LICJhZGIgcmVtb3VudCBSVyIKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZzX21nci90ZXN0cy9mc19tZ3JfdGVzdC5jcHAgYi9mc19tZ3IvdGVzdHMvZnNfbWdyX3Rlc3QuY3BwCmluZGV4IGUzMzY4MWMuLjZlMDUwY2YgMTAwNjQ0Ci0tLSBhL2ZzX21nci90ZXN0cy9mc19tZ3JfdGVzdC5jcHAKKysrIGIvZnNfbWdyL3Rlc3RzL2ZzX21ncl90ZXN0LmNwcApAQCAtMjksMTEgKzI5LDE3IEBACiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KICNpbmNsdWRlIDxmc19tZ3IuaD4KICNpbmNsdWRlIDxmc3RhYi9mc3RhYi5oPgorI2luY2x1ZGUgPGdtb2NrL2dtb2NrLmg+CiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KIAotI2luY2x1ZGUgIi4uL2ZzX21ncl9wcml2X2Jvb3RfY29uZmlnLmgiCisjaW5jbHVkZSAiLi4vZnNfbWdyX3ByaXYuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmZzX21ncjsKK3VzaW5nIG5hbWVzcGFjZSB0ZXN0aW5nOworCisjaWYgIWRlZmluZWQoTVNfTEFaWVRJTUUpCisjZGVmaW5lIE1TX0xBWllUSU1FICgxIDw8IDI1KQorI2VuZGlmCiAKIG5hbWVzcGFjZSB7CiAKQEAgLTExOSwzNyArMTI1LDQyIEBACiAgICAgICAgIHsidGVybWluYXRvciIsICJ0cnVuY2F0ZWQifSwKIH07CiAKLWNvbnN0IHN0ZDo6c3RyaW5nIGJvb3Rjb25maWcgPQotICAgICAgICAiYW5kcm9pZGJvb3QuYm9vdGRldmljZSA9IFwiMWQ4NDAwMC51ZnNoY1wiXG4iCi0gICAgICAgICJhbmRyb2lkYm9vdC5ib290X2RldmljZXMgPSBcImRldjFcIiwgXCJkZXYyLHdpdGhjb21tYVwiLCBcImRldjNcIlxuIgotICAgICAgICAiYW5kcm9pZGJvb3QuYmFzZWJhbmQgPSBcInNkeVwiXG4iCi0gICAgICAgICJhbmRyb2lkYm9vdC5rZXltYXN0ZXIgPSBcIjFcIlxuIgotICAgICAgICAiYW5kcm9pZGJvb3Quc2VyaWFsbm8gPSBcIkJMQUhCTEFIQkxBSFwiXG4iCi0gICAgICAgICJhbmRyb2lkYm9vdC5zbG90X3N1ZmZpeCA9IFwiX2FcIlxuIgotICAgICAgICAiYW5kcm9pZGJvb3QuaGFyZHdhcmUucGxhdGZvcm0gPSBcInNkdzgxM1wiXG4iCi0gICAgICAgICJhbmRyb2lkYm9vdC5oYXJkd2FyZSA9IFwiZm9vXCJcbiIKLSAgICAgICAgImFuZHJvaWRib290LnJldmlzaW9uID0gXCJFVlQxLjBcIlxuIgotICAgICAgICAiYW5kcm9pZGJvb3QuYm9vdGxvYWRlciA9IFwiYnVycC0wLjEtNzUyMVwiXG4iCi0gICAgICAgICJhbmRyb2lkYm9vdC5oYXJkd2FyZS5za3UgPSBcIm1hcnlcIlxuIgotICAgICAgICAiYW5kcm9pZGJvb3QuaGFyZHdhcmUucmFkaW8uc3VidHlwZSA9IFwiMFwiXG4iCi0gICAgICAgICJhbmRyb2lkYm9vdC5kdGJvX2lkeCA9IFwiMlwiXG4iCi0gICAgICAgICJhbmRyb2lkYm9vdC5tb2RlID0gXCJub3JtYWxcIlxuIgotICAgICAgICAiYW5kcm9pZGJvb3QuaGFyZHdhcmUuZGRyID0gXCIxR0IsY29tYnVjaGksTFBERFI0WFwiXG4iCi0gICAgICAgICJhbmRyb2lkYm9vdC5kZHJfaW5mbyA9IFwiY29tYnVjaGlhbmRyb2lkYm9vdC5kZHJfc2l6ZT0yR0JcIlxuIgotICAgICAgICAiYW5kcm9pZGJvb3QuaGFyZHdhcmUudWZzID0gXCIyR0IsY29tYnVzaGlcIlxuIgotICAgICAgICAiYW5kcm9pZGJvb3QuYm9vdHRpbWUgPSBcIjBCTEU6NTgsMUJMTDoyMiwxQkxFOjU3MSwyQkxMOjEwNSxPRFQ6MCxBVkI6MTIzXCJcbiIKLSAgICAgICAgImFuZHJvaWRib290LnJhbWR1bXAgPSBcImRpc2FibGVkXCJcbiIKLSAgICAgICAgImFuZHJvaWRib290LnZibWV0YS5kZXZpY2UgPSBcIlBBUlRVVUlEPWFhMDhmMWE0LWM3YzktNDAyZS05YTY2LTk3MDdjYWZhOWNlYlwiXG4iCi0gICAgICAgICJhbmRyb2lkYm9vdC52Ym1ldGEuYXZiX3ZlcnNpb24gPSBcIjEuMVwiXG4iCi0gICAgICAgICJhbmRyb2lkYm9vdC52Ym1ldGEuZGV2aWNlX3N0YXRlID0gXCJ1bmxvY2tlZFwiXG4iCi0gICAgICAgICJhbmRyb2lkYm9vdC52Ym1ldGEuaGFzaF9hbGcgPSBcInNoYTI1NlwiXG4iCi0gICAgICAgICJhbmRyb2lkYm9vdC52Ym1ldGEuc2l6ZSA9IFwiNTI0OFwiXG4iCi0gICAgICAgICJhbmRyb2lkYm9vdC52Ym1ldGEuZGlnZXN0ID0gXCIiCi0gICAgICAgICJhYzEzMTQ3ZTk1OTg2MWMyMGYyYTZkYTk3ZDI1ZmU3OWU2MGU5MDJjMDIyYTM3MWM1YzAzOWQzMWU3YzY4ODYwXCJcbiIKLSAgICAgICAgImFuZHJvaWRib290LnZibWV0YS5pbnZhbGlkYXRlX29uX2Vycm9yID0gXCJ5ZXNcIlxuIgotICAgICAgICAiYW5kcm9pZGJvb3QudmVyaXR5bW9kZSA9IFwiZW5mb3JjaW5nXCJcbiIKLSAgICAgICAgImFuZHJvaWRib290LnZlcmlmaWVkYm9vdHN0YXRlID0gXCJvcmFuZ2VcIlxuIgotICAgICAgICAiYW5kcm9pZGJvb3Quc3BhY2UgPSBcInNoYTI1NiA1MjQ4IGFuZHJvaWRib290Lm5vc3BhY2UgPSBub3BlXCJcbiI7Citjb25zdCBzdGQ6OnN0cmluZyBib290Y29uZmlnID0gUiIoCithbmRyb2lkYm9vdC5ib290ZGV2aWNlID0gIjFkODQwMDAudWZzaGMiCithbmRyb2lkYm9vdC5ib290X2RldmljZXMgPSAiZGV2MSIsICJkZXYyLHdpdGhjb21tYSIsICJkZXYzIgorYW5kcm9pZGJvb3QuYmFzZWJhbmQgPSAic2R5IgorYW5kcm9pZGJvb3Qua2V5bWFzdGVyID0gIjEiCithbmRyb2lkYm9vdC5zZXJpYWxubyA9ICJCTEFIQkxBSEJMQUgiCithbmRyb2lkYm9vdC5zbG90X3N1ZmZpeCA9ICJfYSIKK2FuZHJvaWRib290LmhhcmR3YXJlLnBsYXRmb3JtID0gInNkdzgxMyIKK2FuZHJvaWRib290LmhhcmR3YXJlID0gImZvbyIKK2FuZHJvaWRib290LnJldmlzaW9uID0gIkVWVDEuMCIKK2FuZHJvaWRib290LmJvb3Rsb2FkZXIgPSAiYnVycC0wLjEtNzUyMSIKK2FuZHJvaWRib290LmhhcmR3YXJlLnNrdSA9ICJtYXJ5IgorYW5kcm9pZGJvb3QuaGFyZHdhcmUucmFkaW8uc3VidHlwZSA9ICIwIgorYW5kcm9pZGJvb3QuZHRib19pZHggPSAiMiIKK2FuZHJvaWRib290Lm1vZGUgPSAibm9ybWFsIgorYW5kcm9pZGJvb3QuaGFyZHdhcmUuZGRyID0gIjFHQixjb21idWNoaSxMUEREUjRYIgorYW5kcm9pZGJvb3QuZGRyX2luZm8gPSAiY29tYnVjaGlhbmRyb2lkYm9vdC5kZHJfc2l6ZT0yR0IiCithbmRyb2lkYm9vdC5oYXJkd2FyZS51ZnMgPSAiMkdCLGNvbWJ1c2hpIgorYW5kcm9pZGJvb3QuYm9vdHRpbWUgPSAiMEJMRTo1OCwxQkxMOjIyLDFCTEU6NTcxLDJCTEw6MTA1LE9EVDowLEFWQjoxMjMiCithbmRyb2lkYm9vdC5yYW1kdW1wID0gImRpc2FibGVkIgorYW5kcm9pZGJvb3QudmJtZXRhLmRldmljZSA9ICJQQVJUVVVJRD1hYTA4ZjFhNC1jN2M5LTQwMmUtOWE2Ni05NzA3Y2FmYTljZWIiCithbmRyb2lkYm9vdC52Ym1ldGEuYXZiX3ZlcnNpb24gPSAiMS4xIgorYW5kcm9pZGJvb3QudmJtZXRhLmRldmljZV9zdGF0ZSA9ICJ1bmxvY2tlZCIKK2FuZHJvaWRib290LnZibWV0YS5oYXNoX2FsZyA9ICJzaGEyNTYiCithbmRyb2lkYm9vdC52Ym1ldGEuc2l6ZSA9ICI1MjQ4IgorYW5kcm9pZGJvb3QudmJtZXRhLmRpZ2VzdCA9ICJhYzEzMTQ3ZTk1OTg2MWMyMGYyYTZkYTk3ZDI1ZmU3OWU2MGU5MDJjMDIyYTM3MWM1YzAzOWQzMWU3YzY4ODYwIgorYW5kcm9pZGJvb3QudmJtZXRhLmludmFsaWRhdGVfb25fZXJyb3IgPSAieWVzIgorYW5kcm9pZGJvb3QudmVyaXR5bW9kZSA9ICJlbmZvcmNpbmciCithbmRyb2lkYm9vdC52ZXJpZmllZGJvb3RzdGF0ZSA9ICJvcmFuZ2UiCithbmRyb2lkYm9vdC5zcGFjZSA9ICJzaGEyNTYgNTI0OCBhbmRyb2lkYm9vdC5ub3NwYWNlID0gbm9wZSIKK2p1c3Qua2V5CitrZXkuZW1wdHkudmFsdWUgPQorZGVzc2VydC52YWx1ZSA9ICJpY2UsIGNyZWFtIgorZGVzc2VydC5saXN0ID0gImljZSIsICJjcmVhbSIKK2FtYmlndW91cy5saXN0ID0gIiwgIiwgIiwgIgorKSI7CiAKIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiBib290Y29uZmlnX3Jlc3VsdF9zcGFjZSA9IHsKICAgICAgICAgeyJhbmRyb2lkYm9vdC5ib290ZGV2aWNlIiwgIjFkODQwMDAudWZzaGMifSwKQEAgLTE4Miw2ICsxOTMsMTEgQEAKICAgICAgICAgeyJhbmRyb2lkYm9vdC52ZXJpdHltb2RlIiwgImVuZm9yY2luZyJ9LAogICAgICAgICB7ImFuZHJvaWRib290LnZlcmlmaWVkYm9vdHN0YXRlIiwgIm9yYW5nZSJ9LAogICAgICAgICB7ImFuZHJvaWRib290LnNwYWNlIiwgInNoYTI1NiA1MjQ4IGFuZHJvaWRib290Lm5vc3BhY2UgPSBub3BlIn0sCisgICAgICAgIHsianVzdC5rZXkiLCAiIn0sCisgICAgICAgIHsia2V5LmVtcHR5LnZhbHVlIiwgIiJ9LAorICAgICAgICB7ImRlc3NlcnQudmFsdWUiLCAiaWNlLCBjcmVhbSJ9LAorICAgICAgICB7ImRlc3NlcnQubGlzdCIsICJpY2UsY3JlYW0ifSwKKyAgICAgICAgeyJhbWJpZ3VvdXMubGlzdCIsICIsICwsICJ9LAogfTsKIAogYm9vbCBDb21wYXJlRmxhZ3MoRnN0YWJFbnRyeTo6RnNNZ3JGbGFncyYgbGhzLCBGc3RhYkVudHJ5OjpGc01nckZsYWdzJiByaHMpIHsKQEAgLTIxMiw0NCArMjI4LDYxIEBACiAKIH0gIC8vIG5hbWVzcGFjZQogCi1URVNUKGZzX21nciwgZnNfbWdyX3BhcnNlX2NtZGxpbmUpIHsKLSAgICBFWFBFQ1RfRVEocmVzdWx0X3NwYWNlLCBmc19tZ3JfcGFyc2VfY21kbGluZShjbWRsaW5lKSk7CitURVNUKGZzX21nciwgSW1wb3J0S2VybmVsQ21kbGluZSkgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiByZXN1bHQ7CisgICAgSW1wb3J0S2VybmVsQ21kbGluZUZyb21TdHJpbmcoCisgICAgICAgICAgICBjbWRsaW5lLCBbJl0oc3RkOjpzdHJpbmcga2V5LCBzdGQ6OnN0cmluZyB2YWx1ZSkgeyByZXN1bHQuZW1wbGFjZV9iYWNrKGtleSwgdmFsdWUpOyB9KTsKKyAgICBFWFBFQ1RfVEhBVChyZXN1bHQsIENvbnRhaW5lckVxKHJlc3VsdF9zcGFjZSkpOwogfQogCi1URVNUKGZzX21nciwgZnNfbWdyX2dldF9ib290X2NvbmZpZ19mcm9tX2tlcm5lbF9jbWRsaW5lKSB7CitURVNUKGZzX21nciwgR2V0S2VybmVsQ21kbGluZSkgewogICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnQ7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBlbnRyeSA6IHJlc3VsdF9zcGFjZSkgewotICAgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIgYW5kcm9pZGJvb3RbXSA9ICJhbmRyb2lkYm9vdC4iOwotICAgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGgoZW50cnkuZmlyc3QsIGFuZHJvaWRib290KSkgY29udGludWU7Ci0gICAgICAgIGF1dG8ga2V5ID0gZW50cnkuZmlyc3Quc3Vic3RyKHN0cmxlbihhbmRyb2lkYm9vdCkpOwotICAgICAgICBFWFBFQ1RfVFJVRShmc19tZ3JfZ2V0X2Jvb3RfY29uZmlnX2Zyb21fa2VybmVsKGNtZGxpbmUsIGtleSwgJmNvbnRlbnQpKSA8PCAiIGZvciAiIDw8IGtleTsKLSAgICAgICAgRVhQRUNUX0VRKGVudHJ5LnNlY29uZCwgY29udGVudCk7Ci0gICAgfQotICAgIEVYUEVDVF9GQUxTRShmc19tZ3JfZ2V0X2Jvb3RfY29uZmlnX2Zyb21fa2VybmVsKGNtZGxpbmUsICJ2Ym1ldGEuYXZiX3ZlcnNpbyIsICZjb250ZW50KSk7Ci0gICAgRVhQRUNUX1RSVUUoY29udGVudC5lbXB0eSgpKSA8PCBjb250ZW50OwotICAgIEVYUEVDVF9GQUxTRShmc19tZ3JfZ2V0X2Jvb3RfY29uZmlnX2Zyb21fa2VybmVsKGNtZGxpbmUsICJub3NwYWNlIiwgJmNvbnRlbnQpKTsKLSAgICBFWFBFQ1RfVFJVRShjb250ZW50LmVtcHR5KCkpIDw8IGNvbnRlbnQ7Ci19Ci0KLVRFU1QoZnNfbWdyLCBmc19tZ3JfcGFyc2VfYm9vdGNvbmZpZykgewotICAgIEVYUEVDVF9FUShib290Y29uZmlnX3Jlc3VsdF9zcGFjZSwgZnNfbWdyX3BhcnNlX3Byb2NfYm9vdGNvbmZpZyhib290Y29uZmlnKSk7Ci19Ci0KLVRFU1QoZnNfbWdyLCBmc19tZ3JfZ2V0X2Jvb3RfY29uZmlnX2Zyb21fYm9vdGNvbmZpZykgewotICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnQ7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBlbnRyeSA6IGJvb3Rjb25maWdfcmVzdWx0X3NwYWNlKSB7Ci0gICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBhbmRyb2lkYm9vdFtdID0gImFuZHJvaWRib290LiI7Ci0gICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aChlbnRyeS5maXJzdCwgYW5kcm9pZGJvb3QpKSBjb250aW51ZTsKLSAgICAgICAgYXV0byBrZXkgPSBlbnRyeS5maXJzdC5zdWJzdHIoc3RybGVuKGFuZHJvaWRib290KSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGZzX21ncl9nZXRfYm9vdF9jb25maWdfZnJvbV9ib290Y29uZmlnKGJvb3Rjb25maWcsIGtleSwgJmNvbnRlbnQpKQotICAgICAgICAgICAgICAgIDw8ICIgZm9yICIgPDwga2V5OwotICAgICAgICBFWFBFQ1RfRVEoZW50cnkuc2Vjb25kLCBjb250ZW50KTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIFtrZXksIHZhbHVlXSA6IHJlc3VsdF9zcGFjZSkgeworICAgICAgICBFWFBFQ1RfVFJVRShHZXRLZXJuZWxDbWRsaW5lRnJvbVN0cmluZyhjbWRsaW5lLCBrZXksICZjb250ZW50KSkgPDwgIiBmb3IgIiA8PCBrZXk7CisgICAgICAgIEVYUEVDVF9FUShjb250ZW50LCB2YWx1ZSk7CiAgICAgfQogCi0gICAgRVhQRUNUX0ZBTFNFKGZzX21ncl9nZXRfYm9vdF9jb25maWdfZnJvbV9ib290Y29uZmlnKGJvb3Rjb25maWcsICJ2Ym1ldGEuYXZiX3ZlcnNpbyIsICZjb250ZW50KSk7Ci0gICAgRVhQRUNUX1RSVUUoY29udGVudC5lbXB0eSgpKSA8PCBjb250ZW50OwotICAgIEVYUEVDVF9GQUxTRShmc19tZ3JfZ2V0X2Jvb3RfY29uZmlnX2Zyb21fYm9vdGNvbmZpZyhib290Y29uZmlnLCAibm9zcGFjZSIsICZjb250ZW50KSk7Ci0gICAgRVhQRUNUX1RSVUUoY29udGVudC5lbXB0eSgpKSA8PCBjb250ZW50OworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGtVbm1vZGlmaWVkVG9rZW4gPSAiPFVOTU9ESUZJRUQ+IjsKKyAgICBjb250ZW50ID0ga1VubW9kaWZpZWRUb2tlbjsKKyAgICBFWFBFQ1RfRkFMU0UoR2V0S2VybmVsQ21kbGluZUZyb21TdHJpbmcoY21kbGluZSwgIiIsICZjb250ZW50KSk7CisgICAgRVhQRUNUX0VRKGNvbnRlbnQsIGtVbm1vZGlmaWVkVG9rZW4pIDw8ICJvdXRwdXQgcGFyYW1ldGVyIHNob3VsZG4ndCBiZSBvdmVycmlkZGVuIjsKKworICAgIGNvbnRlbnQgPSBrVW5tb2RpZmllZFRva2VuOworICAgIEVYUEVDVF9GQUxTRShHZXRLZXJuZWxDbWRsaW5lRnJvbVN0cmluZyhjbWRsaW5lLCAiYW5kcm9pZGJvb3QudmJtZXRhLmF2Yl92ZXJzaW8iLCAmY29udGVudCkpOworICAgIEVYUEVDVF9FUShjb250ZW50LCBrVW5tb2RpZmllZFRva2VuKSA8PCAib3V0cHV0IHBhcmFtZXRlciBzaG91bGRuJ3QgYmUgb3ZlcnJpZGRlbiI7CisKKyAgICBjb250ZW50ID0ga1VubW9kaWZpZWRUb2tlbjsKKyAgICBFWFBFQ1RfRkFMU0UoR2V0S2VybmVsQ21kbGluZUZyb21TdHJpbmcoYm9vdGNvbmZpZywgImFuZHJvaWRib290Lm5vc3BhY2UiLCAmY29udGVudCkpOworICAgIEVYUEVDVF9FUShjb250ZW50LCBrVW5tb2RpZmllZFRva2VuKSA8PCAib3V0cHV0IHBhcmFtZXRlciBzaG91bGRuJ3QgYmUgb3ZlcnJpZGRlbiI7Cit9CisKK1RFU1QoZnNfbWdyLCBJbXBvcnRCb290Y29uZmlnKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+IHJlc3VsdDsKKyAgICBJbXBvcnRCb290Y29uZmlnRnJvbVN0cmluZyhib290Y29uZmlnLCBbJl0oc3RkOjpzdHJpbmcga2V5LCBzdGQ6OnN0cmluZyB2YWx1ZSkgeworICAgICAgICByZXN1bHQuZW1wbGFjZV9iYWNrKGtleSwgdmFsdWUpOworICAgIH0pOworICAgIEVYUEVDVF9USEFUKHJlc3VsdCwgQ29udGFpbmVyRXEoYm9vdGNvbmZpZ19yZXN1bHRfc3BhY2UpKTsKK30KKworVEVTVChmc19tZ3IsIEdldEJvb3Rjb25maWcpIHsKKyAgICBzdGQ6OnN0cmluZyBjb250ZW50OworICAgIGZvciAoY29uc3QgYXV0byYgW2tleSwgdmFsdWVdIDogYm9vdGNvbmZpZ19yZXN1bHRfc3BhY2UpIHsKKyAgICAgICAgRVhQRUNUX1RSVUUoR2V0Qm9vdGNvbmZpZ0Zyb21TdHJpbmcoYm9vdGNvbmZpZywga2V5LCAmY29udGVudCkpIDw8ICIgZm9yICIgPDwga2V5OworICAgICAgICBFWFBFQ1RfRVEoY29udGVudCwgdmFsdWUpOworICAgIH0KKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGtVbm1vZGlmaWVkVG9rZW4gPSAiPFVOTU9ESUZJRUQ+IjsKKyAgICBjb250ZW50ID0ga1VubW9kaWZpZWRUb2tlbjsKKyAgICBFWFBFQ1RfRkFMU0UoR2V0Qm9vdGNvbmZpZ0Zyb21TdHJpbmcoYm9vdGNvbmZpZywgIiIsICZjb250ZW50KSk7CisgICAgRVhQRUNUX0VRKGNvbnRlbnQsIGtVbm1vZGlmaWVkVG9rZW4pIDw8ICJvdXRwdXQgcGFyYW1ldGVyIHNob3VsZG4ndCBiZSBvdmVycmlkZGVuIjsKKworICAgIGNvbnRlbnQgPSBrVW5tb2RpZmllZFRva2VuOworICAgIEVYUEVDVF9GQUxTRShHZXRCb290Y29uZmlnRnJvbVN0cmluZyhib290Y29uZmlnLCAiYW5kcm9pZGJvb3QudmJtZXRhLmF2Yl92ZXJzaW8iLCAmY29udGVudCkpOworICAgIEVYUEVDVF9FUShjb250ZW50LCBrVW5tb2RpZmllZFRva2VuKSA8PCAib3V0cHV0IHBhcmFtZXRlciBzaG91bGRuJ3QgYmUgb3ZlcnJpZGRlbiI7CisKKyAgICBjb250ZW50ID0ga1VubW9kaWZpZWRUb2tlbjsKKyAgICBFWFBFQ1RfRkFMU0UoR2V0Qm9vdGNvbmZpZ0Zyb21TdHJpbmcoYm9vdGNvbmZpZywgImFuZHJvaWRib290Lm5vc3BhY2UiLCAmY29udGVudCkpOworICAgIEVYUEVDVF9FUShjb250ZW50LCBrVW5tb2RpZmllZFRva2VuKSA8PCAib3V0cHV0IHBhcmFtZXRlciBzaG91bGRuJ3QgYmUgb3ZlcnJpZGRlbiI7CiB9CiAKIFRFU1QoZnNfbWdyLCBmc19tZ3JfcmVhZF9mc3RhYl9maWxlX3Byb2NfbW91bnRzKSB7CkBAIC0zMDAsNiArMzMzLDcgQEAKICAgICAgICAgICAgICAgICB7InByaXZhdGUiLCBNU19QUklWQVRFfSwKICAgICAgICAgICAgICAgICB7InNsYXZlIiwgTVNfU0xBVkV9LAogICAgICAgICAgICAgICAgIHsic2hhcmVkIiwgTVNfU0hBUkVEfSwKKyAgICAgICAgICAgICAgICB7Imxhenl0aW1lIiwgTVNfTEFaWVRJTUV9LAogICAgICAgICAgICAgICAgIHsiZGVmYXVsdHMiLCAwfSwKICAgICAgICAgICAgICAgICB7MCwgMH0sCiAgICAgICAgIH07CkBAIC00OTcsNiArNTMxLDcgQEAKICAgICBFWFBFQ1RfRVEoIm5vbmUwIiwgZW50cnktPm1vdW50X3BvaW50KTsKICAgICB7CiAgICAgICAgIEZzdGFiRW50cnk6OkZzTWdyRmxhZ3MgZmxhZ3MgPSB7fTsKKyAgICAgICAgZmxhZ3MuZmlsZV9lbmNyeXB0aW9uID0gdHJ1ZTsKICAgICAgICAgRVhQRUNUX1RSVUUoQ29tcGFyZUZsYWdzKGZsYWdzLCBlbnRyeS0+ZnNfbWdyX2ZsYWdzKSk7CiAgICAgfQogICAgIEVYUEVDVF9FUSgiIiwgZW50cnktPm1ldGFkYXRhX2tleV9kaXIpOwpAQCAtNjc1LDYgKzcxMCw3IEBACiBzb3VyY2Ugbm9uZTMgICAgICAgc3dhcCAgIGRlZmF1bHRzICAgICAgenJhbXNpemU9NSUKIHNvdXJjZSBub25lNCAgICAgICBzd2FwICAgZGVmYXVsdHMgICAgICB6cmFtc2l6ZT0xMDUlCiBzb3VyY2Ugbm9uZTUgICAgICAgc3dhcCAgIGRlZmF1bHRzICAgICAgenJhbXNpemU9JQorc291cmNlIG5vbmU2ICAgICAgIHN3YXAgICBkZWZhdWx0cyAgICAgIHpyYW1zaXplPTIxMCUKIClmcyI7CiAgICAgQVNTRVJUX1RSVUUoYW5kcm9pZDo6YmFzZTo6V3JpdGVTdHJpbmdUb0ZpbGUoZnN0YWJfY29udGVudHMsIHRmLnBhdGgpKTsKIApAQCAtNzA3LDEyICs3NDMsMTcgQEAKIAogICAgIEVYUEVDVF9FUSgibm9uZTQiLCBlbnRyeS0+bW91bnRfcG9pbnQpOwogICAgIEVYUEVDVF9UUlVFKENvbXBhcmVGbGFncyhmbGFncywgZW50cnktPmZzX21ncl9mbGFncykpOwotICAgIEVYUEVDVF9FUSgwLCBlbnRyeS0+enJhbV9zaXplKTsKKyAgICBFWFBFQ1RfTkUoMCwgZW50cnktPnpyYW1fc2l6ZSk7CiAgICAgZW50cnkrKzsKIAogICAgIEVYUEVDVF9FUSgibm9uZTUiLCBlbnRyeS0+bW91bnRfcG9pbnQpOwogICAgIEVYUEVDVF9UUlVFKENvbXBhcmVGbGFncyhmbGFncywgZW50cnktPmZzX21ncl9mbGFncykpOwogICAgIEVYUEVDVF9FUSgwLCBlbnRyeS0+enJhbV9zaXplKTsKKyAgICBlbnRyeSsrOworCisgICAgRVhQRUNUX0VRKCJub25lNiIsIGVudHJ5LT5tb3VudF9wb2ludCk7CisgICAgRVhQRUNUX1RSVUUoQ29tcGFyZUZsYWdzKGZsYWdzLCBlbnRyeS0+ZnNfbWdyX2ZsYWdzKSk7CisgICAgRVhQRUNUX0VRKDAsIGVudHJ5LT56cmFtX3NpemUpOwogfQogCiBURVNUKGZzX21nciwgUmVhZEZzdGFiRnJvbUZpbGVfRnNNZ3JPcHRpb25zX0ZpbGVFbmNyeXB0aW9uKSB7CkBAIC0xMDMyLDIzICsxMDczLDYgQEAKICAgICAgICAgICAgIDw8ICJEZWZhdWx0IGZzdGFiIGRvZXNuJ3QgY29udGFpbiAvZGF0YSBlbnRyeSI7CiB9CiAKLVRFU1QoZnNfbWdyLCBVc2VyZGF0YU1vdW50ZWRGcm9tRGVmYXVsdEZzdGFiKSB7Ci0gICAgaWYgKGdldHVpZCgpICE9IDApIHsKLSAgICAgICAgR1RFU1RfU0tJUCgpIDw8ICJNdXN0IGJlIHJ1biBhcyByb290LiI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRnN0YWIgZnN0YWI7Ci0gICAgQVNTRVJUX1RSVUUoUmVhZERlZmF1bHRGc3RhYigmZnN0YWIpKSA8PCAiRmFpbGVkIHRvIHJlYWQgZGVmYXVsdCBmc3RhYiI7Ci0gICAgRnN0YWIgcHJvY19tb3VudHM7Ci0gICAgQVNTRVJUX1RSVUUoUmVhZEZzdGFiRnJvbUZpbGUoIi9wcm9jL21vdW50cyIsICZwcm9jX21vdW50cykpIDw8ICJGYWlsZWQgdG8gcmVhZCAvcHJvYy9tb3VudHMiOwotICAgIGF1dG8gbW91bnRlZF9lbnRyeSA9IEdldEVudHJ5Rm9yTW91bnRQb2ludCgmcHJvY19tb3VudHMsICIvZGF0YSIpOwotICAgIEFTU0VSVF9ORShtb3VudGVkX2VudHJ5LCBudWxscHRyKSA8PCAiL2RhdGEgaXMgbm90IG1vdW50ZWQiOwotICAgIHN0ZDo6c3RyaW5nIGJsb2NrX2RldmljZTsKLSAgICBBU1NFUlRfVFJVRShhbmRyb2lkOjpiYXNlOjpSZWFscGF0aChtb3VudGVkX2VudHJ5LT5ibGtfZGV2aWNlLCAmYmxvY2tfZGV2aWNlKSk7Ci0gICAgQVNTRVJUX05FKG51bGxwdHIsIGZzX21ncl9nZXRfbW91bnRlZF9lbnRyeV9mb3JfdXNlcmRhdGEoJmZzdGFiLCBibG9ja19kZXZpY2UpKQotICAgICAgICAgICAgPDwgIi9kYXRhIHdhc24ndCBtb3VudGVkIGZyb20gZGVmYXVsdCBmc3RhYiI7Ci19Ci0KIFRFU1QoZnNfbWdyLCBSZWFkRnN0YWJGcm9tRmlsZV9Gc01nck9wdGlvbnNfUmVhZGFoZWFkX1NpemVfS0IpIHsKICAgICBUZW1wb3JhcnlGaWxlIHRmOwogICAgIEFTU0VSVF9UUlVFKHRmLmZkICE9IC0xKTsKZGlmZiAtLWdpdCBhL2ZzX21nci90ZXN0cy9zcmMvY29tL2FuZHJvaWQvdGVzdHMvdmVuZG9yb3ZlcmxheS9WZW5kb3JPdmVybGF5SG9zdFRlc3QuamF2YSBiL2ZzX21nci90ZXN0cy9zcmMvY29tL2FuZHJvaWQvdGVzdHMvdmVuZG9yb3ZlcmxheS9WZW5kb3JPdmVybGF5SG9zdFRlc3QuamF2YQppbmRleCBmMDhjYWIyLi45MWYyMzVjIDEwMDY0NAotLS0gYS9mc19tZ3IvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3Rlc3RzL3ZlbmRvcm92ZXJsYXkvVmVuZG9yT3ZlcmxheUhvc3RUZXN0LmphdmEKKysrIGIvZnNfbWdyL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC90ZXN0cy92ZW5kb3JvdmVybGF5L1ZlbmRvck92ZXJsYXlIb3N0VGVzdC5qYXZhCkBAIC0yMSwxMCArMjEsOCBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLmp1bml0NC5CYXNlSG9zdEpVbml0NFRlc3Q7CiBpbXBvcnQgY29tLmFuZHJvaWQudHJhZGVmZWQudXRpbC5Db21tYW5kUmVzdWx0OwogaW1wb3J0IGNvbS5hbmRyb2lkLnRyYWRlZmVkLnV0aWwuQ29tbWFuZFN0YXR1czsKLQogaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CiBpbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKQEAgLTM4LDkgKzM2LDE1IEBACiBAUnVuV2l0aChEZXZpY2VKVW5pdDRDbGFzc1J1bm5lci5jbGFzcykKIHB1YmxpYyBjbGFzcyBWZW5kb3JPdmVybGF5SG9zdFRlc3QgZXh0ZW5kcyBCYXNlSG9zdEpVbml0NFRlc3QgewogICBib29sZWFuIHdhc1Jvb3QgPSBmYWxzZTsKKyAgU3RyaW5nIHZuZGtWZXJzaW9uID0gbnVsbDsKIAogICBAQmVmb3JlCiAgIHB1YmxpYyB2b2lkIHNldHVwKCkgdGhyb3dzIERldmljZU5vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CisgICAgdm5ka1ZlcnNpb24gPSBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxWMkNvbW1hbmQoImdldHByb3Agcm8udm5kay52ZXJzaW9uIikuZ2V0U3Rkb3V0KCk7CisgICAgQXNzdW1lLmFzc3VtZVRydWUoCisgICAgICAgICJWZW5kb3IgT3ZlcmxheSBpcyBkaXNhYmxlZCBmb3IgVk5ESyBkZXByZWNhdGVkIGRldmljZXMiLAorICAgICAgICB2bmRrVmVyc2lvbiAhPSBudWxsICYmICF2bmRrVmVyc2lvbi50cmltKCkuaXNFbXB0eSgpKTsKKwogICAgIHdhc1Jvb3QgPSBnZXREZXZpY2UoKS5pc0FkYlJvb3QoKTsKICAgICBpZiAoIXdhc1Jvb3QpIHsKICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJUZXN0IHJlcXVpcmVzIHJvb3QiLCBnZXREZXZpY2UoKS5lbmFibGVBZGJSb290KCkpOwpAQCAtNzQsOCArNzgsNiBAQAogICAgKi8KICAgQFRlc3QKICAgcHVibGljIHZvaWQgdGVzdFZlbmRvck92ZXJsYXkoKSB0aHJvd3MgRGV2aWNlTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKLSAgICBTdHJpbmcgdm5ka1ZlcnNpb24gPSBnZXREZXZpY2UoKS5leGVjdXRlU2hlbGxWMkNvbW1hbmQoImdldHByb3Agcm8udm5kay52ZXJzaW9uIikuZ2V0U3Rkb3V0KCk7Ci0KICAgICAvLyBDcmVhdGUgZmlsZXMgYW5kIG1vZGlmeSBwb2xpY3kKICAgICBDb21tYW5kUmVzdWx0IHJlc3VsdCA9IGdldERldmljZSgpLmV4ZWN1dGVTaGVsbFYyQ29tbWFuZCgKICAgICAgICAgImVjaG8gJy8ocHJvZHVjdHxzeXN0ZW0vcHJvZHVjdCkvdmVuZG9yX292ZXJsYXkvIiArIHZuZGtWZXJzaW9uICsKZGlmZiAtLWdpdCBhL2ZzX21nci90ZXN0cy92dHNfZnNfdGVzdC5jcHAgYi9mc19tZ3IvdGVzdHMvdnRzX2ZzX3Rlc3QuY3BwCmluZGV4IGJmMDAzZWUuLmY1NWNhZGIgMTAwNjQ0Ci0tLSBhL2ZzX21nci90ZXN0cy92dHNfZnNfdGVzdC5jcHAKKysrIGIvZnNfbWdyL3Rlc3RzL3Z0c19mc190ZXN0LmNwcApAQCAtMjMsNiArMjMsOCBAQAogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAjaW5jbHVkZSA8bGliZG0vZG0uaD4KIAorI2luY2x1ZGUgIi4uL2ZzX21ncl9wcml2LmgiCisKIHVzaW5nIHRlc3Rpbmc6OkNvbnRhaW5zOwogdXNpbmcgdGVzdGluZzo6Tm90OwogCkBAIC03Miw2ICs3NCw3IEBACiAgICAgQVNTRVJUX0VRKGFjY2VzcygiL3N5cy9mcy9lcm9mcyIsIEZfT0spLCAwKTsKIH0KIAorLy8gQFZzclRlc3QgPSAzLjcuMTAKIFRFU1QoZnMsIFBhcnRpdGlvblR5cGVzKSB7CiAgICAgLy8gUmVxdWlyZW1lbnRzIG9ubHkgYXBwbHkgdG8gQW5kcm9pZCAxMyssIDUuMTArIGRldmljZXMuCiAgICAgaW50IHZzcl9sZXZlbCA9IEdldFZzckxldmVsKCk7CkBAIC05NywxMiArMTAwLDcgQEAKICAgICBBU1NFUlRfVFJVRShhbmRyb2lkOjpiYXNlOjpSZWFkbGluaygiL2Rldi9ibG9jay9ieS1uYW1lL3N1cGVyIiwgJnN1cGVyX2JkZXYpKTsKICAgICBBU1NFUlRfVFJVRShhbmRyb2lkOjpiYXNlOjpSZWFkbGluaygiL2Rldi9ibG9jay9ieS1uYW1lL3VzZXJkYXRhIiwgJnVzZXJkYXRhX2JkZXYpKTsKIAotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtdXN0X2JlX2YyZnMgPSB7Ii9kYXRhIn07Ci0gICAgaWYgKHZzcl9sZXZlbCA+PSBfX0FORFJPSURfQVBJX1VfXyAmJgotICAgICAgICAhRGV2aWNlU3VwcG9ydHNGZWF0dXJlKCJhbmRyb2lkLmhhcmR3YXJlLnR5cGUuYXV0b21vdGl2ZSIpKSB7Ci0gICAgICAgIG11c3RfYmVfZjJmcy5lbXBsYWNlX2JhY2soIi9tZXRhZGF0YSIpOwotICAgIH0KLQorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBkYXRhX2ZzID0geyIvZGF0YSIsICIvbWV0YWRhdGEifTsKICAgICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogZnN0YWIpIHsKICAgICAgICAgc3RkOjpzdHJpbmcgcGFyZW50X2JkZXYgPSBlbnRyeS5ibGtfZGV2aWNlOwogICAgICAgICB3aGlsZSAodHJ1ZSkgewpAQCAtMTM2LDExICsxMzQsMTAgQEAKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhbGxvd2VkID0geyJlcm9mcyIsICJleHQ0IiwgImYyZnMifTsKICAgICAgICAgICAgIEVYUEVDVF9ORShzdGQ6OmZpbmQoYWxsb3dlZC5iZWdpbigpLCBhbGxvd2VkLmVuZCgpLCBlbnRyeS5mc190eXBlKSwgYWxsb3dlZC5lbmQoKSkKICAgICAgICAgICAgICAgICAgICAgPDwgZW50cnkubW91bnRfcG9pbnQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoc3RkOjpmaW5kKG11c3RfYmVfZjJmcy5iZWdpbigpLCBtdXN0X2JlX2YyZnMuZW5kKCksIGVudHJ5Lm1vdW50X3BvaW50KSAhPQotICAgICAgICAgICAgICAgIG11c3RfYmVfZjJmcy5lbmQoKSkgewotICAgICAgICAgICAgICAgIEVYUEVDVF9FUShlbnRyeS5mc190eXBlLCAiZjJmcyIpIDw8IGVudHJ5Lm1vdW50X3BvaW50OwotICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHN0ZDo6ZmluZChkYXRhX2ZzLmJlZ2luKCksIGRhdGFfZnMuZW5kKCksIGVudHJ5Lm1vdW50X3BvaW50KSAhPSBkYXRhX2ZzLmVuZCgpKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gYWxsb3dlZCA9IHsiZXh0NCIsICJmMmZzIn07CisgICAgICAgICAgICBFWFBFQ1RfTkUoc3RkOjpmaW5kKGFsbG93ZWQuYmVnaW4oKSwgYWxsb3dlZC5lbmQoKSwgZW50cnkuZnNfdHlwZSksIGFsbG93ZWQuZW5kKCkpCisgICAgICAgICAgICAgICAgICAgIDw8IGVudHJ5Lm1vdW50X3BvaW50IDw8ICIsICIgPDwgZW50cnkuZnNfdHlwZTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2ZzX21nci90b29scy9kbWN0bC5jcHAgYi9mc19tZ3IvdG9vbHMvZG1jdGwuY3BwCmluZGV4IDcyNzMwODcuLjAwZjgwMzggMTAwNjQ0Ci0tLSBhL2ZzX21nci90b29scy9kbWN0bC5jcHAKKysrIGIvZnNfbWdyL3Rvb2xzL2RtY3RsLmNwcApAQCAtNTAsOCArNTAsMTAgQEAKICAgICBzdGQ6OmNlcnIgPDwgIiAgY3JlYXRlIDxkbS1uYW1lPiBbLXJvXSA8dGFyZ2V0cy4uLj4iIDw8IHN0ZDo6ZW5kbDsKICAgICBzdGQ6OmNlcnIgPDwgIiAgZGVsZXRlIDxkbS1uYW1lPiIgPDwgc3RkOjplbmRsOwogICAgIHN0ZDo6Y2VyciA8PCAiICBsaXN0IDxkZXZpY2VzIHwgdGFyZ2V0cz4gWy12XSIgPDwgc3RkOjplbmRsOworICAgIHN0ZDo6Y2VyciA8PCAiICBtZXNzYWdlIDxkbS1uYW1lPiA8c2VjdG9yPiA8bWVzc2FnZT4iIDw8IHN0ZDo6ZW5kbDsKICAgICBzdGQ6OmNlcnIgPDwgIiAgZ2V0cGF0aCA8ZG0tbmFtZT4iIDw8IHN0ZDo6ZW5kbDsKICAgICBzdGQ6OmNlcnIgPDwgIiAgZ2V0dXVpZCA8ZG0tbmFtZT4iIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNlcnIgPDwgIiAgaW1hIDxkbS1uYW1lPiIgPDwgc3RkOjplbmRsOwogICAgIHN0ZDo6Y2VyciA8PCAiICBpbmZvIDxkbS1uYW1lPiIgPDwgc3RkOjplbmRsOwogICAgIHN0ZDo6Y2VyciA8PCAiICByZXBsYWNlIDxkbS1uYW1lPiA8dGFyZ2V0cy4uLj4iIDw8IHN0ZDo6ZW5kbDsKICAgICBzdGQ6OmNlcnIgPDwgIiAgc3RhdHVzIDxkbS1uYW1lPiIgPDwgc3RkOjplbmRsOwpAQCAtMTE1LDYgKzExNywyMSBAQAogICAgICAgICAgICAgc3RkOjpzdHJpbmcgYmxvY2tfZGV2aWNlID0gTmV4dEFyZygpOwogICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8RG1UYXJnZXRBbmRyb2lkVmVyaXR5PihzdGFydF9zZWN0b3IsIG51bV9zZWN0b3JzLCBrZXlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfZGV2aWNlKTsKKyAgICAgICAgfSBlbHNlIGlmICh0YXJnZXRfdHlwZSA9PSAic3RyaXBlZCIpIHsKKyAgICAgICAgICAgIGlmICghSGFzQXJncygzKSkgeworICAgICAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiRXhwZWN0ZWQgXCJzdHJpcGVkXCIgPGJsb2NrX2RldmljZTA+IDxibG9ja19kZXZpY2UxPiA8Y2h1bmtzaXplPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjpzdHJpbmcgYmxvY2tfZGV2aWNlMCA9IE5leHRBcmcoKTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGJsb2NrX2RldmljZTEgPSBOZXh0QXJnKCk7CisgICAgICAgICAgICB1aW50NjRfdCBjaHVua19zaXplOworICAgICAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpQYXJzZVVpbnQoTmV4dEFyZygpLCAmY2h1bmtfc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OmNlcnIgPDwgIkV4cGVjdGVkIHN0YXJ0IHNlY3RvciwgZ290OiAiIDw8IFByZXZpb3VzQXJnKCkgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8RG1UYXJnZXRTdHJpcGU+KHN0YXJ0X3NlY3RvciwgbnVtX3NlY3RvcnMsIGNodW5rX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfZGV2aWNlMCwgYmxvY2tfZGV2aWNlMSk7CiAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0X3R5cGUgPT0gImJvdyIpIHsKICAgICAgICAgICAgIGlmICghSGFzQXJncygxKSkgewogICAgICAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiRXhwZWN0ZWQgXCJib3dcIiA8YmxvY2tfZGV2aWNlPiIgPDwgc3RkOjplbmRsOwpAQCAtMTg3LDYgKzIwNCw0NiBAQAogICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8RG1UYXJnZXRVc2VyPihzdGFydF9zZWN0b3IsIG51bV9zZWN0b3JzLCBjb250cm9sX2RldmljZSk7CiAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0X3R5cGUgPT0gImVycm9yIikgewogICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8RG1UYXJnZXRFcnJvcj4oc3RhcnRfc2VjdG9yLCBudW1fc2VjdG9ycyk7CisgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0X3R5cGUgPT0gInRoaW4tcG9vbCIpIHsKKyAgICAgICAgICAgIGlmICghSGFzQXJncyg0KSkgeworICAgICAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiRXhwZWN0ZWQgXCJ0aGluLXBvb2xcIiA8bWV0YWRhdGEgZGV2PiA8ZGF0YSBkZXY+IDxkYXRhIGJsb2NrIHNpemU+ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxsb3cgd2F0ZXIgbWFyaz4gPGZlYXR1cmUgYXJncz4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWV0YWRhdGFfZGV2ID0gTmV4dEFyZygpOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGF0YV9kZXYgPSBOZXh0QXJnKCk7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBkYXRhX2Jsb2NrX3NpemVfc3RyID0gTmV4dEFyZygpOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbG93X3dhdGVyX21hcmtfc3RyID0gTmV4dEFyZygpOworCisgICAgICAgICAgICB1aW50NjRfdCBkYXRhX2Jsb2NrX3NpemU7CisgICAgICAgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlBhcnNlVWludChkYXRhX2Jsb2NrX3NpemVfc3RyLCAmZGF0YV9ibG9ja19zaXplKSkgeworICAgICAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiRGF0YSBibG9jayBzaXplIG11c3QgYmUgYW4gdW5zaWduZWQgaW50ZWdlci5cbiI7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1aW50NjRfdCBsb3dfd2F0ZXJfbWFyazsKKyAgICAgICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UGFyc2VVaW50KGxvd193YXRlcl9tYXJrX3N0ciwgJmxvd193YXRlcl9tYXJrKSkgeworICAgICAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiTG93IHdhdGVyIG1hcmsgbXVzdCBiZSBhbiB1bnNpZ25lZCBpbnRlZ2VyLlxuIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPERtVGFyZ2V0VGhpblBvb2w+KHN0YXJ0X3NlY3RvciwgbnVtX3NlY3RvcnMsIG1ldGFkYXRhX2RldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZGV2LCBkYXRhX2Jsb2NrX3NpemUsIGxvd193YXRlcl9tYXJrKTsKKyAgICAgICAgfSBlbHNlIGlmICh0YXJnZXRfdHlwZSA9PSAidGhpbiIpIHsKKyAgICAgICAgICAgIGlmICghSGFzQXJncygyKSkgeworICAgICAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCAiRXhwZWN0ZWQgXCJ0aGluXCIgPHBvb2wgZGV2PiA8ZGV2IGlkPiIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGQ6OnN0cmluZyBwb29sX2RldiA9IE5leHRBcmcoKTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRldl9pZF9zdHIgPSBOZXh0QXJnKCk7CisKKyAgICAgICAgICAgIHVpbnQ2NF90IGRldl9pZDsKKyAgICAgICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UGFyc2VVaW50KGRldl9pZF9zdHIsICZkZXZfaWQpKSB7CisgICAgICAgICAgICAgICAgc3RkOjpjZXJyIDw8ICJEZXYgaWQgbXVzdCBiZSBhbiB1bnNpZ25lZCBpbnRlZ2VyLlxuIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPERtVGFyZ2V0VGhpbj4oc3RhcnRfc2VjdG9yLCBudW1fc2VjdG9ycywgcG9vbF9kZXYsIGRldl9pZCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzdGQ6OmNlcnIgPDwgIlVucmVjb2duaXplZCB0YXJnZXQgdHlwZTogIiA8PCB0YXJnZXRfdHlwZSA8PCBzdGQ6OmVuZGw7CiAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKQEAgLTQwMSw2ICs0NTgsMjQgQEAKICAgICByZXR1cm4gLUVJTlZBTDsKIH0KIAorc3RhdGljIGludCBEbU1lc3NhZ2VDbWRIYW5kbGVyKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIGlmIChhcmdjICE9IDMpIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJVc2FnZTogZG1jdGwgbWVzc2FnZSA8bmFtZT4gPHNlY3Rvcj4gPG1lc3NhZ2U+IiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICB1aW50NjRfdCBzZWN0b3I7CisgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpQYXJzZVVpbnQoYXJndlsxXSwgJnNlY3RvcikpIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJJbnZhbGlkIGFyZ3VtZW50IGZvciBzZWN0b3I6ICIgPDwgYXJndlsxXSA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBEZXZpY2VNYXBwZXImIGRtID0gRGV2aWNlTWFwcGVyOjpJbnN0YW5jZSgpOworICAgIGlmICghZG0uU2VuZE1lc3NhZ2UoYXJndlswXSwgc2VjdG9yLCBhcmd2WzJdKSkgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIkNvdWxkIG5vdCBzZW5kIG1lc3NhZ2UgdG8gIiA8PCBhcmd2WzBdIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIHJldHVybiAwOworfQorCiBzdGF0aWMgaW50IEhlbHBDbWRIYW5kbGVyKGludCAvKiBhcmdjICovLCBjaGFyKiogLyogYXJndiAqLykgewogICAgIFVzYWdlKCk7CiAgICAgcmV0dXJuIDA7CkBAIC00OTMsNyArNTY4LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOwogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1vZGUgPT0gImltYSIpIHsKKyAgICAgICAgaWYgKCFkbS5HZXRUYWJsZVN0YXR1c0ltYShhcmd2WzBdLCAmdGFibGUpKSB7CisgICAgICAgICAgICBzdGQ6OmNlcnIgPDwgIkNvdWxkIG5vdCBxdWVyeSB0YWJsZSBzdGF0dXMgb2YgZGV2aWNlIFwiIiA8PCBhcmd2WzBdIDw8ICJcIi4iCisgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KICAgICB9CisKICAgICBzdGQ6OmNvdXQgPDwgIlRhcmdldHMgaW4gdGhlIGRldmljZS1tYXBwZXIgdGFibGUgZm9yICIgPDwgYXJndlswXSA8PCAiOiIgPDwgc3RkOjplbmRsOwogICAgIGZvciAoY29uc3QgYXV0byYgdGFyZ2V0IDogdGFibGUpIHsKICAgICAgICAgc3RkOjpjb3V0IDw8IHRhcmdldC5zcGVjLnNlY3Rvcl9zdGFydCA8PCAiLSIKQEAgLTUxNSw2ICs1OTcsMTAgQEAKICAgICByZXR1cm4gRHVtcFRhYmxlKCJzdGF0dXMiLCBhcmdjLCBhcmd2KTsKIH0KIAorc3RhdGljIGludCBJbWFDbWRIYW5kbGVyKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIHJldHVybiBEdW1wVGFibGUoImltYSIsIGFyZ2MsIGFyZ3YpOworfQorCiBzdGF0aWMgaW50IFJlc3VtZUNtZEhhbmRsZXIoaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CiAgICAgaWYgKGFyZ2MgIT0gMSkgewogICAgICAgICBzdGQ6OmNlcnIgPDwgIkludmFsaWQgYXJndW1lbnRzLCBzZWUgXCdkbWN0bCBoZWxwXCciIDw8IHN0ZDo6ZW5kbDsKQEAgLTU0OSwxMiArNjM1LDE0IEBACiAgICAgICAgIHsiZGVsZXRlIiwgRG1EZWxldGVDbWRIYW5kbGVyfSwKICAgICAgICAgeyJyZXBsYWNlIiwgRG1SZXBsYWNlQ21kSGFuZGxlcn0sCiAgICAgICAgIHsibGlzdCIsIERtTGlzdENtZEhhbmRsZXJ9LAorICAgICAgICB7Im1lc3NhZ2UiLCBEbU1lc3NhZ2VDbWRIYW5kbGVyfSwKICAgICAgICAgeyJoZWxwIiwgSGVscENtZEhhbmRsZXJ9LAogICAgICAgICB7ImdldHBhdGgiLCBHZXRQYXRoQ21kSGFuZGxlcn0sCiAgICAgICAgIHsiZ2V0dXVpZCIsIEdldFV1aWRDbWRIYW5kbGVyfSwKICAgICAgICAgeyJpbmZvIiwgSW5mb0NtZEhhbmRsZXJ9LAogICAgICAgICB7InRhYmxlIiwgVGFibGVDbWRIYW5kbGVyfSwKICAgICAgICAgeyJzdGF0dXMiLCBTdGF0dXNDbWRIYW5kbGVyfSwKKyAgICAgICAgeyJpbWEiLCBJbWFDbWRIYW5kbGVyfSwKICAgICAgICAgeyJyZXN1bWUiLCBSZXN1bWVDbWRIYW5kbGVyfSwKICAgICAgICAgeyJzdXNwZW5kIiwgU3VzcGVuZENtZEhhbmRsZXJ9LAogICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb24KZGlmZiAtLWdpdCBhL2dhdGVrZWVwZXJkL0FuZHJvaWQuYnAgYi9nYXRla2VlcGVyZC9BbmRyb2lkLmJwCmluZGV4IDgzOGY3MzQuLjUzNGZjMWEgMTAwNjQ0Ci0tLSBhL2dhdGVrZWVwZXJkL0FuZHJvaWQuYnAKKysrIGIvZ2F0ZWtlZXBlcmQvQW5kcm9pZC5icApAQCAtMTgsOCArMTgsOCBAQAogICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJBbmRyb2lkLUFwYWNoZS0yLjAiXSwKIH0KIAotY2NfYmluYXJ5IHsKLSAgICBuYW1lOiAiZ2F0ZWtlZXBlcmQiLAorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJnYXRla2VlcGVyZF9kZWZhdWx0cyIsCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2FsbCIsCiAgICAgICAgICItV2V4dHJhIiwKQEAgLTUyLDYgKzUyLDE2IEBACiAKICAgICBzdGF0aWNfbGliczogWyJsaWJzY3J5cHRfc3RhdGljIl0sCiAgICAgaW5jbHVkZV9kaXJzOiBbImV4dGVybmFsL3NjcnlwdC9saWIvY3J5cHRvIl0sCit9CisKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogImdhdGVrZWVwZXJkIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAiZ2F0ZWtlZXBlcmRfZGVmYXVsdHMiLAorICAgIF0sCisgICAgc3JjczogWworICAgICAgICAibWFpbi5jcHAiLAorICAgIF0sCiAgICAgaW5pdF9yYzogWyJnYXRla2VlcGVyZC5yYyJdLAogfQogCkBAIC04OCwzICs5OCwyMCBAQAogICAgICAgICAibGliYmluZGVyIiwKICAgICBdLAogfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiZ2F0ZWtlZXBlcmRfc2VydmljZV9mdXp6ZXIiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJnYXRla2VlcGVyZF9kZWZhdWx0cyIsCisgICAgICAgICJzZXJ2aWNlX2Z1enplcl9kZWZhdWx0cyIKKyAgICBdLAorICAgIHNyY3M6IFsKKyAgICAgICAgImZ1enplci9HYXRlS2VlcGVyU2VydmljZUZ1enplci5jcHAiLAorICAgIF0sCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICAgY2M6IFsKKyAgICAgICAgICAgICJzdWJyYWhtYW55YW1hbkBnb29nbGUuY29tIiwKKyAgICAgICAgICAgICJzd2lsbGRlbkBnb29nbGUuY29tIiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhdGVrZWVwZXJkL2Z1enplci9HYXRlS2VlcGVyU2VydmljZUZ1enplci5jcHAgYi9nYXRla2VlcGVyZC9mdXp6ZXIvR2F0ZUtlZXBlclNlcnZpY2VGdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMGQ1ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9nYXRla2VlcGVyZC9mdXp6ZXIvR2F0ZUtlZXBlclNlcnZpY2VGdXp6ZXIuY3BwCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZnV6emJpbmRlci9saWJiaW5kZXJfZHJpdmVyLmg+CisKKyNpbmNsdWRlICJnYXRla2VlcGVyZC5oIgorCit1c2luZyBhbmRyb2lkOjpmdXp6U2VydmljZTsKK3VzaW5nIGFuZHJvaWQ6OkdhdGVLZWVwZXJQcm94eTsKKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGF1dG8gZ2F0ZWtlZXBlclNlcnZpY2UgPSBuZXcgR2F0ZUtlZXBlclByb3h5KCk7CisgICAgZnV6elNlcnZpY2UoZ2F0ZWtlZXBlclNlcnZpY2UsIEZ1enplZERhdGFQcm92aWRlcihkYXRhLCBzaXplKSk7CisgICAgcmV0dXJuIDA7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2F0ZWtlZXBlcmQvZ2F0ZWtlZXBlcmQuY3BwIGIvZ2F0ZWtlZXBlcmQvZ2F0ZWtlZXBlcmQuY3BwCmluZGV4IGViNDNhMzMuLmJkZmI3ZjYgMTAwNjQ0Ci0tLSBhL2dhdGVrZWVwZXJkL2dhdGVrZWVwZXJkLmNwcAorKysgYi9nYXRla2VlcGVyZC9nYXRla2VlcGVyZC5jcHAKQEAgLTEzLDExICsxMyw5IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotCiAjZGVmaW5lIExPR19UQUcgImdhdGVrZWVwZXJkIgogCi0jaW5jbHVkZSA8YW5kcm9pZC9zZXJ2aWNlL2dhdGVrZWVwZXIvQm5HYXRlS2VlcGVyU2VydmljZS5oPgotI2luY2x1ZGUgPGdhdGVrZWVwZXIvR2F0ZUtlZXBlclJlc3BvbnNlLmg+CisjaW5jbHVkZSAiZ2F0ZWtlZXBlcmQuaCIKIAogI2luY2x1ZGUgPGVuZGlhbi5oPgogI2luY2x1ZGUgPGVycm5vLmg+CkBAIC0zOSwyNSArMzcsMTggQEAKICNpbmNsdWRlIDxsb2cvbG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KIAotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9oYXJkd2FyZS9nYXRla2VlcGVyL0lHYXRla2VlcGVyLmg+CiAjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL2hhcmR3YXJlL3NlY3VyaXR5L2tleW1pbnQvSGFyZHdhcmVBdXRoVG9rZW4uaD4KICNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvc2VjdXJpdHkvYXV0aG9yaXphdGlvbi9JS2V5c3RvcmVBdXRob3JpemF0aW9uLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9nYXRla2VlcGVyLzEuMC9JR2F0ZWtlZXBlci5oPgogI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KIAogdXNpbmcgYW5kcm9pZDo6c3A7CiB1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwogdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmdhdGVrZWVwZXI6OlYxXzA6OkdhdGVrZWVwZXJSZXNwb25zZTsKIHVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpnYXRla2VlcGVyOjpWMV8wOjpHYXRla2VlcGVyU3RhdHVzQ29kZTsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpnYXRla2VlcGVyOjpWMV8wOjpJR2F0ZWtlZXBlcjsKIAogdXNpbmcgQWlkbEdhdGVrZWVwZXJFbnJvbGxSZXNwID0gYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdhdGVrZWVwZXI6OkdhdGVrZWVwZXJFbnJvbGxSZXNwb25zZTsKIHVzaW5nIEFpZGxHYXRla2VlcGVyVmVyaWZ5UmVzcCA9IGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpnYXRla2VlcGVyOjpHYXRla2VlcGVyVmVyaWZ5UmVzcG9uc2U7Ci11c2luZyBBaWRsSUdhdGVrZWVwZXIgPSBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Z2F0ZWtlZXBlcjo6SUdhdGVrZWVwZXI7CiAKLXVzaW5nIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM7Ci11c2luZyA6OmFuZHJvaWQ6OnNlcnZpY2U6OmdhdGVrZWVwZXI6OkJuR2F0ZUtlZXBlclNlcnZpY2U7Ci11c2luZyBHS1Jlc3BvbnNlID0gOjphbmRyb2lkOjpzZXJ2aWNlOjpnYXRla2VlcGVyOjpHYXRlS2VlcGVyUmVzcG9uc2U7CiB1c2luZyBHS1Jlc3BvbnNlQ29kZSA9IDo6YW5kcm9pZDo6c2VydmljZTo6Z2F0ZWtlZXBlcjo6UmVzcG9uc2VDb2RlOwogdXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6c2VjdXJpdHk6OmtleW1pbnQ6OkhhcmR3YXJlQXV0aGVudGljYXRvclR5cGU7CiB1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpzZWN1cml0eTo6a2V5bWludDo6SGFyZHdhcmVBdXRoVG9rZW47CkBAIC03MCwxNzIgKzYxLDE4NCBAQAogc3RhdGljIGNvbnN0IFN0cmluZzE2IERVTVBfUEVSTUlTU0lPTigiYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKTsKIGNvbnN0ZXhwciBjb25zdCBjaGFyIGdhdGVrZWVwZXJTZXJ2aWNlTmFtZVtdID0gImFuZHJvaWQuaGFyZHdhcmUuZ2F0ZWtlZXBlci5JR2F0ZWtlZXBlci9kZWZhdWx0IjsKIAotY2xhc3MgR2F0ZUtlZXBlclByb3h5IDogcHVibGljIEJuR2F0ZUtlZXBlclNlcnZpY2UgewotICBwdWJsaWM6Ci0gICAgR2F0ZUtlZXBlclByb3h5KCkgewotICAgICAgICBjbGVhcl9zdGF0ZV9pZl9uZWVkZWRfZG9uZSA9IGZhbHNlOwotICAgICAgICBod19kZXZpY2UgPSBJR2F0ZWtlZXBlcjo6Z2V0U2VydmljZSgpOwotICAgICAgICA6Om5kazo6U3BBSUJpbmRlciBrczJCaW5kZXIoQVNlcnZpY2VNYW5hZ2VyX2dldFNlcnZpY2UoZ2F0ZWtlZXBlclNlcnZpY2VOYW1lKSk7CitHYXRlS2VlcGVyUHJveHk6OkdhdGVLZWVwZXJQcm94eSgpIHsKKyAgICBjbGVhcl9zdGF0ZV9pZl9uZWVkZWRfZG9uZSA9IGZhbHNlOworICAgIGlmIChBU2VydmljZU1hbmFnZXJfaXNEZWNsYXJlZChnYXRla2VlcGVyU2VydmljZU5hbWUpKSB7CisgICAgICAgIDo6bmRrOjpTcEFJQmluZGVyIGtzMkJpbmRlcihBU2VydmljZU1hbmFnZXJfd2FpdEZvclNlcnZpY2UoZ2F0ZWtlZXBlclNlcnZpY2VOYW1lKSk7CiAgICAgICAgIGFpZGxfaHdfZGV2aWNlID0gQWlkbElHYXRla2VlcGVyOjpmcm9tQmluZGVyKGtzMkJpbmRlcik7Ci0gICAgICAgIGlzX3J1bm5pbmdfZ3NpID0gYW5kcm9pZDo6YmFzZTo6R2V0Qm9vbFByb3BlcnR5KGFuZHJvaWQ6OmdzaTo6a0dzaUJvb3RlZFByb3AsIGZhbHNlKTsKKyAgICB9CisgICAgaWYgKCFhaWRsX2h3X2RldmljZSkgeworICAgICAgICBod19kZXZpY2UgPSBJR2F0ZWtlZXBlcjo6Z2V0U2VydmljZSgpOworICAgIH0KKyAgICBpc19ydW5uaW5nX2dzaSA9IGFuZHJvaWQ6OmJhc2U6OkdldEJvb2xQcm9wZXJ0eShhbmRyb2lkOjpnc2k6OmtHc2lCb290ZWRQcm9wLCBmYWxzZSk7CiAKLSAgICAgICAgaWYgKCFhaWRsX2h3X2RldmljZSAmJiAhaHdfZGV2aWNlKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgZmluZCBHYXRla2VlcGVyIGRldmljZSwgd2hpY2ggbWFrZXMgbWUgdmVyeSBzYWQuIjsKKyAgICBpZiAoIWFpZGxfaHdfZGV2aWNlICYmICFod19kZXZpY2UpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IGZpbmQgR2F0ZWtlZXBlciBkZXZpY2UsIHdoaWNoIG1ha2VzIG1lIHZlcnkgc2FkLiI7CisgICAgfQorfQorCit2b2lkIEdhdGVLZWVwZXJQcm94eTo6c3RvcmVfc2lkKHVpbnQzMl90IHVzZXJJZCwgdWludDY0X3Qgc2lkKSB7CisgICAgY2hhciBmaWxlbmFtZVsyMV07CisgICAgc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksICIldSIsIHVzZXJJZCk7CisgICAgaW50IGZkID0gb3BlbihmaWxlbmFtZSwgT19XUk9OTFkgfCBPX1RSVU5DIHwgT19DUkVBVCwgU19JUlVTUiB8IFNfSVdVU1IpOworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBvcGVuIGZpbGU6ICVzOiAlcyIsIGZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHdyaXRlKGZkLCAmc2lkLCBzaXplb2Yoc2lkKSk7CisgICAgY2xvc2UoZmQpOworfQorCit2b2lkIEdhdGVLZWVwZXJQcm94eTo6Y2xlYXJfc3RhdGVfaWZfbmVlZGVkKCkgeworICAgIGlmIChjbGVhcl9zdGF0ZV9pZl9uZWVkZWRfZG9uZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1hcmtfY29sZF9ib290KCkgJiYgIWlzX3J1bm5pbmdfZ3NpKSB7CisgICAgICAgIEFMT0dJKCJjb2xkIGJvb3Q6IGNsZWFyaW5nIHN0YXRlIik7CisgICAgICAgIGlmIChhaWRsX2h3X2RldmljZSkgeworICAgICAgICAgICAgYWlkbF9od19kZXZpY2UtPmRlbGV0ZUFsbFVzZXJzKCk7CisgICAgICAgIH0gZWxzZSBpZiAoaHdfZGV2aWNlKSB7CisgICAgICAgICAgICBod19kZXZpY2UtPmRlbGV0ZUFsbFVzZXJzKFtdKGNvbnN0IEdhdGVrZWVwZXJSZXNwb25zZSYpIHt9KTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHZpcnR1YWwgfkdhdGVLZWVwZXJQcm94eSgpIHt9CisgICAgY2xlYXJfc3RhdGVfaWZfbmVlZGVkX2RvbmUgPSB0cnVlOworfQogCi0gICAgdm9pZCBzdG9yZV9zaWQodWludDMyX3QgdXNlcklkLCB1aW50NjRfdCBzaWQpIHsKLSAgICAgICAgY2hhciBmaWxlbmFtZVsyMV07Ci0gICAgICAgIHNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiJXUiLCB1c2VySWQpOworYm9vbCBHYXRlS2VlcGVyUHJveHk6Om1hcmtfY29sZF9ib290KCkgeworICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lID0gIi5jb2xkYm9vdCI7CisgICAgaWYgKGFjY2VzcyhmaWxlbmFtZSwgRl9PSykgPT0gLTEpIHsKICAgICAgICAgaW50IGZkID0gb3BlbihmaWxlbmFtZSwgT19XUk9OTFkgfCBPX1RSVU5DIHwgT19DUkVBVCwgU19JUlVTUiB8IFNfSVdVU1IpOwogICAgICAgICBpZiAoZmQgPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiY291bGQgbm90IG9wZW4gZmlsZTogJXM6ICVzIiwgZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBBTE9HRSgiY291bGQgbm90IG9wZW4gZmlsZTogJXMgOiAlcyIsIGZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIHdyaXRlKGZkLCAmc2lkLCBzaXplb2Yoc2lkKSk7CiAgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBHYXRlS2VlcGVyUHJveHk6Om1heWJlX3N0b3JlX3NpZCh1aW50MzJfdCB1c2VySWQsIHVpbnQ2NF90IHNpZCkgeworICAgIGNoYXIgZmlsZW5hbWVbMjFdOworICAgIHNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiJXUiLCB1c2VySWQpOworICAgIGlmIChhY2Nlc3MoZmlsZW5hbWUsIEZfT0spID09IC0xKSB7CisgICAgICAgIHN0b3JlX3NpZCh1c2VySWQsIHNpZCk7CisgICAgfQorfQorCit1aW50NjRfdCBHYXRlS2VlcGVyUHJveHk6OnJlYWRfc2lkKHVpbnQzMl90IHVzZXJJZCkgeworICAgIGNoYXIgZmlsZW5hbWVbMjFdOworICAgIHVpbnQ2NF90IHNpZDsKKyAgICBzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgIiV1IiwgdXNlcklkKTsKKyAgICBpbnQgZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisgICAgaWYgKGZkIDwgMCkgcmV0dXJuIDA7CisgICAgcmVhZChmZCwgJnNpZCwgc2l6ZW9mKHNpZCkpOworICAgIGNsb3NlKGZkKTsKKyAgICByZXR1cm4gc2lkOworfQorCit2b2lkIEdhdGVLZWVwZXJQcm94eTo6Y2xlYXJfc2lkKHVpbnQzMl90IHVzZXJJZCkgeworICAgIGNoYXIgZmlsZW5hbWVbMjFdOworICAgIHNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiJXUiLCB1c2VySWQpOworICAgIGlmIChyZW1vdmUoZmlsZW5hbWUpIDwgMCAmJiBlcnJubyAhPSBFTk9FTlQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjb3VsZCBub3QgcmVtb3ZlIGZpbGUgWyVzXSwgYXR0ZW1wdGluZyAwIHdyaXRlIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHN0b3JlX3NpZCh1c2VySWQsIDApOworICAgIH0KK30KKworU3RhdHVzIEdhdGVLZWVwZXJQcm94eTo6YWRqdXN0X3VzZXJJZCh1aW50MzJfdCB1c2VySWQsIHVpbnQzMl90KiBod191c2VySWQpIHsKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtHc2lPZmZzZXQgPSAxMDAwMDAwOworICAgIGlmICh1c2VySWQgPj0ga0dzaU9mZnNldCkgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZShTdGF0dXM6OkVYX0lMTEVHQUxfQVJHVU1FTlQpOwogICAgIH0KIAotICAgIHZvaWQgY2xlYXJfc3RhdGVfaWZfbmVlZGVkKCkgewotICAgICAgICBpZiAoY2xlYXJfc3RhdGVfaWZfbmVlZGVkX2RvbmUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtYXJrX2NvbGRfYm9vdCgpICYmICFpc19ydW5uaW5nX2dzaSkgewotICAgICAgICAgICAgQUxPR0koImNvbGQgYm9vdDogY2xlYXJpbmcgc3RhdGUiKTsKLSAgICAgICAgICAgIGlmIChhaWRsX2h3X2RldmljZSkgewotICAgICAgICAgICAgICAgIGFpZGxfaHdfZGV2aWNlLT5kZWxldGVBbGxVc2VycygpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChod19kZXZpY2UpIHsKLSAgICAgICAgICAgICAgICBod19kZXZpY2UtPmRlbGV0ZUFsbFVzZXJzKFtdKGNvbnN0IEdhdGVrZWVwZXJSZXNwb25zZSYpIHt9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNsZWFyX3N0YXRlX2lmX25lZWRlZF9kb25lID0gdHJ1ZTsKKyAgICBpZiAoKGFpZGxfaHdfZGV2aWNlID09IG51bGxwdHIpICYmIChod19kZXZpY2UgPT0gbnVsbHB0cikpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoU3RhdHVzOjpFWF9JTExFR0FMX1NUQVRFKTsKICAgICB9CiAKLSAgICBib29sIG1hcmtfY29sZF9ib290KCkgewotICAgICAgICBjb25zdCBjaGFyKiBmaWxlbmFtZSA9ICIuY29sZGJvb3QiOwotICAgICAgICBpZiAoYWNjZXNzKGZpbGVuYW1lLCBGX09LKSA9PSAtMSkgewotICAgICAgICAgICAgaW50IGZkID0gb3BlbihmaWxlbmFtZSwgT19XUk9OTFkgfCBPX1RSVU5DIHwgT19DUkVBVCwgU19JUlVTUiB8IFNfSVdVU1IpOwotICAgICAgICAgICAgaWYgKGZkIDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJjb3VsZCBub3Qgb3BlbiBmaWxlOiAlcyA6ICVzIiwgZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2xvc2UoZmQpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChpc19ydW5uaW5nX2dzaSkgeworICAgICAgICAqaHdfdXNlcklkID0gdXNlcklkICsga0dzaU9mZnNldDsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKICAgICB9Ci0KLSAgICB2b2lkIG1heWJlX3N0b3JlX3NpZCh1aW50MzJfdCB1c2VySWQsIHVpbnQ2NF90IHNpZCkgewotICAgICAgICBjaGFyIGZpbGVuYW1lWzIxXTsKLSAgICAgICAgc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksICIldSIsIHVzZXJJZCk7Ci0gICAgICAgIGlmIChhY2Nlc3MoZmlsZW5hbWUsIEZfT0spID09IC0xKSB7Ci0gICAgICAgICAgICBzdG9yZV9zaWQodXNlcklkLCBzaWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdWludDY0X3QgcmVhZF9zaWQodWludDMyX3QgdXNlcklkKSB7Ci0gICAgICAgIGNoYXIgZmlsZW5hbWVbMjFdOwotICAgICAgICB1aW50NjRfdCBzaWQ7Ci0gICAgICAgIHNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiJXUiLCB1c2VySWQpOwotICAgICAgICBpbnQgZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7Ci0gICAgICAgIGlmIChmZCA8IDApIHJldHVybiAwOwotICAgICAgICByZWFkKGZkLCAmc2lkLCBzaXplb2Yoc2lkKSk7Ci0gICAgICAgIGNsb3NlKGZkKTsKLSAgICAgICAgcmV0dXJuIHNpZDsKLSAgICB9Ci0KLSAgICB2b2lkIGNsZWFyX3NpZCh1aW50MzJfdCB1c2VySWQpIHsKLSAgICAgICAgY2hhciBmaWxlbmFtZVsyMV07Ci0gICAgICAgIHNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiJXUiLCB1c2VySWQpOwotICAgICAgICBpZiAocmVtb3ZlKGZpbGVuYW1lKSA8IDAgJiYgZXJybm8gIT0gRU5PRU5UKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IGNvdWxkIG5vdCByZW1vdmUgZmlsZSBbJXNdLCBhdHRlbXB0aW5nIDAgd3JpdGUiLCBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgIHN0b3JlX3NpZCh1c2VySWQsIDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gdXNlcklkcyBiZWluZyBwYXNzZWQgdG8gdGhlIEdhdGVLZWVwZXIgSEFMLiBJdCBlbnN1cmVzIHRoYXQKLSAgICAvLyBzZWN1cmUgc3RvcmFnZSBzaGFyZWQgYWNyb3NzIGEgR1NJIGltYWdlIGFuZCBhIGhvc3QgaW1hZ2Ugd2lsbCBub3Qgb3ZlcmxhcC4KLSAgICB1aW50MzJfdCBhZGp1c3RfdXNlcklkKHVpbnQzMl90IHVzZXJJZCkgewotICAgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtHc2lPZmZzZXQgPSAxMDAwMDAwOwotICAgICAgICBDSEVDSyh1c2VySWQgPCBrR3NpT2Zmc2V0KTsKLSAgICAgICAgQ0hFQ0soKGFpZGxfaHdfZGV2aWNlICE9IG51bGxwdHIpIHx8IChod19kZXZpY2UgIT0gbnVsbHB0cikpOwotICAgICAgICBpZiAoaXNfcnVubmluZ19nc2kpIHsKLSAgICAgICAgICAgIHJldHVybiB1c2VySWQgKyBrR3NpT2Zmc2V0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB1c2VySWQ7Ci0gICAgfQorICAgICpod191c2VySWQgPSB1c2VySWQ7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KIAogI2RlZmluZSBHS19FUlJPUiAqZ2tSZXNwb25zZSA9IEdLUmVzcG9uc2U6OmVycm9yKCksIFN0YXR1czo6b2soKQogCi0gICAgU3RhdHVzIGVucm9sbChpbnQzMl90IHVzZXJJZCwgY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4mIGN1cnJlbnRQYXNzd29yZEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjp2ZWN0b3I8dWludDhfdD4+JiBjdXJyZW50UGFzc3dvcmQsCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgZGVzaXJlZFBhc3N3b3JkLCBHS1Jlc3BvbnNlKiBna1Jlc3BvbnNlKSBvdmVycmlkZSB7Ci0gICAgICAgIElQQ1RocmVhZFN0YXRlKiBpcGMgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOwotICAgICAgICBjb25zdCBpbnQgY2FsbGluZ19waWQgPSBpcGMtPmdldENhbGxpbmdQaWQoKTsKLSAgICAgICAgY29uc3QgaW50IGNhbGxpbmdfdWlkID0gaXBjLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oS0VZR1VBUkRfUEVSTUlTU0lPTiwgY2FsbGluZ19waWQsIGNhbGxpbmdfdWlkKSkgewotICAgICAgICAgICAgcmV0dXJuIEdLX0VSUk9SOwotICAgICAgICB9CitTdGF0dXMgR2F0ZUtlZXBlclByb3h5OjplbnJvbGwoaW50MzJfdCB1c2VySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4mIGN1cnJlbnRQYXNzd29yZEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiYgY3VycmVudFBhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBkZXNpcmVkUGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0tSZXNwb25zZSogZ2tSZXNwb25zZSkgeworICAgIElQQ1RocmVhZFN0YXRlKiBpcGMgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOworICAgIGNvbnN0IGludCBjYWxsaW5nX3BpZCA9IGlwYy0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIGNvbnN0IGludCBjYWxsaW5nX3VpZCA9IGlwYy0+Z2V0Q2FsbGluZ1VpZCgpOworICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oS0VZR1VBUkRfUEVSTUlTU0lPTiwgY2FsbGluZ19waWQsIGNhbGxpbmdfdWlkKSkgeworICAgICAgICByZXR1cm4gR0tfRVJST1I7CisgICAgfQogCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0byBjbGVhciBhbnkgc3RhdGUgZnJvbSBiZWZvcmUgZmFjdG9yeSByZXNldCBhcyBzb29uIGFzIGEgY3JlZGVudGlhbCBpcwotICAgICAgICAvLyBlbnJvbGxlZCAod2hpY2ggbWF5IGhhcHBlbiBkdXJpbmcgZGV2aWNlIHNldHVwKS4KLSAgICAgICAgY2xlYXJfc3RhdGVfaWZfbmVlZGVkKCk7CisgICAgLy8gTWFrZSBzdXJlIHRvIGNsZWFyIGFueSBzdGF0ZSBmcm9tIGJlZm9yZSBmYWN0b3J5IHJlc2V0IGFzIHNvb24gYXMgYSBjcmVkZW50aWFsIGlzCisgICAgLy8gZW5yb2xsZWQgKHdoaWNoIG1heSBoYXBwZW4gZHVyaW5nIGRldmljZSBzZXR1cCkuCisgICAgY2xlYXJfc3RhdGVfaWZfbmVlZGVkKCk7CiAKLSAgICAgICAgLy8gbmVlZCBhIGRlc2lyZWQgcGFzc3dvcmQgdG8gZW5yb2xsCi0gICAgICAgIGlmIChkZXNpcmVkUGFzc3dvcmQuc2l6ZSgpID09IDApIHJldHVybiBHS19FUlJPUjsKKyAgICAvLyBuZWVkIGEgZGVzaXJlZCBwYXNzd29yZCB0byBlbnJvbGwKKyAgICBpZiAoZGVzaXJlZFBhc3N3b3JkLnNpemUoKSA9PSAwKSByZXR1cm4gR0tfRVJST1I7CiAKLSAgICAgICAgaWYgKCFhaWRsX2h3X2RldmljZSAmJiAhaHdfZGV2aWNlKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJoYXMgbm8gSEFMIHRvIHRhbGsgdG8iOwotICAgICAgICAgICAgcmV0dXJuIEdLX0VSUk9SOwotICAgICAgICB9CisgICAgaWYgKCFhaWRsX2h3X2RldmljZSAmJiAhaHdfZGV2aWNlKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImhhcyBubyBIQUwgdG8gdGFsayB0byI7CisgICAgICAgIHJldHVybiBHS19FUlJPUjsKKyAgICB9CiAKLSAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjPHVpbnQ4X3Q+IGN1clB3ZEhhbmRsZTsKLSAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjPHVpbnQ4X3Q+IGN1clB3ZDsKKyAgICBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM8dWludDhfdD4gY3VyUHdkSGFuZGxlOworICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzx1aW50OF90PiBjdXJQd2Q7CiAKLSAgICAgICAgaWYgKGN1cnJlbnRQYXNzd29yZEhhbmRsZSAmJiBjdXJyZW50UGFzc3dvcmQpIHsKLSAgICAgICAgICAgIGlmIChod19kZXZpY2UpIHsKLSAgICAgICAgICAgICAgICAvLyBIaWRsIEltcGxlbWVudGF0aW9ucyBleHBlY3RzIHBhc3N3b3JkSGFuZGxlIHRvIGJlIGluCi0gICAgICAgICAgICAgICAgLy8gZ2F0ZWtlZXBlcjo6cGFzc3dvcmRfaGFuZGxlX3QgZm9ybWF0LgotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UGFzc3dvcmRIYW5kbGUtPnNpemUoKSAhPSBzaXplb2YoZ2F0ZWtlZXBlcjo6cGFzc3dvcmRfaGFuZGxlX3QpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiUGFzc3dvcmQgaGFuZGxlIGhhcyB3cm9uZyBsZW5ndGgiOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gR0tfRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY3VyUHdkSGFuZGxlLnNldFRvRXh0ZXJuYWwoY29uc3RfY2FzdDx1aW50OF90Kj4oY3VycmVudFBhc3N3b3JkSGFuZGxlLT5kYXRhKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhc3N3b3JkSGFuZGxlLT5zaXplKCkpOwotICAgICAgICAgICAgY3VyUHdkLnNldFRvRXh0ZXJuYWwoY29uc3RfY2FzdDx1aW50OF90Kj4oY3VycmVudFBhc3N3b3JkLT5kYXRhKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhc3N3b3JkLT5zaXplKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjPHVpbnQ4X3Q+IG5ld1B3ZDsKLSAgICAgICAgbmV3UHdkLnNldFRvRXh0ZXJuYWwoY29uc3RfY2FzdDx1aW50OF90Kj4oZGVzaXJlZFBhc3N3b3JkLmRhdGEoKSksIGRlc2lyZWRQYXNzd29yZC5zaXplKCkpOwotCi0gICAgICAgIHVpbnQzMl90IGh3X3VzZXJJZCA9IGFkanVzdF91c2VySWQodXNlcklkKTsKLSAgICAgICAgdWludDY0X3Qgc2VjdXJlVXNlcklkID0gMDsKLSAgICAgICAgaWYgKGFpZGxfaHdfZGV2aWNlKSB7Ci0gICAgICAgICAgICAvLyBBSURMIGdhdGVrZWVwZXIgc2VydmljZQotICAgICAgICAgICAgQWlkbEdhdGVrZWVwZXJFbnJvbGxSZXNwIHJzcDsKLSAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gYWlkbF9od19kZXZpY2UtPmVucm9sbChod191c2VySWQsIGN1clB3ZEhhbmRsZSwgY3VyUHdkLCBuZXdQd2QsICZyc3ApOwotICAgICAgICAgICAgaWYgKCFyZXN1bHQuaXNPaygpKSB7Ci0gICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiZW5yb2xsIHRyYW5zYWN0aW9uIGZhaWxlZCI7CisgICAgaWYgKGN1cnJlbnRQYXNzd29yZEhhbmRsZSAmJiBjdXJyZW50UGFzc3dvcmQpIHsKKyAgICAgICAgaWYgKGh3X2RldmljZSkgeworICAgICAgICAgICAgLy8gSGlkbCBJbXBsZW1lbnRhdGlvbnMgZXhwZWN0cyBwYXNzd29yZEhhbmRsZSB0byBiZSBpbgorICAgICAgICAgICAgLy8gZ2F0ZWtlZXBlcjo6cGFzc3dvcmRfaGFuZGxlX3QgZm9ybWF0LgorICAgICAgICAgICAgaWYgKGN1cnJlbnRQYXNzd29yZEhhbmRsZS0+c2l6ZSgpICE9IHNpemVvZihnYXRla2VlcGVyOjpwYXNzd29yZF9oYW5kbGVfdCkpIHsKKyAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIlBhc3N3b3JkIGhhbmRsZSBoYXMgd3JvbmcgbGVuZ3RoIjsKICAgICAgICAgICAgICAgICByZXR1cm4gR0tfRVJST1I7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocnNwLnN0YXR1c0NvZGUgPj0gQWlkbElHYXRla2VlcGVyOjpTVEFUVVNfT0spIHsKLSAgICAgICAgICAgICAgICAqZ2tSZXNwb25zZSA9IEdLUmVzcG9uc2U6Om9rKHtyc3AuZGF0YS5iZWdpbigpLCByc3AuZGF0YS5lbmQoKX0pOwotICAgICAgICAgICAgICAgIHNlY3VyZVVzZXJJZCA9IHN0YXRpY19jYXN0PHVpbnQ2NF90Pihyc3Auc2VjdXJlVXNlcklkKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocnNwLnN0YXR1c0NvZGUgPT0gQWlkbElHYXRla2VlcGVyOjpFUlJPUl9SRVRSWV9USU1FT1VUICYmCi0gICAgICAgICAgICAgICAgICAgICAgIHJzcC50aW1lb3V0TXMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgKmdrUmVzcG9uc2UgPSBHS1Jlc3BvbnNlOjpyZXRyeShyc3AudGltZW91dE1zKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKmdrUmVzcG9uc2UgPSBHS1Jlc3BvbnNlOjplcnJvcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGh3X2RldmljZSkgewotICAgICAgICAgICAgLy8gSElETCBnYXRla2VlcGVyIHNlcnZpY2UKLSAgICAgICAgICAgIFJldHVybjx2b2lkPiBod1JlcyA9IGh3X2RldmljZS0+ZW5yb2xsKAorICAgICAgICB9CisgICAgICAgIGN1clB3ZEhhbmRsZS5zZXRUb0V4dGVybmFsKGNvbnN0X2Nhc3Q8dWludDhfdCo+KGN1cnJlbnRQYXNzd29yZEhhbmRsZS0+ZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhc3N3b3JkSGFuZGxlLT5zaXplKCkpOworICAgICAgICBjdXJQd2Quc2V0VG9FeHRlcm5hbChjb25zdF9jYXN0PHVpbnQ4X3QqPihjdXJyZW50UGFzc3dvcmQtPmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYXNzd29yZC0+c2l6ZSgpKTsKKyAgICB9CisKKyAgICBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM8dWludDhfdD4gbmV3UHdkOworICAgIG5ld1B3ZC5zZXRUb0V4dGVybmFsKGNvbnN0X2Nhc3Q8dWludDhfdCo+KGRlc2lyZWRQYXNzd29yZC5kYXRhKCkpLCBkZXNpcmVkUGFzc3dvcmQuc2l6ZSgpKTsKKworICAgIHVpbnQzMl90IGh3X3VzZXJJZCA9IDA7CisgICAgU3RhdHVzIHJlc3VsdCA9IGFkanVzdF91c2VySWQodXNlcklkLCAmaHdfdXNlcklkKTsKKyAgICBpZiAoIXJlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICB1aW50NjRfdCBzZWN1cmVVc2VySWQgPSAwOworICAgIGlmIChhaWRsX2h3X2RldmljZSkgeworICAgICAgICAvLyBBSURMIGdhdGVrZWVwZXIgc2VydmljZQorICAgICAgICBBaWRsR2F0ZWtlZXBlckVucm9sbFJlc3AgcnNwOworICAgICAgICBhdXRvIHJlc3VsdCA9IGFpZGxfaHdfZGV2aWNlLT5lbnJvbGwoaHdfdXNlcklkLCBjdXJQd2RIYW5kbGUsIGN1clB3ZCwgbmV3UHdkLCAmcnNwKTsKKyAgICAgICAgaWYgKCFyZXN1bHQuaXNPaygpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJlbnJvbGwgdHJhbnNhY3Rpb24gZmFpbGVkIjsKKyAgICAgICAgICAgIHJldHVybiBHS19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBpZiAocnNwLnN0YXR1c0NvZGUgPj0gQWlkbElHYXRla2VlcGVyOjpTVEFUVVNfT0spIHsKKyAgICAgICAgICAgICpna1Jlc3BvbnNlID0gR0tSZXNwb25zZTo6b2soe3JzcC5kYXRhLmJlZ2luKCksIHJzcC5kYXRhLmVuZCgpfSk7CisgICAgICAgICAgICBzZWN1cmVVc2VySWQgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocnNwLnNlY3VyZVVzZXJJZCk7CisgICAgICAgIH0gZWxzZSBpZiAocnNwLnN0YXR1c0NvZGUgPT0gQWlkbElHYXRla2VlcGVyOjpFUlJPUl9SRVRSWV9USU1FT1VUICYmIHJzcC50aW1lb3V0TXMgPiAwKSB7CisgICAgICAgICAgICAqZ2tSZXNwb25zZSA9IEdLUmVzcG9uc2U6OnJldHJ5KHJzcC50aW1lb3V0TXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmdrUmVzcG9uc2UgPSBHS1Jlc3BvbnNlOjplcnJvcigpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChod19kZXZpY2UpIHsKKyAgICAgICAgLy8gSElETCBnYXRla2VlcGVyIHNlcnZpY2UKKyAgICAgICAgUmV0dXJuPHZvaWQ+IGh3UmVzID0gaHdfZGV2aWNlLT5lbnJvbGwoCiAgICAgICAgICAgICAgICAgaHdfdXNlcklkLCBjdXJQd2RIYW5kbGUsIGN1clB3ZCwgbmV3UHdkLAogICAgICAgICAgICAgICAgIFsmZ2tSZXNwb25zZV0oY29uc3QgR2F0ZWtlZXBlclJlc3BvbnNlJiByc3ApIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHJzcC5jb2RlID49IEdhdGVrZWVwZXJTdGF0dXNDb2RlOjpTVEFUVVNfT0spIHsKQEAgLTI0NywxMTAgKzI1MCwxMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICpna1Jlc3BvbnNlID0gR0tSZXNwb25zZTo6ZXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgaWYgKCFod1Jlcy5pc09rKCkpIHsKLSAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJlbnJvbGwgdHJhbnNhY3Rpb24gZmFpbGVkIjsKKyAgICAgICAgaWYgKCFod1Jlcy5pc09rKCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgImVucm9sbCB0cmFuc2FjdGlvbiBmYWlsZWQiOworICAgICAgICAgICAgcmV0dXJuIEdLX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGlmIChna1Jlc3BvbnNlLT5yZXNwb25zZV9jb2RlKCkgPT0gR0tSZXNwb25zZUNvZGU6Ok9LKSB7CisgICAgICAgICAgICBpZiAoZ2tSZXNwb25zZS0+cGF5bG9hZCgpLnNpemUoKSAhPSBzaXplb2YoZ2F0ZWtlZXBlcjo6cGFzc3dvcmRfaGFuZGxlX3QpKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSEFMIHJldHVybmVkIHBhc3N3b3JkIGhhbmRsZSBvZiBpbnZhbGlkIGxlbmd0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBna1Jlc3BvbnNlLT5wYXlsb2FkKCkuc2l6ZSgpOwogICAgICAgICAgICAgICAgIHJldHVybiBHS19FUlJPUjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChna1Jlc3BvbnNlLT5yZXNwb25zZV9jb2RlKCkgPT0gR0tSZXNwb25zZUNvZGU6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdrUmVzcG9uc2UtPnBheWxvYWQoKS5zaXplKCkgIT0gc2l6ZW9mKGdhdGVrZWVwZXI6OnBhc3N3b3JkX2hhbmRsZV90KSkgewotICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJIQUwgcmV0dXJuZWQgcGFzc3dvcmQgaGFuZGxlIG9mIGludmFsaWQgbGVuZ3RoICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBna1Jlc3BvbnNlLT5wYXlsb2FkKCkuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gR0tfRVJST1I7Ci0gICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgY29uc3QgZ2F0ZWtlZXBlcjo6cGFzc3dvcmRfaGFuZGxlX3QqIGhhbmRsZSA9CisgICAgICAgICAgICBjb25zdCBnYXRla2VlcGVyOjpwYXNzd29yZF9oYW5kbGVfdCogaGFuZGxlID0KICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBnYXRla2VlcGVyOjpwYXNzd29yZF9oYW5kbGVfdCo+KAotICAgICAgICAgICAgICAgICAgICAgICAgZ2tSZXNwb25zZS0+cGF5bG9hZCgpLmRhdGEoKSk7Ci0gICAgICAgICAgICAgICAgc2VjdXJlVXNlcklkID0gaGFuZGxlLT51c2VyX2lkOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdrUmVzcG9uc2UtPnBheWxvYWQoKS5kYXRhKCkpOworICAgICAgICAgICAgc2VjdXJlVXNlcklkID0gaGFuZGxlLT51c2VyX2lkOwogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGdrUmVzcG9uc2UtPnJlc3BvbnNlX2NvZGUoKSA9PSBHS1Jlc3BvbnNlQ29kZTo6T0sgJiYgIWdrUmVzcG9uc2UtPnNob3VsZF9yZWVucm9sbCgpKSB7Ci0gICAgICAgICAgICBzdG9yZV9zaWQodXNlcklkLCBzZWN1cmVVc2VySWQpOwotCi0gICAgICAgICAgICBHS1Jlc3BvbnNlIHZlcmlmeVJlc3BvbnNlOwotICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHkgdmVyaWZ5IHRoaXMgcGFzc3dvcmQgc28gd2UgZG9uJ3QgYXNrIHRoZSB1c2VyIHRvIGVudGVyIGl0IGFnYWluCi0gICAgICAgICAgICAvLyBpZiB0aGV5IGp1c3QgY3JlYXRlZCBpdC4KLSAgICAgICAgICAgIGF1dG8gc3RhdHVzID0gdmVyaWZ5KHVzZXJJZCwgZ2tSZXNwb25zZS0+cGF5bG9hZCgpLCBkZXNpcmVkUGFzc3dvcmQsICZ2ZXJpZnlSZXNwb25zZSk7Ci0gICAgICAgICAgICBpZiAoIXN0YXR1cy5pc09rKCkgfHwgdmVyaWZ5UmVzcG9uc2UucmVzcG9uc2VfY29kZSgpICE9IEdLUmVzcG9uc2VDb2RlOjpPSykgewotICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byB2ZXJpZnkgcGFzc3dvcmQgYWZ0ZXIgZW5yb2xsaW5nIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiAgICAgfQogCi0gICAgU3RhdHVzIHZlcmlmeShpbnQzMl90IHVzZXJJZCwgY29uc3QgOjpzdGQ6OnZlY3Rvcjx1aW50OF90PiYgZW5yb2xsZWRQYXNzd29yZEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IDo6c3RkOjp2ZWN0b3I8dWludDhfdD4mIHByb3ZpZGVkUGFzc3dvcmQsIEdLUmVzcG9uc2UqIGdrUmVzcG9uc2UpIG92ZXJyaWRlIHsKLSAgICAgICAgcmV0dXJuIHZlcmlmeUNoYWxsZW5nZSh1c2VySWQsIDAgLyogY2hhbGxlbmdlICovLCBlbnJvbGxlZFBhc3N3b3JkSGFuZGxlLCBwcm92aWRlZFBhc3N3b3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdrUmVzcG9uc2UpOworICAgIGlmIChna1Jlc3BvbnNlLT5yZXNwb25zZV9jb2RlKCkgPT0gR0tSZXNwb25zZUNvZGU6Ok9LICYmICFna1Jlc3BvbnNlLT5zaG91bGRfcmVlbnJvbGwoKSkgeworICAgICAgICBzdG9yZV9zaWQodXNlcklkLCBzZWN1cmVVc2VySWQpOworCisgICAgICAgIEdLUmVzcG9uc2UgdmVyaWZ5UmVzcG9uc2U7CisgICAgICAgIC8vIGltbWVkaWF0ZWx5IHZlcmlmeSB0aGlzIHBhc3N3b3JkIHNvIHdlIGRvbid0IGFzayB0aGUgdXNlciB0byBlbnRlciBpdCBhZ2FpbgorICAgICAgICAvLyBpZiB0aGV5IGp1c3QgY3JlYXRlZCBpdC4KKyAgICAgICAgYXV0byBzdGF0dXMgPSB2ZXJpZnkodXNlcklkLCBna1Jlc3BvbnNlLT5wYXlsb2FkKCksIGRlc2lyZWRQYXNzd29yZCwgJnZlcmlmeVJlc3BvbnNlKTsKKyAgICAgICAgaWYgKCFzdGF0dXMuaXNPaygpIHx8IHZlcmlmeVJlc3BvbnNlLnJlc3BvbnNlX2NvZGUoKSAhPSBHS1Jlc3BvbnNlQ29kZTo6T0spIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byB2ZXJpZnkgcGFzc3dvcmQgYWZ0ZXIgZW5yb2xsaW5nIjsKKyAgICAgICAgfQogICAgIH0KIAotICAgIFN0YXR1cyB2ZXJpZnlDaGFsbGVuZ2UoaW50MzJfdCB1c2VySWQsIGludDY0X3QgY2hhbGxlbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGVucm9sbGVkUGFzc3dvcmRIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcHJvdmlkZWRQYXNzd29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdLUmVzcG9uc2UqIGdrUmVzcG9uc2UpIG92ZXJyaWRlIHsKLSAgICAgICAgSVBDVGhyZWFkU3RhdGUqIGlwYyA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7Ci0gICAgICAgIGNvbnN0IGludCBjYWxsaW5nX3BpZCA9IGlwYy0+Z2V0Q2FsbGluZ1BpZCgpOwotICAgICAgICBjb25zdCBpbnQgY2FsbGluZ191aWQgPSBpcGMtPmdldENhbGxpbmdVaWQoKTsKLSAgICAgICAgaWYgKCFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihLRVlHVUFSRF9QRVJNSVNTSU9OLCBjYWxsaW5nX3BpZCwgY2FsbGluZ191aWQpKSB7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIEdhdGVLZWVwZXJQcm94eTo6dmVyaWZ5KGludDMyX3QgdXNlcklkLCBjb25zdCA6OnN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBlbnJvbGxlZFBhc3N3b3JkSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6c3RkOjp2ZWN0b3I8dWludDhfdD4mIHByb3ZpZGVkUGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0tSZXNwb25zZSogZ2tSZXNwb25zZSkgeworICAgIHJldHVybiB2ZXJpZnlDaGFsbGVuZ2UodXNlcklkLCAwIC8qIGNoYWxsZW5nZSAqLywgZW5yb2xsZWRQYXNzd29yZEhhbmRsZSwgcHJvdmlkZWRQYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdrUmVzcG9uc2UpOworfQorCitTdGF0dXMgR2F0ZUtlZXBlclByb3h5Ojp2ZXJpZnlDaGFsbGVuZ2UoaW50MzJfdCB1c2VySWQsIGludDY0X3QgY2hhbGxlbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBlbnJvbGxlZFBhc3N3b3JkSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwcm92aWRlZFBhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdLUmVzcG9uc2UqIGdrUmVzcG9uc2UpIHsKKyAgICBJUENUaHJlYWRTdGF0ZSogaXBjID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKKyAgICBjb25zdCBpbnQgY2FsbGluZ19waWQgPSBpcGMtPmdldENhbGxpbmdQaWQoKTsKKyAgICBjb25zdCBpbnQgY2FsbGluZ191aWQgPSBpcGMtPmdldENhbGxpbmdVaWQoKTsKKyAgICBpZiAoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKEtFWUdVQVJEX1BFUk1JU1NJT04sIGNhbGxpbmdfcGlkLCBjYWxsaW5nX3VpZCkpIHsKKyAgICAgICAgcmV0dXJuIEdLX0VSUk9SOworICAgIH0KKworICAgIC8vIGNhbid0IHZlcmlmeSBpZiB3ZSdyZSBtaXNzaW5nIGVpdGhlciBwYXJhbQorICAgIGlmIChlbnJvbGxlZFBhc3N3b3JkSGFuZGxlLnNpemUoKSA9PSAwIHx8IHByb3ZpZGVkUGFzc3dvcmQuc2l6ZSgpID09IDApIHJldHVybiBHS19FUlJPUjsKKworICAgIGlmICghYWlkbF9od19kZXZpY2UgJiYgIWh3X2RldmljZSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJoYXMgbm8gSEFMIHRvIHRhbGsgdG8iOworICAgICAgICByZXR1cm4gR0tfRVJST1I7CisgICAgfQorCisgICAgaWYgKGh3X2RldmljZSkgeworICAgICAgICAvLyBIaWRsIEltcGxlbWVudGF0aW9ucyBleHBlY3RzIHBhc3N3b3JkSGFuZGxlIHRvIGJlIGluIGdhdGVrZWVwZXI6OnBhc3N3b3JkX2hhbmRsZV90CisgICAgICAgIGlmIChlbnJvbGxlZFBhc3N3b3JkSGFuZGxlLnNpemUoKSAhPSBzaXplb2YoZ2F0ZWtlZXBlcjo6cGFzc3dvcmRfaGFuZGxlX3QpKSB7CisgICAgICAgICAgICBMT0coSU5GTykgPDwgIlBhc3N3b3JkIGhhbmRsZSBoYXMgd3JvbmcgbGVuZ3RoIjsKICAgICAgICAgICAgIHJldHVybiBHS19FUlJPUjsKICAgICAgICAgfQorICAgIH0KIAotICAgICAgICAvLyBjYW4ndCB2ZXJpZnkgaWYgd2UncmUgbWlzc2luZyBlaXRoZXIgcGFyYW0KLSAgICAgICAgaWYgKGVucm9sbGVkUGFzc3dvcmRIYW5kbGUuc2l6ZSgpID09IDAgfHwgcHJvdmlkZWRQYXNzd29yZC5zaXplKCkgPT0gMCkgcmV0dXJuIEdLX0VSUk9SOworICAgIHVpbnQzMl90IGh3X3VzZXJJZCA9IDA7CisgICAgU3RhdHVzIHJlc3VsdCA9IGFkanVzdF91c2VySWQodXNlcklkLCAmaHdfdXNlcklkKTsKKyAgICBpZiAoIXJlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CiAKLSAgICAgICAgaWYgKCFhaWRsX2h3X2RldmljZSAmJiAhaHdfZGV2aWNlKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJoYXMgbm8gSEFMIHRvIHRhbGsgdG8iOworICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzx1aW50OF90PiBjdXJQd2RIYW5kbGU7CisgICAgY3VyUHdkSGFuZGxlLnNldFRvRXh0ZXJuYWwoY29uc3RfY2FzdDx1aW50OF90Kj4oZW5yb2xsZWRQYXNzd29yZEhhbmRsZS5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVucm9sbGVkUGFzc3dvcmRIYW5kbGUuc2l6ZSgpKTsKKyAgICBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM8dWludDhfdD4gZW50ZXJlZFB3ZDsKKyAgICBlbnRlcmVkUHdkLnNldFRvRXh0ZXJuYWwoY29uc3RfY2FzdDx1aW50OF90Kj4ocHJvdmlkZWRQYXNzd29yZC5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlZFBhc3N3b3JkLnNpemUoKSk7CisKKyAgICB1aW50NjRfdCBzZWN1cmVVc2VySWQgPSAwOworICAgIGlmIChhaWRsX2h3X2RldmljZSkgeworICAgICAgICAvLyBBSURMIGdhdGVrZWVwZXIgc2VydmljZQorICAgICAgICBBaWRsR2F0ZWtlZXBlclZlcmlmeVJlc3AgcnNwOworICAgICAgICBhdXRvIHJlc3VsdCA9IGFpZGxfaHdfZGV2aWNlLT52ZXJpZnkoaHdfdXNlcklkLCBjaGFsbGVuZ2UsIGN1clB3ZEhhbmRsZSwgZW50ZXJlZFB3ZCwgJnJzcCk7CisgICAgICAgIGlmICghcmVzdWx0LmlzT2soKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAidmVyaWZ5IHRyYW5zYWN0aW9uIGZhaWxlZCI7CiAgICAgICAgICAgICByZXR1cm4gR0tfRVJST1I7CiAgICAgICAgIH0KLQotICAgICAgICBpZiAoaHdfZGV2aWNlKSB7Ci0gICAgICAgICAgICAvLyBIaWRsIEltcGxlbWVudGF0aW9ucyBleHBlY3RzIHBhc3N3b3JkSGFuZGxlIHRvIGJlIGluIGdhdGVrZWVwZXI6OnBhc3N3b3JkX2hhbmRsZV90Ci0gICAgICAgICAgICBpZiAoZW5yb2xsZWRQYXNzd29yZEhhbmRsZS5zaXplKCkgIT0gc2l6ZW9mKGdhdGVrZWVwZXI6OnBhc3N3b3JkX2hhbmRsZV90KSkgewotICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiUGFzc3dvcmQgaGFuZGxlIGhhcyB3cm9uZyBsZW5ndGgiOwotICAgICAgICAgICAgICAgIHJldHVybiBHS19FUlJPUjsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKHJzcC5zdGF0dXNDb2RlID49IEFpZGxJR2F0ZWtlZXBlcjo6U1RBVFVTX09LKSB7CisgICAgICAgICAgICBzZWN1cmVVc2VySWQgPSByc3AuaGFyZHdhcmVBdXRoVG9rZW4udXNlcklkOworICAgICAgICAgICAgLy8gU2VyaWFsaXplIEhhcmR3YXJlQXV0aFRva2VuIHRvIGEgdmVjdG9yIGFzIGh3X2F1dGhfdG9rZW5fdC4KKyAgICAgICAgICAgICpna1Jlc3BvbnNlID0gR0tSZXNwb25zZTo6b2soCisgICAgICAgICAgICAgICAgICAgIGF1dGhUb2tlbjJBaWRsVmVjKHJzcC5oYXJkd2FyZUF1dGhUb2tlbiksCisgICAgICAgICAgICAgICAgICAgIHJzcC5zdGF0dXNDb2RlID09IEFpZGxJR2F0ZWtlZXBlcjo6U1RBVFVTX1JFRU5ST0xMIC8qIHJlZW5yb2xsICovKTsKKyAgICAgICAgfSBlbHNlIGlmIChyc3Auc3RhdHVzQ29kZSA9PSBBaWRsSUdhdGVrZWVwZXI6OkVSUk9SX1JFVFJZX1RJTUVPVVQpIHsKKyAgICAgICAgICAgICpna1Jlc3BvbnNlID0gR0tSZXNwb25zZTo6cmV0cnkocnNwLnRpbWVvdXRNcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqZ2tSZXNwb25zZSA9IEdLUmVzcG9uc2U6OmVycm9yKCk7CiAgICAgICAgIH0KLQotICAgICAgICB1aW50MzJfdCBod191c2VySWQgPSBhZGp1c3RfdXNlcklkKHVzZXJJZCk7Ci0gICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzx1aW50OF90PiBjdXJQd2RIYW5kbGU7Ci0gICAgICAgIGN1clB3ZEhhbmRsZS5zZXRUb0V4dGVybmFsKGNvbnN0X2Nhc3Q8dWludDhfdCo+KGVucm9sbGVkUGFzc3dvcmRIYW5kbGUuZGF0YSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5yb2xsZWRQYXNzd29yZEhhbmRsZS5zaXplKCkpOwotICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM8dWludDhfdD4gZW50ZXJlZFB3ZDsKLSAgICAgICAgZW50ZXJlZFB3ZC5zZXRUb0V4dGVybmFsKGNvbnN0X2Nhc3Q8dWludDhfdCo+KHByb3ZpZGVkUGFzc3dvcmQuZGF0YSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVkUGFzc3dvcmQuc2l6ZSgpKTsKLQotICAgICAgICB1aW50NjRfdCBzZWN1cmVVc2VySWQgPSAwOwotICAgICAgICBpZiAoYWlkbF9od19kZXZpY2UpIHsKLSAgICAgICAgICAgIC8vIEFJREwgZ2F0ZWtlZXBlciBzZXJ2aWNlCi0gICAgICAgICAgICBBaWRsR2F0ZWtlZXBlclZlcmlmeVJlc3AgcnNwOwotICAgICAgICAgICAgYXV0byByZXN1bHQgPQotICAgICAgICAgICAgICAgIGFpZGxfaHdfZGV2aWNlLT52ZXJpZnkoaHdfdXNlcklkLCBjaGFsbGVuZ2UsIGN1clB3ZEhhbmRsZSwgZW50ZXJlZFB3ZCwgJnJzcCk7Ci0gICAgICAgICAgICBpZiAoIXJlc3VsdC5pc09rKCkpIHsKLSAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJ2ZXJpZnkgdHJhbnNhY3Rpb24gZmFpbGVkIjsKLSAgICAgICAgICAgICAgICByZXR1cm4gR0tfRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocnNwLnN0YXR1c0NvZGUgPj0gQWlkbElHYXRla2VlcGVyOjpTVEFUVVNfT0spIHsKLSAgICAgICAgICAgICAgICBzZWN1cmVVc2VySWQgPSByc3AuaGFyZHdhcmVBdXRoVG9rZW4udXNlcklkOwotICAgICAgICAgICAgICAgIC8vIFNlcmlhbGl6ZSBIYXJkd2FyZUF1dGhUb2tlbiB0byBhIHZlY3RvciBhcyBod19hdXRoX3Rva2VuX3QuCi0gICAgICAgICAgICAgICAgKmdrUmVzcG9uc2UgPSBHS1Jlc3BvbnNlOjpvayhhdXRoVG9rZW4yQWlkbFZlYyhyc3AuaGFyZHdhcmVBdXRoVG9rZW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNwLnN0YXR1c0NvZGUgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBaWRsSUdhdGVrZWVwZXI6OlNUQVRVU19SRUVOUk9MTCAvKiByZWVucm9sbCAqLyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHJzcC5zdGF0dXNDb2RlID09IEFpZGxJR2F0ZWtlZXBlcjo6RVJST1JfUkVUUllfVElNRU9VVCkgewotICAgICAgICAgICAgICAgICpna1Jlc3BvbnNlID0gR0tSZXNwb25zZTo6cmV0cnkocnNwLnRpbWVvdXRNcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICpna1Jlc3BvbnNlID0gR0tSZXNwb25zZTo6ZXJyb3IoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChod19kZXZpY2UpIHsKLSAgICAgICAgICAgIC8vIEhJREwgZ2F0ZWtlZXBlciBzZXJ2aWNlCi0gICAgICAgICAgICBSZXR1cm48dm9pZD4gaHdSZXMgPSBod19kZXZpY2UtPnZlcmlmeSgKKyAgICB9IGVsc2UgaWYgKGh3X2RldmljZSkgeworICAgICAgICAvLyBISURMIGdhdGVrZWVwZXIgc2VydmljZQorICAgICAgICBSZXR1cm48dm9pZD4gaHdSZXMgPSBod19kZXZpY2UtPnZlcmlmeSgKICAgICAgICAgICAgICAgICBod191c2VySWQsIGNoYWxsZW5nZSwgY3VyUHdkSGFuZGxlLCBlbnRlcmVkUHdkLAogICAgICAgICAgICAgICAgIFsmZ2tSZXNwb25zZV0oY29uc3QgR2F0ZWtlZXBlclJlc3BvbnNlJiByc3ApIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHJzcC5jb2RlID49IEdhdGVrZWVwZXJTdGF0dXNDb2RlOjpTVEFUVVNfT0spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICpna1Jlc3BvbnNlID0gR0tSZXNwb25zZTo6b2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAge3JzcC5kYXRhLmJlZ2luKCksIHJzcC5kYXRhLmVuZCgpfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByc3AuY29kZSA9PSBHYXRla2VlcGVyU3RhdHVzQ29kZTo6U1RBVFVTX1JFRU5ST0xMIC8qIHJlZW5yb2xsICovKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3JzcC5kYXRhLmJlZ2luKCksIHJzcC5kYXRhLmVuZCgpfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNwLmNvZGUgPT0gR2F0ZWtlZXBlclN0YXR1c0NvZGU6OlNUQVRVU19SRUVOUk9MTCAvKiByZWVucm9sbCAqLyk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocnNwLmNvZGUgPT0gR2F0ZWtlZXBlclN0YXR1c0NvZGU6OkVSUk9SX1JFVFJZX1RJTUVPVVQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICpna1Jlc3BvbnNlID0gR0tSZXNwb25zZTo6cmV0cnkocnNwLnRpbWVvdXQpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMzU4LDE0OSArMzY2LDExNSBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSk7CiAKLSAgICAgICAgICAgIGlmICghaHdSZXMuaXNPaygpKSB7Ci0gICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAidmVyaWZ5IHRyYW5zYWN0aW9uIGZhaWxlZCI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdLX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29uc3QgZ2F0ZWtlZXBlcjo6cGFzc3dvcmRfaGFuZGxlX3QqIGhhbmRsZSA9Ci0gICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBnYXRla2VlcGVyOjpwYXNzd29yZF9oYW5kbGVfdCo+KAotICAgICAgICAgICAgICAgICAgICBlbnJvbGxlZFBhc3N3b3JkSGFuZGxlLmRhdGEoKSk7Ci0gICAgICAgICAgICBzZWN1cmVVc2VySWQgPSBoYW5kbGUtPnVzZXJfaWQ7CisgICAgICAgIGlmICghaHdSZXMuaXNPaygpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJ2ZXJpZnkgdHJhbnNhY3Rpb24gZmFpbGVkIjsKKyAgICAgICAgICAgIHJldHVybiBHS19FUlJPUjsKICAgICAgICAgfQorICAgICAgICBjb25zdCBnYXRla2VlcGVyOjpwYXNzd29yZF9oYW5kbGVfdCogaGFuZGxlID0KKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGdhdGVrZWVwZXI6OnBhc3N3b3JkX2hhbmRsZV90Kj4oCisgICAgICAgICAgICAgICAgICAgICAgICBlbnJvbGxlZFBhc3N3b3JkSGFuZGxlLmRhdGEoKSk7CisgICAgICAgIHNlY3VyZVVzZXJJZCA9IGhhbmRsZS0+dXNlcl9pZDsKKyAgICB9CiAKLSAgICAgICAgaWYgKGdrUmVzcG9uc2UtPnJlc3BvbnNlX2NvZGUoKSA9PSBHS1Jlc3BvbnNlQ29kZTo6T0spIHsKLSAgICAgICAgICAgIGlmIChna1Jlc3BvbnNlLT5wYXlsb2FkKCkuc2l6ZSgpICE9IDApIHsKLSAgICAgICAgICAgICAgICAvLyB0cnkgdG8gY29ubmVjdCB0byBJS2V5c3RvcmVBdXRob3JpemF0aW9uIEFJREwgc2VydmljZSBmaXJzdC4KLSAgICAgICAgICAgICAgICBBSUJpbmRlciogYXV0aHpBSUJpbmRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBBU2VydmljZU1hbmFnZXJfZ2V0U2VydmljZSgiYW5kcm9pZC5zZWN1cml0eS5hdXRob3JpemF0aW9uIik7Ci0gICAgICAgICAgICAgICAgOjpuZGs6OlNwQUlCaW5kZXIgYXV0aHpCaW5kZXIoYXV0aHpBSUJpbmRlcik7Ci0gICAgICAgICAgICAgICAgYXV0byBhdXRoelNlcnZpY2UgPSBJS2V5c3RvcmVBdXRob3JpemF0aW9uOjpmcm9tQmluZGVyKGF1dGh6QmluZGVyKTsKLSAgICAgICAgICAgICAgICBpZiAoYXV0aHpTZXJ2aWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChna1Jlc3BvbnNlLT5wYXlsb2FkKCkuc2l6ZSgpICE9IHNpemVvZihod19hdXRoX3Rva2VuX3QpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbmNvcnJlY3Qgc2l6ZSBvZiBBdXRoVG9rZW4gcGF5bG9hZC4iOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdLX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaHdfYXV0aF90b2tlbl90KiBod0F1dGhUb2tlbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBod19hdXRoX3Rva2VuX3QqPihna1Jlc3BvbnNlLT5wYXlsb2FkKCkuZGF0YSgpKTsKLSAgICAgICAgICAgICAgICAgICAgSGFyZHdhcmVBdXRoVG9rZW4gYXV0aFRva2VuOwotCi0gICAgICAgICAgICAgICAgICAgIGF1dGhUb2tlbi50aW1lc3RhbXAubWlsbGlTZWNvbmRzID0gYmV0b2g2NChod0F1dGhUb2tlbi0+dGltZXN0YW1wKTsKLSAgICAgICAgICAgICAgICAgICAgYXV0aFRva2VuLmNoYWxsZW5nZSA9IGh3QXV0aFRva2VuLT5jaGFsbGVuZ2U7Ci0gICAgICAgICAgICAgICAgICAgIGF1dGhUb2tlbi51c2VySWQgPSBod0F1dGhUb2tlbi0+dXNlcl9pZDsKLSAgICAgICAgICAgICAgICAgICAgYXV0aFRva2VuLmF1dGhlbnRpY2F0b3JJZCA9IGh3QXV0aFRva2VuLT5hdXRoZW50aWNhdG9yX2lkOwotICAgICAgICAgICAgICAgICAgICBhdXRoVG9rZW4uYXV0aGVudGljYXRvclR5cGUgPSBzdGF0aWNfY2FzdDxIYXJkd2FyZUF1dGhlbnRpY2F0b3JUeXBlPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXRvaDMyKGh3QXV0aFRva2VuLT5hdXRoZW50aWNhdG9yX3R5cGUpKTsKLSAgICAgICAgICAgICAgICAgICAgYXV0aFRva2VuLm1hYy5hc3NpZ24oJmh3QXV0aFRva2VuLT5obWFjWzBdLCAmaHdBdXRoVG9rZW4tPmhtYWNbMzJdKTsKLSAgICAgICAgICAgICAgICAgICAgYXV0byByZXN1bHQgPSBhdXRoelNlcnZpY2UtPmFkZEF1dGhUb2tlbihhdXRoVG9rZW4pOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdC5pc09rKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWx1cmUgaW4gc2VuZGluZyBBdXRoVG9rZW4gdG8gQXV0aG9yaXphdGlvblNlcnZpY2UuIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBHS19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCBkZWxpdmVyIGF1dGggdG9rZW4uIFVuYWJsZSB0byBjb21tdW5pY2F0ZSB3aXRoICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS2V5c3RvcmUuIjsKKyAgICBpZiAoZ2tSZXNwb25zZS0+cmVzcG9uc2VfY29kZSgpID09IEdLUmVzcG9uc2VDb2RlOjpPSykgeworICAgICAgICBpZiAoZ2tSZXNwb25zZS0+cGF5bG9hZCgpLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICAvLyB0cnkgdG8gY29ubmVjdCB0byBJS2V5c3RvcmVBdXRob3JpemF0aW9uIEFJREwgc2VydmljZSBmaXJzdC4KKyAgICAgICAgICAgIEFJQmluZGVyKiBhdXRoekFJQmluZGVyID0gQVNlcnZpY2VNYW5hZ2VyX2dldFNlcnZpY2UoImFuZHJvaWQuc2VjdXJpdHkuYXV0aG9yaXphdGlvbiIpOworICAgICAgICAgICAgOjpuZGs6OlNwQUlCaW5kZXIgYXV0aHpCaW5kZXIoYXV0aHpBSUJpbmRlcik7CisgICAgICAgICAgICBhdXRvIGF1dGh6U2VydmljZSA9IElLZXlzdG9yZUF1dGhvcml6YXRpb246OmZyb21CaW5kZXIoYXV0aHpCaW5kZXIpOworICAgICAgICAgICAgaWYgKGF1dGh6U2VydmljZSkgeworICAgICAgICAgICAgICAgIGlmIChna1Jlc3BvbnNlLT5wYXlsb2FkKCkuc2l6ZSgpICE9IHNpemVvZihod19hdXRoX3Rva2VuX3QpKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkluY29ycmVjdCBzaXplIG9mIEF1dGhUb2tlbiBwYXlsb2FkLiI7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBHS19FUlJPUjsKICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25zdCBod19hdXRoX3Rva2VuX3QqIGh3QXV0aFRva2VuID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaHdfYXV0aF90b2tlbl90Kj4oZ2tSZXNwb25zZS0+cGF5bG9hZCgpLmRhdGEoKSk7CisgICAgICAgICAgICAgICAgSGFyZHdhcmVBdXRoVG9rZW4gYXV0aFRva2VuOworCisgICAgICAgICAgICAgICAgYXV0aFRva2VuLnRpbWVzdGFtcC5taWxsaVNlY29uZHMgPSBiZXRvaDY0KGh3QXV0aFRva2VuLT50aW1lc3RhbXApOworICAgICAgICAgICAgICAgIGF1dGhUb2tlbi5jaGFsbGVuZ2UgPSBod0F1dGhUb2tlbi0+Y2hhbGxlbmdlOworICAgICAgICAgICAgICAgIGF1dGhUb2tlbi51c2VySWQgPSBod0F1dGhUb2tlbi0+dXNlcl9pZDsKKyAgICAgICAgICAgICAgICBhdXRoVG9rZW4uYXV0aGVudGljYXRvcklkID0gaHdBdXRoVG9rZW4tPmF1dGhlbnRpY2F0b3JfaWQ7CisgICAgICAgICAgICAgICAgYXV0aFRva2VuLmF1dGhlbnRpY2F0b3JUeXBlID0gc3RhdGljX2Nhc3Q8SGFyZHdhcmVBdXRoZW50aWNhdG9yVHlwZT4oCisgICAgICAgICAgICAgICAgICAgICAgICBiZXRvaDMyKGh3QXV0aFRva2VuLT5hdXRoZW50aWNhdG9yX3R5cGUpKTsKKyAgICAgICAgICAgICAgICBhdXRoVG9rZW4ubWFjLmFzc2lnbigmaHdBdXRoVG9rZW4tPmhtYWNbMF0sICZod0F1dGhUb2tlbi0+aG1hY1szMl0pOworICAgICAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gYXV0aHpTZXJ2aWNlLT5hZGRBdXRoVG9rZW4oYXV0aFRva2VuKTsKKyAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbHVyZSBpbiBzZW5kaW5nIEF1dGhUb2tlbiB0byBBdXRob3JpemF0aW9uU2VydmljZS4iOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gR0tfRVJST1I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgZGVsaXZlciBhdXRoIHRva2VuLiBVbmFibGUgdG8gY29tbXVuaWNhdGUgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS2V5c3RvcmUuIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gR0tfRVJST1I7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1heWJlX3N0b3JlX3NpZCh1c2VySWQsIHNlY3VyZVVzZXJJZCk7CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgICAgICBtYXliZV9zdG9yZV9zaWQodXNlcklkLCBzZWN1cmVVc2VySWQpOwogICAgIH0KIAotICAgIFN0YXR1cyBnZXRTZWN1cmVVc2VySWQoaW50MzJfdCB1c2VySWQsIGludDY0X3QqIHNpZCkgb3ZlcnJpZGUgewotICAgICAgICAqc2lkID0gcmVhZF9zaWQodXNlcklkKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgICB9Ci0KLSAgICBTdGF0dXMgY2xlYXJTZWN1cmVVc2VySWQoaW50MzJfdCB1c2VySWQpIG92ZXJyaWRlIHsKLSAgICAgICAgSVBDVGhyZWFkU3RhdGUqIGlwYyA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7Ci0gICAgICAgIGNvbnN0IGludCBjYWxsaW5nX3BpZCA9IGlwYy0+Z2V0Q2FsbGluZ1BpZCgpOwotICAgICAgICBjb25zdCBpbnQgY2FsbGluZ191aWQgPSBpcGMtPmdldENhbGxpbmdVaWQoKTsKLSAgICAgICAgaWYgKCFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihLRVlHVUFSRF9QRVJNSVNTSU9OLCBjYWxsaW5nX3BpZCwgY2FsbGluZ191aWQpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IHBlcm1pc3Npb24gZGVuaWVkIGZvciBbJWQ6JWRdIiwgX19mdW5jX18sIGNhbGxpbmdfcGlkLCBjYWxsaW5nX3VpZCk7Ci0gICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICAgICAgICB9Ci0gICAgICAgIGNsZWFyX3NpZCh1c2VySWQpOwotCi0gICAgICAgIHVpbnQzMl90IGh3X3VzZXJJZCA9IGFkanVzdF91c2VySWQodXNlcklkKTsKLSAgICAgICAgaWYgKGFpZGxfaHdfZGV2aWNlKSB7Ci0gICAgICAgICAgICBhaWRsX2h3X2RldmljZS0+ZGVsZXRlVXNlcihod191c2VySWQpOwotICAgICAgICB9IGVsc2UgaWYgKGh3X2RldmljZSkgewotICAgICAgICAgICAgaHdfZGV2aWNlLT5kZWxldGVVc2VyKGh3X3VzZXJJZCwgW10oY29uc3QgR2F0ZWtlZXBlclJlc3BvbnNlJikge30pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gICAgfQotCi0gICAgU3RhdHVzIHJlcG9ydERldmljZVNldHVwQ29tcGxldGUoKSBvdmVycmlkZSB7Ci0gICAgICAgIElQQ1RocmVhZFN0YXRlKiBpcGMgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOwotICAgICAgICBjb25zdCBpbnQgY2FsbGluZ19waWQgPSBpcGMtPmdldENhbGxpbmdQaWQoKTsKLSAgICAgICAgY29uc3QgaW50IGNhbGxpbmdfdWlkID0gaXBjLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oS0VZR1VBUkRfUEVSTUlTU0lPTiwgY2FsbGluZ19waWQsIGNhbGxpbmdfdWlkKSkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBwZXJtaXNzaW9uIGRlbmllZCBmb3IgWyVkOiVkXSIsIF9fZnVuY19fLCBjYWxsaW5nX3BpZCwgY2FsbGluZ191aWQpOwotICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNsZWFyX3N0YXRlX2lmX25lZWRlZCgpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICAgIH0KLQotICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+Jikgb3ZlcnJpZGUgewotICAgICAgICBJUENUaHJlYWRTdGF0ZSogaXBjID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKLSAgICAgICAgY29uc3QgaW50IHBpZCA9IGlwYy0+Z2V0Q2FsbGluZ1BpZCgpOwotICAgICAgICBjb25zdCBpbnQgdWlkID0gaXBjLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oRFVNUF9QRVJNSVNTSU9OLCBwaWQsIHVpZCkpIHsKLSAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhaWRsX2h3X2RldmljZSA9PSBudWxscHRyICYmIGh3X2RldmljZSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBjb25zdCBjaGFyKiByZXN1bHQgPSAiRGV2aWNlIG5vdCBhdmFpbGFibGUiOwotICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdCwgc3RybGVuKHJlc3VsdCkgKyAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIHJlc3VsdCA9ICJPSyI7Ci0gICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LCBzdHJsZW4ocmVzdWx0KSArIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICBwcml2YXRlOgotICAgIC8vIEFJREwgZ2F0ZWtlZXBlciBzZXJ2aWNlLgotICAgIHN0ZDo6c2hhcmVkX3B0cjxBaWRsSUdhdGVrZWVwZXI+IGFpZGxfaHdfZGV2aWNlOwotICAgIC8vIEhJREwgZ2F0ZWtlZXBlciBzZXJ2aWNlLgotICAgIHNwPElHYXRla2VlcGVyPiBod19kZXZpY2U7Ci0KLSAgICBib29sIGNsZWFyX3N0YXRlX2lmX25lZWRlZF9kb25lOwotICAgIGJvb2wgaXNfcnVubmluZ19nc2k7Ci19OwotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgewotICAgIEFMT0dJKCJTdGFydGluZyBnYXRla2VlcGVyZC4uLiIpOwotICAgIGlmIChhcmdjIDwgMikgewotICAgICAgICBBTE9HRSgiQSBkaXJlY3RvcnkgbXVzdCBiZSBzcGVjaWZpZWQhIik7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBpZiAoY2hkaXIoYXJndlsxXSkgPT0gLTEpIHsKLSAgICAgICAgQUxPR0UoImNoZGlyOiAlczogJXMiLCBhcmd2WzFdLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpJU2VydmljZU1hbmFnZXI+IHNtID0gYW5kcm9pZDo6ZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7Ci0gICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6R2F0ZUtlZXBlclByb3h5PiBwcm94eSA9IG5ldyBhbmRyb2lkOjpHYXRlS2VlcGVyUHJveHkoKTsKLSAgICBhbmRyb2lkOjpzdGF0dXNfdCByZXQgPQotICAgICAgICBzbS0+YWRkU2VydmljZShhbmRyb2lkOjpTdHJpbmcxNigiYW5kcm9pZC5zZXJ2aWNlLmdhdGVrZWVwZXIuSUdhdGVLZWVwZXJTZXJ2aWNlIiksIHByb3h5KTsKLSAgICBpZiAocmV0ICE9IGFuZHJvaWQ6Ok9LKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZG4ndCByZWdpc3RlciBiaW5kZXIgc2VydmljZSEiKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qCi0gICAgICogV2UncmUgdGhlIG9ubHkgdGhyZWFkIGluIGV4aXN0ZW5jZSwgc28gd2UncmUganVzdCBnb2luZyB0byBwcm9jZXNzCi0gICAgICogQmluZGVyIHRyYW5zYWN0aW9uIGFzIGEgc2luZ2xlLXRocmVhZGVkIHByb2dyYW0uCi0gICAgICovCi0gICAgYW5kcm9pZDo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+am9pblRocmVhZFBvb2woKTsKLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQorCitTdGF0dXMgR2F0ZUtlZXBlclByb3h5OjpnZXRTZWN1cmVVc2VySWQoaW50MzJfdCB1c2VySWQsIGludDY0X3QqIHNpZCkgeworICAgICpzaWQgPSByZWFkX3NpZCh1c2VySWQpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBHYXRlS2VlcGVyUHJveHk6OmNsZWFyU2VjdXJlVXNlcklkKGludDMyX3QgdXNlcklkKSB7CisgICAgSVBDVGhyZWFkU3RhdGUqIGlwYyA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7CisgICAgY29uc3QgaW50IGNhbGxpbmdfcGlkID0gaXBjLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgY29uc3QgaW50IGNhbGxpbmdfdWlkID0gaXBjLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgaWYgKCFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihLRVlHVUFSRF9QRVJNSVNTSU9OLCBjYWxsaW5nX3BpZCwgY2FsbGluZ191aWQpKSB7CisgICAgICAgIEFMT0dFKCIlczogcGVybWlzc2lvbiBkZW5pZWQgZm9yIFslZDolZF0iLCBfX2Z1bmNfXywgY2FsbGluZ19waWQsIGNhbGxpbmdfdWlkKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICB9CisgICAgY2xlYXJfc2lkKHVzZXJJZCk7CisKKyAgICB1aW50MzJfdCBod191c2VySWQgPSAwOworICAgIFN0YXR1cyByZXN1bHQgPSBhZGp1c3RfdXNlcklkKHVzZXJJZCwgJmh3X3VzZXJJZCk7CisgICAgaWYgKCFyZXN1bHQuaXNPaygpKSB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgaWYgKGFpZGxfaHdfZGV2aWNlKSB7CisgICAgICAgIGFpZGxfaHdfZGV2aWNlLT5kZWxldGVVc2VyKGh3X3VzZXJJZCk7CisgICAgfSBlbHNlIGlmIChod19kZXZpY2UpIHsKKyAgICAgICAgaHdfZGV2aWNlLT5kZWxldGVVc2VyKGh3X3VzZXJJZCwgW10oY29uc3QgR2F0ZWtlZXBlclJlc3BvbnNlJikge30pOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgR2F0ZUtlZXBlclByb3h5OjpyZXBvcnREZXZpY2VTZXR1cENvbXBsZXRlKCkgeworICAgIElQQ1RocmVhZFN0YXRlKiBpcGMgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOworICAgIGNvbnN0IGludCBjYWxsaW5nX3BpZCA9IGlwYy0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIGNvbnN0IGludCBjYWxsaW5nX3VpZCA9IGlwYy0+Z2V0Q2FsbGluZ1VpZCgpOworICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oS0VZR1VBUkRfUEVSTUlTU0lPTiwgY2FsbGluZ19waWQsIGNhbGxpbmdfdWlkKSkgeworICAgICAgICBBTE9HRSgiJXM6IHBlcm1pc3Npb24gZGVuaWVkIGZvciBbJWQ6JWRdIiwgX19mdW5jX18sIGNhbGxpbmdfcGlkLCBjYWxsaW5nX3VpZCk7CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgY2xlYXJfc3RhdGVfaWZfbmVlZGVkKCk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworc3RhdHVzX3QgR2F0ZUtlZXBlclByb3h5OjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYpIHsKKyAgICBJUENUaHJlYWRTdGF0ZSogaXBjID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKKyAgICBjb25zdCBpbnQgcGlkID0gaXBjLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgY29uc3QgaW50IHVpZCA9IGlwYy0+Z2V0Q2FsbGluZ1VpZCgpOworICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oRFVNUF9QRVJNSVNTSU9OLCBwaWQsIHVpZCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIGlmIChhaWRsX2h3X2RldmljZSA9PSBudWxscHRyICYmIGh3X2RldmljZSA9PSBudWxscHRyKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIHJlc3VsdCA9ICJEZXZpY2Ugbm90IGF2YWlsYWJsZSI7CisgICAgICAgIHdyaXRlKGZkLCByZXN1bHQsIHN0cmxlbihyZXN1bHQpICsgMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgY2hhciogcmVzdWx0ID0gIk9LIjsKKyAgICAgICAgd3JpdGUoZmQsIHJlc3VsdCwgc3RybGVuKHJlc3VsdCkgKyAxKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZ2F0ZWtlZXBlcmQvZ2F0ZWtlZXBlcmQuaCBiL2dhdGVrZWVwZXJkL2dhdGVrZWVwZXJkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFmMDhjNgotLS0gL2Rldi9udWxsCisrKyBiL2dhdGVrZWVwZXJkL2dhdGVrZWVwZXJkLmgKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvaGFyZHdhcmUvZ2F0ZWtlZXBlci9JR2F0ZWtlZXBlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ2F0ZWtlZXBlci8xLjAvSUdhdGVrZWVwZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL3NlcnZpY2UvZ2F0ZWtlZXBlci9CbkdhdGVLZWVwZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8Z2F0ZWtlZXBlci9HYXRlS2VlcGVyUmVzcG9uc2UuaD4KKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z2F0ZWtlZXBlcjo6VjFfMDo6SUdhdGVrZWVwZXI7Cit1c2luZyBBaWRsSUdhdGVrZWVwZXIgPSA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpnYXRla2VlcGVyOjpJR2F0ZWtlZXBlcjsKK3VzaW5nIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM7Cit1c2luZyA6OmFuZHJvaWQ6OnNlcnZpY2U6OmdhdGVrZWVwZXI6OkJuR2F0ZUtlZXBlclNlcnZpY2U7Cit1c2luZyBHS1Jlc3BvbnNlID0gOjphbmRyb2lkOjpzZXJ2aWNlOjpnYXRla2VlcGVyOjpHYXRlS2VlcGVyUmVzcG9uc2U7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgR2F0ZUtlZXBlclByb3h5IDogcHVibGljIEJuR2F0ZUtlZXBlclNlcnZpY2UgeworICBwdWJsaWM6CisgICAgR2F0ZUtlZXBlclByb3h5KCk7CisKKyAgICB2aXJ0dWFsIH5HYXRlS2VlcGVyUHJveHkoKSB7fQorCisgICAgdm9pZCBzdG9yZV9zaWQodWludDMyX3QgdXNlcklkLCB1aW50NjRfdCBzaWQpOworCisgICAgdm9pZCBjbGVhcl9zdGF0ZV9pZl9uZWVkZWQoKTsKKworICAgIGJvb2wgbWFya19jb2xkX2Jvb3QoKTsKKworICAgIHZvaWQgbWF5YmVfc3RvcmVfc2lkKHVpbnQzMl90IHVzZXJJZCwgdWludDY0X3Qgc2lkKTsKKworICAgIHVpbnQ2NF90IHJlYWRfc2lkKHVpbnQzMl90IHVzZXJJZCk7CisKKyAgICB2b2lkIGNsZWFyX3NpZCh1aW50MzJfdCB1c2VySWQpOworCisgICAgLy8gVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gdXNlcklkcyBiZWluZyBwYXNzZWQgdG8gdGhlIEdhdGVLZWVwZXIgSEFMLiBJdCBlbnN1cmVzIHRoYXQKKyAgICAvLyBzZWN1cmUgc3RvcmFnZSBzaGFyZWQgYWNyb3NzIGEgR1NJIGltYWdlIGFuZCBhIGhvc3QgaW1hZ2Ugd2lsbCBub3Qgb3ZlcmxhcC4KKyAgICBTdGF0dXMgYWRqdXN0X3VzZXJJZCh1aW50MzJfdCB1c2VySWQsIHVpbnQzMl90KiBod191c2VySWQpOworCisjZGVmaW5lIEdLX0VSUk9SICpna1Jlc3BvbnNlID0gR0tSZXNwb25zZTo6ZXJyb3IoKSwgU3RhdHVzOjpvaygpCisKKyAgICBTdGF0dXMgZW5yb2xsKGludDMyX3QgdXNlcklkLCBjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiYgY3VycmVudFBhc3N3b3JkSGFuZGxlLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4mIGN1cnJlbnRQYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBkZXNpcmVkUGFzc3dvcmQsIEdLUmVzcG9uc2UqIGdrUmVzcG9uc2UpIG92ZXJyaWRlOworCisgICAgU3RhdHVzIHZlcmlmeShpbnQzMl90IHVzZXJJZCwgY29uc3QgOjpzdGQ6OnZlY3Rvcjx1aW50OF90PiYgZW5yb2xsZWRQYXNzd29yZEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IDo6c3RkOjp2ZWN0b3I8dWludDhfdD4mIHByb3ZpZGVkUGFzc3dvcmQsIEdLUmVzcG9uc2UqIGdrUmVzcG9uc2UpIG92ZXJyaWRlOworCisgICAgU3RhdHVzIHZlcmlmeUNoYWxsZW5nZShpbnQzMl90IHVzZXJJZCwgaW50NjRfdCBjaGFsbGVuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgZW5yb2xsZWRQYXNzd29yZEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwcm92aWRlZFBhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0tSZXNwb25zZSogZ2tSZXNwb25zZSkgb3ZlcnJpZGU7CisKKyAgICBTdGF0dXMgZ2V0U2VjdXJlVXNlcklkKGludDMyX3QgdXNlcklkLCBpbnQ2NF90KiBzaWQpIG92ZXJyaWRlOworCisgICAgU3RhdHVzIGNsZWFyU2VjdXJlVXNlcklkKGludDMyX3QgdXNlcklkKSBvdmVycmlkZTsKKworICAgIFN0YXR1cyByZXBvcnREZXZpY2VTZXR1cENvbXBsZXRlKCkgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYpIG92ZXJyaWRlOworCisgIHByaXZhdGU6CisgICAgLy8gQUlETCBnYXRla2VlcGVyIHNlcnZpY2UuCisgICAgc3RkOjpzaGFyZWRfcHRyPEFpZGxJR2F0ZWtlZXBlcj4gYWlkbF9od19kZXZpY2U7CisgICAgLy8gSElETCBnYXRla2VlcGVyIHNlcnZpY2UuCisgICAgc3A8SUdhdGVrZWVwZXI+IGh3X2RldmljZTsKKworICAgIGJvb2wgY2xlYXJfc3RhdGVfaWZfbmVlZGVkX2RvbmU7CisgICAgYm9vbCBpc19ydW5uaW5nX2dzaTsKK307Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZ2F0ZWtlZXBlcmQvbWFpbi5jcHAgYi9nYXRla2VlcGVyZC9tYWluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDFmOWRlCi0tLSAvZGV2L251bGwKKysrIGIvZ2F0ZWtlZXBlcmQvbWFpbi5jcHAKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlICJnYXRla2VlcGVyZC5oIgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgICAgQUxPR0koIlN0YXJ0aW5nIGdhdGVrZWVwZXJkLi4uIik7CisgICAgaWYgKGFyZ2MgPCAyKSB7CisgICAgICAgIEFMT0dFKCJBIGRpcmVjdG9yeSBtdXN0IGJlIHNwZWNpZmllZCEiKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChjaGRpcihhcmd2WzFdKSA9PSAtMSkgeworICAgICAgICBBTE9HRSgiY2hkaXI6ICVzOiAlcyIsIGFyZ3ZbMV0sIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OklTZXJ2aWNlTWFuYWdlcj4gc20gPSBhbmRyb2lkOjpkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKyAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpHYXRlS2VlcGVyUHJveHk+IHByb3h5ID0gbmV3IGFuZHJvaWQ6OkdhdGVLZWVwZXJQcm94eSgpOworICAgIGFuZHJvaWQ6OnN0YXR1c190IHJldCA9IHNtLT5hZGRTZXJ2aWNlKAorICAgICAgICAgICAgYW5kcm9pZDo6U3RyaW5nMTYoImFuZHJvaWQuc2VydmljZS5nYXRla2VlcGVyLklHYXRlS2VlcGVyU2VydmljZSIpLCBwcm94eSk7CisgICAgaWYgKHJldCAhPSBhbmRyb2lkOjpPSykgeworICAgICAgICBBTE9HRSgiQ291bGRuJ3QgcmVnaXN0ZXIgYmluZGVyIHNlcnZpY2UhIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8qCisgICAgICogV2UncmUgdGhlIG9ubHkgdGhyZWFkIGluIGV4aXN0ZW5jZSwgc28gd2UncmUganVzdCBnb2luZyB0byBwcm9jZXNzCisgICAgICogQmluZGVyIHRyYW5zYWN0aW9uIGFzIGEgc2luZ2xlLXRocmVhZGVkIHByb2dyYW0uCisgICAgICovCisgICAgYW5kcm9pZDo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+am9pblRocmVhZFBvb2woKTsKKyAgICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2hlYWx0aGQvQW5kcm9pZC5icCBiL2hlYWx0aGQvQW5kcm9pZC5icAppbmRleCAyMzUzMDNmLi5lMTU4ZTA3IDEwMDY0NAotLS0gYS9oZWFsdGhkL0FuZHJvaWQuYnAKKysrIGIvaGVhbHRoZC9BbmRyb2lkLmJwCkBAIC03Niw3ICs3Niw3IEBACiAgICAgZGVmYXVsdHM6IFsibGliYmF0dGVyeW1vbml0b3JfZGVmYXVsdHMiXSwKICAgICBzcmNzOiBbIkJhdHRlcnlNb25pdG9yLmNwcCJdLAogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmhlYWx0aC1WMi1uZGsiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5oZWFsdGgtVjMtbmRrIiwKICAgICBdLAogICAgIHdob2xlX3N0YXRpY19saWJzOiBbCiAgICAgICAgIC8vIE5lZWQgdG8gdHJhbnNsYXRlIEhJREwgdG8gQUlETCB0byBzdXBwb3J0IGxlZ2FjeSBBUElzIGluCkBAIC0xMDAsNDQgKzEwMCw2IEBACiAgICAgXSwKIH0KIAotY2NfZGVmYXVsdHMgewotICAgIG5hbWU6ICJhbmRyb2lkLmhhcmR3YXJlLmhlYWx0aEAyLjAtc2VydmljZV9kZWZhdWx0cyIsCi0KLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1XYWxsIiwKLSAgICAgICAgIi1XZXJyb3IiLAotICAgIF0sCi0KLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5oZWFsdGhAMi4wLWltcGwiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5oZWFsdGhAMS4wLWNvbnZlcnQiLAotICAgICAgICAibGliaGVhbHRoc2VydmljZSIsCi0gICAgICAgICJsaWJoZWFsdGhzdG9yYWdlZGVmYXVsdCIsCi0gICAgICAgICJsaWJiYXR0ZXJ5bW9uaXRvciIsCi0gICAgXSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJiYXNlIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJoaWRsYmFzZSIsCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5oZWFsdGhAMi4wIiwKLSAgICBdLAotfQotCi1jY19iaW5hcnkgewotICAgIG5hbWU6ICJhbmRyb2lkLmhhcmR3YXJlLmhlYWx0aEAyLjAtc2VydmljZSIsCi0gICAgZGVmYXVsdHM6IFsiYW5kcm9pZC5oYXJkd2FyZS5oZWFsdGhAMi4wLXNlcnZpY2VfZGVmYXVsdHMiXSwKLQotICAgIHZlbmRvcjogdHJ1ZSwKLSAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJodyIsCi0gICAgaW5pdF9yYzogWyJhbmRyb2lkLmhhcmR3YXJlLmhlYWx0aEAyLjAtc2VydmljZS5yYyJdLAotICAgIHNyY3M6IFsKLSAgICAgICAgIkhlYWx0aFNlcnZpY2VEZWZhdWx0LmNwcCIsCi0gICAgXSwKLX0KLQogY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJoZWFsdGhkX2NoYXJnZXJfbm9wcyIsCiAgICAgcmVjb3ZlcnlfYXZhaWxhYmxlOiB0cnVlLApAQCAtMjAzLDEyICsxNjUsMTIgQEAKICAgICBkZWZhdWx0czogWyJsaWJoZWFsdGhkX2NoYXJnZXJfdWlfZGVmYXVsdHMiXSwKIAogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmhlYWx0aC1WMi1uZGsiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5oZWFsdGgtVjMtbmRrIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuaGVhbHRoLXRyYW5zbGF0ZS1uZGsiLAogICAgIF0sCiAKICAgICBleHBvcnRfc3RhdGljX2xpYl9oZWFkZXJzOiBbCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmhlYWx0aC1WMi1uZGsiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5oZWFsdGgtVjMtbmRrIiwKICAgICBdLAogfQogCkBAIC0yODAsNyArMjQyLDcgQEAKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAvLyBjb21tb24KICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuaGVhbHRoQDEuMC1jb252ZXJ0IiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuaGVhbHRoLVYyLW5kayIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmhlYWx0aC1WMy1uZGsiLAogICAgICAgICAibGliYmF0dGVyeW1vbml0b3IiLAogICAgICAgICAibGliY2hhcmdlcl9zeXNwcm9wIiwKICAgICAgICAgImxpYmhlYWx0aGRfY2hhcmdlcl9ub3BzIiwKZGlmZiAtLWdpdCBhL2hlYWx0aGQvQmF0dGVyeU1vbml0b3IuY3BwIGIvaGVhbHRoZC9CYXR0ZXJ5TW9uaXRvci5jcHAKaW5kZXggYmQ3OTU1YS4uYjhiYjU4NiAxMDA2NDQKLS0tIGEvaGVhbHRoZC9CYXR0ZXJ5TW9uaXRvci5jcHAKKysrIGIvaGVhbHRoZC9CYXR0ZXJ5TW9uaXRvci5jcHAKQEAgLTU5LDYgKzU5LDcgQEAKIHVzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoZWFsdGg6OkJhdHRlcnlDaGFyZ2luZ1N0YXRlOwogdXNpbmcgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhlYWx0aDo6QmF0dGVyeUhlYWx0aDsKIHVzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoZWFsdGg6OkJhdHRlcnlIZWFsdGhEYXRhOwordXNpbmcgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhlYWx0aDo6QmF0dGVyeVBhcnRTdGF0dXM7CiB1c2luZyBhaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6aGVhbHRoOjpCYXR0ZXJ5U3RhdHVzOwogdXNpbmcgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhlYWx0aDo6SGVhbHRoSW5mbzsKIApAQCAtMjE5LDYgKzIyMCw3IEBACiAgICAgICAgICAgICB7Ildhcm0iLCBCYXR0ZXJ5SGVhbHRoOjpHT09EfSwKICAgICAgICAgICAgIHsiQ29vbCIsIEJhdHRlcnlIZWFsdGg6OkdPT0R9LAogICAgICAgICAgICAgeyJIb3QiLCBCYXR0ZXJ5SGVhbHRoOjpPVkVSSEVBVH0sCisgICAgICAgICAgICB7IkNhbGlicmF0aW9uIHJlcXVpcmVkIiwgQmF0dGVyeUhlYWx0aDo6SU5DT05TSVNURU5UfSwKICAgICAgICAgICAgIHtOVUxMLCBCYXR0ZXJ5SGVhbHRoOjpVTktOT1dOfSwKICAgICB9OwogCkBAIC0zNjEsNyArMzYzLDcgQEAKIHZvaWQgQmF0dGVyeU1vbml0b3I6OnVwZGF0ZVZhbHVlcyh2b2lkKSB7CiAgICAgaW5pdEhlYWx0aEluZm8obUhlYWx0aEluZm8uZ2V0KCkpOwogCi0gICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVByZXNlbnRQYXRoLmlzRW1wdHkoKSkKKyAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5UHJlc2VudFBhdGguZW1wdHkoKSkKICAgICAgICAgbUhlYWx0aEluZm8tPmJhdHRlcnlQcmVzZW50ID0gZ2V0Qm9vbGVhbkZpZWxkKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5UHJlc2VudFBhdGgpOwogICAgIGVsc2UKICAgICAgICAgbUhlYWx0aEluZm8tPmJhdHRlcnlQcmVzZW50ID0gbUJhdHRlcnlEZXZpY2VQcmVzZW50OwpAQCAtMzcxLDQzICszNzMsNDMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdldEludEZpZWxkKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2FwYWNpdHlQYXRoKTsKICAgICBtSGVhbHRoSW5mby0+YmF0dGVyeVZvbHRhZ2VNaWxsaXZvbHRzID0gZ2V0SW50RmllbGQobUhlYWx0aGRDb25maWctPmJhdHRlcnlWb2x0YWdlUGF0aCkgLyAxMDAwOwogCi0gICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnROb3dQYXRoLmlzRW1wdHkoKSkKKyAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudE5vd1BhdGguZW1wdHkoKSkKICAgICAgICAgbUhlYWx0aEluZm8tPmJhdHRlcnlDdXJyZW50TWljcm9hbXBzID0gZ2V0SW50RmllbGQobUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50Tm93UGF0aCk7CiAKLSAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5RnVsbENoYXJnZVBhdGguaXNFbXB0eSgpKQorICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlGdWxsQ2hhcmdlUGF0aC5lbXB0eSgpKQogICAgICAgICBtSGVhbHRoSW5mby0+YmF0dGVyeUZ1bGxDaGFyZ2VVYWggPSBnZXRJbnRGaWVsZChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZ1bGxDaGFyZ2VQYXRoKTsKIAotICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDeWNsZUNvdW50UGF0aC5pc0VtcHR5KCkpCisgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN5Y2xlQ291bnRQYXRoLmVtcHR5KCkpCiAgICAgICAgIG1IZWFsdGhJbmZvLT5iYXR0ZXJ5Q3ljbGVDb3VudCA9IGdldEludEZpZWxkKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3ljbGVDb3VudFBhdGgpOwogCi0gICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNoYXJnZUNvdW50ZXJQYXRoLmlzRW1wdHkoKSkKKyAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2hhcmdlQ291bnRlclBhdGguZW1wdHkoKSkKICAgICAgICAgbUhlYWx0aEluZm8tPmJhdHRlcnlDaGFyZ2VDb3VudGVyVWFoID0KICAgICAgICAgICAgICAgICBnZXRJbnRGaWVsZChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNoYXJnZUNvdW50ZXJQYXRoKTsKIAotICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50QXZnUGF0aC5pc0VtcHR5KCkpCisgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnRBdmdQYXRoLmVtcHR5KCkpCiAgICAgICAgIG1IZWFsdGhJbmZvLT5iYXR0ZXJ5Q3VycmVudEF2ZXJhZ2VNaWNyb2FtcHMgPQogICAgICAgICAgICAgICAgIGdldEludEZpZWxkKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudEF2Z1BhdGgpOwogCi0gICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNoYXJnZVRpbWVUb0Z1bGxOb3dQYXRoLmlzRW1wdHkoKSkKKyAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2hhcmdlVGltZVRvRnVsbE5vd1BhdGguZW1wdHkoKSkKICAgICAgICAgbUhlYWx0aEluZm8tPmJhdHRlcnlDaGFyZ2VUaW1lVG9GdWxsTm93U2Vjb25kcyA9CiAgICAgICAgICAgICAgICAgZ2V0SW50RmllbGQobUhlYWx0aGRDb25maWctPmJhdHRlcnlDaGFyZ2VUaW1lVG9GdWxsTm93UGF0aCk7CiAKLSAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5RnVsbENoYXJnZURlc2lnbkNhcGFjaXR5VWFoUGF0aC5pc0VtcHR5KCkpCisgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZ1bGxDaGFyZ2VEZXNpZ25DYXBhY2l0eVVhaFBhdGguZW1wdHkoKSkKICAgICAgICAgbUhlYWx0aEluZm8tPmJhdHRlcnlGdWxsQ2hhcmdlRGVzaWduQ2FwYWNpdHlVYWggPQogICAgICAgICAgICAgICAgIGdldEludEZpZWxkKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5RnVsbENoYXJnZURlc2lnbkNhcGFjaXR5VWFoUGF0aCk7CiAKLSAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5SGVhbHRoU3RhdHVzUGF0aC5pc0VtcHR5KCkpCisgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUhlYWx0aFN0YXR1c1BhdGguZW1wdHkoKSkKICAgICAgICAgbUJhdHRlcnlIZWFsdGhTdGF0dXMgPSBnZXRJbnRGaWVsZChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUhlYWx0aFN0YXR1c1BhdGgpOwogCi0gICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVN0YXRlT2ZIZWFsdGhQYXRoLmlzRW1wdHkoKSkKKyAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5U3RhdGVPZkhlYWx0aFBhdGguZW1wdHkoKSkKICAgICAgICAgbUhlYWx0aEluZm8tPmJhdHRlcnlIZWFsdGhEYXRhLT5iYXR0ZXJ5U3RhdGVPZkhlYWx0aCA9CiAgICAgICAgICAgICAgICAgZ2V0SW50RmllbGQobUhlYWx0aGRDb25maWctPmJhdHRlcnlTdGF0ZU9mSGVhbHRoUGF0aCk7CiAKLSAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5TWFudWZhY3R1cmluZ0RhdGVQYXRoLmlzRW1wdHkoKSkKKyAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5TWFudWZhY3R1cmluZ0RhdGVQYXRoLmVtcHR5KCkpCiAgICAgICAgIG1IZWFsdGhJbmZvLT5iYXR0ZXJ5SGVhbHRoRGF0YS0+YmF0dGVyeU1hbnVmYWN0dXJpbmdEYXRlU2Vjb25kcyA9CiAgICAgICAgICAgICAgICAgZ2V0SW50RmllbGQobUhlYWx0aGRDb25maWctPmJhdHRlcnlNYW51ZmFjdHVyaW5nRGF0ZVBhdGgpOwogCi0gICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZpcnN0VXNhZ2VEYXRlUGF0aC5pc0VtcHR5KCkpCisgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZpcnN0VXNhZ2VEYXRlUGF0aC5lbXB0eSgpKQogICAgICAgICBtSGVhbHRoSW5mby0+YmF0dGVyeUhlYWx0aERhdGEtPmJhdHRlcnlGaXJzdFVzYWdlU2Vjb25kcyA9CiAgICAgICAgICAgICAgICAgZ2V0SW50RmllbGQobUhlYWx0aGRDb25maWctPmJhdHRlcnlGaXJzdFVzYWdlRGF0ZVBhdGgpOwogCkBAIC00MzIsNyArNDM0LDcgQEAKICAgICB9CiAKICAgICBpZiAocmVhZEZyb21GaWxlKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5VGVjaG5vbG9neVBhdGgsICZidWYpID4gMCkKLSAgICAgICAgbUhlYWx0aEluZm8tPmJhdHRlcnlUZWNobm9sb2d5ID0gU3RyaW5nOChidWYuY19zdHIoKSk7CisgICAgICAgIG1IZWFsdGhJbmZvLT5iYXR0ZXJ5VGVjaG5vbG9neSA9IGJ1ZjsKIAogICAgIGlmIChyZWFkRnJvbUZpbGUobUhlYWx0aGRDb25maWctPmNoYXJnaW5nUG9saWN5UGF0aCwgJmJ1ZikgPiAwKQogICAgICAgICBtSGVhbHRoSW5mby0+Y2hhcmdpbmdQb2xpY3kgPSBnZXRCYXR0ZXJ5Q2hhcmdpbmdQb2xpY3koYnVmLmNfc3RyKCkpOwpAQCAtNDQ0LDEyICs0NDYsMTAgQEAKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNoYXJnZXJOYW1lcy5zaXplKCk7IGkrKykgewogICAgICAgICBTdHJpbmc4IHBhdGg7Ci0gICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy9vbmxpbmUiLCBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYXJnZXJOYW1lc1tpXS5zdHJpbmcoKSk7CisgICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy9vbmxpbmUiLCBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwgbUNoYXJnZXJOYW1lc1tpXS5jX3N0cigpKTsKICAgICAgICAgaWYgKGdldEludEZpZWxkKHBhdGgpKSB7CiAgICAgICAgICAgICBwYXRoLmNsZWFyKCk7Ci0gICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvdHlwZSIsIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYXJnZXJOYW1lc1tpXS5zdHJpbmcoKSk7CisgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvdHlwZSIsIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILCBtQ2hhcmdlck5hbWVzW2ldLmNfc3RyKCkpOwogICAgICAgICAgICAgc3dpdGNoKHJlYWRQb3dlclN1cHBseVR5cGUocGF0aCkpIHsKICAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9QT1dFUl9TVVBQTFlfVFlQRV9BQzoKICAgICAgICAgICAgICAgICBtSGVhbHRoSW5mby0+Y2hhcmdlckFjT25saW5lID0gdHJ1ZTsKQEAgLTQ2NiwyNiArNDY2LDI0IEBACiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIHBhdGguY2xlYXIoKTsKICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvaXNfZG9jayIsIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFyZ2VyTmFtZXNbaV0uc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5zdHJpbmcoKSwgUl9PSykgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhcmdlck5hbWVzW2ldLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICBtSGVhbHRoSW5mby0+Y2hhcmdlckRvY2tPbmxpbmUgPSB0cnVlOwogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgS0xPR19XQVJOSU5HKExPR19UQUcsICIlczogVW5rbm93biBwb3dlciBzdXBwbHkgdHlwZVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFyZ2VyTmFtZXNbaV0uc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYXJnZXJOYW1lc1tpXS5jX3N0cigpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBhdGguY2xlYXIoKTsKICAgICAgICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy9jdXJyZW50X21heCIsIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYXJnZXJOYW1lc1tpXS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICBpbnQgQ2hhcmdpbmdDdXJyZW50ID0KLSAgICAgICAgICAgICAgICAgICAgKGFjY2VzcyhwYXRoLnN0cmluZygpLCBSX09LKSA9PSAwKSA/IGdldEludEZpZWxkKHBhdGgpIDogMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFyZ2VyTmFtZXNbaV0uY19zdHIoKSk7CisgICAgICAgICAgICBpbnQgQ2hhcmdpbmdDdXJyZW50ID0gKGFjY2VzcyhwYXRoLmNfc3RyKCksIFJfT0spID09IDApID8gZ2V0SW50RmllbGQocGF0aCkgOiAwOwogCiAgICAgICAgICAgICBwYXRoLmNsZWFyKCk7CiAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvdm9sdGFnZV9tYXgiLCBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFyZ2VyTmFtZXNbaV0uc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYXJnZXJOYW1lc1tpXS5jX3N0cigpKTsKIAogICAgICAgICAgICAgaW50IENoYXJnaW5nVm9sdGFnZSA9Ci0gICAgICAgICAgICAgICAgKGFjY2VzcyhwYXRoLnN0cmluZygpLCBSX09LKSA9PSAwKSA/IGdldEludEZpZWxkKHBhdGgpIDoKLSAgICAgICAgICAgICAgICBERUZBVUxUX1ZCVVNfVk9MVEFHRTsKKyAgICAgICAgICAgICAgICAgICAgKGFjY2VzcyhwYXRoLmNfc3RyKCksIFJfT0spID09IDApID8gZ2V0SW50RmllbGQocGF0aCkgOiBERUZBVUxUX1ZCVVNfVk9MVEFHRTsKIAogICAgICAgICAgICAgZG91YmxlIHBvd2VyID0gKChkb3VibGUpQ2hhcmdpbmdDdXJyZW50IC8gTUlMTElPTikgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKChkb3VibGUpQ2hhcmdpbmdWb2x0YWdlIC8gTUlMTElPTik7CkBAIC01MTAsMTcgKzUwOCwxNyBAQAogICAgICAgICAgICAgICAgICBwcm9wcy5iYXR0ZXJ5U3RhdHVzKTsKIAogICAgICAgICBsZW4gPSBzdHJsZW4oZG1lc2dsaW5lKTsKLSAgICAgICAgaWYgKCFoZWFsdGhkX2NvbmZpZy5iYXR0ZXJ5Q3VycmVudE5vd1BhdGguaXNFbXB0eSgpKSB7CisgICAgICAgIGlmICghaGVhbHRoZF9jb25maWcuYmF0dGVyeUN1cnJlbnROb3dQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgIGxlbiArPSBzbnByaW50ZihkbWVzZ2xpbmUgKyBsZW4sIHNpemVvZihkbWVzZ2xpbmUpIC0gbGVuLCAiIGM9JWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLmJhdHRlcnlDdXJyZW50TWljcm9hbXBzKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghaGVhbHRoZF9jb25maWcuYmF0dGVyeUZ1bGxDaGFyZ2VQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICBpZiAoIWhlYWx0aGRfY29uZmlnLmJhdHRlcnlGdWxsQ2hhcmdlUGF0aC5lbXB0eSgpKSB7CiAgICAgICAgICAgICBsZW4gKz0gc25wcmludGYoZG1lc2dsaW5lICsgbGVuLCBzaXplb2YoZG1lc2dsaW5lKSAtIGxlbiwgIiBmYz0lZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMuYmF0dGVyeUZ1bGxDaGFyZ2VVYWgpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFoZWFsdGhkX2NvbmZpZy5iYXR0ZXJ5Q3ljbGVDb3VudFBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgIGlmICghaGVhbHRoZF9jb25maWcuYmF0dGVyeUN5Y2xlQ291bnRQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgIGxlbiArPSBzbnByaW50ZihkbWVzZ2xpbmUgKyBsZW4sIHNpemVvZihkbWVzZ2xpbmUpIC0gbGVuLCAiIGNjPSVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wcy5iYXR0ZXJ5Q3ljbGVDb3VudCk7CiAgICAgICAgIH0KQEAgLTU1NCw3ICs1NTIsNyBAQAogCiBpbnQgQmF0dGVyeU1vbml0b3I6OmdldENoYXJnZVN0YXR1cygpIHsKICAgICBCYXR0ZXJ5U3RhdHVzIHJlc3VsdCA9IEJhdHRlcnlTdGF0dXM6OlVOS05PV047Ci0gICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVN0YXR1c1BhdGguaXNFbXB0eSgpKSB7CisgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVN0YXR1c1BhdGguZW1wdHkoKSkgewogICAgICAgICBzdGQ6OnN0cmluZyBidWY7CiAgICAgICAgIGlmIChyZWFkRnJvbUZpbGUobUhlYWx0aGRDb25maWctPmJhdHRlcnlTdGF0dXNQYXRoLCAmYnVmKSA+IDApCiAgICAgICAgICAgICByZXN1bHQgPSBnZXRCYXR0ZXJ5U3RhdHVzKGJ1Zi5jX3N0cigpKTsKQEAgLTU2NSw3ICs1NjMsNyBAQAogc3RhdHVzX3QgQmF0dGVyeU1vbml0b3I6OnNldENoYXJnaW5nUG9saWN5KGludCB2YWx1ZSkgewogICAgIHN0YXR1c190IHJldCA9IE5BTUVfTk9UX0ZPVU5EOwogICAgIGJvb2wgcmVzdWx0OwotICAgIGlmICghbUhlYWx0aGRDb25maWctPmNoYXJnaW5nUG9saWN5UGF0aC5pc0VtcHR5KCkpIHsKKyAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5jaGFyZ2luZ1BvbGljeVBhdGguZW1wdHkoKSkgewogICAgICAgICByZXN1bHQgPSB3cml0ZVRvRmlsZShtSGVhbHRoZENvbmZpZy0+Y2hhcmdpbmdQb2xpY3lQYXRoLCB2YWx1ZSk7CiAgICAgICAgIGlmICghcmVzdWx0KSB7CiAgICAgICAgICAgICBLTE9HX1dBUk5JTkcoTE9HX1RBRywgInNldENoYXJnaW5nUG9saWN5IGZhaWxcbiIpOwpAQCAtNTc5LDcgKzU3Nyw3IEBACiAKIGludCBCYXR0ZXJ5TW9uaXRvcjo6Z2V0Q2hhcmdpbmdQb2xpY3koKSB7CiAgICAgQmF0dGVyeUNoYXJnaW5nUG9saWN5IHJlc3VsdCA9IEJhdHRlcnlDaGFyZ2luZ1BvbGljeTo6REVGQVVMVDsKLSAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5jaGFyZ2luZ1BvbGljeVBhdGguaXNFbXB0eSgpKSB7CisgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+Y2hhcmdpbmdQb2xpY3lQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgc3RkOjpzdHJpbmcgYnVmOwogICAgICAgICBpZiAocmVhZEZyb21GaWxlKG1IZWFsdGhkQ29uZmlnLT5jaGFyZ2luZ1BvbGljeVBhdGgsICZidWYpID4gMCkKICAgICAgICAgICAgIHJlc3VsdCA9IGdldEJhdHRlcnlDaGFyZ2luZ1BvbGljeShidWYuY19zdHIoKSk7CkBAIC01ODksMTcgKzU4NywyMCBAQAogCiBpbnQgQmF0dGVyeU1vbml0b3I6OmdldEJhdHRlcnlIZWFsdGhEYXRhKGludCBpZCkgewogICAgIGlmIChpZCA9PSBCQVRURVJZX1BST1BfTUFOVUZBQ1RVUklOR19EQVRFKSB7Ci0gICAgICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlNYW51ZmFjdHVyaW5nRGF0ZVBhdGguaXNFbXB0eSgpKQorICAgICAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5TWFudWZhY3R1cmluZ0RhdGVQYXRoLmVtcHR5KCkpCiAgICAgICAgICAgICByZXR1cm4gZ2V0SW50RmllbGQobUhlYWx0aGRDb25maWctPmJhdHRlcnlNYW51ZmFjdHVyaW5nRGF0ZVBhdGgpOwogICAgIH0KICAgICBpZiAoaWQgPT0gQkFUVEVSWV9QUk9QX0ZJUlNUX1VTQUdFX0RBVEUpIHsKLSAgICAgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZpcnN0VXNhZ2VEYXRlUGF0aC5pc0VtcHR5KCkpCisgICAgICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlGaXJzdFVzYWdlRGF0ZVBhdGguZW1wdHkoKSkKICAgICAgICAgICAgIHJldHVybiBnZXRJbnRGaWVsZChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZpcnN0VXNhZ2VEYXRlUGF0aCk7CiAgICAgfQogICAgIGlmIChpZCA9PSBCQVRURVJZX1BST1BfU1RBVEVfT0ZfSEVBTFRIKSB7Ci0gICAgICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlTdGF0ZU9mSGVhbHRoUGF0aC5pc0VtcHR5KCkpCisgICAgICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlTdGF0ZU9mSGVhbHRoUGF0aC5lbXB0eSgpKQogICAgICAgICAgICAgcmV0dXJuIGdldEludEZpZWxkKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5U3RhdGVPZkhlYWx0aFBhdGgpOwogICAgIH0KKyAgICBpZiAoaWQgPT0gQkFUVEVSWV9QUk9QX1BBUlRfU1RBVFVTKSB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KEJhdHRlcnlQYXJ0U3RhdHVzOjpVTlNVUFBPUlRFRCk7CisgICAgfQogICAgIHJldHVybiAwOwogfQogCkBAIC02MTEsNyArNjEyLDcgQEAKIAogICAgIHN3aXRjaChpZCkgewogICAgIGNhc2UgQkFUVEVSWV9QUk9QX0NIQVJHRV9DT1VOVEVSOgotICAgICAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2hhcmdlQ291bnRlclBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDaGFyZ2VDb3VudGVyUGF0aC5lbXB0eSgpKSB7CiAgICAgICAgICAgICB2YWwtPnZhbHVlSW50NjQgPQogICAgICAgICAgICAgICAgIGdldEludEZpZWxkKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2hhcmdlQ291bnRlclBhdGgpOwogICAgICAgICAgICAgcmV0ID0gT0s7CkBAIC02MjEsNyArNjIyLDcgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEJBVFRFUllfUFJPUF9DVVJSRU5UX05PVzoKLSAgICAgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnROb3dQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudE5vd1BhdGguZW1wdHkoKSkgewogICAgICAgICAgICAgdmFsLT52YWx1ZUludDY0ID0KICAgICAgICAgICAgICAgICBnZXRJbnRGaWVsZChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnROb3dQYXRoKTsKICAgICAgICAgICAgIHJldCA9IE9LOwpAQCAtNjMxLDcgKzYzMiw3IEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBCQVRURVJZX1BST1BfQ1VSUkVOVF9BVkc6Ci0gICAgICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50QXZnUGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnRBdmdQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgIHZhbC0+dmFsdWVJbnQ2NCA9CiAgICAgICAgICAgICAgICAgZ2V0SW50RmllbGQobUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50QXZnUGF0aCk7CiAgICAgICAgICAgICByZXQgPSBPSzsKQEAgLTY0MSw3ICs2NDIsNyBAQAogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgQkFUVEVSWV9QUk9QX0NBUEFDSVRZOgotICAgICAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2FwYWNpdHlQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2FwYWNpdHlQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgIHZhbC0+dmFsdWVJbnQ2NCA9CiAgICAgICAgICAgICAgICAgZ2V0SW50RmllbGQobUhlYWx0aGRDb25maWctPmJhdHRlcnlDYXBhY2l0eVBhdGgpOwogICAgICAgICAgICAgcmV0ID0gT0s7CkBAIC02ODMsNiArNjg0LDExIEBACiAgICAgICAgIHJldCA9IE9LOwogICAgICAgICBicmVhazsKIAorICAgIGNhc2UgQkFUVEVSWV9QUk9QX1BBUlRfU1RBVFVTOgorICAgICAgICB2YWwtPnZhbHVlSW50NjQgPSBnZXRCYXR0ZXJ5SGVhbHRoRGF0YShCQVRURVJZX1BST1BfUEFSVF9TVEFUVVMpOworICAgICAgICByZXQgPSBPSzsKKyAgICAgICAgYnJlYWs7CisKICAgICBkZWZhdWx0OgogICAgICAgICBicmVhazsKICAgICB9CkBAIC02OTAsNiArNjk2LDExIEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAorc3RhdHVzX3QgQmF0dGVyeU1vbml0b3I6OmdldFNlcmlhbE51bWJlcihzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiogb3V0KSB7CisgICAgKm91dCA9IHN0ZDo6bnVsbG9wdDsKKyAgICByZXR1cm4gT0s7Cit9CisKIHZvaWQgQmF0dGVyeU1vbml0b3I6OmR1bXBTdGF0ZShpbnQgZmQpIHsKICAgICBpbnQgdjsKICAgICBjaGFyIHZzWzEyOF07CkBAIC03MDgsMzUgKzcxOSwzNSBAQAogICAgICAgICAgICAgIHByb3BzLmJhdHRlcnlWb2x0YWdlTWlsbGl2b2x0cywgcHJvcHMuYmF0dGVyeVRlbXBlcmF0dXJlVGVudGhzQ2Vsc2l1cyk7CiAgICAgd3JpdGUoZmQsIHZzLCBzdHJsZW4odnMpKTsKIAotICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50Tm93UGF0aC5pc0VtcHR5KCkpIHsKKyAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudE5vd1BhdGguZW1wdHkoKSkgewogICAgICAgICB2ID0gZ2V0SW50RmllbGQobUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50Tm93UGF0aCk7CiAgICAgICAgIHNucHJpbnRmKHZzLCBzaXplb2YodnMpLCAiY3VycmVudCBub3c6ICVkXG4iLCB2KTsKICAgICAgICAgd3JpdGUoZmQsIHZzLCBzdHJsZW4odnMpKTsKICAgICB9CiAKLSAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudEF2Z1BhdGguaXNFbXB0eSgpKSB7CisgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnRBdmdQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgdiA9IGdldEludEZpZWxkKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudEF2Z1BhdGgpOwogICAgICAgICBzbnByaW50Zih2cywgc2l6ZW9mKHZzKSwgImN1cnJlbnQgYXZnOiAlZFxuIiwgdik7CiAgICAgICAgIHdyaXRlKGZkLCB2cywgc3RybGVuKHZzKSk7CiAgICAgfQogCi0gICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNoYXJnZUNvdW50ZXJQYXRoLmlzRW1wdHkoKSkgeworICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDaGFyZ2VDb3VudGVyUGF0aC5lbXB0eSgpKSB7CiAgICAgICAgIHYgPSBnZXRJbnRGaWVsZChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNoYXJnZUNvdW50ZXJQYXRoKTsKICAgICAgICAgc25wcmludGYodnMsIHNpemVvZih2cyksICJjaGFyZ2UgY291bnRlcjogJWRcbiIsIHYpOwogICAgICAgICB3cml0ZShmZCwgdnMsIHN0cmxlbih2cykpOwogICAgIH0KIAotICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50Tm93UGF0aC5pc0VtcHR5KCkpIHsKKyAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudE5vd1BhdGguZW1wdHkoKSkgewogICAgICAgICBzbnByaW50Zih2cywgc2l6ZW9mKHZzKSwgImN1cnJlbnQgbm93OiAlZFxuIiwgcHJvcHMuYmF0dGVyeUN1cnJlbnRNaWNyb2FtcHMpOwogICAgICAgICB3cml0ZShmZCwgdnMsIHN0cmxlbih2cykpOwogICAgIH0KIAotICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDeWNsZUNvdW50UGF0aC5pc0VtcHR5KCkpIHsKKyAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3ljbGVDb3VudFBhdGguZW1wdHkoKSkgewogICAgICAgICBzbnByaW50Zih2cywgc2l6ZW9mKHZzKSwgImN5Y2xlIGNvdW50OiAlZFxuIiwgcHJvcHMuYmF0dGVyeUN5Y2xlQ291bnQpOwogICAgICAgICB3cml0ZShmZCwgdnMsIHN0cmxlbih2cykpOwogICAgIH0KIAotICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlGdWxsQ2hhcmdlUGF0aC5pc0VtcHR5KCkpIHsKKyAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5RnVsbENoYXJnZVBhdGguZW1wdHkoKSkgewogICAgICAgICBzbnByaW50Zih2cywgc2l6ZW9mKHZzKSwgIkZ1bGwgY2hhcmdlOiAlZFxuIiwgcHJvcHMuYmF0dGVyeUZ1bGxDaGFyZ2VVYWgpOwogICAgICAgICB3cml0ZShmZCwgdnMsIHN0cmxlbih2cykpOwogICAgIH0KQEAgLTc3NSw4ICs3ODYsNyBAQAogICAgICAgICAgICAgY2FzZSBBTkRST0lEX1BPV0VSX1NVUFBMWV9UWVBFX0RPQ0s6CiAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy9vbmxpbmUiLCBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLnN0cmluZygpLCBSX09LKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICBtQ2hhcmdlck5hbWVzLmFkZChTdHJpbmc4KG5hbWUpKTsKKyAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSykgPT0gMCkgbUNoYXJnZXJOYW1lcy5hZGQoU3RyaW5nOChuYW1lKSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9QT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOgpAQCAtNzg3LDE2NiArNzk3LDE2OCBAQAogICAgICAgICAgICAgICAgIGlmIChpc1Njb3BlZFBvd2VyU3VwcGx5KG5hbWUpKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICBtQmF0dGVyeURldmljZVByZXNlbnQgPSB0cnVlOwogCi0gICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5U3RhdHVzUGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlTdGF0dXNQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvc3RhdHVzIiwgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGgsIFJfT0spID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVN0YXR1c1BhdGggPSBwYXRoOworICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSykgPT0gMCkgbUhlYWx0aGRDb25maWctPmJhdHRlcnlTdGF0dXNQYXRoID0gcGF0aDsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlIZWFsdGhQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUhlYWx0aFBhdGguZW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICBwYXRoLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy9oZWFsdGgiLCBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aCwgUl9PSykgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5SGVhbHRoUGF0aCA9IHBhdGg7CisgICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKSBtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUhlYWx0aFBhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVByZXNlbnRQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVByZXNlbnRQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvcHJlc2VudCIsIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLCBSX09LKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWx0aGRDb25maWctPmJhdHRlcnlQcmVzZW50UGF0aCA9IHBhdGg7CisgICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKSBtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVByZXNlbnRQYXRoID0gcGF0aDsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlDYXBhY2l0eVBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2FwYWNpdHlQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvY2FwYWNpdHkiLCBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aCwgUl9PSykgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2FwYWNpdHlQYXRoID0gcGF0aDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLmNfc3RyKCksIFJfT0spID09IDApIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2FwYWNpdHlQYXRoID0gcGF0aDsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlWb2x0YWdlUGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlWb2x0YWdlUGF0aC5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL3ZvbHRhZ2Vfbm93IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGgsIFJfT0spID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLmNfc3RyKCksIFJfT0spID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Vm9sdGFnZVBhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5RnVsbENoYXJnZVBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5RnVsbENoYXJnZVBhdGguZW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICBwYXRoLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy9jaGFyZ2VfZnVsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLCBSX09LKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSykgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5RnVsbENoYXJnZVBhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnROb3dQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnROb3dQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvY3VycmVudF9ub3ciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aCwgUl9PSykgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLmNfc3RyKCksIFJfT0spID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnROb3dQYXRoID0gcGF0aDsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlDeWNsZUNvdW50UGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlDeWNsZUNvdW50UGF0aC5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL2N5Y2xlX2NvdW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGgsIFJfT0spID09IDApCisgICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWx0aGRDb25maWctPmJhdHRlcnlDeWNsZUNvdW50UGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2FwYWNpdHlMZXZlbFBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2FwYWNpdHlMZXZlbFBhdGguZW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICBwYXRoLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy9jYXBhY2l0eV9sZXZlbCIsIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLCBSX09LKSA9PSAwKSBtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNhcGFjaXR5TGV2ZWxQYXRoID0gcGF0aDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLmNfc3RyKCksIFJfT0spID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2FwYWNpdHlMZXZlbFBhdGggPSBwYXRoOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2hhcmdlVGltZVRvRnVsbE5vd1BhdGguaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2hhcmdlVGltZVRvRnVsbE5vd1BhdGguZW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICBwYXRoLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy90aW1lX3RvX2Z1bGxfbm93IiwgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGgsIFJfT0spID09IDApCisgICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWx0aGRDb25maWctPmJhdHRlcnlDaGFyZ2VUaW1lVG9GdWxsTm93UGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5RnVsbENoYXJnZURlc2lnbkNhcGFjaXR5VWFoUGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlGdWxsQ2hhcmdlRGVzaWduQ2FwYWNpdHlVYWhQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvY2hhcmdlX2Z1bGxfZGVzaWduIiwgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGgsIFJfT0spID09IDApCisgICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWx0aGRDb25maWctPmJhdHRlcnlGdWxsQ2hhcmdlRGVzaWduQ2FwYWNpdHlVYWhQYXRoID0gcGF0aDsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50QXZnUGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50QXZnUGF0aC5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL2N1cnJlbnRfYXZnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGgsIFJfT0spID09IDApCisgICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50QXZnUGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2hhcmdlQ291bnRlclBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2hhcmdlQ291bnRlclBhdGguZW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICBwYXRoLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy9jaGFyZ2VfY291bnRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLCBSX09LKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSykgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2hhcmdlQ291bnRlclBhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVRlbXBlcmF0dXJlUGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlUZW1wZXJhdHVyZVBhdGguZW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICBwYXRoLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy90ZW1wIiwgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGgsIFJfT0spID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLmNfc3RyKCksIFJfT0spID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5VGVtcGVyYXR1cmVQYXRoID0gcGF0aDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVRlY2hub2xvZ3lQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVRlY2hub2xvZ3lQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvdGVjaG5vbG9neSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLCBSX09LKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSykgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5VGVjaG5vbG9neVBhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVN0YXRlT2ZIZWFsdGhQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVN0YXRlT2ZIZWFsdGhQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvc3RhdGVfb2ZfaGVhbHRoIiwgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGgsIFJfT0spID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLmNfc3RyKCksIFJfT0spID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5U3RhdGVPZkhlYWx0aFBhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL2hlYWx0aF9pbmRleCIsIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aCwgUl9PSykgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5U3RhdGVPZkhlYWx0aFBhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5SGVhbHRoU3RhdHVzUGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlIZWFsdGhTdGF0dXNQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvaGVhbHRoX3N0YXR1cyIsIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLCBSX09LKSA9PSAwKSBtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUhlYWx0aFN0YXR1c1BhdGggPSBwYXRoOworICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSykgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWx0aGRDb25maWctPmJhdHRlcnlIZWFsdGhTdGF0dXNQYXRoID0gcGF0aDsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeU1hbnVmYWN0dXJpbmdEYXRlUGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlNYW51ZmFjdHVyaW5nRGF0ZVBhdGguZW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICBwYXRoLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy9tYW51ZmFjdHVyaW5nX2RhdGUiLCBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aCwgUl9PSykgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLmNfc3RyKCksIFJfT0spID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhbHRoZENvbmZpZy0+YmF0dGVyeU1hbnVmYWN0dXJpbmdEYXRlUGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Rmlyc3RVc2FnZURhdGVQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZpcnN0VXNhZ2VEYXRlUGF0aC5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL2ZpcnN0X3VzYWdlX2RhdGUiLCBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aCwgUl9PSykgPT0gMCkgbUhlYWx0aGRDb25maWctPmJhdHRlcnlGaXJzdFVzYWdlRGF0ZVBhdGggPSBwYXRoOworICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSykgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWx0aGRDb25maWctPmJhdHRlcnlGaXJzdFVzYWdlRGF0ZVBhdGggPSBwYXRoOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5jaGFyZ2luZ1N0YXRlUGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmNoYXJnaW5nU3RhdGVQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvY2hhcmdpbmdfc3RhdGUiLCBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aCwgUl9PSykgPT0gMCkgbUhlYWx0aGRDb25maWctPmNoYXJnaW5nU3RhdGVQYXRoID0gcGF0aDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLmNfc3RyKCksIFJfT0spID09IDApIG1IZWFsdGhkQ29uZmlnLT5jaGFyZ2luZ1N0YXRlUGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5jaGFyZ2luZ1BvbGljeVBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5jaGFyZ2luZ1BvbGljeVBhdGguZW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICBwYXRoLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy9jaGFyZ2luZ19wb2xpY3kiLCBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aCwgUl9PSykgPT0gMCkgbUhlYWx0aGRDb25maWctPmNoYXJnaW5nUG9saWN5UGF0aCA9IHBhdGg7CisgICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKSBtSGVhbHRoZENvbmZpZy0+Y2hhcmdpbmdQb2xpY3lQYXRoID0gcGF0aDsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTk1OCwxMiArOTcwLDEwIEBACiAgICAgICAgICAgICAvLyBMb29rIGZvciAiaXNfZG9jayIgZmlsZQogICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL2lzX2RvY2siLCBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwgbmFtZSk7Ci0gICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguc3RyaW5nKCksIFJfT0spID09IDApIHsKKyAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy9vbmxpbmUiLCBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLnN0cmluZygpLCBSX09LKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICBtQ2hhcmdlck5hbWVzLmFkZChTdHJpbmc4KG5hbWUpKTsKLQorICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKSBtQ2hhcmdlck5hbWVzLmFkZChTdHJpbmc4KG5hbWUpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTk3NSw0MyArOTg1LDQzIEBACiAgICAgICAgIGhjLT5wZXJpb2RpY19jaG9yZXNfaW50ZXJ2YWxfZmFzdCA9IC0xOwogICAgICAgICBoYy0+cGVyaW9kaWNfY2hvcmVzX2ludGVydmFsX3Nsb3cgPSAtMTsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlTdGF0dXNQYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5U3RhdHVzUGF0aC5lbXB0eSgpKQogICAgICAgICAgICAgS0xPR19XQVJOSU5HKExPR19UQUcsICJCYXR0ZXJ5U3RhdHVzUGF0aCBub3QgZm91bmRcbiIpOwotICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlIZWFsdGhQYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5SGVhbHRoUGF0aC5lbXB0eSgpKQogICAgICAgICAgICAgS0xPR19XQVJOSU5HKExPR19UQUcsICJCYXR0ZXJ5SGVhbHRoUGF0aCBub3QgZm91bmRcbiIpOwotICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlQcmVzZW50UGF0aC5pc0VtcHR5KCkpCisgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVByZXNlbnRQYXRoLmVtcHR5KCkpCiAgICAgICAgICAgICBLTE9HX1dBUk5JTkcoTE9HX1RBRywgIkJhdHRlcnlQcmVzZW50UGF0aCBub3QgZm91bmRcbiIpOwotICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlDYXBhY2l0eVBhdGguaXNFbXB0eSgpKQorICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlDYXBhY2l0eVBhdGguZW1wdHkoKSkKICAgICAgICAgICAgIEtMT0dfV0FSTklORyhMT0dfVEFHLCAiQmF0dGVyeUNhcGFjaXR5UGF0aCBub3QgZm91bmRcbiIpOwotICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlWb2x0YWdlUGF0aC5pc0VtcHR5KCkpCisgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVZvbHRhZ2VQYXRoLmVtcHR5KCkpCiAgICAgICAgICAgICBLTE9HX1dBUk5JTkcoTE9HX1RBRywgIkJhdHRlcnlWb2x0YWdlUGF0aCBub3QgZm91bmRcbiIpOwotICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlUZW1wZXJhdHVyZVBhdGguaXNFbXB0eSgpKQorICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlUZW1wZXJhdHVyZVBhdGguZW1wdHkoKSkKICAgICAgICAgICAgIEtMT0dfV0FSTklORyhMT0dfVEFHLCAiQmF0dGVyeVRlbXBlcmF0dXJlUGF0aCBub3QgZm91bmRcbiIpOwotICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlUZWNobm9sb2d5UGF0aC5pc0VtcHR5KCkpCisgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVRlY2hub2xvZ3lQYXRoLmVtcHR5KCkpCiAgICAgICAgICAgICBLTE9HX1dBUk5JTkcoTE9HX1RBRywgIkJhdHRlcnlUZWNobm9sb2d5UGF0aCBub3QgZm91bmRcbiIpOwotICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50Tm93UGF0aC5pc0VtcHR5KCkpCisgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnROb3dQYXRoLmVtcHR5KCkpCiAgICAgICAgICAgICBLTE9HX1dBUk5JTkcoTE9HX1RBRywgIkJhdHRlcnlDdXJyZW50Tm93UGF0aCBub3QgZm91bmRcbiIpOwotICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlGdWxsQ2hhcmdlUGF0aC5pc0VtcHR5KCkpCisgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZ1bGxDaGFyZ2VQYXRoLmVtcHR5KCkpCiAgICAgICAgICAgICBLTE9HX1dBUk5JTkcoTE9HX1RBRywgIkJhdHRlcnlGdWxsQ2hhcmdlUGF0aCBub3QgZm91bmRcbiIpOwotICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlDeWNsZUNvdW50UGF0aC5pc0VtcHR5KCkpCisgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN5Y2xlQ291bnRQYXRoLmVtcHR5KCkpCiAgICAgICAgICAgICBLTE9HX1dBUk5JTkcoTE9HX1RBRywgIkJhdHRlcnlDeWNsZUNvdW50UGF0aCBub3QgZm91bmRcbiIpOwotICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlDYXBhY2l0eUxldmVsUGF0aC5pc0VtcHR5KCkpCisgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNhcGFjaXR5TGV2ZWxQYXRoLmVtcHR5KCkpCiAgICAgICAgICAgICBLTE9HX1dBUk5JTkcoTE9HX1RBRywgImJhdHRlcnlDYXBhY2l0eUxldmVsUGF0aCBub3QgZm91bmRcbiIpOwotICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlDaGFyZ2VUaW1lVG9GdWxsTm93UGF0aC5pc0VtcHR5KCkpCisgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNoYXJnZVRpbWVUb0Z1bGxOb3dQYXRoLmVtcHR5KCkpCiAgICAgICAgICAgICBLTE9HX1dBUk5JTkcoTE9HX1RBRywgImJhdHRlcnlDaGFyZ2VUaW1lVG9GdWxsTm93UGF0aC4gbm90IGZvdW5kXG4iKTsKLSAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5RnVsbENoYXJnZURlc2lnbkNhcGFjaXR5VWFoUGF0aC5pc0VtcHR5KCkpCisgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZ1bGxDaGFyZ2VEZXNpZ25DYXBhY2l0eVVhaFBhdGguZW1wdHkoKSkKICAgICAgICAgICAgIEtMT0dfV0FSTklORyhMT0dfVEFHLCAiYmF0dGVyeUZ1bGxDaGFyZ2VEZXNpZ25DYXBhY2l0eVVhaFBhdGguIG5vdCBmb3VuZFxuIik7Ci0gICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVN0YXRlT2ZIZWFsdGhQYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5U3RhdGVPZkhlYWx0aFBhdGguZW1wdHkoKSkKICAgICAgICAgICAgIEtMT0dfV0FSTklORyhMT0dfVEFHLCAiYmF0dGVyeVN0YXRlT2ZIZWFsdGhQYXRoIG5vdCBmb3VuZFxuIik7Ci0gICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUhlYWx0aFN0YXR1c1BhdGguaXNFbXB0eSgpKQorICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlIZWFsdGhTdGF0dXNQYXRoLmVtcHR5KCkpCiAgICAgICAgICAgICBLTE9HX1dBUk5JTkcoTE9HX1RBRywgImJhdHRlcnlIZWFsdGhTdGF0dXNQYXRoIG5vdCBmb3VuZFxuIik7Ci0gICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeU1hbnVmYWN0dXJpbmdEYXRlUGF0aC5pc0VtcHR5KCkpCisgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeU1hbnVmYWN0dXJpbmdEYXRlUGF0aC5lbXB0eSgpKQogICAgICAgICAgICAgS0xPR19XQVJOSU5HKExPR19UQUcsICJiYXR0ZXJ5TWFudWZhY3R1cmluZ0RhdGVQYXRoIG5vdCBmb3VuZFxuIik7Ci0gICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZpcnN0VXNhZ2VEYXRlUGF0aC5pc0VtcHR5KCkpCisgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZpcnN0VXNhZ2VEYXRlUGF0aC5lbXB0eSgpKQogICAgICAgICAgICAgS0xPR19XQVJOSU5HKExPR19UQUcsICJiYXR0ZXJ5Rmlyc3RVc2FnZURhdGVQYXRoIG5vdCBmb3VuZFxuIik7Ci0gICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+Y2hhcmdpbmdTdGF0ZVBhdGguaXNFbXB0eSgpKQorICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmNoYXJnaW5nU3RhdGVQYXRoLmVtcHR5KCkpCiAgICAgICAgICAgICBLTE9HX1dBUk5JTkcoTE9HX1RBRywgImNoYXJnaW5nU3RhdGVQYXRoIG5vdCBmb3VuZFxuIik7Ci0gICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+Y2hhcmdpbmdQb2xpY3lQYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5jaGFyZ2luZ1BvbGljeVBhdGguZW1wdHkoKSkKICAgICAgICAgICAgIEtMT0dfV0FSTklORyhMT0dfVEFHLCAiY2hhcmdpbmdQb2xpY3lQYXRoIG5vdCBmb3VuZFxuIik7CiAgICAgfQogCmRpZmYgLS1naXQgYS9oZWFsdGhkL0JhdHRlcnlNb25pdG9yX3YxLmNwcCBiL2hlYWx0aGQvQmF0dGVyeU1vbml0b3JfdjEuY3BwCmluZGV4IGI4N2M0OTMuLjJlMGNmYzkgMTAwNjQ0Ci0tLSBhL2hlYWx0aGQvQmF0dGVyeU1vbml0b3JfdjEuY3BwCisrKyBiL2hlYWx0aGQvQmF0dGVyeU1vbml0b3JfdjEuY3BwCkBAIC0zMDEsNyArMzAxLDcgQEAKIHZvaWQgQmF0dGVyeU1vbml0b3I6OnVwZGF0ZVZhbHVlcyh2b2lkKSB7CiAgICAgaW5pdEhlYWx0aEluZm8obUhlYWx0aEluZm8uZ2V0KCkpOwogCi0gICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVByZXNlbnRQYXRoLmlzRW1wdHkoKSkKKyAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5UHJlc2VudFBhdGguZW1wdHkoKSkKICAgICAgICAgbUhlYWx0aEluZm8tPmJhdHRlcnlQcmVzZW50ID0gZ2V0Qm9vbGVhbkZpZWxkKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5UHJlc2VudFBhdGgpOwogICAgIGVsc2UKICAgICAgICAgbUhlYWx0aEluZm8tPmJhdHRlcnlQcmVzZW50ID0gbUJhdHRlcnlEZXZpY2VQcmVzZW50OwpAQCAtMzExLDI4ICszMTEsMjggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdldEludEZpZWxkKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2FwYWNpdHlQYXRoKTsKICAgICBtSGVhbHRoSW5mby0+YmF0dGVyeVZvbHRhZ2VNaWxsaXZvbHRzID0gZ2V0SW50RmllbGQobUhlYWx0aGRDb25maWctPmJhdHRlcnlWb2x0YWdlUGF0aCkgLyAxMDAwOwogCi0gICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnROb3dQYXRoLmlzRW1wdHkoKSkKKyAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudE5vd1BhdGguZW1wdHkoKSkKICAgICAgICAgbUhlYWx0aEluZm8tPmJhdHRlcnlDdXJyZW50TWljcm9hbXBzID0gZ2V0SW50RmllbGQobUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50Tm93UGF0aCk7CiAKLSAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5RnVsbENoYXJnZVBhdGguaXNFbXB0eSgpKQorICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlGdWxsQ2hhcmdlUGF0aC5lbXB0eSgpKQogICAgICAgICBtSGVhbHRoSW5mby0+YmF0dGVyeUZ1bGxDaGFyZ2VVYWggPSBnZXRJbnRGaWVsZChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZ1bGxDaGFyZ2VQYXRoKTsKIAotICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDeWNsZUNvdW50UGF0aC5pc0VtcHR5KCkpCisgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN5Y2xlQ291bnRQYXRoLmVtcHR5KCkpCiAgICAgICAgIG1IZWFsdGhJbmZvLT5iYXR0ZXJ5Q3ljbGVDb3VudCA9IGdldEludEZpZWxkKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3ljbGVDb3VudFBhdGgpOwogCi0gICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNoYXJnZUNvdW50ZXJQYXRoLmlzRW1wdHkoKSkKKyAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2hhcmdlQ291bnRlclBhdGguZW1wdHkoKSkKICAgICAgICAgbUhlYWx0aEluZm8tPmJhdHRlcnlDaGFyZ2VDb3VudGVyVWFoID0KICAgICAgICAgICAgICAgICBnZXRJbnRGaWVsZChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNoYXJnZUNvdW50ZXJQYXRoKTsKIAotICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50QXZnUGF0aC5pc0VtcHR5KCkpCisgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnRBdmdQYXRoLmVtcHR5KCkpCiAgICAgICAgIG1IZWFsdGhJbmZvLT5iYXR0ZXJ5Q3VycmVudEF2ZXJhZ2VNaWNyb2FtcHMgPQogICAgICAgICAgICAgICAgIGdldEludEZpZWxkKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudEF2Z1BhdGgpOwogCi0gICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNoYXJnZVRpbWVUb0Z1bGxOb3dQYXRoLmlzRW1wdHkoKSkKKyAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2hhcmdlVGltZVRvRnVsbE5vd1BhdGguZW1wdHkoKSkKICAgICAgICAgbUhlYWx0aEluZm8tPmJhdHRlcnlDaGFyZ2VUaW1lVG9GdWxsTm93U2Vjb25kcyA9CiAgICAgICAgICAgICAgICAgZ2V0SW50RmllbGQobUhlYWx0aGRDb25maWctPmJhdHRlcnlDaGFyZ2VUaW1lVG9GdWxsTm93UGF0aCk7CiAKLSAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5RnVsbENoYXJnZURlc2lnbkNhcGFjaXR5VWFoUGF0aC5pc0VtcHR5KCkpCisgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZ1bGxDaGFyZ2VEZXNpZ25DYXBhY2l0eVVhaFBhdGguZW1wdHkoKSkKICAgICAgICAgbUhlYWx0aEluZm8tPmJhdHRlcnlGdWxsQ2hhcmdlRGVzaWduQ2FwYWNpdHlVYWggPQogICAgICAgICAgICAgICAgIGdldEludEZpZWxkKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5RnVsbENoYXJnZURlc2lnbkNhcGFjaXR5VWFoUGF0aCk7CiAKQEAgLTM1MiwxOCArMzUyLDE2IEBACiAgICAgICAgIG1IZWFsdGhJbmZvLT5iYXR0ZXJ5SGVhbHRoID0gZ2V0QmF0dGVyeUhlYWx0aChidWYuY19zdHIoKSk7CiAKICAgICBpZiAocmVhZEZyb21GaWxlKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5VGVjaG5vbG9neVBhdGgsICZidWYpID4gMCkKLSAgICAgICAgbUhlYWx0aEluZm8tPmJhdHRlcnlUZWNobm9sb2d5ID0gU3RyaW5nOChidWYuY19zdHIoKSk7CisgICAgICAgIG1IZWFsdGhJbmZvLT5iYXR0ZXJ5VGVjaG5vbG9neSA9IGJ1ZjsKIAogICAgIGRvdWJsZSBNYXhQb3dlciA9IDA7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFyZ2VyTmFtZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgU3RyaW5nOCBwYXRoOwotICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvb25saW5lIiwgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFyZ2VyTmFtZXNbaV0uc3RyaW5nKCkpOworICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvb25saW5lIiwgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsIG1DaGFyZ2VyTmFtZXNbaV0uY19zdHIoKSk7CiAgICAgICAgIGlmIChnZXRJbnRGaWVsZChwYXRoKSkgewogICAgICAgICAgICAgcGF0aC5jbGVhcigpOwotICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL3R5cGUiLCBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFyZ2VyTmFtZXNbaV0uc3RyaW5nKCkpOworICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL3R5cGUiLCBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwgbUNoYXJnZXJOYW1lc1tpXS5jX3N0cigpKTsKICAgICAgICAgICAgIHN3aXRjaChyZWFkUG93ZXJTdXBwbHlUeXBlKHBhdGgpKSB7CiAgICAgICAgICAgICBjYXNlIEFORFJPSURfUE9XRVJfU1VQUExZX1RZUEVfQUM6CiAgICAgICAgICAgICAgICAgbUhlYWx0aEluZm8tPmNoYXJnZXJBY09ubGluZSA9IHRydWU7CkBAIC0zODAsMjYgKzM3OCwyNCBAQAogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBwYXRoLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL2lzX2RvY2siLCBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhcmdlck5hbWVzW2ldLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguc3RyaW5nKCksIFJfT0spID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYXJnZXJOYW1lc1tpXS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSykgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgbUhlYWx0aEluZm8tPmNoYXJnZXJEb2NrT25saW5lID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIEtMT0dfV0FSTklORyhMT0dfVEFHLCAiJXM6IFVua25vd24gcG93ZXIgc3VwcGx5IHR5cGVcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhcmdlck5hbWVzW2ldLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFyZ2VyTmFtZXNbaV0uY19zdHIoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwYXRoLmNsZWFyKCk7CiAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvY3VycmVudF9tYXgiLCBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFyZ2VyTmFtZXNbaV0uc3RyaW5nKCkpOwotICAgICAgICAgICAgaW50IENoYXJnaW5nQ3VycmVudCA9Ci0gICAgICAgICAgICAgICAgICAgIChhY2Nlc3MocGF0aC5zdHJpbmcoKSwgUl9PSykgPT0gMCkgPyBnZXRJbnRGaWVsZChwYXRoKSA6IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhcmdlck5hbWVzW2ldLmNfc3RyKCkpOworICAgICAgICAgICAgaW50IENoYXJnaW5nQ3VycmVudCA9IChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKSA/IGdldEludEZpZWxkKHBhdGgpIDogMDsKIAogICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL3ZvbHRhZ2VfbWF4IiwgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhcmdlck5hbWVzW2ldLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFyZ2VyTmFtZXNbaV0uY19zdHIoKSk7CiAKICAgICAgICAgICAgIGludCBDaGFyZ2luZ1ZvbHRhZ2UgPQotICAgICAgICAgICAgICAgIChhY2Nlc3MocGF0aC5zdHJpbmcoKSwgUl9PSykgPT0gMCkgPyBnZXRJbnRGaWVsZChwYXRoKSA6Ci0gICAgICAgICAgICAgICAgREVGQVVMVF9WQlVTX1ZPTFRBR0U7CisgICAgICAgICAgICAgICAgICAgIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKSA/IGdldEludEZpZWxkKHBhdGgpIDogREVGQVVMVF9WQlVTX1ZPTFRBR0U7CiAKICAgICAgICAgICAgIGRvdWJsZSBwb3dlciA9ICgoZG91YmxlKUNoYXJnaW5nQ3VycmVudCAvIE1JTExJT04pICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZG91YmxlKUNoYXJnaW5nVm9sdGFnZSAvIE1JTExJT04pOwpAQCAtNDI0LDE3ICs0MjAsMTcgQEAKICAgICAgICAgICAgICAgICAgcHJvcHMuYmF0dGVyeVN0YXR1cyk7CiAKICAgICAgICAgbGVuID0gc3RybGVuKGRtZXNnbGluZSk7Ci0gICAgICAgIGlmICghaGVhbHRoZF9jb25maWcuYmF0dGVyeUN1cnJlbnROb3dQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICBpZiAoIWhlYWx0aGRfY29uZmlnLmJhdHRlcnlDdXJyZW50Tm93UGF0aC5lbXB0eSgpKSB7CiAgICAgICAgICAgICBsZW4gKz0gc25wcmludGYoZG1lc2dsaW5lICsgbGVuLCBzaXplb2YoZG1lc2dsaW5lKSAtIGxlbiwgIiBjPSVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wcy5iYXR0ZXJ5Q3VycmVudE1pY3JvYW1wcyk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIWhlYWx0aGRfY29uZmlnLmJhdHRlcnlGdWxsQ2hhcmdlUGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgaWYgKCFoZWFsdGhkX2NvbmZpZy5iYXR0ZXJ5RnVsbENoYXJnZVBhdGguZW1wdHkoKSkgewogICAgICAgICAgICAgbGVuICs9IHNucHJpbnRmKGRtZXNnbGluZSArIGxlbiwgc2l6ZW9mKGRtZXNnbGluZSkgLSBsZW4sICIgZmM9JWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLmJhdHRlcnlGdWxsQ2hhcmdlVWFoKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghaGVhbHRoZF9jb25maWcuYmF0dGVyeUN5Y2xlQ291bnRQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICBpZiAoIWhlYWx0aGRfY29uZmlnLmJhdHRlcnlDeWNsZUNvdW50UGF0aC5lbXB0eSgpKSB7CiAgICAgICAgICAgICBsZW4gKz0gc25wcmludGYoZG1lc2dsaW5lICsgbGVuLCBzaXplb2YoZG1lc2dsaW5lKSAtIGxlbiwgIiBjYz0lZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMuYmF0dGVyeUN5Y2xlQ291bnQpOwogICAgICAgICB9CkBAIC00NjgsNyArNDY0LDcgQEAKIAogaW50IEJhdHRlcnlNb25pdG9yOjpnZXRDaGFyZ2VTdGF0dXMoKSB7CiAgICAgQmF0dGVyeVN0YXR1cyByZXN1bHQgPSBCYXR0ZXJ5U3RhdHVzOjpVTktOT1dOOwotICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlTdGF0dXNQYXRoLmlzRW1wdHkoKSkgeworICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlTdGF0dXNQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgc3RkOjpzdHJpbmcgYnVmOwogICAgICAgICBpZiAocmVhZEZyb21GaWxlKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5U3RhdHVzUGF0aCwgJmJ1ZikgPiAwKQogICAgICAgICAgICAgcmVzdWx0ID0gZ2V0QmF0dGVyeVN0YXR1cyhidWYuY19zdHIoKSk7CkBAIC00ODQsNyArNDgwLDcgQEAKIAogICAgIHN3aXRjaChpZCkgewogICAgIGNhc2UgQkFUVEVSWV9QUk9QX0NIQVJHRV9DT1VOVEVSOgotICAgICAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2hhcmdlQ291bnRlclBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDaGFyZ2VDb3VudGVyUGF0aC5lbXB0eSgpKSB7CiAgICAgICAgICAgICB2YWwtPnZhbHVlSW50NjQgPQogICAgICAgICAgICAgICAgIGdldEludEZpZWxkKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2hhcmdlQ291bnRlclBhdGgpOwogICAgICAgICAgICAgcmV0ID0gT0s7CkBAIC00OTQsNyArNDkwLDcgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEJBVFRFUllfUFJPUF9DVVJSRU5UX05PVzoKLSAgICAgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnROb3dQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudE5vd1BhdGguZW1wdHkoKSkgewogICAgICAgICAgICAgdmFsLT52YWx1ZUludDY0ID0KICAgICAgICAgICAgICAgICBnZXRJbnRGaWVsZChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnROb3dQYXRoKTsKICAgICAgICAgICAgIHJldCA9IE9LOwpAQCAtNTA0LDcgKzUwMCw3IEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBCQVRURVJZX1BST1BfQ1VSUkVOVF9BVkc6Ci0gICAgICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50QXZnUGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnRBdmdQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgIHZhbC0+dmFsdWVJbnQ2NCA9CiAgICAgICAgICAgICAgICAgZ2V0SW50RmllbGQobUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50QXZnUGF0aCk7CiAgICAgICAgICAgICByZXQgPSBPSzsKQEAgLTUxNCw3ICs1MTAsNyBAQAogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgQkFUVEVSWV9QUk9QX0NBUEFDSVRZOgotICAgICAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2FwYWNpdHlQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2FwYWNpdHlQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgIHZhbC0+dmFsdWVJbnQ2NCA9CiAgICAgICAgICAgICAgICAgZ2V0SW50RmllbGQobUhlYWx0aGRDb25maWctPmJhdHRlcnlDYXBhY2l0eVBhdGgpOwogICAgICAgICAgICAgcmV0ID0gT0s7CkBAIC01NjEsMzUgKzU1NywzNSBAQAogICAgICAgICAgICAgIHByb3BzLmJhdHRlcnlWb2x0YWdlTWlsbGl2b2x0cywgcHJvcHMuYmF0dGVyeVRlbXBlcmF0dXJlVGVudGhzQ2Vsc2l1cyk7CiAgICAgd3JpdGUoZmQsIHZzLCBzdHJsZW4odnMpKTsKIAotICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50Tm93UGF0aC5pc0VtcHR5KCkpIHsKKyAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudE5vd1BhdGguZW1wdHkoKSkgewogICAgICAgICB2ID0gZ2V0SW50RmllbGQobUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50Tm93UGF0aCk7CiAgICAgICAgIHNucHJpbnRmKHZzLCBzaXplb2YodnMpLCAiY3VycmVudCBub3c6ICVkXG4iLCB2KTsKICAgICAgICAgd3JpdGUoZmQsIHZzLCBzdHJsZW4odnMpKTsKICAgICB9CiAKLSAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudEF2Z1BhdGguaXNFbXB0eSgpKSB7CisgICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnRBdmdQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgdiA9IGdldEludEZpZWxkKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudEF2Z1BhdGgpOwogICAgICAgICBzbnByaW50Zih2cywgc2l6ZW9mKHZzKSwgImN1cnJlbnQgYXZnOiAlZFxuIiwgdik7CiAgICAgICAgIHdyaXRlKGZkLCB2cywgc3RybGVuKHZzKSk7CiAgICAgfQogCi0gICAgaWYgKCFtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNoYXJnZUNvdW50ZXJQYXRoLmlzRW1wdHkoKSkgeworICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDaGFyZ2VDb3VudGVyUGF0aC5lbXB0eSgpKSB7CiAgICAgICAgIHYgPSBnZXRJbnRGaWVsZChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNoYXJnZUNvdW50ZXJQYXRoKTsKICAgICAgICAgc25wcmludGYodnMsIHNpemVvZih2cyksICJjaGFyZ2UgY291bnRlcjogJWRcbiIsIHYpOwogICAgICAgICB3cml0ZShmZCwgdnMsIHN0cmxlbih2cykpOwogICAgIH0KIAotICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50Tm93UGF0aC5pc0VtcHR5KCkpIHsKKyAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudE5vd1BhdGguZW1wdHkoKSkgewogICAgICAgICBzbnByaW50Zih2cywgc2l6ZW9mKHZzKSwgImN1cnJlbnQgbm93OiAlZFxuIiwgcHJvcHMuYmF0dGVyeUN1cnJlbnRNaWNyb2FtcHMpOwogICAgICAgICB3cml0ZShmZCwgdnMsIHN0cmxlbih2cykpOwogICAgIH0KIAotICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlDeWNsZUNvdW50UGF0aC5pc0VtcHR5KCkpIHsKKyAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3ljbGVDb3VudFBhdGguZW1wdHkoKSkgewogICAgICAgICBzbnByaW50Zih2cywgc2l6ZW9mKHZzKSwgImN5Y2xlIGNvdW50OiAlZFxuIiwgcHJvcHMuYmF0dGVyeUN5Y2xlQ291bnQpOwogICAgICAgICB3cml0ZShmZCwgdnMsIHN0cmxlbih2cykpOwogICAgIH0KIAotICAgIGlmICghbUhlYWx0aGRDb25maWctPmJhdHRlcnlGdWxsQ2hhcmdlUGF0aC5pc0VtcHR5KCkpIHsKKyAgICBpZiAoIW1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5RnVsbENoYXJnZVBhdGguZW1wdHkoKSkgewogICAgICAgICBzbnByaW50Zih2cywgc2l6ZW9mKHZzKSwgIkZ1bGwgY2hhcmdlOiAlZFxuIiwgcHJvcHMuYmF0dGVyeUZ1bGxDaGFyZ2VVYWgpOwogICAgICAgICB3cml0ZShmZCwgdnMsIHN0cmxlbih2cykpOwogICAgIH0KQEAgLTYyOCw4ICs2MjQsNyBAQAogICAgICAgICAgICAgY2FzZSBBTkRST0lEX1BPV0VSX1NVUFBMWV9UWVBFX0RPQ0s6CiAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy9vbmxpbmUiLCBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLnN0cmluZygpLCBSX09LKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICBtQ2hhcmdlck5hbWVzLmFkZChTdHJpbmc4KG5hbWUpKTsKKyAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSykgPT0gMCkgbUNoYXJnZXJOYW1lcy5hZGQoU3RyaW5nOChuYW1lKSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9QT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOgpAQCAtNjQwLDEyMSArNjM1LDExOSBAQAogICAgICAgICAgICAgICAgIGlmIChpc1Njb3BlZFBvd2VyU3VwcGx5KG5hbWUpKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICBtQmF0dGVyeURldmljZVByZXNlbnQgPSB0cnVlOwogCi0gICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5U3RhdHVzUGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlTdGF0dXNQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvc3RhdHVzIiwgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGgsIFJfT0spID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVN0YXR1c1BhdGggPSBwYXRoOworICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSykgPT0gMCkgbUhlYWx0aGRDb25maWctPmJhdHRlcnlTdGF0dXNQYXRoID0gcGF0aDsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlIZWFsdGhQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUhlYWx0aFBhdGguZW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICBwYXRoLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy9oZWFsdGgiLCBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aCwgUl9PSykgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5SGVhbHRoUGF0aCA9IHBhdGg7CisgICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKSBtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUhlYWx0aFBhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVByZXNlbnRQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVByZXNlbnRQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvcHJlc2VudCIsIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLCBSX09LKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWx0aGRDb25maWctPmJhdHRlcnlQcmVzZW50UGF0aCA9IHBhdGg7CisgICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKSBtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVByZXNlbnRQYXRoID0gcGF0aDsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlDYXBhY2l0eVBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2FwYWNpdHlQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvY2FwYWNpdHkiLCBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aCwgUl9PSykgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2FwYWNpdHlQYXRoID0gcGF0aDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLmNfc3RyKCksIFJfT0spID09IDApIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2FwYWNpdHlQYXRoID0gcGF0aDsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlWb2x0YWdlUGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlWb2x0YWdlUGF0aC5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL3ZvbHRhZ2Vfbm93IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGgsIFJfT0spID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLmNfc3RyKCksIFJfT0spID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Vm9sdGFnZVBhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5RnVsbENoYXJnZVBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5RnVsbENoYXJnZVBhdGguZW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICBwYXRoLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy9jaGFyZ2VfZnVsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLCBSX09LKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSykgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5RnVsbENoYXJnZVBhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnROb3dQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnROb3dQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvY3VycmVudF9ub3ciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT1dFUl9TVVBQTFlfU1lTRlNfUEFUSCwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aCwgUl9PSykgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLmNfc3RyKCksIFJfT0spID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnROb3dQYXRoID0gcGF0aDsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlDeWNsZUNvdW50UGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlDeWNsZUNvdW50UGF0aC5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL2N5Y2xlX2NvdW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGgsIFJfT0spID09IDApCisgICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWx0aGRDb25maWctPmJhdHRlcnlDeWNsZUNvdW50UGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2FwYWNpdHlMZXZlbFBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2FwYWNpdHlMZXZlbFBhdGguZW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICBwYXRoLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy9jYXBhY2l0eV9sZXZlbCIsIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLCBSX09LKSA9PSAwKSBtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNhcGFjaXR5TGV2ZWxQYXRoID0gcGF0aDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLmNfc3RyKCksIFJfT0spID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2FwYWNpdHlMZXZlbFBhdGggPSBwYXRoOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2hhcmdlVGltZVRvRnVsbE5vd1BhdGguaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2hhcmdlVGltZVRvRnVsbE5vd1BhdGguZW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICBwYXRoLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy90aW1lX3RvX2Z1bGxfbm93IiwgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGgsIFJfT0spID09IDApCisgICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWx0aGRDb25maWctPmJhdHRlcnlDaGFyZ2VUaW1lVG9GdWxsTm93UGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5RnVsbENoYXJnZURlc2lnbkNhcGFjaXR5VWFoUGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlGdWxsQ2hhcmdlRGVzaWduQ2FwYWNpdHlVYWhQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvY2hhcmdlX2Z1bGxfZGVzaWduIiwgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGgsIFJfT0spID09IDApCisgICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWx0aGRDb25maWctPmJhdHRlcnlGdWxsQ2hhcmdlRGVzaWduQ2FwYWNpdHlVYWhQYXRoID0gcGF0aDsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50QXZnUGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50QXZnUGF0aC5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL2N1cnJlbnRfYXZnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGgsIFJfT0spID09IDApCisgICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBSX09LKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWx0aGRDb25maWctPmJhdHRlcnlDdXJyZW50QXZnUGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2hhcmdlQ291bnRlclBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2hhcmdlQ291bnRlclBhdGguZW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICBwYXRoLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy9jaGFyZ2VfY291bnRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLCBSX09LKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSykgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2hhcmdlQ291bnRlclBhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVRlbXBlcmF0dXJlUGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlUZW1wZXJhdHVyZVBhdGguZW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICBwYXRoLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kRm9ybWF0KCIlcy8lcy90ZW1wIiwgUE9XRVJfU1VQUExZX1NZU0ZTX1BBVEgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGgsIFJfT0spID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLmNfc3RyKCksIFJfT0spID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5VGVtcGVyYXR1cmVQYXRoID0gcGF0aDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVRlY2hub2xvZ3lQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVRlY2hub2xvZ3lQYXRoLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgcGF0aC5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvdGVjaG5vbG9neSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLCBSX09LKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguY19zdHIoKSwgUl9PSykgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5VGVjaG5vbG9neVBhdGggPSBwYXRoOwogICAgICAgICAgICAgICAgIH0KIApAQCAtNzY3LDEyICs3NjAsMTAgQEAKICAgICAgICAgICAgIC8vIExvb2sgZm9yICJpc19kb2NrIiBmaWxlCiAgICAgICAgICAgICBwYXRoLmNsZWFyKCk7CiAgICAgICAgICAgICBwYXRoLmFwcGVuZEZvcm1hdCgiJXMvJXMvaXNfZG9jayIsIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILCBuYW1lKTsKLSAgICAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5zdHJpbmcoKSwgUl9PSykgPT0gMCkgeworICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLmNfc3RyKCksIFJfT0spID09IDApIHsKICAgICAgICAgICAgICAgICBwYXRoLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmRGb3JtYXQoIiVzLyVzL29ubGluZSIsIFBPV0VSX1NVUFBMWV9TWVNGU19QQVRILCBuYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoYWNjZXNzKHBhdGguc3RyaW5nKCksIFJfT0spID09IDApCi0gICAgICAgICAgICAgICAgICAgIG1DaGFyZ2VyTmFtZXMuYWRkKFN0cmluZzgobmFtZSkpOwotCisgICAgICAgICAgICAgICAgaWYgKGFjY2VzcyhwYXRoLmNfc3RyKCksIFJfT0spID09IDApIG1DaGFyZ2VyTmFtZXMuYWRkKFN0cmluZzgobmFtZSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNzg0LDMxICs3NzUsMzEgQEAKICAgICAgICAgaGMtPnBlcmlvZGljX2Nob3Jlc19pbnRlcnZhbF9mYXN0ID0gLTE7CiAgICAgICAgIGhjLT5wZXJpb2RpY19jaG9yZXNfaW50ZXJ2YWxfc2xvdyA9IC0xOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVN0YXR1c1BhdGguaXNFbXB0eSgpKQorICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlTdGF0dXNQYXRoLmVtcHR5KCkpCiAgICAgICAgICAgICBLTE9HX1dBUk5JTkcoTE9HX1RBRywgIkJhdHRlcnlTdGF0dXNQYXRoIG5vdCBmb3VuZFxuIik7Ci0gICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUhlYWx0aFBhdGguaXNFbXB0eSgpKQorICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlIZWFsdGhQYXRoLmVtcHR5KCkpCiAgICAgICAgICAgICBLTE9HX1dBUk5JTkcoTE9HX1RBRywgIkJhdHRlcnlIZWFsdGhQYXRoIG5vdCBmb3VuZFxuIik7Ci0gICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVByZXNlbnRQYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5UHJlc2VudFBhdGguZW1wdHkoKSkKICAgICAgICAgICAgIEtMT0dfV0FSTklORyhMT0dfVEFHLCAiQmF0dGVyeVByZXNlbnRQYXRoIG5vdCBmb3VuZFxuIik7Ci0gICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNhcGFjaXR5UGF0aC5pc0VtcHR5KCkpCisgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNhcGFjaXR5UGF0aC5lbXB0eSgpKQogICAgICAgICAgICAgS0xPR19XQVJOSU5HKExPR19UQUcsICJCYXR0ZXJ5Q2FwYWNpdHlQYXRoIG5vdCBmb3VuZFxuIik7Ci0gICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVZvbHRhZ2VQYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Vm9sdGFnZVBhdGguZW1wdHkoKSkKICAgICAgICAgICAgIEtMT0dfV0FSTklORyhMT0dfVEFHLCAiQmF0dGVyeVZvbHRhZ2VQYXRoIG5vdCBmb3VuZFxuIik7Ci0gICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVRlbXBlcmF0dXJlUGF0aC5pc0VtcHR5KCkpCisgICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVRlbXBlcmF0dXJlUGF0aC5lbXB0eSgpKQogICAgICAgICAgICAgS0xPR19XQVJOSU5HKExPR19UQUcsICJCYXR0ZXJ5VGVtcGVyYXR1cmVQYXRoIG5vdCBmb3VuZFxuIik7Ci0gICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeVRlY2hub2xvZ3lQYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5VGVjaG5vbG9neVBhdGguZW1wdHkoKSkKICAgICAgICAgICAgIEtMT0dfV0FSTklORyhMT0dfVEFHLCAiQmF0dGVyeVRlY2hub2xvZ3lQYXRoIG5vdCBmb3VuZFxuIik7Ci0gICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN1cnJlbnROb3dQYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3VycmVudE5vd1BhdGguZW1wdHkoKSkKICAgICAgICAgICAgIEtMT0dfV0FSTklORyhMT0dfVEFHLCAiQmF0dGVyeUN1cnJlbnROb3dQYXRoIG5vdCBmb3VuZFxuIik7Ci0gICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUZ1bGxDaGFyZ2VQYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5RnVsbENoYXJnZVBhdGguZW1wdHkoKSkKICAgICAgICAgICAgIEtMT0dfV0FSTklORyhMT0dfVEFHLCAiQmF0dGVyeUZ1bGxDaGFyZ2VQYXRoIG5vdCBmb3VuZFxuIik7Ci0gICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUN5Y2xlQ291bnRQYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q3ljbGVDb3VudFBhdGguZW1wdHkoKSkKICAgICAgICAgICAgIEtMT0dfV0FSTklORyhMT0dfVEFHLCAiQmF0dGVyeUN5Y2xlQ291bnRQYXRoIG5vdCBmb3VuZFxuIik7Ci0gICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNhcGFjaXR5TGV2ZWxQYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2FwYWNpdHlMZXZlbFBhdGguZW1wdHkoKSkKICAgICAgICAgICAgIEtMT0dfV0FSTklORyhMT0dfVEFHLCAiYmF0dGVyeUNhcGFjaXR5TGV2ZWxQYXRoIG5vdCBmb3VuZFxuIik7Ci0gICAgICAgIGlmIChtSGVhbHRoZENvbmZpZy0+YmF0dGVyeUNoYXJnZVRpbWVUb0Z1bGxOb3dQYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5Q2hhcmdlVGltZVRvRnVsbE5vd1BhdGguZW1wdHkoKSkKICAgICAgICAgICAgIEtMT0dfV0FSTklORyhMT0dfVEFHLCAiYmF0dGVyeUNoYXJnZVRpbWVUb0Z1bGxOb3dQYXRoLiBub3QgZm91bmRcbiIpOwotICAgICAgICBpZiAobUhlYWx0aGRDb25maWctPmJhdHRlcnlGdWxsQ2hhcmdlRGVzaWduQ2FwYWNpdHlVYWhQYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgaWYgKG1IZWFsdGhkQ29uZmlnLT5iYXR0ZXJ5RnVsbENoYXJnZURlc2lnbkNhcGFjaXR5VWFoUGF0aC5lbXB0eSgpKQogICAgICAgICAgICAgS0xPR19XQVJOSU5HKExPR19UQUcsICJiYXR0ZXJ5RnVsbENoYXJnZURlc2lnbkNhcGFjaXR5VWFoUGF0aC4gbm90IGZvdW5kXG4iKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2hlYWx0aGQvSGVhbHRoU2VydmljZURlZmF1bHQuY3BwIGIvaGVhbHRoZC9IZWFsdGhTZXJ2aWNlRGVmYXVsdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZWNjMmYuLjAwMDAwMDAKLS0tIGEvaGVhbHRoZC9IZWFsdGhTZXJ2aWNlRGVmYXVsdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGhlYWx0aDIvc2VydmljZS5oPgotI2luY2x1ZGUgPGhlYWx0aGQvaGVhbHRoZC5oPgotCi12b2lkIGhlYWx0aGRfYm9hcmRfaW5pdChzdHJ1Y3QgaGVhbHRoZF9jb25maWcqKSB7Ci0gICAgLy8gSW1wbGVtZW50YXRpb24tZGVmaW5lZCBpbml0IGxvZ2ljIGdvZXMgaGVyZS4KLSAgICAvLyAxLiBjb25maWctPnBlcmlvZGljX2Nob3Jlc19pbnRlcnZhbF8qIHZhcmlhYmxlcwotICAgIC8vIDIuIGNvbmZpZy0+YmF0dGVyeSpQYXRoIHZhcmlhYmxlcwotICAgIC8vIDMuIGNvbmZpZy0+ZW5lcmd5Q291bnRlci4gSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgZW5lcmd5Q291bnRlciBpcyBub3QgZGVmaW5lZC4KLQotICAgIC8vIHVzZSBkZWZhdWx0cwotfQotCi1pbnQgaGVhbHRoZF9ib2FyZF9iYXR0ZXJ5X3VwZGF0ZShzdHJ1Y3QgYW5kcm9pZDo6QmF0dGVyeVByb3BlcnRpZXMqKSB7Ci0gICAgLy8gSW1wbGVtZW50YXRpb24tZGVmaW5lZCB1cGRhdGUgbG9naWMgZ29lcyBoZXJlLiBBbiBpbXBsZW1lbnRhdGlvbgotICAgIC8vIGNhbiBtYWtlIG1vZGlmaWNhdGlvbnMgdG8gcHJvcCBiZWZvcmUgYnJvYWRjYXN0aW5nIGl0IHRvIGFsbCBjYWxsYmFja3MuCi0KLSAgICAvLyByZXR1cm4gMCB0byBsb2cgcGVyaW9kaWMgcG9sbGVkIGJhdHRlcnkgc3RhdHVzIHRvIGtlcm5lbCBsb2cKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IG1haW4oKSB7Ci0gICAgcmV0dXJuIGhlYWx0aF9zZXJ2aWNlX21haW4oKTsKLX0KZGlmZiAtLWdpdCBhL2hlYWx0aGQvYW5kcm9pZC5oYXJkd2FyZS5oZWFsdGhAMi4wLXNlcnZpY2UucmMgYi9oZWFsdGhkL2FuZHJvaWQuaGFyZHdhcmUuaGVhbHRoQDIuMC1zZXJ2aWNlLnJjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjI3NzFlLi4wMDAwMDAwCi0tLSBhL2hlYWx0aGQvYW5kcm9pZC5oYXJkd2FyZS5oZWFsdGhAMi4wLXNlcnZpY2UucmMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNlcnZpY2UgaGVhbHRoLWhhbC0yLTAgL3ZlbmRvci9iaW4vaHcvYW5kcm9pZC5oYXJkd2FyZS5oZWFsdGhAMi4wLXNlcnZpY2UKLSAgICBjbGFzcyBoYWwKLSAgICB1c2VyIHN5c3RlbQotICAgIGdyb3VwIHN5c3RlbQotICAgIGNhcGFiaWxpdGllcyBXQUtFX0FMQVJNIEJMT0NLX1NVU1BFTkQKLSAgICBmaWxlIC9kZXYva21zZyB3CmRpZmYgLS1naXQgYS9oZWFsdGhkL2hlYWx0aGRfbW9kZV9jaGFyZ2VyLmNwcCBiL2hlYWx0aGQvaGVhbHRoZF9tb2RlX2NoYXJnZXIuY3BwCmluZGV4IDI2YWYxM2IuLjU0YjQ2OWIgMTAwNjQ0Ci0tLSBhL2hlYWx0aGQvaGVhbHRoZF9tb2RlX2NoYXJnZXIuY3BwCisrKyBiL2hlYWx0aGQvaGVhbHRoZF9tb2RlX2NoYXJnZXIuY3BwCkBAIC0zMDYsOCArMzA2LDggQEAKIAogICAgIGlmICghYmF0dF9hbmltXy5ydW4gfHwgbm93IDwgbmV4dF9zY3JlZW5fdHJhbnNpdGlvbl8pIHJldHVybjsKIAotICAgIC8vIElmIGJhdHRlcnkgbGV2ZWwgaXMgbm90IHJlYWR5LCBrZWVwIGNoZWNraW5nIGluIHRoZSBkZWZpbmVkIHRpbWUKLSAgICBpZiAoaGVhbHRoX2luZm9fLmJhdHRlcnlfbGV2ZWwgPT0gMCAmJiBoZWFsdGhfaW5mb18uYmF0dGVyeV9zdGF0dXMgPT0gQmF0dGVyeVN0YXR1czo6VU5LTk9XTikgeworICAgIC8vIElmIGJhdHRlcnkgc3RhdHVzIGlzIG5vdCByZWFkeSwga2VlcCBjaGVja2luZyBpbiB0aGUgZGVmaW5lZCB0aW1lCisgICAgaWYgKGhlYWx0aF9pbmZvXy5iYXR0ZXJ5X3N0YXR1cyA9PSBCYXR0ZXJ5U3RhdHVzOjpVTktOT1dOKSB7CiAgICAgICAgIGlmICh3YWl0X2JhdHRfbGV2ZWxfdGltZXN0YW1wXyA9PSAwKSB7CiAgICAgICAgICAgICAvLyBTZXQgbWF4IGRlbGF5IHRpbWUgYW5kIHNraXAgZHJhd2luZyBzY3JlZW4KICAgICAgICAgICAgIHdhaXRfYmF0dF9sZXZlbF90aW1lc3RhbXBfID0gbm93ICsgTUFYX0JBVFRfTEVWRUxfV0FJVF9USU1FOwpAQCAtMzE3LDcgKzMxNyw3IEBACiAgICAgICAgICAgICAvLyBEbyBub3RoaW5nLCBrZWVwIHdhaXRpbmcKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICAvLyBJZiB0aW1lb3V0IGFuZCBiYXR0ZXJ5IGxldmVsIGlzIHN0aWxsIG5vdCByZWFkeSwgZHJhdyB1bmtub3duIGJhdHRlcnkKKyAgICAgICAgLy8gSWYgdGltZW91dCBhbmQgYmF0dGVyeSBzdGF0dXMgaXMgc3RpbGwgbm90IHJlYWR5LCBkcmF3IHVua25vd24gYmF0dGVyeQogICAgIH0KIAogICAgIGlmIChoZWFsdGhkX2RyYXdfID09IG51bGxwdHIpIHJldHVybjsKZGlmZiAtLWdpdCBhL2hlYWx0aGQvaW5jbHVkZS9oZWFsdGhkL0JhdHRlcnlNb25pdG9yLmggYi9oZWFsdGhkL2luY2x1ZGUvaGVhbHRoZC9CYXR0ZXJ5TW9uaXRvci5oCmluZGV4IGU5OTk4YmEuLmIzMDQ1OGQgMTAwNjQ0Ci0tLSBhL2hlYWx0aGQvaW5jbHVkZS9oZWFsdGhkL0JhdHRlcnlNb25pdG9yLmgKKysrIGIvaGVhbHRoZC9pbmNsdWRlL2hlYWx0aGQvQmF0dGVyeU1vbml0b3IuaApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBIRUFMVEhEX0JBVFRFUllNT05JVE9SX0gKIAogI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxvcHRpb25hbD4KIAogI2luY2x1ZGUgPGJhdHRlcnlzZXJ2aWNlL0JhdHRlcnlTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgpAQCAtODYsNiArODcsOCBAQAogICAgIGludCBnZXRDaGFyZ2luZ1BvbGljeSgpOwogICAgIGludCBnZXRCYXR0ZXJ5SGVhbHRoRGF0YShpbnQgaWQpOwogCisgICAgc3RhdHVzX3QgZ2V0U2VyaWFsTnVtYmVyKHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+KiBvdXQpOworCiAgICAgc3RhdGljIHZvaWQgbG9nVmFsdWVzKGNvbnN0IGFuZHJvaWQ6OmhhcmR3YXJlOjpoZWFsdGg6OlYyXzE6OkhlYWx0aEluZm8mIGhlYWx0aF9pbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaGVhbHRoZF9jb25maWcmIGhlYWx0aGRfY29uZmlnKTsKIApkaWZmIC0tZ2l0IGEvaW5pdC9BbmRyb2lkLmJwIGIvaW5pdC9BbmRyb2lkLmJwCmluZGV4IGNmNGNjYzQuLjQwMjVhNmIgMTAwNjQ0Ci0tLSBhL2luaXQvQW5kcm9pZC5icAorKysgYi9pbml0L0FuZHJvaWQuYnAKQEAgLTM4LDcgKzM4LDYgQEAKICAgICAiY2FwYWJpbGl0aWVzLmNwcCIsCiAgICAgImVwb2xsLmNwcCIsCiAgICAgImltcG9ydF9wYXJzZXIuY3BwIiwKLSAgICAiaW50ZXJmYWNlX3V0aWxzLmNwcCIsCiAgICAgImludGVycHJvY2Vzc19maWZvLmNwcCIsCiAgICAgImtleWNob3Jkcy5jcHAiLAogICAgICJwYXJzZXIuY3BwIiwKQEAgLTg1LDExICs4NCw2IEBACiAgICAgInVldmVudGQuY3BwIiwKICAgICAidWV2ZW50ZF9wYXJzZXIuY3BwIiwKIF0KLWluaXRfaG9zdF9zb3VyY2VzID0gWwotICAgICJjaGVja19idWlsdGlucy5jcHAiLAotICAgICJob3N0X2ltcG9ydF9wYXJzZXIuY3BwIiwKLSAgICAiaG9zdF9pbml0X3ZlcmlmaWVyLmNwcCIsCi1dCiAKIHNvb25nX2NvbmZpZ19tb2R1bGVfdHlwZSB7CiAgICAgbmFtZTogImxpYmluaXRfY2NfZGVmYXVsdHMiLApAQCAtOTcsNiArOTEsNyBAQAogICAgIGNvbmZpZ19uYW1lc3BhY2U6ICJBTkRST0lEIiwKICAgICBib29sX3ZhcmlhYmxlczogWwogICAgICAgICAiUFJPRFVDVF9JTlNUQUxMX0RFQlVHX1BPTElDWV9UT19TWVNURU1fRVhUIiwKKyAgICAgICAgInJlbGVhc2Vfd3JpdGVfYXBwY29tcGF0X292ZXJyaWRlX3N5c3RlbV9wcm9wZXJ0aWVzIiwKICAgICBdLAogICAgIHByb3BlcnRpZXM6IFsKICAgICAgICAgImNmbGFncyIsCkBAIC0xNjAsMjIgKzE1NSwyMiBAQAogICAgICAgICAgICAgICAgICItRElOU1RBTExfREVCVUdfUE9MSUNZX1RPX1NZU1RFTV9FWFQ9MSIsCiAgICAgICAgICAgICBdLAogICAgICAgICB9LAorICAgICAgICByZWxlYXNlX3dyaXRlX2FwcGNvbXBhdF9vdmVycmlkZV9zeXN0ZW1fcHJvcGVydGllczogeworICAgICAgICAgICAgY2ZsYWdzOiBbIi1EV1JJVEVfQVBQQ09NUEFUX09WRVJSSURFX1NZU1RFTV9QUk9QRVJUSUVTIl0sCisgICAgICAgIH0sCiAgICAgfSwKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGliYXZiIiwKKyAgICAgICAgImxpYmF2Zl9jY19mbGFncyIsCiAgICAgICAgICJsaWJib290bG9hZGVyX21lc3NhZ2UiLAotICAgICAgICAibGliYysrZnMiLAotICAgICAgICAibGliY2dyb3VwcmNfZm9ybWF0IiwKLSAgICAgICAgImxpYmZzdmVyaXR5X2luaXQiLAogICAgICAgICAibGlibG1rZF91dGlscyIsCiAgICAgICAgICJsaWJsejQiLAotICAgICAgICAibGlibWluaV9rZXljdGxfc3RhdGljIiwKKyAgICAgICAgImxpYnpzdGQiLAogICAgICAgICAibGlibW9kcHJvYmUiLAogICAgICAgICAibGlicHJvY2luZm8iLAogICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAogICAgICAgICAibGlicHJvcGVydHlpbmZvc2VyaWFsaXplciIsCiAgICAgICAgICJsaWJwcm9wZXJ0eWluZm9wYXJzZXIiLAotICAgICAgICAibGlic2lnbmluZ3V0aWxzIiwKICAgICAgICAgImxpYnNuYXBzaG90X2NvdyIsCiAgICAgICAgICJsaWJzbmFwc2hvdF9pbml0IiwKICAgICAgICAgImxpYnhtbDIiLApAQCAtMTg0LDE0ICsxNzksMTEgQEAKICAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJiYXNlIiwKLSAgICAgICAgImxpYmNyeXB0byIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGliZGwiLAogICAgICAgICAibGliZXh0NF91dGlscyIsCiAgICAgICAgICJsaWJmc19tZ3IiLAogICAgICAgICAibGliZ3NpIiwKLSAgICAgICAgImxpYmhpZGwtZ2VuLXV0aWxzIiwKLSAgICAgICAgImxpYmtleXV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJsb2d3cmFwIiwKICAgICAgICAgImxpYmxwIiwKQEAgLTIwMCw3ICsxOTIsNyBAQAogICAgICAgICAibGlic2VsaW51eCIsCiAgICAgICAgICJsaWJ1bndpbmRzdGFjayIsCiAgICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJ6aXBhcmNoaXZlIiwKKyAgICAgICAgImxpYnZlbmRvcnN1cHBvcnQiLAogICAgIF0sCiAgICAgaGVhZGVyX2xpYnM6IFsiYmlvbmljX2xpYmNfcGxhdGZvcm1faGVhZGVycyJdLAogICAgIGJvb3RzdHJhcDogdHJ1ZSwKQEAgLTIxMyw4ICsyMDUsOCBAQAogICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAogfQogCi1jY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYmluaXQiLAorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJpbml0X2RlZmF1bHRzIiwKICAgICByZWNvdmVyeV9hdmFpbGFibGU6IHRydWUsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImluaXRfZGVmYXVsdHMiLApAQCAtMjI3LDggKzIxOSw2IEBACiAgICAgXSwKICAgICB3aG9sZV9zdGF0aWNfbGliczogWwogICAgICAgICAibGliY2FwIiwKLSAgICAgICAgImxpYmNvbS5hbmRyb2lkLnN5c3Byb3AuYXBleCIsCi0gICAgICAgICJsaWJjb20uYW5kcm9pZC5zeXNwcm9wLmluaXQiLAogICAgIF0sCiAgICAgaGVhZGVyX2xpYnM6IFsiYm9vdGltZ19oZWFkZXJzIl0sCiAgICAgcHJvdG86IHsKQEAgLTI1MSwxMCArMjQxLDIxIEBACiAgICAgICAgICAgICBdLAogICAgICAgICB9LAogICAgIH0sCi0gICAgdmlzaWJpbGl0eTogWwotICAgICAgICAiLy9zeXN0ZW0vYXBleC9hcGV4ZCIsCi0gICAgICAgICIvL2ZyYW1ld29ya3MvbmF0aXZlL2NtZHMvaW5zdGFsbGQiLAorfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYmluaXQiLAorICAgIGRlZmF1bHRzOiBbImxpYmluaXRfZGVmYXVsdHMiXSwKK30KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJpbml0Lm1pY3JvZHJvaWQiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJhdmZfYnVpbGRfZmxhZ3NfY2MiLAorICAgICAgICAibGliaW5pdF9kZWZhdWx0cyIsCiAgICAgXSwKKyAgICByZWNvdmVyeV9hdmFpbGFibGU6IGZhbHNlLAorICAgIGNmbGFnczogWyItRE1JQ1JPRFJPSUQ9MSJdLAogfQogCiBwaG9ueSB7CkBAIC0yNjQsMTQgKzI2NSwyMCBAQAogICAgIF0sCiB9CiAKLWNjX2JpbmFyeSB7Ci0gICAgbmFtZTogImluaXRfc2Vjb25kX3N0YWdlIiwKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiaW5pdF9zZWNvbmRfc3RhZ2VfZGVmYXVsdHMiLAogICAgIHJlY292ZXJ5X2F2YWlsYWJsZTogdHJ1ZSwKICAgICBzdGVtOiAiaW5pdCIsCiAgICAgZGVmYXVsdHM6IFsiaW5pdF9kZWZhdWx0cyJdLAotICAgIHN0YXRpY19saWJzOiBbImxpYmluaXQiXSwKICAgICBzcmNzOiBbIm1haW4uY3BwIl0sCiAgICAgc3ltbGlua3M6IFsidWV2ZW50ZCJdLAorfQorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJpbml0X3NlY29uZF9zdGFnZSIsCisgICAgZGVmYXVsdHM6IFsiaW5pdF9zZWNvbmRfc3RhZ2VfZGVmYXVsdHMiXSwKKyAgICBzdGF0aWNfbGliczogWyJsaWJpbml0Il0sCisgICAgdmlzaWJpbGl0eTogWyIvL3Zpc2liaWxpdHk6YW55X3N5c3RlbV9wYXJ0aXRpb24iXSwKICAgICB0YXJnZXQ6IHsKICAgICAgICAgcGxhdGZvcm06IHsKICAgICAgICAgICAgIHJlcXVpcmVkOiBbCkBAIC0zMDMsNyArMzEwLDE5IEBACiAgICAgICAgICAgICBdLAogICAgICAgICB9LAogICAgIH0sCi0gICAgdmlzaWJpbGl0eTogWyIvL3BhY2thZ2VzL21vZHVsZXMvVmlydHVhbGl6YXRpb24vbWljcm9kcm9pZCJdLAorfQorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJpbml0X3NlY29uZF9zdGFnZS5taWNyb2Ryb2lkIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAiYXZmX2J1aWxkX2ZsYWdzX2NjIiwKKyAgICAgICAgImluaXRfc2Vjb25kX3N0YWdlX2RlZmF1bHRzIiwKKyAgICBdLAorICAgIHJlY292ZXJ5X2F2YWlsYWJsZTogZmFsc2UsCisgICAgc3RhdGljX2xpYnM6IFsibGliaW5pdC5taWNyb2Ryb2lkIl0sCisgICAgY2ZsYWdzOiBbIi1ETUlDUk9EUk9JRD0xIl0sCisgICAgbm9fZnVsbF9pbnN0YWxsOiB0cnVlLAorICAgIHZpc2liaWxpdHk6IFsiLy9wYWNrYWdlcy9tb2R1bGVzL1ZpcnR1YWxpemF0aW9uL2J1aWxkL21pY3JvZHJvaWQiXSwKIH0KIAogc29vbmdfY29uZmlnX21vZHVsZV90eXBlIHsKQEAgLTMxMSw3ICszMzAsNyBAQAogICAgIG1vZHVsZV90eXBlOiAiY2NfZGVmYXVsdHMiLAogICAgIGNvbmZpZ19uYW1lc3BhY2U6ICJBTkRST0lEIiwKICAgICBib29sX3ZhcmlhYmxlczogWyJCT0FSRF9VU0VTX1JFQ09WRVJZX0FTX0JPT1QiXSwKLSAgICBwcm9wZXJ0aWVzOiBbImluc3RhbGxhYmxlIl0sCisgICAgcHJvcGVydGllczogWyJub19mdWxsX2luc3RhbGwiXSwKIH0KIAogLy8gRG8gbm90IGluc3RhbGwgaW5pdF9maXJzdF9zdGFnZSBldmVuIHdpdGggbW1hIGlmIHdlJ3JlIHN5c3RlbS1hcy1yb290LgpAQCAtMzIwLDE1ICszMzksMTEgQEAKICAgICBuYW1lOiAiaW5pdF9maXJzdF9zdGFnZV9kZWZhdWx0cyIsCiAgICAgc29vbmdfY29uZmlnX3ZhcmlhYmxlczogewogICAgICAgICBCT0FSRF9VU0VTX1JFQ09WRVJZX0FTX0JPT1Q6IHsKLSAgICAgICAgICAgIGluc3RhbGxhYmxlOiBmYWxzZSwKKyAgICAgICAgICAgIG5vX2Z1bGxfaW5zdGFsbDogdHJ1ZSwKICAgICAgICAgfSwKICAgICB9LAotfQogCi1jY19iaW5hcnkgewotICAgIG5hbWU6ICJpbml0X2ZpcnN0X3N0YWdlIiwKICAgICBzdGVtOiAiaW5pdCIsCi0gICAgZGVmYXVsdHM6IFsiaW5pdF9maXJzdF9zdGFnZV9kZWZhdWx0cyJdLAogCiAgICAgc3JjczogWwogICAgICAgICAiYmxvY2tfZGV2X2luaXRpYWxpemVyLmNwcCIsCkBAIC0zNDcsOCArMzYyLDggQEAKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmMrK2ZzIiwKICAgICAgICAgImxpYmZzX2F2YiIsCisgICAgICAgICJsaWJhdmZfY2NfZmxhZ3MiLAogICAgICAgICAibGliZnNfbWdyIiwKICAgICAgICAgImxpYmZlYyIsCiAgICAgICAgICJsaWJmZWNfcnMiLApAQCAtMzcwLDkgKzM4NSwxMSBAQAogICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAogICAgICAgICAibGlic25hcHNob3RfY293IiwKICAgICAgICAgImxpYmx6NCIsCisgICAgICAgICJsaWJ6c3RkIiwKICAgICAgICAgImxpYnNuYXBzaG90X2luaXQiLAogICAgICAgICAidXBkYXRlX21ldGFkYXRhLXByb3RvcyIsCiAgICAgICAgICJsaWJwcm9jaW5mbyIsCisgICAgICAgICJsaWJib290bG9hZGVyX21lc3NhZ2UiLAogICAgIF0sCiAKICAgICBzdGF0aWNfZXhlY3V0YWJsZTogdHJ1ZSwKQEAgLTQzMCw2ICs0NDcsNyBAQAogCiAgICAgICAgIC8vIEZpcnN0IHN0YWdlIGluaXQgaXMgd2VpcmQ6IGl0IG1heSBzdGFydCB3aXRob3V0IHN0ZG91dC9zdGRlcnIsIGFuZCBubyAvcHJvYy4KICAgICAgICAgaHdhZGRyZXNzOiBmYWxzZSwKKyAgICAgICAgbWVtdGFnX3N0YWNrOiBmYWxzZSwKICAgICB9LAogCiAgICAgLy8gSW5zdGFsbCBhZGJfZGVidWcucHJvcCBpbnRvIGRlYnVnIHJhbWRpc2suCkBAIC00NDEsNiArNDU5LDIxIEBACiAgICAgaW5zdGFsbF9pbl9yb290OiB0cnVlLAogfQogCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJpbml0X2ZpcnN0X3N0YWdlIiwKKyAgICBkZWZhdWx0czogWyJpbml0X2ZpcnN0X3N0YWdlX2RlZmF1bHRzIl0sCit9CisKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogImluaXRfZmlyc3Rfc3RhZ2UubWljcm9kcm9pZCIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImF2Zl9idWlsZF9mbGFnc19jYyIsCisgICAgICAgICJpbml0X2ZpcnN0X3N0YWdlX2RlZmF1bHRzIiwKKyAgICBdLAorICAgIGNmbGFnczogWyItRE1JQ1JPRFJPSUQ9MSJdLAorICAgIG5vX2Z1bGxfaW5zdGFsbDogdHJ1ZSwKK30KKwogcGhvbnkgewogICAgIG5hbWU6ICJpbml0X3N5c3RlbSIsCiAgICAgcmVxdWlyZWQ6IFsiaW5pdF9zZWNvbmRfc3RhZ2UiXSwKQEAgLTUwNyw2ICs1NDAsNyBAQAogICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAogICAgIF0sCiAgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmZzX21nciIsCiAgICAgICAgICJsaWJoaWRsLWdlbi11dGlscyIsCiAgICAgXSwKIH0KQEAgLTUyOCw2ICs1NjIsMTEgQEAKICAgICBdLAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsidGVzdF91dGlscy9pbmNsdWRlIl0sIC8vIGZvciB0ZXN0cwogICAgIGhlYWRlcl9saWJzOiBbImJpb25pY19saWJjX3BsYXRmb3JtX2hlYWRlcnMiXSwKKyAgICBwcm9kdWN0X3ZhcmlhYmxlczogeworICAgICAgICBzaGlwcGluZ19hcGlfbGV2ZWw6IHsKKyAgICAgICAgICAgIGNmbGFnczogWyItREJVSUxEX1NISVBQSU5HX0FQSV9MRVZFTD0lcyJdLAorICAgICAgICB9LAorICAgIH0sCiB9CiAKIC8vIEhvc3QgVmVyaWZpZXIKQEAgLTU2Miw4ICs2MDEsNiBAQAogICAgIHdob2xlX3N0YXRpY19saWJzOiBbImxpYmNhcCJdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGliaGlkbC1nZW4tdXRpbHMiLAotICAgICAgICAibGliaGlkbG1ldGFkYXRhIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJwcm9jZXNzZ3JvdXAiLAogICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLApAQCAtNTcxLDEwICs2MDgsNiBAQAogICAgIHByb3RvOiB7CiAgICAgICAgIHR5cGU6ICJsaXRlIiwKICAgICB9LAotICAgIGdlbmVyYXRlZF9oZWFkZXJzOiBbCi0gICAgICAgICJnZW5lcmF0ZWRfc3R1Yl9idWlsdGluX2Z1bmN0aW9uX21hcCIsCi0gICAgICAgICJnZW5lcmF0ZWRfYW5kcm9pZF9pZHMiLAotICAgIF0sCiAgICAgdGFyZ2V0OiB7CiAgICAgICAgIGFuZHJvaWQ6IHsKICAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLApAQCAtNTgzLDE5ICs2MTYsNTMgQEAKICAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAogICAgICAgICB9LAogICAgIH0sCisgICAgcHJvZHVjdF92YXJpYWJsZXM6IHsKKyAgICAgICAgc2hpcHBpbmdfYXBpX2xldmVsOiB7CisgICAgICAgICAgICBjZmxhZ3M6IFsiLURCVUlMRF9TSElQUElOR19BUElfTEVWRUw9JXMiXSwKKyAgICAgICAgfSwKKyAgICB9LAogfQogCiBjY19iaW5hcnkgewogICAgIG5hbWU6ICJob3N0X2luaXRfdmVyaWZpZXIiLAogICAgIGRlZmF1bHRzOiBbImluaXRfaG9zdF9kZWZhdWx0cyJdLAotICAgIHNyY3M6IGluaXRfY29tbW9uX3NvdXJjZXMgKyBpbml0X2hvc3Rfc291cmNlcywKKyAgICBzcmNzOiBbCisgICAgICAgICJjaGVja19idWlsdGlucy5jcHAiLAorICAgICAgICAiaG9zdF9pbXBvcnRfcGFyc2VyLmNwcCIsCisgICAgICAgICJob3N0X2luaXRfdmVyaWZpZXIuY3BwIiwKKyAgICAgICAgImludGVyZmFjZV91dGlscy5jcHAiLAorICAgIF0gKyBpbml0X2NvbW1vbl9zb3VyY2VzLAorICAgIGdlbmVyYXRlZF9oZWFkZXJzOiBbCisgICAgICAgICJnZW5lcmF0ZWRfYW5kcm9pZF9pZHMiLAorICAgICAgICAiZ2VuZXJhdGVkX3N0dWJfYnVpbHRpbl9mdW5jdGlvbl9tYXAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmhpZGwtZ2VuLXV0aWxzIiwKKyAgICAgICAgImxpYmhpZGxtZXRhZGF0YSIsCisgICAgXSwKK30KKworZ2VucnVsZSB7CisgICAgbmFtZTogIm5vb3BfYnVpbHRpbl9mdW5jdGlvbl9tYXAiLAorICAgIHRvb2xfZmlsZXM6IFsiaG9zdF9idWlsdGluX21hcC5weSJdLAorICAgIG91dDogWyJub29wX2J1aWx0aW5fZnVuY3Rpb25fbWFwLmgiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJidWlsdGlucy5jcHAiLAorICAgICAgICAibm9vcF9idWlsdGlucy5jcHAiLAorICAgIF0sCisgICAgY21kOiAiJChsb2NhdGlvbiBob3N0X2J1aWx0aW5fbWFwLnB5KSAtLWJ1aWx0aW5zICQobG9jYXRpb24gYnVpbHRpbnMuY3BwKSAtLWNoZWNrX2J1aWx0aW5zICQobG9jYXRpb24gbm9vcF9idWlsdGlucy5jcHApID4gJChvdXQpIiwKIH0KIAogY2NfbGlicmFyeV9ob3N0X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYmluaXRfaG9zdCIsCiAgICAgZGVmYXVsdHM6IFsiaW5pdF9ob3N0X2RlZmF1bHRzIl0sCi0gICAgc3JjczogaW5pdF9jb21tb25fc291cmNlcywKKyAgICBzcmNzOiBbCisgICAgICAgICJub29wX2J1aWx0aW5zLmNwcCIsCisgICAgXSArIGluaXRfY29tbW9uX3NvdXJjZXMsCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCisgICAgZ2VuZXJhdGVkX2hlYWRlcnM6IFsKKyAgICAgICAgIm5vb3BfYnVpbHRpbl9mdW5jdGlvbl9tYXAiLAorICAgIF0sCiAgICAgcHJvdG86IHsKICAgICAgICAgZXhwb3J0X3Byb3RvX2hlYWRlcnM6IHRydWUsCiAgICAgfSwKQEAgLTYxMCwzICs2NzcsMTEgQEAKICAgICBzcmM6ICJleHRyYV9mcmVlX2tieXRlcy5zaCIsCiAgICAgZmlsZW5hbWVfZnJvbV9zcmM6IHRydWUsCiB9CisKK3Bob255IHsKKyAgICBuYW1lOiAiaW5pdF92ZW5kb3IiLAorICAgIHJlcXVpcmVkOiBzZWxlY3Qoc29vbmdfY29uZmlnX3ZhcmlhYmxlKCJBTkRST0lEIiwgIkJPQVJEX1VTRVNfUkVDT1ZFUllfQVNfQk9PVCIpLCB7CisgICAgICAgIHRydWU6IFtdLAorICAgICAgICBkZWZhdWx0OiBbImluaXRfZmlyc3Rfc3RhZ2UiXSwKKyAgICB9KSwKK30KZGlmZiAtLWdpdCBhL2luaXQvQW5kcm9pZC5tayBiL2luaXQvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI4NWMxNS4uMDAwMDAwMAotLS0gYS9pbml0L0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIENvcHlyaWdodCAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gaW5pdF92ZW5kb3IKLUxPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEUgOj0gJChMT0NBTF9QQVRIKS9OT1RJQ0UKLWlmbmVxICgkKEJPQVJEX1VTRVNfUkVDT1ZFUllfQVNfQk9PVCksdHJ1ZSkKLUxPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gXAotICAgaW5pdF9maXJzdF9zdGFnZSBcCi0KLWVuZGlmICAjIEJPQVJEX1VTRVNfUkVDT1ZFUllfQVNfQk9PVAotaW5jbHVkZSAkKEJVSUxEX1BIT05ZX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9pbml0L1JFQURNRS5tZCBiL2luaXQvUkVBRE1FLm1kCmluZGV4IDVmY2VkMTkuLjU2MGM1MjggMTAwNjQ0Ci0tLSBhL2luaXQvUkVBRE1FLm1kCisrKyBiL2luaXQvUkVBRE1FLm1kCkBAIC00OTksOSArNDk5LDEyIEBACiAgICA0LiBgbGF0ZS1mc2AgLSBNb3VudCBwYXJ0aXRpb25zIG1hcmtlZCBhcyBsYXRlbW91bnRlZC4KICAgIDUuIGBwb3N0LWZzLWRhdGFgIC0gTW91bnQgYW5kIGNvbmZpZ3VyZSBgL2RhdGFgOyBzZXQgdXAgZW5jcnlwdGlvbi4gYC9tZXRhZGF0YWAgaXMKICAgICAgIHJlZm9ybWF0dGVkIGhlcmUgaWYgaXQgY291bGRuJ3QgbW91bnQgaW4gZmlyc3Qtc3RhZ2UgaW5pdC4KLSAgIDYuIGB6eWdvdGUtc3RhcnRgIC0gU3RhcnQgdGhlIHp5Z290ZS4KLSAgIDcuIGBlYXJseS1ib290YCAtIEFmdGVyIHp5Z290ZSBoYXMgc3RhcnRlZC4KLSAgIDguIGBib290YCAtIEFmdGVyIGBlYXJseS1ib290YCBhY3Rpb25zIGhhdmUgY29tcGxldGVkLgorICAgNi4gYHBvc3QtZnMtZGF0YS1jaGVja3BvaW50ZWRgIC0gVHJpZ2dlcmVkIHdoZW4gdm9sZCBoYXMgY29tcGxldGVkIGNvbW1pdHRpbmcgYSBjaGVja3BvaW50CisgICAgICBhZnRlciBhbiBPVEEgdXBkYXRlLiBOb3QgdHJpZ2dlcmVkIGlmIGNoZWNrcG9pbnRpbmcgaXMgbm90IG5lZWRlZCBvciBzdXBwb3J0ZWQuCisgICA3LiBgYnBmLXByb2dzLWxvYWRlZGAgLSBTdGFydHMgdGhpbmdzIHRoYXQgd2FudCB0byBzdGFydCBBU0FQIGJ1dCBuZWVkIGVCUEYgKGluY2wuIG5ldGQpCisgICA4LiBgenlnb3RlLXN0YXJ0YCAtIFN0YXJ0IHRoZSB6eWdvdGUuCisgICA5LiBgZWFybHktYm9vdGAgLSBBZnRlciB6eWdvdGUgaGFzIHN0YXJ0ZWQuCisgIDEwLiBgYm9vdGAgLSBBZnRlciBgZWFybHktYm9vdGAgYWN0aW9ucyBoYXZlIGNvbXBsZXRlZC4KIAogQ29tbWFuZHMKIC0tLS0tLS0tCkBAIC02MzQsNyArNjM3LDcgQEAKICAgUHJvcGVydGllcyBhcmUgZXhwYW5kZWQgd2l0aGluIF9sZXZlbF8uCiAKIGBtYXJrX3Bvc3RfZGF0YWAKLT4gVXNlZCB0byBtYXJrIHRoZSBwb2ludCByaWdodCBhZnRlciAvZGF0YSBpcyBtb3VudGVkLgorPiAoVGhpcyBhY3Rpb24gaXMgZGVwcmVjYXRlZCBhbmQgbm8tb3AuKQogCiBgbWtkaXIgPHBhdGg+IFs8bW9kZT5dIFs8b3duZXI+XSBbPGdyb3VwPl0gW2VuY3J5cHRpb249PGFjdGlvbj5dIFtrZXk9PGtleT5dYAogPiBDcmVhdGUgYSBkaXJlY3RvcnkgYXQgX3BhdGhfLCBvcHRpb25hbGx5IHdpdGggdGhlIGdpdmVuIG1vZGUsIG93bmVyLCBhbmQKQEAgLTY3NCwxMSArNjc3LDEyIEBACiAgIF9vcHRpb25zXyBpbmNsdWRlICJiYXJyaWVyPTEiLCAibm9hdXRvXF9kYVxfYWxsb2MiLCAiZGlzY2FyZCIsIC4uLiBhcwogICBhIGNvbW1hIHNlcGFyYXRlZCBzdHJpbmcsIGUuZy4gYmFycmllcj0xLG5vYXV0b1xfZGFcX2FsbG9jCiAKLWBwZXJmb3JtX2FwZXhfY29uZmlnYAorYHBlcmZvcm1fYXBleF9jb25maWcgWy0tYm9vdHN0cmFwXWAKID4gUGVyZm9ybXMgdGFza3MgYWZ0ZXIgQVBFWGVzIGFyZSBtb3VudGVkLiBGb3IgZXhhbXBsZSwgY3JlYXRlcyBkYXRhIGRpcmVjdG9yaWVzCiAgIGZvciB0aGUgbW91bnRlZCBBUEVYZXMsIHBhcnNlcyBjb25maWcgZmlsZShzKSBmcm9tIHRoZW0sIGFuZCB1cGRhdGVzIGxpbmtlcgogICBjb25maWd1cmF0aW9ucy4gSW50ZW5kZWQgdG8gYmUgdXNlZCBvbmx5IG9uY2Ugd2hlbiBhcGV4ZCBub3RpZmllcyB0aGUgbW91bnQKICAgZXZlbnQgYnkgc2V0dGluZyBgYXBleGQuc3RhdHVzYCB0byByZWFkeS4KKyAgVXNlIC0tYm9vdHN0cmFwIHdoZW4gaW52b2tpbmcgaW4gdGhlIGJvb3RzdHJhcCBtb3VudCBuYW1lc3BhY2UuCiAKIGByZXN0YXJ0IFstLW9ubHktaWYtcnVubmluZ10gPHNlcnZpY2U+YAogPiBTdG9wcyBhbmQgcmVzdGFydHMgYSBydW5uaW5nIHNlcnZpY2UsIGRvZXMgbm90aGluZyBpZiB0aGUgc2VydmljZSBpcyBjdXJyZW50bHkKQEAgLTc0Miw2ICs3NDYsOSBAQAogICBmc3RhYi4ke3JvLmhhcmR3YXJlfSBvciBmc3RhYi4ke3JvLmhhcmR3YXJlLnBsYXRmb3JtfSB3aWxsIGJlIHNjYW5uZWQgZm9yCiAgIHVuZGVyIC9vZG0vZXRjLCAvdmVuZG9yL2V0Yywgb3IgLyBhdCBydW50aW1lLCBpbiB0aGF0IG9yZGVyLgogCitgc3dhcG9mZiA8cGF0aD5gCis+IFN0b3BzIHN3YXBwaW5nIHRvIHRoZSBmaWxlIG9yIGJsb2NrIGRldmljZSBzcGVjaWZpZWQgYnkgcGF0aC4KKwogYHN5bWxpbmsgPHRhcmdldD4gPHBhdGg+YAogPiBDcmVhdGUgYSBzeW1ib2xpYyBsaW5rIGF0IF9wYXRoXyB3aXRoIHRoZSB2YWx1ZSBfdGFyZ2V0XwogCkBAIC03ODUsNyArNzkyLDYgQEAKICAgSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZC4gSWYgaXQgZG9lcyBleGlzdCwKICAgaXQgd2lsbCBiZSB0cnVuY2F0ZWQuIFByb3BlcnRpZXMgYXJlIGV4cGFuZGVkIHdpdGhpbiBfY29udGVudF8uCiAKLQogSW1wb3J0cwogLS0tLS0tLQogYGltcG9ydCA8cGF0aD5gCmRpZmYgLS1naXQgYS9pbml0L1JFQURNRS51ZXZlbnRkLm1kIGIvaW5pdC9SRUFETUUudWV2ZW50ZC5tZAppbmRleCAzYzcxMDdhLi5hYWM0YWNiIDEwMDY0NAotLS0gYS9pbml0L1JFQURNRS51ZXZlbnRkLm1kCisrKyBiL2luaXQvUkVBRE1FLnVldmVudGQubWQKQEAgLTM5LDYgKzM5LDMzIEBACiAgICAgIGBkZXZpY2VfaWRgIGlzIGB1ZXZlbnQgTUlOT1IgJSAxMjggKyAxYC4KICAgMy4gQWxsIG90aGVyIGRldmljZXMgYXJlIGNyZWF0ZWQgYXMgYC9kZXYvPGJhc2VuYW1lIHVldmVudCBERVZQQVRIPmAKIAorV2hldGhlciBhIGRldmljZSBpcyBjb25zaWRlcmVkIGEgImJvb3QgZGV2aWNlIiBpcyBhIGJpdCBjb21wbGljYXRlZC4KKworIC0gVGhlIHJlY29tbWVuZGVkIHdheSB0byBzcGVjaWZ5IHRoZSBib290IGRldmljZSBpcyB0byBwcm92aWRlIHRoZSAicGFydGl0aW9uIFVVSUQiIGNvbnRhaW5pbmcgdGhlCisgICBrZXJuZWwgKG9yLCByZWFsbHksIGFueSBwYXJpdGlvbiBvbiB0aGUgYm9vdCBkZXZpY2UpIGFuZCB0aGVuIGJvb3QgZGV2aWNlIGlzIHRoZSBibG9jayBkZXZpY2UKKyAgIGNvbnRhaW5pbmcgdGhhdCBwYXJ0aXRpb24uIFRoaXMgaXMgcGFzc2VkIHZpYSBgYW5kcm9pZGJvb3QuYm9vdF9wYXJ0X3V1aWRgIHdoaWNoIGNhbiBiZSBwcm92aWRlZAorICAgZWl0aGVyIHZpYSB0aGUga2VybmVsIGJvb3Rjb25maWcgb3IgdmlhIHRoZSBrZXJuZWwgY29tbWFuZGxpbmUuIEFzIGFuIGV4YW1wbGUsIHlvdSBjb3VsZCBzZXQKKyAgIGBhbmRyb2lkYm9vdC5ib290X3BhcnRfdXVpZD0xMjM0NTY3OC1hYmNkLWVmMDEtMDIzNC02Nzg5YWJjZGVmMDFgLgorIC0gVGhvdWdoIHVzaW5nIGBib290X3BhcnRfdXVpZGAgaXMgcHJlZmVycmVkLCB5b3UgY2FuIGFsc28gc3BlY2lmeSB0aGUgYm9vdCBkZXZpY2UgdmlhCisgICBgYW5kcm9pZGJvb3QuYm9vdF9kZXZpY2VgIG9yIGBhbmRyb2lkYm9vdC5ib290X2RldmljZXNgLiBUaGVzZSBjYW4gYmUgcGFzc2VkIHZpYSB0aGUga2VybmVsCisgICBib290Y29uZmlnIG9yIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHBhc3MgdGhpcyB2aWEgZGV2aWNlIHRyZWUgYnkKKyAgIGNyZWF0aW5nIGEgYGJvb3RfZGV2aWNlc2AgcHJvcGVydHkgaW4gdGhlIEFuZHJvaWQgZmlybXdhcmUgbm9kZS4gSW4gbW9zdCBjYXNlcyB0aGUgYGJvb3RfZGV2aWNlYAorICAgaXMgdGhlIHN5c2ZzIHBhdGggKHdpdGhvdXQgdGhlIGAvc3lzL2RldmljZXNgIG9yIGAvc3lzL2RldmljZXMvcGxhdGZvcm1gIHByZWZpeCkgdG8gdGhlIGNsb3Nlc3QKKyAgIHBhcmVudCBvZiB0aGUgYmxvY2sgZGV2aWNlIHRoYXQncyBvbiB0aGUgInBsYXRmb3JtIiBidXMuIEFzIGFuIGV4YW1wbGUsIGlmIHRoZSBibG9jayBkZXZpY2UgaXMKKyAgIGAvc3lzL2RldmljZXMvcGxhdGZvcm0vc29jQDAvN2M0MDAwLm1tYy9tbWNfaG9zdC9tbWMxL21tYzE6MDAwMS9ibG9jay9tbWNibGsxYCB0aGVuIHRoZQorICAgYGJvb3RfZGV2aWNlYCBpcyBgc29jQDAvN2M0MDAwLm1tY2Agc2luY2Ugd2Ugc3RyaXAgb2ZmIHRoZSBgL3N5cy9kZXZpY2VzL3BsYXRmb3JtYCBhbmQgbm90aGluZworICAgcGFzdCB0aGUgYDdjNDAwMC5tbWNgIGRpcmVjdG9yeSByZXByZXNlbnRzIGEgZGV2aWNlIG9uIHRoZSAicGxhdGZvcm0iIGJ1cy4gSW4gdGhlIGNhc2UgdGhhdCBub25lCisgICBvZiB0aGUgcGFyZW50cyBhcmUgb24gdGhlICJwbGF0Zm9ybSIgYnVzIHRoZXJlIGFyZSBzcGVjaWFsIHJ1bGVzIGZvciBibG9jayBkZXZpY2VzIHVuZGVyIFBDSQorICAgYW5kIFZCRCAoVmlydHVhbCBCbG9jayBEZXZpY2UpLiBOT1RFOiBzeXNmcyBwYXRocyBmb3IgYmxvY2sgZGV2aWNlcyBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUKKyAgIHN0YWJsZSBiZXR3ZWVuIGtlcm5lbCB2ZXJzaW9ucywgd2hpY2ggaXMgb25lIG9mIHRoZSByZWFzb25zIHdoeSBpdCBpcyBzdWdnZXN0ZWQgdG8gdXNlCisgICBgYm9vdF9wYXJ0X3V1aWRgIGluc3RlYWQgb2YgYGJvb3RfZGV2aWNlc2AuIEFMU08gTk9URTogSWYgbW9yZSB0aGFuIG9uZSBkZXZpY2UgbWF0Y2hlcyAoZWl0aGVyCisgICBiZWNhdXNlIG11bHRpcGxlIGBib290X2RldmljZXNgIHdlcmUgbGlzdGVkIG9yIGJlY2F1c2UgdGhlcmUgd2FzIG1vcmUgdGhhbiBvbmUgYmxvY2sgZGV2aWNlCisgICB1bmRlciB0aGUgZm91bmQgc3lzZnMgZGlyZWN0b3J5KSBhbmQgdGhlc2UgbXVsdGlwbGUgbWF0Y2hpbmcgZGV2aWNlcyBwcm92aWRlIHNvbWUgb2YgdGhlIHNhbWUKKyAgIG5hbWVkIHBhcnRpdGlvbnMgdGhlbiB0aGUgYmVoYXZpb3IgaXMgdW5zcGVjaWZpZWQuCisgLSBUaGVyZSBpcyBhIGZ1cnRoZXIgZmFsbGJhY2sgdG8gZGV0ZXJtaW5lICJib290IGRldmljZXMiIHZpYSB0aGUgdnN0YWIsIGJ1dCBwcm92aWRpbmcgYXQgbGVhc3QKKyAgIGBib290X2RldmljZXNgIGhhcyBiZWVuIHJlcXVpcmVkIHNpbmNlIEFuZHJvaWQgMTIgc28gdGhpcyBmdXJ0aGVyIGZhbGxiYWNrIHdpbGwgbm90IGJlIGRlc2NyaWJlZAorICAgaGVyZS4KKwogVGhlIHBlcm1pc3Npb25zIGNhbiBiZSBtb2RpZmllZCB1c2luZyBhIHVldmVudGQucmMgc2NyaXB0IGFuZCBhIGxpbmUgdGhhdCBiZWluZ3Mgd2l0aCBgL2RldmAuIFRoZXNlCiBsaW5lcyB0YWtlIHRoZSBmb3JtYXQgb2YKIApAQCAtNTksOSArODYsMTAgQEAKIAogYHN1YnN5c3RlbV9uYW1lYCBpcyB1c2VkIHRvIG1hdGNoIHVldmVudCBgU1VCU1lTVEVNYCB2YWx1ZQogCi1gZGV2bmFtZWAgdGFrZXMgb25lIG9mIHR3byBvcHRpb25zCitgZGV2bmFtZWAgdGFrZXMgb25lIG9mIHRocmVlIG9wdGlvbnMKICAgMS4gYHVldmVudF9kZXZuYW1lYCBzcGVjaWZpZXMgdGhhdCB0aGUgbmFtZSBvZiB0aGUgbm9kZSB3aWxsIGJlIHRoZSB1ZXZlbnQgYERFVk5BTUVgCi0gIDIuIGB1ZXZlbnRfZGV2cGF0aGAgc3BlY2lmaWVkIHRoYXQgdGhlIG5hbWUgb2YgdGhlIG5vZGUgd2lsbCBiZSBiYXNlbmFtZSB1ZXZlbnQgYERFVlBBVEhgCisgIDIuIGB1ZXZlbnRfZGV2cGF0aGAgc3BlY2lmaWVzIHRoYXQgdGhlIG5hbWUgb2YgdGhlIG5vZGUgd2lsbCBiZSBiYXNlbmFtZSB1ZXZlbnQgYERFVlBBVEhgCisgIDMuIGBzeXNfbmFtZWAgc3BlY2lmaWVzIHRoYXQgdGhlIG5hbWUgb2YgdGhlIG5vZGUgd2lsbCBiZSB0aGUgY29udGVudHMgb2YgYC9zeXMvREVWUEFUSC9uYW1lYAogCiBgZGlybmFtZWAgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHRoYXQgc3BlY2lmaWVzIGEgZGlyZWN0b3J5IHdpdGhpbiBgL2RldmAgd2hlcmUgdGhlIG5vZGUgd2lsbCBiZQogY3JlYXRlZC4KZGlmZiAtLWdpdCBhL2luaXQvVEVTVF9NQVBQSU5HIGIvaW5pdC9URVNUX01BUFBJTkcKaW5kZXggNDAyYjUwMS4uMzZjYTM3OSAxMDA2NDQKLS0tIGEvaW5pdC9URVNUX01BUFBJTkcKKysrIGIvaW5pdC9URVNUX01BUFBJTkcKQEAgLTgsMTQgKzgsNiBAQAogICAgIH0sCiAgICAgewogICAgICAgIm5hbWUiOiAiTWljcm9kcm9pZEhvc3RUZXN0Q2FzZXMiCi0gICAgfSwKLSAgICB7Ci0gICAgICAibmFtZSI6ICJDdHNTZWN1cml0eUhvc3RUZXN0Q2FzZXMiLAotICAgICAgIm9wdGlvbnMiOiBbCi0gICAgICAgIHsKLSAgICAgICAgICAiaW5jbHVkZS1maWx0ZXIiOiAiYW5kcm9pZC5zZWN1cml0eS5jdHMuU2VhbWVuZGNIb3N0VGVzdCIKLSAgICAgICAgfQotICAgICAgXQogICAgIH0KICAgXSwKICAgImh3YXNhbi1wcmVzdWJtaXQiOiBbCkBAIC0yNywxNCArMTksNiBAQAogICAgIH0sCiAgICAgewogICAgICAgIm5hbWUiOiAiTWljcm9kcm9pZEhvc3RUZXN0Q2FzZXMiCi0gICAgfSwKLSAgICB7Ci0gICAgICAibmFtZSI6ICJDdHNTZWN1cml0eUhvc3RUZXN0Q2FzZXMiLAotICAgICAgIm9wdGlvbnMiOiBbCi0gICAgICAgIHsKLSAgICAgICAgICAiaW5jbHVkZS1maWx0ZXIiOiAiYW5kcm9pZC5zZWN1cml0eS5jdHMuU2VhbWVuZGNIb3N0VGVzdCIKLSAgICAgICAgfQotICAgICAgXQogICAgIH0KICAgXQogfQpkaWZmIC0tZ2l0IGEvaW5pdC9hcGV4X2luaXRfdXRpbC5jcHAgYi9pbml0L2FwZXhfaW5pdF91dGlsLmNwcAppbmRleCBjODE4ZjhmLi44MDljODA1IDEwMDY0NAotLS0gYS9pbml0L2FwZXhfaW5pdF91dGlsLmNwcAorKysgYi9pbml0L2FwZXhfaW5pdF91dGlsLmNwcApAQCAtMTYsMTMgKzE2LDE1IEBACiAKICNpbmNsdWRlICJhcGV4X2luaXRfdXRpbC5oIgogCisjaW5jbHVkZSA8ZGlyZW50Lmg+CiAjaW5jbHVkZSA8Z2xvYi5oPgogCisjaW5jbHVkZSA8c2V0PgogI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Jlc3VsdC5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Jlc3VsdC5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CiAKICNpbmNsdWRlICJhY3Rpb25fbWFuYWdlci5oIgpAQCAtMzQsMTAgKzM2LDEzIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaW5pdCB7CiAKLXN0YXRpYyBSZXN1bHQ8c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PiBDb2xsZWN0QXBleENvbmZpZ3MoY29uc3Qgc3RkOjpzdHJpbmcmIGFwZXhfbmFtZSkgeworc3RhdGljIFJlc3VsdDxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+IENvbGxlY3RSY1NjcmlwdHNGcm9tQXBleCgKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFwZXhfbmFtZSwgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBza2lwX2FwZXhlcykgewogICAgIGdsb2JfdCBnbG9iX3Jlc3VsdDsKLSAgICBzdGQ6OnN0cmluZyBnbG9iX3BhdHRlcm4gPSBhcGV4X25hbWUuZW1wdHkoKSA/Ci0gICAgICAgICAgICAiL2FwZXgvKi9ldGMvKnJjIiA6ICIvYXBleC8iICsgYXBleF9uYW1lICsgIi9ldGMvKnJjIjsKKyAgICAvLyBQYXR0ZXJuIHVzZXMgIipyYyIgaW5zdGVhZCBvZiAiLnJjIiBiZWNhdXNlIEFQRVhlcyBjYW4gaGF2ZSB2ZXJzaW9uZWQgUkMgZmlsZXMKKyAgICAvLyBsaWtlIGZvby4zNHJjLgorICAgIHN0ZDo6c3RyaW5nIGdsb2JfcGF0dGVybiA9CisgICAgICAgICAgICBhcGV4X25hbWUuZW1wdHkoKSA/ICIvYXBleC8qL2V0Yy8qcmMiIDogIi9hcGV4LyIgKyBhcGV4X25hbWUgKyAiL2V0Yy8qcmMiOwogCiAgICAgY29uc3QgaW50IHJldCA9IGdsb2IoZ2xvYl9wYXR0ZXJuLmNfc3RyKCksIEdMT0JfTUFSSywgbnVsbHB0ciwgJmdsb2JfcmVzdWx0KTsKICAgICBpZiAocmV0ICE9IDAgJiYgcmV0ICE9IEdMT0JfTk9NQVRDSCkgewpAQCAtNDcsMTUgKzUyLDI4IEBACiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbmZpZ3M7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBnbG9iX3Jlc3VsdC5nbF9wYXRoYzsgaSsrKSB7CiAgICAgICAgIHN0ZDo6c3RyaW5nIHBhdGggPSBnbG9iX3Jlc3VsdC5nbF9wYXRodltpXTsKLSAgICAgICAgLy8gRmlsdGVyLW91dCAvYXBleC88bmFtZT5APHZlcj4gcGF0aHMuIFRoZSBwYXRocyBhcmUgYmluZC1tb3VudGVkIHRvCi0gICAgICAgIC8vIC9hcGV4LzxuYW1lPiBwYXRocywgc28gdW5sZXNzIHdlIGZpbHRlciB0aGVtIG91dCwgd2Ugd2lsbCBwYXJzZSB0aGUKLSAgICAgICAgLy8gc2FtZSBmaWxlIHR3aWNlLgotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGF0aHMgPSBhbmRyb2lkOjpiYXNlOjpTcGxpdChwYXRoLCAiLyIpOwotICAgICAgICBpZiAocGF0aHMuc2l6ZSgpID49IDMgJiYgcGF0aHNbMl0uZmluZCgnQCcpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisKKyAgICAgICAgLy8gRmlsdGVyIG91dCBkaXJlY3RvcmllcworICAgICAgICBpZiAocGF0aC5iYWNrKCkgPT0gJy8nKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICAvLyBGaWx0ZXIgZGlyZWN0b3JpZXMKLSAgICAgICAgaWYgKHBhdGguYmFjaygpID09ICcvJykgeworCisgICAgICAgIC8vIEdldCBhcGV4IG5hbWUgZnJvbSBwYXRoLgorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGF0aHMgPSBhbmRyb2lkOjpiYXNlOjpTcGxpdChwYXRoLCAiLyIpOworICAgICAgICBpZiAocGF0aHMuc2l6ZSgpIDwgMykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFwZXhfbmFtZSA9IHBhdGhzWzJdOworCisgICAgICAgIC8vIEZpbHRlciBvdXQgL2FwZXgvPG5hbWU+QDx2ZXI+IHBhdGhzLiBUaGUgcGF0aHMgYXJlIGJpbmQtbW91bnRlZCB0bworICAgICAgICAvLyAvYXBleC88bmFtZT4gcGF0aHMsIHNvIHVubGVzcyB3ZSBmaWx0ZXIgdGhlbSBvdXQsIHdlIHdpbGwgcGFyc2UgdGhlCisgICAgICAgIC8vIHNhbWUgZmlsZSB0d2ljZS4KKyAgICAgICAgaWYgKGFwZXhfbmFtZS5maW5kKCdAJykgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gRmlsdGVyIG91dCBza2lwX3NldCBhcGV4ZXMKKyAgICAgICAgaWYgKHNraXBfYXBleGVzLmNvdW50KGFwZXhfbmFtZSkgPiAwKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBjb25maWdzLnB1c2hfYmFjayhwYXRoKTsKQEAgLTY0LDExICs4Miw0OSBAQAogICAgIHJldHVybiBjb25maWdzOwogfQogCi1zdGF0aWMgUmVzdWx0PHZvaWQ+IFBhcnNlQ29uZmlncyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGNvbmZpZ3MpIHsKK3N0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBHZXRBcGV4TGlzdEZyb20oY29uc3Qgc3RkOjpzdHJpbmcmIGFwZXhfZGlyKSB7CisgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGFwZXhfbGlzdDsKKyAgICBhdXRvIGRpcnAgPSBzdGQ6OnVuaXF1ZV9wdHI8RElSLCBpbnQgKCopKERJUiopPihvcGVuZGlyKGFwZXhfZGlyLmNfc3RyKCkpLCBjbG9zZWRpcik7CisgICAgaWYgKCFkaXJwKSB7CisgICAgICAgIHJldHVybiBhcGV4X2xpc3Q7CisgICAgfQorICAgIHN0cnVjdCBkaXJlbnQqIGVudHJ5OworICAgIHdoaWxlICgoZW50cnkgPSByZWFkZGlyKGRpcnAuZ2V0KCkpKSAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChlbnRyeS0+ZF90eXBlICE9IERUX0RJUikgY29udGludWU7CisKKyAgICAgICAgY29uc3QgY2hhciogbmFtZSA9IGVudHJ5LT5kX25hbWU7CisgICAgICAgIGlmIChuYW1lWzBdID09ICcuJykgY29udGludWU7CisgICAgICAgIGlmIChzdHJjaHIobmFtZSwgJ0AnKSAhPSBudWxscHRyKSBjb250aW51ZTsKKyAgICAgICAgaWYgKHN0cmNtcChuYW1lLCAic2hhcmVkbGlicyIpID09IDApIGNvbnRpbnVlOworICAgICAgICBhcGV4X2xpc3QuaW5zZXJ0KG5hbWUpOworICAgIH0KKyAgICByZXR1cm4gYXBleF9saXN0OworfQorCitzdGF0aWMgaW50IEdldEN1cnJlbnRTZGsoKSB7CisgICAgYm9vbCBpc19wcmV2aWV3ID0gYmFzZTo6R2V0UHJvcGVydHkoInJvLmJ1aWxkLnZlcnNpb24uY29kZW5hbWUiLCAiIikgIT0gIlJFTCI7CisgICAgaWYgKGlzX3ByZXZpZXcpIHsKKyAgICAgICAgcmV0dXJuIF9fQU5EUk9JRF9BUElfRlVUVVJFX187CisgICAgfQorICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpHZXRJbnRQcm9wZXJ0eSgicm8uYnVpbGQudmVyc2lvbi5zZGsiLCBfX0FORFJPSURfQVBJX0ZVVFVSRV9fKTsKK30KKworc3RhdGljIFJlc3VsdDx2b2lkPiBQYXJzZVJjU2NyaXB0cyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGZpbGVzKSB7CisgICAgaWYgKGZpbGVzLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIHt9OworICAgIH0KKyAgICAvLyBBUEVYZXMgY2FuIGhhdmUgdmVyc2lvbmVkIFJDIGZpbGVzLiBUaGVzZSBzaG91bGQgYmUgZmlsdGVyZWQgYmFzZWQgb24KKyAgICAvLyBTREsgdmVyc2lvbi4KKyAgICBzdGF0aWMgaW50IHNkayA9IEdldEN1cnJlbnRTZGsoKTsKKyAgICBhdXRvIGZpbHRlcmVkID0gRmlsdGVyVmVyc2lvbmVkQ29uZmlncyhmaWxlcywgc2RrKTsKKyAgICBpZiAoZmlsdGVyZWQuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4ge307CisgICAgfQorCiAgICAgUGFyc2VyIHBhcnNlciA9CiAgICAgICAgICAgICBDcmVhdGVBcGV4Q29uZmlnUGFyc2VyKEFjdGlvbk1hbmFnZXI6OkdldEluc3RhbmNlKCksIFNlcnZpY2VMaXN0OjpHZXRJbnN0YW5jZSgpKTsKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZXJyb3JzOwotICAgIGZvciAoY29uc3QgYXV0byYgYyA6IGNvbmZpZ3MpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGMgOiBmaWx0ZXJlZCkgewogICAgICAgICBhdXRvIHJlc3VsdCA9IHBhcnNlci5QYXJzZUNvbmZpZ0ZpbGUoYyk7CiAgICAgICAgIC8vIFdlIHNob3VsZCBoYW5kbGUgb3RoZXIgY29uZmlnIGZpbGVzIGV2ZW4gd2hlbiB0aGVyZSdzIGFuIGVycm9yLgogICAgICAgICBpZiAoIXJlc3VsdC5vaygpKSB7CkBAIC04MSwxNiArMTM3LDIxIEBACiAgICAgcmV0dXJuIHt9OwogfQogCi1SZXN1bHQ8dm9pZD4gUGFyc2VBcGV4Q29uZmlncyhjb25zdCBzdGQ6OnN0cmluZyYgYXBleF9uYW1lKSB7Ci0gICAgYXV0byBjb25maWdzID0gT1JfUkVUVVJOKENvbGxlY3RBcGV4Q29uZmlncyhhcGV4X25hbWUpKTsKK1Jlc3VsdDx2b2lkPiBQYXJzZVJjU2NyaXB0c0Zyb21BcGV4KGNvbnN0IHN0ZDo6c3RyaW5nJiBhcGV4X25hbWUpIHsKKyAgICBhdXRvIGNvbmZpZ3MgPSBPUl9SRVRVUk4oQ29sbGVjdFJjU2NyaXB0c0Zyb21BcGV4KGFwZXhfbmFtZSwgLypza2lwX2FwZXhlcz0qL3t9KSk7CisgICAgcmV0dXJuIFBhcnNlUmNTY3JpcHRzKGNvbmZpZ3MpOworfQogCi0gICAgaWYgKGNvbmZpZ3MuZW1wdHkoKSkgewotICAgICAgICByZXR1cm4ge307CitSZXN1bHQ8dm9pZD4gUGFyc2VSY1NjcmlwdHNGcm9tQWxsQXBleGVzKGJvb2wgYm9vdHN0cmFwKSB7CisgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHNraXBfYXBleGVzOworICAgIGlmICghYm9vdHN0cmFwKSB7CisgICAgICAgIC8vIEluIGNhc2Ugd2UgYWxyZWFkeSBsb2FkZWQgY29uZmlnIGZpbGVzIGZyb20gYm9vdHN0cmFwIEFQRVhlcywgd2UgbmVlZCB0byBhdm9pZCBsb2FkaW5nCisgICAgICAgIC8vIHRoZW0gYWdhaW4uIFdlIGNhbiBnZXQgdGhlIGxpc3Qgb2YgYm9vdHN0cmFwIEFQRVhlcyBieSBzY2FubmluZyAvYm9vdHN0cmFwLWFwZXggYW5kCisgICAgICAgIC8vIHNraXAgdGhlbSBpbiBDb2xsZWN0UmNTY3JpcHRzRnJvbUFwZXguCisgICAgICAgIHNraXBfYXBleGVzID0gR2V0QXBleExpc3RGcm9tKCIvYm9vdHN0cmFwLWFwZXgiKTsKICAgICB9Ci0KLSAgICBhdXRvIGZpbHRlcmVkX2NvbmZpZ3MgPSBGaWx0ZXJWZXJzaW9uZWRDb25maWdzKGNvbmZpZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpHZXRJbnRQcm9wZXJ0eSgicm8uYnVpbGQudmVyc2lvbi5zZGsiLCBJTlRfTUFYKSk7Ci0gICAgcmV0dXJuIFBhcnNlQ29uZmlncyhmaWx0ZXJlZF9jb25maWdzKTsKKyAgICBhdXRvIGNvbmZpZ3MgPSBPUl9SRVRVUk4oQ29sbGVjdFJjU2NyaXB0c0Zyb21BcGV4KC8qYXBleF9uYW1lPSovIiIsIHNraXBfYXBleGVzKSk7CisgICAgcmV0dXJuIFBhcnNlUmNTY3JpcHRzKGNvbmZpZ3MpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgaW5pdApkaWZmIC0tZ2l0IGEvaW5pdC9hcGV4X2luaXRfdXRpbC5oIGIvaW5pdC9hcGV4X2luaXRfdXRpbC5oCmluZGV4IDQzZjhhZDUuLjc1ZGZlZTEgMTAwNjQ0Ci0tLSBhL2luaXQvYXBleF9pbml0X3V0aWwuaAorKysgYi9pbml0L2FwZXhfaW5pdF91dGlsLmgKQEAgLTE2LDYgKzE2LDcgQEAKIAogI3ByYWdtYSBvbmNlCiAKKyNpbmNsdWRlIDxzZXQ+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KIApAQCAtMjQsOSArMjUsMTQgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBpbml0IHsKIAotLy8gUGFyc2UgYWxsIGNvbmZpZyBmaWxlcyBmb3IgYSBnaXZlbiBhcGV4LgotLy8gSWYgYXBleCBuYW1lIGlzIGVtcHR5KCIiKSwgY29uZmlnIGZpbGVzIGZvciBhbGwgYXBleGVzIHdpbGwgYmUgcGFyc2VkLgotUmVzdWx0PHZvaWQ+IFBhcnNlQXBleENvbmZpZ3MoY29uc3Qgc3RkOjpzdHJpbmcmIGFwZXhfbmFtZSk7CisvLyBTY2FucyBhcGV4X2RpciAoL2FwZXgpIHRvIGdldCB0aGUgbGlzdCBvZiBhY3RpdmUgQVBFWGVzLgorc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IEdldEFwZXhMaXN0RnJvbShjb25zdCBzdGQ6OnN0cmluZyYgYXBleF9kaXIpOworCisvLyBQYXJzZSBhbGwgUkMgc2NyaXB0cyBmb3IgYSBnaXZlbiBhcGV4LgorUmVzdWx0PHZvaWQ+IFBhcnNlUmNTY3JpcHRzRnJvbUFwZXgoY29uc3Qgc3RkOjpzdHJpbmcmIGFwZXhfbmFtZSk7CisKKy8vIFBhcnNlIGFsbCBSQyBzY3JpcHRzIGZvciBhbGwgYXBleGVzIHVuZGVyIC9hcGV4LgorUmVzdWx0PHZvaWQ+IFBhcnNlUmNTY3JpcHRzRnJvbUFsbEFwZXhlcyhib29sIGJvb3RzdHJhcCk7CiAKIH0gIC8vIG5hbWVzcGFjZSBpbml0CiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5pdC9ibG9ja19kZXZfaW5pdGlhbGl6ZXIuY3BwIGIvaW5pdC9ibG9ja19kZXZfaW5pdGlhbGl6ZXIuY3BwCmluZGV4IDA1ZTAwZWQuLjdmODMwMzcgMTAwNjQ0Ci0tLSBhL2luaXQvYmxvY2tfZGV2X2luaXRpYWxpemVyLmNwcAorKysgYi9pbml0L2Jsb2NrX2Rldl9pbml0aWFsaXplci5jcHAKQEAgLTMzLDcgKzMzLDQ5IEBACiAgICAgYXV0byBib290X2RldmljZXMgPSBhbmRyb2lkOjpmc19tZ3I6OkdldEJvb3REZXZpY2VzKCk7CiAgICAgZGV2aWNlX2hhbmRsZXJfID0gc3RkOjptYWtlX3VuaXF1ZTxEZXZpY2VIYW5kbGVyPigKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBlcm1pc3Npb25zPnt9LCBzdGQ6OnZlY3RvcjxTeXNmc1Blcm1pc3Npb25zPnt9LCBzdGQ6OnZlY3RvcjxTdWJzeXN0ZW0+e30sCi0gICAgICAgICAgICBzdGQ6Om1vdmUoYm9vdF9kZXZpY2VzKSwgZmFsc2UpOworICAgICAgICAgICAgc3RkOjptb3ZlKGJvb3RfZGV2aWNlcyksIGFuZHJvaWQ6OmZzX21ncjo6R2V0Qm9vdFBhcnRVdWlkKCksIGZhbHNlKTsKK30KKworLy8gSWYgYm9vdF9wYXJ0X3V1aWQgaXMgc3BlY2lmaWVkLCB1c2UgaXQgdG8gc2V0IGJvb3RfZGV2aWNlcworLy8KKy8vIFdoZW4gYGFuZHJvaWRib290LmJvb3RfcGFydF91dWlkYCBpcyBzcGVjaWZpZWQgdGhlbiB0aGF0J3MgdGhlIHBhcnRpdGlvbiBVVUlECisvLyBvZiB0aGUga2VybmVsLiBMb29rIGZvciB0aGF0IHBhcnRpdGlvbiBhbmQgdGhlbiBzZXQgYGJvb3RfZGV2aWNlc2AgdG8gYmUKKy8vIGV4YWN0bHkgb25lIGl0ZW06IHRoZSBibG9jayBkZXZpY2UgY29udGFpbmluZyB0aGF0IHBhcnRpdGlvbi4KKy8vCisvLyBOT1RFIHRoYXQgYGJvb3RfcGFydF91dWlkYCBpcyBvbmx5IHNwZWNpZmllZCBvbiBuZXdlciBkZXZpY2VzLiBPbGRlciBkZXZpY2VzCisvLyBzcGVjaWZpZWQgYGJvb3RfZGV2aWNlc2AgZGlyZWN0bHkuCitib29sIEJsb2NrRGV2SW5pdGlhbGl6ZXI6OkluaXRCb290RGV2aWNlc0Zyb21QYXJ0VXVpZCgpIHsKKyAgICBib29sIHV1aWRfY2hlY2tfZG9uZSA9IGZhbHNlOworCisgICAgYXV0byBib290X3BhcnRfY2FsbGJhY2sgPSBbJiwgdGhpc10oY29uc3QgVWV2ZW50JiB1ZXZlbnQpIC0+IExpc3RlbmVyQWN0aW9uIHsKKyAgICAgICAgdXVpZF9jaGVja19kb25lID0gZGV2aWNlX2hhbmRsZXJfLT5DaGVja1VldmVudEZvckJvb3RQYXJ0VXVpZCh1ZXZlbnQpOworICAgICAgICByZXR1cm4gdXVpZF9jaGVja19kb25lID8gTGlzdGVuZXJBY3Rpb246OmtTdG9wIDogTGlzdGVuZXJBY3Rpb246OmtDb250aW51ZTsKKyAgICB9OworCisgICAgLy8gUmUtcnVuIGFscmVhZHkgYXJyaXZlZCB1ZXZlbnRzIGxvb2tpbmcgZm9yIHRoZSBib290IHBhcnRpdGlvbiBVVUlELgorICAgIC8vCisgICAgLy8gTk9URTogSWYgd2UncmUgbm90IHVzaW5nIHRoZSBib290IHBhcnRpdGlvbiBVVUlEIHRvIGZpbmQgdGhlIGJvb3QKKyAgICAvLyBkZXZpY2UgdGhlbiB0aGUgZmlyc3QgdWV2ZW50IHdlIGFuYWx5emUgd2lsbCBjYXVzZSB1cyB0byBzdG9wIGxvb2tpbmcKKyAgICAvLyBhbmQgc2V0IGB1dWlkX2NoZWNrX2RvbmVgLiBUaGlzIHdpbGwgc2hvcnRjdXQgYWxsIG9mIHRoZSBVVUlEIGxvZ2ljLgorICAgIC8vIFJlcGxheWluZyBvbmUgdWV2ZW50IGlzIG5vdCBleHBlY3RlZCB0byBiZSBzbG93LgorICAgIHVldmVudF9saXN0ZW5lcl8uUmVnZW5lcmF0ZVVldmVudHMoYm9vdF9wYXJ0X2NhbGxiYWNrKTsKKworICAgIC8vIElmIHdlJ3JlIG5vdCBkb25lIGxvb2tpbmcsIHBvbGwgZm9yIHVldmVudHMgZm9yIGxvbmdlcgorICAgIGlmICghdXVpZF9jaGVja19kb25lKSB7CisgICAgICAgIFRpbWVyIHQ7CisgICAgICAgIHVldmVudF9saXN0ZW5lcl8uUG9sbChib290X3BhcnRfY2FsbGJhY2ssIDEwcyk7CisgICAgICAgIExPRyhJTkZPKSA8PCAiV2FpdCBmb3IgYm9vdCBwYXJ0aXRpb24gcmV0dXJuZWQgYWZ0ZXIgIiA8PCB0OworICAgIH0KKworICAgIC8vIEdpdmUgYSBuaWNlciBlcnJvciBtZXNzYWdlIGlmIHdlIHdlcmUgZXhwZWN0aW5nIHRvIGZpbmQgdGhlIGtlcm5lbCBib290CisgICAgLy8gcGFydGl0aW9uIGJ1dCBkaWRuJ3QuIExhdGVyIGNvZGUgd291bGQgZmFpbCB0b28gYnV0IHRoZSBtZXNzYWdlIHRoZXJlCisgICAgLy8gaXMgYSBiaXQgZnVydGhlciBmcm9tIHRoZSByb290IGNhdXNlIG9mIHRoZSBwcm9ibGVtLgorICAgIGlmICghdXVpZF9jaGVja19kb25lKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgX19QUkVUVFlfRlVOQ1RJT05fXyA8PCAiOiBib290IHBhcnRpdGlvbiBub3QgZm91bmQgYWZ0ZXIgcG9sbGluZyB0aW1lb3V0LiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogYm9vbCBCbG9ja0RldkluaXRpYWxpemVyOjpJbml0RGV2aWNlTWFwcGVyKCkgewpAQCAtOTgsMTEgKzE0MCw0MyBAQAogCiAgICAgTE9HKFZFUkJPU0UpIDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18gPDwgIjogZm91bmQgcGFydGl0aW9uOiAiIDw8IG5hbWU7CiAKLSAgICBkZXZpY2VzLT5lcmFzZShpdGVyKTsKKyAgICAvLyBSZW1vdmUgdGhlIHBhcnRpdGlvbiBmcm9tIHRoZSBsaXN0IG9mIHBhcnRpdGlvbnMgd2UncmUgd2FpdGluZyBmb3IuCisgICAgLy8KKyAgICAvLyBQYXJ0aXRpb25zIHRoYXQgd2UncmUgd2FpdGluZyBmb3IgaGVyZSBhcmUgZXhwZWN0ZWQgdG8gYmUgb24gdGhlIGJvb3QKKyAgICAvLyBkZXZpY2UsIHNvIG9ubHkgcmVtb3ZlIGZyb20gdGhlIGxpc3QgaWYgdGhleSdyZSBvbiB0aGUgYm9vdCBkZXZpY2UuCisgICAgLy8gVGhpcyBwcmV2ZW50cyB1cyBmcm9tIGJlaW5nIGNvbmZ1c2VkIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBkaXNrcyAoc29tZQorICAgIC8vIHBlcmhhcHMgY29ubmVjdGVkIHZpYSBVU0IpIHRoYXQgaGF2ZSBtYXRjaGluZyBwYXJ0aXRpb24gbmFtZXMuCisgICAgLy8KKyAgICAvLyAuLi5idXQuLi4KKyAgICAvLworICAgIC8vIFNvbWUgcHJvZHVjdHMgKGVzcGVjaWFseSBlbXVsYXRvcnMpIGRvbid0IHNlZW0gdG8gc2V0IHVwIGJvb3RfZGV2aWNlcworICAgIC8vIG9yIHBvc3NpYmx5IG5vdCBhbGwgdGhlIHBhcnRpdGlvbnMgdGhhdCB3ZSBuZWVkIHRvIHdhaXQgZm9yIGFyZSBvbiB0aGUKKyAgICAvLyBzcGVjaWZpZWQgYm9vdCBkZXZpY2UuIFRodXMsIG9ubHkgcmVxdWlyZSBwYXJ0aXRpb25zIHRvIGJlIG9uIHRoZSBib290CisgICAgLy8gZGV2aWNlIGluICJzdHJpY3QiIG1vZGUsIHdoaWNoIHNob3VsZCBiZSB1c2VkIG9uIG5ld2VyIHN5c3RlbXMuCisgICAgaWYgKGRldmljZV9oYW5kbGVyXy0+SXNCb290RGV2aWNlKHVldmVudCkgfHwgIWRldmljZV9oYW5kbGVyXy0+SXNCb290RGV2aWNlU3RyaWN0KCkpIHsKKyAgICAgICAgZGV2aWNlcy0+ZXJhc2UoaXRlcik7CisgICAgfQorCiAgICAgZGV2aWNlX2hhbmRsZXJfLT5IYW5kbGVVZXZlbnQodWV2ZW50KTsKICAgICByZXR1cm4gZGV2aWNlcy0+ZW1wdHkoKSA/IExpc3RlbmVyQWN0aW9uOjprU3RvcCA6IExpc3RlbmVyQWN0aW9uOjprQ29udGludWU7CiB9CiAKKy8vIFdhaXQgZm9yIHBhcnRpdGlvbnMgdGhhdCBhcmUgZXhwZWN0ZWQgdG8gYmUgb24gdGhlICJib290IGRldmljZSIgdG8gaW5pdGlhbGl6ZS4KKy8vCisvLyBXYWl0IChmb3IgdXAgdG8gMTAgc2Vjb25kcykgZm9yIHBhcnRpdGlvbnMgcGFzc2VkIGluIGBkZXZpY2VzYCB0byBzaG93IHVwLgorLy8gQWxsIGJsb2NrIGRldmljZXMgZm91bmQgd2hpbGUgd2FpdGluZyB3aWxsIGJlIGluaXRpYWxpemVkLCB3aGljaCBpbmNsdWRlcworLy8gY3JlYXRpbmcgc3ltbGlua3MgZm9yIHRoZW0gaW4gL2Rldi9ibG9jay4gT25jZSBhbGwgYGRldmljZXNgIGFyZSBmb3VuZCB3ZSdsbAorLy8gcmV0dXJuIHN1Y2Nlc3MgKHRydWUpLiBJZiBhbnkgZGV2aWNlcyBhcmVuJ3QgZm91bmQgd2UnbGwgcmV0dXJuIGZhaWx1cmUKKy8vIChmYWxzZSkuIEFzIGRldmljZXMgYXJlIGZvdW5kIHRoZXkgd2lsbCBiZSByZW1vdmVkIGZyb20gYGRldmljZXNgLgorLy8KKy8vIFRoZSBjb250ZW50cyBvZiBgZGV2aWNlc2AgaXMgdGhlIG5hbWVzIG9mIHRoZSBwYXJ0aXRpb25zLiBUaGlzIGNhbiBiZToKKy8vIC0gVGhlIGBwYXJ0aXRpb25fbmFtZWAgcmVwb3J0ZWQgYnkgYSB1ZXZlbnQsIG9yIHRoZSBmaW5hbCBjb21wb25lbnQgaW4gdGhlCisvLyAgIGBwYXRoYCByZXBvcnRlZCBieSBhIHVldmVudCBpZiB0aGUgYHBhcnRpdGlvbl9uYW1lYCBpcyBibGFuay4KKy8vIC0gVGhlIHJlc3VsdCBvZiBEZXZpY2VIYW5kbGVyOjpHZXRQYXJ0aXRpb25OYW1lRm9yRGV2aWNlKCkgb24gdGhlCisvLyAgIGBkZXZpY2VfbmFtZWAgcmVwb3J0ZWQgYnkgYSB1ZXZlbnQuCisvLworLy8gTk9URTogb24gbmV3ZXIgc3lzdGVtcyBwYXJ0aXRpb25zIF9tdXN0XyBiZSBvbiB0aGUgImJvb3QgZGV2aWNlIi4gU2VlCisvLyBjb21tZW50cyBpbnNpZGUgSGFuZGxlVWV2ZW50KCkuCiBib29sIEJsb2NrRGV2SW5pdGlhbGl6ZXI6OkluaXREZXZpY2VzKHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBkZXZpY2VzKSB7CiAgICAgYXV0byB1ZXZlbnRfY2FsbGJhY2sgPSBbJiwgdGhpc10oY29uc3QgVWV2ZW50JiB1ZXZlbnQpIC0+IExpc3RlbmVyQWN0aW9uIHsKICAgICAgICAgcmV0dXJuIEhhbmRsZVVldmVudCh1ZXZlbnQsICZkZXZpY2VzKTsKQEAgLTEzMiwxMSArMjA2LDIzIEBACiBib29sIEJsb2NrRGV2SW5pdGlhbGl6ZXI6OkluaXREbURldmljZShjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlKSB7CiAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZGV2aWNlX25hbWUoYmFzZW5hbWUoZGV2aWNlLmNfc3RyKCkpKTsKICAgICBjb25zdCBzdGQ6OnN0cmluZyBzeXNwYXRoID0gIi9zeXMvYmxvY2svIiArIGRldmljZV9uYW1lOworICAgIHJldHVybiBJbml0RGV2aWNlKHN5c3BhdGgsIGRldmljZV9uYW1lKTsKK30KKworYm9vbCBCbG9ja0RldkluaXRpYWxpemVyOjpJbml0UGxhdGZvcm1EZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIGRldl9uYW1lKSB7CisgICAgcmV0dXJuIEluaXREZXZpY2UoIi9zeXMvZGV2aWNlcy9wbGF0Zm9ybSIsIGRldl9uYW1lKTsKK30KKworYm9vbCBCbG9ja0RldkluaXRpYWxpemVyOjpJbml0SHZjRGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZfbmFtZSkgeworICAgIHJldHVybiBJbml0RGV2aWNlKCIvc3lzL2RldmljZXMvdmlydHVhbC90dHkiLCBkZXZfbmFtZSk7Cit9CisKK2Jvb2wgQmxvY2tEZXZJbml0aWFsaXplcjo6SW5pdERldmljZShjb25zdCBzdGQ6OnN0cmluZyYgc3lzcGF0aCwgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZV9uYW1lKSB7CiAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwogCi0gICAgYXV0byB1ZXZlbnRfY2FsbGJhY2sgPSBbJmRldmljZV9uYW1lLCAmZGV2aWNlLCB0aGlzLCAmZm91bmRdKGNvbnN0IFVldmVudCYgdWV2ZW50KSB7CisgICAgYXV0byB1ZXZlbnRfY2FsbGJhY2sgPSBbJmRldmljZV9uYW1lLCB0aGlzLCAmZm91bmRdKGNvbnN0IFVldmVudCYgdWV2ZW50KSB7CiAgICAgICAgIGlmICh1ZXZlbnQuZGV2aWNlX25hbWUgPT0gZGV2aWNlX25hbWUpIHsKLSAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiQ3JlYXRpbmcgZGV2aWNlLW1hcHBlciBkZXZpY2UgOiAiIDw8IGRldmljZTsKKyAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiQ3JlYXRpbmcgZGV2aWNlIDogIiA8PCBkZXZpY2VfbmFtZTsKICAgICAgICAgICAgIGRldmljZV9oYW5kbGVyXy0+SGFuZGxlVWV2ZW50KHVldmVudCk7CiAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICByZXR1cm4gTGlzdGVuZXJBY3Rpb246OmtTdG9wOwpAQCAtMTQ2LDEzICsyMzIsMTMgQEAKIAogICAgIHVldmVudF9saXN0ZW5lcl8uUmVnZW5lcmF0ZVVldmVudHNGb3JQYXRoKHN5c3BhdGgsIHVldmVudF9jYWxsYmFjayk7CiAgICAgaWYgKCFmb3VuZCkgewotICAgICAgICBMT0coSU5GTykgPDwgImRtIGRldmljZSAnIiA8PCBkZXZpY2UgPDwgIicgbm90IGZvdW5kIGluIC9zeXMsIHdhaXRpbmcgZm9yIGl0cyB1ZXZlbnQiOworICAgICAgICBMT0coSU5GTykgPDwgImRldmljZSAnIiA8PCBkZXZpY2VfbmFtZSA8PCAiJyBub3QgZm91bmQgaW4gL3N5cywgd2FpdGluZyBmb3IgaXRzIHVldmVudCI7CiAgICAgICAgIFRpbWVyIHQ7CiAgICAgICAgIHVldmVudF9saXN0ZW5lcl8uUG9sbCh1ZXZlbnRfY2FsbGJhY2ssIDEwcyk7Ci0gICAgICAgIExPRyhJTkZPKSA8PCAid2FpdCBmb3IgZG0gZGV2aWNlICciIDw8IGRldmljZSA8PCAiJyByZXR1cm5lZCBhZnRlciAiIDw8IHQ7CisgICAgICAgIExPRyhJTkZPKSA8PCAid2FpdCBmb3IgZGV2aWNlICciIDw8IGRldmljZV9uYW1lIDw8ICInIHJldHVybmVkIGFmdGVyICIgPDwgdDsKICAgICB9CiAgICAgaWYgKCFmb3VuZCkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJkbSBkZXZpY2UgJyIgPDwgZGV2aWNlIDw8ICInIG5vdCBmb3VuZCBhZnRlciBwb2xsaW5nIHRpbWVvdXQiOworICAgICAgICBMT0coRVJST1IpIDw8ICJkZXZpY2UgJyIgPDwgZGV2aWNlX25hbWUgPDwgIicgbm90IGZvdW5kIGFmdGVyIHBvbGxpbmcgdGltZW91dCI7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9pbml0L2Jsb2NrX2Rldl9pbml0aWFsaXplci5oIGIvaW5pdC9ibG9ja19kZXZfaW5pdGlhbGl6ZXIuaAppbmRleCBlYzM5Y2UwLi4yNTEwN2M5IDEwMDY0NAotLS0gYS9pbml0L2Jsb2NrX2Rldl9pbml0aWFsaXplci5oCisrKyBiL2luaXQvYmxvY2tfZGV2X2luaXRpYWxpemVyLmgKQEAgLTI0LDE5ICsyNCwyNCBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGluaXQgewogCisvLyBUT0RPOiBzaG91bGQgdGhpcyBiZSByZW5hbWVkIHRvIEZpcnN0U3RhZ2VEZXZJbml0aWFsaXplPwogY2xhc3MgQmxvY2tEZXZJbml0aWFsaXplciBmaW5hbCB7CiAgIHB1YmxpYzoKICAgICBCbG9ja0RldkluaXRpYWxpemVyKCk7CiAKKyAgICBib29sIEluaXRCb290RGV2aWNlc0Zyb21QYXJ0VXVpZCgpOwogICAgIGJvb2wgSW5pdERldmljZU1hcHBlcigpOwogICAgIGJvb2wgSW5pdERtVXNlcihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSk7CiAgICAgYm9vbCBJbml0RGV2aWNlcyhzdGQ6OnNldDxzdGQ6OnN0cmluZz4gZGV2aWNlcyk7CiAgICAgYm9vbCBJbml0RG1EZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZSk7CisgICAgYm9vbCBJbml0UGxhdGZvcm1EZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZSk7CisgICAgYm9vbCBJbml0SHZjRGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2UpOwogCiAgIHByaXZhdGU6CiAgICAgTGlzdGVuZXJBY3Rpb24gSGFuZGxlVWV2ZW50KGNvbnN0IFVldmVudCYgdWV2ZW50LCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4qIGRldmljZXMpOwogCiAgICAgYm9vbCBJbml0TWlzY0RldmljZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSk7CisgICAgYm9vbCBJbml0RGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzeXNwYXRoLCBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlKTsKIAogICAgIHN0ZDo6dW5pcXVlX3B0cjxEZXZpY2VIYW5kbGVyPiBkZXZpY2VfaGFuZGxlcl87CiAgICAgVWV2ZW50TGlzdGVuZXIgdWV2ZW50X2xpc3RlbmVyXzsKZGlmZiAtLWdpdCBhL2luaXQvYnVpbHRpbnMuY3BwIGIvaW5pdC9idWlsdGlucy5jcHAKaW5kZXggYmMyMzk3Mi4uYzRhZjViNSAxMDA2NDQKLS0tIGEvaW5pdC9idWlsdGlucy5jcHAKKysrIGIvaW5pdC9idWlsdGlucy5jcHAKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvc3dhcC5oPgogI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CiAjaW5jbHVkZSA8c3lzL3N5c3RlbV9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KQEAgLTQ2LDcgKzQ3LDYgQEAKICNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8bWVtb3J5PgogCi0jaW5jbHVkZSA8SW5pdFByb3BlcnRpZXMuc3lzcHJvcC5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9jaHJvbm9fdXRpbHMuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CkBAIC02MCw2ICs2MCw4IEBACiAjaW5jbHVkZSA8Y3V0aWxzL2FuZHJvaWRfcmVib290Lmg+CiAjaW5jbHVkZSA8ZnNfbWdyLmg+CiAjaW5jbHVkZSA8ZnNjcnlwdC9mc2NyeXB0Lmg+CisjaW5jbHVkZSA8bGliZG0vZG0uaD4KKyNpbmNsdWRlIDxsaWJkbS9sb29wX2NvbnRyb2wuaD4KICNpbmNsdWRlIDxsaWJnc2kvbGliZ3NpLmg+CiAjaW5jbHVkZSA8bG9nd3JhcC9sb2d3cmFwLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CkBAIC00NzMsOCArNDc1LDYgQEAKICAgICB7IDAsICAgICAgICAgICAgMCB9LAogfTsKIAotI2RlZmluZSBEQVRBX01OVF9QT0lOVCAiL2RhdGEiCi0KIC8qIG1vdW50IDx0eXBlPiA8ZGV2aWNlPiA8cGF0aD4gPGZsYWdzIC4uLj4gPG9wdGlvbnM+ICovCiBzdGF0aWMgUmVzdWx0PHZvaWQ+IGRvX21vdW50KGNvbnN0IEJ1aWx0aW5Bcmd1bWVudHMmIGFyZ3MpIHsKICAgICBjb25zdCBjaGFyKiBvcHRpb25zID0gbnVsbHB0cjsKQEAgLTUwNiwyOSArNTA2LDI5IEBACiAKICAgICBpZiAoYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aChzb3VyY2UsICJsb29wQCIpKSB7CiAgICAgICAgIGludCBtb2RlID0gKGZsYWdzICYgTVNfUkRPTkxZKSA/IE9fUkRPTkxZIDogT19SRFdSOwotICAgICAgICB1bmlxdWVfZmQgZmQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oc291cmNlICsgNSwgbW9kZSB8IE9fQ0xPRVhFQykpKTsKLSAgICAgICAgaWYgKGZkIDwgMCkgcmV0dXJuIEVycm5vRXJyb3IoKSA8PCAib3BlbigiIDw8IHNvdXJjZSArIDUgPDwgIiwgIiA8PCBtb2RlIDw8ICIpIGZhaWxlZCI7CisgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVfcGF0aCA9IHNvdXJjZSArIHN0cmxlbigibG9vcEAiKTsKIAotICAgICAgICBmb3IgKHNpemVfdCBuID0gMDs7IG4rKykgewotICAgICAgICAgICAgc3RkOjpzdHJpbmcgdG1wID0gYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKCIvZGV2L2Jsb2NrL2xvb3AlenUiLCBuKTsKLSAgICAgICAgICAgIHVuaXF1ZV9mZCBsb29wKFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKHRtcC5jX3N0cigpLCBtb2RlIHwgT19DTE9FWEVDKSkpOwotICAgICAgICAgICAgaWYgKGxvb3AgPCAwKSByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJvcGVuKCIgPDwgdG1wIDw8ICIsICIgPDwgbW9kZSA8PCAiKSBmYWlsZWQiOwotCi0gICAgICAgICAgICBsb29wX2luZm8gaW5mbzsKLSAgICAgICAgICAgIC8qIGlmIGl0IGlzIGEgYmxhbmsgbG9vcCBkZXZpY2UgKi8KLSAgICAgICAgICAgIGlmIChpb2N0bChsb29wLmdldCgpLCBMT09QX0dFVF9TVEFUVVMsICZpbmZvKSA8IDAgJiYgZXJybm8gPT0gRU5YSU8pIHsKLSAgICAgICAgICAgICAgICAvKiBpZiBpdCBiZWNvbWVzIG91ciBsb29wIGRldmljZSAqLwotICAgICAgICAgICAgICAgIGlmIChpb2N0bChsb29wLmdldCgpLCBMT09QX1NFVF9GRCwgZmQuZ2V0KCkpID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vdW50KHRtcC5jX3N0cigpLCB0YXJnZXQsIHN5c3RlbSwgZmxhZ3MsIG9wdGlvbnMpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW9jdGwobG9vcC5nZXQoKSwgTE9PUF9DTFJfRkQsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVycm5vRXJyb3IoKSA8PCAibW91bnQoKSBmYWlsZWQiOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB7fTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgIC8vIE9wZW4gc291cmNlIGZpbGUKKyAgICAgICAgaWYgKHdhaXQpIHsKKyAgICAgICAgICAgIHdhaXRfZm9yX2ZpbGUoZmlsZV9wYXRoLCBrQ29tbWFuZFJldHJ5VGltZW91dCk7CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAib3V0IG9mIGxvb3BiYWNrIGRldmljZXMiOworICAgICAgICB1bmlxdWVfZmQgZmQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oZmlsZV9wYXRoLCBtb2RlIHwgT19DTE9FWEVDKSkpOworICAgICAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJvcGVuKCIgPDwgZmlsZV9wYXRoIDw8ICIsICIgPDwgbW9kZSA8PCAiKSBmYWlsZWQiOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWxsb2NhdGUgbG9vcCBkZXZpY2UgYW5kIGF0dGFjaCBpdCB0byBmaWxlX3BhdGguCisgICAgICAgIGFuZHJvaWQ6OmRtOjpMb29wQ29udHJvbCBsb29wX2NvbnRyb2w7CisgICAgICAgIHN0ZDo6c3RyaW5nIGxvb3BfZGV2aWNlOworICAgICAgICBpZiAoIWxvb3BfY29udHJvbC5BdHRhY2goZmQuZ2V0KCksIDVzLCAmbG9vcF9kZXZpY2UpKSB7CisgICAgICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJsb29wX2NvbnRyb2wuQXR0YWNoICIgPDwgZmlsZV9wYXRoIDw8ICIgZmFpbGVkIjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtb3VudChsb29wX2RldmljZS5jX3N0cigpLCB0YXJnZXQsIHN5c3RlbSwgZmxhZ3MsIG9wdGlvbnMpIDwgMCkgeworICAgICAgICAgICAgbG9vcF9jb250cm9sLkRldGFjaChsb29wX2RldmljZSk7CisgICAgICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJtb3VudCgpIGZhaWxlZCI7CisgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBpZiAod2FpdCkKICAgICAgICAgICAgIHdhaXRfZm9yX2ZpbGUoc291cmNlLCBrQ29tbWFuZFJldHJ5VGltZW91dCk7CkBAIC01NzUsNyArNTc1LDcgQEAKICAqCiAgKiByZXR1cm4gY29kZSBpcyBwcm9jZXNzZWQgYmFzZWQgb24gaW5wdXQgY29kZQogICovCi1zdGF0aWMgUmVzdWx0PHZvaWQ+IHF1ZXVlX2ZzX2V2ZW50KGludCBjb2RlLCBib29sIHVzZXJkYXRhX3JlbW91bnQpIHsKK3N0YXRpYyBSZXN1bHQ8dm9pZD4gcXVldWVfZnNfZXZlbnQoaW50IGNvZGUpIHsKICAgICBpZiAoY29kZSA9PSBGU19NR1JfTU5UQUxMX0RFVl9OT1RfRU5DUllQVEFCTEUpIHsKICAgICAgICAgU2V0UHJvcGVydHkoInJvLmNyeXB0by5zdGF0ZSIsICJ1bnN1cHBvcnRlZCIpOwogICAgICAgICBBY3Rpb25NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLlF1ZXVlRXZlbnRUcmlnZ2VyKCJub25lbmNyeXB0ZWQiKTsKQEAgLTU4OSwzMCArNTg5LDkgQEAKICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG9wdGlvbnMgPSB7Ii0td2lwZV9kYXRhIiwgIi0tcmVhc29uPWZzX21ncl9tb3VudF9hbGwiIH07CiAgICAgICAgIHJldHVybiByZWJvb3RfaW50b19yZWNvdmVyeShvcHRpb25zKTsKICAgICAgICAgLyogSWYgcmVib290IHdvcmtlZCwgdGhlcmUgaXMgbm8gcmV0dXJuLiAqLwotICAgIH0gZWxzZSBpZiAoY29kZSA9PSBGU19NR1JfTU5UQUxMX0RFVl9GSUxFX0VOQ1JZUFRFRCkgewotICAgICAgICBpZiAoIUZzY3J5cHRJbnN0YWxsS2V5cmluZygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiRnNjcnlwdEluc3RhbGxLZXlyaW5nKCkgZmFpbGVkIjsKLSAgICAgICAgfQotICAgICAgICBTZXRQcm9wZXJ0eSgicm8uY3J5cHRvLnN0YXRlIiwgImVuY3J5cHRlZCIpOwotCi0gICAgICAgIC8vIEFsdGhvdWdoIGVuY3J5cHRlZCwgd2UgaGF2ZSBkZXZpY2Uga2V5LCBzbyB3ZSBkbyBub3QgbmVlZCB0bwotICAgICAgICAvLyBkbyBhbnl0aGluZyBkaWZmZXJlbnQgZnJvbSB0aGUgbm9uZW5jcnlwdGVkIGNhc2UuCi0gICAgICAgIEFjdGlvbk1hbmFnZXI6OkdldEluc3RhbmNlKCkuUXVldWVFdmVudFRyaWdnZXIoIm5vbmVuY3J5cHRlZCIpOwotICAgICAgICByZXR1cm4ge307Ci0gICAgfSBlbHNlIGlmIChjb2RlID09IEZTX01HUl9NTlRBTExfREVWX0lTX01FVEFEQVRBX0VOQ1JZUFRFRCkgewotICAgICAgICBpZiAoIUZzY3J5cHRJbnN0YWxsS2V5cmluZygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiRnNjcnlwdEluc3RhbGxLZXlyaW5nKCkgZmFpbGVkIjsKLSAgICAgICAgfQotICAgICAgICBTZXRQcm9wZXJ0eSgicm8uY3J5cHRvLnN0YXRlIiwgImVuY3J5cHRlZCIpOwotCi0gICAgICAgIC8vIEFsdGhvdWdoIGVuY3J5cHRlZCwgdm9sZCBoYXMgYWxyZWFkeSBzZXQgdGhlIGRldmljZSB1cCwgc28gd2UgZG8gbm90IG5lZWQgdG8KLSAgICAgICAgLy8gZG8gYW55dGhpbmcgZGlmZmVyZW50IGZyb20gdGhlIG5vbmVuY3J5cHRlZCBjYXNlLgotICAgICAgICBBY3Rpb25NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLlF1ZXVlRXZlbnRUcmlnZ2VyKCJub25lbmNyeXB0ZWQiKTsKLSAgICAgICAgcmV0dXJuIHt9OwotICAgIH0gZWxzZSBpZiAoY29kZSA9PSBGU19NR1JfTU5UQUxMX0RFVl9ORUVEU19NRVRBREFUQV9FTkNSWVBUSU9OKSB7Ci0gICAgICAgIGlmICghRnNjcnlwdEluc3RhbGxLZXlyaW5nKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJGc2NyeXB0SW5zdGFsbEtleXJpbmcoKSBmYWlsZWQiOwotICAgICAgICB9CisgICAgfSBlbHNlIGlmIChjb2RlID09IEZTX01HUl9NTlRBTExfREVWX0ZJTEVfRU5DUllQVEVEIHx8CisgICAgICAgICAgICAgICBjb2RlID09IEZTX01HUl9NTlRBTExfREVWX0lTX01FVEFEQVRBX0VOQ1JZUFRFRCB8fAorICAgICAgICAgICAgICAgY29kZSA9PSBGU19NR1JfTU5UQUxMX0RFVl9ORUVEU19NRVRBREFUQV9FTkNSWVBUSU9OKSB7CiAgICAgICAgIFNldFByb3BlcnR5KCJyby5jcnlwdG8uc3RhdGUiLCAiZW5jcnlwdGVkIik7CiAKICAgICAgICAgLy8gQWx0aG91Z2ggZW5jcnlwdGVkLCB2b2xkIGhhcyBhbHJlYWR5IHNldCB0aGUgZGV2aWNlIHVwLCBzbyB3ZSBkbyBub3QgbmVlZCB0bwpAQCAtNjI3LDggKzYwNiw2IEBACiAgICAgcmV0dXJuIEVycm9yKCkgPDwgIkludmFsaWQgY29kZTogIiA8PCBjb2RlOwogfQogCi1zdGF0aWMgaW50IGluaXRpYWxfbW91bnRfZnN0YWJfcmV0dXJuX2NvZGUgPSAtMTsKLQogLyogPD0gUTogbW91bnRfYWxsIDxmc3RhYj4gWyA8cGF0aD4gXSogWy0tPG9wdGlvbnM+XSoKICAqID49IFI6IG1vdW50X2FsbCBbIDxmc3RhYj4gXSBbLS08b3B0aW9ucz5dKgogICoKQEAgLTY2OSwxOSArNjQ2LDEwIEBACiAgICAgICAgIGltcG9ydF9sYXRlKG1vdW50X2FsbC0+cmNfcGF0aHMpOwogICAgIH0KIAotICAgIGlmIChtb3VudF9mc3RhYl9yZXN1bHQudXNlcmRhdGFfbW91bnRlZCkgewotICAgICAgICAvLyBUaGlzIGNhbGwgdG8gZnNfbWdyX21vdW50X2FsbCBtb3VudGVkIHVzZXJkYXRhLiBLZWVwIHRoZSByZXN1bHQgaW4KLSAgICAgICAgLy8gb3JkZXIgZm9yIHVzZXJzcGFjZSByZWJvb3QgdG8gY29ycmVjdGx5IHJlbW91bnQgdXNlcmRhdGEuCi0gICAgICAgIExPRyhJTkZPKSA8PCAiVXNlcmRhdGEgbW91bnRlZCB1c2luZyAiCi0gICAgICAgICAgICAgICAgICA8PCAobW91bnRfYWxsLT5mc3RhYl9wYXRoLmVtcHR5KCkgPyAiKGRlZmF1bHQgZnN0YWIpIiA6IG1vdW50X2FsbC0+ZnN0YWJfcGF0aCkKLSAgICAgICAgICAgICAgICAgIDw8ICIgcmVzdWx0IDogIiA8PCBtb3VudF9mc3RhYl9yZXN1bHQuY29kZTsKLSAgICAgICAgaW5pdGlhbF9tb3VudF9mc3RhYl9yZXR1cm5fY29kZSA9IG1vdW50X2ZzdGFiX3Jlc3VsdC5jb2RlOwotICAgIH0KLQogICAgIGlmIChxdWV1ZV9ldmVudCkgewogICAgICAgICAvKiBxdWV1ZV9mc19ldmVudCB3aWxsIHF1ZXVlIGV2ZW50IGJhc2VkIG9uIG1vdW50X2ZzdGFiIHJldHVybiBjb2RlCiAgICAgICAgICAqIGFuZCByZXR1cm4gcHJvY2Vzc2VkIHJldHVybiBjb2RlKi8KLSAgICAgICAgYXV0byBxdWV1ZV9mc19yZXN1bHQgPSBxdWV1ZV9mc19ldmVudChtb3VudF9mc3RhYl9yZXN1bHQuY29kZSwgZmFsc2UpOworICAgICAgICBhdXRvIHF1ZXVlX2ZzX3Jlc3VsdCA9IHF1ZXVlX2ZzX2V2ZW50KG1vdW50X2ZzdGFiX3Jlc3VsdCk7CiAgICAgICAgIGlmICghcXVldWVfZnNfcmVzdWx0Lm9rKCkpIHsKICAgICAgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJxdWV1ZV9mc19ldmVudCgpIGZhaWxlZDogIiA8PCBxdWV1ZV9mc19yZXN1bHQuZXJyb3IoKTsKICAgICAgICAgfQpAQCAtNzYyLDYgKzczMCw3IEBACiBzdGF0aWMgUmVzdWx0PHZvaWQ+IGRvX3N0YXJ0KGNvbnN0IEJ1aWx0aW5Bcmd1bWVudHMmIGFyZ3MpIHsKICAgICBTZXJ2aWNlKiBzdmMgPSBTZXJ2aWNlTGlzdDo6R2V0SW5zdGFuY2UoKS5GaW5kU2VydmljZShhcmdzWzFdKTsKICAgICBpZiAoIXN2YykgcmV0dXJuIEVycm9yKCkgPDwgInNlcnZpY2UgIiA8PCBhcmdzWzFdIDw8ICIgbm90IGZvdW5kIjsKKyAgICBlcnJubyA9IDA7CiAgICAgaWYgKGF1dG8gcmVzdWx0ID0gc3ZjLT5TdGFydCgpOyAhcmVzdWx0Lm9rKCkpIHsKICAgICAgICAgcmV0dXJuIEVycm9ySWdub3JlRW5vZW50KCkgPDwgIkNvdWxkIG5vdCBzdGFydCBzZXJ2aWNlOiAiIDw8IHJlc3VsdC5lcnJvcigpOwogICAgIH0KQEAgLTExNjgsMjkgKzExMzcsMTkgQEAKIH0KIAogc3RhdGljIFJlc3VsdDx2b2lkPiBFeGVjVmRjUmVib290T25GYWlsdXJlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2ZGNfYXJnKSB7Ci0gICAgYm9vbCBzaG91bGRfcmVib290X2ludG9fcmVjb3ZlcnkgPSB0cnVlOwogICAgIGF1dG8gcmVib290X3JlYXNvbiA9IHZkY19hcmcgKyAiX2ZhaWxlZCI7Ci0gICAgaWYgKGFuZHJvaWQ6OnN5c3Byb3A6OkluaXRQcm9wZXJ0aWVzOjp1c2Vyc3BhY2VfcmVib290X2luX3Byb2dyZXNzKCkudmFsdWVfb3IoZmFsc2UpKSB7Ci0gICAgICAgIHNob3VsZF9yZWJvb3RfaW50b19yZWNvdmVyeSA9IGZhbHNlOwotICAgICAgICByZWJvb3RfcmVhc29uID0gInVzZXJzcGFjZV9mYWlsZWQsIiArIHZkY19hcmc7Ci0gICAgfQogCi0gICAgYXV0byByZWJvb3QgPSBbcmVib290X3JlYXNvbiwgc2hvdWxkX3JlYm9vdF9pbnRvX3JlY292ZXJ5XShjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgeworICAgIGF1dG8gcmVib290ID0gW3JlYm9vdF9yZWFzb25dKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7CiAgICAgICAgIC8vIFRPRE8gKGIvMTIyODUwMTIyKTogc3VwcG9ydCB0aGlzIGluIGdzaQotICAgICAgICBpZiAoc2hvdWxkX3JlYm9vdF9pbnRvX3JlY292ZXJ5KSB7Ci0gICAgICAgICAgICBpZiAoSXNGYmVFbmFibGVkKCkgJiYgIWFuZHJvaWQ6OmdzaTo6SXNHc2lSdW5uaW5nKCkpIHsKLSAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8IG1lc3NhZ2UgPDwgIjogUmVib290aW5nIGludG8gcmVjb3ZlcnksIHJlYXNvbjogIiA8PCByZWJvb3RfcmVhc29uOwotICAgICAgICAgICAgICAgIGlmIChhdXRvIHJlc3VsdCA9IHJlYm9vdF9pbnRvX3JlY292ZXJ5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiLS1wcm9tcHRfYW5kX3dpcGVfZGF0YSIsICItLXJlYXNvbj0icyArIHJlYm9vdF9yZWFzb259KTsKLSAgICAgICAgICAgICAgICAgICAgIXJlc3VsdC5vaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExPRyhGQVRBTCkgPDwgIkNvdWxkIG5vdCByZWJvb3QgaW50byByZWNvdmVyeTogIiA8PCByZXN1bHQuZXJyb3IoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWx1cmUgKHJlYm9vdCBzdXBwcmVzc2VkKTogIiA8PCByZWJvb3RfcmVhc29uOworICAgICAgICBpZiAoSXNGYmVFbmFibGVkKCkgJiYgIWFuZHJvaWQ6OmdzaTo6SXNHc2lSdW5uaW5nKCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgbWVzc2FnZSA8PCAiOiBSZWJvb3RpbmcgaW50byByZWNvdmVyeSwgcmVhc29uOiAiIDw8IHJlYm9vdF9yZWFzb247CisgICAgICAgICAgICBpZiAoYXV0byByZXN1bHQgPSByZWJvb3RfaW50b19yZWNvdmVyeSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHsiLS1wcm9tcHRfYW5kX3dpcGVfZGF0YSIsICItLXJlYXNvbj0icyArIHJlYm9vdF9yZWFzb259KTsKKyAgICAgICAgICAgICAgICAhcmVzdWx0Lm9rKCkpIHsKKyAgICAgICAgICAgICAgICBMT0coRkFUQUwpIDw8ICJDb3VsZCBub3QgcmVib290IGludG8gcmVjb3Zlcnk6ICIgPDwgcmVzdWx0LmVycm9yKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8IG1lc3NhZ2UgPDwgIjogcmVib290aW5nLCByZWFzb246ICIgPDwgcmVib290X3JlYXNvbjsKLSAgICAgICAgICAgIHRyaWdnZXJfc2h1dGRvd24oInJlYm9vdCwiICsgcmVib290X3JlYXNvbik7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsdXJlIChyZWJvb3Qgc3VwcHJlc3NlZCk6ICIgPDwgcmVib290X3JlYXNvbjsKICAgICAgICAgfQogICAgIH07CiAKQEAgLTExOTgsMjkgKzExNTcsNiBAQAogICAgIHJldHVybiBFeGVjV2l0aEZ1bmN0aW9uT25GYWlsdXJlKGFyZ3MsIHJlYm9vdCk7CiB9CiAKLXN0YXRpYyBSZXN1bHQ8dm9pZD4gZG9fcmVtb3VudF91c2VyZGF0YShjb25zdCBCdWlsdGluQXJndW1lbnRzJiBhcmdzKSB7Ci0gICAgaWYgKGluaXRpYWxfbW91bnRfZnN0YWJfcmV0dXJuX2NvZGUgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgIkNhbGxpbmcgcmVtb3VudF91c2VyZGF0YSB0b28gZWFybHkiOwotICAgIH0KLSAgICBGc3RhYiBmc3RhYjsKLSAgICBpZiAoIVJlYWREZWZhdWx0RnN0YWIoJmZzdGFiKSkgewotICAgICAgICAvLyBUT0RPKGIvMTM1OTg0Njc0KTogc2hvdWxkIHdlIHJlYm9vdCBoZXJlPwotICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiRmFpbGVkIHRvIHJlYWQgZnN0YWIiOwotICAgIH0KLSAgICAvLyBUT0RPKGIvMTM1OTg0Njc0KTogY2hlY2sgdGhhdCBmc3RhYiBjb250YWlucyAvZGF0YS4KLSAgICBpZiAoYXV0byByYyA9IGZzX21ncl9yZW1vdW50X3VzZXJkYXRhX2ludG9fY2hlY2twb2ludGluZygmZnN0YWIpOyByYyA8IDApIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgcHJvY19tb3VudHNfb3V0cHV0OwotICAgICAgICBhbmRyb2lkOjpiYXNlOjpSZWFkRmlsZVRvU3RyaW5nKCIvcHJvYy9tb3VudHMiLCAmcHJvY19tb3VudHNfb3V0cHV0LCB0cnVlKTsKLSAgICAgICAgYW5kcm9pZDo6YmFzZTo6V3JpdGVTdHJpbmdUb0ZpbGUocHJvY19tb3VudHNfb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL21ldGFkYXRhL3VzZXJzcGFjZXJlYm9vdC9tb3VudF9pbmZvLnR4dCIpOwotICAgICAgICB0cmlnZ2VyX3NodXRkb3duKCJyZWJvb3QsbW91bnRfdXNlcmRhdGFfZmFpbGVkIik7Ci0gICAgfQotICAgIGlmIChhdXRvIHJlc3VsdCA9IHF1ZXVlX2ZzX2V2ZW50KGluaXRpYWxfbW91bnRfZnN0YWJfcmV0dXJuX2NvZGUsIHRydWUpOyAhcmVzdWx0Lm9rKCkpIHsKLSAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgInF1ZXVlX2ZzX2V2ZW50KCkgZmFpbGVkOiAiIDw8IHJlc3VsdC5lcnJvcigpOwotICAgIH0KLSAgICByZXR1cm4ge307Ci19Ci0KIHN0YXRpYyBSZXN1bHQ8dm9pZD4gZG9faW5zdGFsbGtleShjb25zdCBCdWlsdGluQXJndW1lbnRzJiBhcmdzKSB7CiAgICAgaWYgKCFpc19maWxlX2NyeXB0bygpKSByZXR1cm4ge307CiAKQEAgLTEyMzYsOCArMTE3Miw3IEBACiB9CiAKIHN0YXRpYyBSZXN1bHQ8dm9pZD4gZG9fbWFya19wb3N0X2RhdGEoY29uc3QgQnVpbHRpbkFyZ3VtZW50cyYgYXJncykgewotICAgIFNlcnZpY2VMaXN0OjpHZXRJbnN0YW5jZSgpLk1hcmtQb3N0RGF0YSgpOwotCisgICAgTE9HKElORk8pIDw8ICJkZXByZWNhdGVkIGFjdGlvbiBgbWFya19wb3N0X2RhdGFgIGNhbGxlZC4iOwogICAgIHJldHVybiB7fTsKIH0KIApAQCAtMTI4NSwzNyArMTIyMCwzMyBAQAogLyoKICAqIENyZWF0ZXMgYSBkaXJlY3RvcnkgdW5kZXIgL2RhdGEvbWlzYy9hcGV4ZGF0YS8gZm9yIGVhY2ggQVBFWC4KICAqLwotc3RhdGljIFJlc3VsdDx2b2lkPiBjcmVhdGVfYXBleF9kYXRhX2RpcnMoKSB7Ci0gICAgYXV0byBkaXJwID0gc3RkOjp1bmlxdWVfcHRyPERJUiwgaW50ICgqKShESVIqKT4ob3BlbmRpcigiL2FwZXgiKSwgY2xvc2VkaXIpOwotICAgIGlmICghZGlycCkgewotICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJVbmFibGUgdG8gb3BlbiBhcGV4IGRpcmVjdG9yeSI7Ci0gICAgfQotICAgIHN0cnVjdCBkaXJlbnQqIGVudHJ5OwotICAgIHdoaWxlICgoZW50cnkgPSByZWFkZGlyKGRpcnAuZ2V0KCkpKSAhPSBudWxscHRyKSB7Ci0gICAgICAgIGlmIChlbnRyeS0+ZF90eXBlICE9IERUX0RJUikgY29udGludWU7Ci0KLSAgICAgICAgY29uc3QgY2hhciogbmFtZSA9IGVudHJ5LT5kX25hbWU7Ci0gICAgICAgIC8vIHNraXAgYW55IHN0YXJ0aW5nIHdpdGggIi4iCi0gICAgICAgIGlmIChuYW1lWzBdID09ICcuJykgY29udGludWU7Ci0KLSAgICAgICAgaWYgKHN0cmNocihuYW1lLCAnQCcpICE9IG51bGxwdHIpIGNvbnRpbnVlOwotCi0gICAgICAgIGF1dG8gcGF0aCA9ICIvZGF0YS9taXNjL2FwZXhkYXRhLyIgKyBzdGQ6OnN0cmluZyhuYW1lKTsKK3N0YXRpYyB2b2lkIGNyZWF0ZV9hcGV4X2RhdGFfZGlycygpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIG5hbWUgOiBHZXRBcGV4TGlzdEZyb20oIi9hcGV4IikpIHsKKyAgICAgICAgYXV0byBwYXRoID0gIi9kYXRhL21pc2MvYXBleGRhdGEvIiArIG5hbWU7CiAgICAgICAgIGF1dG8gb3B0aW9ucyA9IE1rZGlyT3B0aW9uc3twYXRoLCAwNzcxLCBBSURfUk9PVCwgQUlEX1NZU1RFTSwgRnNjcnlwdEFjdGlvbjo6a05vbmUsICJyZWYifTsKLSAgICAgICAgbWFrZV9kaXJfd2l0aF9vcHRpb25zKG9wdGlvbnMpOworICAgICAgICBhdXRvIHJlc3VsdCA9IG1ha2VfZGlyX3dpdGhfb3B0aW9ucyhvcHRpb25zKTsKKyAgICAgICAgaWYgKCFyZXN1bHQub2soKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCByZXN1bHQuZXJyb3IoKTsKKyAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4ge307CiB9CiAKIHN0YXRpYyBSZXN1bHQ8dm9pZD4gZG9fcGVyZm9ybV9hcGV4X2NvbmZpZyhjb25zdCBCdWlsdGluQXJndW1lbnRzJiBhcmdzKSB7Ci0gICAgYXV0byBjcmVhdGVfZGlycyA9IGNyZWF0ZV9hcGV4X2RhdGFfZGlycygpOwotICAgIGlmICghY3JlYXRlX2RpcnMub2soKSkgewotICAgICAgICByZXR1cm4gY3JlYXRlX2RpcnMuZXJyb3IoKTsKKyAgICBib29sIGJvb3RzdHJhcCA9IGZhbHNlOworICAgIGlmIChhcmdzLnNpemUoKSA9PSAyKSB7CisgICAgICAgIGlmIChhcmdzWzFdICE9ICItLWJvb3RzdHJhcCIpIHsKKyAgICAgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJVbmV4cGVjdGVkIGFyZ3VtZW50OiAiIDw8IGFyZ3NbMV07CisgICAgICAgIH0KKyAgICAgICAgYm9vdHN0cmFwID0gdHJ1ZTsKICAgICB9Ci0gICAgYXV0byBwYXJzZV9jb25maWdzID0gUGFyc2VBcGV4Q29uZmlncygvKmFwZXhfbmFtZT0qLyIiKTsKLSAgICBTZXJ2aWNlTGlzdDo6R2V0SW5zdGFuY2UoKS5NYXJrU2VydmljZXNVcGRhdGUoKTsKLSAgICBpZiAoIXBhcnNlX2NvbmZpZ3Mub2soKSkgewotICAgICAgICByZXR1cm4gcGFyc2VfY29uZmlncy5lcnJvcigpOworCisgICAgaWYgKCFib290c3RyYXApIHsKKyAgICAgICAgY3JlYXRlX2FwZXhfZGF0YV9kaXJzKCk7CisgICAgfQorCisgICAgYXV0byBwYXJzZV9yZXN1bHQgPSBQYXJzZVJjU2NyaXB0c0Zyb21BbGxBcGV4ZXMoYm9vdHN0cmFwKTsKKyAgICBpZiAoIXBhcnNlX3Jlc3VsdC5vaygpKSB7CisgICAgICAgIHJldHVybiBwYXJzZV9yZXN1bHQuZXJyb3IoKTsKICAgICB9CiAKICAgICBhdXRvIHVwZGF0ZV9saW5rZXJfY29uZmlnID0gZG9fdXBkYXRlX2xpbmtlcl9jb25maWcoYXJncyk7CkBAIC0xMzIzLDYgKzEyNTQsOSBAQAogICAgICAgICByZXR1cm4gdXBkYXRlX2xpbmtlcl9jb25maWcuZXJyb3IoKTsKICAgICB9CiAKKyAgICBpZiAoIWJvb3RzdHJhcCkgeworICAgICAgICBTZXJ2aWNlTGlzdDo6R2V0SW5zdGFuY2UoKS5TdGFydERlbGF5ZWRTZXJ2aWNlcygpOworICAgIH0KICAgICByZXR1cm4ge307CiB9CiAKQEAgLTEzMzcsNiArMTI3MSwxMyBAQAogICAgIHJldHVybiB7fTsKIH0KIAorc3RhdGljIFJlc3VsdDx2b2lkPiBkb19zd2Fwb2ZmKGNvbnN0IEJ1aWx0aW5Bcmd1bWVudHMmIGFyZ3MpIHsKKyAgICBpZiAoIXN3YXBvZmYoYXJnc1sxXS5jX3N0cigpKSkgeworICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJzd2Fwb2ZmKCkgZmFpbGVkIjsKKyAgICB9CisgICAgcmV0dXJuIHt9OworfQorCiAvLyBCdWlsdGluLWZ1bmN0aW9uLW1hcCBzdGFydAogY29uc3QgQnVpbHRpbkZ1bmN0aW9uTWFwJiBHZXRCdWlsdGluRnVuY3Rpb25NYXAoKSB7CiAgICAgY29uc3RleHByIHN0ZDo6c2l6ZV90IGtNYXggPSBzdGQ6Om51bWVyaWNfbGltaXRzPHN0ZDo6c2l6ZV90Pjo6bWF4KCk7CkBAIC0xMzc3LDEyICsxMzE4LDExIEBACiAgICAgICAgIC8vIG1vdW50IGFuZCB1bW91bnQgYXJlIHJ1biBpbiB0aGUgc2FtZSBjb250ZXh0IGFzIG1vdW50X2FsbCBmb3Igc3ltbWV0cnkuCiAgICAgICAgIHsibW91bnRfYWxsIiwgICAgICAgICAgICAgICB7MCwgICAgIGtNYXgsIHtmYWxzZSwgIGRvX21vdW50X2FsbH19fSwKICAgICAgICAgeyJtb3VudCIsICAgICAgICAgICAgICAgICAgIHszLCAgICAga01heCwge2ZhbHNlLCAgZG9fbW91bnR9fX0sCi0gICAgICAgIHsicGVyZm9ybV9hcGV4X2NvbmZpZyIsICAgICB7MCwgICAgIDAsICAgIHtmYWxzZSwgIGRvX3BlcmZvcm1fYXBleF9jb25maWd9fX0sCisgICAgICAgIHsicGVyZm9ybV9hcGV4X2NvbmZpZyIsICAgICB7MCwgICAgIDEsICAgIHtmYWxzZSwgIGRvX3BlcmZvcm1fYXBleF9jb25maWd9fX0sCiAgICAgICAgIHsidW1vdW50IiwgICAgICAgICAgICAgICAgICB7MSwgICAgIDEsICAgIHtmYWxzZSwgIGRvX3Vtb3VudH19fSwKICAgICAgICAgeyJ1bW91bnRfYWxsIiwgICAgICAgICAgICAgIHswLCAgICAgMSwgICAge2ZhbHNlLCAgZG9fdW1vdW50X2FsbH19fSwKICAgICAgICAgeyJ1cGRhdGVfbGlua2VyX2NvbmZpZyIsICAgIHswLCAgICAgMCwgICAge2ZhbHNlLCAgZG9fdXBkYXRlX2xpbmtlcl9jb25maWd9fX0sCiAgICAgICAgIHsicmVhZGFoZWFkIiwgICAgICAgICAgICAgICB7MSwgICAgIDIsICAgIHt0cnVlLCAgIGRvX3JlYWRhaGVhZH19fSwKLSAgICAgICAgeyJyZW1vdW50X3VzZXJkYXRhIiwgICAgICAgIHswLCAgICAgMCwgICAge2ZhbHNlLCAgZG9fcmVtb3VudF91c2VyZGF0YX19fSwKICAgICAgICAgeyJyZXN0YXJ0IiwgICAgICAgICAgICAgICAgIHsxLCAgICAgMiwgICAge2ZhbHNlLCAgZG9fcmVzdGFydH19fSwKICAgICAgICAgeyJyZXN0b3JlY29uIiwgICAgICAgICAgICAgIHsxLCAgICAga01heCwge3RydWUsICAgZG9fcmVzdG9yZWNvbn19fSwKICAgICAgICAgeyJyZXN0b3JlY29uX3JlY3Vyc2l2ZSIsICAgIHsxLCAgICAga01heCwge3RydWUsICAgZG9fcmVzdG9yZWNvbl9yZWN1cnNpdmV9fX0sCkBAIC0xMzkzLDYgKzEzMzMsNyBAQAogICAgICAgICB7InN0YXJ0IiwgICAgICAgICAgICAgICAgICAgezEsICAgICAxLCAgICB7ZmFsc2UsICBkb19zdGFydH19fSwKICAgICAgICAgeyJzdG9wIiwgICAgICAgICAgICAgICAgICAgIHsxLCAgICAgMSwgICAge2ZhbHNlLCAgZG9fc3RvcH19fSwKICAgICAgICAgeyJzd2Fwb25fYWxsIiwgICAgICAgICAgICAgIHswLCAgICAgMSwgICAge2ZhbHNlLCAgZG9fc3dhcG9uX2FsbH19fSwKKyAgICAgICAgeyJzd2Fwb2ZmIiwgICAgICAgICAgICAgICAgIHsxLCAgICAgMSwgICAge2ZhbHNlLCAgZG9fc3dhcG9mZn19fSwKICAgICAgICAgeyJlbnRlcl9kZWZhdWx0X21vdW50X25zIiwgIHswLCAgICAgMCwgICAge2ZhbHNlLCAgZG9fZW50ZXJfZGVmYXVsdF9tb3VudF9uc319fSwKICAgICAgICAgeyJzeW1saW5rIiwgICAgICAgICAgICAgICAgIHsyLCAgICAgMiwgICAge3RydWUsICAgZG9fc3ltbGlua319fSwKICAgICAgICAgeyJzeXNjbGt0eiIsICAgICAgICAgICAgICAgIHsxLCAgICAgMSwgICAge2ZhbHNlLCAgZG9fc3lzY2xrdHp9fX0sCmRpZmYgLS1naXQgYS9pbml0L2NhcGFiaWxpdGllcy5jcHAgYi9pbml0L2NhcGFiaWxpdGllcy5jcHAKaW5kZXggYWI2ZmYwMy4uMGUyY2QyYSAxMDA2NDQKLS0tIGEvaW5pdC9jYXBhYmlsaXRpZXMuY3BwCisrKyBiL2luaXQvY2FwYWJpbGl0aWVzLmNwcApAQCAtNjYsMTggKzY2LDEyIEBACiAgICAgICAgIENBUF9NQVBfRU5UUlkoV0FLRV9BTEFSTSksCiAgICAgICAgIENBUF9NQVBfRU5UUlkoQkxPQ0tfU1VTUEVORCksCiAgICAgICAgIENBUF9NQVBfRU5UUlkoQVVESVRfUkVBRCksCi0jaWYgZGVmaW5lZChfX0JJT05JQ19fKQogICAgICAgICBDQVBfTUFQX0VOVFJZKFBFUkZNT04pLAogICAgICAgICBDQVBfTUFQX0VOVFJZKEJQRiksCiAgICAgICAgIENBUF9NQVBfRU5UUlkoQ0hFQ0tQT0lOVF9SRVNUT1JFKSwKLSNlbmRpZgogfTsKIAotI2lmIGRlZmluZWQoX19CSU9OSUNfXykKIHN0YXRpY19hc3NlcnQoQ0FQX0xBU1RfQ0FQID09IENBUF9DSEVDS1BPSU5UX1JFU1RPUkUsICJDQVBfTEFTVF9DQVAgaXMgbm90IENBUF9DSEVDS1BPSU5UX1JFU1RPUkUiKTsKLSNlbHNlCi1zdGF0aWNfYXNzZXJ0KENBUF9MQVNUX0NBUCA9PSBDQVBfQVVESVRfUkVBRCwgIkNBUF9MQVNUX0NBUCBpcyBub3QgQ0FQX0FVRElUX1JFQUQiKTsKLSNlbmRpZgogCiBzdGF0aWMgYm9vbCBDb21wdXRlQ2FwQW1iaWVudFN1cHBvcnRlZCgpIHsKICNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKQpkaWZmIC0tZ2l0IGEvaW5pdC9jYXBhYmlsaXRpZXMuaCBiL2luaXQvY2FwYWJpbGl0aWVzLmgKaW5kZXggODkxZTBhYy4uZmM4MGM5OCAxMDA2NDQKLS0tIGEvaW5pdC9jYXBhYmlsaXRpZXMuaAorKysgYi9pbml0L2NhcGFiaWxpdGllcy5oCkBAIC0yMSwxNyArMjEsNiBAQAogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KIAotI2lmICFkZWZpbmVkKF9fQU5EUk9JRF9fKQotI2lmbmRlZiBDQVBfQkxPQ0tfU1VTUEVORAotI2RlZmluZSBDQVBfQkxPQ0tfU1VTUEVORCAzNgotI2VuZGlmCi0jaWZuZGVmIENBUF9BVURJVF9SRUFECi0jZGVmaW5lIENBUF9BVURJVF9SRUFEIDM3Ci0jZW5kaWYKLSN1bmRlZiBDQVBfTEFTVF9DQVAKLSNkZWZpbmUgQ0FQX0xBU1RfQ0FQIENBUF9BVURJVF9SRUFECi0jZW5kaWYKLQogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGluaXQgewogCmRpZmYgLS1naXQgYS9pbml0L2NoZWNrX2J1aWx0aW5zLmNwcCBiL2luaXQvY2hlY2tfYnVpbHRpbnMuY3BwCmluZGV4IDQ2MWVkMjIuLjk3MjU0NTggMTAwNjQ0Ci0tLSBhL2luaXQvY2hlY2tfYnVpbHRpbnMuY3BwCisrKyBiL2luaXQvY2hlY2tfYnVpbHRpbnMuY3BwCkBAIC0yOCw5ICsyOCw5IEBACiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3BhcnNlZG91YmxlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3BhcnNlaW50Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0eV9pbmZvX3BhcnNlci9wcm9wZXJ0eV9pbmZvX3BhcnNlci5oPgogCiAjaW5jbHVkZSAiYnVpbHRpbl9hcmd1bWVudHMuaCIKLSNpbmNsdWRlICJob3N0X2luaXRfdmVyaWZpZXIuaCIKICNpbmNsdWRlICJpbnRlcmZhY2VfdXRpbHMuaCIKICNpbmNsdWRlICJwcm9wZXJ0eV90eXBlLmgiCiAjaW5jbHVkZSAicmxpbWl0X3BhcnNlci5oIgpAQCAtMzksNiArMzksOSBAQAogCiB1c2luZyBhbmRyb2lkOjpiYXNlOjpQYXJzZUludDsKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGg7Cit1c2luZyBhbmRyb2lkOjpwcm9wZXJ0aWVzOjpCdWlsZFRyaWU7Cit1c2luZyBhbmRyb2lkOjpwcm9wZXJ0aWVzOjpQcm9wZXJ0eUluZm9BcmVhOwordXNpbmcgYW5kcm9pZDo6cHJvcGVydGllczo6UHJvcGVydHlJbmZvRW50cnk7CiAKICNkZWZpbmUgUmV0dXJuSWZBbnlBcmdzRW1wdHkoKSAgICAgXAogICAgIGZvciAoY29uc3QgYXV0byYgYXJnIDogYXJncykgeyBcCkBAIC01MCw2ICs1MywyNiBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGluaXQgewogCitjb25zdCBQcm9wZXJ0eUluZm9BcmVhKiBwcm9wZXJ0eV9pbmZvX2FyZWE7CisKK1Jlc3VsdDx2b2lkPiBJbml0aWFsaXplSG9zdFByb3BlcnR5SW5mb0FyZWEoY29uc3Qgc3RkOjp2ZWN0b3I8UHJvcGVydHlJbmZvRW50cnk+JiBwcm9wZXJ0eV9pbmZvcykgeworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBzZXJpYWxpemVkX2NvbnRleHRzOworICAgIHN0ZDo6c3RyaW5nIHRyaWVfZXJyb3I7CisgICAgaWYgKCFCdWlsZFRyaWUocHJvcGVydHlfaW5mb3MsICJ1Om9iamVjdF9yOmRlZmF1bHRfcHJvcDpzMCIsICJzdHJpbmciLCAmc2VyaWFsaXplZF9jb250ZXh0cywKKyAgICAgICAgICAgICAgICAgICAmdHJpZV9lcnJvcikpIHsKKyAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgIlVuYWJsZSB0byBzZXJpYWxpemUgcHJvcGVydHkgY29udGV4dHM6ICIgPDwgdHJpZV9lcnJvcjsKKyAgICB9CisKKyAgICBwcm9wZXJ0eV9pbmZvX2FyZWEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFByb3BlcnR5SW5mb0FyZWEqPihzZXJpYWxpemVkX2NvbnRleHRzLmNfc3RyKCkpOworICAgIHJldHVybiB7fTsKK30KKworc3RhdGljIFJlc3VsdDx2b2lkPiBjaGVja19zdHViKGNvbnN0IEJ1aWx0aW5Bcmd1bWVudHMmIGFyZ3MpIHsKKyAgICByZXR1cm4ge307Cit9CisKKyNpbmNsdWRlICJnZW5lcmF0ZWRfc3R1Yl9idWlsdGluX2Z1bmN0aW9uX21hcC5oIgorCiBSZXN1bHQ8dm9pZD4gY2hlY2tfY2hvd24oY29uc3QgQnVpbHRpbkFyZ3VtZW50cyYgYXJncykgewogICAgIGlmICghYXJnc1sxXS5lbXB0eSgpKSB7CiAgICAgICAgIGF1dG8gdWlkID0gRGVjb2RlVWlkKGFyZ3NbMV0pOwpkaWZmIC0tZ2l0IGEvaW5pdC9jaGVja19idWlsdGlucy5oIGIvaW5pdC9jaGVja19idWlsdGlucy5oCmluZGV4IGRjMWI3NTIuLjliMDBhN2MgMTAwNjQ0Ci0tLSBhL2luaXQvY2hlY2tfYnVpbHRpbnMuaAorKysgYi9pbml0L2NoZWNrX2J1aWx0aW5zLmgKQEAgLTE5LDYgKzE5LDEwIEBACiAjaW5jbHVkZSAiYnVpbHRpbl9hcmd1bWVudHMuaCIKICNpbmNsdWRlICJyZXN1bHQuaCIKIAorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHByb3BlcnR5X2luZm9fc2VyaWFsaXplci9wcm9wZXJ0eV9pbmZvX3NlcmlhbGl6ZXIuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGluaXQgewogCkBAIC00Myw1ICs0Nyw4IEBACiBSZXN1bHQ8dm9pZD4gY2hlY2tfd2FpdChjb25zdCBCdWlsdGluQXJndW1lbnRzJiBhcmdzKTsKIFJlc3VsdDx2b2lkPiBjaGVja193YWl0X2Zvcl9wcm9wKGNvbnN0IEJ1aWx0aW5Bcmd1bWVudHMmIGFyZ3MpOwogCitSZXN1bHQ8dm9pZD4gSW5pdGlhbGl6ZUhvc3RQcm9wZXJ0eUluZm9BcmVhKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxwcm9wZXJ0aWVzOjpQcm9wZXJ0eUluZm9FbnRyeT4mIHByb3BlcnR5X2luZm9zKTsKKwogfSAgLy8gbmFtZXNwYWNlIGluaXQKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9pbml0L2RldmljZXMuY3BwIGIvaW5pdC9kZXZpY2VzLmNwcAppbmRleCBkMjlmZmQ2Li5mYWZhNThmIDEwMDY0NAotLS0gYS9pbml0L2RldmljZXMuY3BwCisrKyBiL2luaXQvZGV2aWNlcy5jcHAKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxmaWxlc3lzdGVtPgogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3RyaW5nX3ZpZXc+CiAjaW5jbHVkZSA8dGhyZWFkPgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2Nocm9ub191dGlscy5oPgpAQCAtMzIsNiArMzMsNyBAQAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CisjaW5jbHVkZSA8ZnNfbWdyLmg+CiAjaW5jbHVkZSA8bGliZG0vZG0uaD4KICNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KICNpbmNsdWRlIDxzZWxpbnV4L2FuZHJvaWQuaD4KQEAgLTQzLDYgKzQ1LDcgQEAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKIAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6QmFzZW5hbWU7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpDb25zdW1lUHJlZml4OwogdXNpbmcgYW5kcm9pZDo6YmFzZTo6RGlybmFtZTsKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmc7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjpSZWFkbGluazsKQEAgLTE4Niw2ICsxODksNTYgQEAKICAgICB9CiB9CiAKK0Jsb2NrRGV2aWNlSW5mbyBEZXZpY2VIYW5kbGVyOjpHZXRCbG9ja0RldmljZUluZm8oY29uc3Qgc3RkOjpzdHJpbmcmIHVldmVudF9wYXRoKSBjb25zdCB7CisgICAgQmxvY2tEZXZpY2VJbmZvIGluZm87CisKKyAgICBpZiAoIWJvb3RfcGFydF91dWlkXy5lbXB0eSgpKSB7CisgICAgICAgIC8vIE9ubHkgdXNlIHRoZSBtb3JlIHNwZWNpZmljICJNTUMiIC8gIk5WTUUiIC8gIlNDU0kiIG1hdGNoIGlmIGEKKyAgICAgICAgLy8gcGFydGl0aW9uIFVVSUQgd2FzIHBhc3NlZC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gT2xkIGJvb3Rsb2FkZXJzIHRoYXQgYXJlbid0IHBhc3NpbmcgdGhlIHBhcnRpdGlvbiBVVUlEIGluc3RlYWQKKyAgICAgICAgLy8gcGFzcyB0aGUgcGF0aCB0byB0aGUgY2xvc2VzdCAicGxhdGZvcm0iIGRldmljZS4gSXQgd291bGQKKyAgICAgICAgLy8gYnJlYWsgdGhlbSBpZiB3ZSBjaG9zZSB0aGlzIGRlZXBlciAobW9yZSBzcGVjaWZpYykgcGF0aC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gV2hlbiB3ZSBoYXZlIGEgVVVJRCB3ZSBfd2FudF8gdGhlIG1vcmUgc3BlY2lmaWMgcGF0aCBzaW5jZSBpdCBjYW4KKyAgICAgICAgLy8gaGFuZGxlLCBmb3IgaW5zdGFuY2UsIGRpZmZlcmVudGlhdGluZyB0d28gVVNCIGRpc2tzIHRoYXQgYXJlIG9uCisgICAgICAgIC8vIHRoZSBzYW1lIFVTQiBjb250cm9sbGVyLiBVc2luZyB0aGUgY2xvc2VzdCBwbGF0Zm9ybSBkZXZpY2Ugd291bGQKKyAgICAgICAgLy8gY2xhc3NpZnkgdGhlbSBib3RoIHRoZSBzYW1lIGJ5IHVzaW5nIHRoZSBwYXRoIHRvIHRoZSBVU0IgY29udHJvbGxlci4KKyAgICAgICAgaWYgKEZpbmRNbWNEZXZpY2UodWV2ZW50X3BhdGgsICZpbmZvLnN0cikpIHsKKyAgICAgICAgICAgIGluZm8udHlwZSA9ICJtbWMiOworICAgICAgICB9IGVsc2UgaWYgKEZpbmROdm1lRGV2aWNlKHVldmVudF9wYXRoLCAmaW5mby5zdHIpKSB7CisgICAgICAgICAgICBpbmZvLnR5cGUgPSAibnZtZSI7CisgICAgICAgIH0gZWxzZSBpZiAoRmluZFNjc2lEZXZpY2UodWV2ZW50X3BhdGgsICZpbmZvLnN0cikpIHsKKyAgICAgICAgICAgIGluZm8udHlwZSA9ICJzY3NpIjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoRmluZFBsYXRmb3JtRGV2aWNlKHVldmVudF9wYXRoLCAmaW5mby5zdHIpKSB7CisgICAgICAgIGluZm8udHlwZSA9ICJwbGF0Zm9ybSI7CisgICAgfSBlbHNlIGlmIChGaW5kUGNpRGV2aWNlUHJlZml4KHVldmVudF9wYXRoLCAmaW5mby5zdHIpKSB7CisgICAgICAgIGluZm8udHlwZSA9ICJwY2kiOworICAgIH0gZWxzZSBpZiAoRmluZFZiZERldmljZVByZWZpeCh1ZXZlbnRfcGF0aCwgJmluZm8uc3RyKSkgeworICAgICAgICBpbmZvLnR5cGUgPSAidmJkIjsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBSZS1jbGVhciBkZXZpY2UgdG8gYmUgZXh0cmEgY2VydGFpbiBpbiBjYXNlIG9uZSBvZiB0aGUgRmluZFhYWCgpCisgICAgICAgIC8vIGZ1bmN0aW9ucyByZXR1cm5lZCBmYWxzZSBidXQgc3RpbGwgbW9kaWZpZWQgaXQuCisgICAgICAgIGluZm8uc3RyID0gIiI7CisgICAgfQorCisgICAgaW5mby5pc19ib290X2RldmljZSA9IGJvb3RfZGV2aWNlc18uZmluZChpbmZvLnN0cikgIT0gYm9vdF9kZXZpY2VzXy5lbmQoKTsKKworICAgIHJldHVybiBpbmZvOworfQorCitib29sIERldmljZUhhbmRsZXI6OklzQm9vdERldmljZVN0cmljdCgpIGNvbnN0IHsKKyAgICAvLyBXaGVuIHVzaW5nIHRoZSBuZXdlciAiYm9vdF9wYXJ0X3V1aWQiIHRvIHNwZWNpZnkgdGhlIGJvb3QgZGV2aWNlIHRoZW4KKyAgICAvLyB3ZSByZXF1aXJlIGFsbCBjb3JlIHN5c3RlbSBwYXJ0aXRpb25zIHRvIGJlIG9uIHRoZSBib290IGRldmljZS4KKyAgICByZXR1cm4gIWJvb3RfcGFydF91dWlkXy5lbXB0eSgpOworfQorCitib29sIERldmljZUhhbmRsZXI6OklzQm9vdERldmljZShjb25zdCBVZXZlbnQmIHVldmVudCkgY29uc3QgeworICAgIGF1dG8gZGV2aWNlID0gR2V0QmxvY2tEZXZpY2VJbmZvKHVldmVudC5wYXRoKTsKKyAgICByZXR1cm4gZGV2aWNlLmlzX2Jvb3RfZGV2aWNlOworfQorCiBzdGQ6OnN0cmluZyBEZXZpY2VIYW5kbGVyOjpHZXRQYXJ0aXRpb25OYW1lRm9yRGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBxdWVyeV9kZXZpY2UpIHsKICAgICBzdGF0aWMgY29uc3QgYXV0byBwYXJ0aXRpb25fbWFwID0gW10gewogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4gcGFydGl0aW9uX21hcDsKQEAgLTIwMyw4ICsyNTYsOCBAQAogICAgICAgICAgICAgICAgIHBhcnRpdGlvbl9tYXAuZW1wbGFjZV9iYWNrKG1hcF9waWVjZXNbMF0sIG1hcF9waWVjZXNbMV0pOwogICAgICAgICAgICAgfQogICAgICAgICB9OwotICAgICAgICBJbXBvcnRLZXJuZWxDbWRsaW5lKHBhcnNlcik7Ci0gICAgICAgIEltcG9ydEJvb3Rjb25maWcocGFyc2VyKTsKKyAgICAgICAgYW5kcm9pZDo6ZnNfbWdyOjpJbXBvcnRLZXJuZWxDbWRsaW5lKHBhcnNlcik7CisgICAgICAgIGFuZHJvaWQ6OmZzX21ncjo6SW1wb3J0Qm9vdGNvbmZpZyhwYXJzZXIpOwogICAgICAgICByZXR1cm4gcGFydGl0aW9uX21hcDsKICAgICB9KCk7CiAKQEAgLTIxNiwxMSArMjY5LDEyIEBACiAgICAgcmV0dXJuIHt9OwogfQogCi0vLyBHaXZlbiBhIHBhdGggdGhhdCBtYXkgc3RhcnQgd2l0aCBhIHBsYXRmb3JtIGRldmljZSwgZmluZCB0aGUgcGFyZW50IHBsYXRmb3JtIGRldmljZSBieSBmaW5kaW5nIGEKLS8vIHBhcmVudCBkaXJlY3Rvcnkgd2l0aCBhICdzdWJzeXN0ZW0nIHN5bWxpbmsgdGhhdCBwb2ludHMgdG8gdGhlIHBsYXRmb3JtIGJ1cy4KLS8vIElmIGl0IGRvZXNuJ3Qgc3RhcnQgd2l0aCBhIHBsYXRmb3JtIGRldmljZSwgcmV0dXJuIGZhbHNlCi1ib29sIERldmljZUhhbmRsZXI6OkZpbmRQbGF0Zm9ybURldmljZShzdGQ6OnN0cmluZyBwYXRoLCBzdGQ6OnN0cmluZyogcGxhdGZvcm1fZGV2aWNlX3BhdGgpIGNvbnN0IHsKLSAgICBwbGF0Zm9ybV9kZXZpY2VfcGF0aC0+Y2xlYXIoKTsKKy8vIEdpdmVuIGEgcGF0aCB0byBhIGRldmljZSB0aGF0IG1heSBoYXZlIGEgcGFyZW50IGluIHRoZSBwYXNzZWQgc2V0IG9mCisvLyBzdWJzeXN0ZW1zLCBmaW5kIHRoZSBwYXJlbnQgZGV2aWNlIHRoYXQncyBpbiB0aGUgcGFzc2VkIHNldCBvZiBzdWJzeXN0ZW1zLgorLy8gSWYgd2UgZG9uJ3QgZmluZCBhIHBhcmVudCBpbiB0aGUgcGFzc2VkIHNldCBvZiBzdWJzeXN0ZW1zLCByZXR1cm4gZmFsc2UuCitib29sIERldmljZUhhbmRsZXI6OkZpbmRTdWJzeXN0ZW1EZXZpY2Uoc3RkOjpzdHJpbmcgcGF0aCwgc3RkOjpzdHJpbmcqIGRldmljZV9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiYgc3Vic3lzdGVtX3BhdGhzKSBjb25zdCB7CisgICAgZGV2aWNlX3BhdGgtPmNsZWFyKCk7CiAKICAgICAvLyBVZXZlbnRzIGRvbid0IGNvbnRhaW4gdGhlIG1vdW50IHBvaW50LCBzbyB3ZSBuZWVkIHRvIGFkZCBpdCBoZXJlLgogICAgIHBhdGguaW5zZXJ0KDAsIHN5c2ZzX21vdW50X3BvaW50Xyk7CkBAIC0yMzAsMTEgKzI4NCwyMCBAQAogICAgIHdoaWxlIChkaXJlY3RvcnkgIT0gIi8iICYmIGRpcmVjdG9yeSAhPSAiLiIpIHsKICAgICAgICAgc3RkOjpzdHJpbmcgc3Vic3lzdGVtX2xpbmtfcGF0aDsKICAgICAgICAgaWYgKFJlYWxwYXRoKGRpcmVjdG9yeSArICIvc3Vic3lzdGVtIiwgJnN1YnN5c3RlbV9saW5rX3BhdGgpICYmCi0gICAgICAgICAgICAoc3Vic3lzdGVtX2xpbmtfcGF0aCA9PSBzeXNmc19tb3VudF9wb2ludF8gKyAiL2J1cy9wbGF0Zm9ybSIgfHwKLSAgICAgICAgICAgICBzdWJzeXN0ZW1fbGlua19wYXRoID09IHN5c2ZzX21vdW50X3BvaW50XyArICIvYnVzL2FtYmEiKSkgeworICAgICAgICAgICAgc3Vic3lzdGVtX3BhdGhzLmZpbmQoc3Vic3lzdGVtX2xpbmtfcGF0aCkgIT0gc3Vic3lzdGVtX3BhdGhzLmVuZCgpKSB7CiAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHJlbW92ZSB0aGUgbW91bnQgcG9pbnQgdGhhdCB3ZSBhZGRlZCBhYm92ZSBiZWZvcmUgcmV0dXJuaW5nLgogICAgICAgICAgICAgZGlyZWN0b3J5LmVyYXNlKDAsIHN5c2ZzX21vdW50X3BvaW50Xy5zaXplKCkpOwotICAgICAgICAgICAgKnBsYXRmb3JtX2RldmljZV9wYXRoID0gZGlyZWN0b3J5OworCisgICAgICAgICAgICAvLyBTa2lwIC9kZXZpY2VzL3BsYXRmb3JtIG9yIC9kZXZpY2VzLyBpZiBwcmVzZW50CisgICAgICAgICAgICBzdGF0aWMgY29uc3RleHByIHN0ZDo6c3RyaW5nX3ZpZXcgZGV2aWNlc19wbGF0Zm9ybV9wcmVmaXggPSAiL2RldmljZXMvcGxhdGZvcm0vIjsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgc3RkOjpzdHJpbmdfdmlldyBkZXZpY2VzX3ByZWZpeCA9ICIvZGV2aWNlcy8iOworICAgICAgICAgICAgc3RkOjpzdHJpbmdfdmlldyBzdiA9IGRpcmVjdG9yeTsKKworICAgICAgICAgICAgaWYgKCFDb25zdW1lUHJlZml4KCZzdiwgZGV2aWNlc19wbGF0Zm9ybV9wcmVmaXgpKSB7CisgICAgICAgICAgICAgICAgQ29uc3VtZVByZWZpeCgmc3YsIGRldmljZXNfcHJlZml4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpkZXZpY2VfcGF0aCA9IHN2OworCiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCkBAIC0yNDgsNiArMzExLDQwIEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCitib29sIERldmljZUhhbmRsZXI6OkZpbmRQbGF0Zm9ybURldmljZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBwbGF0Zm9ybV9kZXZpY2VfcGF0aCkgY29uc3QgeworICAgIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBzdWJzeXN0ZW1fcGF0aHMgPSB7CisgICAgICAgICAgICBzeXNmc19tb3VudF9wb2ludF8gKyAiL2J1cy9wbGF0Zm9ybSIsCisgICAgICAgICAgICBzeXNmc19tb3VudF9wb2ludF8gKyAiL2J1cy9hbWJhIiwKKyAgICB9OworCisgICAgcmV0dXJuIEZpbmRTdWJzeXN0ZW1EZXZpY2UocGF0aCwgcGxhdGZvcm1fZGV2aWNlX3BhdGgsIHN1YnN5c3RlbV9wYXRocyk7Cit9CisKK2Jvb2wgRGV2aWNlSGFuZGxlcjo6RmluZE1tY0RldmljZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgc3RkOjpzdHJpbmcqIG1tY19kZXZpY2VfcGF0aCkgY29uc3QgeworICAgIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBzdWJzeXN0ZW1fcGF0aHMgPSB7CisgICAgICAgICAgICBzeXNmc19tb3VudF9wb2ludF8gKyAiL2J1cy9tbWMiLAorICAgIH07CisKKyAgICByZXR1cm4gRmluZFN1YnN5c3RlbURldmljZShwYXRoLCBtbWNfZGV2aWNlX3BhdGgsIHN1YnN5c3RlbV9wYXRocyk7Cit9CisKK2Jvb2wgRGV2aWNlSGFuZGxlcjo6RmluZE52bWVEZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHN0ZDo6c3RyaW5nKiBudm1lX2RldmljZV9wYXRoKSBjb25zdCB7CisgICAgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHN1YnN5c3RlbV9wYXRocyA9IHsKKyAgICAgICAgICAgIHN5c2ZzX21vdW50X3BvaW50XyArICIvY2xhc3MvbnZtZSIsCisgICAgfTsKKworICAgIHJldHVybiBGaW5kU3Vic3lzdGVtRGV2aWNlKHBhdGgsIG52bWVfZGV2aWNlX3BhdGgsIHN1YnN5c3RlbV9wYXRocyk7Cit9CisKK2Jvb2wgRGV2aWNlSGFuZGxlcjo6RmluZFNjc2lEZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHN0ZDo6c3RyaW5nKiBzY3NpX2RldmljZV9wYXRoKSBjb25zdCB7CisgICAgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHN1YnN5c3RlbV9wYXRocyA9IHsKKyAgICAgICAgICAgIHN5c2ZzX21vdW50X3BvaW50XyArICIvYnVzL3Njc2kiLAorICAgIH07CisKKyAgICByZXR1cm4gRmluZFN1YnN5c3RlbURldmljZShwYXRoLCBzY3NpX2RldmljZV9wYXRoLCBzdWJzeXN0ZW1fcGF0aHMpOworfQorCiB2b2lkIERldmljZUhhbmRsZXI6OkZpeHVwU3lzUGVybWlzc2lvbnMoY29uc3Qgc3RkOjpzdHJpbmcmIHVwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJzeXN0ZW0pIGNvbnN0IHsKICAgICAvLyB1cGF0aHMgb21pdCB0aGUgIi9zeXMiIHRoYXQgcGF0aHMgaW4gdGhpcyBsaXN0CkBAIC0yODEsNyArMzc4LDcgQEAKIAogdm9pZCBEZXZpY2VIYW5kbGVyOjpNYWtlRGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBib29sIGJsb2NrLCBpbnQgbWFqb3IsIGludCBtaW5vciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGxpbmtzKSBjb25zdCB7Ci0gICAgYXV0b1ttb2RlLCB1aWQsIGdpZF0gPSBHZXREZXZpY2VQZXJtaXNzaW9ucyhwYXRoLCBsaW5rcyk7CisgICAgYXV0byBbbW9kZSwgdWlkLCBnaWRdID0gR2V0RGV2aWNlUGVybWlzc2lvbnMocGF0aCwgbGlua3MpOwogICAgIG1vZGUgfD0gKGJsb2NrID8gU19JRkJMSyA6IFNfSUZDSFIpOwogCiAgICAgc3RkOjpzdHJpbmcgc2Vjb250ZXh0OwpAQCAtMzI4LDExICs0MjUsMTEgQEAKICAgICAgICAgICAgIGlmIChnaWQgIT0gcy5zdF9naWQpIHsKICAgICAgICAgICAgICAgICBuZXdfZ3JvdXAgPSBnaWQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgIGlmIChtb2RlICE9IHMuc3RfbW9kZSkgewotICAgICAgICAgICAgaWYgKGNobW9kKHBhdGguY19zdHIoKSwgbW9kZSkgIT0gMCkgewotICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJDYW5ub3QgY2htb2QgIiA8PCBwYXRoIDw8ICIgdG8gIiA8PCBtb2RlOworICAgICAgICAgICAgaWYgKG1vZGUgIT0gcy5zdF9tb2RlKSB7CisgICAgICAgICAgICAgICAgaWYgKGNobW9kKHBhdGguY19zdHIoKSwgbW9kZSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiQ2Fubm90IGNobW9kICIgPDwgcGF0aCA8PCAiIHRvICIgPDwgbW9kZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJDYW5ub3Qgc3RhdCAiIDw8IHBhdGg7CiAgICAgICAgIH0KQEAgLTM2OSw0NCArNDY2LDMwIEBACiB9CiAKIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBEZXZpY2VIYW5kbGVyOjpHZXRCbG9ja0RldmljZVN5bWxpbmtzKGNvbnN0IFVldmVudCYgdWV2ZW50KSBjb25zdCB7Ci0gICAgc3RkOjpzdHJpbmcgZGV2aWNlOwotICAgIHN0ZDo6c3RyaW5nIHR5cGU7CisgICAgQmxvY2tEZXZpY2VJbmZvIGluZm87CiAgICAgc3RkOjpzdHJpbmcgcGFydGl0aW9uOwogICAgIHN0ZDo6c3RyaW5nIHV1aWQ7CiAKLSAgICBpZiAoRmluZFBsYXRmb3JtRGV2aWNlKHVldmVudC5wYXRoLCAmZGV2aWNlKSkgewotICAgICAgICAvLyBTa2lwIC9kZXZpY2VzL3BsYXRmb3JtIG9yIC9kZXZpY2VzLyBpZiBwcmVzZW50Ci0gICAgICAgIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBkZXZpY2VzX3BsYXRmb3JtX3ByZWZpeCA9ICIvZGV2aWNlcy9wbGF0Zm9ybS8iOwotICAgICAgICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgZGV2aWNlc19wcmVmaXggPSAiL2RldmljZXMvIjsKLQotICAgICAgICBpZiAoU3RhcnRzV2l0aChkZXZpY2UsIGRldmljZXNfcGxhdGZvcm1fcHJlZml4KSkgewotICAgICAgICAgICAgZGV2aWNlID0gZGV2aWNlLnN1YnN0cihkZXZpY2VzX3BsYXRmb3JtX3ByZWZpeC5sZW5ndGgoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoU3RhcnRzV2l0aChkZXZpY2UsIGRldmljZXNfcHJlZml4KSkgewotICAgICAgICAgICAgZGV2aWNlID0gZGV2aWNlLnN1YnN0cihkZXZpY2VzX3ByZWZpeC5sZW5ndGgoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0eXBlID0gInBsYXRmb3JtIjsKLSAgICB9IGVsc2UgaWYgKEZpbmRQY2lEZXZpY2VQcmVmaXgodWV2ZW50LnBhdGgsICZkZXZpY2UpKSB7Ci0gICAgICAgIHR5cGUgPSAicGNpIjsKLSAgICB9IGVsc2UgaWYgKEZpbmRWYmREZXZpY2VQcmVmaXgodWV2ZW50LnBhdGgsICZkZXZpY2UpKSB7Ci0gICAgICAgIHR5cGUgPSAidmJkIjsKLSAgICB9IGVsc2UgaWYgKEZpbmREbURldmljZSh1ZXZlbnQsICZwYXJ0aXRpb24sICZ1dWlkKSkgeworICAgIGlmIChGaW5kRG1EZXZpY2UodWV2ZW50LCAmcGFydGl0aW9uLCAmdXVpZCkpIHsKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN5bWxpbmtzID0geyIvZGV2L2Jsb2NrL21hcHBlci8iICsgcGFydGl0aW9ufTsKICAgICAgICAgaWYgKCF1dWlkLmVtcHR5KCkpIHsKICAgICAgICAgICAgIHN5bWxpbmtzLmVtcGxhY2VfYmFjaygiL2Rldi9ibG9jay9tYXBwZXIvYnktdXVpZC8iICsgdXVpZCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHN5bWxpbmtzOwotICAgIH0gZWxzZSB7CisgICAgfQorCisgICAgaW5mbyA9IEdldEJsb2NrRGV2aWNlSW5mbyh1ZXZlbnQucGF0aCk7CisKKyAgICBpZiAoaW5mby50eXBlLmVtcHR5KCkpIHsKICAgICAgICAgcmV0dXJuIHt9OwogICAgIH0KIAogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBsaW5rczsKIAotICAgIExPRyhWRVJCT1NFKSA8PCAiZm91bmQgIiA8PCB0eXBlIDw8ICIgZGV2aWNlICIgPDwgZGV2aWNlOworICAgIExPRyhWRVJCT1NFKSA8PCAiZm91bmQgIiA8PCBpbmZvLnR5cGUgPDwgIiBkZXZpY2UgIiA8PCBpbmZvLnN0cjsKIAotICAgIGF1dG8gbGlua19wYXRoID0gIi9kZXYvYmxvY2svIiArIHR5cGUgKyAiLyIgKyBkZXZpY2U7CisgICAgYXV0byBsaW5rX3BhdGggPSAiL2Rldi9ibG9jay8iICsgaW5mby50eXBlICsgIi8iICsgaW5mby5zdHI7CiAKLSAgICBib29sIGlzX2Jvb3RfZGV2aWNlID0gYm9vdF9kZXZpY2VzXy5maW5kKGRldmljZSkgIT0gYm9vdF9kZXZpY2VzXy5lbmQoKTsKICAgICBpZiAoIXVldmVudC5wYXJ0aXRpb25fbmFtZS5lbXB0eSgpKSB7CiAgICAgICAgIHN0ZDo6c3RyaW5nIHBhcnRpdGlvbl9uYW1lX3Nhbml0aXplZCh1ZXZlbnQucGFydGl0aW9uX25hbWUpOwogICAgICAgICBTYW5pdGl6ZVBhcnRpdGlvbk5hbWUoJnBhcnRpdGlvbl9uYW1lX3Nhbml0aXplZCk7CkBAIC00MTYsMTAgKzQ5OSwxMCBAQAogICAgICAgICB9CiAgICAgICAgIGxpbmtzLmVtcGxhY2VfYmFjayhsaW5rX3BhdGggKyAiL2J5LW5hbWUvIiArIHBhcnRpdGlvbl9uYW1lX3Nhbml0aXplZCk7CiAgICAgICAgIC8vIEFkZHMgc3ltbGluazogL2Rldi9ibG9jay9ieS1uYW1lLzxwYXJ0aXRpb25fbmFtZT4uCi0gICAgICAgIGlmIChpc19ib290X2RldmljZSkgeworICAgICAgICBpZiAoaW5mby5pc19ib290X2RldmljZSkgewogICAgICAgICAgICAgbGlua3MuZW1wbGFjZV9iYWNrKCIvZGV2L2Jsb2NrL2J5LW5hbWUvIiArIHBhcnRpdGlvbl9uYW1lX3Nhbml0aXplZCk7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGlzX2Jvb3RfZGV2aWNlKSB7CisgICAgfSBlbHNlIGlmIChpbmZvLmlzX2Jvb3RfZGV2aWNlKSB7CiAgICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYSBwYXJ0aXRpb24gbmFtZSBidXQgd2UgYXJlIGEgcGFydGl0aW9uIG9uIGEgYm9vdCBkZXZpY2UsIGNyZWF0ZSBhCiAgICAgICAgIC8vIHN5bWxpbmsgb2YgL2Rldi9ibG9jay9ieS1uYW1lLzxkZXZpY2VfbmFtZT4gZm9yIHN5bW1ldHJ5LgogICAgICAgICBsaW5rcy5lbXBsYWNlX2JhY2soIi9kZXYvYmxvY2svYnktbmFtZS8iICsgdWV2ZW50LmRldmljZV9uYW1lKTsKQEAgLTQzMyw2ICs1MTYsNyBAQAogICAgIGlmIChSZWFkRmlsZVRvU3RyaW5nKCIvc3lzL2NsYXNzL2Jsb2NrLyIgKyB1ZXZlbnQuZGV2aWNlX25hbWUgKyAiL3F1ZXVlL3pvbmVkIiwgJm1vZGVsKSAmJgogICAgICAgICAhU3RhcnRzV2l0aChtb2RlbCwgIm5vbmUiKSkgewogICAgICAgICBsaW5rcy5lbXBsYWNlX2JhY2soIi9kZXYvYmxvY2svYnktbmFtZS96b25lZF9kZXZpY2UiKTsKKyAgICAgICAgbGlua3MuZW1wbGFjZV9iYWNrKCIvZGV2L3N5cy9ibG9jay9ieS1uYW1lL3pvbmVkX2RldmljZSIpOwogICAgIH0KIAogICAgIGF1dG8gbGFzdF9zbGFzaCA9IHVldmVudC5wYXRoLnJmaW5kKCcvJyk7CkBAIC00ODEsMTEgKzU2NSwyMSBAQAogICAgIC8vIGV2ZW50LgogICAgIGlmIChhY3Rpb24gPT0gImFkZCIgfHwgKGFjdGlvbiA9PSAiY2hhbmdlIiAmJiBTdGFydHNXaXRoKGRldnBhdGgsICIvZGV2L2Jsb2NrL2RtLSIpKSkgewogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGxpbmsgOiBsaW5rcykgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgdGFyZ2V0OworICAgICAgICAgICAgaWYgKFN0YXJ0c1dpdGgobGluaywgIi9kZXYvYmxvY2svIikpIHsKKyAgICAgICAgICAgICAgICB0YXJnZXQgPSBkZXZwYXRoOworICAgICAgICAgICAgfSBlbHNlIGlmIChTdGFydHNXaXRoKGxpbmssICIvZGV2L3N5cy9ibG9jay8iKSkgeworICAgICAgICAgICAgICAgIHRhcmdldCA9ICIvc3lzL2NsYXNzL2Jsb2NrLyIgKyBCYXNlbmFtZShkZXZwYXRoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5yZWNvZ25pemVkIGxpbmsgdHlwZTogIiA8PCBsaW5rOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoIW1rZGlyX3JlY3Vyc2l2ZShEaXJuYW1lKGxpbmspLCAwNzU1KSkgewogICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIGRpcmVjdG9yeSAiIDw8IERpcm5hbWUobGluayk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChzeW1saW5rKGRldnBhdGguY19zdHIoKSwgbGluay5jX3N0cigpKSkgeworICAgICAgICAgICAgaWYgKHN5bWxpbmsodGFyZ2V0LmNfc3RyKCksIGxpbmsuY19zdHIoKSkpIHsKICAgICAgICAgICAgICAgICBpZiAoZXJybm8gIT0gRUVYSVNUKSB7CiAgICAgICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gc3ltbGluayAiIDw8IGRldnBhdGggPDwgIiB0byAiIDw8IGxpbms7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGQ6OnN0cmluZyBsaW5rX3BhdGg7CkBAIC01MTgsNyArNjEyLDcgQEAKICAgICAgICAgaWYgKCFSZWFkRmlsZVRvU3RyaW5nKGJvb3RfaWRfcGF0aCwgJmJvb3RfaWQpKSB7CiAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiQ2Fubm90IGR1cGxpY2F0ZSBhc2htZW0gZGV2aWNlIG5vZGUuIEZhaWxlZCB0byByZWFkICIgPDwgYm9vdF9pZF9wYXRoOwogICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9OworICAgICAgICB9CiAgICAgICAgIGJvb3RfaWQgPSBUcmltKGJvb3RfaWQpOwogCiAgICAgICAgIFVldmVudCBkdXBfYXNobWVtX3VldmVudCA9IHVldmVudDsKQEAgLTUyOCwxMSArNjIyLDUzIEBACiAgICAgfQogfQogCisvLyBDaGVjayBVZXZlbnRzIGxvb2tpbmcgZm9yIHRoZSBrZXJuZWwncyBib290IHBhcnRpdGlvbiBVVUlECisvLworLy8gV2hlbiB3ZSBjYW4gc3RvcCBjaGVja2luZyB1ZXZlbnRzIChlaXRoZXIgYmVjYXVzZSB3ZSdyZSBkb25lIG9yIGJlY2F1c2UKKy8vIHdlIHdlcmVuJ3QgbG9va2luZyBmb3IgdGhlIGtlcm5lbCdzIGJvb3QgcGFydGl0aW9uIFVVSUQpIHRoZW4gcmV0dXJuCisvLyB0cnVlLiBSZXR1cm4gZmFsc2UgaWYgd2UncmUgbm90IGRvbmUgeWV0LgorYm9vbCBEZXZpY2VIYW5kbGVyOjpDaGVja1VldmVudEZvckJvb3RQYXJ0VXVpZChjb25zdCBVZXZlbnQmIHVldmVudCkgeworICAgIC8vIElmIHdlIGFyZW4ndCB1c2luZyBib290X3BhcnRfdXVpZCB0aGVuIHdlJ3JlIGRvbmUuCisgICAgaWYgKGJvb3RfcGFydF91dWlkXy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIEZpbmRpbmcgdGhlIGJvb3QgcGFydGl0aW9uIGlzIGEgb25lLXRpbWUgdGhpbmcgdGhhdCB3ZSBkbyBhdCBpbml0CisgICAgLy8gdGltZSwgbm90IHN0ZWFkeSBzdGF0ZS4gVGhpcyBpcyBiZWNhdXNlIHRoZSBib290IHBhcnRpdGlvbiBpc24ndAorICAgIC8vIGFsbG93ZWQgdG8gZ28gYXdheSBvciBjaGFuZ2UuIE9uY2Ugd2UgZm91bmQgdGhlIGJvb3QgcGFydGl0aW9uIHdlIGRvbid0CisgICAgLy8gZXhwZWN0IHRvIHJ1biBhZ2Fpbi4KKyAgICBpZiAoZm91bmRfYm9vdF9wYXJ0X3V1aWRfKSB7CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCBfX1BSRVRUWV9GVU5DVElPTl9fCisgICAgICAgICAgICAgICAgICAgICA8PCAiIHNob3VsZG4ndCBydW4gYWZ0ZXIga2VybmVsIGJvb3QgcGFydGl0aW9uIGlzIGZvdW5kIjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gV2Ugb25seSBuZWVkIHRvIGxvb2sgYXQgbmV3bHktYWRkZWQgYmxvY2sgZGV2aWNlcy4gTm90ZSB0aGF0IGlmIHNvbWVvbmUKKyAgICAvLyBpcyByZXBsYXlpbmcgZXZlbnRzIGFsbCBleGlzdGluZyBkZXZpY2VzIHdpbGwgZ2V0ICJhZGQiZWQuCisgICAgaWYgKHVldmVudC5zdWJzeXN0ZW0gIT0gImJsb2NrIiB8fCB1ZXZlbnQuYWN0aW9uICE9ICJhZGQiKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBJZiBpdCdzIG5vdCB0aGUgcGFydGl0aW9uIHdlIGNhcmUgYWJvdXQgdGhlbiBtb3ZlIG9uLgorICAgIGlmICh1ZXZlbnQucGFydGl0aW9uX3V1aWQgIT0gYm9vdF9wYXJ0X3V1aWRfKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBhdXRvIGRldmljZSA9IEdldEJsb2NrRGV2aWNlSW5mbyh1ZXZlbnQucGF0aCk7CisKKyAgICBMT0coSU5GTykgPDwgIkJvb3QgZGV2aWNlICIgPDwgZGV2aWNlLnN0ciA8PCAiIGZvdW5kIHZpYSBwYXJ0aXRpb24gVVVJRCI7CisgICAgZm91bmRfYm9vdF9wYXJ0X3V1aWRfID0gdHJ1ZTsKKyAgICBib290X2RldmljZXNfLmNsZWFyKCk7CisgICAgYm9vdF9kZXZpY2VzXy5pbnNlcnQoZGV2aWNlLnN0cik7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogdm9pZCBEZXZpY2VIYW5kbGVyOjpIYW5kbGVVZXZlbnQoY29uc3QgVWV2ZW50JiB1ZXZlbnQpIHsKLSAgaWYgKHVldmVudC5hY3Rpb24gPT0gImFkZCIgfHwgdWV2ZW50LmFjdGlvbiA9PSAiY2hhbmdlIiB8fAotICAgICAgdWV2ZW50LmFjdGlvbiA9PSAiYmluZCIgfHwgdWV2ZW50LmFjdGlvbiA9PSAib25saW5lIikgewotICAgIEZpeHVwU3lzUGVybWlzc2lvbnModWV2ZW50LnBhdGgsIHVldmVudC5zdWJzeXN0ZW0pOwotICB9CisgICAgaWYgKHVldmVudC5hY3Rpb24gPT0gImFkZCIgfHwgdWV2ZW50LmFjdGlvbiA9PSAiY2hhbmdlIiB8fCB1ZXZlbnQuYWN0aW9uID09ICJiaW5kIiB8fAorICAgICAgICB1ZXZlbnQuYWN0aW9uID09ICJvbmxpbmUiKSB7CisgICAgICAgIEZpeHVwU3lzUGVybWlzc2lvbnModWV2ZW50LnBhdGgsIHVldmVudC5zdWJzeXN0ZW0pOworICAgIH0KIAogICAgIC8vIGlmIGl0J3Mgbm90IGEgL2RldiBkZXZpY2UsIG5vdGhpbmcgdG8gZG8KICAgICBpZiAodWV2ZW50Lm1ham9yIDwgMCB8fCB1ZXZlbnQubWlub3IgPCAwKSByZXR1cm47CkBAIC01NjgsNiArNzA0LDggQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0gZWxzZSBpZiAodWV2ZW50LnN1YnN5c3RlbSA9PSAibWlzYyIgJiYgU3RhcnRzV2l0aCh1ZXZlbnQuZGV2aWNlX25hbWUsICJkbS11c2VyLyIpKSB7CiAgICAgICAgIGRldnBhdGggPSAiL2Rldi9kbS11c2VyLyIgKyB1ZXZlbnQuZGV2aWNlX25hbWUuc3Vic3RyKDgpOworICAgIH0gZWxzZSBpZiAodWV2ZW50LnN1YnN5c3RlbSA9PSAibWlzYyIgJiYgdWV2ZW50LmRldmljZV9uYW1lID09ICJ2ZmlvL3ZmaW8iKSB7CisgICAgICAgIGRldnBhdGggPSAiL2Rldi8iICsgdWV2ZW50LmRldmljZV9uYW1lOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGRldnBhdGggPSAiL2Rldi8iICsgQmFzZW5hbWUodWV2ZW50LnBhdGgpOwogICAgIH0KQEAgLTU4OCwxNyArNzI2LDI1IEBACiBEZXZpY2VIYW5kbGVyOjpEZXZpY2VIYW5kbGVyKHN0ZDo6dmVjdG9yPFBlcm1pc3Npb25zPiBkZXZfcGVybWlzc2lvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFN5c2ZzUGVybWlzc2lvbnM+IHN5c2ZzX3Blcm1pc3Npb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdWJzeXN0ZW0+IHN1YnN5c3RlbXMsIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBib290X2RldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2tpcF9yZXN0b3JlY29uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBib290X3BhcnRfdXVpZCwgYm9vbCBza2lwX3Jlc3RvcmVjb24pCiAgICAgOiBkZXZfcGVybWlzc2lvbnNfKHN0ZDo6bW92ZShkZXZfcGVybWlzc2lvbnMpKSwKICAgICAgIHN5c2ZzX3Blcm1pc3Npb25zXyhzdGQ6Om1vdmUoc3lzZnNfcGVybWlzc2lvbnMpKSwKICAgICAgIHN1YnN5c3RlbXNfKHN0ZDo6bW92ZShzdWJzeXN0ZW1zKSksCiAgICAgICBib290X2RldmljZXNfKHN0ZDo6bW92ZShib290X2RldmljZXMpKSwKKyAgICAgIGJvb3RfcGFydF91dWlkXyhib290X3BhcnRfdXVpZCksCiAgICAgICBza2lwX3Jlc3RvcmVjb25fKHNraXBfcmVzdG9yZWNvbiksCi0gICAgICBzeXNmc19tb3VudF9wb2ludF8oIi9zeXMiKSB7fQorICAgICAgc3lzZnNfbW91bnRfcG9pbnRfKCIvc3lzIikgeworICAgIC8vIElmIGJvdGggYSBib290IHBhcnRpdGlvbiBVVUlEIGFuZCBhIGxpc3Qgb2YgYm9vdCBkZXZpY2VzIGFyZQorICAgIC8vIHNwZWNpZmllZCB0aGVuIHdlIGlnbm9yZSB0aGUgYm9vdF9kZXZpY2VzIGluIGZhdm9yIG9mIGJvb3RfcGFydF91dWlkLgorICAgIGlmIChib290X2RldmljZXNfLnNpemUoKSAmJiAhYm9vdF9wYXJ0X3V1aWQuZW1wdHkoKSkgeworICAgICAgICBMT0coV0FSTklORykgPDwgIkJvdGggYm9vdF9kZXZpY2VzIGFuZCBib290X3BhcnRfdXVpZCBwcm92aWRlZDsgaWdub3JpbmcgYm9vdGRldmljZXMiOworICAgICAgICBib290X2RldmljZXNfLmNsZWFyKCk7CisgICAgfQorfQogCiBEZXZpY2VIYW5kbGVyOjpEZXZpY2VIYW5kbGVyKCkKICAgICA6IERldmljZUhhbmRsZXIoc3RkOjp2ZWN0b3I8UGVybWlzc2lvbnM+e30sIHN0ZDo6dmVjdG9yPFN5c2ZzUGVybWlzc2lvbnM+e30sCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFN1YnN5c3RlbT57fSwgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+e30sIGZhbHNlKSB7fQorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdWJzeXN0ZW0+e30sIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPnt9LCAiIiwgZmFsc2UpIHt9CiAKIH0gIC8vIG5hbWVzcGFjZSBpbml0CiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5pdC9kZXZpY2VzLmggYi9pbml0L2RldmljZXMuaAppbmRleCBmOWY0ZDc5Li5iOGY4ZTU0IDEwMDY0NAotLS0gYS9pbml0L2RldmljZXMuaAorKysgYi9pbml0L2RldmljZXMuaApAQCAtODIsNiArODIsNyBAQAogICAgIGVudW0gRGV2bmFtZVNvdXJjZSB7CiAgICAgICAgIERFVk5BTUVfVUVWRU5UX0RFVk5BTUUsCiAgICAgICAgIERFVk5BTUVfVUVWRU5UX0RFVlBBVEgsCisgICAgICAgIERFVk5BTUVfU1lTX05BTUUsCiAgICAgfTsKIAogICAgIFN1YnN5c3RlbSgpIHt9CkBAIC05MiwxMCArOTMsMTggQEAKICAgICAvLyBSZXR1cm5zIHRoZSBmdWxsIHBhdGggZm9yIGEgdWV2ZW50IG9mIGEgZGV2aWNlIHRoYXQgaXMgYSBtZW1iZXIgb2YgdGhpcyBzdWJzeXN0ZW0sCiAgICAgLy8gYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBwYXJzZWQgZnJvbSB1ZXZlbnRkLnJjCiAgICAgc3RkOjpzdHJpbmcgUGFyc2VEZXZQYXRoKGNvbnN0IFVldmVudCYgdWV2ZW50KSBjb25zdCB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGRldm5hbWUgPSBkZXZuYW1lX3NvdXJjZV8gPT0gREVWTkFNRV9VRVZFTlRfREVWTkFNRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHVldmVudC5kZXZpY2VfbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGFuZHJvaWQ6OmJhc2U6OkJhc2VuYW1lKHVldmVudC5wYXRoKTsKLQorICAgICAgICBzdGQ6OnN0cmluZyBkZXZuYW1lOworICAgICAgICBpZiAoZGV2bmFtZV9zb3VyY2VfID09IERFVk5BTUVfVUVWRU5UX0RFVk5BTUUpIHsKKyAgICAgICAgICAgIGRldm5hbWUgPSB1ZXZlbnQuZGV2aWNlX25hbWU7CisgICAgICAgIH0gZWxzZSBpZiAoZGV2bmFtZV9zb3VyY2VfID09IERFVk5BTUVfVUVWRU5UX0RFVlBBVEgpIHsKKyAgICAgICAgICAgIGRldm5hbWUgPSBhbmRyb2lkOjpiYXNlOjpCYXNlbmFtZSh1ZXZlbnQucGF0aCk7CisgICAgICAgIH0gZWxzZSBpZiAoZGV2bmFtZV9zb3VyY2VfID09IERFVk5BTUVfU1lTX05BTUUpIHsKKyAgICAgICAgICAgIGlmIChhbmRyb2lkOjpiYXNlOjpSZWFkRmlsZVRvU3RyaW5nKCIvc3lzLyIgKyB1ZXZlbnQucGF0aCArICIvbmFtZSIsICZkZXZuYW1lKSkgeworICAgICAgICAgICAgICAgIGRldm5hbWUucG9wX2JhY2soKTsgIC8vIFJlbW92ZSB0ZXJtaW5hdGluZyBuZXdsaW5lCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRldm5hbWUgPSB1ZXZlbnQuZGV2aWNlX25hbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGRpcl9uYW1lXyArICIvIiArIGRldm5hbWU7CiAgICAgfQogCkBAIC0xMDcsMzMgKzExNiw0OCBAQAogICAgIHN0ZDo6c3RyaW5nIGRpcl9uYW1lXyA9ICIvZGV2IjsKIH07CiAKK3N0cnVjdCBCbG9ja0RldmljZUluZm8geworICAgIHN0ZDo6c3RyaW5nIHN0cjsKKyAgICBzdGQ6OnN0cmluZyB0eXBlOworICAgIGJvb2wgaXNfYm9vdF9kZXZpY2U7Cit9OworCiBjbGFzcyBEZXZpY2VIYW5kbGVyIDogcHVibGljIFVldmVudEhhbmRsZXIgewogICBwdWJsaWM6CiAgICAgZnJpZW5kIGNsYXNzIERldmljZUhhbmRsZXJUZXN0ZXI7CiAKICAgICBEZXZpY2VIYW5kbGVyKCk7CiAgICAgRGV2aWNlSGFuZGxlcihzdGQ6OnZlY3RvcjxQZXJtaXNzaW9ucz4gZGV2X3Blcm1pc3Npb25zLAotICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3lzZnNQZXJtaXNzaW9ucz4gc3lzZnNfcGVybWlzc2lvbnMsIHN0ZDo6dmVjdG9yPFN1YnN5c3RlbT4gc3Vic3lzdGVtcywKLSAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBib290X2RldmljZXMsIGJvb2wgc2tpcF9yZXN0b3JlY29uKTsKKyAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFN5c2ZzUGVybWlzc2lvbnM+IHN5c2ZzX3Blcm1pc3Npb25zLAorICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3Vic3lzdGVtPiBzdWJzeXN0ZW1zLCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gYm9vdF9kZXZpY2VzLAorICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgYm9vdF9wYXJ0X3V1aWQsIGJvb2wgc2tpcF9yZXN0b3JlY29uKTsKICAgICB2aXJ0dWFsIH5EZXZpY2VIYW5kbGVyKCkgPSBkZWZhdWx0OwogCisgICAgYm9vbCBDaGVja1VldmVudEZvckJvb3RQYXJ0VXVpZChjb25zdCBVZXZlbnQmIHVldmVudCk7CiAgICAgdm9pZCBIYW5kbGVVZXZlbnQoY29uc3QgVWV2ZW50JiB1ZXZlbnQpIG92ZXJyaWRlOwotICAgIHZvaWQgQ29sZGJvb3REb25lKCkgb3ZlcnJpZGU7Ci0KLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gR2V0QmxvY2tEZXZpY2VTeW1saW5rcyhjb25zdCBVZXZlbnQmIHVldmVudCkgY29uc3Q7CiAKICAgICAvLyBgYW5kcm9pZGJvb3QucGFydGl0aW9uX21hcGAgYWxsb3dzIGFzc29jaWF0aW5nIGEgcGFydGl0aW9uIG5hbWUgZm9yIGEgcmF3IGJsb2NrIGRldmljZQogICAgIC8vIHRocm91Z2ggYSBjb21tYSBzZXBhcmF0ZWQgYW5kIHNlbWljb2xvbiBkZWxpbWluYXRlZCBsaXN0LiBGb3IgZXhhbXBsZSwKICAgICAvLyBgYW5kcm9pZGJvb3QucGFydGl0aW9uX21hcD12ZGIsbWV0YWRhdGE7dmRjLHVzZXJkYXRhYCBtYXBzIGB2ZGJgIHRvIGBtZXRhZGF0YWAgYW5kIGB2ZGNgIHRvCiAgICAgLy8gYHVzZXJkYXRhYC4KICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgR2V0UGFydGl0aW9uTmFtZUZvckRldmljZShjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlKTsKKyAgICBib29sIElzQm9vdERldmljZVN0cmljdCgpIGNvbnN0OworICAgIGJvb2wgSXNCb290RGV2aWNlKGNvbnN0IFVldmVudCYgdWV2ZW50KSBjb25zdDsKIAogICBwcml2YXRlOgotICAgIGJvb2wgRmluZFBsYXRmb3JtRGV2aWNlKHN0ZDo6c3RyaW5nIHBhdGgsIHN0ZDo6c3RyaW5nKiBwbGF0Zm9ybV9kZXZpY2VfcGF0aCkgY29uc3Q7CisgICAgdm9pZCBDb2xkYm9vdERvbmUoKSBvdmVycmlkZTsKKyAgICBCbG9ja0RldmljZUluZm8gR2V0QmxvY2tEZXZpY2VJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nJiB1ZXZlbnRfcGF0aCkgY29uc3Q7CisgICAgYm9vbCBGaW5kU3Vic3lzdGVtRGV2aWNlKHN0ZDo6c3RyaW5nIHBhdGgsIHN0ZDo6c3RyaW5nKiBkZXZpY2VfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBzdWJzeXN0ZW1fcGF0aHMpIGNvbnN0OworICAgIGJvb2wgRmluZFBsYXRmb3JtRGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBzdGQ6OnN0cmluZyogcGxhdGZvcm1fZGV2aWNlX3BhdGgpIGNvbnN0OworICAgIGJvb2wgRmluZE1tY0RldmljZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgc3RkOjpzdHJpbmcqIG1tY19kZXZpY2VfcGF0aCkgY29uc3Q7CisgICAgYm9vbCBGaW5kTnZtZURldmljZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgc3RkOjpzdHJpbmcqIG52bWVfZGV2aWNlX3BhdGgpIGNvbnN0OworICAgIGJvb2wgRmluZFNjc2lEZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHN0ZDo6c3RyaW5nKiBzY3NpX2RldmljZV9wYXRoKSBjb25zdDsKICAgICBzdGQ6OnR1cGxlPG1vZGVfdCwgdWlkX3QsIGdpZF90PiBHZXREZXZpY2VQZXJtaXNzaW9ucygKICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgbGlua3MpIGNvbnN0OwogICAgIHZvaWQgTWFrZURldmljZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgYm9vbCBibG9jaywgaW50IG1ham9yLCBpbnQgbWlub3IsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgbGlua3MpIGNvbnN0OworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBHZXRCbG9ja0RldmljZVN5bWxpbmtzKGNvbnN0IFVldmVudCYgdWV2ZW50KSBjb25zdDsKICAgICB2b2lkIEhhbmRsZURldmljZShjb25zdCBzdGQ6OnN0cmluZyYgYWN0aW9uLCBjb25zdCBzdGQ6OnN0cmluZyYgZGV2cGF0aCwgYm9vbCBibG9jaywgaW50IG1ham9yLAogICAgICAgICAgICAgICAgICAgICAgIGludCBtaW5vciwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBsaW5rcykgY29uc3Q7CiAgICAgdm9pZCBGaXh1cFN5c1Blcm1pc3Npb25zKGNvbnN0IHN0ZDo6c3RyaW5nJiB1cGF0aCwgY29uc3Qgc3RkOjpzdHJpbmcmIHN1YnN5c3RlbSkgY29uc3Q7CkBAIC0xNDMsNiArMTY3LDggQEAKICAgICBzdGQ6OnZlY3RvcjxTeXNmc1Blcm1pc3Npb25zPiBzeXNmc19wZXJtaXNzaW9uc187CiAgICAgc3RkOjp2ZWN0b3I8U3Vic3lzdGVtPiBzdWJzeXN0ZW1zXzsKICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gYm9vdF9kZXZpY2VzXzsKKyAgICBzdGQ6OnN0cmluZyBib290X3BhcnRfdXVpZF87CisgICAgYm9vbCBmb3VuZF9ib290X3BhcnRfdXVpZF87CiAgICAgYm9vbCBza2lwX3Jlc3RvcmVjb25fOwogICAgIHN0ZDo6c3RyaW5nIHN5c2ZzX21vdW50X3BvaW50XzsKIH07CmRpZmYgLS1naXQgYS9pbml0L2Vwb2xsLmNwcCBiL2luaXQvZXBvbGwuY3BwCmluZGV4IGNkNzNhMGMuLjcxOWE1MzIgMTAwNjQ0Ci0tLSBhL2luaXQvZXBvbGwuY3BwCisrKyBiL2luaXQvZXBvbGwuY3BwCkBAIC00Nyw4ICs0Nyw4IEBACiAKICAgICBhdXRvIFtpdCwgaW5zZXJ0ZWRdID0gZXBvbGxfaGFuZGxlcnNfLmVtcGxhY2UoCiAgICAgICAgICAgICBmZCwgSW5mb3sKLSAgICAgICAgICAgICAgICAgICAgICAgIC5ldmVudHMgPSBldmVudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAuaGFuZGxlciA9IHN0ZDo6bW92ZShoYW5kbGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC5ldmVudHMgPSBldmVudHMsCiAgICAgICAgICAgICAgICAgfSk7CiAgICAgaWYgKCFpbnNlcnRlZCkgewogICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiQ2Fubm90IHNwZWNpZnkgdHdvIGVwb2xsIGhhbmRsZXJzIGZvciBhIGdpdmVuIEZEIjsKZGlmZiAtLWdpdCBhL2luaXQvZmlybXdhcmVfaGFuZGxlci5jcHAgYi9pbml0L2Zpcm13YXJlX2hhbmRsZXIuY3BwCmluZGV4IGI5ZmE1OGMuLmRjZmRhNTIgMTAwNjQ0Ci0tLSBhL2luaXQvZmlybXdhcmVfaGFuZGxlci5jcHAKKysrIGIvaW5pdC9maXJtd2FyZV9oYW5kbGVyLmNwcApAQCAtMzMsMTYgKzMzLDIwIEBACiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2Nocm9ub191dGlscy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zY29wZWd1YXJkLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CiAKKyNpbmNsdWRlICJleHRoYW5kbGVyL2V4dGhhbmRsZXIuaCIKKwogdXNpbmcgYW5kcm9pZDo6YmFzZTo6UmVhZEZkVG9TdHJpbmc7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjpTb2NrZXRwYWlyOwogdXNpbmcgYW5kcm9pZDo6YmFzZTo6U3BsaXQ7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjpUaW1lcjsKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlRyaW07CiB1c2luZyBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQ7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpXYWl0Rm9yUHJvcGVydHk7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjpXcml0ZUZ1bGx5OwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC04Miw2ICs4NiwzMyBAQAogICAgIHJldHVybiBhY2Nlc3MoIi9kZXYvLmJvb3RpbmciLCBGX09LKSA9PSAwOwogfQogCitzdGF0aWMgYm9vbCBJc0FwZXhBY3RpdmF0ZWQoKSB7CisgICAgc3RhdGljIGJvb2wgYXBleF9hY3RpdmF0ZWQgPSBbXSgpIHsKKyAgICAgICAgLy8gV2FpdCBmb3IgY29tLmFuZHJvaWQucnVudGltZS5hcGV4IGFjdGl2YXRpb24KKyAgICAgICAgLy8gUHJvcGVydHkgbmFtZSBhbmQgdmFsdWUgbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCBzeXN0ZW0vYXBleGQvYXBleC9hcGV4X2NvbnN0YW50cy5oCisgICAgICAgIC8vIDYwcyBpcyB0aGUgZGVmYXVsdCBmaXJtd2FyZSBzeXNmcyBmYWxsYmFjayB0aW1lb3V0LiAoL3N5cy9jbGFzcy9maXJtd2FyZS90aW1lb3V0KQorICAgICAgICBpZiAoIVdhaXRGb3JQcm9wZXJ0eSgiYXBleGQuc3RhdHVzIiwgImFjdGl2YXRlZCIsIDYwcykpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkFwZXhkIGFjdGl2YXRpb24gd2FpdCB0aW1lb3V0IjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9KCk7CisKKyAgICByZXR1cm4gYXBleF9hY3RpdmF0ZWQ7Cit9CisKK3N0YXRpYyBib29sIE5lZWRzUmVydW5FeHRlcm5hbEhhbmRsZXIoKSB7CisgICAgc3RhdGljIGJvb2wgZmlyc3QgPSB0cnVlOworCisgICAgLy8gUmVydW4gZXh0ZXJuYWwgaGFuZGxlciBvbmx5IG9uIHRoZSBmaXJzdCB0cnkgYW5kIHdoZW4gYXBleCBpcyBhY3RpdmF0ZWQKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIElzQXBleEFjdGl2YXRlZCgpOworICAgIH0KKworICAgIHJldHVybiBmaXJzdDsKK30KKwogRXh0ZXJuYWxGaXJtd2FyZUhhbmRsZXI6OkV4dGVybmFsRmlybXdhcmVIYW5kbGVyKHN0ZDo6c3RyaW5nIGRldnBhdGgsIHVpZF90IHVpZCwgZ2lkX3QgZ2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGhhbmRsZXJfcGF0aCkKICAgICA6IGRldnBhdGgoc3RkOjptb3ZlKGRldnBhdGgpKSwgdWlkKHVpZCksIGdpZChnaWQpLCBoYW5kbGVyX3BhdGgoc3RkOjptb3ZlKGhhbmRsZXJfcGF0aCkpIHsKQEAgLTEwNywxMDAgKzEzOCw2IEBACiAgICAgOiBmaXJtd2FyZV9kaXJlY3Rvcmllc18oc3RkOjptb3ZlKGZpcm13YXJlX2RpcmVjdG9yaWVzKSksCiAgICAgICBleHRlcm5hbF9maXJtd2FyZV9oYW5kbGVyc18oc3RkOjptb3ZlKGV4dGVybmFsX2Zpcm13YXJlX2hhbmRsZXJzKSkge30KIAotUmVzdWx0PHN0ZDo6c3RyaW5nPiBGaXJtd2FyZUhhbmRsZXI6OlJ1bkV4dGVybmFsSGFuZGxlcihjb25zdCBzdGQ6OnN0cmluZyYgaGFuZGxlciwgdWlkX3QgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaWRfdCBnaWQsIGNvbnN0IFVldmVudCYgdWV2ZW50KSBjb25zdCB7Ci0gICAgdW5pcXVlX2ZkIGNoaWxkX3N0ZG91dDsKLSAgICB1bmlxdWVfZmQgcGFyZW50X3N0ZG91dDsKLSAgICBpZiAoIVNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0gfCBTT0NLX0NMT0VYRUMsIDAsICZjaGlsZF9zdGRvdXQsICZwYXJlbnRfc3Rkb3V0KSkgewotICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJTb2NrZXRwYWlyKCkgZm9yIHN0ZG91dCBmYWlsZWQiOwotICAgIH0KLQotICAgIHVuaXF1ZV9mZCBjaGlsZF9zdGRlcnI7Ci0gICAgdW5pcXVlX2ZkIHBhcmVudF9zdGRlcnI7Ci0gICAgaWYgKCFTb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfU1RSRUFNIHwgU09DS19DTE9FWEVDLCAwLCAmY2hpbGRfc3RkZXJyLCAmcGFyZW50X3N0ZGVycikpIHsKLSAgICAgICAgcmV0dXJuIEVycm5vRXJyb3IoKSA8PCAiU29ja2V0cGFpcigpIGZvciBzdGRlcnIgZmFpbGVkIjsKLSAgICB9Ci0KLSAgICBzaWduYWwoU0lHQ0hMRCwgU0lHX0RGTCk7Ci0KLSAgICBhdXRvIHBpZCA9IGZvcmsoKTsKLSAgICBpZiAocGlkIDwgMCkgewotICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJmb3JrKCkgZmFpbGVkIjsKLSAgICB9Ci0KLSAgICBpZiAocGlkID09IDApIHsKLSAgICAgICAgc2V0ZW52KCJGSVJNV0FSRSIsIHVldmVudC5maXJtd2FyZS5jX3N0cigpLCAxKTsKLSAgICAgICAgc2V0ZW52KCJERVZQQVRIIiwgdWV2ZW50LnBhdGguY19zdHIoKSwgMSk7Ci0gICAgICAgIHBhcmVudF9zdGRvdXQucmVzZXQoKTsKLSAgICAgICAgcGFyZW50X3N0ZGVyci5yZXNldCgpOwotICAgICAgICBjbG9zZShTVERPVVRfRklMRU5PKTsKLSAgICAgICAgY2xvc2UoU1RERVJSX0ZJTEVOTyk7Ci0gICAgICAgIGR1cDIoY2hpbGRfc3Rkb3V0LmdldCgpLCBTVERPVVRfRklMRU5PKTsKLSAgICAgICAgZHVwMihjaGlsZF9zdGRlcnIuZ2V0KCksIFNUREVSUl9GSUxFTk8pOwotCi0gICAgICAgIGF1dG8gYXJncyA9IFNwbGl0KGhhbmRsZXIsICIgIik7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPGNoYXIqPiBjX2FyZ3M7Ci0gICAgICAgIGZvciAoYXV0byYgYXJnIDogYXJncykgewotICAgICAgICAgICAgY19hcmdzLmVtcGxhY2VfYmFjayhhcmcuZGF0YSgpKTsKLSAgICAgICAgfQotICAgICAgICBjX2FyZ3MuZW1wbGFjZV9iYWNrKG51bGxwdHIpOwotCi0gICAgICAgIGlmIChnaWQgIT0gMCkgewotICAgICAgICAgICAgaWYgKHNldGdpZChnaWQpICE9IDApIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNldGdpZCgpIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgICAgIF9leGl0KEVYSVRfRkFJTFVSRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2V0dWlkKHVpZCkgIT0gMCkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzZXR1aWQoKSBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgIF9leGl0KEVYSVRfRkFJTFVSRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBleGVjdihjX2FyZ3NbMF0sIGNfYXJncy5kYXRhKCkpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImV4ZWMoKSBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgX2V4aXQoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0KLSAgICBjaGlsZF9zdGRvdXQucmVzZXQoKTsKLSAgICBjaGlsZF9zdGRlcnIucmVzZXQoKTsKLQotICAgIGludCBzdGF0dXM7Ci0gICAgcGlkX3Qgd2FpdGVkX3BpZCA9IFRFTVBfRkFJTFVSRV9SRVRSWSh3YWl0cGlkKHBpZCwgJnN0YXR1cywgMCkpOwotICAgIGlmICh3YWl0ZWRfcGlkID09IC0xKSB7Ci0gICAgICAgIHJldHVybiBFcnJub0Vycm9yKCkgPDwgIndhaXRwaWQoKSBmYWlsZWQiOwotICAgIH0KLQotICAgIHN0ZDo6c3RyaW5nIHN0ZG91dF9jb250ZW50OwotICAgIGlmICghUmVhZEZkVG9TdHJpbmcocGFyZW50X3N0ZG91dC5nZXQoKSwgJnN0ZG91dF9jb250ZW50KSkgewotICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJSZWFkRmRUb1N0cmluZygpIGZvciBzdGRvdXQgZmFpbGVkIjsKLSAgICB9Ci0KLSAgICBzdGQ6OnN0cmluZyBzdGRlcnJfY29udGVudDsKLSAgICBpZiAoUmVhZEZkVG9TdHJpbmcocGFyZW50X3N0ZGVyci5nZXQoKSwgJnN0ZGVycl9jb250ZW50KSkgewotICAgICAgICBhdXRvIG1lc3NhZ2VzID0gU3BsaXQoc3RkZXJyX2NvbnRlbnQsICJcbiIpOwotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIG1lc3NhZ2UgOiBtZXNzYWdlcykgewotICAgICAgICAgICAgaWYgKCFtZXNzYWdlLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJFeHRlcm5hbCBGaXJtd2FyZSBIYW5kbGVyOiAiIDw8IG1lc3NhZ2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBMT0coRVJST1IpIDw8ICJSZWFkRmRUb1N0cmluZygpIGZvciBzdGRlcnIgZmFpbGVkIjsKLSAgICB9Ci0KLSAgICBpZiAoV0lGRVhJVEVEKHN0YXR1cykpIHsKLSAgICAgICAgaWYgKFdFWElUU1RBVFVTKHN0YXR1cykgPT0gRVhJVF9TVUNDRVNTKSB7Ci0gICAgICAgICAgICByZXR1cm4gVHJpbShzdGRvdXRfY29udGVudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiZXhpdGVkIHdpdGggc3RhdHVzICIgPDwgV0VYSVRTVEFUVVMoc3RhdHVzKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoV0lGU0lHTkFMRUQoc3RhdHVzKSkgewotICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAia2lsbGVkIGJ5IHNpZ25hbCAiIDw8IFdURVJNU0lHKHN0YXR1cyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIEVycm9yKCkgPDwgInVuZXhwZWN0ZWQgZXhpdCBzdGF0dXMgIiA8PCBzdGF0dXM7Ci19Ci0KIHN0ZDo6c3RyaW5nIEZpcm13YXJlSGFuZGxlcjo6R2V0RmlybXdhcmVQYXRoKGNvbnN0IFVldmVudCYgdWV2ZW50KSBjb25zdCB7CiAgICAgZm9yIChjb25zdCBhdXRvJiBleHRlcm5hbF9oYW5kbGVyIDogZXh0ZXJuYWxfZmlybXdhcmVfaGFuZGxlcnNfKSB7CiAgICAgICAgIGlmIChleHRlcm5hbF9oYW5kbGVyLm1hdGNoKHVldmVudC5wYXRoKSkgewpAQCAtMjA4LDggKzE0NSwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgIDw8ICInIGZvciBkZXZwYXRoOiAnIiA8PCB1ZXZlbnQucGF0aCA8PCAiJyBmaXJtd2FyZTogJyIgPDwgdWV2ZW50LmZpcm13YXJlCiAgICAgICAgICAgICAgICAgICAgICAgPDwgIiciOwogCisgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBlbnZzX21hcDsKKyAgICAgICAgICAgIGVudnNfbWFwWyJGSVJNV0FSRSJdID0gdWV2ZW50LmZpcm13YXJlOworICAgICAgICAgICAgZW52c19tYXBbIkRFVlBBVEgiXSA9IHVldmVudC5wYXRoOworCiAgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IFJ1bkV4dGVybmFsSGFuZGxlcihleHRlcm5hbF9oYW5kbGVyLmhhbmRsZXJfcGF0aCwgZXh0ZXJuYWxfaGFuZGxlci51aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbF9oYW5kbGVyLmdpZCwgdWV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsX2hhbmRsZXIuZ2lkLCBlbnZzX21hcCk7CisgICAgICAgICAgICBpZiAoIXJlc3VsdC5vaygpICYmIE5lZWRzUmVydW5FeHRlcm5hbEhhbmRsZXIoKSkgeworICAgICAgICAgICAgICAgIGF1dG8gcmVzID0gUnVuRXh0ZXJuYWxIYW5kbGVyKGV4dGVybmFsX2hhbmRsZXIuaGFuZGxlcl9wYXRoLCBleHRlcm5hbF9oYW5kbGVyLnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbF9oYW5kbGVyLmdpZCwgZW52c19tYXApOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHN0ZDo6bW92ZShyZXMpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFyZXN1bHQub2soKSkgewogICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlVzaW5nIGRlZmF1bHQgZmlybXdhcmU7IEV4dGVybmFsIGZpcm13YXJlIGhhbmRsZXIgZmFpbGVkOiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCByZXN1bHQuZXJyb3IoKTsKQEAgLTIzMCw4ICsxNzYsOSBAQAogICAgIHJldHVybiB1ZXZlbnQuZmlybXdhcmU7CiB9CiAKLXZvaWQgRmlybXdhcmVIYW5kbGVyOjpQcm9jZXNzRmlybXdhcmVFdmVudChjb25zdCBzdGQ6OnN0cmluZyYgcm9vdCwKK3ZvaWQgRmlybXdhcmVIYW5kbGVyOjpQcm9jZXNzRmlybXdhcmVFdmVudChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlybXdhcmUpIGNvbnN0IHsKKyAgICBzdGQ6OnN0cmluZyByb290ID0gIi9zeXMiICsgcGF0aDsKICAgICBzdGQ6OnN0cmluZyBsb2FkaW5nID0gcm9vdCArICIvbG9hZGluZyI7CiAgICAgc3RkOjpzdHJpbmcgZGF0YSA9IHJvb3QgKyAiL2RhdGEiOwogCkBAIC0yNjIsNiArMjA5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBmc3RhdCBmYWlsZWQ6ICIgKyBzdHJlcnJvcihlcnJubykpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CisgICAgICAgIExPRyhJTkZPKSA8PCAiZm91bmQgIiA8PCBmaWxlIDw8ICIgZm9yICIgPDwgcGF0aDsKICAgICAgICAgTG9hZEZpcm13YXJlKGZpcm13YXJlLCByb290LCBmd19mZC5nZXQoKSwgc2Iuc3Rfc2l6ZSwgbG9hZGluZ19mZC5nZXQoKSwgZGF0YV9mZC5nZXQoKSk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH07CkBAIC0zMjgsNyArMjc2LDcgQEAKICAgICBpZiAocGlkID09IDApIHsKICAgICAgICAgVGltZXIgdDsKICAgICAgICAgYXV0byBmaXJtd2FyZSA9IEdldEZpcm13YXJlUGF0aCh1ZXZlbnQpOwotICAgICAgICBQcm9jZXNzRmlybXdhcmVFdmVudCgiL3N5cyIgKyB1ZXZlbnQucGF0aCwgZmlybXdhcmUpOworICAgICAgICBQcm9jZXNzRmlybXdhcmVFdmVudCh1ZXZlbnQucGF0aCwgZmlybXdhcmUpOwogICAgICAgICBMT0coSU5GTykgPDwgImxvYWRpbmcgIiA8PCB1ZXZlbnQucGF0aCA8PCAiIHRvb2sgIiA8PCB0OwogICAgICAgICBfZXhpdChFWElUX1NVQ0NFU1MpOwogICAgIH0KZGlmZiAtLWdpdCBhL2luaXQvZmlybXdhcmVfaGFuZGxlci5oIGIvaW5pdC9maXJtd2FyZV9oYW5kbGVyLmgKaW5kZXggZDJmNzM0Ny4uZTVkMzUzOCAxMDA2NDQKLS0tIGEvaW5pdC9maXJtd2FyZV9oYW5kbGVyLmgKKysrIGIvaW5pdC9maXJtd2FyZV9oYW5kbGVyLmgKQEAgLTU0LDEwICs1NCw4IEBACiAgICAgZnJpZW5kIHZvaWQgRmlybXdhcmVUZXN0V2l0aEV4dGVybmFsSGFuZGxlcihjb25zdCBzdGQ6OnN0cmluZyYgdGVzdF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBleHBlY3RfbmV3X2Zpcm13YXJlKTsKIAotICAgIFJlc3VsdDxzdGQ6OnN0cmluZz4gUnVuRXh0ZXJuYWxIYW5kbGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBoYW5kbGVyLCB1aWRfdCB1aWQsIGdpZF90IGdpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVZXZlbnQmIHVldmVudCkgY29uc3Q7CiAgICAgc3RkOjpzdHJpbmcgR2V0RmlybXdhcmVQYXRoKGNvbnN0IFVldmVudCYgdWV2ZW50KSBjb25zdDsKLSAgICB2b2lkIFByb2Nlc3NGaXJtd2FyZUV2ZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiByb290LCBjb25zdCBzdGQ6OnN0cmluZyYgZmlybXdhcmUpIGNvbnN0OworICAgIHZvaWQgUHJvY2Vzc0Zpcm13YXJlRXZlbnQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaXJtd2FyZSkgY29uc3Q7CiAgICAgYm9vbCBGb3JFYWNoRmlybXdhcmVEaXJlY3Rvcnkoc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IHN0ZDo6c3RyaW5nJik+IGhhbmRsZXIpIGNvbnN0OwogCiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGZpcm13YXJlX2RpcmVjdG9yaWVzXzsKZGlmZiAtLWdpdCBhL2luaXQvZmlyc3Rfc3RhZ2VfY29uc29sZS5jcHAgYi9pbml0L2ZpcnN0X3N0YWdlX2NvbnNvbGUuY3BwCmluZGV4IDY3Y2FjMTkuLmY2ZjkzMjkgMTAwNjQ0Ci0tLSBhL2luaXQvZmlyc3Rfc3RhZ2VfY29uc29sZS5jcHAKKysrIGIvaW5pdC9maXJzdF9zdGFnZV9jb25zb2xlLmNwcApAQCAtMTYsNiArMTYsNyBAQAogCiAjaW5jbHVkZSAiZmlyc3Rfc3RhZ2VfY29uc29sZS5oIgogCisjaW5jbHVkZSA8c3Bhd24uaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8c3lzL3N5c21hY3Jvcy5oPgpAQCAtNjUsMTkgKzY2LDIwIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyB2b2lkIFJ1blNjcmlwdCgpIHsKLSAgICBMT0coSU5GTykgPDwgIkF0dGVtcHRpbmcgdG8gcnVuIC9maXJzdF9zdGFnZS5zaC4uLiI7Ci0gICAgcGlkX3QgcGlkID0gZm9yaygpOwotICAgIGlmIChwaWQgIT0gMCkgewotICAgICAgICBpbnQgc3RhdHVzOwotICAgICAgICB3YWl0cGlkKHBpZCwgJnN0YXR1cywgMCk7Ci0gICAgICAgIExPRyhJTkZPKSA8PCAiL2ZpcnN0X3N0YWdlLnNoIGV4aXRlZCB3aXRoIHN0YXR1cyAiIDw8IHN0YXR1czsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjb25zdCBjaGFyKiBwYXRoID0gIi9zeXN0ZW0vYmluL3NoIjsKLSAgICBjb25zdCBjaGFyKiBhcmdzW10gPSB7cGF0aCwgIi9maXJzdF9zdGFnZS5zaCIsIG51bGxwdHJ9OwotICAgIGludCBydiA9IGV4ZWN2KHBhdGgsIGNvbnN0X2Nhc3Q8Y2hhcioqPihhcmdzKSk7Ci0gICAgTE9HKEVSUk9SKSA8PCAidW5hYmxlIHRvIGV4ZWN2IC9maXJzdF9zdGFnZS5zaCwgcmV0dXJuZWQgIiA8PCBydiA8PCAiIGVycm5vICIgPDwgZXJybm87CitzdGF0aWMgcGlkX3QgU3Bhd25JbWFnZShjb25zdCBjaGFyKiBmaWxlKSB7CisgICAgY29uc3QgY2hhciogYXJndltdID0ge2ZpbGUsIE5VTEx9OworICAgIGNvbnN0IGNoYXIqIGVudnBbXSA9IHtOVUxMfTsKKworICAgIGNoYXIqIGNvbnN0KiBhcmd2cCA9IGNvbnN0X2Nhc3Q8Y2hhciogY29uc3QqPihhcmd2KTsKKyAgICBjaGFyKiBjb25zdCogZW52cHAgPSBjb25zdF9jYXN0PGNoYXIqIGNvbnN0Kj4oZW52cCk7CisKKyAgICBwaWRfdCBwaWQ7CisgICAgZXJybm8gPSBwb3NpeF9zcGF3bigmcGlkLCBhcmd2WzBdLCBOVUxMLCBOVUxMLCBhcmd2cCwgZW52cHApOworICAgIGlmICghZXJybm8pIHJldHVybiBwaWQ7CisKKyAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHNwYXduICciIDw8IGZpbGUgPDwgIiciOworCisgICAgcmV0dXJuIChwaWRfdCkwOwogfQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC04NiwyNCArODgsMjggQEAKIHZvaWQgU3RhcnRDb25zb2xlKGNvbnN0IHN0ZDo6c3RyaW5nJiBjbWRsaW5lKSB7CiAgICAgYm9vbCBjb25zb2xlID0gS2VybmVsQ29uc29sZVByZXNlbnQoY21kbGluZSk7CiAgICAgLy8gVXNlIGEgc2ltcGxlIHNpZ2NobGQgaGFuZGxlciAtLSBmaXJzdF9zdGFnZV9jb25zb2xlIGRvZXNuJ3QgbmVlZCB0byB0cmFjayBvciBsb2cgem9tYmllcwotICAgIGNvbnN0IHN0cnVjdCBzaWdhY3Rpb24gY2hsZF9hY3QgeyAuc2FfaGFuZGxlciA9IFNJR19ERkwsIC5zYV9mbGFncyA9IFNBX05PQ0xEV0FJVCB9OworICAgIGNvbnN0IHN0cnVjdCBzaWdhY3Rpb24gY2hsZF9hY3QgeworICAgICAgICAuc2FfZmxhZ3MgPSBTQV9OT0NMRFdBSVQsIC5zYV9oYW5kbGVyID0gU0lHX0RGTAorICAgIH07CiAKICAgICBzaWdhY3Rpb24oU0lHQ0hMRCwgJmNobGRfYWN0LCBudWxscHRyKTsKICAgICBwaWRfdCBwaWQgPSBmb3JrKCk7CiAgICAgaWYgKHBpZCAhPSAwKSB7Ci0gICAgICAgIGludCBzdGF0dXM7Ci0gICAgICAgIHdhaXRwaWQocGlkLCAmc3RhdHVzLCAwKTsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiY29uc29sZSBzaGVsbCBleGl0ZWQgd2l0aCBzdGF0dXMgIiA8PCBzdGF0dXM7CisgICAgICAgIHdhaXQoTlVMTCk7CisgICAgICAgIExPRyhFUlJPUikgPDwgImNvbnNvbGUgc2hlbGwgZXhpdGVkIjsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIGlmIChjb25zb2xlKSBjb25zb2xlID0gU2V0dXBDb25zb2xlKCk7Ci0gICAgUnVuU2NyaXB0KCk7CisKKyAgICBMT0coSU5GTykgPDwgIkF0dGVtcHRpbmcgdG8gcnVuIC9maXJzdF9zdGFnZS5zaC4uLiI7CisgICAgaWYgKFNwYXduSW1hZ2UoIi9maXJzdF9zdGFnZS5zaCIpKSB7CisgICAgICAgIHdhaXQoTlVMTCk7CisgICAgICAgIExPRyhJTkZPKSA8PCAiL2ZpcnN0X3N0YWdlLnNoIGV4aXRlZCI7CisgICAgfQorCiAgICAgaWYgKGNvbnNvbGUpIHsKLSAgICAgICAgY29uc3QgY2hhciogcGF0aCA9ICIvc3lzdGVtL2Jpbi9zaCI7Ci0gICAgICAgIGNvbnN0IGNoYXIqIGFyZ3NbXSA9IHtwYXRoLCBudWxscHRyfTsKLSAgICAgICAgaW50IHJ2ID0gZXhlY3YocGF0aCwgY29uc3RfY2FzdDxjaGFyKio+KGFyZ3MpKTsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAidW5hYmxlIHRvIGV4ZWN2LCByZXR1cm5lZCAiIDw8IHJ2IDw8ICIgZXJybm8gIiA8PCBlcnJubzsKKyAgICAgICAgaWYgKFNwYXduSW1hZ2UoIi9zeXN0ZW0vYmluL3NoIikpIHdhaXQoTlVMTCk7CiAgICAgfQogICAgIF9leGl0KDEyNyk7CiB9CmRpZmYgLS1naXQgYS9pbml0L2ZpcnN0X3N0YWdlX2luaXQuY3BwIGIvaW5pdC9maXJzdF9zdGFnZV9pbml0LmNwcAppbmRleCAxMDdlOTlhLi5lMDZhNjQ1IDEwMDY0NAotLS0gYS9pbml0L2ZpcnN0X3N0YWdlX2luaXQuY3BwCisrKyBiL2luaXQvZmlyc3Rfc3RhZ2VfaW5pdC5jcHAKQEAgLTMwLDExICszMCwxNSBAQAogI2luY2x1ZGUgPGNocm9ubz4KICNpbmNsdWRlIDxmaWxlc3lzdGVtPgogI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0aHJlYWQ+CiAjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2Nocm9ub191dGlscy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9hdmZfY2NfZmxhZ3MuaD4KKyNpbmNsdWRlIDxmc19tZ3IuaD4KICNpbmNsdWRlIDxtb2Rwcm9iZS9tb2Rwcm9iZS5oPgogI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgogCkBAIC01OCwxMCArNjIsMTYgQEAKIAogbmFtZXNwYWNlIHsKIAorZW51bSBjbGFzcyBCb290TW9kZSB7CisgICAgTk9STUFMX01PREUsCisgICAgUkVDT1ZFUllfTU9ERSwKKyAgICBDSEFSR0VSX01PREUsCit9OworCiB2b2lkIEZyZWVSYW1kaXNrKERJUiogZGlyLCBkZXZfdCBkZXYpIHsKICAgICBpbnQgZGZkID0gZGlyZmQoZGlyKTsKIAotICAgIGRpcmVudCogZGU7CisgICAgZGlyZW50KiBkZSA9IG51bGxwdHI7CiAgICAgd2hpbGUgKChkZSA9IHJlYWRkaXIoZGlyKSkgIT0gbnVsbHB0cikgewogICAgICAgICBpZiAoZGUtPmRfbmFtZSA9PSAiLiJzIHx8IGRlLT5kX25hbWUgPT0gIi4uInMpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtNzAsNyArODAsNyBAQAogICAgICAgICBib29sIGlzX2RpciA9IGZhbHNlOwogCiAgICAgICAgIGlmIChkZS0+ZF90eXBlID09IERUX0RJUiB8fCBkZS0+ZF90eXBlID09IERUX1VOS05PV04pIHsKLSAgICAgICAgICAgIHN0cnVjdCBzdGF0IGluZm87CisgICAgICAgICAgICBzdHJ1Y3Qgc3RhdCBpbmZvIHt9OwogICAgICAgICAgICAgaWYgKGZzdGF0YXQoZGZkLCBkZS0+ZF9uYW1lLCAmaW5mbywgQVRfU1lNTElOS19OT0ZPTExPVykgIT0gMCkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQpAQCAtMTQ3LDE1ICsxNTcsNTMgQEAKICAgICAgICAgQ29weShzbmFwdXNlcmQsIGRzdCk7CiAgICAgfQogfQorCitzdGQ6OnN0cmluZyBHZXRQYWdlU2l6ZVN1ZmZpeCgpIHsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IHBhZ2Vfc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VfU0laRSk7CisgICAgaWYgKHBhZ2Vfc2l6ZSA8PSA0MDk2KSB7CisgICAgICAgIHJldHVybiAiIjsKKyAgICB9CisgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigiXyV6dWsiLCBwYWdlX3NpemUgLyAxMDI0KTsKK30KKworY29uc3RleHByIGJvb2wgRW5kc1dpdGgoY29uc3Qgc3RkOjpzdHJpbmdfdmlldyBzdHIsIGNvbnN0IHN0ZDo6c3RyaW5nX3ZpZXcgc3VmZml4KSB7CisgICAgcmV0dXJuIHN0ci5zaXplKCkgPj0gc3VmZml4LnNpemUoKSAmJgorICAgICAgICAgICAwID09IHN0ci5jb21wYXJlKHN0ci5zaXplKCkgLSBzdWZmaXguc2l6ZSgpLCBzdWZmaXguc2l6ZSgpLCBzdWZmaXgpOworfQorCitjb25zdGV4cHIgc3RkOjpzdHJpbmdfdmlldyBHZXRQYWdlU2l6ZVN1ZmZpeChzdGQ6OnN0cmluZ192aWV3IGRpcm5hbWUpIHsKKyAgICBpZiAoRW5kc1dpdGgoZGlybmFtZSwgIl8xNmsiKSkgeworICAgICAgICByZXR1cm4gIl8xNmsiOworICAgIH0KKyAgICBpZiAoRW5kc1dpdGgoZGlybmFtZSwgIl82NGsiKSkgeworICAgICAgICByZXR1cm4gIl82NGsiOworICAgIH0KKyAgICByZXR1cm4gIiI7Cit9CisKIH0gIC8vIG5hbWVzcGFjZQogCi1zdGQ6OnN0cmluZyBHZXRNb2R1bGVMb2FkTGlzdChib29sIHJlY292ZXJ5LCBjb25zdCBzdGQ6OnN0cmluZyYgZGlyX3BhdGgpIHsKLSAgICBhdXRvIG1vZHVsZV9sb2FkX2ZpbGUgPSAibW9kdWxlcy5sb2FkIjsKLSAgICBpZiAocmVjb3ZlcnkpIHsKLSAgICAgICAgc3RydWN0IHN0YXQgZmlsZVN0YXQ7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHJlY292ZXJ5X2xvYWRfcGF0aCA9IGRpcl9wYXRoICsgIi9tb2R1bGVzLmxvYWQucmVjb3ZlcnkiOwotICAgICAgICBpZiAoIXN0YXQocmVjb3ZlcnlfbG9hZF9wYXRoLmNfc3RyKCksICZmaWxlU3RhdCkpIHsKK3N0ZDo6c3RyaW5nIEdldE1vZHVsZUxvYWRMaXN0KEJvb3RNb2RlIGJvb3RfbW9kZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGRpcl9wYXRoKSB7CisgICAgc3RkOjpzdHJpbmcgbW9kdWxlX2xvYWRfZmlsZTsKKworICAgIHN3aXRjaCAoYm9vdF9tb2RlKSB7CisgICAgICAgIGNhc2UgQm9vdE1vZGU6Ok5PUk1BTF9NT0RFOgorICAgICAgICAgICAgbW9kdWxlX2xvYWRfZmlsZSA9ICJtb2R1bGVzLmxvYWQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQm9vdE1vZGU6OlJFQ09WRVJZX01PREU6CiAgICAgICAgICAgICBtb2R1bGVfbG9hZF9maWxlID0gIm1vZHVsZXMubG9hZC5yZWNvdmVyeSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCb290TW9kZTo6Q0hBUkdFUl9NT0RFOgorICAgICAgICAgICAgbW9kdWxlX2xvYWRfZmlsZSA9ICJtb2R1bGVzLmxvYWQuY2hhcmdlciI7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAobW9kdWxlX2xvYWRfZmlsZSAhPSAibW9kdWxlcy5sb2FkIikgeworICAgICAgICBzdHJ1Y3Qgc3RhdCBmaWxlU3RhdCB7fTsKKyAgICAgICAgc3RkOjpzdHJpbmcgbG9hZF9wYXRoID0gZGlyX3BhdGggKyAiLyIgKyBtb2R1bGVfbG9hZF9maWxlOworICAgICAgICAvLyBGYWxsIGJhY2sgdG8gbW9kdWxlcy5sb2FkIGlmIHRoZSBvdGhlciBmaWxlcyBhcmVuJ3QgYWNjZXNzaWJsZQorICAgICAgICBpZiAoc3RhdChsb2FkX3BhdGguY19zdHIoKSwgJmZpbGVTdGF0KSkgeworICAgICAgICAgICAgbW9kdWxlX2xvYWRfZmlsZSA9ICJtb2R1bGVzLmxvYWQiOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNjMsMTIgKzIxMSwxMyBAQAogfQogCiAjZGVmaW5lIE1PRFVMRV9CQVNFX0RJUiAiL2xpYi9tb2R1bGVzIgotYm9vbCBMb2FkS2VybmVsTW9kdWxlcyhib29sIHJlY292ZXJ5LCBib29sIHdhbnRfY29uc29sZSwgYm9vbCB3YW50X3BhcmFsbGVsLCBpbnQmIG1vZHVsZXNfbG9hZGVkKSB7Ci0gICAgc3RydWN0IHV0c25hbWUgdXRzOworYm9vbCBMb2FkS2VybmVsTW9kdWxlcyhCb290TW9kZSBib290X21vZGUsIGJvb2wgd2FudF9jb25zb2xlLCBib29sIHdhbnRfcGFyYWxsZWwsCisgICAgICAgICAgICAgICAgICAgICAgIGludCYgbW9kdWxlc19sb2FkZWQpIHsKKyAgICBzdHJ1Y3QgdXRzbmFtZSB1dHMge307CiAgICAgaWYgKHVuYW1lKCZ1dHMpKSB7CiAgICAgICAgIExPRyhGQVRBTCkgPDwgIkZhaWxlZCB0byBnZXQga2VybmVsIHZlcnNpb24uIjsKICAgICB9Ci0gICAgaW50IG1ham9yLCBtaW5vcjsKKyAgICBpbnQgbWFqb3IgPSAwLCBtaW5vciA9IDA7CiAgICAgaWYgKHNzY2FuZih1dHMucmVsZWFzZSwgIiVkLiVkIiwgJm1ham9yLCAmbWlub3IpICE9IDIpIHsKICAgICAgICAgTE9HKEZBVEFMKSA8PCAiRmFpbGVkIHRvIHBhcnNlIGtlcm5lbCB2ZXJzaW9uICIgPDwgdXRzLnJlbGVhc2U7CiAgICAgfQpAQCAtMTc4LDEzICsyMjcsMzAgQEAKICAgICAgICAgTE9HKElORk8pIDw8ICJVbmFibGUgdG8gb3BlbiAvbGliL21vZHVsZXMsIHNraXBwaW5nIG1vZHVsZSBsb2FkaW5nLiI7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICBkaXJlbnQqIGVudHJ5OworICAgIGRpcmVudCogZW50cnkgPSBudWxscHRyOwogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtb2R1bGVfZGlyczsKKyAgICBjb25zdCBhdXRvIHBhZ2Vfc2l6ZV9zdWZmaXggPSBHZXRQYWdlU2l6ZVN1ZmZpeCgpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlbGVhc2Vfc3BlY2lmaWNfbW9kdWxlX2RpciA9IHV0cy5yZWxlYXNlICsgcGFnZV9zaXplX3N1ZmZpeDsKICAgICB3aGlsZSAoKGVudHJ5ID0gcmVhZGRpcihiYXNlX2Rpci5nZXQoKSkpKSB7CiAgICAgICAgIGlmIChlbnRyeS0+ZF90eXBlICE9IERUX0RJUikgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgaW50IGRpcl9tYWpvciwgZGlyX21pbm9yOworICAgICAgICBpZiAoZW50cnktPmRfbmFtZSA9PSByZWxlYXNlX3NwZWNpZmljX21vZHVsZV9kaXIpIHsKKyAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiUmVsZWFzZSBzcGVjaWZpYyBrZXJuZWwgbW9kdWxlIGRpciAiIDw8IHJlbGVhc2Vfc3BlY2lmaWNfbW9kdWxlX2RpcgorICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZm91bmQsIGxvYWRpbmcgbW9kdWxlcyBmcm9tIGhlcmUgd2l0aCBubyBmYWxsYmFja3MuIjsKKyAgICAgICAgICAgIG1vZHVsZV9kaXJzLmNsZWFyKCk7CisgICAgICAgICAgICBtb2R1bGVfZGlycy5lbXBsYWNlX2JhY2soZW50cnktPmRfbmFtZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyBJcyBhIGRpcmVjdG9yeSBkb2VzIG5vdCBoYXZlIHBhZ2Ugc2l6ZSBzdWZmaXgsIGl0IGRvZXMgbm90IG1lYW4gdGhpcyBkaXJlY3RvcnkgaXMgZm9yIDRLCisgICAgICAgIC8vIGtlcm5lbHMuIENlcnRhaW4gMTZLIGtlcm5lbCBidWlsZHMgcHV0IGFsbCBtb2R1bGVzIGluIC9saWIvbW9kdWxlcy9gdW5hbWUgLXJgIHdpdGhvdXQgYW55CisgICAgICAgIC8vIHN1ZmZpeC4gVGhlcmVmb3JlLCBvbmx5IGlnbm9yZSBhIGRpcmVjdG9yeSBpZiBpdCBoYXMgXzE2ay9fNjRrIHN1ZmZpeCBhbmQgdGhlIHN1ZmZpeCBkb2VzCisgICAgICAgIC8vIG5vdCBtYXRjaCBzeXN0ZW0gcGFnZSBzaXplLgorICAgICAgICBjb25zdCBhdXRvIGRpcl9wYWdlX3NpemVfc3VmZml4ID0gR2V0UGFnZVNpemVTdWZmaXgoZW50cnktPmRfbmFtZSk7CisgICAgICAgIGlmICghZGlyX3BhZ2Vfc2l6ZV9zdWZmaXguZW1wdHkoKSAmJiBkaXJfcGFnZV9zaXplX3N1ZmZpeCAhPSBwYWdlX3NpemVfc3VmZml4KSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpbnQgZGlyX21ham9yID0gMCwgZGlyX21pbm9yID0gMDsKICAgICAgICAgaWYgKHNzY2FuZihlbnRyeS0+ZF9uYW1lLCAiJWQuJWQiLCAmZGlyX21ham9yLCAmZGlyX21pbm9yKSAhPSAyIHx8IGRpcl9tYWpvciAhPSBtYWpvciB8fAogICAgICAgICAgICAgZGlyX21pbm9yICE9IG1pbm9yKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTIwMywyNCArMjY5LDY3IEBACiAgICAgZm9yIChjb25zdCBhdXRvJiBtb2R1bGVfZGlyIDogbW9kdWxlX2RpcnMpIHsKICAgICAgICAgc3RkOjpzdHJpbmcgZGlyX3BhdGggPSBNT0RVTEVfQkFTRV9ESVIgIi8iOwogICAgICAgICBkaXJfcGF0aC5hcHBlbmQobW9kdWxlX2Rpcik7Ci0gICAgICAgIE1vZHByb2JlIG0oe2Rpcl9wYXRofSwgR2V0TW9kdWxlTG9hZExpc3QocmVjb3ZlcnksIGRpcl9wYXRoKSk7CisgICAgICAgIE1vZHByb2JlIG0oe2Rpcl9wYXRofSwgR2V0TW9kdWxlTG9hZExpc3QoYm9vdF9tb2RlLCBkaXJfcGF0aCkpOwogICAgICAgICBib29sIHJldHZhbCA9IG0uTG9hZExpc3RlZE1vZHVsZXMoIXdhbnRfY29uc29sZSk7CiAgICAgICAgIG1vZHVsZXNfbG9hZGVkID0gbS5HZXRNb2R1bGVDb3VudCgpOwogICAgICAgICBpZiAobW9kdWxlc19sb2FkZWQgPiAwKSB7CisgICAgICAgICAgICBMT0coSU5GTykgPDwgIkxvYWRlZCAiIDw8IG1vZHVsZXNfbG9hZGVkIDw8ICIgbW9kdWxlcyBmcm9tICIgPDwgZGlyX3BhdGg7CiAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwogICAgICAgICB9CiAgICAgfQogCi0gICAgTW9kcHJvYmUgbSh7TU9EVUxFX0JBU0VfRElSfSwgR2V0TW9kdWxlTG9hZExpc3QocmVjb3ZlcnksIE1PRFVMRV9CQVNFX0RJUikpOworICAgIE1vZHByb2JlIG0oe01PRFVMRV9CQVNFX0RJUn0sIEdldE1vZHVsZUxvYWRMaXN0KGJvb3RfbW9kZSwgTU9EVUxFX0JBU0VfRElSKSk7CiAgICAgYm9vbCByZXR2YWwgPSAod2FudF9wYXJhbGxlbCkgPyBtLkxvYWRNb2R1bGVzUGFyYWxsZWwoc3RkOjp0aHJlYWQ6OmhhcmR3YXJlX2NvbmN1cnJlbmN5KCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtLkxvYWRMaXN0ZWRNb2R1bGVzKCF3YW50X2NvbnNvbGUpOwogICAgIG1vZHVsZXNfbG9hZGVkID0gbS5HZXRNb2R1bGVDb3VudCgpOwogICAgIGlmIChtb2R1bGVzX2xvYWRlZCA+IDApIHsKKyAgICAgICAgTE9HKElORk8pIDw8ICJMb2FkZWQgIiA8PCBtb2R1bGVzX2xvYWRlZCA8PCAiIG1vZHVsZXMgZnJvbSAiIDw8IE1PRFVMRV9CQVNFX0RJUjsKICAgICAgICAgcmV0dXJuIHJldHZhbDsKICAgICB9CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK3N0YXRpYyBib29sIElzQ2hhcmdlck1vZGUoY29uc3Qgc3RkOjpzdHJpbmcmIGNtZGxpbmUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBib290Y29uZmlnKSB7CisgICAgcmV0dXJuIGJvb3Rjb25maWcuZmluZCgiYW5kcm9pZGJvb3QubW9kZSA9IFwiY2hhcmdlclwiIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MgfHwKKyAgICAgICAgICAgIGNtZGxpbmUuZmluZCgiYW5kcm9pZGJvb3QubW9kZT1jaGFyZ2VyIikgIT0gc3RkOjpzdHJpbmc6Om5wb3M7Cit9CisKK3N0YXRpYyBCb290TW9kZSBHZXRCb290TW9kZShjb25zdCBzdGQ6OnN0cmluZyYgY21kbGluZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGJvb3Rjb25maWcpCit7CisgICAgaWYgKElzQ2hhcmdlck1vZGUoY21kbGluZSwgYm9vdGNvbmZpZykpCisgICAgICAgIHJldHVybiBCb290TW9kZTo6Q0hBUkdFUl9NT0RFOworICAgIGVsc2UgaWYgKElzUmVjb3ZlcnlNb2RlKCkgJiYgIUZvcmNlTm9ybWFsQm9vdChjbWRsaW5lLCBib290Y29uZmlnKSkKKyAgICAgICAgcmV0dXJuIEJvb3RNb2RlOjpSRUNPVkVSWV9NT0RFOworCisgICAgcmV0dXJuIEJvb3RNb2RlOjpOT1JNQUxfTU9ERTsKK30KKworc3RhdGljIHZvaWQgTWF5YmVSZXN1bWVGcm9tSGliZXJuYXRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGJvb3Rjb25maWcpIHsKKyAgICBzdGQ6OnN0cmluZyBoaWJlcm5hdGlvblJlc3VtZURldmljZTsKKyAgICBhbmRyb2lkOjpmc19tZ3I6OkdldEJvb3Rjb25maWdGcm9tU3RyaW5nKGJvb3Rjb25maWcsICJhbmRyb2lkYm9vdC5oaWJlcm5hdGlvbl9yZXN1bWVfZGV2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoaWJlcm5hdGlvblJlc3VtZURldmljZSk7CisgICAgaWYgKCFoaWJlcm5hdGlvblJlc3VtZURldmljZS5lbXB0eSgpKSB7CisgICAgICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBmZChvcGVuKCIvc3lzL3Bvd2VyL3Jlc3VtZSIsIE9fUkRXUiB8IE9fQ0xPRVhFQykpOworICAgICAgICBpZiAoZmQgPj0gMCkgeworICAgICAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpXcml0ZVN0cmluZ1RvRmQoaGliZXJuYXRpb25SZXN1bWVEZXZpY2UsIGZkKSkgeworICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gd3JpdGUgdG8gL3N5cy9wb3dlci9yZXN1bWUiOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBvcGVuIC9zeXMvcG93ZXIvcmVzdW1lIjsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxGaXJzdFN0YWdlTW91bnQ+IENyZWF0ZUZpcnN0U3RhZ2VNb3VudChjb25zdCBzdGQ6OnN0cmluZyYgY21kbGluZSkgeworICAgIGF1dG8gcmV0ID0gRmlyc3RTdGFnZU1vdW50OjpDcmVhdGUoY21kbGluZSk7CisgICAgaWYgKHJldC5vaygpKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoKnJldCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBGaXJzdFN0YWdlTW91bnQgOiAiIDw8IHJldC5lcnJvcigpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9Cit9CisKIGludCBGaXJzdFN0YWdlTWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKICAgICBpZiAoUkVCT09UX0JPT1RMT0FERVJfT05fUEFOSUMpIHsKICAgICAgICAgSW5zdGFsbFJlYm9vdFNpZ25hbEhhbmRsZXJzKCk7CkBAIC0yOTQsNyArNDAzLDEyIEBACiAgICAgLy8gL3NlY29uZF9zdGFnZV9yZXNvdXJjZXMgaXMgdXNlZCB0byBwcmVzZXJ2ZSBmaWxlcyBmcm9tIGZpcnN0IHRvIHNlY29uZAogICAgIC8vIHN0YWdlIGluaXQKICAgICBDSEVDS0NBTEwobW91bnQoInRtcGZzIiwga1NlY29uZFN0YWdlUmVzLCAidG1wZnMiLCBNU19OT0VYRUMgfCBNU19OT1NVSUQgfCBNU19OT0RFViwKLSAgICAgICAgICAgICAgICAgICAgIm1vZGU9MDc1NSx1aWQ9MCxnaWQ9MCIpKQorICAgICAgICAgICAgICAgICAgICAibW9kZT0wNzU1LHVpZD0wLGdpZD0wIikpOworCisgICAgaWYgKElzTWljcm9kcm9pZCgpICYmIGFuZHJvaWQ6OnZpcnR1YWxpemF0aW9uOjpJc09wZW5EaWNlQ2hhbmdlc0ZsYWdFbmFibGVkKCkpIHsKKyAgICAgICAgQ0hFQ0tDQUxMKG1vdW50KCJ0bXBmcyIsICIvbWljcm9kcm9pZF9yZXNvdXJjZXMiLCAidG1wZnMiLCBNU19OT0VYRUMgfCBNU19OT1NVSUQgfCBNU19OT0RFViwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtb2RlPTA3NTAsdWlkPTAsZ2lkPTAiKSk7CisgICAgfQogI3VuZGVmIENIRUNLQ0FMTAogCiAgICAgU2V0U3RkaW9Ub0Rldk51bGwoYXJndik7CkBAIC0zMTYsNyArNDMwLDcgQEAKICAgICAgICAgUExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBvcGVuZGlyKFwiL1wiKSwgbm90IGZyZWVpbmcgcmFtZGlzayI7CiAgICAgfQogCi0gICAgc3RydWN0IHN0YXQgb2xkX3Jvb3RfaW5mbzsKKyAgICBzdHJ1Y3Qgc3RhdCBvbGRfcm9vdF9pbmZvIHt9OwogICAgIGlmIChzdGF0KCIvIiwgJm9sZF9yb290X2luZm8pICE9IDApIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBzdGF0KFwiL1wiKSwgbm90IGZyZWVpbmcgcmFtZGlzayI7CiAgICAgICAgIG9sZF9yb290X2Rpci5yZXNldCgpOwpAQCAtMzI4LDcgKzQ0Miw4IEBACiAKICAgICBib290X2Nsb2NrOjp0aW1lX3BvaW50IG1vZHVsZV9zdGFydF90aW1lID0gYm9vdF9jbG9jazo6bm93KCk7CiAgICAgaW50IG1vZHVsZV9jb3VudCA9IDA7Ci0gICAgaWYgKCFMb2FkS2VybmVsTW9kdWxlcyhJc1JlY292ZXJ5TW9kZSgpICYmICFGb3JjZU5vcm1hbEJvb3QoY21kbGluZSwgYm9vdGNvbmZpZyksIHdhbnRfY29uc29sZSwKKyAgICBCb290TW9kZSBib290X21vZGUgPSBHZXRCb290TW9kZShjbWRsaW5lLCBib290Y29uZmlnKTsKKyAgICBpZiAoIUxvYWRLZXJuZWxNb2R1bGVzKGJvb3RfbW9kZSwgd2FudF9jb25zb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FudF9wYXJhbGxlbCwgbW9kdWxlX2NvdW50KSkgewogICAgICAgICBpZiAod2FudF9jb25zb2xlICE9IEZpcnN0U3RhZ2VDb25zb2xlUGFyYW06OkRJU0FCTEVEKSB7CiAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gbG9hZCBrZXJuZWwgbW9kdWxlcywgc3RhcnRpbmcgY29uc29sZSI7CkBAIC0zNDQsMTIgKzQ1OSwxOSBAQAogICAgICAgICAgICAgICAgICAgPDwgbW9kdWxlX2VsYXBzZV90aW1lLmNvdW50KCkgPDwgIiBtcyI7CiAgICAgfQogCisgICAgTWF5YmVSZXN1bWVGcm9tSGliZXJuYXRpb24oYm9vdGNvbmZpZyk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Rmlyc3RTdGFnZU1vdW50PiBmc207CisKICAgICBib29sIGNyZWF0ZWRfZGV2aWNlcyA9IGZhbHNlOwogICAgIGlmICh3YW50X2NvbnNvbGUgPT0gRmlyc3RTdGFnZUNvbnNvbGVQYXJhbTo6Q09OU09MRV9PTl9GQUlMVVJFKSB7CiAgICAgICAgIGlmICghSXNSZWNvdmVyeU1vZGUoKSkgewotICAgICAgICAgICAgY3JlYXRlZF9kZXZpY2VzID0gRG9DcmVhdGVEZXZpY2VzKCk7Ci0gICAgICAgICAgICBpZiAoIWNyZWF0ZWRfZGV2aWNlcykgewotICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBjcmVhdGUgZGV2aWNlIG5vZGVzIGVhcmx5IjsKKyAgICAgICAgICAgIGZzbSA9IENyZWF0ZUZpcnN0U3RhZ2VNb3VudChjbWRsaW5lKTsKKyAgICAgICAgICAgIGlmIChmc20pIHsKKyAgICAgICAgICAgICAgICBjcmVhdGVkX2RldmljZXMgPSBmc20tPkRvQ3JlYXRlRGV2aWNlcygpOworICAgICAgICAgICAgICAgIGlmICghY3JlYXRlZF9kZXZpY2VzKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBjcmVhdGUgZGV2aWNlIG5vZGVzIGVhcmx5IjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgU3RhcnRDb25zb2xlKGNtZGxpbmUpOwpAQCAtNDAwLDExICs1MjIsMjYgQEAKICAgICAgICAgU3dpdGNoUm9vdCgiL2ZpcnN0X3N0YWdlX3JhbWRpc2siKTsKICAgICB9CiAKLSAgICBpZiAoIURvRmlyc3RTdGFnZU1vdW50KCFjcmVhdGVkX2RldmljZXMpKSB7Ci0gICAgICAgIExPRyhGQVRBTCkgPDwgIkZhaWxlZCB0byBtb3VudCByZXF1aXJlZCBwYXJ0aXRpb25zIGVhcmx5IC4uLiI7CisgICAgaWYgKElzUmVjb3ZlcnlNb2RlKCkpIHsKKyAgICAgICAgTE9HKElORk8pIDw8ICJGaXJzdCBzdGFnZSBtb3VudCBza2lwcGVkIChyZWNvdmVyeSBtb2RlKSI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFmc20pIHsKKyAgICAgICAgICAgIGZzbSA9IENyZWF0ZUZpcnN0U3RhZ2VNb3VudChjbWRsaW5lKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWZzbSkgeworICAgICAgICAgICAgTE9HKEZBVEFMKSA8PCAiRmlyc3RTdGFnZU1vdW50IG5vdCBhdmFpbGFibGUiOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFjcmVhdGVkX2RldmljZXMgJiYgIWZzbS0+RG9DcmVhdGVEZXZpY2VzKCkpIHsKKyAgICAgICAgICAgIExPRyhGQVRBTCkgPDwgIkZhaWxlZCB0byBjcmVhdGUgZGV2aWNlcyByZXF1aXJlZCBmb3IgZmlyc3Qgc3RhZ2UgbW91bnQiOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFmc20tPkRvRmlyc3RTdGFnZU1vdW50KCkpIHsKKyAgICAgICAgICAgIExPRyhGQVRBTCkgPDwgIkZhaWxlZCB0byBtb3VudCByZXF1aXJlZCBwYXJ0aXRpb25zIGVhcmx5IC4uLiI7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBzdHJ1Y3Qgc3RhdCBuZXdfcm9vdF9pbmZvOworICAgIHN0cnVjdCBzdGF0IG5ld19yb290X2luZm8ge307CiAgICAgaWYgKHN0YXQoIi8iLCAmbmV3X3Jvb3RfaW5mbykgIT0gMCkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IHN0YXQoXCIvXCIpLCBub3QgZnJlZWluZyByYW1kaXNrIjsKICAgICAgICAgb2xkX3Jvb3RfZGlyLnJlc2V0KCk7CmRpZmYgLS1naXQgYS9pbml0L2ZpcnN0X3N0YWdlX21vdW50LmNwcCBiL2luaXQvZmlyc3Rfc3RhZ2VfbW91bnQuY3BwCmluZGV4IDA3Y2U0NTguLmFhNmI1NTEgMTAwNjQ0Ci0tLSBhL2luaXQvZmlyc3Rfc3RhZ2VfbW91bnQuY3BwCisrKyBiL2luaXQvZmlyc3Rfc3RhZ2VfbW91bnQuY3BwCkBAIC0xNiw2ICsxNiw3IEBACiAKICNpbmNsdWRlICJmaXJzdF9zdGFnZV9tb3VudC5oIgogCisjaW5jbHVkZSA8c2lnbmFsLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3lzL21vdW50Lmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CkBAIC0zMSw4ICszMiwxMiBAQAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9jaHJvbm9fdXRpbHMuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3BhcnNlaW50Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9hdmZfY2NfZmxhZ3MuaD4KKyNpbmNsdWRlIDxib290bG9hZGVyX21lc3NhZ2UvYm9vdGxvYWRlcl9tZXNzYWdlLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2FuZHJvaWRfcmVib290Lmg+CiAjaW5jbHVkZSA8ZnNfYXZiL2ZzX2F2Yi5oPgogI2luY2x1ZGUgPGZzX21nci5oPgogI2luY2x1ZGUgPGZzX21ncl9kbV9saW5lYXIuaD4KQEAgLTQ0LDYgKzQ5LDcgQEAKIAogI2luY2x1ZGUgImJsb2NrX2Rldl9pbml0aWFsaXplci5oIgogI2luY2x1ZGUgImRldmljZXMuaCIKKyNpbmNsdWRlICJyZWJvb3RfdXRpbHMuaCIKICNpbmNsdWRlICJyZXN1bHQuaCIKICNpbmNsdWRlICJzbmFwdXNlcmRfdHJhbnNpdGlvbi5oIgogI2luY2x1ZGUgInN3aXRjaF9yb290LmgiCkBAIC03NiwyMSArODIsMjEgQEAKIAogLy8gQ2xhc3MgRGVjbGFyYXRpb25zCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0KLWNsYXNzIEZpcnN0U3RhZ2VNb3VudCB7CitjbGFzcyBGaXJzdFN0YWdlTW91bnRWQm9vdFYyIDogcHVibGljIEZpcnN0U3RhZ2VNb3VudCB7CiAgIHB1YmxpYzoKLSAgICBGaXJzdFN0YWdlTW91bnQoRnN0YWIgZnN0YWIpOwotICAgIHZpcnR1YWwgfkZpcnN0U3RhZ2VNb3VudCgpID0gZGVmYXVsdDsKKyAgICBmcmllbmQgdm9pZCBTZXRJbml0QXZiVmVyc2lvbkluUmVjb3ZlcnkoKTsKIAotICAgIC8vIFRoZSBmYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBGaXJzdFN0YWdlTW91bnRWQm9vdFYyIGluc3RhbmNlLgotICAgIHN0YXRpYyBSZXN1bHQ8c3RkOjp1bmlxdWVfcHRyPEZpcnN0U3RhZ2VNb3VudD4+IENyZWF0ZSgpOwotICAgIGJvb2wgRG9DcmVhdGVEZXZpY2VzKCk7ICAgIC8vIENyZWF0ZXMgZGV2aWNlcyBhbmQgbG9naWNhbCBwYXJ0aXRpb25zIGZyb20gc3RvcmFnZSBkZXZpY2VzCi0gICAgYm9vbCBEb0ZpcnN0U3RhZ2VNb3VudCgpOyAgLy8gTW91bnRzIGZzdGFiIGVudHJpZXMgcmVhZCBmcm9tIGRldmljZSB0cmVlLgorICAgIEZpcnN0U3RhZ2VNb3VudFZCb290VjIoRnN0YWIgZnN0YWIpOworICAgIHZpcnR1YWwgfkZpcnN0U3RhZ2VNb3VudFZCb290VjIoKSA9IGRlZmF1bHQ7CisKKyAgICBib29sIERvQ3JlYXRlRGV2aWNlcygpIG92ZXJyaWRlOworICAgIGJvb2wgRG9GaXJzdFN0YWdlTW91bnQoKSBvdmVycmlkZTsKKworICBwcml2YXRlOgogICAgIGJvb2wgSW5pdERldmljZXMoKTsKLQotICBwcm90ZWN0ZWQ6CiAgICAgYm9vbCBJbml0UmVxdWlyZWREZXZpY2VzKHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBkZXZpY2VzKTsKICAgICBib29sIENyZWF0ZUxvZ2ljYWxQYXJ0aXRpb25zKCk7Ci0gICAgYm9vbCBDcmVhdGVTbmFwc2hvdFBhcnRpdGlvbnMoYW5kcm9pZDo6c25hcHNob3Q6OlNuYXBzaG90TWFuYWdlciogc20pOworICAgIGJvb2wgQ3JlYXRlU25hcHNob3RQYXJ0aXRpb25zKFNuYXBzaG90TWFuYWdlciogc20pOwogICAgIGJvb2wgTW91bnRQYXJ0aXRpb24oY29uc3QgRnN0YWI6Oml0ZXJhdG9yJiBiZWdpbiwgYm9vbCBlcmFzZV9zYW1lX21vdW50cywKICAgICAgICAgICAgICAgICAgICAgICAgIEZzdGFiOjppdGVyYXRvciogZW5kID0gbnVsbHB0cik7CiAKQEAgLTEwNiw5ICsxMTIsMTIgQEAKICAgICAvLyByZXZvY2F0aW9uIGNoZWNrIGJ5IERTVSBpbnN0YWxsYXRpb24gc2VydmljZS4KICAgICB2b2lkIENvcHlEc3VBdmJLZXlzKCk7CiAKLSAgICAvLyBQdXJlIHZpcnR1YWwgZnVuY3Rpb25zLgotICAgIHZpcnR1YWwgYm9vbCBHZXREbVZlcml0eURldmljZXMoc3RkOjpzZXQ8c3RkOjpzdHJpbmc+KiBkZXZpY2VzKSA9IDA7Ci0gICAgdmlydHVhbCBib29sIFNldFVwRG1WZXJpdHkoRnN0YWJFbnRyeSogZnN0YWJfZW50cnkpID0gMDsKKyAgICBib29sIEdldERtVmVyaXR5RGV2aWNlcyhzdGQ6OnNldDxzdGQ6OnN0cmluZz4qIGRldmljZXMpOworICAgIGJvb2wgU2V0VXBEbVZlcml0eShGc3RhYkVudHJ5KiBmc3RhYl9lbnRyeSk7CisKKyAgICB2b2lkIFJlcXVlc3RUcmFkZUluTW9kZVdpcGVJZk5lZWRlZCgpOworCisgICAgYm9vbCBJbml0QXZiSGFuZGxlKCk7CiAKICAgICBib29sIG5lZWRfZG1fdmVyaXR5XzsKICAgICBib29sIGRzdV9ub3Rfb25fdXNlcmRhdGFfID0gZmFsc2U7CkBAIC0xMjIsMTkgKzEzMSw2IEBACiAgICAgLy8gUmVhZHMgYWxsIEFWQiBrZXlzIGJlZm9yZSBjaHJvb3QgaW50byAvc3lzdGVtLCBhcyB0aGV5IG1pZ2h0IGJlIHVzZWQKICAgICAvLyBsYXRlciB3aGVuIG1vdW50aW5nIG90aGVyIHBhcnRpdGlvbnMsIGUuZy4sIC92ZW5kb3IgYW5kIC9wcm9kdWN0LgogICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+IHByZWxvYWRfYXZiX2tleV9ibG9ic187Ci19OwotCi1jbGFzcyBGaXJzdFN0YWdlTW91bnRWQm9vdFYyIDogcHVibGljIEZpcnN0U3RhZ2VNb3VudCB7Ci0gIHB1YmxpYzoKLSAgICBmcmllbmQgdm9pZCBTZXRJbml0QXZiVmVyc2lvbkluUmVjb3ZlcnkoKTsKLQotICAgIEZpcnN0U3RhZ2VNb3VudFZCb290VjIoRnN0YWIgZnN0YWIpOwotICAgIH5GaXJzdFN0YWdlTW91bnRWQm9vdFYyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwotCi0gIHByb3RlY3RlZDoKLSAgICBib29sIEdldERtVmVyaXR5RGV2aWNlcyhzdGQ6OnNldDxzdGQ6OnN0cmluZz4qIGRldmljZXMpIG92ZXJyaWRlOwotICAgIGJvb2wgU2V0VXBEbVZlcml0eShGc3RhYkVudHJ5KiBmc3RhYl9lbnRyeSkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBJbml0QXZiSGFuZGxlKCk7CiAKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdmJtZXRhX3BhcnRpdGlvbnNfOwogICAgIEF2YlVuaXF1ZVB0ciBhdmJfaGFuZGxlXzsKQEAgLTE1MCw3ICsxNDYsNyBAQAogICAgIHJldHVybiBpc19hbmRyb2lkX2R0X3ZhbHVlX2V4cGVjdGVkKCJ2Ym1ldGEvY29tcGF0aWJsZSIsICJhbmRyb2lkLHZibWV0YSIpOwogfQogCi1zdGF0aWMgUmVzdWx0PEZzdGFiPiBSZWFkRmlyc3RTdGFnZUZzdGFiKCkgeworc3RhdGljIFJlc3VsdDxGc3RhYj4gUmVhZEZpcnN0U3RhZ2VGc3RhYkFuZHJvaWQoKSB7CiAgICAgRnN0YWIgZnN0YWI7CiAgICAgaWYgKCFSZWFkRnN0YWJGcm9tRHQoJmZzdGFiKSkgewogICAgICAgICBpZiAoUmVhZERlZmF1bHRGc3RhYigmZnN0YWIpKSB7CkBAIC0xNjYsNiArMTYyLDI0IEBACiAgICAgcmV0dXJuIGZzdGFiOwogfQogCisvLyBOb3RlOiB0aGlzIGlzIGEgdGVtcG9yYXJ5IHNvbHV0aW9uIHRvIGF2b2lkIGJsb2NraW5nIGRldnMgdGhhdCBkZXBlbmQgb24gL3ZlbmRvciBwYXJ0aXRpb24gaW4KKy8vIE1pY3JvZHJvaWQuIEZvciB0aGUgcHJvcGVyIHNvbHV0aW9uIHRoZSAvdmVuZG9yIGZzdGFiIHNob3VsZCBwcm9iYWJseSBiZSBkZWZpbmVkIGluIHRoZSBEVC4KKy8vIFRPRE8oYi8yODU4NTU0MzApOiByZWZhY3RvciB0aGlzCisvLyBUT0RPKGIvMjg1ODU1NDM2KTogdmVyaWZ5IGtleSBtaWNyb2Ryb2lkLXZlbmRvciB3YXMgc2lnbmVkIHdpdGguCisvLyBUT0RPKGIvMjg1ODU1NDM2KTogc2hvdWxkIGJlIG1vdW50ZWQgb24gdG9wIG9mIGRtLXZlcml0eSBkZXZpY2UuCitzdGF0aWMgUmVzdWx0PEZzdGFiPiBSZWFkRmlyc3RTdGFnZUZzdGFiTWljcm9kcm9pZChjb25zdCBzdGQ6OnN0cmluZyYgY21kbGluZSkgeworICAgIEZzdGFiIGZzdGFiOworICAgIGlmICghUmVhZERlZmF1bHRGc3RhYigmZnN0YWIpKSB7CisgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJmYWlsZWQgdG8gcmVhZCBmc3RhYiI7CisgICAgfQorICAgIGlmIChjbWRsaW5lLmZpbmQoImFuZHJvaWRib290Lm1pY3JvZHJvaWQubW91bnRfdmVuZG9yPTEiKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAvLyBXZSB3ZXJlbid0IGFza2VkIHRvIG1vdW50IC92ZW5kb3IgcGFydGl0aW9uLCBmaWx0ZXIgaXQgb3V0IGZyb20gdGhlIGZzdGFiLgorICAgICAgICBhdXRvIHByZWRpY2F0ZSA9IFtdKGNvbnN0IGF1dG8mIGVudHJ5KSB7IHJldHVybiBlbnRyeS5tb3VudF9wb2ludCA9PSAiL3ZlbmRvciI7IH07CisgICAgICAgIGZzdGFiLmVyYXNlKHN0ZDo6cmVtb3ZlX2lmKGZzdGFiLmJlZ2luKCksIGZzdGFiLmVuZCgpLCBwcmVkaWNhdGUpLCBmc3RhYi5lbmQoKSk7CisgICAgfQorICAgIHJldHVybiBmc3RhYjsKK30KKwogc3RhdGljIGJvb2wgR2V0Um9vdEVudHJ5KEZzdGFiRW50cnkqIHJvb3RfZW50cnkpIHsKICAgICBGc3RhYiBwcm9jX21vdW50czsKICAgICBpZiAoIVJlYWRGc3RhYkZyb21GaWxlKCIvcHJvYy9tb3VudHMiLCAmcHJvY19tb3VudHMpKSB7CkBAIC0yMTgsMTQgKzIzMiwxMyBAQAogICAgIHJldHVybiByb2xsYmFja2VkOwogfQogCi0vLyBDbGFzcyBEZWZpbml0aW9ucwotLy8gLS0tLS0tLS0tLS0tLS0tLS0KLUZpcnN0U3RhZ2VNb3VudDo6Rmlyc3RTdGFnZU1vdW50KEZzdGFiIGZzdGFiKSA6IG5lZWRfZG1fdmVyaXR5XyhmYWxzZSksIGZzdGFiXyhzdGQ6Om1vdmUoZnN0YWIpKSB7Ci0gICAgc3VwZXJfcGFydGl0aW9uX25hbWVfID0gZnNfbWdyX2dldF9zdXBlcl9wYXJ0aXRpb25fbmFtZSgpOwotfQotCi1SZXN1bHQ8c3RkOjp1bmlxdWVfcHRyPEZpcnN0U3RhZ2VNb3VudD4+IEZpcnN0U3RhZ2VNb3VudDo6Q3JlYXRlKCkgewotICAgIGF1dG8gZnN0YWIgPSBSZWFkRmlyc3RTdGFnZUZzdGFiKCk7CitSZXN1bHQ8c3RkOjp1bmlxdWVfcHRyPEZpcnN0U3RhZ2VNb3VudD4+IEZpcnN0U3RhZ2VNb3VudDo6Q3JlYXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBjbWRsaW5lKSB7CisgICAgUmVzdWx0PEZzdGFiPiBmc3RhYjsKKyAgICBpZiAoSXNNaWNyb2Ryb2lkKCkpIHsKKyAgICAgICAgZnN0YWIgPSBSZWFkRmlyc3RTdGFnZUZzdGFiTWljcm9kcm9pZChjbWRsaW5lKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmc3RhYiA9IFJlYWRGaXJzdFN0YWdlRnN0YWJBbmRyb2lkKCk7CisgICAgfQogICAgIGlmICghZnN0YWIub2soKSkgewogICAgICAgICByZXR1cm4gZnN0YWIuZXJyb3IoKTsKICAgICB9CkBAIC0yMzMsNyArMjQ2LDcgQEAKICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxGaXJzdFN0YWdlTW91bnRWQm9vdFYyPihzdGQ6Om1vdmUoKmZzdGFiKSk7CiB9CiAKLWJvb2wgRmlyc3RTdGFnZU1vdW50OjpEb0NyZWF0ZURldmljZXMoKSB7Citib29sIEZpcnN0U3RhZ2VNb3VudFZCb290VjI6OkRvQ3JlYXRlRGV2aWNlcygpIHsKICAgICBpZiAoIUluaXREZXZpY2VzKCkpIHJldHVybiBmYWxzZTsKIAogICAgIC8vIE1vdW50IC9tZXRhZGF0YSBiZWZvcmUgY3JlYXRpbmcgbG9naWNhbCBwYXJ0aXRpb25zLCBzaW5jZSB3ZSBuZWVkIHRvCkBAIC0yNTUsNyArMjY4LDkgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBGaXJzdFN0YWdlTW91bnQ6OkRvRmlyc3RTdGFnZU1vdW50KCkgeworYm9vbCBGaXJzdFN0YWdlTW91bnRWQm9vdFYyOjpEb0ZpcnN0U3RhZ2VNb3VudCgpIHsKKyAgICBSZXF1ZXN0VHJhZGVJbk1vZGVXaXBlSWZOZWVkZWQoKTsKKwogICAgIGlmICghSXNEbUxpbmVhckVuYWJsZWQoKSAmJiBmc3RhYl8uZW1wdHkoKSkgewogICAgICAgICAvLyBOb3RoaW5nIHRvIG1vdW50LgogICAgICAgICBMT0coSU5GTykgPDwgIkZpcnN0IHN0YWdlIG1vdW50IHNraXBwZWQgKG1pc3NpbmcvaW5jb21wYXRpYmxlL2VtcHR5IGZzdGFiIGluIGRldmljZSB0cmVlKSI7CkBAIC0yNjcsNyArMjgyLDE2IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgRmlyc3RTdGFnZU1vdW50OjpJbml0RGV2aWNlcygpIHsKKy8vIFRPRE86IHNob3VsZCB0aGlzIGJlIGluIGEgbGlicmFyeSBpbiBwYWNrYWdlcy9tb2R1bGVzL1ZpcnR1YWxpemF0aW9uIGZpcnN0X3N0YWdlX2luaXQgbGlua3M/CitzdGF0aWMgYm9vbCBJc01pY3JvZHJvaWRTdHJpY3RCb290KCkgeworICAgIHJldHVybiBhY2Nlc3MoIi9wcm9jL2RldmljZS10cmVlL2Nob3Nlbi9hdmYsc3RyaWN0LWJvb3QiLCBGX09LKSA9PSAwOworfQorCitib29sIEZpcnN0U3RhZ2VNb3VudFZCb290VjI6OkluaXREZXZpY2VzKCkgeworICAgIGlmICghYmxvY2tfZGV2X2luaXRfLkluaXRCb290RGV2aWNlc0Zyb21QYXJ0VXVpZCgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gZGV2aWNlczsKICAgICBHZXRTdXBlckRldmljZU5hbWUoJmRldmljZXMpOwogCkBAIC0yNzgsNiArMzAyLDE0IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICBpZiAoSXNNaWNyb2Ryb2lkKCkgJiYgYW5kcm9pZDo6dmlydHVhbGl6YXRpb246OklzT3BlbkRpY2VDaGFuZ2VzRmxhZ0VuYWJsZWQoKSkgeworICAgICAgICBpZiAoSXNNaWNyb2Ryb2lkU3RyaWN0Qm9vdCgpKSB7CisgICAgICAgICAgICBpZiAoIWJsb2NrX2Rldl9pbml0Xy5Jbml0UGxhdGZvcm1EZXZpY2UoIm9wZW4tZGljZTAiKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIGlmIChJc0RtTGluZWFyRW5hYmxlZCgpKSB7CiAgICAgICAgIGF1dG8gc3VwZXJfc3ltbGluayA9ICIvZGV2L2Jsb2NrL2J5LW5hbWUvInMgKyBzdXBlcl9wYXJ0aXRpb25fbmFtZV87CiAgICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhbHBhdGgoc3VwZXJfc3ltbGluaywgJnN1cGVyX3BhdGhfKSkgewpAQCAtMjg4LDE0ICszMjAsMTQgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBGaXJzdFN0YWdlTW91bnQ6OklzRG1MaW5lYXJFbmFibGVkKCkgeworYm9vbCBGaXJzdFN0YWdlTW91bnRWQm9vdFYyOjpJc0RtTGluZWFyRW5hYmxlZCgpIHsKICAgICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogZnN0YWJfKSB7CiAgICAgICAgIGlmIChlbnRyeS5mc19tZ3JfZmxhZ3MubG9naWNhbCkgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKIH0KIAotdm9pZCBGaXJzdFN0YWdlTW91bnQ6OkdldFN1cGVyRGV2aWNlTmFtZShzdGQ6OnNldDxzdGQ6OnN0cmluZz4qIGRldmljZXMpIHsKK3ZvaWQgRmlyc3RTdGFnZU1vdW50VkJvb3RWMjo6R2V0U3VwZXJEZXZpY2VOYW1lKHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiogZGV2aWNlcykgewogICAgIC8vIEFkZCBhbnkgYWRkaXRpb25hbCBkZXZpY2VzIHJlcXVpcmVkIGZvciBkbS1saW5lYXIgbWFwcGluZ3MuCiAgICAgaWYgKCFJc0RtTGluZWFyRW5hYmxlZCgpKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTMwNyw3ICszMzksNyBAQAogLy8gQ3JlYXRlcyBkZXZpY2VzIHdpdGggdWV2ZW50LT5wYXJ0aXRpb25fbmFtZSBtYXRjaGluZyBvbmVzIGluIHRoZSBnaXZlbiBzZXQuCiAvLyBGb3VuZCBwYXJ0aXRpb25zIHdpbGwgdGhlbiBiZSByZW1vdmVkIGZyb20gaXQgZm9yIHRoZSBzdWJzZXF1ZW50IG1lbWJlcgogLy8gZnVuY3Rpb24gdG8gY2hlY2sgd2hpY2ggZGV2aWNlcyBhcmUgTk9UIGNyZWF0ZWQuCi1ib29sIEZpcnN0U3RhZ2VNb3VudDo6SW5pdFJlcXVpcmVkRGV2aWNlcyhzdGQ6OnNldDxzdGQ6OnN0cmluZz4gZGV2aWNlcykgeworYm9vbCBGaXJzdFN0YWdlTW91bnRWQm9vdFYyOjpJbml0UmVxdWlyZWREZXZpY2VzKHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBkZXZpY2VzKSB7CiAgICAgaWYgKCFibG9ja19kZXZfaW5pdF8uSW5pdERldmljZU1hcHBlcigpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC0zMTcsNyArMzQ5LDggQEAKICAgICByZXR1cm4gYmxvY2tfZGV2X2luaXRfLkluaXREZXZpY2VzKHN0ZDo6bW92ZShkZXZpY2VzKSk7CiB9CiAKLWJvb2wgRmlyc3RTdGFnZU1vdW50OjpJbml0RG1MaW5lYXJCYWNraW5nRGV2aWNlcyhjb25zdCBhbmRyb2lkOjpmc19tZ3I6OkxwTWV0YWRhdGEmIG1ldGFkYXRhKSB7Citib29sIEZpcnN0U3RhZ2VNb3VudFZCb290VjI6OkluaXREbUxpbmVhckJhY2tpbmdEZXZpY2VzKAorICAgICAgICBjb25zdCBhbmRyb2lkOjpmc19tZ3I6OkxwTWV0YWRhdGEmIG1ldGFkYXRhKSB7CiAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGRldmljZXM7CiAKICAgICBhdXRvIHBhcnRpdGlvbl9uYW1lcyA9IGFuZHJvaWQ6OmZzX21ncjo6R2V0QmxvY2tEZXZpY2VQYXJ0aXRpb25OYW1lcyhtZXRhZGF0YSk7CkBAIC0zMzQsNyArMzY3LDcgQEAKICAgICByZXR1cm4gSW5pdFJlcXVpcmVkRGV2aWNlcyhzdGQ6Om1vdmUoZGV2aWNlcykpOwogfQogCi1ib29sIEZpcnN0U3RhZ2VNb3VudDo6Q3JlYXRlTG9naWNhbFBhcnRpdGlvbnMoKSB7Citib29sIEZpcnN0U3RhZ2VNb3VudFZCb290VjI6OkNyZWF0ZUxvZ2ljYWxQYXJ0aXRpb25zKCkgewogICAgIGlmICghSXNEbUxpbmVhckVuYWJsZWQoKSkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC0zNDUsNiArMzc4LDE0IEBACiAgICAgfQogCiAgICAgaWYgKFNuYXBzaG90TWFuYWdlcjo6SXNTbmFwc2hvdE1hbmFnZXJOZWVkZWQoKSkgeworICAgICAgICBhdXRvIGluaXRfZGV2aWNlcyA9IFt0aGlzXShjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlKSAtPiBib29sIHsKKyAgICAgICAgICAgIGlmIChhbmRyb2lkOjpiYXNlOjpTdGFydHNXaXRoKGRldmljZSwgIi9kZXYvYmxvY2svZG0tIikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYmxvY2tfZGV2X2luaXRfLkluaXREbURldmljZShkZXZpY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJsb2NrX2Rldl9pbml0Xy5Jbml0RGV2aWNlcyh7ZGV2aWNlfSk7CisgICAgICAgIH07CisKKyAgICAgICAgU25hcHNob3RNYW5hZ2VyOjpNYXBUZW1wT3RhTWV0YWRhdGFQYXJ0aXRpb25JZk5lZWRlZChpbml0X2RldmljZXMpOwogICAgICAgICBhdXRvIHNtID0gU25hcHNob3RNYW5hZ2VyOjpOZXdGb3JGaXJzdFN0YWdlTW91bnQoKTsKICAgICAgICAgaWYgKCFzbSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMzY1LDcgKzQwNiw3IEBACiAgICAgcmV0dXJuIGFuZHJvaWQ6OmZzX21ncjo6Q3JlYXRlTG9naWNhbFBhcnRpdGlvbnMoKm1ldGFkYXRhLmdldCgpLCBzdXBlcl9wYXRoXyk7CiB9CiAKLWJvb2wgRmlyc3RTdGFnZU1vdW50OjpDcmVhdGVTbmFwc2hvdFBhcnRpdGlvbnMoU25hcHNob3RNYW5hZ2VyKiBzbSkgeworYm9vbCBGaXJzdFN0YWdlTW91bnRWQm9vdFYyOjpDcmVhdGVTbmFwc2hvdFBhcnRpdGlvbnMoU25hcHNob3RNYW5hZ2VyKiBzbSkgewogICAgIC8vIFdoZW4gQ09XIGltYWdlcyBhcmUgcHJlc2VudCBmb3Igc25hcHNob3RzLCB0aGV5IGFyZSBzdG9yZWQgb24KICAgICAvLyB0aGUgZGF0YSBwYXJ0aXRpb24uCiAgICAgaWYgKCFJbml0UmVxdWlyZWREZXZpY2VzKHsidXNlcmRhdGEifSkpIHsKQEAgLTM3NCwxMSArNDE1LDcgQEAKIAogICAgIHVzZV9zbmFwdXNlcmRfID0gc20tPklzU25hcHVzZXJkUmVxdWlyZWQoKTsKICAgICBpZiAodXNlX3NuYXB1c2VyZF8pIHsKLSAgICAgICAgaWYgKHNtLT5VcGRhdGVVc2VzVXNlclNuYXBzaG90cygpKSB7Ci0gICAgICAgICAgICBMYXVuY2hGaXJzdFN0YWdlU25hcHVzZXJkKFNuYXBzaG90RHJpdmVyOjpETV9VU0VSKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExhdW5jaEZpcnN0U3RhZ2VTbmFwdXNlcmQoU25hcHNob3REcml2ZXI6OkRNX1NOQVBTSE9UKTsKLSAgICAgICAgfQorICAgICAgICBMYXVuY2hGaXJzdFN0YWdlU25hcHVzZXJkKCk7CiAgICAgfQogCiAgICAgc20tPlNldFVldmVudFJlZ2VuQ2FsbGJhY2soW3RoaXNdKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2UpIC0+IGJvb2wgewpAQCAtNDAwLDggKzQzNyw4IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgRmlyc3RTdGFnZU1vdW50OjpNb3VudFBhcnRpdGlvbihjb25zdCBGc3RhYjo6aXRlcmF0b3ImIGJlZ2luLCBib29sIGVyYXNlX3NhbWVfbW91bnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZzdGFiOjppdGVyYXRvciogZW5kKSB7Citib29sIEZpcnN0U3RhZ2VNb3VudFZCb290VjI6Ok1vdW50UGFydGl0aW9uKGNvbnN0IEZzdGFiOjppdGVyYXRvciYgYmVnaW4sIGJvb2wgZXJhc2Vfc2FtZV9tb3VudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZzdGFiOjppdGVyYXRvciogZW5kKSB7CiAgICAgLy8gU2V0cyBlbmQgdG8gYmVnaW4gKyAxLCBzbyB3ZSBjYW4ganVzdCByZXR1cm4gb24gZmFpbHVyZSBiZWxvdy4KICAgICBpZiAoZW5kKSB7CiAgICAgICAgICplbmQgPSBiZWdpbiArIDE7CkBAIC00NDUsNyArNDgyLDcgQEAKICAgICByZXR1cm4gbW91bnRlZDsKIH0KIAotdm9pZCBGaXJzdFN0YWdlTW91bnQ6OlByZWxvYWRBdmJLZXlzKCkgewordm9pZCBGaXJzdFN0YWdlTW91bnRWQm9vdFYyOjpQcmVsb2FkQXZiS2V5cygpIHsKICAgICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogZnN0YWJfKSB7CiAgICAgICAgIC8vIE5vIG5lZWQgdG8gY2FjaGUgdGhlIGtleSBjb250ZW50IGlmIGl0J3MgZW1wdHksIG9yIGlzIGFscmVhZHkgY2FjaGVkLgogICAgICAgICBpZiAoZW50cnkuYXZiX2tleXMuZW1wdHkoKSB8fCBwcmVsb2FkX2F2Yl9rZXlfYmxvYnNfLmNvdW50KGVudHJ5LmF2Yl9rZXlzKSkgewpAQCAtNDkyLDcgKzUyOSw3IEBACiAvLyBJZiBzeXN0ZW0gaXMgaW4gdGhlIGZzdGFiIHRoZW4gd2UncmUgbm90IGEgc3lzdGVtLWFzLXJvb3QgZGV2aWNlLCBhbmQgaW4KIC8vIHRoaXMgY2FzZSwgd2UgbW91bnQgc3lzdGVtIGZpcnN0IHRoZW4gcGl2b3QgdG8gaXQuICBGcm9tIHRoYXQgcG9pbnQgb24sCiAvLyB3ZSBhcmUgZWZmZWN0aXZlbHkgaWRlbnRpY2FsIHRvIGEgc3lzdGVtLWFzLXJvb3QgZGV2aWNlLgotYm9vbCBGaXJzdFN0YWdlTW91bnQ6OlRyeVN3aXRjaFN5c3RlbUFzUm9vdCgpIHsKK2Jvb2wgRmlyc3RTdGFnZU1vdW50VkJvb3RWMjo6VHJ5U3dpdGNoU3lzdGVtQXNSb290KCkgewogICAgIFVzZURzdUlmUHJlc2VudCgpOwogICAgIC8vIFByZWxvYWRpbmcgYWxsIEFWQiBrZXlzIGZyb20gdGhlIHJhbWRpc2sgYmVmb3JlIHN3aXRjaGluZyByb290IHRvIC9zeXN0ZW0uCiAgICAgUHJlbG9hZEF2YktleXMoKTsKQEAgLTUyMSw5ICs1NTgsNDggQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBGaXJzdFN0YWdlTW91bnQ6Ok1vdW50UGFydGl0aW9ucygpIHsKK3N0YXRpYyBib29sIE1heWJlRGVyaXZlTWljcm9kcm9pZFZlbmRvckRpY2VOb2RlKEZzdGFiKiBmc3RhYikgeworICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IG1pY3JvZHJvaWRfdmVuZG9yX2Jsb2NrX2RldjsKKyAgICBmb3IgKGF1dG8gZW50cnkgPSBmc3RhYi0+YmVnaW4oKTsgZW50cnkgIT0gZnN0YWItPmVuZCgpOyBlbnRyeSsrKSB7CisgICAgICAgIGlmIChlbnRyeS0+bW91bnRfcG9pbnQgPT0gIi92ZW5kb3IiKSB7CisgICAgICAgICAgICBtaWNyb2Ryb2lkX3ZlbmRvcl9ibG9ja19kZXYuZW1wbGFjZShlbnRyeS0+YmxrX2RldmljZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIW1pY3JvZHJvaWRfdmVuZG9yX2Jsb2NrX2Rldi5oYXNfdmFsdWUoKSkgeworICAgICAgICBMT0coVkVSQk9TRSkgPDwgIk5vIG1pY3JvZHJvaWQgdmVuZG9yIHBhcnRpdGlvbiB0byBtb3VudCI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyBjbGFuZy1mb3JtYXQgb2ZmCisgICAgY29uc3Qgc3RkOjphcnJheTxjb25zdCBjaGFyKiwgOD4gYXJncyA9IHsKKyAgICAgICAgIi9zeXN0ZW0vYmluL2Rlcml2ZV9taWNyb2Ryb2lkX3ZlbmRvcl9kaWNlX25vZGUiLAorICAgICAgICAgICAgICAgICItLWRpY2UtZHJpdmVyIiwgIi9kZXYvb3Blbi1kaWNlMCIsCisgICAgICAgICAgICAgICAgIi0tbWljcm9kcm9pZC12ZW5kb3ItZGlzay1pbWFnZSIsIG1pY3JvZHJvaWRfdmVuZG9yX2Jsb2NrX2Rldi0+ZGF0YSgpLAorICAgICAgICAgICAgICAgICItLW91dHB1dCIsICIvbWljcm9kcm9pZF9yZXNvdXJjZXMvZGljZV9jaGFpbi5yYXciLCBudWxscHRyLAorICAgIH07CisgICAgLy8gY2xhbmctZm9ybWF0LW9uCisgICAgLy8gRm9ya0V4ZWN2ZUFuZFdhaXRGb3JDb21wbGV0aW9uIGNhbGxzIHdhaXRwaWQgdG8gd2FpdCBmb3IgdGhlIGZvcmstZWQgcHJvY2VzcyB0byBmaW5pc2guCisgICAgLy8gVGhlIGZpcnN0X3N0YWdlX2NvbnNvbGUgYWRkcyBTQV9OT0NMRFdBSVQgZmxhZyB0byB0aGUgU0lHQ0hMRCBoYW5kbGVyLCB3aGljaCBtZWFucyB0aGF0CisgICAgLy8gd2FpdHBpZCB3aWxsIGFsd2F5cyByZXR1cm4gLUVDSExELiBIZXJlIHdlIHJlLXJlZ2lzdGVyIGEgZGVmYXVsdCBoYW5kbGVyLCBzbyB0aGF0IHdhaXRwaWQKKyAgICAvLyB3b3Jrcy4KKyAgICBMT0coSU5GTykgPDwgIkRlcml2aW5nIGRpY2Ugbm9kZSBmb3IgbWljcm9kcm9pZCB2ZW5kb3IgcGFydGl0aW9uIjsKKyAgICBzaWduYWwoU0lHQ0hMRCwgU0lHX0RGTCk7CisgICAgaWYgKCFGb3JrRXhlY3ZlQW5kV2FpdEZvckNvbXBsZXRpb24oYXJnc1swXSwgKGNoYXIqKilhcmdzLmRhdGEoKSkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGRlcml2ZSBtaWNyb2Ryb2lkIHZlbmRvciBkaWNlIG5vZGUiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEZpcnN0U3RhZ2VNb3VudFZCb290VjI6Ok1vdW50UGFydGl0aW9ucygpIHsKICAgICBpZiAoIVRyeVN3aXRjaFN5c3RlbUFzUm9vdCgpKSByZXR1cm4gZmFsc2U7CiAKKyAgICBpZiAoSXNNaWNyb2Ryb2lkKCkgJiYgYW5kcm9pZDo6dmlydHVhbGl6YXRpb246OklzT3BlbkRpY2VDaGFuZ2VzRmxhZ0VuYWJsZWQoKSkgeworICAgICAgICBpZiAoIU1heWJlRGVyaXZlTWljcm9kcm9pZFZlbmRvckRpY2VOb2RlKCZmc3RhYl8pKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKICAgICBpZiAoIVNraXBNb3VudGluZ1BhcnRpdGlvbnMoJmZzdGFiXywgdHJ1ZSAvKiB2ZXJib3NlICovKSkgcmV0dXJuIGZhbHNlOwogCiAgICAgZm9yIChhdXRvIGN1cnJlbnQgPSBmc3RhYl8uYmVnaW4oKTsgY3VycmVudCAhPSBmc3RhYl8uZW5kKCk7KSB7CkBAIC02MDQsNyArNjgwLDcgQEAKIC8vIGNvcHkgZmlsZXMgdG8gL21ldGFkYXRhIGlzIE5PVCBmYXRhbCwgYmVjYXVzZSBpdCBpcyBhdXhpbGlhcnkgdG8gcGVyZm9ybQogLy8gcHVibGljIGtleSBtYXRjaGluZyBiZWZvcmUgYm9vdGluZyBpbnRvIERTVSBpbWFnZXMgb24gbmV4dCBib290LiBUaGUgYWN0dWFsCiAvLyBwdWJsaWMga2V5IG1hdGNoaW5nIHdpbGwgc3RpbGwgYmUgZG9uZSBvbiBuZXh0IGJvb3QgdG8gRFNVLgotdm9pZCBGaXJzdFN0YWdlTW91bnQ6OkNvcHlEc3VBdmJLZXlzKCkgewordm9pZCBGaXJzdFN0YWdlTW91bnRWQm9vdFYyOjpDb3B5RHN1QXZiS2V5cygpIHsKICAgICBzdGQ6OmVycm9yX2NvZGUgZWM7CiAgICAgLy8gUmVtb3ZpbmcgZXhpc3Rpbmcga2V5cyBpbiBnc2k6OmtEc3VBdmJLZXlEaXIgYXMgdGhleSBtaWdodCBiZSBzdGFsZS4KICAgICBzdGQ6OmZpbGVzeXN0ZW06OnJlbW92ZV9hbGwoZ3NpOjprRHN1QXZiS2V5RGlyLCBlYyk7CkBAIC02MjAsNyArNjk2LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgRmlyc3RTdGFnZU1vdW50OjpVc2VEc3VJZlByZXNlbnQoKSB7Cit2b2lkIEZpcnN0U3RhZ2VNb3VudFZCb290VjI6OlVzZURzdUlmUHJlc2VudCgpIHsKICAgICBzdGQ6OnN0cmluZyBlcnJvcjsKIAogICAgIGlmICghYW5kcm9pZDo6Z3NpOjpDYW5Cb290SW50b0dzaSgmZXJyb3IpKSB7CkBAIC02NTcsMTAgKzczMywxMCBAQAogICAgIFRyYW5zZm9ybUZzdGFiRm9yRHN1KCZmc3RhYl8sIGFjdGl2ZV9kc3UsIGRzdV9wYXJ0aXRpb25zKTsKIH0KIAotLy8gRmlyc3QgcmV0cmlldmUgYW55IHZibWV0YSBwYXJ0aXRpb25zIGZyb20gZGV2aWNlIHRyZWUgKGxlZ2FjeSkgdGhlbiByZWFkIHRocm91Z2ggdGhlIGZzdGFiCi0vLyBmb3IgYW55IGZ1cnRoZXIgdmJtZXRhIHBhcnRpdGlvbnMuCiBGaXJzdFN0YWdlTW91bnRWQm9vdFYyOjpGaXJzdFN0YWdlTW91bnRWQm9vdFYyKEZzdGFiIGZzdGFiKQotICAgIDogRmlyc3RTdGFnZU1vdW50KHN0ZDo6bW92ZShmc3RhYikpLCBhdmJfaGFuZGxlXyhudWxscHRyKSB7CisgICAgOiBuZWVkX2RtX3Zlcml0eV8oZmFsc2UpLCBmc3RhYl8oc3RkOjptb3ZlKGZzdGFiKSksIGF2Yl9oYW5kbGVfKG51bGxwdHIpIHsKKyAgICBzdXBlcl9wYXJ0aXRpb25fbmFtZV8gPSBmc19tZ3JfZ2V0X3N1cGVyX3BhcnRpdGlvbl9uYW1lKCk7CisKICAgICBzdGQ6OnN0cmluZyBkZXZpY2VfdHJlZV92Ym1ldGFfcGFydHM7CiAgICAgcmVhZF9hbmRyb2lkX2R0X2ZpbGUoInZibWV0YS9wYXJ0cyIsICZkZXZpY2VfdHJlZV92Ym1ldGFfcGFydHMpOwogCkBAIC03MjYsNiArODAyLDE1IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgSXNIYXNodHJlZURpc2FibGVkKGNvbnN0IEF2YkhhbmRsZSYgdmJtZXRhLCBjb25zdCBzdGQ6OnN0cmluZyYgbW91bnRfcG9pbnQpIHsKKyAgICBpZiAodmJtZXRhLnN0YXR1cygpID09IEF2YkhhbmRsZVN0YXR1czo6a0hhc2h0cmVlRGlzYWJsZWQgfHwKKyAgICAgICAgdmJtZXRhLnN0YXR1cygpID09IEF2YkhhbmRsZVN0YXR1czo6a1ZlcmlmaWNhdGlvbkRpc2FibGVkKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlRvcC1sZXZlbCB2Ym1ldGEgaXMgZGlzYWJsZWQsIHNraXAgSGFzaHRyZWUgc2V0dXAgZm9yICIgPDwgbW91bnRfcG9pbnQ7CisgICAgICAgIHJldHVybiB0cnVlOyAgLy8gUmV0dXJucyB0cnVlIHRvIG1vdW50IHRoZSBwYXJ0aXRpb24gZGlyZWN0bHkuCisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwogYm9vbCBGaXJzdFN0YWdlTW91bnRWQm9vdFYyOjpTZXRVcERtVmVyaXR5KEZzdGFiRW50cnkqIGZzdGFiX2VudHJ5KSB7CiAgICAgQXZiSGFzaHRyZWVSZXN1bHQgaGFzaHRyZWVfcmVzdWx0OwogCkBAIC03MzQsMzQgKzgxOSw0NiBAQAogICAgIGlmICghZnN0YWJfZW50cnktPmF2Yl9rZXlzLmVtcHR5KCkpIHsKICAgICAgICAgaWYgKCFJbml0QXZiSGFuZGxlKCkpIHJldHVybiBmYWxzZTsKICAgICAgICAgLy8gQ2hlY2tzIGlmIGhhc2h0cmVlIHNob3VsZCBiZSBkaXNhYmxlZCBmcm9tIHRoZSB0b3AtbGV2ZWwgL3ZibWV0YS4KLSAgICAgICAgaWYgKGF2Yl9oYW5kbGVfLT5zdGF0dXMoKSA9PSBBdmJIYW5kbGVTdGF0dXM6OmtIYXNodHJlZURpc2FibGVkIHx8Ci0gICAgICAgICAgICBhdmJfaGFuZGxlXy0+c3RhdHVzKCkgPT0gQXZiSGFuZGxlU3RhdHVzOjprVmVyaWZpY2F0aW9uRGlzYWJsZWQpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlRvcC1sZXZlbCB2Ym1ldGEgaXMgZGlzYWJsZWQsIHNraXAgSGFzaHRyZWUgc2V0dXAgZm9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgZnN0YWJfZW50cnktPm1vdW50X3BvaW50OwotICAgICAgICAgICAgcmV0dXJuIHRydWU7ICAvLyBSZXR1cm5zIHRydWUgdG8gbW91bnQgdGhlIHBhcnRpdGlvbiBkaXJlY3RseS4KKyAgICAgICAgaWYgKElzSGFzaHRyZWVEaXNhYmxlZCgqYXZiX2hhbmRsZV8sIGZzdGFiX2VudHJ5LT5tb3VudF9wb2ludCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGF1dG8gYXZiX3N0YW5kYWxvbmVfaGFuZGxlID0gQXZiSGFuZGxlOjpMb2FkQW5kVmVyaWZ5VmJtZXRhKAorICAgICAgICAgICAgICAgICpmc3RhYl9lbnRyeSwgcHJlbG9hZF9hdmJfa2V5X2Jsb2JzX1tmc3RhYl9lbnRyeS0+YXZiX2tleXNdKTsKKyAgICAgICAgaWYgKCFhdmJfc3RhbmRhbG9uZV9oYW5kbGUpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBsb2FkIG9mZmxpbmUgdmJtZXRhIGZvciAiIDw8IGZzdGFiX2VudHJ5LT5tb3VudF9wb2ludDsKKyAgICAgICAgICAgIC8vIEZhbGxiYWNrcyB0byBidWlsdC1pbiBoYXNodHJlZSBpZiBmc19tZ3JfZmxhZ3MuYXZiIGlzIHNldC4KKyAgICAgICAgICAgIGlmICghZnN0YWJfZW50cnktPmZzX21ncl9mbGFncy5hdmIpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiRmFsbGJhY2sgdG8gYnVpbHQtaW4gaGFzaHRyZWUgZm9yICIgPDwgZnN0YWJfZW50cnktPm1vdW50X3BvaW50OworICAgICAgICAgICAgaGFzaHRyZWVfcmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgYXZiX2hhbmRsZV8tPlNldFVwQXZiSGFzaHRyZWUoZnN0YWJfZW50cnksIGZhbHNlIC8qIHdhaXRfZm9yX3Zlcml0eV9kZXYgKi8pOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXV0byBhdmJfc3RhbmRhbG9uZV9oYW5kbGUgPSBBdmJIYW5kbGU6OkxvYWRBbmRWZXJpZnlWYm1ldGEoCi0gICAgICAgICAgICAgICAgICAgICpmc3RhYl9lbnRyeSwgcHJlbG9hZF9hdmJfa2V5X2Jsb2JzX1tmc3RhYl9lbnRyeS0+YXZiX2tleXNdKTsKLSAgICAgICAgICAgIGlmICghYXZiX3N0YW5kYWxvbmVfaGFuZGxlKSB7Ci0gICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGxvYWQgb2ZmbGluZSB2Ym1ldGEgZm9yICIgPDwgZnN0YWJfZW50cnktPm1vdW50X3BvaW50OwotICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrcyB0byBidWlsdC1pbiBoYXNodHJlZSBpZiBmc19tZ3JfZmxhZ3MuYXZiIGlzIHNldC4KLSAgICAgICAgICAgICAgICBpZiAoIWZzdGFiX2VudHJ5LT5mc19tZ3JfZmxhZ3MuYXZiKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJGYWxsYmFjayB0byBidWlsdC1pbiBoYXNodHJlZSBmb3IgIiA8PCBmc3RhYl9lbnRyeS0+bW91bnRfcG9pbnQ7Ci0gICAgICAgICAgICAgICAgaGFzaHRyZWVfcmVzdWx0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGF2Yl9oYW5kbGVfLT5TZXRVcEF2Ykhhc2h0cmVlKGZzdGFiX2VudHJ5LCBmYWxzZSAvKiB3YWl0X2Zvcl92ZXJpdHlfZGV2ICovKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gU2V0cyB1cCBoYXNodHJlZSB2aWEgdGhlIHN0YW5kYWxvbmUgaGFuZGxlLgotICAgICAgICAgICAgICAgIGlmIChJc1N0YW5kYWxvbmVJbWFnZVJvbGxiYWNrKCphdmJfaGFuZGxlXywgKmF2Yl9zdGFuZGFsb25lX2hhbmRsZSwgKmZzdGFiX2VudHJ5KSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGhhc2h0cmVlX3Jlc3VsdCA9IGF2Yl9zdGFuZGFsb25lX2hhbmRsZS0+U2V0VXBBdmJIYXNodHJlZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGZzdGFiX2VudHJ5LCBmYWxzZSAvKiB3YWl0X2Zvcl92ZXJpdHlfZGV2ICovKTsKKyAgICAgICAgICAgIC8vIFNldHMgdXAgaGFzaHRyZWUgdmlhIHRoZSBzdGFuZGFsb25lIGhhbmRsZS4KKyAgICAgICAgICAgIGlmIChJc1N0YW5kYWxvbmVJbWFnZVJvbGxiYWNrKCphdmJfaGFuZGxlXywgKmF2Yl9zdGFuZGFsb25lX2hhbmRsZSwgKmZzdGFiX2VudHJ5KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhhc2h0cmVlX3Jlc3VsdCA9IGF2Yl9zdGFuZGFsb25lX2hhbmRsZS0+U2V0VXBBdmJIYXNodHJlZSgKKyAgICAgICAgICAgICAgICAgICAgZnN0YWJfZW50cnksIGZhbHNlIC8qIHdhaXRfZm9yX3Zlcml0eV9kZXYgKi8pOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChmc3RhYl9lbnRyeS0+ZnNfbWdyX2ZsYWdzLmF2YikgewogICAgICAgICBpZiAoIUluaXRBdmJIYW5kbGUoKSkgcmV0dXJuIGZhbHNlOwogICAgICAgICBoYXNodHJlZV9yZXN1bHQgPQogICAgICAgICAgICAgICAgIGF2Yl9oYW5kbGVfLT5TZXRVcEF2Ykhhc2h0cmVlKGZzdGFiX2VudHJ5LCBmYWxzZSAvKiB3YWl0X2Zvcl92ZXJpdHlfZGV2ICovKTsKKyAgICB9IGVsc2UgaWYgKCFmc3RhYl9lbnRyeS0+YXZiX2hhc2h0cmVlX2RpZ2VzdC5lbXB0eSgpKSB7CisgICAgICAgIC8vIFdoZW4gZnN0YWJfZW50cnkgaGFzIG5laXRoZXIgYXZiX2tleXMgbm9yIGF2YiBmbGFnLCB0cnkgdXNpbmcKKyAgICAgICAgLy8gYXZiX2hhc2h0cmVlX2RpZ2VzdC4KKyAgICAgICAgaWYgKCFJbml0QXZiSGFuZGxlKCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgLy8gQ2hlY2tzIGlmIGhhc2h0cmVlIHNob3VsZCBiZSBkaXNhYmxlZCBmcm9tIHRoZSB0b3AtbGV2ZWwgL3ZibWV0YS4KKyAgICAgICAgaWYgKElzSGFzaHRyZWVEaXNhYmxlZCgqYXZiX2hhbmRsZV8sIGZzdGFiX2VudHJ5LT5tb3VudF9wb2ludCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGF1dG8gYXZiX3N0YW5kYWxvbmVfaGFuZGxlID0gQXZiSGFuZGxlOjpMb2FkQW5kVmVyaWZ5VmJtZXRhKCpmc3RhYl9lbnRyeSk7CisgICAgICAgIGlmICghYXZiX3N0YW5kYWxvbmVfaGFuZGxlKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gbG9hZCB2Ym1ldGEgYmFzZWQgb24gaGFzaHRyZWUgZGVzY3JpcHRvciByb290IGRpZ2VzdCBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBmc3RhYl9lbnRyeS0+bW91bnRfcG9pbnQ7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaGFzaHRyZWVfcmVzdWx0ID0gYXZiX3N0YW5kYWxvbmVfaGFuZGxlLT5TZXRVcEF2Ykhhc2h0cmVlKGZzdGFiX2VudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogd2FpdF9mb3JfdmVyaXR5X2RldiAqLyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIHRydWU7ICAvLyBObyBuZWVkIEFWQiwgcmV0dXJucyB0cnVlIHRvIG1vdW50IHRoZSBwYXJ0aXRpb24gZGlyZWN0bHkuCiAgICAgfQpAQCAtNzkzLDM3ICs4OTAsNTMgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotLy8gUHVibGljIGZ1bmN0aW9ucwotLy8gLS0tLS0tLS0tLS0tLS0tLQotLy8gQ3JlYXRlcyBkZXZpY2VzIGFuZCBsb2dpY2FsIHBhcnRpdGlvbnMgZnJvbSBzdG9yYWdlIGRldmljZXMKLWJvb2wgRG9DcmVhdGVEZXZpY2VzKCkgewotICAgIGF1dG8gZnNtID0gRmlyc3RTdGFnZU1vdW50OjpDcmVhdGUoKTsKLSAgICBpZiAoIWZzbS5vaygpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBjcmVhdGUgRmlyc3RTdGFnZU1vdW50OiAiIDw8IGZzbS5lcnJvcigpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiAoKmZzbSktPkRvQ3JlYXRlRGV2aWNlcygpOwotfQordm9pZCBGaXJzdFN0YWdlTW91bnRWQm9vdFYyOjpSZXF1ZXN0VHJhZGVJbk1vZGVXaXBlSWZOZWVkZWQoKSB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBrV2lwZUluZGljYXRvciA9ICIvbWV0YWRhdGEvdHJhZGVpbm1vZGUvd2lwZSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga1dpcGVBdHRlbXB0cyA9IDM7CiAKLS8vIE1vdW50cyBwYXJ0aXRpb25zIHNwZWNpZmllZCBieSBmc3RhYiBpbiBkZXZpY2UgdHJlZS4KLWJvb2wgRG9GaXJzdFN0YWdlTW91bnQoYm9vbCBjcmVhdGVfZGV2aWNlcykgewotICAgIC8vIFNraXBzIGZpcnN0IHN0YWdlIG1vdW50IGlmIHdlJ3JlIGluIHJlY292ZXJ5IG1vZGUuCi0gICAgaWYgKElzUmVjb3ZlcnlNb2RlKCkpIHsKLSAgICAgICAgTE9HKElORk8pIDw8ICJGaXJzdCBzdGFnZSBtb3VudCBza2lwcGVkIChyZWNvdmVyeSBtb2RlKSI7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgIGlmIChhY2Nlc3Moa1dpcGVJbmRpY2F0b3IsIFJfT0spID09IC0xKSB7CisgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBhdXRvIGZzbSA9IEZpcnN0U3RhZ2VNb3VudDo6Q3JlYXRlKCk7Ci0gICAgaWYgKCFmc20ub2soKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIEZpcnN0U3RhZ2VNb3VudCAiIDw8IGZzbS5lcnJvcigpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgLy8gV3JpdGUgYSBjb3VudGVyIHRvIHRoZSB3aXBlIGluZGljYXRvciwgdG8gdHJ5IGFuZCBwcmV2ZW50IGJvb3QgbG9vcHMgaWYKKyAgICAvLyByZWNvdmVyeSBmYWlscyB0byB3aXBlIGRhdGEuCisgICAgdWludDMyX3QgY291bnRlciA9IDA7CisgICAgc3RkOjpzdHJpbmcgY29udGVudHM7CisgICAgaWYgKFJlYWRGaWxlVG9TdHJpbmcoa1dpcGVJbmRpY2F0b3IsICZjb250ZW50cykpIHsKKyAgICAgICAgYW5kcm9pZDo6YmFzZTo6UGFyc2VVaW50KGNvbnRlbnRzLCAmY291bnRlcik7CisgICAgICAgIGNvbnRlbnRzID0gc3RkOjp0b19zdHJpbmcoKytjb3VudGVyKTsKKyAgICAgICAgaWYgKGFuZHJvaWQ6OmJhc2U6OldyaXRlU3RyaW5nVG9GaWxlKGNvbnRlbnRzLCBrV2lwZUluZGljYXRvcikpIHsKKyAgICAgICAgICAgIHN5bmMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gdXBkYXRlICIgPDwga1dpcGVJbmRpY2F0b3I7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlYWQgIiA8PCBrV2lwZUluZGljYXRvcjsKICAgICB9CiAKLSAgICBpZiAoY3JlYXRlX2RldmljZXMpIHsKLSAgICAgICAgaWYgKCEoKmZzbSktPkRvQ3JlYXRlRGV2aWNlcygpKSByZXR1cm4gZmFsc2U7CisgICAgc3RkOjpzdHJpbmcgZXJyOworICAgIGF1dG8gbWlzY19kZXZpY2UgPSBnZXRfbWlzY19ibGtfZGV2aWNlKCZlcnIpOworICAgIGlmIChtaXNjX2RldmljZS5lbXB0eSgpKSB7CisgICAgICAgIExPRyhGQVRBTCkgPDwgIkNvdWxkIG5vdCBmaW5kIG1pc2MgZGV2aWNlOiAiIDw8IGVycjsKICAgICB9CiAKLSAgICByZXR1cm4gKCpmc20pLT5Eb0ZpcnN0U3RhZ2VNb3VudCgpOworICAgIGF1dG8gbWlzY19uYW1lID0gYW5kcm9pZDo6YmFzZTo6QmFzZW5hbWUobWlzY19kZXZpY2UpOworICAgIGlmICghYmxvY2tfZGV2X2luaXRfLkluaXREZXZpY2VzKHttaXNjX25hbWV9KSkgeworICAgICAgICBMT0coRkFUQUwpIDw8ICJDb3VsZCBub3QgZmluZCBtaXNjIGRldmljZTogIiA8PCBtaXNjX2RldmljZTsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSd2ZSBmYWlsZWQgdG8gd2lwZSB0aHJlZSB0aW1lcywgZG9uJ3QgaW5jbHVkZSB0aGUgd2lwZSBjb21tYW5kLiBUaGlzCisgICAgLy8gd2lsbCBmb3JjZSB1cyB0byBib290IGludG8gdGhlIHJlY292ZXJ5IG1lbnUgaW5zdGVhZCB3aGVyZSBhIG1hbnVhbCB3aXBlCisgICAgLy8gY2FuIGJlIGF0dGVtcHRlZC4KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gb3B0aW9uczsKKyAgICBpZiAoY291bnRlciA8PSBrV2lwZUF0dGVtcHRzKSB7CisgICAgICAgIG9wdGlvbnMuZW1wbGFjZV9iYWNrKCItLXdpcGVfZGF0YSIpOworICAgICAgICBvcHRpb25zLmVtcGxhY2VfYmFjaygiLS1yZWFzb249dHJhZGVpbm1vZGUiKTsKKyAgICB9CisgICAgaWYgKCF3cml0ZV9ib290bG9hZGVyX21lc3NhZ2Uob3B0aW9ucywgJmVycikpIHsKKyAgICAgICAgTE9HKEZBVEFMKSA8PCAiQ291bGQgbm90IGlzc3VlIHdpcGU6ICIgPDwgZXJyOworICAgIH0KKyAgICBSZWJvb3RTeXN0ZW0oQU5EUk9JRF9SQl9SRVNUQVJUMiwgInJlY292ZXJ5IiwgInJlYm9vdCx0cmFkZWlubW9kZSx3aXBlIik7CiB9CiAKIHZvaWQgU2V0SW5pdEF2YlZlcnNpb25JblJlY292ZXJ5KCkgewpAQCAtODMyLDcgKzk0NSw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBhdXRvIGZzdGFiID0gUmVhZEZpcnN0U3RhZ2VGc3RhYigpOworICAgIGF1dG8gZnN0YWIgPSBSZWFkRmlyc3RTdGFnZUZzdGFiQW5kcm9pZCgpOwogICAgIGlmICghZnN0YWIub2soKSkgewogICAgICAgICBMT0coRVJST1IpIDw8IGZzdGFiLmVycm9yKCk7CiAgICAgICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL2luaXQvZmlyc3Rfc3RhZ2VfbW91bnQuaCBiL2luaXQvZmlyc3Rfc3RhZ2VfbW91bnQuaAppbmRleCAyZjRlNjYzLi41NDUwMWQ4IDEwMDY0NAotLS0gYS9pbml0L2ZpcnN0X3N0YWdlX21vdW50LmgKKysrIGIvaW5pdC9maXJzdF9zdGFnZV9tb3VudC5oCkBAIC0xNiwxMSArMTYsMjggQEAKIAogI3ByYWdtYSBvbmNlCiAKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJyZXN1bHQuaCIKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGluaXQgewogCi1ib29sIERvQ3JlYXRlRGV2aWNlcygpOwotYm9vbCBEb0ZpcnN0U3RhZ2VNb3VudChib29sIGNyZWF0ZV9kZXZpY2VzKTsKK2NsYXNzIEZpcnN0U3RhZ2VNb3VudCB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5GaXJzdFN0YWdlTW91bnQoKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBUaGUgZmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgRmlyc3RTdGFnZU1vdW50IGluc3RhbmNlLgorICAgIHN0YXRpYyBSZXN1bHQ8c3RkOjp1bmlxdWVfcHRyPEZpcnN0U3RhZ2VNb3VudD4+IENyZWF0ZShjb25zdCBzdGQ6OnN0cmluZyYgY21kbGluZSk7CisgICAgLy8gQ3JlYXRlcyBkZXZpY2VzIGFuZCBsb2dpY2FsIHBhcnRpdGlvbnMgZnJvbSBzdG9yYWdlIGRldmljZXMKKyAgICB2aXJ0dWFsIGJvb2wgRG9DcmVhdGVEZXZpY2VzKCkgPSAwOworICAgIC8vIE1vdW50cyBmc3RhYiBlbnRyaWVzIHJlYWQgZnJvbSBkZXZpY2UgdHJlZS4KKyAgICB2aXJ0dWFsIGJvb2wgRG9GaXJzdFN0YWdlTW91bnQoKSA9IDA7CisKKyAgcHJvdGVjdGVkOgorICAgIEZpcnN0U3RhZ2VNb3VudCgpID0gZGVmYXVsdDsKK307CisKIHZvaWQgU2V0SW5pdEF2YlZlcnNpb25JblJlY292ZXJ5KCk7CiAKIH0gIC8vIG5hbWVzcGFjZSBpbml0CmRpZmYgLS1naXQgYS9pbml0L2ZzY3J5cHRfaW5pdF9leHRlbnNpb25zLmNwcCBiL2luaXQvZnNjcnlwdF9pbml0X2V4dGVuc2lvbnMuY3BwCmluZGV4IGZiZDgxODkuLjZhNTYxZTUgMTAwNjQ0Ci0tLSBhL2luaXQvZnNjcnlwdF9pbml0X2V4dGVuc2lvbnMuY3BwCisrKyBiL2luaXQvZnNjcnlwdF9pbml0X2V4dGVuc2lvbnMuY3BwCkBAIC0zNCwyOCArMzQsMTIgQEAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGN1dGlscy9zb2NrZXRzLmg+CiAjaW5jbHVkZSA8ZnNjcnlwdC9mc2NyeXB0Lmg+Ci0jaW5jbHVkZSA8a2V5dXRpbHMuaD4KICNpbmNsdWRlIDxsb2d3cmFwL2xvZ3dyYXAuaD4KIAogI2RlZmluZSBUQUcgImZzY3J5cHQiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpmc2NyeXB0OwogCi1ib29sIEZzY3J5cHRJbnN0YWxsS2V5cmluZygpIHsKLSAgICBpZiAoa2V5Y3RsX3NlYXJjaChLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsICJrZXlyaW5nIiwgImZzY3J5cHQiLCAwKSAhPSAtMSkgewotICAgICAgICBMT0coSU5GTykgPDwgIktleXJpbmcgaXMgYWxyZWFkeSBjcmVhdGVkIjsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGtleV9zZXJpYWxfdCBkZXZpY2Vfa2V5cmluZyA9IGFkZF9rZXkoImtleXJpbmciLCAiZnNjcnlwdCIsIDAsIDAsIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORyk7Ci0KLSAgICBpZiAoZGV2aWNlX2tleXJpbmcgPT0gLTEpIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBjcmVhdGUga2V5cmluZyI7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgTE9HKElORk8pIDw8ICJLZXlyaW5nIGNyZWF0ZWQgd2l0aCBpZCAiIDw8IGRldmljZV9rZXlyaW5nIDw8ICIgaW4gcHJvY2VzcyAiIDw8IGdldHBpZCgpOwotICAgIHJldHVybiB0cnVlOwotfQotCiAvLyBUT0RPKGIvMTM5Mzc4NjAxKTogdXNlIGEgc2luZ2xlIGNlbnRyYWwgaW1wbGVtZW50YXRpb24gb2YgdGhpcy4KIHN0YXRpYyB2b2lkIGRlbGV0ZV9kaXJfY29udGVudHMoY29uc3Qgc3RkOjpzdHJpbmcmIGRpcikgewogICAgIGNoYXIqIGNvbnN0IHBhdGhzWzJdID0ge2NvbnN0X2Nhc3Q8Y2hhcio+KGRpci5jX3N0cigpKSwgbnVsbHB0cn07CmRpZmYgLS1naXQgYS9pbml0L2ZzY3J5cHRfaW5pdF9leHRlbnNpb25zLmggYi9pbml0L2ZzY3J5cHRfaW5pdF9leHRlbnNpb25zLmgKaW5kZXggZDM1N2JiMi4uNWUwMjY5YSAxMDA2NDQKLS0tIGEvaW5pdC9mc2NyeXB0X2luaXRfZXh0ZW5zaW9ucy5oCisrKyBiL2luaXQvZnNjcnlwdF9pbml0X2V4dGVuc2lvbnMuaApAQCAtMjUsNiArMjUsNSBAQAogICAgIGtEZWxldGVJZk5lY2Vzc2FyeSwKIH07CiAKLWJvb2wgRnNjcnlwdEluc3RhbGxLZXlyaW5nKCk7CiBib29sIEZzY3J5cHRTZXREaXJlY3RvcnlQb2xpY3koY29uc3Qgc3RkOjpzdHJpbmcmIHJlZl9iYXNlbmFtZSwgRnNjcnlwdEFjdGlvbiBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRpcik7CmRpZmYgLS1naXQgYS9pbml0L2Z1enplci9BbmRyb2lkLmJwIGIvaW5pdC9mdXp6ZXIvQW5kcm9pZC5icAppbmRleCBjMjFhMTk2Li44Y2ZkNTk3IDEwMDY0NAotLS0gYS9pbml0L2Z1enplci9BbmRyb2lkLmJwCisrKyBiL2luaXQvZnV6emVyL0FuZHJvaWQuYnAKQEAgLTE4LDkgKzE4LDggQEAKIH0KIAogY2NfZGVmYXVsdHMgewotICAgIG5hbWU6ICJsaWJpbml0X2RlZmF1bHRzIiwKKyAgICBuYW1lOiAibGliaW5pdF9mdXp6ZXJfZGVmYXVsdHMiLAogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJjKytmcyIsCiAgICAgICAgICJsaWJsbWtkX3V0aWxzIiwKICAgICAgICAgImxpYm1vZHByb2JlIiwKICAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKQEAgLTMxLDggKzMwLDYgQEAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJmc19tZ3IiLAotICAgICAgICAibGliaGlkbC1nZW4tdXRpbHMiLAotICAgICAgICAibGlia2V5dXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnByb2Nlc3Nncm91cCIsCiAgICAgICAgICJsaWJzZWxpbnV4IiwKQEAgLTUxLDkgKzQ4LDggQEAKICAgICBzcmNzOiBbCiAgICAgICAgICJpbml0X3BhcnNlcl9mdXp6ZXIuY3BwIiwKICAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbImxpYmhpZGxtZXRhZGF0YSIsXSwKICAgICBkZWZhdWx0czogWwotICAgICAgICAibGliaW5pdF9kZWZhdWx0cyIsCisgICAgICAgICJsaWJpbml0X2Z1enplcl9kZWZhdWx0cyIsCiAgICAgXSwKIH0KIApAQCAtNjIsNyArNTgsNyBAQAogICAgIHNyY3M6IFsKICAgICAgICAgImluaXRfcHJvcGVydHlfZnV6emVyLmNwcCIsCiAgICAgXSwKLSAgICBkZWZhdWx0czogWyJsaWJpbml0X2RlZmF1bHRzIl0sCisgICAgZGVmYXVsdHM6IFsibGliaW5pdF9mdXp6ZXJfZGVmYXVsdHMiXSwKIH0KIAogY2NfZnV6eiB7CkBAIC03MSw2ICs2Nyw2IEBACiAgICAgICAgICJpbml0X3VldmVudEhhbmRsZXJfZnV6emVyLmNwcCIsCiAgICAgXSwKICAgICBkZWZhdWx0czogWwotICAgICAgICAibGliaW5pdF9kZWZhdWx0cyIsCisgICAgICAgICJsaWJpbml0X2Z1enplcl9kZWZhdWx0cyIsCiAgICAgXSwKIH0KZGlmZiAtLWdpdCBhL2luaXQvZnV6emVyL2luaXRfcGFyc2VyX2Z1enplci5jcHAgYi9pbml0L2Z1enplci9pbml0X3BhcnNlcl9mdXp6ZXIuY3BwCmluZGV4IGRjNzY0NjUuLjIxYjA0ZjQgMTAwNjQ0Ci0tLSBhL2luaXQvZnV6emVyL2luaXRfcGFyc2VyX2Z1enplci5jcHAKKysrIGIvaW5pdC9mdXp6ZXIvaW5pdF9wYXJzZXJfZnV6emVyLmNwcApAQCAtMTUsOSArMTUsNyBAQAogICovCiAKICNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+Ci0jaW5jbHVkZSA8aGlkbC9tZXRhZGF0YS5oPgogI2luY2x1ZGUgPGltcG9ydF9wYXJzZXIuaD4KLSNpbmNsdWRlIDxpbnRlcmZhY2VfdXRpbHMuaD4KICNpbmNsdWRlIDxybGltaXRfcGFyc2VyLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwpAQCAtMzQsNyArMzIsNiBAQAogfTsKIAogY29uc3QgaW50MzJfdCBrTWF4Qnl0ZXMgPSAyNTY7Ci1jb25zdCBzdGQ6OnN0cmluZyBrVmFsaWRJbnRlcmZhY2VzID0gImFuZHJvaWQuZnJhbWV3b3Jrcy52ci5jb21wb3NlckAyLjA6OklWckNvbXBvc2VyQ2xpZW50IjsKIAogY2xhc3MgSW5pdFBhcnNlckZ1enplciB7CiAgIHB1YmxpYzoKQEAgLTQ0LDkgKzQxLDYgQEAKICAgcHJpdmF0ZToKICAgICB2b2lkIEludm9rZVBhcnNlcigpOwogICAgIHZvaWQgSW52b2tlTGltaXRQYXJzZXIoKTsKLSAgICB2b2lkIEludm9rZUludGVyZmFjZVV0aWxzKCk7Ci0gICAgSW50ZXJmYWNlSW5oZXJpdGFuY2VIaWVyYXJjaHlNYXAgR2VuZXJhdGVIaWVyYXJjaHlNYXAoKTsKLSAgICBzdGQ6OnZlY3RvcjxIaWRsSW50ZXJmYWNlTWV0YWRhdGE+IEdlbmVyYXRlSW50ZXJmYWNlTWV0YWRhdGEoKTsKIAogICAgIEZ1enplZERhdGFQcm92aWRlciBmZHBfOwogfTsKQEAgLTY0LDYwICs1OCw2IEBACiAgICAgfQogfQogCi1zdGQ6OnZlY3RvcjxIaWRsSW50ZXJmYWNlTWV0YWRhdGE+IEluaXRQYXJzZXJGdXp6ZXI6OkdlbmVyYXRlSW50ZXJmYWNlTWV0YWRhdGEoKSB7Ci0gICAgc3RkOjp2ZWN0b3I8SGlkbEludGVyZmFjZU1ldGFkYXRhPiByYW5kb21faW50ZXJmYWNlOwotICAgIGZvciAoc2l6ZV90IGlkeCA9IDA7IGlkeCA8IGZkcF8uQ29uc3VtZUludGVncmFsPHNpemVfdD4oKTsgKytpZHgpIHsKLSAgICAgICAgSGlkbEludGVyZmFjZU1ldGFkYXRhIG1ldGFkYXRhOwotICAgICAgICBtZXRhZGF0YS5uYW1lID0gZmRwXy5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtNYXhCeXRlcyk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGlkeDEgPSAwOyBpZHgxIDwgZmRwXy5Db25zdW1lSW50ZWdyYWw8c2l6ZV90PigpOyArK2lkeDEpIHsKLSAgICAgICAgICAgIG1ldGFkYXRhLmluaGVyaXRlZC5wdXNoX2JhY2soZmRwXy5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtNYXhCeXRlcykpOwotICAgICAgICB9Ci0gICAgICAgIHJhbmRvbV9pbnRlcmZhY2UucHVzaF9iYWNrKG1ldGFkYXRhKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJhbmRvbV9pbnRlcmZhY2U7Ci19Ci0KLUludGVyZmFjZUluaGVyaXRhbmNlSGllcmFyY2h5TWFwIEluaXRQYXJzZXJGdXp6ZXI6OkdlbmVyYXRlSGllcmFyY2h5TWFwKCkgewotICAgIEludGVyZmFjZUluaGVyaXRhbmNlSGllcmFyY2h5TWFwIHJlc3VsdDsKLSAgICBzdGQ6OnZlY3RvcjxIaWRsSW50ZXJmYWNlTWV0YWRhdGE+IHJhbmRvbV9pbnRlcmZhY2U7Ci0gICAgaWYgKGZkcF8uQ29uc3VtZUJvb2woKSkgewotICAgICAgICByYW5kb21faW50ZXJmYWNlID0gR2VuZXJhdGVJbnRlcmZhY2VNZXRhZGF0YSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJhbmRvbV9pbnRlcmZhY2UgPSBIaWRsSW50ZXJmYWNlTWV0YWRhdGE6OmFsbCgpOwotICAgIH0KLQotICAgIGZvciAoY29uc3QgSGlkbEludGVyZmFjZU1ldGFkYXRhJiBpZmFjZSA6IHJhbmRvbV9pbnRlcmZhY2UpIHsKLSAgICAgICAgc3RkOjpzZXQ8RlFOYW1lPiBpbmhlcml0ZWRfaW50ZXJmYWNlczsKLSAgICAgICAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyYgaW50ZiA6IGlmYWNlLmluaGVyaXRlZCkgewotICAgICAgICAgICAgRlFOYW1lIGZxbmFtZTsKLSAgICAgICAgICAgICh2b2lkKWZxbmFtZS5zZXRUbyhpbnRmKTsKLSAgICAgICAgICAgIGluaGVyaXRlZF9pbnRlcmZhY2VzLmluc2VydChmcW5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIEZRTmFtZSBmcW5hbWU7Ci0gICAgICAgICh2b2lkKWZxbmFtZS5zZXRUbyhpZmFjZS5uYW1lKTsKLSAgICAgICAgcmVzdWx0W2ZxbmFtZV0gPSBpbmhlcml0ZWRfaW50ZXJmYWNlczsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCBJbml0UGFyc2VyRnV6emVyOjpJbnZva2VJbnRlcmZhY2VVdGlscygpIHsKLSAgICBJbnRlcmZhY2VJbmhlcml0YW5jZUhpZXJhcmNoeU1hcCBoaWVyYXJjaHlfbWFwID0gR2VuZXJhdGVIaWVyYXJjaHlNYXAoKTsKLSAgICBTZXRLbm93bkludGVyZmFjZXMoaGllcmFyY2h5X21hcCk7Ci0gICAgSXNLbm93bkludGVyZmFjZShmZHBfLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heEJ5dGVzKSk7Ci0gICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGludGVyZmFjZV9zZXQ7Ci0gICAgZm9yIChzaXplX3QgaWR4ID0gMDsgaWR4IDwgZmRwXy5Db25zdW1lSW50ZWdyYWw8c2l6ZV90PigpOyArK2lkeCkgewotICAgICAgICBhdXRvIHNldF9pbnRlcmZhY2VfdmFsdWVzID0gZmRwXy5QaWNrVmFsdWVJbkFycmF5PGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZCgpPj4oewotICAgICAgICAgICAgICAgIFsmXSgpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX3NldC5pbnNlcnQoKCJhaWRsLyIgKyBmZHBfLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heEJ5dGVzKSkpOwotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgWyZdKCkgeyBpbnRlcmZhY2Vfc2V0Lmluc2VydChmZHBfLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heEJ5dGVzKSk7IH0sCi0gICAgICAgICAgICAgICAgWyZdKCkgeyBpbnRlcmZhY2Vfc2V0Lmluc2VydChrVmFsaWRJbnRlcmZhY2VzKTsgfSwKLSAgICAgICAgfSk7Ci0gICAgICAgIHNldF9pbnRlcmZhY2VfdmFsdWVzKCk7Ci0gICAgfQotICAgIENoZWNrSW50ZXJmYWNlSW5oZXJpdGFuY2VIaWVyYXJjaHkoaW50ZXJmYWNlX3NldCwgaGllcmFyY2h5X21hcCk7Ci19Ci0KIHZvaWQgSW5pdFBhcnNlckZ1enplcjo6SW52b2tlUGFyc2VyKCkgewogICAgIFBhcnNlciBwYXJzZXI7CiAgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGZkcF8uQ29uc3VtZUJvb2woKSA/IGZkcF8uQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrTWF4Qnl0ZXMpIDogImltcG9ydCI7CkBAIC0xMzIsNyArNzIsNiBAQAogICAgIHdoaWxlIChmZHBfLnJlbWFpbmluZ19ieXRlcygpKSB7CiAgICAgICAgIGF1dG8gaW52b2tlX3BhcnNlcl9mdXp6ZXIgPSBmZHBfLlBpY2tWYWx1ZUluQXJyYXk8Y29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKCk+Pih7CiAgICAgICAgICAgICAgICAgWyZdKCkgeyBJbnZva2VQYXJzZXIoKTsgfSwKLSAgICAgICAgICAgICAgICBbJl0oKSB7IEludm9rZUludGVyZmFjZVV0aWxzKCk7IH0sCiAgICAgICAgICAgICAgICAgWyZdKCkgeyBJbnZva2VMaW1pdFBhcnNlcigpOyB9LAogICAgICAgICB9KTsKICAgICAgICAgaW52b2tlX3BhcnNlcl9mdXp6ZXIoKTsKZGlmZiAtLWdpdCBhL2luaXQvaG9zdF9pbml0X3N0dWJzLmggYi9pbml0L2hvc3RfaW5pdF9zdHVicy5oCmluZGV4IDc1M2VkNmIuLjJmZWY5ZDMgMTAwNjQ0Ci0tLSBhL2luaXQvaG9zdF9pbml0X3N0dWJzLmgKKysrIGIvaW5pdC9ob3N0X2luaXRfc3R1YnMuaApAQCAtMzIsNiArMzIsNyBAQAogI2RlZmluZSBfX0FORFJPSURfQVBJX1NfXyAzMQogI2RlZmluZSBfX0FORFJPSURfQVBJX1RfXyAzMwogI2RlZmluZSBfX0FORFJPSURfQVBJX1VfXyAzNAorI2RlZmluZSBfX0FORFJPSURfQVBJX1ZfXyAzNQogCiAvLyBzeXMvc3lzdGVtX3Byb3BlcnRpZXMuaAogI2RlZmluZSBQUk9QX1ZBTFVFX01BWCA5MgpkaWZmIC0tZ2l0IGEvaW5pdC9ob3N0X2luaXRfdmVyaWZpZXIuY3BwIGIvaW5pdC9ob3N0X2luaXRfdmVyaWZpZXIuY3BwCmluZGV4IGYwNzA3NzYuLjI4Nzg1N2EgMTAwNjQ0Ci0tLSBhL2luaXQvaG9zdF9pbml0X3ZlcmlmaWVyLmNwcAorKysgYi9pbml0L2hvc3RfaW5pdF92ZXJpZmllci5jcHAKQEAgLTE0LDggKzE0LDYgQEAKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLy8KIAotI2luY2x1ZGUgImhvc3RfaW5pdF92ZXJpZmllci5oIgotCiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxnZXRvcHQuaD4KICNpbmNsdWRlIDxwd2QuaD4KQEAgLTM2LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgogI2luY2x1ZGUgPGdlbmVyYXRlZF9hbmRyb2lkX2lkcy5oPgogI2luY2x1ZGUgPGhpZGwvbWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0eV9pbmZvX3BhcnNlci9wcm9wZXJ0eV9pbmZvX3BhcnNlci5oPgogI2luY2x1ZGUgPHByb3BlcnR5X2luZm9fc2VyaWFsaXplci9wcm9wZXJ0eV9pbmZvX3NlcmlhbGl6ZXIuaD4KIAogI2luY2x1ZGUgImFjdGlvbi5oIgpAQCAtNTcsOSArNTYsNyBAQAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6UGFyc2VJbnQ7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjpSZWFkRmlsZVRvU3RyaW5nOwogdXNpbmcgYW5kcm9pZDo6YmFzZTo6U3BsaXQ7Ci11c2luZyBhbmRyb2lkOjpwcm9wZXJ0aWVzOjpCdWlsZFRyaWU7CiB1c2luZyBhbmRyb2lkOjpwcm9wZXJ0aWVzOjpQYXJzZVByb3BlcnR5SW5mb0ZpbGU7Ci11c2luZyBhbmRyb2lkOjpwcm9wZXJ0aWVzOjpQcm9wZXJ0eUluZm9BcmVhOwogdXNpbmcgYW5kcm9pZDo6cHJvcGVydGllczo6UHJvcGVydHlJbmZvRW50cnk7CiAKIHN0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGFzc3dkX2ZpbGVzOwpAQCAtMTA4LDkgKzEwNSw5IEBACiAgICAgc3RhdGljIHBhc3N3ZCBzdGF0aWNfcGFzc3dkID0gewogICAgICAgICAucHdfbmFtZSA9IHN0YXRpY19uYW1lLAogICAgICAgICAucHdfZGlyID0gc3RhdGljX2RpciwKLSAgICAgICAgLnB3X3NoZWxsID0gc3RhdGljX3NoZWxsLAogICAgICAgICAucHdfdWlkID0gMCwKICAgICAgICAgLnB3X2dpZCA9IDAsCisgICAgICAgIC5wd19zaGVsbCA9IHN0YXRpY19zaGVsbCwKICAgICB9OwogCiAgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBhbmRyb2lkX2lkX2NvdW50OyArK24pIHsKQEAgLTE0OCwxMiArMTQ1LDYgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBpbml0IHsKIAotc3RhdGljIFJlc3VsdDx2b2lkPiBjaGVja19zdHViKGNvbnN0IEJ1aWx0aW5Bcmd1bWVudHMmIGFyZ3MpIHsKLSAgICByZXR1cm4ge307Ci19Ci0KLSNpbmNsdWRlICJnZW5lcmF0ZWRfc3R1Yl9idWlsdGluX2Z1bmN0aW9uX21hcC5oIgotCiB2b2lkIFByaW50VXNhZ2UoKSB7CiAgICAgZnByaW50ZihzdGRvdXQsIFIiKHVzYWdlOiBob3N0X2luaXRfdmVyaWZpZXIgW29wdGlvbnNdCiAKQEAgLTE5Niw4ICsxODcsNiBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLWNvbnN0IFByb3BlcnR5SW5mb0FyZWEqIHByb3BlcnR5X2luZm9fYXJlYTsKLQogdm9pZCBIYW5kbGVQcm9wZXJ0eUNvbnRleHRzKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQcm9wZXJ0eUluZm9FbnRyeT4qIHByb3BlcnR5X2luZm9zKSB7CiAgICAgYXV0byBmaWxlX2NvbnRlbnRzID0gc3RkOjpzdHJpbmcoKTsKQEAgLTI4OCwxNiArMjc3LDExIEBACiAgICAgfQogICAgIFNldEtub3duSW50ZXJmYWNlcygqaW50ZXJmYWNlX2luaGVyaXRhbmNlX2hpZXJhcmNoeV9tYXApOwogCi0gICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZF9jb250ZXh0czsKLSAgICBzdGQ6OnN0cmluZyB0cmllX2Vycm9yOwotICAgIGlmICghQnVpbGRUcmllKHByb3BlcnR5X2luZm9zLCAidTpvYmplY3RfcjpkZWZhdWx0X3Byb3A6czAiLCAic3RyaW5nIiwgJnNlcmlhbGl6ZWRfY29udGV4dHMsCi0gICAgICAgICAgICAgICAgICAgJnRyaWVfZXJyb3IpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBzZXJpYWxpemUgcHJvcGVydHkgY29udGV4dHM6ICIgPDwgdHJpZV9lcnJvcjsKKyAgICBpZiAoYXV0byByZXN1bHQgPSBJbml0aWFsaXplSG9zdFByb3BlcnR5SW5mb0FyZWEocHJvcGVydHlfaW5mb3MpOyAhcmVzdWx0Lm9rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCByZXN1bHQuZXJyb3IoKTsKICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKICAgICB9CiAKLSAgICBwcm9wZXJ0eV9pbmZvX2FyZWEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFByb3BlcnR5SW5mb0FyZWEqPihzZXJpYWxpemVkX2NvbnRleHRzLmNfc3RyKCkpOwotCiAgICAgaWYgKCFwYXJ0aXRpb25fbWFwLmVtcHR5KCkpIHsKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHZlbmRvcl9wcmVmaXhlczsKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwYXJ0aXRpb24gOiB7InZlbmRvciIsICJvZG0ifSkgewpAQCAtMzEzLDkgKzI5Nyw3IEBACiAgICAgQWN0aW9uTWFuYWdlciYgYW0gPSBBY3Rpb25NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpOwogICAgIFNlcnZpY2VMaXN0JiBzbCA9IFNlcnZpY2VMaXN0OjpHZXRJbnN0YW5jZSgpOwogICAgIFBhcnNlciBwYXJzZXI7Ci0gICAgcGFyc2VyLkFkZFNlY3Rpb25QYXJzZXIoInNlcnZpY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8U2VydmljZVBhcnNlcj4oJnNsLCBHZXRTdWJjb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW50ZXJmYWNlX2luaGVyaXRhbmNlX2hpZXJhcmNoeV9tYXApKTsKKyAgICBwYXJzZXIuQWRkU2VjdGlvblBhcnNlcigic2VydmljZSIsIHN0ZDo6bWFrZV91bmlxdWU8U2VydmljZVBhcnNlcj4oJnNsLCBHZXRTdWJjb250ZXh0KCkpKTsKICAgICBwYXJzZXIuQWRkU2VjdGlvblBhcnNlcigib24iLCBzdGQ6Om1ha2VfdW5pcXVlPEFjdGlvblBhcnNlcj4oJmFtLCBHZXRTdWJjb250ZXh0KCkpKTsKICAgICBwYXJzZXIuQWRkU2VjdGlvblBhcnNlcigiaW1wb3J0Iiwgc3RkOjptYWtlX3VuaXF1ZTxIb3N0SW1wb3J0UGFyc2VyPigpKTsKIApAQCAtMzMzLDExICszMTUsMjMgQEAKICAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CiAgICAgICAgIH0KICAgICB9CisKICAgICBzaXplX3QgZmFpbHVyZXMgPSBwYXJzZXIucGFyc2VfZXJyb3JfY291bnQoKSArIGFtLkNoZWNrQWxsQ29tbWFuZHMoKSArIHNsLkNoZWNrQWxsQ29tbWFuZHMoKTsKICAgICBpZiAoZmFpbHVyZXMgPiAwKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBwYXJzZSBpbml0IHNjcmlwdHMgd2l0aCAiIDw8IGZhaWx1cmVzIDw8ICIgZXJyb3IocykuIjsKICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKICAgICB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHNlcnZpY2UgOiBzbCkgeworICAgICAgICBpZiAoY29uc3QgYXV0byYgcmVzdWx0ID0gQ2hlY2tJbnRlcmZhY2VJbmhlcml0YW5jZUhpZXJhcmNoeSgKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZS0+aW50ZXJmYWNlcygpLCAqaW50ZXJmYWNlX2luaGVyaXRhbmNlX2hpZXJhcmNoeV9tYXApOworICAgICAgICAgICAgIXJlc3VsdC5vaygpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8IHNlcnZpY2UtPmZpbGVuYW1lKCkgPDwgIjogaW52YWxpZCBpbnRlcmZhY2UgaW4gc2VydmljZSAnIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBzZXJ2aWNlLT5uYW1lKCkgPDwgIic6ICIgPDwgcmVzdWx0LmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICB9CisgICAgfQorCiAgICAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKIH0KIApkaWZmIC0tZ2l0IGEvaW5pdC9pbml0LmNwcCBiL2luaXQvaW5pdC5jcHAKaW5kZXggYmUxZWJlZS4uMTc0OThkYSAxMDA2NDQKLS0tIGEvaW5pdC9pbml0LmNwcAorKysgYi9pbml0L2luaXQuY3BwCkBAIC0yNiwxMyArMjYsMTEgQEAKICNpbmNsdWRlIDxzeXMvZXZlbnRmZC5oPgogI2luY2x1ZGUgPHN5cy9tb3VudC5oPgogI2luY2x1ZGUgPHN5cy9zaWduYWxmZC5oPgorI2luY2x1ZGUgPHN5cy9zeXN0ZW1fcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKLSNkZWZpbmUgX1JFQUxMWV9JTkNMVURFX1NZU19fU1lTVEVNX1BST1BFUlRJRVNfSF8KLSNpbmNsdWRlIDxzeXMvX3N5c3RlbV9wcm9wZXJ0aWVzLmg+Ci0KICNpbmNsdWRlIDxmaWxlc3lzdGVtPgogI2luY2x1ZGUgPGZzdHJlYW0+CiAjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KQEAgLTU0LDcgKzUyLDYgQEAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdGhyZWFkX2Fubm90YXRpb25zLmg+CiAjaW5jbHVkZSA8ZnNfYXZiL2ZzX2F2Yi5oPgogI2luY2x1ZGUgPGZzX21ncl92ZW5kb3Jfb3ZlcmxheS5oPgotI2luY2x1ZGUgPGtleXV0aWxzLmg+CiAjaW5jbHVkZSA8bGliYXZiL2xpYmF2Yi5oPgogI2luY2x1ZGUgPGxpYmdzaS9saWJnc2kuaD4KICNpbmNsdWRlIDxsaWJzbmFwc2hvdC9zbmFwc2hvdC5oPgpAQCAtMTA4LDYgKzEwNSw3IEBACiB1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjpUaW1lcjsKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlRyaW07Cit1c2luZyBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQ7CiB1c2luZyBhbmRyb2lkOjpmc19tZ3I6OkF2YkhhbmRsZTsKIHVzaW5nIGFuZHJvaWQ6OnNuYXBzaG90OjpTbmFwc2hvdE1hbmFnZXI7CiAKQEAgLTExNiw3ICsxMTQsNyBAQAogCiBzdGF0aWMgaW50IHByb3BlcnR5X3RyaWdnZXJzX2VuYWJsZWQgPSAwOwogCi1zdGF0aWMgaW50IHNpZ25hbF9mZCA9IC0xOworc3RhdGljIGludCBzaWd0ZXJtX2ZkID0gLTE7CiBzdGF0aWMgaW50IHByb3BlcnR5X2ZkID0gLTE7CiAKIHN0cnVjdCBQZW5kaW5nQ29udHJvbE1lc3NhZ2UgewpAQCAtMjcwLDggKzI2OCw4IEBACiBQYXJzZXIgQ3JlYXRlUGFyc2VyKEFjdGlvbk1hbmFnZXImIGFjdGlvbl9tYW5hZ2VyLCBTZXJ2aWNlTGlzdCYgc2VydmljZV9saXN0KSB7CiAgICAgUGFyc2VyIHBhcnNlcjsKIAotICAgIHBhcnNlci5BZGRTZWN0aW9uUGFyc2VyKCJzZXJ2aWNlIiwgc3RkOjptYWtlX3VuaXF1ZTxTZXJ2aWNlUGFyc2VyPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlcnZpY2VfbGlzdCwgR2V0U3ViY29udGV4dCgpLCBzdGQ6Om51bGxvcHQpKTsKKyAgICBwYXJzZXIuQWRkU2VjdGlvblBhcnNlcigic2VydmljZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxTZXJ2aWNlUGFyc2VyPigmc2VydmljZV9saXN0LCBHZXRTdWJjb250ZXh0KCkpKTsKICAgICBwYXJzZXIuQWRkU2VjdGlvblBhcnNlcigib24iLCBzdGQ6Om1ha2VfdW5pcXVlPEFjdGlvblBhcnNlcj4oJmFjdGlvbl9tYW5hZ2VyLCBHZXRTdWJjb250ZXh0KCkpKTsKICAgICBwYXJzZXIuQWRkU2VjdGlvblBhcnNlcigiaW1wb3J0Iiwgc3RkOjptYWtlX3VuaXF1ZTxJbXBvcnRQYXJzZXI+KCZwYXJzZXIpKTsKIApAQCAtMzI2LDkgKzMyNCw3IEBACiAgICAgICAgIH0KICAgICB9CiAjZW5kaWYgIC8vIFJFQ09WRVJZCi0gICAgcGFyc2VyLkFkZFNlY3Rpb25QYXJzZXIoInNlcnZpY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8U2VydmljZVBhcnNlcj4oJnNlcnZpY2VfbGlzdCwgc3ViY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om51bGxvcHQpKTsKKyAgICBwYXJzZXIuQWRkU2VjdGlvblBhcnNlcigic2VydmljZSIsIHN0ZDo6bWFrZV91bmlxdWU8U2VydmljZVBhcnNlcj4oJnNlcnZpY2VfbGlzdCwgc3ViY29udGV4dCkpOwogICAgIHBhcnNlci5BZGRTZWN0aW9uUGFyc2VyKCJvbiIsIHN0ZDo6bWFrZV91bmlxdWU8QWN0aW9uUGFyc2VyPigmYWN0aW9uX21hbmFnZXIsIHN1YmNvbnRleHQpKTsKIAogICAgIHJldHVybiBwYXJzZXI7CkBAIC00ODcsNyArNDgzLDcgQEAKIH0KIAogc3RhdGljIFJlc3VsdDx2b2lkPiBEb0xvYWRBcGV4KGNvbnN0IHN0ZDo6c3RyaW5nJiBhcGV4X25hbWUpIHsKLSAgICBpZiAoYXV0byByZXN1bHQgPSBQYXJzZUFwZXhDb25maWdzKGFwZXhfbmFtZSk7ICFyZXN1bHQub2soKSkgeworICAgIGlmIChhdXRvIHJlc3VsdCA9IFBhcnNlUmNTY3JpcHRzRnJvbUFwZXgoYXBleF9uYW1lKTsgIXJlc3VsdC5vaygpKSB7CiAgICAgICAgIHJldHVybiByZXN1bHQuZXJyb3IoKTsKICAgICB9CiAKQEAgLTY0MCw5ICs2MzYsNiBAQAogICAgICAgICBMT0coSU5GTykgPDwgIkNncm91cHMgc3VwcG9ydCBpbiBrZXJuZWwgaXMgbm90IGVuYWJsZWQiOwogICAgICAgICByZXR1cm4ge307CiAgICAgfQotICAgIC8vIEhhdmUgdG8gY3JlYXRlIDxDR1JPVVBTX1JDX0RJUj4gdXNpbmcgbWFrZV9kaXIgZnVuY3Rpb24KLSAgICAvLyBmb3IgYXBwcm9wcmlhdGUgc2Vwb2xpY3kgdG8gYmUgc2V0IGZvciBpdAotICAgIG1ha2VfZGlyKGFuZHJvaWQ6OmJhc2U6OkRpcm5hbWUoQ0dST1VQU19SQ19QQVRIKSwgMDcxMSk7CiAgICAgaWYgKCFDZ3JvdXBTZXR1cCgpKSB7CiAgICAgICAgIHJldHVybiBFcnJub0Vycm9yKCkgPDwgIkZhaWxlZCB0byBzZXR1cCBjZ3JvdXBzIjsKICAgICB9CkBAIC03MTMsOCArNzA2LDkgQEAKICAgICBIYW5kbGVQb3dlcmN0bE1lc3NhZ2UoInNodXRkb3duLGNvbnRhaW5lciIpOwogfQogCi1zdGF0aWMgdm9pZCBIYW5kbGVTaWduYWxGZCgpIHsKK3N0YXRpYyB2b2lkIEhhbmRsZVNpZ25hbEZkKGludCBzaWduYWwpIHsKICAgICBzaWduYWxmZF9zaWdpbmZvIHNpZ2luZm87CisgICAgY29uc3QgaW50IHNpZ25hbF9mZCA9IHNpZ25hbCA9PSBTSUdDSExEID8gU2VydmljZTo6R2V0U2lnY2hsZEZkKCkgOiBzaWd0ZXJtX2ZkOwogICAgIHNzaXplX3QgYnl0ZXNfcmVhZCA9IFRFTVBfRkFJTFVSRV9SRVRSWShyZWFkKHNpZ25hbF9mZCwgJnNpZ2luZm8sIHNpemVvZihzaWdpbmZvKSkpOwogICAgIGlmIChieXRlc19yZWFkICE9IHNpemVvZihzaWdpbmZvKSkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlYWQgc2lnaW5mbyBmcm9tIHNpZ25hbF9mZCI7CkBAIC03NDgsNDAgKzc0Miw1MSBAQAogICAgIH0KIH0KIAorc3RhdGljIFJlc3VsdDx2b2lkPiBSZWdpc3RlclNpZ25hbEZkKEVwb2xsKiBlcG9sbCwgaW50IHNpZ25hbCwgaW50IGZkKSB7CisgICAgcmV0dXJuIGVwb2xsLT5SZWdpc3RlckhhbmRsZXIoCisgICAgICAgICAgICBmZCwgW3NpZ25hbF0oKSB7IEhhbmRsZVNpZ25hbEZkKHNpZ25hbCk7IH0sIEVQT0xMSU4gfCBFUE9MTFBSSSk7Cit9CisKK3N0YXRpYyBSZXN1bHQ8aW50PiBDcmVhdGVBbmRSZWdpc3RlclNpZ25hbEZkKEVwb2xsKiBlcG9sbCwgaW50IHNpZ25hbCkgeworICAgIHNpZ3NldF90IG1hc2s7CisgICAgc2lnZW1wdHlzZXQoJm1hc2spOworICAgIHNpZ2FkZHNldCgmbWFzaywgc2lnbmFsKTsKKyAgICBpZiAoc2lncHJvY21hc2soU0lHX0JMT0NLLCAmbWFzaywgbnVsbHB0cikgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIEVycm5vRXJyb3IoKSA8PCAiZmFpbGVkIHRvIGJsb2NrIHNpZ25hbCAiIDw8IHNpZ25hbDsKKyAgICB9CisKKyAgICB1bmlxdWVfZmQgc2lnbmFsX2ZkKHNpZ25hbGZkKC0xLCAmbWFzaywgU0ZEX0NMT0VYRUMpKTsKKyAgICBpZiAoc2lnbmFsX2ZkLmdldCgpIDwgMCkgeworICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJmYWlsZWQgdG8gY3JlYXRlIHNpZ25hbGZkIGZvciBzaWduYWwgIiA8PCBzaWduYWw7CisgICAgfQorICAgIE9SX1JFVFVSTihSZWdpc3RlclNpZ25hbEZkKGVwb2xsLCBzaWduYWwsIHNpZ25hbF9mZC5nZXQoKSkpOworCisgICAgcmV0dXJuIHNpZ25hbF9mZC5yZWxlYXNlKCk7Cit9CisKIHN0YXRpYyB2b2lkIEluc3RhbGxTaWduYWxGZEhhbmRsZXIoRXBvbGwqIGVwb2xsKSB7CiAgICAgLy8gQXBwbHlpbmcgU0FfTk9DTERTVE9QIHRvIGEgZGVmYXVsdGVkIFNJR0NITEQgaGFuZGxlciBwcmV2ZW50cyB0aGUgc2lnbmFsZmQgZnJvbSByZWNlaXZpbmcKICAgICAvLyBTSUdDSExEIHdoZW4gYSBjaGlsZCBwcm9jZXNzIHN0b3BzIG9yIGNvbnRpbnVlcyAoYi83Nzg2NzY4MCNjb21tZW50OSkuCi0gICAgY29uc3Qgc3RydWN0IHNpZ2FjdGlvbiBhY3QgeyAuc2FfaGFuZGxlciA9IFNJR19ERkwsIC5zYV9mbGFncyA9IFNBX05PQ0xEU1RPUCB9OworICAgIGNvbnN0IHN0cnVjdCBzaWdhY3Rpb24gYWN0IHsgLnNhX2ZsYWdzID0gU0FfTk9DTERTVE9QLCAuc2FfaGFuZGxlciA9IFNJR19ERkwgfTsKICAgICBzaWdhY3Rpb24oU0lHQ0hMRCwgJmFjdCwgbnVsbHB0cik7CiAKLSAgICBzaWdzZXRfdCBtYXNrOwotICAgIHNpZ2VtcHR5c2V0KCZtYXNrKTsKLSAgICBzaWdhZGRzZXQoJm1hc2ssIFNJR0NITEQpOwotCi0gICAgaWYgKCFJc1JlYm9vdENhcGFibGUoKSkgewotICAgICAgICAvLyBJZiBpbml0IGRvZXMgbm90IGhhdmUgdGhlIENBUF9TWVNfQk9PVCBjYXBhYmlsaXR5LCBpdCBpcyBydW5uaW5nIGluIGEgY29udGFpbmVyLgotICAgICAgICAvLyBJbiB0aGF0IGNhc2UsIHJlY2VpdmluZyBTSUdURVJNIHdpbGwgY2F1c2UgdGhlIHN5c3RlbSB0byBzaHV0IGRvd24uCi0gICAgICAgIHNpZ2FkZHNldCgmbWFzaywgU0lHVEVSTSk7Ci0gICAgfQotCi0gICAgaWYgKHNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJm1hc2ssIG51bGxwdHIpID09IC0xKSB7Ci0gICAgICAgIFBMT0coRkFUQUwpIDw8ICJmYWlsZWQgdG8gYmxvY2sgc2lnbmFscyI7Ci0gICAgfQotCiAgICAgLy8gUmVnaXN0ZXIgYSBoYW5kbGVyIHRvIHVuYmxvY2sgc2lnbmFscyBpbiB0aGUgY2hpbGQgcHJvY2Vzc2VzLgogICAgIGNvbnN0IGludCByZXN1bHQgPSBwdGhyZWFkX2F0Zm9yayhudWxscHRyLCBudWxscHRyLCAmVW5ibG9ja1NpZ25hbHMpOwogICAgIGlmIChyZXN1bHQgIT0gMCkgewogICAgICAgICBMT0coRkFUQUwpIDw8ICJGYWlsZWQgdG8gcmVnaXN0ZXIgYSBmb3JrIGhhbmRsZXI6ICIgPDwgc3RyZXJyb3IocmVzdWx0KTsKICAgICB9CiAKLSAgICBzaWduYWxfZmQgPSBzaWduYWxmZCgtMSwgJm1hc2ssIFNGRF9DTE9FWEVDKTsKLSAgICBpZiAoc2lnbmFsX2ZkID09IC0xKSB7Ci0gICAgICAgIFBMT0coRkFUQUwpIDw8ICJmYWlsZWQgdG8gY3JlYXRlIHNpZ25hbGZkIjsKKyAgICBSZXN1bHQ8dm9pZD4gY3NfcmVzdWx0ID0gUmVnaXN0ZXJTaWduYWxGZChlcG9sbCwgU0lHQ0hMRCwgU2VydmljZTo6R2V0U2lnY2hsZEZkKCkpOworICAgIGlmICghY3NfcmVzdWx0Lm9rKCkpIHsKKyAgICAgICAgUExPRyhGQVRBTCkgPDwgY3NfcmVzdWx0LmVycm9yKCk7CiAgICAgfQogCi0gICAgY29uc3RleHByIGludCBmbGFncyA9IEVQT0xMSU4gfCBFUE9MTFBSSTsKLSAgICBpZiAoYXV0byByZXN1bHQgPSBlcG9sbC0+UmVnaXN0ZXJIYW5kbGVyKHNpZ25hbF9mZCwgSGFuZGxlU2lnbmFsRmQsIGZsYWdzKTsgIXJlc3VsdC5vaygpKSB7Ci0gICAgICAgIExPRyhGQVRBTCkgPDwgcmVzdWx0LmVycm9yKCk7CisgICAgaWYgKCFJc1JlYm9vdENhcGFibGUoKSkgeworICAgICAgICBSZXN1bHQ8aW50PiBjc19yZXN1bHQgPSBDcmVhdGVBbmRSZWdpc3RlclNpZ25hbEZkKGVwb2xsLCBTSUdURVJNKTsKKyAgICAgICAgaWYgKCFjc19yZXN1bHQub2soKSkgeworICAgICAgICAgICAgUExPRyhGQVRBTCkgPDwgY3NfcmVzdWx0LmVycm9yKCk7CisgICAgICAgIH0KKyAgICAgICAgc2lndGVybV9mZCA9IGNzX3Jlc3VsdC52YWx1ZSgpOwogICAgIH0KIH0KIApAQCAtODMyLDYgKzgzNywxMiBAQAogICAgIENIRUNLQ0FMTChtb3VudCgidG1wZnMiLCAiL2FwZXgiLCAidG1wZnMiLCBNU19OT0VYRUMgfCBNU19OT1NVSUQgfCBNU19OT0RFViwKICAgICAgICAgICAgICAgICAgICAgIm1vZGU9MDc1NSx1aWQ9MCxnaWQ9MCIpKTsKIAorICAgIGlmIChOZWVkc1R3b01vdW50TmFtZXNwYWNlcygpKSB7CisgICAgICAgIC8vIC9ib290c3RyYXAtYXBleCBpcyB1c2VkIHRvIG1vdW50ICJib290c3RyYXAiIEFQRVhlcy4KKyAgICAgICAgQ0hFQ0tDQUxMKG1vdW50KCJ0bXBmcyIsICIvYm9vdHN0cmFwLWFwZXgiLCAidG1wZnMiLCBNU19OT0VYRUMgfCBNU19OT1NVSUQgfCBNU19OT0RFViwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtb2RlPTA3NTUsdWlkPTAsZ2lkPTAiKSk7CisgICAgfQorCiAgICAgLy8gL2xpbmtlcmNvbmZpZyBpcyB1c2VkIHRvIGtlZXAgZ2VuZXJhdGVkIGxpbmtlciBjb25maWd1cmF0aW9uCiAgICAgQ0hFQ0tDQUxMKG1vdW50KCJ0bXBmcyIsICIvbGlua2VyY29uZmlnIiwgInRtcGZzIiwgTVNfTk9FWEVDIHwgTVNfTk9TVUlEIHwgTVNfTk9ERVYsCiAgICAgICAgICAgICAgICAgICAgICJtb2RlPTA3NTUsdWlkPTAsZ2lkPTAiKSk7CkBAIC05NTIsMTEgKzk2Myw2IEBACiAgICAgICAgICAgICAgICAgICAgPDwgIiB0byAvcHJvYy8xL29vbV9zY29yZV9hZGo6ICIgPDwgcmVzdWx0LmVycm9yKCk7CiAgICAgfQogCi0gICAgLy8gU2V0IHVwIGEgc2Vzc2lvbiBrZXlyaW5nIHRoYXQgYWxsIHByb2Nlc3NlcyB3aWxsIGhhdmUgYWNjZXNzIHRvLiBJdAotICAgIC8vIHdpbGwgaG9sZCB0aGluZ3MgbGlrZSBGQkUgZW5jcnlwdGlvbiBrZXlzLiBObyBwcm9jZXNzIHNob3VsZCBvdmVycmlkZQotICAgIC8vIGl0cyBzZXNzaW9uIGtleXJpbmcuCi0gICAga2V5Y3RsX2dldF9rZXlyaW5nX0lEKEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMSk7Ci0KICAgICAvLyBJbmRpY2F0ZSB0aGF0IGJvb3RpbmcgaXMgaW4gcHJvZ3Jlc3MgdG8gYmFja2dyb3VuZCBmdyBsb2FkZXJzLCBldGMuCiAgICAgY2xvc2Uob3BlbigiL2Rldi8uYm9vdGluZyIsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fQ0xPRVhFQywgMDAwMCkpOwogCkBAIC0xMDQzLDEyICsxMDQ5LDE4IEBACiAgICAgU2V0UHJvcGVydHkoZ3NpOjprR3NpQm9vdGVkUHJvcCwgaXNfcnVubmluZyk7CiAgICAgYXV0byBpc19pbnN0YWxsZWQgPSBhbmRyb2lkOjpnc2k6OklzR3NpSW5zdGFsbGVkKCkgPyAiMSIgOiAiMCI7CiAgICAgU2V0UHJvcGVydHkoZ3NpOjprR3NpSW5zdGFsbGVkUHJvcCwgaXNfaW5zdGFsbGVkKTsKKyAgICBpZiAoYW5kcm9pZDo6Z3NpOjpJc0dzaVJ1bm5pbmcoKSkgeworICAgICAgICBzdGQ6OnN0cmluZyBkc3Vfc2xvdDsKKyAgICAgICAgaWYgKGFuZHJvaWQ6OmdzaTo6R2V0QWN0aXZlRHN1KCZkc3Vfc2xvdCkpIHsKKyAgICAgICAgICAgIFNldFByb3BlcnR5KGdzaTo6a0RzdVNsb3RQcm9wLCBkc3Vfc2xvdCk7CisgICAgICAgIH0KKyAgICB9CiAKICAgICBhbS5RdWV1ZUJ1aWx0aW5BY3Rpb24oU2V0dXBDZ3JvdXBzQWN0aW9uLCAiU2V0dXBDZ3JvdXBzIik7CiAgICAgYW0uUXVldWVCdWlsdGluQWN0aW9uKFNldEtwdHJSZXN0cmljdEFjdGlvbiwgIlNldEtwdHJSZXN0cmljdCIpOwogICAgIGFtLlF1ZXVlQnVpbHRpbkFjdGlvbihUZXN0UGVyZkV2ZW50U2VsaW51eEFjdGlvbiwgIlRlc3RQZXJmRXZlbnRTZWxpbnV4Iik7Ci0gICAgYW0uUXVldWVCdWlsdGluQWN0aW9uKENvbm5lY3RFYXJseVN0YWdlU25hcHVzZXJkQWN0aW9uLCAiQ29ubmVjdEVhcmx5U3RhZ2VTbmFwdXNlcmQiKTsKICAgICBhbS5RdWV1ZUV2ZW50VHJpZ2dlcigiZWFybHktaW5pdCIpOworICAgIGFtLlF1ZXVlQnVpbHRpbkFjdGlvbihDb25uZWN0RWFybHlTdGFnZVNuYXB1c2VyZEFjdGlvbiwgIkNvbm5lY3RFYXJseVN0YWdlU25hcHVzZXJkIik7CiAKICAgICAvLyBRdWV1ZSBhbiBhY3Rpb24gdGhhdCB3YWl0cyBmb3IgY29sZGJvb3QgZG9uZSBzbyB3ZSBrbm93IHVldmVudGQgaGFzIHNldCB1cCBhbGwgb2YgL2Rldi4uLgogICAgIGFtLlF1ZXVlQnVpbHRpbkFjdGlvbih3YWl0X2Zvcl9jb2xkYm9vdF9kb25lX2FjdGlvbiwgIndhaXRfZm9yX2NvbGRib290X2RvbmUiKTsKZGlmZiAtLWdpdCBhL2luaXQvaW5pdF90ZXN0LmNwcCBiL2luaXQvaW5pdF90ZXN0LmNwcAppbmRleCAwZmMzZmZjLi5mMjgwZGU5IDEwMDY0NAotLS0gYS9pbml0L2luaXRfdGVzdC5jcHAKKysrIGIvaW5pdC9pbml0X3Rlc3QuY3BwCkBAIC02Miw4ICs2Miw3IEBACiAgICAgQWN0aW9uOjpzZXRfZnVuY3Rpb25fbWFwKCZ0ZXN0X2Z1bmN0aW9uX21hcCk7CiAKICAgICBQYXJzZXIgcGFyc2VyOwotICAgIHBhcnNlci5BZGRTZWN0aW9uUGFyc2VyKCJzZXJ2aWNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPFNlcnZpY2VQYXJzZXI+KHNlcnZpY2VfbGlzdCwgbnVsbHB0ciwgc3RkOjpudWxsb3B0KSk7CisgICAgcGFyc2VyLkFkZFNlY3Rpb25QYXJzZXIoInNlcnZpY2UiLCBzdGQ6Om1ha2VfdW5pcXVlPFNlcnZpY2VQYXJzZXI+KHNlcnZpY2VfbGlzdCwgbnVsbHB0cikpOwogICAgIHBhcnNlci5BZGRTZWN0aW9uUGFyc2VyKCJvbiIsIHN0ZDo6bWFrZV91bmlxdWU8QWN0aW9uUGFyc2VyPihhY3Rpb25fbWFuYWdlciwgbnVsbHB0cikpOwogICAgIHBhcnNlci5BZGRTZWN0aW9uUGFyc2VyKCJpbXBvcnQiLCBzdGQ6Om1ha2VfdW5pcXVlPEltcG9ydFBhcnNlcj4oJnBhcnNlcikpOwogCkBAIC0xODAsOSArMTc5LDExIEBACiAgICAgc3RkOjpzdHJpbmcgaW5pdF9zY3JpcHQgPSBSImluaXQoCiBzZXJ2aWNlIEEgc29tZXRoaW5nCiAgICAgY2xhc3MgZmlyc3QKKyAgICB1c2VyIG5vYm9keQogCiBzZXJ2aWNlIEEgc29tZXRoaW5nCiAgICAgY2xhc3Mgc2Vjb25kCisgICAgdXNlciBub2JvZHkKICAgICBvdmVycmlkZQogCiApaW5pdCI7CkBAIC02MTAsNiArNjExLDMwIEBACiAgICAgRVhQRUNUX0VRKDIsIG51bV9leGVjdXRlZCk7CiB9CiAKK1RFU1QoaW5pdCwgUmVqZWN0c05vVXNlclN0YXJ0aW5nSW5WKSB7CisgICAgc3RkOjpzdHJpbmcgaW5pdF9zY3JpcHQgPQorICAgICAgICAgICAgUiJpbml0KAorc2VydmljZSBBIHNvbWV0aGluZworICAgIGNsYXNzIGZpcnN0CispaW5pdCI7CisKKyAgICBUZW1wb3JhcnlGaWxlIHRmOworICAgIEFTU0VSVF9UUlVFKHRmLmZkICE9IC0xKTsKKyAgICBBU1NFUlRfVFJVRShhbmRyb2lkOjpiYXNlOjpXcml0ZVN0cmluZ1RvRmQoaW5pdF9zY3JpcHQsIHRmLmZkKSk7CisKKyAgICBTZXJ2aWNlTGlzdCBzZXJ2aWNlX2xpc3Q7CisgICAgUGFyc2VyIHBhcnNlcjsKKyAgICBwYXJzZXIuQWRkU2VjdGlvblBhcnNlcigic2VydmljZSIsIHN0ZDo6bWFrZV91bmlxdWU8U2VydmljZVBhcnNlcj4oJnNlcnZpY2VfbGlzdCwgbnVsbHB0cikpOworCisgICAgQVNTRVJUX1RSVUUocGFyc2VyLlBhcnNlQ29uZmlnKHRmLnBhdGgpKTsKKworICAgIGlmIChHZXRJbnRQcm9wZXJ0eSgicm8udmVuZG9yLmFwaV9sZXZlbCIsIDApID4gMjAyNDA0KSB7CisgICAgICAgIEFTU0VSVF9FUSgxdSwgcGFyc2VyLnBhcnNlX2Vycm9yX2NvdW50KCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9FUSgwdSwgcGFyc2VyLnBhcnNlX2Vycm9yX2NvdW50KCkpOworICAgIH0KK30KKwogVEVTVChpbml0LCBSZWplY3RzQ3JpdGljYWxBbmRPbmVzaG90U2VydmljZSkgewogICAgIGlmIChHZXRJbnRQcm9wZXJ0eSgicm8ucHJvZHVjdC5maXJzdF9hcGlfbGV2ZWwiLCAxMDAwMCkgPCAzMCkgewogICAgICAgICBHVEVTVF9TS0lQKCkgPDwgIlRlc3Qgb25seSB2YWxpZCBmb3IgZGV2aWNlcyBsYXVuY2hpbmcgd2l0aCBSIG9yIGxhdGVyIjsKQEAgLTYxOSw2ICs2NDQsNyBAQAogICAgICAgICAgICAgUiJpbml0KAogc2VydmljZSBBIHNvbWV0aGluZwogICBjbGFzcyBmaXJzdAorICB1c2VyIHJvb3QKICAgY3JpdGljYWwKICAgb25lc2hvdAogKWluaXQiOwpAQCAtNjI5LDggKzY1NSw3IEBACiAKICAgICBTZXJ2aWNlTGlzdCBzZXJ2aWNlX2xpc3Q7CiAgICAgUGFyc2VyIHBhcnNlcjsKLSAgICBwYXJzZXIuQWRkU2VjdGlvblBhcnNlcigic2VydmljZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxTZXJ2aWNlUGFyc2VyPigmc2VydmljZV9saXN0LCBudWxscHRyLCBzdGQ6Om51bGxvcHQpKTsKKyAgICBwYXJzZXIuQWRkU2VjdGlvblBhcnNlcigic2VydmljZSIsIHN0ZDo6bWFrZV91bmlxdWU8U2VydmljZVBhcnNlcj4oJnNlcnZpY2VfbGlzdCwgbnVsbHB0cikpOwogCiAgICAgQVNTRVJUX1RSVUUocGFyc2VyLlBhcnNlQ29uZmlnKHRmLnBhdGgpKTsKICAgICBBU1NFUlRfRVEoMXUsIHBhcnNlci5wYXJzZV9lcnJvcl9jb3VudCgpKTsKZGlmZiAtLWdpdCBhL2luaXQvaW50ZXJmYWNlX3V0aWxzLmNwcCBiL2luaXQvaW50ZXJmYWNlX3V0aWxzLmNwcAppbmRleCAxYjc2YmJhLi44NDQwN2FhIDEwMDY0NAotLS0gYS9pbml0L2ludGVyZmFjZV91dGlscy5jcHAKKysrIGIvaW5pdC9pbnRlcmZhY2VfdXRpbHMuY3BwCkBAIC0zOSwyNyArMzksNiBAQAogICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpKb2luKGZxbmFtZV9zdHJpbmdzLCAiICIpOwogfQogCi19ICAvLyBuYW1lc3BhY2UKLQotUmVzdWx0PHZvaWQ+IENoZWNrSW50ZXJmYWNlSW5oZXJpdGFuY2VIaWVyYXJjaHkoY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBpbnN0YW5jZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnRlcmZhY2VJbmhlcml0YW5jZUhpZXJhcmNoeU1hcCYgaGllcmFyY2h5KSB7Ci0gICAgc3RkOjpzZXQ8RlFOYW1lPiBpbnRlcmZhY2VfZnFuYW1lczsKLSAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnN0YW5jZSA6IGluc3RhbmNlcykgewotICAgICAgICAvLyBUaGVyZSBpcyBpbnN1ZmZpY2llbnQgYnVpbGQtdGltZSBpbmZvcm1hdGlvbiBvbiBBSURMIGludGVyZmFjZXMgdG8gY2hlY2sgdGhlbSBoZXJlCi0gICAgICAgIC8vIFRPRE8oYi8xMzkzMDc1MjcpOiBSZXdvcmsgaG93IHNlcnZpY2VzIHN0b3JlIGludGVyZmFjZXMgdG8gYXZvaWQgZXhjZXNzIHN0cmluZyBwYXJzaW5nCi0gICAgICAgIGlmIChiYXNlOjpTcGxpdChpbnN0YW5jZSwgIi8iKVswXSA9PSAiYWlkbCIpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgRnFJbnN0YW5jZSBmcWluc3RhbmNlOwotICAgICAgICBpZiAoIWZxaW5zdGFuY2Uuc2V0VG8oaW5zdGFuY2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiVW5hYmxlIHRvIHBhcnNlIGludGVyZmFjZSBpbnN0YW5jZSAnIiA8PCBpbnN0YW5jZSA8PCAiJyI7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJmYWNlX2ZxbmFtZXMuaW5zZXJ0KGZxaW5zdGFuY2UuZ2V0RnFOYW1lKCkpOwotICAgIH0KLSAgICByZXR1cm4gQ2hlY2tJbnRlcmZhY2VJbmhlcml0YW5jZUhpZXJhcmNoeShpbnRlcmZhY2VfZnFuYW1lcywgaGllcmFyY2h5KTsKLX0KLQogUmVzdWx0PHZvaWQ+IENoZWNrSW50ZXJmYWNlSW5oZXJpdGFuY2VIaWVyYXJjaHkoY29uc3Qgc3RkOjpzZXQ8RlFOYW1lPiYgaW50ZXJmYWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludGVyZmFjZUluaGVyaXRhbmNlSGllcmFyY2h5TWFwJiBoaWVyYXJjaHkpIHsKICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gZXJyb3Jfc3RyZWFtOwpAQCAtOTAsNiArNjksMjcgQEAKICAgICByZXR1cm4ge307CiB9CiAKK30gIC8vIG5hbWVzcGFjZQorCitSZXN1bHQ8dm9pZD4gQ2hlY2tJbnRlcmZhY2VJbmhlcml0YW5jZUhpZXJhcmNoeShjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mIGluc3RhbmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludGVyZmFjZUluaGVyaXRhbmNlSGllcmFyY2h5TWFwJiBoaWVyYXJjaHkpIHsKKyAgICBzdGQ6OnNldDxGUU5hbWU+IGludGVyZmFjZV9mcW5hbWVzOworICAgIGZvciAoY29uc3Qgc3RkOjpzdHJpbmcmIGluc3RhbmNlIDogaW5zdGFuY2VzKSB7CisgICAgICAgIC8vIFRoZXJlIGlzIGluc3VmZmljaWVudCBidWlsZC10aW1lIGluZm9ybWF0aW9uIG9uIEFJREwgaW50ZXJmYWNlcyB0byBjaGVjayB0aGVtIGhlcmUKKyAgICAgICAgLy8gVE9ETyhiLzEzOTMwNzUyNyk6IFJld29yayBob3cgc2VydmljZXMgc3RvcmUgaW50ZXJmYWNlcyB0byBhdm9pZCBleGNlc3Mgc3RyaW5nIHBhcnNpbmcKKyAgICAgICAgaWYgKGJhc2U6OlNwbGl0KGluc3RhbmNlLCAiLyIpWzBdID09ICJhaWRsIikgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBGcUluc3RhbmNlIGZxaW5zdGFuY2U7CisgICAgICAgIGlmICghZnFpbnN0YW5jZS5zZXRUbyhpbnN0YW5jZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJVbmFibGUgdG8gcGFyc2UgaW50ZXJmYWNlIGluc3RhbmNlICciIDw8IGluc3RhbmNlIDw8ICInIjsKKyAgICAgICAgfQorICAgICAgICBpbnRlcmZhY2VfZnFuYW1lcy5pbnNlcnQoZnFpbnN0YW5jZS5nZXRGcU5hbWUoKSk7CisgICAgfQorICAgIHJldHVybiBDaGVja0ludGVyZmFjZUluaGVyaXRhbmNlSGllcmFyY2h5KGludGVyZmFjZV9mcW5hbWVzLCBoaWVyYXJjaHkpOworfQorCiBzdGQ6Om9wdGlvbmFsPHN0ZDo6c2V0PEZRTmFtZT4+IGtub3duX2ludGVyZmFjZXM7CiAKIHZvaWQgU2V0S25vd25JbnRlcmZhY2VzKGNvbnN0IEludGVyZmFjZUluaGVyaXRhbmNlSGllcmFyY2h5TWFwJiBoaWVyYXJjaHkpIHsKZGlmZiAtLWdpdCBhL2luaXQvaW50ZXJmYWNlX3V0aWxzLmggYi9pbml0L2ludGVyZmFjZV91dGlscy5oCmluZGV4IDRjYTM3N2YuLjIxNGZlZGEgMTAwNjQ0Ci0tLSBhL2luaXQvaW50ZXJmYWNlX3V0aWxzLmgKKysrIGIvaW5pdC9pbnRlcmZhY2VfdXRpbHMuaApAQCAtMzQsOCArMzQsNiBAQAogLy8gaW50ZXJmYWNlIHNldC4gVXNlcyB0aGUgcHJvdmlkZWQgaGllcmFyY2h5IGRhdGEuCiBSZXN1bHQ8dm9pZD4gQ2hlY2tJbnRlcmZhY2VJbmhlcml0YW5jZUhpZXJhcmNoeShjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mIGluc3RhbmNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludGVyZmFjZUluaGVyaXRhbmNlSGllcmFyY2h5TWFwJiBoaWVyYXJjaHkpOwotUmVzdWx0PHZvaWQ+IENoZWNrSW50ZXJmYWNlSW5oZXJpdGFuY2VIaWVyYXJjaHkoY29uc3Qgc3RkOjpzZXQ8YW5kcm9pZDo6RlFOYW1lPiYgaW50ZXJmYWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludGVyZmFjZUluaGVyaXRhbmNlSGllcmFyY2h5TWFwJiBoaWVyYXJjaHkpOwogCiAvLyBTYXZlcyB0aGUgc2V0IG9mIGtub3duIGludGVyZmFjZXMgdXNpbmcgdGhlIHByb3ZpZGVkIEhJREwgaW50ZXJmYWNlCiAvLyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCmRpZmYgLS1naXQgYS9pbml0L2tleWNob3Jkc190ZXN0LmNwcCBiL2luaXQva2V5Y2hvcmRzX3Rlc3QuY3BwCmluZGV4IDU3ODliZjUuLjJiMWQ0MjggMTAwNjQ0Ci0tLSBhL2luaXQva2V5Y2hvcmRzX3Rlc3QuY3BwCisrKyBiL2luaXQva2V5Y2hvcmRzX3Rlc3QuY3BwCkBAIC0xNjgsMTYgKzE2OCwxNiBAQAogY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiB0cmlwbGUxX2Nob3JkID0ge0tFWV9CQUNLU1BBQ0UsIEtFWV9WT0xVTUVET1dOLCBLRVlfVk9MVU1FVVB9OwogY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiB0cmlwbGUyX2Nob3JkID0ge0tFWV9WT0xVTUVET1dOLCBLRVlfVk9MVU1FVVAsIEtFWV9CQUNLfTsKIAotY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3Qgc3RkOjp2ZWN0b3I8aW50Pj4gZW1wdHlfY2hvcmRzOwotY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3Qgc3RkOjp2ZWN0b3I8aW50Pj4gY2hvcmRzID0gewotICAgIGVzY2FwZV9jaG9yZCwKLSAgICB0cmlwbGUxX2Nob3JkLAotICAgIHRyaXBsZTJfY2hvcmQsCitjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxpbnQ+PiBlbXB0eV9jaG9yZHM7Citjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxpbnQ+PiBjaG9yZHMgPSB7CisgICAgICAgIGVzY2FwZV9jaG9yZCwKKyAgICAgICAgdHJpcGxlMV9jaG9yZCwKKyAgICAgICAgdHJpcGxlMl9jaG9yZCwKIH07CiAKIGNsYXNzIFRlc3RGcmFtZSB7CiAgIHB1YmxpYzoKLSAgICBUZXN0RnJhbWUoY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3Qgc3RkOjp2ZWN0b3I8aW50Pj4mIGNob3JkcywgRXZlbnRIYW5kbGVyKiBldiA9IG51bGxwdHIpOworICAgIFRlc3RGcmFtZShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxpbnQ+PiYgY2hvcmRzLCBFdmVudEhhbmRsZXIqIGV2ID0gbnVsbHB0cik7CiAKICAgICB2b2lkIFJlbGF4Rm9yTXMoc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyB3YWl0ID0gMW1zKTsKIApAQCAtMTk0LDE2ICsxOTQsMTUgQEAKICAgICBzdGQ6OnN0cmluZyBGb3JtYXQoKSBjb25zdDsKIAogICBwcml2YXRlOgotICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBGb3JtYXQoY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3Qgc3RkOjp2ZWN0b3I8aW50Pj4mIGNob3Jkcyk7CisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIEZvcm1hdChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxpbnQ+PiYgY2hvcmRzKTsKIAogICAgIEVwb2xsIGVwb2xsXzsKICAgICBLZXljaG9yZHMga2V5Y2hvcmRzXzsKLSAgICBzdGQ6OnZlY3Rvcjxjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+PiBrZXljb2Rlc187CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8aW50Pj4ga2V5Y29kZXNfOwogICAgIEV2ZW50SGFuZGxlciogZXZfOwogfTsKIAotVGVzdEZyYW1lOjpUZXN0RnJhbWUoY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3Qgc3RkOjp2ZWN0b3I8aW50Pj4mIGNob3JkcywgRXZlbnRIYW5kbGVyKiBldikKLSAgICA6IGV2XyhldikgeworVGVzdEZyYW1lOjpUZXN0RnJhbWUoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8aW50Pj4mIGNob3JkcywgRXZlbnRIYW5kbGVyKiBldikgOiBldl8oZXYpIHsKICAgICBpZiAoIWVwb2xsXy5PcGVuKCkub2soKSkgcmV0dXJuOwogICAgIGZvciAoY29uc3QgYXV0byYga2V5Y29kZXMgOiBjaG9yZHMpIGtleWNob3Jkc18uUmVnaXN0ZXIoa2V5Y29kZXMpOwogICAgIGtleWNob3Jkc18uU3RhcnQoJmVwb2xsXywgW3RoaXNdKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIGtleWNvZGVzKSB7CkBAIC0yNjIsNyArMjYxLDcgQEAKICAgICBmb3IgKGludCByZXRyeSA9IDEwMDA7IHJldHJ5ICYmICFJc0Nob3JkKGNob3JkKTsgLS1yZXRyeSkgUmVsYXhGb3JNcygpOwogfQogCi1zdGQ6OnN0cmluZyBUZXN0RnJhbWU6OkZvcm1hdChjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+PiYgY2hvcmRzKSB7CitzdGQ6OnN0cmluZyBUZXN0RnJhbWU6OkZvcm1hdChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxpbnQ+PiYgY2hvcmRzKSB7CiAgICAgc3RkOjpzdHJpbmcgcmV0KCJ7Iik7CiAgICAgaWYgKCFjaG9yZHMuZW1wdHkoKSkgewogICAgICAgICByZXQgKz0gYW5kcm9pZDo6YmFzZTo6Sm9pbihjaG9yZHMuZnJvbnQoKSwgJyAnKTsKZGlmZiAtLWdpdCBhL2luaXQvbW91bnRfbmFtZXNwYWNlLmNwcCBiL2luaXQvbW91bnRfbmFtZXNwYWNlLmNwcAppbmRleCBmZWFkMzcxLi43OTE4ZjIzIDEwMDY0NAotLS0gYS9pbml0L21vdW50X25hbWVzcGFjZS5jcHAKKysrIGIvaW5pdC9tb3VudF9uYW1lc3BhY2UuY3BwCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KIAotI2luY2x1ZGUgPEFwZXhQcm9wZXJ0aWVzLnN5c3Byb3AuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KQEAgLTMwLDE2ICsyOSw2IEBACiAKICNpbmNsdWRlICJ1dGlsLmgiCiAKLSNpZm5kZWYgUkVDT1ZFUlkKLSNkZWZpbmUgQUNUSVZBVEVfRkxBVFRFTkVEX0FQRVggMQotI2VuZGlmCi0KLSNpZmRlZiBBQ1RJVkFURV9GTEFUVEVORURfQVBFWAotI2luY2x1ZGUgPGFwZXhfbWFuaWZlc3QucGIuaD4KLSNpbmNsdWRlIDxjb21fYW5kcm9pZF9hcGV4Lmg+Ci0jaW5jbHVkZSA8c2VsaW51eC9hbmRyb2lkLmg+Ci0jZW5kaWYgIC8vIEFDVElWQVRFX0ZMQVRURU5FRF9BUEVYCi0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBpbml0IHsKIG5hbWVzcGFjZSB7CkBAIC03NywyMSArNjYsNiBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBib29sIElzQXBleFVwZGF0YWJsZSgpIHsKLSAgICBzdGF0aWMgYm9vbCB1cGRhdGFibGUgPSBhbmRyb2lkOjpzeXNwcm9wOjpBcGV4UHJvcGVydGllczo6dXBkYXRhYmxlKCkudmFsdWVfb3IoZmFsc2UpOwotICAgIHJldHVybiB1cGRhdGFibGU7Ci19Ci0KLS8vIEluIGNhc2Ugd2UgaGF2ZSB0d28gc2V0cyBvZiBBUEVYZXMgKG5vbi11cGRhdGFibGUsIHVwZGF0YWJsZSksIHdlIG5lZWQgdHdvIHNlcGFyYXRlIG1vdW50Ci0vLyBuYW1lc3BhY2VzLgotc3RhdGljIGJvb2wgTmVlZHNUd29Nb3VudE5hbWVzcGFjZXMoKSB7Ci0gICAgaWYgKCFJc0FwZXhVcGRhdGFibGUoKSkgcmV0dXJuIGZhbHNlOwotICAgIGlmIChJc1JlY292ZXJ5TW9kZSgpKSByZXR1cm4gZmFsc2U7Ci0gICAgLy8gSW4gbWljcm9kcm9pZCwgdGhlcmUncyBvbmx5IG9uZSBzZXQgb2YgQVBFWGVzIGluIGJ1aWx0LWluIGRpcmVjdG9yaWVzIGluY2x1ZGUgYmxvY2sgZGV2aWNlcy4KLSAgICBpZiAoSXNNaWNyb2Ryb2lkKCkpIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQogc3RhdGljIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBib290c3RyYXBfbnNfZmQ7CiBzdGF0aWMgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGRlZmF1bHRfbnNfZmQ7CiAKQEAgLTEwMCw2ICs3NCwxNSBAQAogCiB9ICAvLyBuYW1lc3BhY2UKIAorLy8gSW4gY2FzZSB3ZSBoYXZlIHR3byBzZXRzIG9mIEFQRVhlcyAobm9uLXVwZGF0YWJsZSwgdXBkYXRhYmxlKSwgd2UgbmVlZCB0d28gc2VwYXJhdGUgbW91bnQKKy8vIG5hbWVzcGFjZXMuCitib29sIE5lZWRzVHdvTW91bnROYW1lc3BhY2VzKCkgeworICAgIGlmIChJc1JlY292ZXJ5TW9kZSgpKSByZXR1cm4gZmFsc2U7CisgICAgLy8gSW4gbWljcm9kcm9pZCwgdGhlcmUncyBvbmx5IG9uZSBzZXQgb2YgQVBFWGVzIGluIGJ1aWx0LWluIGRpcmVjdG9yaWVzIGluY2x1ZGUgYmxvY2sgZGV2aWNlcy4KKyAgICBpZiAoSXNNaWNyb2Ryb2lkKCkpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogYm9vbCBTZXR1cE1vdW50TmFtZXNwYWNlcygpIHsKICAgICAvLyBTZXQgdGhlIHByb3BhZ2F0aW9uIHR5cGUgb2YgLyBhcyBzaGFyZWQgc28gdGhhdCBhbnkgbW91bnRpbmcgZXZlbnQgKGUuZy4KICAgICAvLyAvZGF0YSkgaXMgYnkgZGVmYXVsdCB2aXNpYmxlIHRvIGFsbCBwcm9jZXNzZXMuIFdoZW4gcHJpdmF0ZSBtb3VudGluZyBpcwpAQCAtMTgwLDYgKzE2MywyMyBAQAogICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkNhbm5vdCBzd2l0Y2ggYmFjayB0byBib290c3RyYXAgbW91bnQgbmFtZXNwYWNlIjsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQorCisgICAgICAgIC8vIFNvbWUgY29tcG9uZW50cyAoZS5nLiBzZXJ2aWNlbWFuYWdlcikgbmVlZCB0byBhY2Nlc3MgYm9vdHN0cmFwCisgICAgICAgIC8vIEFQRVhlcyBmcm9tIHRoZSBkZWZhdWx0IG1vdW50IG5hbWVzcGFjZS4gVG8gYWNoaWV2ZSB0aGF0LCB3ZSBiaW5kLW1vdW50CisgICAgICAgIC8vIC9hcGV4IHRvIC9ib290c3RyYXAtYXBleCBpbiB0aGUgYm9vdHN0cmFwIG1vdW50IG5hbWVzcGFjZS4gU2luY2UgL2Jvb3RzdHJhcC1hcGV4CisgICAgICAgIC8vIGlzICJzaGFyZWQiLCB0aGUgbW91bnRzIGFyZSB2aXNpYmxlIGluIHRoZSBkZWZhdWx0IG1vdW50IG5hbWVzcGFjZSBhcyB3ZWxsLgorICAgICAgICAvLworICAgICAgICAvLyBUaGUgZW5kIHJlc3VsdCB3aWxsIGxvb2sgbGlrZToKKyAgICAgICAgLy8gICBpbiB0aGUgYm9vdHN0cmFwIG1vdW50IG5hbWVzcGFjZToKKyAgICAgICAgLy8gICAgIC9hcGV4ICAoPT0gL2Jvb3RzdHJhcC1hcGV4KQorICAgICAgICAvLyAgICAgICB7Ym9vdHN0cmFwIEFQRVhlcyBmcm9tIHRoZSByZWFkLW9ubHkgcGFydGl0aW9ufQorICAgICAgICAvLworICAgICAgICAvLyAgIGluIHRoZSBkZWZhdWx0IG1vdW50IG5hbWVzcGFjZToKKyAgICAgICAgLy8gICAgIC9ib290c3RyYXAtYXBleAorICAgICAgICAvLyAgICAgICB7Ym9vdHN0cmFwIEFQRVhlcyBmcm9tIHRoZSByZWFkLW9ubHkgcGFydGl0aW9ufQorICAgICAgICAvLyAgICAgL2FwZXgKKyAgICAgICAgLy8gICAgICAge0FQRVhlcywgY2FuIGJlIGZyb20gL2RhdGEgcGFydGl0aW9ufQorICAgICAgICBpZiAoIShCaW5kTW91bnQoIi9ib290c3RyYXAtYXBleCIsICIvYXBleCIpKSkgcmV0dXJuIGZhbHNlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIE90aGVyd2lzZSwgZGVmYXVsdCA9PSBib290c3RyYXAKICAgICAgICAgZGVmYXVsdF9uc19mZC5yZXNldChPcGVuTW91bnROYW1lc3BhY2UoKSk7CkBAIC0xOTMsNyArMTkzLDcgQEAKIC8vIFN3aXRjaCB0aGUgbW91bnQgbmFtZXNwYWNlIG9mIHRoZSBjdXJyZW50IHByb2Nlc3MgZnJvbSBib290c3RyYXAgdG8gZGVmYXVsdCBPUiBmcm9tIGRlZmF1bHQgdG8KIC8vIGJvb3RzdHJhcC4gSWYgdGhlIGN1cnJlbnQgbW91bnQgbmFtZXNwYWNlIGlzIG5laXRoZXIgYm9vdHN0cmFwIG5vciBkZWZhdWx0LCBrZWVwIGl0IHRoYXQgd2F5LgogUmVzdWx0PHZvaWQ+IFN3aXRjaFRvTW91bnROYW1lc3BhY2VJZk5lZWRlZChNb3VudE5hbWVzcGFjZSB0YXJnZXRfbW91bnRfbmFtZXNwYWNlKSB7Ci0gICAgaWYgKElzUmVjb3ZlcnlNb2RlKCkgfHwgIUlzQXBleFVwZGF0YWJsZSgpKSB7CisgICAgaWYgKElzUmVjb3ZlcnlNb2RlKCkpIHsKICAgICAgICAgLy8gd2UgZG9uJ3QgaGF2ZSBtdWx0aXBsZSBuYW1lc3BhY2VzIGluIHJlY292ZXJ5IG1vZGUgb3IgaWYgYXBleCBpcyBub3QgdXBkYXRhYmxlCiAgICAgICAgIHJldHVybiB7fTsKICAgICB9CmRpZmYgLS1naXQgYS9pbml0L21vdW50X25hbWVzcGFjZS5oIGIvaW5pdC9tb3VudF9uYW1lc3BhY2UuaAppbmRleCA1ZTNkYWIyLi40M2M1NDc2IDEwMDY0NAotLS0gYS9pbml0L21vdW50X25hbWVzcGFjZS5oCisrKyBiL2luaXQvbW91bnRfbmFtZXNwYWNlLmgKQEAgLTI0LDkgKzI0LDEyIEBACiBlbnVtIE1vdW50TmFtZXNwYWNlIHsgTlNfQk9PVFNUUkFQLCBOU19ERUZBVUxUIH07CiAKIGJvb2wgU2V0dXBNb3VudE5hbWVzcGFjZXMoKTsKKwogYmFzZTo6UmVzdWx0PHZvaWQ+IFN3aXRjaFRvTW91bnROYW1lc3BhY2VJZk5lZWRlZChNb3VudE5hbWVzcGFjZSB0YXJnZXRfbW91bnRfbmFtZXNwYWNlKTsKIAogYmFzZTo6UmVzdWx0PE1vdW50TmFtZXNwYWNlPiBHZXRDdXJyZW50TW91bnROYW1lc3BhY2UoKTsKIAorYm9vbCBOZWVkc1R3b01vdW50TmFtZXNwYWNlcygpOworCiB9ICAvLyBuYW1lc3BhY2UgaW5pdAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2luaXQvaG9zdF9pbml0X3ZlcmlmaWVyLmggYi9pbml0L25vb3BfYnVpbHRpbnMuY3BwCnNpbWlsYXJpdHkgaW5kZXggNjAlCmNvcHkgZnJvbSBpbml0L2hvc3RfaW5pdF92ZXJpZmllci5oCmNvcHkgdG8gaW5pdC9ub29wX2J1aWx0aW5zLmNwcAppbmRleCA1ZDI0ZjJhLi5jNGUxNDBiIDEwMDY0NAotLS0gYS9pbml0L2hvc3RfaW5pdF92ZXJpZmllci5oCisrKyBiL2luaXQvbm9vcF9idWlsdGlucy5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxNCArMTQsMTkgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNwcmFnbWEgb25jZQorLy8gTm90ZSB0aGF0IHBhcnNlciB3aWxsIHBlcmZvcm0gYXJpdHkgY2hlY2tzIG9ubHkuCiAKLSNpbmNsdWRlIDxwcm9wZXJ0eV9pbmZvX3BhcnNlci9wcm9wZXJ0eV9pbmZvX3BhcnNlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9yZXN1bHQuaD4KIAotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGluaXQgeworI2luY2x1ZGUgImJ1aWx0aW5fYXJndW1lbnRzLmgiCisjaW5jbHVkZSAiYnVpbHRpbnMuaCIKIAotZXh0ZXJuIGNvbnN0IGFuZHJvaWQ6OnByb3BlcnRpZXM6OlByb3BlcnR5SW5mb0FyZWEqIHByb3BlcnR5X2luZm9fYXJlYTsKK25hbWVzcGFjZSBhbmRyb2lkOjppbml0IHsKIAotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCitzdGF0aWMgYmFzZTo6UmVzdWx0PHZvaWQ+IGNoZWNrX3N0dWIoY29uc3QgQnVpbHRpbkFyZ3VtZW50cyYpIHsKKyAgICByZXR1cm4ge307Cit9CisKKyNpbmNsdWRlICJub29wX2J1aWx0aW5fZnVuY3Rpb25fbWFwLmgiCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkOjppbml0CmRpZmYgLS1naXQgYS9pbml0L3BlcnNpc3RlbnRfcHJvcGVydGllcy5jcHAgYi9pbml0L3BlcnNpc3RlbnRfcHJvcGVydGllcy5jcHAKaW5kZXggOGRiNzI2Ny4uMWQxN2UzYyAxMDA2NDQKLS0tIGEvaW5pdC9wZXJzaXN0ZW50X3Byb3BlcnRpZXMuY3BwCisrKyBiL2luaXQvcGVyc2lzdGVudF9wcm9wZXJ0aWVzLmNwcApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCiAjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CkBAIC0xMjIsMjQgKzEyMyw2IEBACiAgICAgfQogfQogCi1QZXJzaXN0ZW50UHJvcGVydGllcyBMb2FkUGVyc2lzdGVudFByb3BlcnRpZXNGcm9tTWVtb3J5KCkgewotICAgIFBlcnNpc3RlbnRQcm9wZXJ0aWVzIHBlcnNpc3RlbnRfcHJvcGVydGllczsKLSAgICBfX3N5c3RlbV9wcm9wZXJ0eV9mb3JlYWNoKAotICAgICAgICBbXShjb25zdCBwcm9wX2luZm8qIHBpLCB2b2lkKiBjb29raWUpIHsKLSAgICAgICAgICAgIF9fc3lzdGVtX3Byb3BlcnR5X3JlYWRfY2FsbGJhY2soCi0gICAgICAgICAgICAgICAgcGksCi0gICAgICAgICAgICAgICAgW10odm9pZCogY29va2llLCBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSwgdW5zaWduZWQgc2VyaWFsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChTdGFydHNXaXRoKG5hbWUsICJwZXJzaXN0LiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdXRvIHByb3BlcnRpZXMgPSByZWludGVycHJldF9jYXN0PFBlcnNpc3RlbnRQcm9wZXJ0aWVzKj4oY29va2llKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFkZFBlcnNpc3RlbnRQcm9wZXJ0eShuYW1lLCB2YWx1ZSwgcHJvcGVydGllcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIGNvb2tpZSk7Ci0gICAgICAgIH0sCi0gICAgICAgICZwZXJzaXN0ZW50X3Byb3BlcnRpZXMpOwotICAgIHJldHVybiBwZXJzaXN0ZW50X3Byb3BlcnRpZXM7Ci19Ci0KIFJlc3VsdDxzdGQ6OnN0cmluZz4gUmVhZFBlcnNpc3RlbnRQcm9wZXJ0eUZpbGUoKSB7CiAgICAgY29uc3Qgc3RkOjpzdHJpbmcgdGVtcF9maWxlbmFtZSA9IHBlcnNpc3RlbnRfcHJvcGVydHlfZmlsZW5hbWUgKyAiLnRtcCI7CiAgICAgaWYgKGFjY2Vzcyh0ZW1wX2ZpbGVuYW1lLmNfc3RyKCksIEZfT0spID09IDApIHsKQEAgLTE2MSw5ICsxNDQsOSBAQAogICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiVW5hYmxlIHRvIHBhcnNlIHBlcnNpc3RlbnQgcHJvcGVydHkgZmlsZTogQ291bGQgbm90IHBhcnNlIHByb3RvYnVmIjsKICAgICB9CiAgICAgZm9yIChhdXRvJiBwcm9wIDogcGVyc2lzdGVudF9wcm9wZXJ0aWVzLnByb3BlcnRpZXMoKSkgewotICAgICAgICBpZiAoIVN0YXJ0c1dpdGgocHJvcC5uYW1lKCksICJwZXJzaXN0LiIpKSB7CisgICAgICAgIGlmICghU3RhcnRzV2l0aChwcm9wLm5hbWUoKSwgInBlcnNpc3QuIikgJiYgIVN0YXJ0c1dpdGgocHJvcC5uYW1lKCksICJuZXh0X2Jvb3QuIikpIHsKICAgICAgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJVbmFibGUgdG8gbG9hZCBwZXJzaXN0ZW50IHByb3BlcnR5IGZpbGU6IHByb3BlcnR5ICciIDw8IHByb3AubmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiJyBkb2Vzbid0IHN0YXJ0IHdpdGggJ3BlcnNpc3QuJyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiJyBkb2Vzbid0IHN0YXJ0IHdpdGggJ3BlcnNpc3QuJyBvciAnbmV4dF9ib290LiciOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBwZXJzaXN0ZW50X3Byb3BlcnRpZXM7CkBAIC0yMjEsNiArMjA0LDI0IEBACiAgICAgcmV0dXJuIHt9OwogfQogCitQZXJzaXN0ZW50UHJvcGVydGllcyBMb2FkUGVyc2lzdGVudFByb3BlcnRpZXNGcm9tTWVtb3J5KCkgeworICAgIFBlcnNpc3RlbnRQcm9wZXJ0aWVzIHBlcnNpc3RlbnRfcHJvcGVydGllczsKKyAgICBfX3N5c3RlbV9wcm9wZXJ0eV9mb3JlYWNoKAorICAgICAgICAgICAgW10oY29uc3QgcHJvcF9pbmZvKiBwaSwgdm9pZCogY29va2llKSB7CisgICAgICAgICAgICAgICAgX19zeXN0ZW1fcHJvcGVydHlfcmVhZF9jYWxsYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpLAorICAgICAgICAgICAgICAgICAgICAgICAgW10odm9pZCogY29va2llLCBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSwgdW5zaWduZWQgc2VyaWFsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFN0YXJ0c1dpdGgobmFtZSwgInBlcnNpc3QuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBwcm9wZXJ0aWVzID0gcmVpbnRlcnByZXRfY2FzdDxQZXJzaXN0ZW50UHJvcGVydGllcyo+KGNvb2tpZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFBlcnNpc3RlbnRQcm9wZXJ0eShuYW1lLCB2YWx1ZSwgcHJvcGVydGllcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZSk7CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgJnBlcnNpc3RlbnRfcHJvcGVydGllcyk7CisgICAgcmV0dXJuIHBlcnNpc3RlbnRfcHJvcGVydGllczsKK30KKwogLy8gUGVyc2lzdGVudCBwcm9wZXJ0aWVzIGFyZSBub3Qgd3JpdHRlbiBvZnRlbiwgc28gd2UgcmF0aGVyIG5vdCBrZWVwIGFueSBkYXRhIGluIG1lbW9yeSBhbmQgcmVhZAogLy8gdGhlbiByZXdyaXRlIHRoZSBwZXJzaXN0ZW50IHByb3BlcnR5IGZpbGUgZm9yIGVhY2ggdXBkYXRlLgogdm9pZCBXcml0ZVBlcnNpc3RlbnRQcm9wZXJ0eShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CkBAIC0yMzUsNiArMjM2LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlbnRfcHJvcGVydGllcy0+bXV0YWJsZV9wcm9wZXJ0aWVzKCktPmVuZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZuYW1lXShjb25zdCBhdXRvJiByZWNvcmQpIHsgcmV0dXJuIHJlY29yZC5uYW1lKCkgPT0gbmFtZTsgfSk7CiAgICAgaWYgKGl0ICE9IHBlcnNpc3RlbnRfcHJvcGVydGllcy0+bXV0YWJsZV9wcm9wZXJ0aWVzKCktPmVuZCgpKSB7CisgICAgICAgIGlmIChpdC0+dmFsdWUoKSA9PSB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgICAgIGl0LT5zZXRfbmFtZShuYW1lKTsKICAgICAgICAgaXQtPnNldF92YWx1ZSh2YWx1ZSk7CiAgICAgfSBlbHNlIHsKQEAgLTI2Niw4ICsyNzAsNTcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiAqcGVyc2lzdGVudF9wcm9wZXJ0aWVzOworICAgIC8vIGxvb3Agb3ZlciB0byBmaW5kIGFsbCBzdGFnZWQgcHJvcHMKKyAgICBhdXRvIGNvbnN0IHN0YWdlZF9wcmVmaXggPSBzdGQ6OnN0cmluZ192aWV3KCJuZXh0X2Jvb3QuIik7CisgICAgYXV0byBzdGFnZWRfcHJvcHMgPSBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPigpOworICAgIGZvciAoY29uc3QgYXV0byYgcHJvcGVydHlfcmVjb3JkIDogcGVyc2lzdGVudF9wcm9wZXJ0aWVzLT5wcm9wZXJ0aWVzKCkpIHsKKyAgICAgICAgYXV0byBjb25zdCYgcHJvcF9uYW1lID0gcHJvcGVydHlfcmVjb3JkLm5hbWUoKTsKKyAgICAgICAgYXV0byBjb25zdCYgcHJvcF92YWx1ZSA9IHByb3BlcnR5X3JlY29yZC52YWx1ZSgpOworICAgICAgICBpZiAoU3RhcnRzV2l0aChwcm9wX25hbWUsIHN0YWdlZF9wcmVmaXgpKSB7CisgICAgICAgICAgICBhdXRvIGFjdHVhbF9wcm9wX25hbWUgPSBwcm9wX25hbWUuc3Vic3RyKHN0YWdlZF9wcmVmaXguc2l6ZSgpKTsKKyAgICAgICAgICAgIHN0YWdlZF9wcm9wc1thY3R1YWxfcHJvcF9uYW1lXSA9IHByb3BfdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3RhZ2VkX3Byb3BzLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuICpwZXJzaXN0ZW50X3Byb3BlcnRpZXM7CisgICAgfQorCisgICAgLy8gaWYgaGFzIHN0YWdpbmcsIGFwcGx5IHN0YWdpbmcgYW5kIHBlcnNlcnZlIHRoZSBvcmlnaW5hbCBwcm9wIG9yZGVyCisgICAgUGVyc2lzdGVudFByb3BlcnRpZXMgdXBkYXRlZF9wZXJzaXN0ZW50X3Byb3BlcnRpZXM7CisgICAgZm9yIChjb25zdCBhdXRvJiBwcm9wZXJ0eV9yZWNvcmQgOiBwZXJzaXN0ZW50X3Byb3BlcnRpZXMtPnByb3BlcnRpZXMoKSkgeworICAgICAgICBhdXRvIGNvbnN0JiBwcm9wX25hbWUgPSBwcm9wZXJ0eV9yZWNvcmQubmFtZSgpOworICAgICAgICBhdXRvIGNvbnN0JiBwcm9wX3ZhbHVlID0gcHJvcGVydHlfcmVjb3JkLnZhbHVlKCk7CisKKyAgICAgICAgLy8gZG9uJ3QgaW5jbHVkZSBzdGFnZWQgcHJvcHMgYW55bW9yZQorICAgICAgICBpZiAoU3RhcnRzV2l0aChwcm9wX25hbWUsIHN0YWdlZF9wcmVmaXgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGF1dG8gaXRlciA9IHN0YWdlZF9wcm9wcy5maW5kKHByb3BfbmFtZSk7CisgICAgICAgIGlmIChpdGVyICE9IHN0YWdlZF9wcm9wcy5lbmQoKSkgeworICAgICAgICAgICAgQWRkUGVyc2lzdGVudFByb3BlcnR5KHByb3BfbmFtZSwgaXRlci0+c2Vjb25kLCAmdXBkYXRlZF9wZXJzaXN0ZW50X3Byb3BlcnRpZXMpOworICAgICAgICAgICAgc3RhZ2VkX3Byb3BzLmVyYXNlKGl0ZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQWRkUGVyc2lzdGVudFByb3BlcnR5KHByb3BfbmFtZSwgcHJvcF92YWx1ZSwgJnVwZGF0ZWRfcGVyc2lzdGVudF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGFkZCBhbnkgYWRkaXRpb25hbCBzdGFnZWQgcHJvcHMKKyAgICBmb3IgKGF1dG8gY29uc3QmIFtwcm9wX25hbWUsIHByb3BfdmFsdWVdIDogc3RhZ2VkX3Byb3BzKSB7CisgICAgICAgIEFkZFBlcnNpc3RlbnRQcm9wZXJ0eShwcm9wX25hbWUsIHByb3BfdmFsdWUsICZ1cGRhdGVkX3BlcnNpc3RlbnRfcHJvcGVydGllcyk7CisgICAgfQorCisgICAgLy8gd3JpdGUgY3VycmVudCB1cGRhdGVkIHBlcnNpc3QgcHJvcCBmaWxlCisgICAgYXV0byByZXN1bHQgPSBXcml0ZVBlcnNpc3RlbnRQcm9wZXJ0eUZpbGUodXBkYXRlZF9wZXJzaXN0ZW50X3Byb3BlcnRpZXMpOworICAgIGlmICghcmVzdWx0Lm9rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IHN0b3JlIHBlcnNpc3RlbnQgcHJvcGVydHk6ICIgPDwgcmVzdWx0LmVycm9yKCk7CisgICAgfQorCisgICAgcmV0dXJuIHVwZGF0ZWRfcGVyc2lzdGVudF9wcm9wZXJ0aWVzOwogfQogCisKKwogfSAgLy8gbmFtZXNwYWNlIGluaXQKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9pbml0L3BlcnNpc3RlbnRfcHJvcGVydGllcy5oIGIvaW5pdC9wZXJzaXN0ZW50X3Byb3BlcnRpZXMuaAppbmRleCAzODQ1YTBkLi4xMTA4M2RhIDEwMDY0NAotLS0gYS9pbml0L3BlcnNpc3RlbnRfcHJvcGVydGllcy5oCisrKyBiL2luaXQvcGVyc2lzdGVudF9wcm9wZXJ0aWVzLmgKQEAgLTI3LDYgKzI3LDcgQEAKIAogUGVyc2lzdGVudFByb3BlcnRpZXMgTG9hZFBlcnNpc3RlbnRQcm9wZXJ0aWVzKCk7CiB2b2lkIFdyaXRlUGVyc2lzdGVudFByb3BlcnR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworUGVyc2lzdGVudFByb3BlcnRpZXMgTG9hZFBlcnNpc3RlbnRQcm9wZXJ0aWVzRnJvbU1lbW9yeSgpOwogCiAvLyBFeHBvc2VkIG9ubHkgZm9yIHRlc3RpbmcKIFJlc3VsdDxQZXJzaXN0ZW50UHJvcGVydGllcz4gTG9hZFBlcnNpc3RlbnRQcm9wZXJ0eUZpbGUoKTsKZGlmZiAtLWdpdCBhL2luaXQvcGVyc2lzdGVudF9wcm9wZXJ0aWVzX3Rlc3QuY3BwIGIvaW5pdC9wZXJzaXN0ZW50X3Byb3BlcnRpZXNfdGVzdC5jcHAKaW5kZXggZTVkMjZkYi4uOTc4NjVkNyAxMDA2NDQKLS0tIGEvaW5pdC9wZXJzaXN0ZW50X3Byb3BlcnRpZXNfdGVzdC5jcHAKKysrIGIvaW5pdC9wZXJzaXN0ZW50X3Byb3BlcnRpZXNfdGVzdC5jcHAKQEAgLTE3LDYgKzE3LDkgQEAKICNpbmNsdWRlICJwZXJzaXN0ZW50X3Byb3BlcnRpZXMuaCIKIAogI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPHZlY3Rvcj4KIApAQCAtMTU1LDYgKzE1OCwzMSBAQAogICAgIEVYUEVDVF9GQUxTRShpdCA9PSByZWFkX2JhY2tfcHJvcGVydGllcy5wcm9wZXJ0aWVzKCkuZW5kKCkpOwogfQogCitURVNUKHBlcnNpc3RlbnRfcHJvcGVydGllcywgTm9wVXBkYXRlRG9lc250V3JpdGVGaWxlKSB7CisgICAgVGVtcG9yYXJ5RmlsZSB0ZjsKKyAgICBBU1NFUlRfVFJVRSh0Zi5mZCAhPSAtMSk7CisgICAgcGVyc2lzdGVudF9wcm9wZXJ0eV9maWxlbmFtZSA9IHRmLnBhdGg7CisKKyAgICBhdXRvIGxhc3RfbW9kaWZpZWQgPSBbJnRmXSgpIC0+IHRpbWVfdCB7CisgICAgICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICAgICAgRVhQRUNUX0VRKGZzdGF0KHRmLmZkLCAmYnVmKSwgMCk7CisgICAgICAgIHJldHVybiBidWYuc3RfbXRpbWU7CisgICAgfTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiBwZXJzaXN0ZW50X3Byb3BlcnRpZXMgPSB7CisgICAgICAgICAgICB7InBlcnNpc3Quc3lzLmxvY2FsZSIsICJlbi1VUyJ9LAorICAgICAgICAgICAgeyJwZXJzaXN0LnN5cy50aW1lem9uZSIsICJBbWVyaWNhL0xvc19BbmdlbGVzIn0sCisgICAgfTsKKyAgICBBU1NFUlRfUkVTVUxUX09LKAorICAgICAgICAgICAgV3JpdGVQZXJzaXN0ZW50UHJvcGVydHlGaWxlKFZlY3RvclRvUGVyc2lzdGVudFByb3BlcnRpZXMocGVyc2lzdGVudF9wcm9wZXJ0aWVzKSkpOworCisgICAgdGltZV90IHQgPSBsYXN0X21vZGlmaWVkKCk7CisgICAgc2xlZXAoMik7CisgICAgV3JpdGVQZXJzaXN0ZW50UHJvcGVydHkoInBlcnNpc3Quc3lzLmxvY2FsZSIsICJlbi1VUyIpOworICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBmaWxlIHdhcyBub3QgbW9kaWZpZWQKKyAgICBBU1NFUlRfRVEobGFzdF9tb2RpZmllZCgpLCB0KTsKK30KKwogVEVTVChwZXJzaXN0ZW50X3Byb3BlcnRpZXMsIFJlamVjdE5vblBlcnNpc3RQcm9wZXJ0eSkgewogICAgIFRlbXBvcmFyeUZpbGUgdGY7CiAgICAgQVNTRVJUX1RSVUUodGYuZmQgIT0gLTEpOwpAQCAtMTc4LDUgKzIwNiwzNyBAQAogICAgIEVYUEVDVF9GQUxTRShpdCA9PSByZWFkX2JhY2tfcHJvcGVydGllcy5wcm9wZXJ0aWVzKCkuZW5kKCkpOwogfQogCitURVNUKHBlcnNpc3RlbnRfcHJvcGVydGllcywgU3RhZ2VkUGVyc2lzdFByb3BlcnR5KSB7CisgICAgVGVtcG9yYXJ5RmlsZSB0ZjsKKyAgICBBU1NFUlRfVFJVRSh0Zi5mZCAhPSAtMSk7CisgICAgcGVyc2lzdGVudF9wcm9wZXJ0eV9maWxlbmFtZSA9IHRmLnBhdGg7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4gcGVyc2lzdGVudF9wcm9wZXJ0aWVzID0geworICAgICAgICB7InBlcnNpc3Quc3lzLmxvY2FsZSIsICJlbi1VUyJ9LAorICAgICAgICB7Im5leHRfYm9vdC5wZXJzaXN0LnRlc3QubnVtYmVycyIsICI1NDMyMSJ9LAorICAgICAgICB7InBlcnNpc3Quc3lzLnRpbWV6b25lIiwgIkFtZXJpY2EvTG9zX0FuZ2VsZXMifSwKKyAgICAgICAgeyJwZXJzaXN0LnRlc3QubnVtYmVycyIsICIxMjM0NSJ9LAorICAgICAgICB7Im5leHRfYm9vdC5wZXJzaXN0LnRlc3QuZXh0cmEiLCAiYWJjIn0sCisgICAgfTsKKworICAgIEFTU0VSVF9SRVNVTFRfT0soCisgICAgICAgICAgICBXcml0ZVBlcnNpc3RlbnRQcm9wZXJ0eUZpbGUoVmVjdG9yVG9QZXJzaXN0ZW50UHJvcGVydGllcyhwZXJzaXN0ZW50X3Byb3BlcnRpZXMpKSk7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4gZXhwZWN0ZWRfcGVyc2lzdGVudF9wcm9wZXJ0aWVzID0geworICAgICAgICB7InBlcnNpc3Quc3lzLmxvY2FsZSIsICJlbi1VUyJ9LAorICAgICAgICB7InBlcnNpc3Quc3lzLnRpbWV6b25lIiwgIkFtZXJpY2EvTG9zX0FuZ2VsZXMifSwKKyAgICAgICAgeyJwZXJzaXN0LnRlc3QubnVtYmVycyIsICI1NDMyMSJ9LAorICAgICAgICB7InBlcnNpc3QudGVzdC5leHRyYSIsICJhYmMifSwKKyAgICB9OworCisgICAgLy8gbG9jayBkb3duIHRoYXQgc3RhZ2VkIHByb3BzIGFyZSBhcHBsaWVkCisgICAgYXV0byBmaXJzdF9yZWFkX2JhY2tfcHJvcGVydGllcyA9IExvYWRQZXJzaXN0ZW50UHJvcGVydGllcygpOworICAgIENoZWNrUHJvcGVydGllc0VxdWFsKGV4cGVjdGVkX3BlcnNpc3RlbnRfcHJvcGVydGllcywgZmlyc3RfcmVhZF9iYWNrX3Byb3BlcnRpZXMpOworCisgICAgLy8gbG9jayBkb3duIHRoYXQgb3RoZXIgcHJvcHMgYXJlIG5vdCBvdmVyd3JpdHRlbgorICAgIGF1dG8gc2Vjb25kX3JlYWRfYmFja19wcm9wZXJ0aWVzID0gTG9hZFBlcnNpc3RlbnRQcm9wZXJ0aWVzKCk7CisgICAgQ2hlY2tQcm9wZXJ0aWVzRXF1YWwoZXhwZWN0ZWRfcGVyc2lzdGVudF9wcm9wZXJ0aWVzLCBzZWNvbmRfcmVhZF9iYWNrX3Byb3BlcnRpZXMpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgaW5pdAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2luaXQvcHJvcGVydHlfc2VydmljZS5jcHAgYi9pbml0L3Byb3BlcnR5X3NlcnZpY2UuY3BwCmluZGV4IDhkYTY5ODIuLmYyNjA2ZTMgMTAwNjQ0Ci0tLSBhL2luaXQvcHJvcGVydHlfc2VydmljZS5jcHAKKysrIGIvaW5pdC9wcm9wZXJ0eV9zZXJ2aWNlLmNwcApAQCAtMzEsMTQgKzMxLDEyIEBACiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KICNpbmNsdWRlIDxzeXMvcG9sbC5oPgogI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KKyNpbmNsdWRlIDxzeXMvc3lzdGVtX3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvdW4uaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDx3Y2hhci5oPgogCi0jZGVmaW5lIF9SRUFMTFlfSU5DTFVERV9TWVNfX1NZU1RFTV9QUk9QRVJUSUVTX0hfCi0jaW5jbHVkZSA8c3lzL19zeXN0ZW1fcHJvcGVydGllcy5oPgotCiAjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxtdXRleD4KQEAgLTQ4LDcgKzQ2LDYgQEAKICNpbmNsdWRlIDx0aHJlYWQ+CiAjaW5jbHVkZSA8dmVjdG9yPgogCi0jaW5jbHVkZSA8SW5pdFByb3BlcnRpZXMuc3lzcHJvcC5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9jaHJvbm9fdXRpbHMuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CkBAIC01NywxMSArNTQsMTQgQEAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcmVzdWx0Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CisjaW5jbHVkZSA8ZnNfbWdyLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAjaW5jbHVkZSA8cHJvcGVydHlfaW5mb19wYXJzZXIvcHJvcGVydHlfaW5mb19wYXJzZXIuaD4KICNpbmNsdWRlIDxwcm9wZXJ0eV9pbmZvX3NlcmlhbGl6ZXIvcHJvcGVydHlfaW5mb19zZXJpYWxpemVyLmg+CiAjaW5jbHVkZSA8c2VsaW51eC9hbmRyb2lkLmg+CiAjaW5jbHVkZSA8c2VsaW51eC9sYWJlbC5oPgogI2luY2x1ZGUgPHNlbGludXgvc2VsaW51eC5oPgorI2luY2x1ZGUgPHZlbmRvcnN1cHBvcnQvYXBpX2xldmVsLmg+CiAKICNpbmNsdWRlICJkZWJ1Z19yYW1kaXNrLmgiCiAjaW5jbHVkZSAiZXBvbGwuaCIKQEAgLTc1LDEwICs3NSwxNSBAQAogI2luY2x1ZGUgInN5c3RlbS9jb3JlL2luaXQvcHJvcGVydHlfc2VydmljZS5wYi5oIgogI2luY2x1ZGUgInV0aWwuaCIKIAorc3RhdGljIGNvbnN0ZXhwciBjaGFyIEFQUENPTVBBVF9PVkVSUklERV9QUk9QX0ZPTERFUk5BTUVbXSA9CisgICAgICAgICIvZGV2L19fcHJvcGVydGllc19fL2FwcGNvbXBhdF9vdmVycmlkZSI7CitzdGF0aWMgY29uc3RleHByIGNoYXIgQVBQQ09NUEFUX09WRVJSSURFX1BST1BfVFJFRV9GSUxFW10gPQorICAgICAgICAiL2Rldi9fX3Byb3BlcnRpZXNfXy9hcHBjb21wYXRfb3ZlcnJpZGUvcHJvcGVydHlfaW5mbyI7CiB1c2luZyBuYW1lc3BhY2Ugc3RkOjpsaXRlcmFsczsKIAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6RXJybm9FcnJvcjsKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OkVycm9yOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6R2V0SW50UHJvcGVydHk7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjpHZXRQcm9wZXJ0eTsKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlBhcnNlSW50OwogdXNpbmcgYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZzsKQEAgLTk0LDcgKzk5LDYgQEAKIHVzaW5nIGFuZHJvaWQ6OnByb3BlcnRpZXM6OlBhcnNlUHJvcGVydHlJbmZvRmlsZTsKIHVzaW5nIGFuZHJvaWQ6OnByb3BlcnRpZXM6OlByb3BlcnR5SW5mb0FyZWFGaWxlOwogdXNpbmcgYW5kcm9pZDo6cHJvcGVydGllczo6UHJvcGVydHlJbmZvRW50cnk7Ci11c2luZyBhbmRyb2lkOjpzeXNwcm9wOjpJbml0UHJvcGVydGllczo6aXNfdXNlcnNwYWNlX3JlYm9vdF9zdXBwb3J0ZWQ7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBpbml0IHsKQEAgLTEwNywxNiArMTExLDE2IEBACiBjb25zdGV4cHIgYXV0byBMRUdBQ1lfSURfUFJPUCA9ICJyby5idWlsZC5sZWdhY3kuaWQiOwogY29uc3RleHByIGF1dG8gVkJNRVRBX0RJR0VTVF9QUk9QID0gInJvLmJvb3QudmJtZXRhLmRpZ2VzdCI7CiBjb25zdGV4cHIgYXV0byBESUdFU1RfU0laRV9VU0VEID0gODsKLWNvbnN0ZXhwciBhdXRvIEFQSV9MRVZFTF9DVVJSRU5UID0gMTAwMDA7CiAKIHN0YXRpYyBib29sIHBlcnNpc3RlbnRfcHJvcGVydGllc19sb2FkZWQgPSBmYWxzZTsKIAotc3RhdGljIGludCBwcm9wZXJ0eV9zZXRfZmQgPSAtMTsKIHN0YXRpYyBpbnQgZnJvbV9pbml0X3NvY2tldCA9IC0xOwogc3RhdGljIGludCBpbml0X3NvY2tldCA9IC0xOwogc3RhdGljIGJvb2wgYWNjZXB0X21lc3NhZ2VzID0gZmFsc2U7CiBzdGF0aWMgc3RkOjptdXRleCBhY2NlcHRfbWVzc2FnZXNfbG9jazsKK3N0YXRpYyBzdGQ6Om11dGV4IHNlbGludXhfY2hlY2tfYWNjZXNzX2xvY2s7CiBzdGF0aWMgc3RkOjp0aHJlYWQgcHJvcGVydHlfc2VydmljZV90aHJlYWQ7CitzdGF0aWMgc3RkOjp0aHJlYWQgcHJvcGVydHlfc2VydmljZV9mb3Jfc3lzdGVtX3RocmVhZDsKIAogc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxQZXJzaXN0V3JpdGVUaHJlYWQ+IHBlcnNpc3Rfd3JpdGVfdGhyZWFkOwogCkBAIC0xNjEsNiArMTY1LDcgQEAKICAgICB1Y3JlZCBjciA9IHsucGlkID0gMCwgLnVpZCA9IDAsIC5naWQgPSAwfTsKICAgICBhdWRpdF9kYXRhLmNyID0gJmNyOwogCisgICAgYXV0byBsb2NrID0gc3RkOjpsb2NrX2d1YXJke3NlbGludXhfY2hlY2tfYWNjZXNzX2xvY2t9OwogICAgIHJldHVybiBzZWxpbnV4X2NoZWNrX2FjY2Vzcyhzb3VyY2VfY29udGV4dC5jX3N0cigpLCB0YXJnZXRfY29udGV4dCwgImZpbGUiLCAicmVhZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdWRpdF9kYXRhKSA9PSAwOwogfQpAQCAtMTc2LDEwICsxODEsOSBAQAogICAgIGF1ZGl0X2RhdGEubmFtZSA9IG5hbWUuY19zdHIoKTsKICAgICBhdWRpdF9kYXRhLmNyID0gJmNyOwogCi0gICAgYm9vbCBoYXNfYWNjZXNzID0gKHNlbGludXhfY2hlY2tfYWNjZXNzKHNvdXJjZV9jb250ZXh0LCB0YXJnZXRfY29udGV4dCwgInByb3BlcnR5X3NlcnZpY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0IiwgJmF1ZGl0X2RhdGEpID09IDApOwotCi0gICAgcmV0dXJuIGhhc19hY2Nlc3M7CisgICAgYXV0byBsb2NrID0gc3RkOjpsb2NrX2d1YXJke3NlbGludXhfY2hlY2tfYWNjZXNzX2xvY2t9OworICAgIHJldHVybiBzZWxpbnV4X2NoZWNrX2FjY2Vzcyhzb3VyY2VfY29udGV4dCwgdGFyZ2V0X2NvbnRleHQsICJwcm9wZXJ0eV9zZXJ2aWNlIiwgInNldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdWRpdF9kYXRhKSA9PSAwOwogfQogCiB2b2lkIE5vdGlmeVByb3BlcnR5Q2hhbmdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKQEAgLTM5NCwzMSArMzk4LDM4IEBACiAgICAgICAgIHJldHVybiB7UFJPUF9FUlJPUl9JTlZBTElEX1ZBTFVFfTsKICAgICB9CiAKLSAgICBwcm9wX2luZm8qIHBpID0gKHByb3BfaW5mbyopX19zeXN0ZW1fcHJvcGVydHlfZmluZChuYW1lLmNfc3RyKCkpOwotICAgIGlmIChwaSAhPSBudWxscHRyKSB7Ci0gICAgICAgIC8vIHJvLiogcHJvcGVydGllcyBhcmUgYWN0dWFsbHkgIndyaXRlLW9uY2UiLgotICAgICAgICBpZiAoU3RhcnRzV2l0aChuYW1lLCAicm8uIikpIHsKLSAgICAgICAgICAgICplcnJvciA9ICJSZWFkLW9ubHkgcHJvcGVydHkgd2FzIGFscmVhZHkgc2V0IjsKLSAgICAgICAgICAgIHJldHVybiB7UFJPUF9FUlJPUl9SRUFEX09OTFlfUFJPUEVSVFl9OwotICAgICAgICB9Ci0KLSAgICAgICAgX19zeXN0ZW1fcHJvcGVydHlfdXBkYXRlKHBpLCB2YWx1ZS5jX3N0cigpLCB2YWx1ZWxlbik7CisgICAgaWYgKG5hbWUgPT0gInN5cy5wb3dlcmN0bCIpIHsKKyAgICAgICAgLy8gTm8gYWN0aW9uIGhlcmUgLSBOb3RpZnlQcm9wZXJ0eUNoYW5nZSB3aWxsIHRyaWdnZXIgdGhlIGFwcHJvcHJpYXRlIGFjdGlvbiwgYW5kIHNpbmNlIHRoaXMKKyAgICAgICAgLy8gY2FuIGNvbWUgdG8gdGhlIHNlY29uZCB0aHJlYWQsIHdlIG11c3RuJ3QgY2FsbCBvdXQgdG8gdGhlIF9fc3lzdGVtX3Byb3BlcnR5XyogZnVuY3Rpb25zCisgICAgICAgIC8vIHdoaWNoIHN1cHBvcnQgbXVsdGlwbGUgcmVhZGVycyBidXQgb25seSBvbmUgbXV0YXRvci4KICAgICB9IGVsc2UgewotICAgICAgICBpbnQgcmMgPSBfX3N5c3RlbV9wcm9wZXJ0eV9hZGQobmFtZS5jX3N0cigpLCBuYW1lLnNpemUoKSwgdmFsdWUuY19zdHIoKSwgdmFsdWVsZW4pOwotICAgICAgICBpZiAocmMgPCAwKSB7Ci0gICAgICAgICAgICAqZXJyb3IgPSAiX19zeXN0ZW1fcHJvcGVydHlfYWRkIGZhaWxlZCI7Ci0gICAgICAgICAgICByZXR1cm4ge1BST1BfRVJST1JfU0VUX0ZBSUxFRH07Ci0gICAgICAgIH0KLSAgICB9CisgICAgICAgIHByb3BfaW5mbyogcGkgPSAocHJvcF9pbmZvKilfX3N5c3RlbV9wcm9wZXJ0eV9maW5kKG5hbWUuY19zdHIoKSk7CisgICAgICAgIGlmIChwaSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyByby4qIHByb3BlcnRpZXMgYXJlIGFjdHVhbGx5ICJ3cml0ZS1vbmNlIi4KKyAgICAgICAgICAgIGlmIChTdGFydHNXaXRoKG5hbWUsICJyby4iKSkgeworICAgICAgICAgICAgICAgICplcnJvciA9ICJSZWFkLW9ubHkgcHJvcGVydHkgd2FzIGFscmVhZHkgc2V0IjsKKyAgICAgICAgICAgICAgICByZXR1cm4ge1BST1BfRVJST1JfUkVBRF9PTkxZX1BST1BFUlRZfTsKKyAgICAgICAgICAgIH0KIAotICAgIC8vIERvbid0IHdyaXRlIHByb3BlcnRpZXMgdG8gZGlzayB1bnRpbCBhZnRlciB3ZSBoYXZlIHJlYWQgYWxsIGRlZmF1bHQKLSAgICAvLyBwcm9wZXJ0aWVzIHRvIHByZXZlbnQgdGhlbSBmcm9tIGJlaW5nIG92ZXJ3cml0dGVuIGJ5IGRlZmF1bHQgdmFsdWVzLgotICAgIGlmIChzb2NrZXQgJiYgcGVyc2lzdGVudF9wcm9wZXJ0aWVzX2xvYWRlZCAmJiBTdGFydHNXaXRoKG5hbWUsICJwZXJzaXN0LiIpKSB7Ci0gICAgICAgIGlmIChwZXJzaXN0X3dyaXRlX3RocmVhZCkgewotICAgICAgICAgICAgcGVyc2lzdF93cml0ZV90aHJlYWQtPldyaXRlKG5hbWUsIHZhbHVlLCBzdGQ6Om1vdmUoKnNvY2tldCkpOwotICAgICAgICAgICAgcmV0dXJuIHt9OworICAgICAgICAgICAgX19zeXN0ZW1fcHJvcGVydHlfdXBkYXRlKHBpLCB2YWx1ZS5jX3N0cigpLCB2YWx1ZWxlbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgcmMgPSBfX3N5c3RlbV9wcm9wZXJ0eV9hZGQobmFtZS5jX3N0cigpLCBuYW1lLnNpemUoKSwgdmFsdWUuY19zdHIoKSwgdmFsdWVsZW4pOworICAgICAgICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICAgICAgICAgICplcnJvciA9ICJfX3N5c3RlbV9wcm9wZXJ0eV9hZGQgZmFpbGVkIjsKKyAgICAgICAgICAgICAgICByZXR1cm4ge1BST1BfRVJST1JfU0VUX0ZBSUxFRH07CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgV3JpdGVQZXJzaXN0ZW50UHJvcGVydHkobmFtZSwgdmFsdWUpOworCisgICAgICAgIC8vIERvbid0IHdyaXRlIHByb3BlcnRpZXMgdG8gZGlzayB1bnRpbCBhZnRlciB3ZSBoYXZlIHJlYWQgYWxsIGRlZmF1bHQKKyAgICAgICAgLy8gcHJvcGVydGllcyB0byBwcmV2ZW50IHRoZW0gZnJvbSBiZWluZyBvdmVyd3JpdHRlbiBieSBkZWZhdWx0IHZhbHVlcy4KKyAgICAgICAgYm9vbCBuZWVkX3BlcnNpc3QgPSBTdGFydHNXaXRoKG5hbWUsICJwZXJzaXN0LiIpIHx8IFN0YXJ0c1dpdGgobmFtZSwgIm5leHRfYm9vdC4iKTsKKyAgICAgICAgaWYgKHNvY2tldCAmJiBwZXJzaXN0ZW50X3Byb3BlcnRpZXNfbG9hZGVkICYmIG5lZWRfcGVyc2lzdCkgeworICAgICAgICAgICAgaWYgKHBlcnNpc3Rfd3JpdGVfdGhyZWFkKSB7CisgICAgICAgICAgICAgICAgcGVyc2lzdF93cml0ZV90aHJlYWQtPldyaXRlKG5hbWUsIHZhbHVlLCBzdGQ6Om1vdmUoKnNvY2tldCkpOworICAgICAgICAgICAgICAgIHJldHVybiB7fTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFdyaXRlUGVyc2lzdGVudFByb3BlcnR5KG5hbWUsIHZhbHVlKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIE5vdGlmeVByb3BlcnR5Q2hhbmdlKG5hbWUsIHZhbHVlKTsKQEAgLTQzOCw2ICs0NDksMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0Q29ubmVjdGlvbiogc29ja2V0LCBzdGQ6OnN0cmluZyogZXJyb3IpIHsKICAgICBhdXRvIGxvY2sgPSBzdGQ6OmxvY2tfZ3VhcmR7YWNjZXB0X21lc3NhZ2VzX2xvY2t9OwogICAgIGlmICghYWNjZXB0X21lc3NhZ2VzKSB7CisgICAgICAgIC8vIElmIHdlJ3JlIGFscmVhZHkgc2h1dHRpbmcgZG93biBhbmQgeW91J3JlIGFza2luZyB1cyB0byBzdG9wIHNvbWV0aGluZywKKyAgICAgICAgLy8ganVzdCBzYXkgd2UgZGlkIChodHRwczovL2lzc3VldHJhY2tlci5nb29nbGUuY29tLzMzNjIyMzUwNSkuCisgICAgICAgIGlmIChtc2cgPT0gInN0b3AiKSByZXR1cm4gUFJPUF9TVUNDRVNTOworCiAgICAgICAgICplcnJvciA9ICJSZWNlaXZlZCBjb250cm9sIG1lc3NhZ2UgYWZ0ZXIgc2h1dGRvd24sIGlnbm9yaW5nIjsKICAgICAgICAgcmV0dXJuIFBST1BfRVJST1JfSEFORExFX0NPTlRST0xfTUVTU0FHRTsKICAgICB9CkBAIC01NTAsOCArNTY1LDggQEAKICAgICAgICAgfQogICAgICAgICBMT0coSU5GTykgPDwgIlJlY2VpdmVkIHN5cy5wb3dlcmN0bD0nIiA8PCB2YWx1ZSA8PCAiJyBmcm9tIHBpZDogIiA8PCBjci5waWQKICAgICAgICAgICAgICAgICAgIDw8IHByb2Nlc3NfbG9nX3N0cmluZzsKLSAgICAgICAgaWYgKHZhbHVlID09ICJyZWJvb3QsdXNlcnNwYWNlIiAmJiAhaXNfdXNlcnNwYWNlX3JlYm9vdF9zdXBwb3J0ZWQoKS52YWx1ZV9vcihmYWxzZSkpIHsKLSAgICAgICAgICAgICplcnJvciA9ICJVc2Vyc3BhY2UgcmVib290IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBkZXZpY2UiOworICAgICAgICBpZiAodmFsdWUgPT0gInJlYm9vdCx1c2Vyc3BhY2UiKSB7CisgICAgICAgICAgICAqZXJyb3IgPSAiVXNlcnNwYWNlIHJlYm9vdCBpcyBkZXByZWNhdGVkLiI7CiAgICAgICAgICAgICByZXR1cm4ge1BST1BfRVJST1JfSU5WQUxJRF9WQUxVRX07CiAgICAgICAgIH0KICAgICB9CkBAIC01NzksMTAgKzU5NCwxMCBAQAogICAgIHJldHVybiAqcmV0OwogfQogCi1zdGF0aWMgdm9pZCBoYW5kbGVfcHJvcGVydHlfc2V0X2ZkKCkgeworc3RhdGljIHZvaWQgaGFuZGxlX3Byb3BlcnR5X3NldF9mZChpbnQgZmQpIHsKICAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtEZWZhdWx0U29ja2V0VGltZW91dCA9IDIwMDA7IC8qIG1zICovCiAKLSAgICBpbnQgcyA9IGFjY2VwdDQocHJvcGVydHlfc2V0X2ZkLCBudWxscHRyLCBudWxscHRyLCBTT0NLX0NMT0VYRUMpOworICAgIGludCBzID0gYWNjZXB0NChmZCwgbnVsbHB0ciwgbnVsbHB0ciwgU09DS19DTE9FWEVDKTsKICAgICBpZiAocyA9PSAtMSkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtOTU1LDYgKzk3MCwxNyBAQAogICAgIHN0ZDo6c3RyaW5nIGJ1aWxkX2ZpbmdlcnByaW50ID0gR2V0UHJvcGVydHkoInJvLnByb2R1Y3QuYnJhbmQiLCBVTktOT1dOKTsKICAgICBidWlsZF9maW5nZXJwcmludCArPSAnLyc7CiAgICAgYnVpbGRfZmluZ2VycHJpbnQgKz0gR2V0UHJvcGVydHkoInJvLnByb2R1Y3QubmFtZSIsIFVOS05PV04pOworCisgICAgLy8gc2hvdWxkIGJlIHNldCBpbiAvcHJvZHVjdC9ldGMvYnVpbGQucHJvcAorICAgIC8vIHdoZW4gd2UgaGF2ZSBhIGRldiBvcHRpb24gZGV2aWNlLCBhbmQgd2UndmUgc3dpdGNoZWQgdGhlIGtlcm5lbCB0byAxNmtiIG1vZGUKKyAgICAvLyB3ZSB1c2UgdGhlIHNhbWUgc3lzdGVtIGltYWdlLCBidXQgd2UndmUgc3dpdGNoZWQgb3V0IHRoZSBrZXJuZWwsIHNvIG1ha2UgaXQKKyAgICAvLyB2aXNpYmxlIGF0IGEgaGlnaCBsZXZlbAorICAgIGJvb2wgaGFzMTZLYkRldk9wdGlvbiA9CisgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpHZXRCb29sUHJvcGVydHkoInJvLnByb2R1Y3QuYnVpbGQuMTZrX3BhZ2UuZW5hYmxlZCIsIGZhbHNlKTsKKyAgICBpZiAoaGFzMTZLYkRldk9wdGlvbiAmJiBnZXRwYWdlc2l6ZSgpID09IDE2Mzg0KSB7CisgICAgICAgIGJ1aWxkX2ZpbmdlcnByaW50ICs9ICJfMTZrYiI7CisgICAgfQorCiAgICAgYnVpbGRfZmluZ2VycHJpbnQgKz0gJy8nOwogICAgIGJ1aWxkX2ZpbmdlcnByaW50ICs9IEdldFByb3BlcnR5KCJyby5wcm9kdWN0LmRldmljZSIsIFVOS05PV04pOwogICAgIGJ1aWxkX2ZpbmdlcnByaW50ICs9ICc6JzsKQEAgLTEwODAsMzYgKzExMDYsNDUgQEAKICAgICB9CiB9CiAKLXN0YXRpYyBpbnQgcmVhZF9hcGlfbGV2ZWxfcHJvcHMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcGlfbGV2ZWxfcHJvcHMpIHsKLSAgICBpbnQgYXBpX2xldmVsID0gQVBJX0xFVkVMX0NVUlJFTlQ7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBhcGlfbGV2ZWxfcHJvcCA6IGFwaV9sZXZlbF9wcm9wcykgewotICAgICAgICBhcGlfbGV2ZWwgPSBhbmRyb2lkOjpiYXNlOjpHZXRJbnRQcm9wZXJ0eShhcGlfbGV2ZWxfcHJvcCwgQVBJX0xFVkVMX0NVUlJFTlQpOwotICAgICAgICBpZiAoYXBpX2xldmVsICE9IEFQSV9MRVZFTF9DVVJSRU5UKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYXBpX2xldmVsOwotfQotCiBzdGF0aWMgdm9pZCBwcm9wZXJ0eV9pbml0aWFsaXplX3JvX3ZlbmRvcl9hcGlfbGV2ZWwoKSB7CiAgICAgLy8gcm8udmVuZG9yLmFwaV9sZXZlbCBzaG93cyB0aGUgYXBpX2xldmVsIHRoYXQgdGhlIHZlbmRvciBpbWFnZXMgKHZlbmRvciwgb2RtLCAuLi4pIGFyZQogICAgIC8vIHJlcXVpcmVkIHRvIHN1cHBvcnQuCiAgICAgY29uc3RleHByIGF1dG8gVkVORE9SX0FQSV9MRVZFTF9QUk9QID0gInJvLnZlbmRvci5hcGlfbGV2ZWwiOwogCi0gICAgLy8gQXBpIGxldmVsIHByb3BlcnRpZXMgb2YgdGhlIGJvYXJkLiBUaGUgb3JkZXIgb2YgdGhlIHByb3BlcnRpZXMgbXVzdCBiZSBrZXB0LgotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBCT0FSRF9BUElfTEVWRUxfUFJPUFMgPSB7InJvLmJvYXJkLmFwaV9sZXZlbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicm8uYm9hcmQuZmlyc3RfYXBpX2xldmVsIn07Ci0gICAgLy8gQXBpIGxldmVsIHByb3BlcnRpZXMgb2YgdGhlIGRldmljZS4gVGhlIG9yZGVyIG9mIHRoZSBwcm9wZXJ0aWVzIG11c3QgYmUga2VwdC4KLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gREVWSUNFX0FQSV9MRVZFTF9QUk9QUyA9IHsicm8ucHJvZHVjdC5maXJzdF9hcGlfbGV2ZWwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyby5idWlsZC52ZXJzaW9uLnNkayJ9OworICAgIGlmIChfX3N5c3RlbV9wcm9wZXJ0eV9maW5kKFZFTkRPUl9BUElfTEVWRUxfUFJPUCkgIT0gbnVsbHB0cikgeworICAgICAgICAvLyBUaGUgZGV2aWNlIGFscmVhZHkgaGF2ZSByby52ZW5kb3IuYXBpX2xldmVsIGluIGl0cyB2ZW5kb3IvYnVpbGQucHJvcC4KKyAgICAgICAgLy8gU2tpcCBpbml0aWFsaXppbmcgdGhlIHJvLnZlbmRvci5hcGlfbGV2ZWwgcHJvcGVydHkuCisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLSAgICBpbnQgYXBpX2xldmVsID0gc3RkOjptaW4ocmVhZF9hcGlfbGV2ZWxfcHJvcHMoQk9BUkRfQVBJX0xFVkVMX1BST1BTKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9hcGlfbGV2ZWxfcHJvcHMoREVWSUNFX0FQSV9MRVZFTF9QUk9QUykpOworICAgIGF1dG8gdmVuZG9yX2FwaV9sZXZlbCA9IEdldEludFByb3BlcnR5KCJyby5ib2FyZC5maXJzdF9hcGlfbGV2ZWwiLCBfX0FORFJPSURfVkVORE9SX0FQSV9NQVhfXyk7CisgICAgaWYgKHZlbmRvcl9hcGlfbGV2ZWwgIT0gX19BTkRST0lEX1ZFTkRPUl9BUElfTUFYX18pIHsKKyAgICAgICAgLy8gVXBkYXRlIHRoZSB2ZW5kb3JfYXBpX2xldmVsIHdpdGggInJvLmJvYXJkLmFwaV9sZXZlbCIgb25seSBpZiBib3RoICJyby5ib2FyZC5hcGlfbGV2ZWwiCisgICAgICAgIC8vIGFuZCAicm8uYm9hcmQuZmlyc3RfYXBpX2xldmVsIiBhcmUgZGVmaW5lZC4KKyAgICAgICAgdmVuZG9yX2FwaV9sZXZlbCA9IEdldEludFByb3BlcnR5KCJyby5ib2FyZC5hcGlfbGV2ZWwiLCB2ZW5kb3JfYXBpX2xldmVsKTsKKyAgICB9CisKKyAgICBhdXRvIHByb2R1Y3RfZmlyc3RfYXBpX2xldmVsID0KKyAgICAgICAgICAgIEdldEludFByb3BlcnR5KCJyby5wcm9kdWN0LmZpcnN0X2FwaV9sZXZlbCIsIF9fQU5EUk9JRF9BUElfRlVUVVJFX18pOworICAgIGlmIChwcm9kdWN0X2ZpcnN0X2FwaV9sZXZlbCA9PSBfX0FORFJPSURfQVBJX0ZVVFVSRV9fKSB7CisgICAgICAgIC8vIEZhbGxiYWNrIHRvICJyby5idWlsZC52ZXJzaW9uLnNkayIgaWYgdGhlICJyby5wcm9kdWN0LmZpcnN0X2FwaV9sZXZlbCIgaXMgbm90IGRlZmluZWQuCisgICAgICAgIHByb2R1Y3RfZmlyc3RfYXBpX2xldmVsID0gR2V0SW50UHJvcGVydHkoInJvLmJ1aWxkLnZlcnNpb24uc2RrIiwgX19BTkRST0lEX0FQSV9GVVRVUkVfXyk7CisgICAgfQorCisgICAgdmVuZG9yX2FwaV9sZXZlbCA9CisgICAgICAgICAgICBzdGQ6Om1pbihBVmVuZG9yU3VwcG9ydF9nZXRWZW5kb3JBcGlMZXZlbE9mKHByb2R1Y3RfZmlyc3RfYXBpX2xldmVsKSwgdmVuZG9yX2FwaV9sZXZlbCk7CisKKyAgICBpZiAodmVuZG9yX2FwaV9sZXZlbCA8IDApIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5leHBlY3RlZCB2ZW5kb3IgYXBpIGxldmVsIGZvciAiIDw8IFZFTkRPUl9BUElfTEVWRUxfUFJPUCA8PCAiLiBDaGVjayAiCisgICAgICAgICAgICAgICAgICAgPDwgInJvLnByb2R1Y3QuZmlyc3RfYXBpX2xldmVsIGFuZCByby5idWlsZC52ZXJzaW9uLnNkay4iOworICAgICAgICB2ZW5kb3JfYXBpX2xldmVsID0gX19BTkRST0lEX1ZFTkRPUl9BUElfTUFYX187CisgICAgfQorCiAgICAgc3RkOjpzdHJpbmcgZXJyb3I7Ci0gICAgYXV0byByZXMgPSBQcm9wZXJ0eVNldE5vU29ja2V0KFZFTkRPUl9BUElfTEVWRUxfUFJPUCwgc3RkOjp0b19zdHJpbmcoYXBpX2xldmVsKSwgJmVycm9yKTsKKyAgICBhdXRvIHJlcyA9IFByb3BlcnR5U2V0Tm9Tb2NrZXQoVkVORE9SX0FQSV9MRVZFTF9QUk9QLCBzdGQ6OnRvX3N0cmluZyh2ZW5kb3JfYXBpX2xldmVsKSwgJmVycm9yKTsKICAgICBpZiAocmVzICE9IFBST1BfU1VDQ0VTUykgewotICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gc2V0ICIgPDwgVkVORE9SX0FQSV9MRVZFTF9QUk9QIDw8ICIgd2l0aCAiIDw8IGFwaV9sZXZlbCA8PCAiOiAiCi0gICAgICAgICAgICAgICAgICAgPDwgZXJyb3IgPDwgIigiIDw8IHJlcyA8PCAiKSI7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBzZXQgIiA8PCBWRU5ET1JfQVBJX0xFVkVMX1BST1AgPDwgIiB3aXRoICIgPDwgdmVuZG9yX2FwaV9sZXZlbAorICAgICAgICAgICAgICAgICAgIDw8ICI6ICIgPDwgZXJyb3IgPDwgIigiIDw8IHJlcyA8PCAiKSI7CiAgICAgfQogfQogCkBAIC0xMjE2LDYgKzEyNTEsMTYgQEAKICAgICB1cGRhdGVfc3lzX3VzYl9jb25maWcoKTsKIH0KIAordm9pZCBQcm9wZXJ0eUxvYWREZXJpdmVkRGVmYXVsdHMoKSB7CisgICAgY29uc3QgY2hhciogUEFHRV9QUk9QID0gInJvLmJvb3QuaGFyZHdhcmUuY3B1LnBhZ2VzaXplIjsKKyAgICBpZiAoR2V0UHJvcGVydHkoUEFHRV9QUk9QLCAiIikuZW1wdHkoKSkgeworICAgICAgICBzdGQ6OnN0cmluZyBlcnJvcjsKKyAgICAgICAgaWYgKFByb3BlcnR5U2V0Tm9Tb2NrZXQoUEFHRV9QUk9QLCBzdGQ6OnRvX3N0cmluZyhnZXRwYWdlc2l6ZSgpKSwgJmVycm9yKSAhPSBQUk9QX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBzZXQgJyIgPDwgUEFHRV9QUk9QIDw8ICInIGJlY2F1c2U6ICIgPDwgZXJyb3I7CisgICAgICAgIH0KKyAgICB9Cit9CisKIGJvb2wgTG9hZFByb3BlcnR5SW5mb0Zyb21GaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFByb3BlcnR5SW5mb0VudHJ5PiogcHJvcGVydHlfaW5mb3MpIHsKICAgICBhdXRvIGZpbGVfY29udGVudHMgPSBzdGQ6OnN0cmluZygpOwpAQCAtMTI0Niw5ICsxMjkxLDYgQEAKICAgICAgICAgLy8gRG9uJ3QgY2hlY2sgZm9yIGZhaWx1cmUgaGVyZSwgc2luY2Ugd2UgZG9uJ3QgYWx3YXlzIGhhdmUgYWxsIG9mIHRoZXNlIHBhcnRpdGlvbnMuCiAgICAgICAgIC8vIEUuZy4gSW4gY2FzZSBvZiByZWNvdmVyeSwgdGhlIHZlbmRvciBwYXJ0aXRpb24gd2lsbCBub3QgaGF2ZSBtb3VudGVkIGFuZCB3ZQogICAgICAgICAvLyBzdGlsbCBuZWVkIHRoZSBzeXN0ZW0gLyBwbGF0Zm9ybSBwcm9wZXJ0aWVzIHRvIGZ1bmN0aW9uLgotICAgICAgICBpZiAoYWNjZXNzKCIvZGV2L3NlbGludXgvYXBleF9wcm9wZXJ0eV9jb250ZXh0cyIsIFJfT0spICE9IC0xKSB7Ci0gICAgICAgICAgICBMb2FkUHJvcGVydHlJbmZvRnJvbUZpbGUoIi9kZXYvc2VsaW51eC9hcGV4X3Byb3BlcnR5X2NvbnRleHRzIiwgJnByb3BlcnR5X2luZm9zKTsKLSAgICAgICAgfQogICAgICAgICBpZiAoYWNjZXNzKCIvc3lzdGVtX2V4dC9ldGMvc2VsaW51eC9zeXN0ZW1fZXh0X3Byb3BlcnR5X2NvbnRleHRzIiwgUl9PSykgIT0gLTEpIHsKICAgICAgICAgICAgIExvYWRQcm9wZXJ0eUluZm9Gcm9tRmlsZSgiL3N5c3RlbV9leHQvZXRjL3NlbGludXgvc3lzdGVtX2V4dF9wcm9wZXJ0eV9jb250ZXh0cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5X2luZm9zKTsKQEAgLTEyNzIsNyArMTMxNCw2IEBACiAgICAgICAgIExvYWRQcm9wZXJ0eUluZm9Gcm9tRmlsZSgiL3ZlbmRvcl9wcm9wZXJ0eV9jb250ZXh0cyIsICZwcm9wZXJ0eV9pbmZvcyk7CiAgICAgICAgIExvYWRQcm9wZXJ0eUluZm9Gcm9tRmlsZSgiL3Byb2R1Y3RfcHJvcGVydHlfY29udGV4dHMiLCAmcHJvcGVydHlfaW5mb3MpOwogICAgICAgICBMb2FkUHJvcGVydHlJbmZvRnJvbUZpbGUoIi9vZG1fcHJvcGVydHlfY29udGV4dHMiLCAmcHJvcGVydHlfaW5mb3MpOwotICAgICAgICBMb2FkUHJvcGVydHlJbmZvRnJvbUZpbGUoIi9kZXYvc2VsaW51eC9hcGV4X3Byb3BlcnR5X2NvbnRleHRzIiwgJnByb3BlcnR5X2luZm9zKTsKICAgICB9CiAKICAgICBhdXRvIHNlcmlhbGl6ZWRfY29udGV4dHMgPSBzdGQ6OnN0cmluZygpOwpAQCAtMTI4MywxMSArMTMyNCwxOSBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgY29uc3RleHByIHN0YXRpYyBjb25zdCBjaGFyIGtQcm9wZXJ0eUluZm9zUGF0aFtdID0gIi9kZXYvX19wcm9wZXJ0aWVzX18vcHJvcGVydHlfaW5mbyI7Ci0gICAgaWYgKCFXcml0ZVN0cmluZ1RvRmlsZShzZXJpYWxpemVkX2NvbnRleHRzLCBrUHJvcGVydHlJbmZvc1BhdGgsIDA0NDQsIDAsIDAsIGZhbHNlKSkgeworICAgIGlmICghV3JpdGVTdHJpbmdUb0ZpbGUoc2VyaWFsaXplZF9jb250ZXh0cywgUFJPUF9UUkVFX0ZJTEUsIDA0NDQsIDAsIDAsIGZhbHNlKSkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIHdyaXRlIHNlcmlhbGl6ZWQgcHJvcGVydHkgaW5mb3MgdG8gZmlsZSI7CiAgICAgfQotICAgIHNlbGludXhfYW5kcm9pZF9yZXN0b3JlY29uKGtQcm9wZXJ0eUluZm9zUGF0aCwgMCk7CisgICAgc2VsaW51eF9hbmRyb2lkX3Jlc3RvcmVjb24oUFJPUF9UUkVFX0ZJTEUsIDApOworCisjaWZkZWYgV1JJVEVfQVBQQ09NUEFUX09WRVJSSURFX1NZU1RFTV9QUk9QRVJUSUVTCisgICAgbWtkaXIoQVBQQ09NUEFUX09WRVJSSURFX1BST1BfRk9MREVSTkFNRSwgU19JUldYVSB8IFNfSVhHUlAgfCBTX0lYT1RIKTsKKyAgICBpZiAoIVdyaXRlU3RyaW5nVG9GaWxlKHNlcmlhbGl6ZWRfY29udGV4dHMsIEFQUENPTVBBVF9PVkVSUklERV9QUk9QX1RSRUVfRklMRSwgMDQ0NCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIHdyaXRlIGFwcGNvbXBhdCBvdmVycmlkZSBwcm9wZXJ0eSBpbmZvcyB0byBmaWxlIjsKKyAgICB9CisgICAgc2VsaW51eF9hbmRyb2lkX3Jlc3RvcmVjb24oQVBQQ09NUEFUX09WRVJSSURFX1BST1BfVFJFRV9GSUxFLCAwKTsKKyNlbmRpZgogfQogCiBzdGF0aWMgdm9pZCBFeHBvcnRLZXJuZWxCb290UHJvcHMoKSB7CkBAIC0xMzE3LDcgKzEzNjYsOCBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgc3RkOjp1bmlxdWVfcHRyPERJUiwgaW50ICgqKShESVIqKT4gZGlyKG9wZW5kaXIoZ2V0X2FuZHJvaWRfZHRfZGlyKCkuY19zdHIoKSksIGNsb3NlZGlyKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RElSLCBpbnQgKCopKERJUiopPiBkaXIob3BlbmRpcihhbmRyb2lkOjpmc19tZ3I6OkdldEFuZHJvaWREdERpcigpLmNfc3RyKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZWRpcik7CiAgICAgaWYgKCFkaXIpIHJldHVybjsKIAogICAgIHN0ZDo6c3RyaW5nIGR0X2ZpbGU7CkBAIC0xMzI4LDcgKzEzNzgsNyBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICBzdGQ6OnN0cmluZyBmaWxlX25hbWUgPSBnZXRfYW5kcm9pZF9kdF9kaXIoKSArIGRwLT5kX25hbWU7CisgICAgICAgIHN0ZDo6c3RyaW5nIGZpbGVfbmFtZSA9IGFuZHJvaWQ6OmZzX21ncjo6R2V0QW5kcm9pZER0RGlyKCkgKyBkcC0+ZF9uYW1lOwogCiAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmcoZmlsZV9uYW1lLCAmZHRfZmlsZSk7CiAgICAgICAgIHN0ZDo6cmVwbGFjZShkdF9maWxlLmJlZ2luKCksIGR0X2ZpbGUuZW5kKCksICcsJywgJy4nKTsKQEAgLTEzNDAsNyArMTM5MCw3IEBACiBjb25zdGV4cHIgYXV0byBBTkRST0lEQk9PVF9QUkVGSVggPSAiYW5kcm9pZGJvb3QuInN2OwogCiBzdGF0aWMgdm9pZCBQcm9jZXNzS2VybmVsQ21kbGluZSgpIHsKLSAgICBJbXBvcnRLZXJuZWxDbWRsaW5lKFsmXShjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBhbmRyb2lkOjpmc19tZ3I6OkltcG9ydEtlcm5lbENtZGxpbmUoWyZdKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgewogICAgICAgICBpZiAoU3RhcnRzV2l0aChrZXksIEFORFJPSURCT09UX1BSRUZJWCkpIHsKICAgICAgICAgICAgIEluaXRQcm9wZXJ0eVNldCgicm8uYm9vdC4iICsga2V5LnN1YnN0cihBTkRST0lEQk9PVF9QUkVGSVguc2l6ZSgpKSwgdmFsdWUpOwogICAgICAgICB9CkBAIC0xMzQ5LDcgKzEzOTksNyBAQAogCiAKIHN0YXRpYyB2b2lkIFByb2Nlc3NCb290Y29uZmlnKCkgewotICAgIEltcG9ydEJvb3Rjb25maWcoWyZdKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIGFuZHJvaWQ6OmZzX21ncjo6SW1wb3J0Qm9vdGNvbmZpZyhbJl0oY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CiAgICAgICAgIGlmIChTdGFydHNXaXRoKGtleSwgQU5EUk9JREJPT1RfUFJFRklYKSkgewogICAgICAgICAgICAgSW5pdFByb3BlcnR5U2V0KCJyby5ib290LiIgKyBrZXkuc3Vic3RyKEFORFJPSURCT09UX1BSRUZJWC5zaXplKCkpLCB2YWx1ZSk7CiAgICAgICAgIH0KQEAgLTEzODEsNiArMTQzMSw3IEBACiAgICAgRXhwb3J0S2VybmVsQm9vdFByb3BzKCk7CiAKICAgICBQcm9wZXJ0eUxvYWRCb290RGVmYXVsdHMoKTsKKyAgICBQcm9wZXJ0eUxvYWREZXJpdmVkRGVmYXVsdHMoKTsKIH0KIAogc3RhdGljIHZvaWQgSGFuZGxlSW5pdFNvY2tldCgpIHsKQEAgLTEzOTksMTIgKzE0NTAsMTQgQEAKICAgICBzd2l0Y2ggKGluaXRfbWVzc2FnZS5tc2dfY2FzZSgpKSB7CiAgICAgICAgIGNhc2UgSW5pdE1lc3NhZ2U6OmtMb2FkUGVyc2lzdGVudFByb3BlcnRpZXM6IHsKICAgICAgICAgICAgIGxvYWRfb3ZlcnJpZGVfcHJvcGVydGllcygpOwotICAgICAgICAgICAgLy8gUmVhZCBwZXJzaXN0ZW50IHByb3BlcnRpZXMgYWZ0ZXIgYWxsIGRlZmF1bHQgdmFsdWVzIGhhdmUgYmVlbiBsb2FkZWQuCisKICAgICAgICAgICAgIGF1dG8gcGVyc2lzdGVudF9wcm9wZXJ0aWVzID0gTG9hZFBlcnNpc3RlbnRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHBlcnNpc3RlbnRfcHJvcGVydHlfcmVjb3JkIDogcGVyc2lzdGVudF9wcm9wZXJ0aWVzLnByb3BlcnRpZXMoKSkgewotICAgICAgICAgICAgICAgIEluaXRQcm9wZXJ0eVNldChwZXJzaXN0ZW50X3Byb3BlcnR5X3JlY29yZC5uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlbnRfcHJvcGVydHlfcmVjb3JkLnZhbHVlKCkpOworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwcm9wZXJ0eV9yZWNvcmQgOiBwZXJzaXN0ZW50X3Byb3BlcnRpZXMucHJvcGVydGllcygpKSB7CisgICAgICAgICAgICAgICAgYXV0byBjb25zdCYgcHJvcF9uYW1lID0gcHJvcGVydHlfcmVjb3JkLm5hbWUoKTsKKyAgICAgICAgICAgICAgICBhdXRvIGNvbnN0JiBwcm9wX3ZhbHVlID0gcHJvcGVydHlfcmVjb3JkLnZhbHVlKCk7CisgICAgICAgICAgICAgICAgSW5pdFByb3BlcnR5U2V0KHByb3BfbmFtZSwgcHJvcF92YWx1ZSk7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8vIEFwcGx5IGRlYnVnIHJhbWRpc2sgc3BlY2lhbCBzZXR0aW5ncyBhZnRlciBwZXJzaXN0ZW50IHByb3BlcnRpZXMgYXJlIGxvYWRlZC4KICAgICAgICAgICAgIGlmIChhbmRyb2lkOjpiYXNlOjpHZXRCb29sUHJvcGVydHkoInJvLmZvcmNlLmRlYnVnZ2FibGUiLCBmYWxzZSkpIHsKICAgICAgICAgICAgICAgICAvLyBBbHdheXMgZW5hYmxlIHVzYiBhZGIgaWYgZGV2aWNlIGlzIGJvb3RlZCB3aXRoIGRlYnVnIHJhbWRpc2suCkBAIC0xNDE5LDE5ICsxNDcyLDIxIEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBQcm9wZXJ0eVNlcnZpY2VUaHJlYWQoKSB7CitzdGF0aWMgdm9pZCBQcm9wZXJ0eVNlcnZpY2VUaHJlYWQoaW50IGZkLCBib29sIGxpc3Rlbl9pbml0KSB7CiAgICAgRXBvbGwgZXBvbGw7CiAgICAgaWYgKGF1dG8gcmVzdWx0ID0gZXBvbGwuT3BlbigpOyAhcmVzdWx0Lm9rKCkpIHsKICAgICAgICAgTE9HKEZBVEFMKSA8PCByZXN1bHQuZXJyb3IoKTsKICAgICB9CiAKLSAgICBpZiAoYXV0byByZXN1bHQgPSBlcG9sbC5SZWdpc3RlckhhbmRsZXIocHJvcGVydHlfc2V0X2ZkLCBoYW5kbGVfcHJvcGVydHlfc2V0X2ZkKTsKKyAgICBpZiAoYXV0byByZXN1bHQgPSBlcG9sbC5SZWdpc3RlckhhbmRsZXIoZmQsIHN0ZDo6YmluZChoYW5kbGVfcHJvcGVydHlfc2V0X2ZkLCBmZCkpOwogICAgICAgICAhcmVzdWx0Lm9rKCkpIHsKICAgICAgICAgTE9HKEZBVEFMKSA8PCByZXN1bHQuZXJyb3IoKTsKICAgICB9CiAKLSAgICBpZiAoYXV0byByZXN1bHQgPSBlcG9sbC5SZWdpc3RlckhhbmRsZXIoaW5pdF9zb2NrZXQsIEhhbmRsZUluaXRTb2NrZXQpOyAhcmVzdWx0Lm9rKCkpIHsKLSAgICAgICAgTE9HKEZBVEFMKSA8PCByZXN1bHQuZXJyb3IoKTsKKyAgICBpZiAobGlzdGVuX2luaXQpIHsKKyAgICAgICAgaWYgKGF1dG8gcmVzdWx0ID0gZXBvbGwuUmVnaXN0ZXJIYW5kbGVyKGluaXRfc29ja2V0LCBIYW5kbGVJbml0U29ja2V0KTsgIXJlc3VsdC5vaygpKSB7CisgICAgICAgICAgICBMT0coRkFUQUwpIDw8IHJlc3VsdC5lcnJvcigpOworICAgICAgICB9CiAgICAgfQogCiAgICAgd2hpbGUgKHRydWUpIHsKQEAgLTE0NjMsOCArMTUxOCw2IEBACiAgICAgICAgICAgICB3b3JrXy5wb3BfZnJvbnQoKTsKICAgICAgICAgfQogCi0gICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2Zvcigxcyk7Ci0KICAgICAgICAgLy8gUGVyZm9ybSB3cml0ZS9mc3luYyBvdXRzaWRlIHRoZSBsb2NrLgogICAgICAgICBXcml0ZVBlcnNpc3RlbnRQcm9wZXJ0eShzdGQ6OmdldDwwPihpdGVtKSwgc3RkOjpnZXQ8MT4oaXRlbSkpOwogICAgICAgICBOb3RpZnlQcm9wZXJ0eUNoYW5nZShzdGQ6OmdldDwwPihpdGVtKSwgc3RkOjpnZXQ8MT4oaXRlbSkpOwpAQCAtMTQ4Miw2ICsxNTM1LDIzIEBACiAgICAgY3ZfLm5vdGlmeV9hbGwoKTsKIH0KIAordm9pZCBTdGFydFRocmVhZChjb25zdCBjaGFyKiBuYW1lLCBpbnQgbW9kZSwgaW50IGdpZCwgc3RkOjp0aHJlYWQmIHQsIGJvb2wgbGlzdGVuX2luaXQpIHsKKyAgICBpbnQgZmQgPSAtMTsKKyAgICBpZiAoYXV0byByZXN1bHQgPSBDcmVhdGVTb2NrZXQobmFtZSwgU09DS19TVFJFQU0gfCBTT0NLX0NMT0VYRUMgfCBTT0NLX05PTkJMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnBhc3NjcmVkPSovZmFsc2UsIC8qc2hvdWxkX2xpc3Rlbj0qL2ZhbHNlLCBtb2RlLCAvKnVpZD0qLzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qZ2lkPSovZ2lkLCAvKnNvY2tldGNvbj0qL3t9KTsKKyAgICAgICAgcmVzdWx0Lm9rKCkpIHsKKyAgICAgICAgZmQgPSAqcmVzdWx0OworICAgIH0gZWxzZSB7CisgICAgICAgIExPRyhGQVRBTCkgPDwgInN0YXJ0X3Byb3BlcnR5X3NlcnZpY2Ugc29ja2V0IGNyZWF0aW9uIGZhaWxlZDogIiA8PCByZXN1bHQuZXJyb3IoKTsKKyAgICB9CisKKyAgICBsaXN0ZW4oZmQsIDgpOworCisgICAgYXV0byBuZXdfdGhyZWFkID0gc3RkOjp0aHJlYWQoUHJvcGVydHlTZXJ2aWNlVGhyZWFkLCBmZCwgbGlzdGVuX2luaXQpOworICAgIHQuc3dhcChuZXdfdGhyZWFkKTsKK30KKwogdm9pZCBTdGFydFByb3BlcnR5U2VydmljZShpbnQqIGVwb2xsX3NvY2tldCkgewogICAgIEluaXRQcm9wZXJ0eVNldCgicm8ucHJvcGVydHlfc2VydmljZS52ZXJzaW9uIiwgIjIiKTsKIApAQCAtMTQ5MywxOSArMTU2Myw5IEBACiAgICAgaW5pdF9zb2NrZXQgPSBzb2NrZXRzWzFdOwogICAgIFN0YXJ0U2VuZGluZ01lc3NhZ2VzKCk7CiAKLSAgICBpZiAoYXV0byByZXN1bHQgPSBDcmVhdGVTb2NrZXQoUFJPUF9TRVJWSUNFX05BTUUsIFNPQ0tfU1RSRUFNIHwgU09DS19DTE9FWEVDIHwgU09DS19OT05CTE9DSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypwYXNzY3JlZD0qL2ZhbHNlLCAvKnNob3VsZF9saXN0ZW49Ki9mYWxzZSwgMDY2NiwgLyp1aWQ9Ki8wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmdpZD0qLzAsIC8qc29ja2V0Y29uPSove30pOwotICAgICAgICByZXN1bHQub2soKSkgewotICAgICAgICBwcm9wZXJ0eV9zZXRfZmQgPSAqcmVzdWx0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIExPRyhGQVRBTCkgPDwgInN0YXJ0X3Byb3BlcnR5X3NlcnZpY2Ugc29ja2V0IGNyZWF0aW9uIGZhaWxlZDogIiA8PCByZXN1bHQuZXJyb3IoKTsKLSAgICB9Ci0KLSAgICBsaXN0ZW4ocHJvcGVydHlfc2V0X2ZkLCA4KTsKLQotICAgIGF1dG8gbmV3X3RocmVhZCA9IHN0ZDo6dGhyZWFke1Byb3BlcnR5U2VydmljZVRocmVhZH07Ci0gICAgcHJvcGVydHlfc2VydmljZV90aHJlYWQuc3dhcChuZXdfdGhyZWFkKTsKKyAgICBTdGFydFRocmVhZChQUk9QX1NFUlZJQ0VfRk9SX1NZU1RFTV9OQU1FLCAwNjYwLCBBSURfU1lTVEVNLCBwcm9wZXJ0eV9zZXJ2aWNlX2Zvcl9zeXN0ZW1fdGhyZWFkLAorICAgICAgICAgICAgICAgIHRydWUpOworICAgIFN0YXJ0VGhyZWFkKFBST1BfU0VSVklDRV9OQU1FLCAwNjY2LCAwLCBwcm9wZXJ0eV9zZXJ2aWNlX3RocmVhZCwgZmFsc2UpOwogCiAgICAgYXV0byBhc3luY19wZXJzaXN0X3dyaXRlcyA9CiAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpHZXRCb29sUHJvcGVydHkoInJvLnByb3BlcnR5X3NlcnZpY2UuYXN5bmNfcGVyc2lzdF93cml0ZXMiLCBmYWxzZSk7CmRpZmYgLS1naXQgYS9pbml0L3Byb3BlcnR5X3NlcnZpY2VfdGVzdC5jcHAgYi9pbml0L3Byb3BlcnR5X3NlcnZpY2VfdGVzdC5jcHAKaW5kZXggNWYzNGNjNC4uYzEyZmY3MiAxMDA2NDQKLS0tIGEvaW5pdC9wcm9wZXJ0eV9zZXJ2aWNlX3Rlc3QuY3BwCisrKyBiL2luaXQvcHJvcGVydHlfc2VydmljZV90ZXN0LmNwcApAQCAtMTYsMTEgKzE2LDkgQEAKIAogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9zeXN0ZW1fcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHN5cy91bi5oPgogCi0jZGVmaW5lIF9SRUFMTFlfSU5DTFVERV9TWVNfX1NZU1RFTV9QUk9QRVJUSUVTX0hfCi0jaW5jbHVkZSA8c3lzL19zeXN0ZW1fcHJvcGVydGllcy5oPgotCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc2NvcGVndWFyZC5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CkBAIC04MiwxMiArODAsNiBAQAogICAgICAgICBHVEVTVF9TS0lQKCkgPDwgIlNraXBwaW5nIHRlc3QsIG11c3QgYmUgcnVuIGFzIHJvb3QuIjsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBjb25zdCBzdGQ6OnN0cmluZyBvcmlnaW5hbF92YWx1ZSA9IEdldFByb3BlcnR5KCJpbml0LnVzZXJzcGFjZV9yZWJvb3QuaXNfc3VwcG9ydGVkIiwgIiIpOwotICAgIGF1dG8gZ3VhcmQgPSBhbmRyb2lkOjpiYXNlOjptYWtlX3Njb3BlX2d1YXJkKFsmb3JpZ2luYWxfdmFsdWVdKCkgewotICAgICAgICBTZXRQcm9wZXJ0eSgiaW5pdC51c2Vyc3BhY2VfcmVib290LmlzX3N1cHBvcnRlZCIsIG9yaWdpbmFsX3ZhbHVlKTsKLSAgICB9KTsKLQotICAgIEFTU0VSVF9UUlVFKFNldFByb3BlcnR5KCJpbml0LnVzZXJzcGFjZV9yZWJvb3QuaXNfc3VwcG9ydGVkIiwgImZhbHNlIikpOwogICAgIEVYUEVDVF9GQUxTRShTZXRQcm9wZXJ0eSgic3lzLnBvd2VyY3RsIiwgInJlYm9vdCx1c2Vyc3BhY2UiKSk7CiB9CiAKZGlmZiAtLWdpdCBhL2luaXQvcmVib290LmNwcCBiL2luaXQvcmVib290LmNwcAppbmRleCAyN2E3ODc2Li5lZjlkYjlmIDEwMDY0NAotLS0gYS9pbml0L3JlYm9vdC5jcHAKKysrIGIvaW5pdC9yZWJvb3QuY3BwCkBAIC0zOSw3ICszOSw2IEBACiAjaW5jbHVkZSA8dGhyZWFkPgogI2luY2x1ZGUgPHZlY3Rvcj4KIAotI2luY2x1ZGUgPEluaXRQcm9wZXJ0aWVzLnN5c3Byb3AuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvY2hyb25vX3V0aWxzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgpAQCAtODcsMTYgKzg2LDYgQEAKIAogc3RhdGljIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBrRGVidWdnaW5nU2VydmljZXN7InRvbWJzdG9uZWQiLCAibG9nZCIsICJhZGJkIiwgImNvbnNvbGUifTsKIAotc3RhdGljIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBHZXRQb3N0RGF0YURlYnVnZ2luZ1NlcnZpY2VzKCkgewotICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiByZXQ7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBzIDogU2VydmljZUxpc3Q6OkdldEluc3RhbmNlKCkpIHsKLSAgICAgICAgaWYgKGtEZWJ1Z2dpbmdTZXJ2aWNlcy5jb3VudChzLT5uYW1lKCkpICYmIHMtPmlzX3Bvc3RfZGF0YSgpKSB7Ci0gICAgICAgICAgICByZXQuaW5zZXJ0KHMtPm5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQogc3RhdGljIHZvaWQgUGVyc2lzdFJlYm9vdFJlYXNvbihjb25zdCBjaGFyKiByZWFzb24sIGJvb2wgd3JpdGVfdG9fcHJvcGVydHkpIHsKICAgICBpZiAod3JpdGVfdG9fcHJvcGVydHkpIHsKICAgICAgICAgU2V0UHJvcGVydHkoTEFTVF9SRUJPT1RfUkVBU09OX1BST1BFUlRZLCByZWFzb24pOwpAQCAtNTYzLDcgKzU1Miw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHRpbWVvdXQgPiAwbXMpIHsKLSAgICAgICAgV2FpdFRvQmVSZWFwZWQocGlkcywgdGltZW91dCk7CisgICAgICAgIFdhaXRUb0JlUmVhcGVkKFNlcnZpY2U6OkdldFNpZ2NobGRGZCgpLCBwaWRzLCB0aW1lb3V0KTsKICAgICB9IGVsc2UgewogICAgICAgICAvLyBFdmVuIGlmIHdlIGRvbid0IHRvIHdhaXQgZm9yIHNlcnZpY2VzIHRvIHN0b3AsIHdlIHN0aWxsIG9wdGltaXN0aWNhbGx5IHJlYXAgem9tYmllcy4KICAgICAgICAgUmVhcEFueU91dHN0YW5kaW5nQ2hpbGRyZW4oKTsKQEAgLTY4MCw4ICs2NjksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIic6ICIgPDwgcmVzdWx0LmVycm9yKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzLT5TZXRTaHV0ZG93bkNyaXRpY2FsKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZG9fc2h1dGRvd25fYW5pbWF0aW9uKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmIChkb19zaHV0ZG93bl9hbmltYXRpb24gJiYgcy0+Y2xhc3NuYW1lcygpLmNvdW50KCJhbmltYXRpb24iKSA+IDApIHsKKyAgICAgICAgICAgIC8vIE5lZWQgdGhlc2UgZm9yIHNodXRkb3duIGFuaW1hdGlvbnMuCiAgICAgICAgIH0gZWxzZSBpZiAocy0+SXNTaHV0ZG93bkNyaXRpY2FsKCkpIHsKICAgICAgICAgICAgIC8vIFN0YXJ0IHNodXRkb3duIGNyaXRpY2FsIHNlcnZpY2UgaWYgbm90IHN0YXJ0ZWQuCiAgICAgICAgICAgICBpZiAoYXV0byByZXN1bHQgPSBzLT5TdGFydCgpOyAhcmVzdWx0Lm9rKCkpIHsKQEAgLTgxMCwxOTYgKzc5OSw2IEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBMZWF2ZVNodXRkb3duKCkgewotICAgIExPRyhJTkZPKSA8PCAiTGVhdmluZyBzaHV0ZG93biBtb2RlIjsKLSAgICBzaHV0dGluZ19kb3duID0gZmFsc2U7Ci0gICAgU3RhcnRTZW5kaW5nTWVzc2FnZXMoKTsKLX0KLQotc3RhdGljIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgR2V0TWlsbGlzUHJvcGVydHkoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIGRlZmF1bHRfdmFsdWUpIHsKLSAgICBhdXRvIHZhbHVlID0gR2V0VWludFByb3BlcnR5KG5hbWUsIHN0YXRpY19jYXN0PHVpbnQ2NF90PihkZWZhdWx0X3ZhbHVlLmNvdW50KCkpKTsKLSAgICByZXR1cm4gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyhzdGQ6Om1vdmUodmFsdWUpKTsKLX0KLQotc3RhdGljIFJlc3VsdDx2b2lkPiBEb1VzZXJzcGFjZVJlYm9vdCgpIHsKLSAgICBMT0coSU5GTykgPDwgIlVzZXJzcGFjZSByZWJvb3QgaW5pdGlhdGVkIjsKLSAgICAvLyBBbiB1Z2x5IHdheSB0byBwYXNzIGEgbW9yZSBwcmVjaXNlIHJlYXNvbiBvbiB3aHkgZmFsbGJhY2sgdG8gaGFyZCByZWJvb3Qgd2FzIHRyaWdnZXJlZC4KLSAgICBzdGQ6OnN0cmluZyBzdWJfcmVhc29uID0gIiI7Ci0gICAgYXV0byBndWFyZCA9IGFuZHJvaWQ6OmJhc2U6Om1ha2Vfc2NvcGVfZ3VhcmQoWyZzdWJfcmVhc29uXSB7Ci0gICAgICAgIC8vIExlYXZlIHNodXRkb3duIHNvIHRoYXQgd2UgY2FuIGhhbmRsZSBhIGZ1bGwgcmVib290LgotICAgICAgICBMZWF2ZVNodXRkb3duKCk7Ci0gICAgICAgIHRyaWdnZXJfc2h1dGRvd24oInJlYm9vdCx1c2Vyc3BhY2VfZmFpbGVkLHNodXRkb3duX2Fib3J0ZWQsIiArIHN1Yl9yZWFzb24pOwotICAgIH0pOwotICAgIC8vIFRyaWdnZXJpbmcgdXNlcnNwYWNlLXJlYm9vdC1yZXF1ZXN0ZWQgd2lsbCByZXN1bHQgaW4gYSBidW5jaCBvZiBzZXRwcm9wCi0gICAgLy8gYWN0aW9ucy4gV2Ugc2hvdWxkIG1ha2Ugc3VyZSwgdGhhdCBhbGwgb2YgdGhlbSBhcmUgcHJvcGFnYXRlZCBiZWZvcmUKLSAgICAvLyBwcm9jZWVkaW5nIHdpdGggdXNlcnNwYWNlIHJlYm9vdC4gU3luY2hyb25vdXNseSBzZXR0aW5nIHN5cy5pbml0LnVzZXJzcGFjZV9yZWJvb3QuaW5fcHJvZ3Jlc3MKLSAgICAvLyBwcm9wZXJ0eSBpcyBub3QgcGVyZmVjdCwgYnV0IGl0IHNob3VsZCBkbyB0aGUgdHJpY2suCi0gICAgaWYgKCFhbmRyb2lkOjpzeXNwcm9wOjpJbml0UHJvcGVydGllczo6dXNlcnNwYWNlX3JlYm9vdF9pbl9wcm9ncmVzcyh0cnVlKSkgewotICAgICAgICBzdWJfcmVhc29uID0gInNldHByb3AiOwotICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiRmFpbGVkIHRvIHNldCBzeXMuaW5pdC51c2Vyc3BhY2VfcmVib290LmluX3Byb2dyZXNzIHByb3BlcnR5IjsKLSAgICB9Ci0gICAgRW50ZXJTaHV0ZG93bigpOwotICAgIGlmICghU2V0UHJvcGVydHkoInN5cy5wb3dlcmN0bCIsICIiKSkgewotICAgICAgICBzdWJfcmVhc29uID0gInJlc2V0cHJvcCI7Ci0gICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJGYWlsZWQgdG8gcmVzZXQgc3lzLnBvd2VyY3RsIHByb3BlcnR5IjsKLSAgICB9Ci0gICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHN0b3BfZmlyc3Q7Ci0gICAgLy8gUmVtZW1iZXIgdGhlIHNlcnZpY2VzIHRoYXQgd2VyZSBlbmFibGVkLiBXZSB3aWxsIG5lZWQgdG8gbWFudWFsbHkgZW5hYmxlIHRoZW0gYWdhaW4gb3RoZXJ3aXNlCi0gICAgLy8gdHJpZ2dlcnMgbGlrZSBjbGFzc19zdGFydCB3b24ndCByZXN0YXJ0IHRoZW0uCi0gICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHdlcmVfZW5hYmxlZDsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIHMgOiBTZXJ2aWNlTGlzdDo6R2V0SW5zdGFuY2UoKS5zZXJ2aWNlc19pbl9zaHV0ZG93bl9vcmRlcigpKSB7Ci0gICAgICAgIGlmIChzLT5pc19wb3N0X2RhdGEoKSAmJiAha0RlYnVnZ2luZ1NlcnZpY2VzLmNvdW50KHMtPm5hbWUoKSkpIHsKLSAgICAgICAgICAgIHN0b3BfZmlyc3QuaW5zZXJ0KHMtPm5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETyhpb2ZmZSk6IHdlIHNob3VsZCBhbHNvIGZpbHRlciBvdXQgdGVtcG9yYXJ5IHNlcnZpY2VzIGhlcmUuCi0gICAgICAgIGlmIChzLT5pc19wb3N0X2RhdGEoKSAmJiBzLT5Jc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgd2VyZV9lbmFibGVkLmluc2VydChzLT5uYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHsKLSAgICAgICAgVGltZXIgc3luY190aW1lcjsKLSAgICAgICAgTE9HKElORk8pIDw8ICJzeW5jKCkgYmVmb3JlIHRlcm1pbmF0aW5nIHNlcnZpY2VzLi4uIjsKLSAgICAgICAgc3luYygpOwotICAgICAgICBMT0coSU5GTykgPDwgInN5bmMoKSB0b29rICIgPDwgc3luY190aW1lcjsKLSAgICB9Ci0gICAgYXV0byBzaWd0ZXJtX3RpbWVvdXQgPSBHZXRNaWxsaXNQcm9wZXJ0eSgiaW5pdC51c2Vyc3BhY2VfcmVib290LnNpZ3Rlcm0udGltZW91dG1pbGxpcyIsIDVzKTsKLSAgICBhdXRvIHNpZ2tpbGxfdGltZW91dCA9IEdldE1pbGxpc1Byb3BlcnR5KCJpbml0LnVzZXJzcGFjZV9yZWJvb3Quc2lna2lsbC50aW1lb3V0bWlsbGlzIiwgMTBzKTsKLSAgICBMT0coSU5GTykgPDwgIlRpbWVvdXQgdG8gdGVybWluYXRlIHNlcnZpY2VzOiAiIDw8IHNpZ3Rlcm1fdGltZW91dC5jb3VudCgpIDw8ICJtcyAiCi0gICAgICAgICAgICAgIDw8ICJUaW1lb3V0IHRvIGtpbGwgc2VydmljZXM6ICIgPDwgc2lna2lsbF90aW1lb3V0LmNvdW50KCkgPDwgIm1zIjsKLSAgICBzdGQ6OnN0cmluZyBzZXJ2aWNlc19maWxlX25hbWUgPSAiL21ldGFkYXRhL3VzZXJzcGFjZXJlYm9vdC9zZXJ2aWNlcy50eHQiOwotICAgIGNvbnN0IGludCBmbGFncyA9IE9fUkRXUiB8IE9fQ1JFQVQgfCBPX1NZTkMgfCBPX0FQUEVORCB8IE9fQ0xPRVhFQzsKLSAgICBTdG9wU2VydmljZXNBbmRMb2dWaW9sYXRpb25zKHN0b3BfZmlyc3QsIHNpZ3Rlcm1fdGltZW91dCwgdHJ1ZSAvKiBTSUdURVJNICovKTsKLSAgICBpZiAoaW50IHIgPSBTdG9wU2VydmljZXNBbmRMb2dWaW9sYXRpb25zKHN0b3BfZmlyc3QsIHNpZ2tpbGxfdGltZW91dCwgZmFsc2UgLyogU0lHS0lMTCAqLyk7Ci0gICAgICAgIHIgPiAwKSB7Ci0gICAgICAgIGF1dG8gZmQgPSB1bmlxdWVfZmQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oc2VydmljZXNfZmlsZV9uYW1lLmNfc3RyKCksIGZsYWdzLCAwNjY2KSkpOwotICAgICAgICBhbmRyb2lkOjpiYXNlOjpXcml0ZVN0cmluZ1RvRmQoIlBvc3QtZGF0YSBzZXJ2aWNlcyBzdGlsbCBydW5uaW5nOiBcbiIsIGZkKTsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzIDogU2VydmljZUxpc3Q6OkdldEluc3RhbmNlKCkpIHsKLSAgICAgICAgICAgIGlmIChzLT5Jc1J1bm5pbmcoKSAmJiBzdG9wX2ZpcnN0LmNvdW50KHMtPm5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpXcml0ZVN0cmluZ1RvRmQocy0+bmFtZSgpICsgIlxuIiwgZmQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHN1Yl9yZWFzb24gPSAic2lna2lsbCI7Ci0gICAgICAgIHJldHVybiBFcnJvcigpIDw8IHIgPDwgIiBwb3N0LWRhdGEgc2VydmljZXMgYXJlIHN0aWxsIHJ1bm5pbmciOwotICAgIH0KLSAgICBpZiAoYXV0byByZXN1bHQgPSBLaWxsWnJhbUJhY2tpbmdEZXZpY2UoKTsgIXJlc3VsdC5vaygpKSB7Ci0gICAgICAgIHN1Yl9yZWFzb24gPSAienJhbSI7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGlmIChhdXRvIHJlc3VsdCA9IENhbGxWZGMoInZvbHVtZSIsICJyZXNldCIpOyAhcmVzdWx0Lm9rKCkpIHsKLSAgICAgICAgc3ViX3JlYXNvbiA9ICJ2b2xkX3Jlc2V0IjsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgY29uc3QgYXV0byYgZGVidWdnaW5nX3NlcnZpY2VzID0gR2V0UG9zdERhdGFEZWJ1Z2dpbmdTZXJ2aWNlcygpOwotICAgIGlmIChpbnQgciA9IFN0b3BTZXJ2aWNlc0FuZExvZ1Zpb2xhdGlvbnMoZGVidWdnaW5nX3NlcnZpY2VzLCBzaWdraWxsX3RpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBTSUdLSUxMICovKTsKLSAgICAgICAgciA+IDApIHsKLSAgICAgICAgYXV0byBmZCA9IHVuaXF1ZV9mZChURU1QX0ZBSUxVUkVfUkVUUlkob3BlbihzZXJ2aWNlc19maWxlX25hbWUuY19zdHIoKSwgZmxhZ3MsIDA2NjYpKSk7Ci0gICAgICAgIGFuZHJvaWQ6OmJhc2U6OldyaXRlU3RyaW5nVG9GZCgiRGVidWdnaW5nIHNlcnZpY2VzIHN0aWxsIHJ1bm5pbmc6IFxuIiwgZmQpOwotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHMgOiBTZXJ2aWNlTGlzdDo6R2V0SW5zdGFuY2UoKSkgewotICAgICAgICAgICAgaWYgKHMtPklzUnVubmluZygpICYmIGRlYnVnZ2luZ19zZXJ2aWNlcy5jb3VudChzLT5uYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6V3JpdGVTdHJpbmdUb0ZkKHMtPm5hbWUoKSArICJcbiIsIGZkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzdWJfcmVhc29uID0gInNpZ2tpbGxfZGVidWciOwotICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCByIDw8ICIgZGVidWdnaW5nIHNlcnZpY2VzIGFyZSBzdGlsbCBydW5uaW5nIjsKLSAgICB9Ci0gICAgewotICAgICAgICBUaW1lciBzeW5jX3RpbWVyOwotICAgICAgICBMT0coSU5GTykgPDwgInN5bmMoKSBhZnRlciBzdG9wcGluZyBzZXJ2aWNlcy4uLiI7Ci0gICAgICAgIHN5bmMoKTsKLSAgICAgICAgTE9HKElORk8pIDw8ICJzeW5jKCkgdG9vayAiIDw8IHN5bmNfdGltZXI7Ci0gICAgfQotICAgIGlmIChhdXRvIHJlc3VsdCA9IFVubW91bnRBbGxBcGV4ZXMoKTsgIXJlc3VsdC5vaygpKSB7Ci0gICAgICAgIHN1Yl9yZWFzb24gPSAiYXBleCI7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGlmICghU3dpdGNoVG9Nb3VudE5hbWVzcGFjZUlmTmVlZGVkKE5TX0JPT1RTVFJBUCkub2soKSkgewotICAgICAgICBzdWJfcmVhc29uID0gIm5zX3N3aXRjaCI7Ci0gICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJGYWlsZWQgdG8gc3dpdGNoIHRvIGJvb3RzdHJhcCBuYW1lc3BhY2UiOwotICAgIH0KLSAgICBBY3Rpb25NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLlJlbW92ZUFjdGlvbklmKFtdKGNvbnN0IGF1dG8mIGFjdGlvbikgLT4gYm9vbCB7Ci0gICAgICAgIGlmIChhY3Rpb24tPklzRnJvbUFwZXgoKSkgewotICAgICAgICAgICAgc3RkOjpzdHJpbmcgdHJpZ2dlcl9uYW1lID0gYWN0aW9uLT5CdWlsZFRyaWdnZXJzU3RyaW5nKCk7Ci0gICAgICAgICAgICBMT0coSU5GTykgPDwgIlJlbW92aW5nIGFjdGlvbiAoIiA8PCB0cmlnZ2VyX25hbWUgPDwgIikgZnJvbSAoIiA8PCBhY3Rpb24tPmZpbGVuYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICA8PCAiOiIgPDwgYWN0aW9uLT5saW5lKCkgPDwgIikiOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0pOwotICAgIC8vIFJlbW92ZSBzZXJ2aWNlcyB0aGF0IHdlcmUgZGVmaW5lZCBpbiBhbiBBUEVYCi0gICAgU2VydmljZUxpc3Q6OkdldEluc3RhbmNlKCkuUmVtb3ZlU2VydmljZUlmKFtdKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTZXJ2aWNlPiYgcykgLT4gYm9vbCB7Ci0gICAgICAgIGlmIChzLT5pc19mcm9tX2FwZXgoKSkgewotICAgICAgICAgICAgTE9HKElORk8pIDw8ICJSZW1vdmluZyBzZXJ2aWNlICciIDw8IHMtPm5hbWUoKSA8PCAiJyBiZWNhdXNlIGl0J3MgZGVmaW5lZCBpbiBhbiBBUEVYIjsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9KTsKLSAgICAvLyBSZS1lbmFibGUgc2VydmljZXMKLSAgICBmb3IgKGNvbnN0IGF1dG8mIHMgOiBTZXJ2aWNlTGlzdDo6R2V0SW5zdGFuY2UoKSkgewotICAgICAgICBpZiAod2VyZV9lbmFibGVkLmNvdW50KHMtPm5hbWUoKSkpIHsKLSAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiUmUtZW5hYmxpbmcgc2VydmljZSAnIiA8PCBzLT5uYW1lKCkgPDwgIiciOwotICAgICAgICAgICAgcy0+RW5hYmxlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgU2VydmljZUxpc3Q6OkdldEluc3RhbmNlKCkuUmVzZXRTdGF0ZSgpOwotICAgIExlYXZlU2h1dGRvd24oKTsKLSAgICBBY3Rpb25NYW5hZ2VyOjpHZXRJbnN0YW5jZSgpLlF1ZXVlRXZlbnRUcmlnZ2VyKCJ1c2Vyc3BhY2UtcmVib290LXJlc3VtZSIpOwotICAgIGd1YXJkLkRpc2FibGUoKTsgIC8vIEdvIG9uIHdpdGggdXNlcnNwYWNlIHJlYm9vdC4KLSAgICByZXR1cm4ge307Ci19Ci0KLXN0YXRpYyB2b2lkIFVzZXJzcGFjZVJlYm9vdFdhdGNoZG9nVGhyZWFkKCkgewotICAgIGF1dG8gc3RhcnRlZF90aW1lb3V0ID0gR2V0TWlsbGlzUHJvcGVydHkoImluaXQudXNlcnNwYWNlX3JlYm9vdC5zdGFydGVkLnRpbWVvdXRtaWxsaXMiLCAxMHMpOwotICAgIGlmICghV2FpdEZvclByb3BlcnR5KCJzeXMuaW5pdC51c2Vyc3BhY2VfcmVib290LmluX3Byb2dyZXNzIiwgIjEiLCBzdGFydGVkX3RpbWVvdXQpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIlVzZXJzcGFjZSByZWJvb3QgZGlkbid0IHN0YXJ0IGluICIgPDwgc3RhcnRlZF90aW1lb3V0LmNvdW50KCkKLSAgICAgICAgICAgICAgICAgICA8PCAibXMuIFN3aXRjaGluZyB0byBmdWxsIHJlYm9vdCI7Ci0gICAgICAgIC8vIEluaXQgbWlnaHQgYmUgd2VkZ2VkLCBkb24ndCB0cnkgdG8gd3JpdGUgcmVib290IHJlYXNvbiBpbnRvIGEgcGVyc2lzdGVudCBwcm9wZXJ0eSBhbmQgZG8KLSAgICAgICAgLy8gYSBkaXJ0eSByZWJvb3QuCi0gICAgICAgIFBlcnNpc3RSZWJvb3RSZWFzb24oInVzZXJzcGFjZV9mYWlsZWQsd2F0Y2hkb2dfdHJpZ2dlcmVkLGZhaWxlZF90b19zdGFydCIsIGZhbHNlKTsKLSAgICAgICAgUmVib290U3lzdGVtKEFORFJPSURfUkJfUkVTVEFSVDIsICJ1c2Vyc3BhY2VfZmFpbGVkLHdhdGNoZG9nX3RyaWdnZXJlZCxmYWlsZWRfdG9fc3RhcnQiKTsKLSAgICB9Ci0gICAgTE9HKElORk8pIDw8ICJTdGFydGluZyB1c2Vyc3BhY2UgcmVib290IHdhdGNoZG9nIjsKLSAgICBhdXRvIHdhdGNoZG9nX3RpbWVvdXQgPSBHZXRNaWxsaXNQcm9wZXJ0eSgiaW5pdC51c2Vyc3BhY2VfcmVib290LndhdGNoZG9nLnRpbWVvdXRtaWxsaXMiLCA1bWluKTsKLSAgICBMT0coSU5GTykgPDwgIlVzZXJzcGFjZVJlYm9vdFdhdGNoZG9nIHRpbWVvdXQ6ICIgPDwgd2F0Y2hkb2dfdGltZW91dC5jb3VudCgpIDw8ICJtcyI7Ci0gICAgaWYgKCFXYWl0Rm9yUHJvcGVydHkoInN5cy5ib290X2NvbXBsZXRlZCIsICIxIiwgd2F0Y2hkb2dfdGltZW91dCkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGJvb3QgaW4gIiA8PCB3YXRjaGRvZ190aW1lb3V0LmNvdW50KCkKLSAgICAgICAgICAgICAgICAgICA8PCAibXMuIFN3aXRjaGluZyB0byBmdWxsIHJlYm9vdCI7Ci0gICAgICAgIC8vIEluIHRoaXMgY2FzZSBkZXZpY2UgaXMgaW4gYSBib290IGxvb3AuIE9ubHkgd2F5IHRvIHJlY292ZXIgaXMgdG8gZG8gZGlydHkgcmVib290LgotICAgICAgICAvLyBTaW5jZSBpbml0IG1pZ2h0IGJlIHdlZGdlZCwgZG9uJ3QgdHJ5IHRvIHdyaXRlIHJlYm9vdCByZWFzb24gaW50byBhIHBlcnNpc3RlbnQgcHJvcGVydHkuCi0gICAgICAgIFBlcnNpc3RSZWJvb3RSZWFzb24oInVzZXJzcGFjZV9mYWlsZWQsd2F0Y2hkb2dfdHJpZ2dlcmVkLGZhaWxlZF90b19ib290IiwgZmFsc2UpOwotICAgICAgICBSZWJvb3RTeXN0ZW0oQU5EUk9JRF9SQl9SRVNUQVJUMiwgInVzZXJzcGFjZV9mYWlsZWQsd2F0Y2hkb2dfdHJpZ2dlcmVkLGZhaWxlZF90b19ib290Iik7Ci0gICAgfQotICAgIExPRyhJTkZPKSA8PCAiRGV2aWNlIGJvb3RlZCwgc3RvcHBpbmcgdXNlcnNwYWNlIHJlYm9vdCB3YXRjaGRvZyI7Ci19Ci0KLXN0YXRpYyB2b2lkIEhhbmRsZVVzZXJzcGFjZVJlYm9vdCgpIHsKLSAgICBpZiAoIWFuZHJvaWQ6OnN5c3Byb3A6OkluaXRQcm9wZXJ0aWVzOjppc191c2Vyc3BhY2VfcmVib290X3N1cHBvcnRlZCgpLnZhbHVlX29yKGZhbHNlKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJBdHRlbXB0ZWQgYSB1c2Vyc3BhY2UgcmVib290IG9uIGEgZGV2aWNlIHRoYXQgZG9lc24ndCBzdXBwb3J0IGl0IjsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvLyBTcGlubmlnIHVwIGEgc2VwYXJhdGUgdGhyZWFkIHdpbGwgZmFpbCB0aGUgc2V0bnMgY2FsbCBsYXRlciBpbiB0aGUgYm9vdCBzZXF1ZW5jZS4KLSAgICAvLyBGb3JrIGEgbmV3IHByb2Nlc3MgdG8gbW9uaXRvciB1c2Vyc3BhY2UgcmVib290IHdoaWxlIHdlIGFyZSBpbnZlc3RpZ2F0aW5nIGEgYmV0dGVyIHNvbHV0aW9uLgotICAgIHBpZF90IHBpZCA9IGZvcmsoKTsKLSAgICBpZiAocGlkIDwgMCkgewotICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGZvcmsgcHJvY2VzcyBmb3IgdXNlcnNwYWNlIHJlYm9vdCB3YXRjaGRvZy4gU3dpdGNoaW5nIHRvIGZ1bGwgIgotICAgICAgICAgICAgICAgICAgICA8PCAicmVib290IjsKLSAgICAgICAgdHJpZ2dlcl9zaHV0ZG93bigicmVib290LHVzZXJzcGFjZV9mYWlsZWQsd2F0Y2hkb2dfZm9yayIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChwaWQgPT0gMCkgewotICAgICAgICAvLyBDaGlsZAotICAgICAgICBVc2Vyc3BhY2VSZWJvb3RXYXRjaGRvZ1RocmVhZCgpOwotICAgICAgICBfZXhpdChFWElUX1NVQ0NFU1MpOwotICAgIH0KLSAgICBMT0coSU5GTykgPDwgIkNsZWFyaW5nIHF1ZXVlIGFuZCBzdGFydGluZyB1c2Vyc3BhY2UtcmVib290LXJlcXVlc3RlZCB0cmlnZ2VyIjsKLSAgICBhdXRvJiBhbSA9IEFjdGlvbk1hbmFnZXI6OkdldEluc3RhbmNlKCk7Ci0gICAgYW0uQ2xlYXJRdWV1ZSgpOwotICAgIGFtLlF1ZXVlRXZlbnRUcmlnZ2VyKCJ1c2Vyc3BhY2UtcmVib290LXJlcXVlc3RlZCIpOwotICAgIGF1dG8gaGFuZGxlciA9IFtdKGNvbnN0IEJ1aWx0aW5Bcmd1bWVudHMmKSB7IHJldHVybiBEb1VzZXJzcGFjZVJlYm9vdCgpOyB9OwotICAgIGFtLlF1ZXVlQnVpbHRpbkFjdGlvbihoYW5kbGVyLCAidXNlcnNwYWNlLXJlYm9vdCIpOwotfQotCiAvKioKICAqIENoZWNrIGlmICJjb21tYW5kIiBmaWVsZCBpcyBzZXQgaW4gYm9vdGxvYWRlciBtZXNzYWdlLgogICoKQEAgLTEwMzAsNyArODI5LDYgQEAKICAgICBzdGQ6OnN0cmluZyByZWJvb3RfdGFyZ2V0ID0gIiI7CiAgICAgYm9vbCBydW5fZnNjayA9IGZhbHNlOwogICAgIGJvb2wgY29tbWFuZF9pbnZhbGlkID0gZmFsc2U7Ci0gICAgYm9vbCB1c2Vyc3BhY2VfcmVib290ID0gZmFsc2U7CiAKICAgICBpZiAoY21kX3BhcmFtc1swXSA9PSAic2h1dGRvd24iKSB7CiAgICAgICAgIGNtZCA9IEFORFJPSURfUkJfUE9XRVJPRkY7CkBAIC0xMDUxLDggKzg0OSw4IEBACiAgICAgICAgIGlmIChjbWRfcGFyYW1zLnNpemUoKSA+PSAyKSB7CiAgICAgICAgICAgICByZWJvb3RfdGFyZ2V0ID0gY21kX3BhcmFtc1sxXTsKICAgICAgICAgICAgIGlmIChyZWJvb3RfdGFyZ2V0ID09ICJ1c2Vyc3BhY2UiKSB7Ci0gICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJVc2Vyc3BhY2UgcmVib290IHJlcXVlc3RlZCI7Ci0gICAgICAgICAgICAgICAgdXNlcnNwYWNlX3JlYm9vdCA9IHRydWU7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVXNlcnNwYWNlIHJlYm9vdCBpcyBkZXByZWNhdGVkLiI7CisgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gYWRiIHJlYm9vdCBmYXN0Ym9vdCBzaG91bGQgYm9vdCBpbnRvIGJvb3Rsb2FkZXIgZm9yIGRldmljZXMgbm90CiAgICAgICAgICAgICAvLyBzdXBwb3J0aW5nIGxvZ2ljYWwgcGFydGl0aW9ucy4KQEAgLTEwODMsNyArODgxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAocmVib290X3RhcmdldCA9PSAicXVpZXNjZW50IikgeworICAgICAgICAgICAgfSBlbHNlIGlmIChzdGQ6OmZpbmQoY21kX3BhcmFtcy5iZWdpbigpLCBjbWRfcGFyYW1zLmVuZCgpLCAicXVpZXNjZW50IikKKyAgICAgICAgICAgICAgICAgICAgIT0gY21kX3BhcmFtcy5lbmQoKSkgeyAvLyBRdWllc2NlbnQgY2FuIGJlIGVpdGhlciBzdWJyZWFzb24gb3IgZGV0YWlscy4KICAgICAgICAgICAgICAgICBib290bG9hZGVyX21lc3NhZ2UgYm9vdCA9IHt9OwogICAgICAgICAgICAgICAgIGlmIChzdGQ6OnN0cmluZyBlcnI7ICFyZWFkX2Jvb3Rsb2FkZXJfbWVzc2FnZSgmYm9vdCwgJmVycikpIHsKICAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlYWQgYm9vdGxvYWRlciBtZXNzYWdlOiAiIDw8IGVycjsKQEAgLTExMjksMTEgKzkyOCw2IEBACiAgICAgLy8gbWVzc2FnZXMsIGV0YykgZnJvbSBwcm9wZXJ0aWVzIGR1cmluZyByZWJvb3QuCiAgICAgU3RvcFNlbmRpbmdNZXNzYWdlcygpOwogCi0gICAgaWYgKHVzZXJzcGFjZV9yZWJvb3QpIHsKLSAgICAgICAgSGFuZGxlVXNlcnNwYWNlUmVib290KCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KICAgICBMT0coSU5GTykgPDwgIkNsZWFyIGFjdGlvbiBxdWV1ZSBhbmQgc3RhcnQgc2h1dGRvd24gdHJpZ2dlciI7CiAgICAgQWN0aW9uTWFuYWdlcjo6R2V0SW5zdGFuY2UoKS5DbGVhclF1ZXVlKCk7CiAgICAgLy8gUXVldWUgc2h1dGRvd24gdHJpZ2dlciBmaXJzdApkaWZmIC0tZ2l0IGEvaW5pdC9yZWJvb3RfdGVzdC5jcHAgYi9pbml0L3JlYm9vdF90ZXN0LmNwcAppbmRleCBiM2QwMzhkLi5iN2ExY2ZkIDEwMDY0NAotLS0gYS9pbml0L3JlYm9vdF90ZXN0LmNwcAorKysgYi9pbml0L3JlYm9vdF90ZXN0LmNwcApAQCAtMTAzLDggKzEwMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJHNlbGFiZWwiLCBHZXRTZWN1cml0eUNvbnRleHQoKSwgZmFsc2UpOwogICAgIFNlcnZpY2VMaXN0JiBzZXJ2aWNlX2xpc3QgPSBTZXJ2aWNlTGlzdDo6R2V0SW5zdGFuY2UoKTsKICAgICBQYXJzZXIgcGFyc2VyOwotICAgIHBhcnNlci5BZGRTZWN0aW9uUGFyc2VyKCJzZXJ2aWNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPFNlcnZpY2VQYXJzZXI+KCZzZXJ2aWNlX2xpc3QsIG51bGxwdHIsIHN0ZDo6bnVsbG9wdCkpOworICAgIHBhcnNlci5BZGRTZWN0aW9uUGFyc2VyKCJzZXJ2aWNlIiwgc3RkOjptYWtlX3VuaXF1ZTxTZXJ2aWNlUGFyc2VyPigmc2VydmljZV9saXN0LCBudWxscHRyKSk7CiAKICAgICBUZW1wb3JhcnlGaWxlIHRmOwogICAgIEFTU0VSVF9UUlVFKHRmLmZkICE9IC0xKTsKZGlmZiAtLWdpdCBhL2luaXQvcmVib290X3V0aWxzLmNwcCBiL2luaXQvcmVib290X3V0aWxzLmNwcAppbmRleCBlNmI4NjhlLi41NDdiMTg2IDEwMDY0NAotLS0gYS9pbml0L3JlYm9vdF91dGlscy5jcHAKKysrIGIvaW5pdC9yZWJvb3RfdXRpbHMuY3BwCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgogI2luY2x1ZGUgPGN1dGlscy9hbmRyb2lkX3JlYm9vdC5oPgorI2luY2x1ZGUgPGZzX21nci5oPgogI2luY2x1ZGUgPHVud2luZHN0YWNrL0FuZHJvaWRVbndpbmRlci5oPgogCiAjaW5jbHVkZSAiY2FwYWJpbGl0aWVzLmgiCkBAIC00OCwxMyArNDksOSBAQAogCiAgICAgY29uc3Qgc3RkOjpzdHJpbmcga0luaXRGYXRhbFBhbmljUGFyYW1TdHJpbmcgPSAiYW5kcm9pZGJvb3QuaW5pdF9mYXRhbF9wYW5pYyI7CiAgICAgaWYgKGNtZGxpbmUuZmluZChrSW5pdEZhdGFsUGFuaWNQYXJhbVN0cmluZykgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgaW5pdF9mYXRhbF9wYW5pYyA9IGZhbHNlOwotICAgICAgICBJbXBvcnRCb290Y29uZmlnKAotICAgICAgICAgICAgICAgIFtrSW5pdEZhdGFsUGFuaWNQYXJhbVN0cmluZ10oY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT0ga0luaXRGYXRhbFBhbmljUGFyYW1TdHJpbmcgJiYgdmFsdWUgPT0gInRydWUiKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbml0X2ZhdGFsX3BhbmljID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOworICAgICAgICBzdGQ6OnN0cmluZyB2YWx1ZTsKKyAgICAgICAgaW5pdF9mYXRhbF9wYW5pYyA9IChhbmRyb2lkOjpmc19tZ3I6OkdldEJvb3Rjb25maWcoa0luaXRGYXRhbFBhbmljUGFyYW1TdHJpbmcsICZ2YWx1ZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9PSAidHJ1ZSIpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGtJbml0RmF0YWxQYW5pY1N0cmluZyA9IGtJbml0RmF0YWxQYW5pY1BhcmFtU3RyaW5nICsgIj10cnVlIjsKICAgICAgICAgaW5pdF9mYXRhbF9wYW5pYyA9IGNtZGxpbmUuZmluZChrSW5pdEZhdGFsUGFuaWNTdHJpbmcpICE9IHN0ZDo6c3RyaW5nOjpucG9zOwpAQCAtNjgsMTEgKzY1LDcgQEAKICAgICBjb25zdCBzdGQ6OnN0cmluZyBrUmVib290VGFyZ2V0U3RyaW5nID0gImFuZHJvaWRib290LmluaXRfZmF0YWxfcmVib290X3RhcmdldCI7CiAgICAgYXV0byBzdGFydF9wb3MgPSBjbWRsaW5lLmZpbmQoa1JlYm9vdFRhcmdldFN0cmluZyk7CiAgICAgaWYgKHN0YXJ0X3BvcyA9PSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgICBJbXBvcnRCb290Y29uZmlnKFtrUmVib290VGFyZ2V0U3RyaW5nXShjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChrZXkgPT0ga1JlYm9vdFRhcmdldFN0cmluZykgewotICAgICAgICAgICAgICAgIGluaXRfZmF0YWxfcmVib290X3RhcmdldCA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKKyAgICAgICAgYW5kcm9pZDo6ZnNfbWdyOjpHZXRCb290Y29uZmlnKGtSZWJvb3RUYXJnZXRTdHJpbmcsICZpbml0X2ZhdGFsX3JlYm9vdF90YXJnZXQpOwogICAgICAgICAvLyBXZSBhbHJlYWR5IGRlZmF1bHQgdG8gYm9vdGxvYWRlciBpZiBubyBzZXR0aW5nIGlzIHByb3ZpZGVkLgogICAgIH0gZWxzZSB7CiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGtSZWJvb3RUYXJnZXRTdHJpbmdQYXR0ZXJuID0ga1JlYm9vdFRhcmdldFN0cmluZyArICI9IjsKZGlmZiAtLWdpdCBhL2luaXQvcmxpbWl0X3BhcnNlci5jcHAgYi9pbml0L3JsaW1pdF9wYXJzZXIuY3BwCmluZGV4IDQ3NmE0NmEuLmMyYTNmYTEgMTAwNjQ0Ci0tLSBhL2luaXQvcmxpbWl0X3BhcnNlci5jcHAKKysrIGIvaW5pdC9ybGltaXRfcGFyc2VyLmNwcApAQCAtMzAsMTAgKzMwLDE0IEBACiAvLyBCdWlsdGlucyBhbmQgc2VydmljZSBkZWZpbml0aW9ucyBib3RoIGhhdmUgdGhlaXIgYXJndW1lbnRzIHN0YXJ0IGF0IDEgYW5kIGZpbmlzaCBhdCAzLgogUmVzdWx0PHN0ZDo6cGFpcjxpbnQsIHJsaW1pdD4+IFBhcnNlUmxpbWl0KGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncykgewogICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgY2hhciosIGludD4+IHRleHRfdG9fcmVzb3VyY2VzID0gewotICAgICAgICB7ImNwdSIsIDB9LCAgICAgICB7ImZzaXplIiwgMX0sIHsiZGF0YSIsIDJ9LCAgICB7InN0YWNrIiwgM30sCi0gICAgICAgIHsiY29yZSIsIDR9LCAgICAgIHsicnNzIiwgNX0sICAgeyJucHJvYyIsIDZ9LCAgIHsibm9maWxlIiwgN30sCi0gICAgICAgIHsibWVtbG9jayIsIDh9LCAgIHsiYXMiLCA5fSwgICAgeyJsb2NrcyIsIDEwfSwgIHsic2lncGVuZGluZyIsIDExfSwKLSAgICAgICAgeyJtc2dxdWV1ZSIsIDEyfSwgeyJuaWNlIiwgMTN9LCB7InJ0cHJpbyIsIDE0fSwgeyJydHRpbWUiLCAxNX0sCisgICAgICAgICAgICB7ImNwdSIsIFJMSU1JVF9DUFV9LCAgICAgICAgICAgeyJmc2l6ZSIsIFJMSU1JVF9GU0laRX0sCisgICAgICAgICAgICB7ImRhdGEiLCBSTElNSVRfREFUQX0sICAgICAgICAgeyJzdGFjayIsIFJMSU1JVF9TVEFDS30sCisgICAgICAgICAgICB7ImNvcmUiLCBSTElNSVRfQ09SRX0sICAgICAgICAgeyJyc3MiLCBSTElNSVRfUlNTfSwKKyAgICAgICAgICAgIHsibnByb2MiLCBSTElNSVRfTlBST0N9LCAgICAgICB7Im5vZmlsZSIsIFJMSU1JVF9OT0ZJTEV9LAorICAgICAgICAgICAgeyJtZW1sb2NrIiwgUkxJTUlUX01FTUxPQ0t9LCAgIHsiYXMiLCBSTElNSVRfQVN9LAorICAgICAgICAgICAgeyJsb2NrcyIsIFJMSU1JVF9MT0NLU30sICAgICAgIHsic2lncGVuZGluZyIsIFJMSU1JVF9TSUdQRU5ESU5HfSwKKyAgICAgICAgICAgIHsibXNncXVldWUiLCBSTElNSVRfTVNHUVVFVUV9LCB7Im5pY2UiLCBSTElNSVRfTklDRX0sCisgICAgICAgICAgICB7InJ0cHJpbyIsIFJMSU1JVF9SVFBSSU99LCAgICAgeyJydHRpbWUiLCBSTElNSVRfUlRUSU1FfSwKICAgICB9OwogCiAgICAgaW50IHJlc291cmNlOwpAQCAtNDksNiArNTMsOCBAQAogICAgICAgICBzdGQ6OnN0cmluZyByZXNvdXJjZV9zdHJpbmc7CiAgICAgICAgIGlmIChTdGFydHNXaXRoKGFyZ3NbMV0sICJSTElNXyIpKSB7CiAgICAgICAgICAgICByZXNvdXJjZV9zdHJpbmcgPSBhcmdzWzFdLnN1YnN0cig1KTsKKyAgICAgICAgfSBlbHNlIGlmIChTdGFydHNXaXRoKGFyZ3NbMV0sICJSTElNSVRfIikpIHsKKyAgICAgICAgICAgIHJlc291cmNlX3N0cmluZyA9IGFyZ3NbMV0uc3Vic3RyKDcpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmVzb3VyY2Vfc3RyaW5nID0gYXJnc1sxXTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvaW5pdC9ybGltaXRfcGFyc2VyX3Rlc3QuY3BwIGIvaW5pdC9ybGltaXRfcGFyc2VyX3Rlc3QuY3BwCmluZGV4IDNjM2Y4NDguLmE2OTU1ZjYgMTAwNjQ0Ci0tLSBhL2luaXQvcmxpbWl0X3BhcnNlcl90ZXN0LmNwcAorKysgYi9pbml0L3JsaW1pdF9wYXJzZXJfdGVzdC5jcHAKQEAgLTY3LDYgKzY3LDcgQEAKICAgICAgICAgICAgICAgICAgICAge3sicnRwcmlvIiwgIjEwIiwgIjEwIn0sIHsxNCwgezEwLCAxMH19fSwKICAgICAgICAgICAgICAgICAgICAge3sicnR0aW1lIiwgIjEwIiwgIjEwIn0sIHsxNSwgezEwLCAxMH19fSwKIAorICAgICAgICAgICAgICAgICAgICAvLyBGb3Igc29tZSByZWFzb24sIHdlIHNwZWxsZWQgdGhlc2Ugd3JvbmcuCiAgICAgICAgICAgICAgICAgICAgIHt7IlJMSU1fQ1BVIiwgIjEwIiwgIjEwIn0sIHswLCB7MTAsIDEwfX19LAogICAgICAgICAgICAgICAgICAgICB7eyJSTElNX0ZTSVpFIiwgIjEwIiwgIjEwIn0sIHsxLCB7MTAsIDEwfX19LAogICAgICAgICAgICAgICAgICAgICB7eyJSTElNX0RBVEEiLCAiMTAiLCAiMTAifSwgezIsIHsxMCwgMTB9fX0sCkBAIC04NCw2ICs4NSwyNCBAQAogICAgICAgICAgICAgICAgICAgICB7eyJSTElNX1JUUFJJTyIsICIxMCIsICIxMCJ9LCB7MTQsIHsxMCwgMTB9fX0sCiAgICAgICAgICAgICAgICAgICAgIHt7IlJMSU1fUlRUSU1FIiwgIjEwIiwgIjEwIn0sIHsxNSwgezEwLCAxMH19fSwKIAorICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBhcmUgdGhlIGNvcnJlY3Qgc3BlbGxpbmdzLgorICAgICAgICAgICAgICAgICAgICB7eyJSTElNSVRfQ1BVIiwgIjEwIiwgIjEwIn0sIHswLCB7MTAsIDEwfX19LAorICAgICAgICAgICAgICAgICAgICB7eyJSTElNSVRfRlNJWkUiLCAiMTAiLCAiMTAifSwgezEsIHsxMCwgMTB9fX0sCisgICAgICAgICAgICAgICAgICAgIHt7IlJMSU1JVF9EQVRBIiwgIjEwIiwgIjEwIn0sIHsyLCB7MTAsIDEwfX19LAorICAgICAgICAgICAgICAgICAgICB7eyJSTElNSVRfU1RBQ0siLCAiMTAiLCAiMTAifSwgezMsIHsxMCwgMTB9fX0sCisgICAgICAgICAgICAgICAgICAgIHt7IlJMSU1JVF9DT1JFIiwgIjEwIiwgIjEwIn0sIHs0LCB7MTAsIDEwfX19LAorICAgICAgICAgICAgICAgICAgICB7eyJSTElNSVRfUlNTIiwgIjEwIiwgIjEwIn0sIHs1LCB7MTAsIDEwfX19LAorICAgICAgICAgICAgICAgICAgICB7eyJSTElNSVRfTlBST0MiLCAiMTAiLCAiMTAifSwgezYsIHsxMCwgMTB9fX0sCisgICAgICAgICAgICAgICAgICAgIHt7IlJMSU1JVF9OT0ZJTEUiLCAiMTAiLCAiMTAifSwgezcsIHsxMCwgMTB9fX0sCisgICAgICAgICAgICAgICAgICAgIHt7IlJMSU1JVF9NRU1MT0NLIiwgIjEwIiwgIjEwIn0sIHs4LCB7MTAsIDEwfX19LAorICAgICAgICAgICAgICAgICAgICB7eyJSTElNSVRfQVMiLCAiMTAiLCAiMTAifSwgezksIHsxMCwgMTB9fX0sCisgICAgICAgICAgICAgICAgICAgIHt7IlJMSU1JVF9MT0NLUyIsICIxMCIsICIxMCJ9LCB7MTAsIHsxMCwgMTB9fX0sCisgICAgICAgICAgICAgICAgICAgIHt7IlJMSU1JVF9TSUdQRU5ESU5HIiwgIjEwIiwgIjEwIn0sIHsxMSwgezEwLCAxMH19fSwKKyAgICAgICAgICAgICAgICAgICAge3siUkxJTUlUX01TR1FVRVVFIiwgIjEwIiwgIjEwIn0sIHsxMiwgezEwLCAxMH19fSwKKyAgICAgICAgICAgICAgICAgICAge3siUkxJTUlUX05JQ0UiLCAiMTAiLCAiMTAifSwgezEzLCB7MTAsIDEwfX19LAorICAgICAgICAgICAgICAgICAgICB7eyJSTElNSVRfUlRQUklPIiwgIjEwIiwgIjEwIn0sIHsxNCwgezEwLCAxMH19fSwKKyAgICAgICAgICAgICAgICAgICAge3siUkxJTUlUX1JUVElNRSIsICIxMCIsICIxMCJ9LCB7MTUsIHsxMCwgMTB9fX0sCisKICAgICAgICAgICAgICAgICAgICAge3siMCIsICIxMCIsICIxMCJ9LCB7MCwgezEwLCAxMH19fSwKICAgICAgICAgICAgICAgICAgICAge3siMSIsICIxMCIsICIxMCJ9LCB7MSwgezEwLCAxMH19fSwKICAgICAgICAgICAgICAgICAgICAge3siMiIsICIxMCIsICIxMCJ9LCB7MiwgezEwLCAxMH19fSwKQEAgLTExMyw2ICsxMzIsNyBAQAogICAgICAgICAgICAge3siMTAwIiwgIjEwIiwgIjEwIn0sICJSZXNvdXJjZSAnMTAwJyBvdmVyIHRoZSBtYXhpbXVtIHJlc291cmNlIHZhbHVlICcxNicifSwKICAgICAgICAgICAgIHt7ImJhZF9zdHJpbmciLCAiMTAiLCAiMTAifSwgIkNvdWxkIG5vdCBwYXJzZSByZXNvdXJjZSAnYmFkX3N0cmluZycifSwKICAgICAgICAgICAgIHt7IlJMSU1fIiwgIjEwIiwgIjEwIn0sICJDb3VsZCBub3QgcGFyc2UgcmVzb3VyY2UgJ1JMSU1fJyJ9LAorICAgICAgICAgICAge3siUkxJTUlUXyIsICIxMCIsICIxMCJ9LCAiQ291bGQgbm90IHBhcnNlIHJlc291cmNlICdSTElNSVRfJyJ9LAogICAgICAgICAgICAge3siY3B1IiwgImFiYyIsICIxMCJ9LCAiQ291bGQgbm90IHBhcnNlIHNvZnQgbGltaXQgJ2FiYycifSwKICAgICAgICAgICAgIHt7ImNwdSIsICIxMCIsICJhYmMifSwgIkNvdWxkIG5vdCBwYXJzZSBoYXJkIGxpbWl0ICdhYmMnIn0sCiAgICAgICAgICAgICB7eyJjcHUiLCAidW5saW1pdCIsICIxMCJ9LCAiQ291bGQgbm90IHBhcnNlIHNvZnQgbGltaXQgJ3VubGltaXQnIn0sCmRpZmYgLS1naXQgYS9pbml0L3NlY3VyaXR5LmNwcCBiL2luaXQvc2VjdXJpdHkuY3BwCmluZGV4IDZlNjE2YmUuLmEwZDYzYmMgMTAwNjQ0Ci0tLSBhL2luaXQvc2VjdXJpdHkuY3BwCisrKyBiL2luaXQvc2VjdXJpdHkuY3BwCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8c2VsaW51eC9zZWxpbnV4Lmg+CiAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiAjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KQEAgLTEwNiwyNyArMTA3LDI2IEBACiAgICAgLy8gdW1sIGRvZXMgbm90IHN1cHBvcnQgbW1hcF9ybmRfYml0cwogICAgIHJldHVybiB7fTsKICNlbGlmIGRlZmluZWQoX19hYXJjaDY0X18pCi0gICAgLy8gYXJtNjQgYXJjaGl0ZWN0dXJlIHN1cHBvcnRzIDE4IC0gMzMgcm5kIGJpdHMgZGVwZW5kaW5nIG9uIHBhZ2VzaXplIGFuZAotICAgIC8vIFZBX1NJWkUuIEhvd2V2ZXIgdGhlIGtlcm5lbCBtaWdodCBoYXZlIGJlZW4gY29tcGlsZWQgd2l0aCBhIG5hcnJvd2VyCi0gICAgLy8gcmFuZ2UgdXNpbmcgQ09ORklHX0FSQ0hfTU1BUF9STkRfQklUU19NSU4vTUFYLiBUbyB1c2UgdGhlIG1heGltdW0KLSAgICAvLyBzdXBwb3J0ZWQgbnVtYmVyIG9mIGJpdHMsIHdlIHN0YXJ0IGZyb20gdGhlIHRoZW9yZXRpY2FsIG1heGltdW0gb2YgMzMKLSAgICAvLyBiaXRzIGFuZCB0cnkgc21hbGxlciB2YWx1ZXMgdW50aWwgd2UgcmVhY2ggMjQgYml0cyB3aGljaCBpcyB0aGUKLSAgICAvLyBBbmRyb2lkLXNwZWNpZmljIG1pbmltdW0uIERvbid0IGdvIGxvd2VyIGV2ZW4gaWYgdGhlIGNvbmZpZ3VyZWQgbWF4aW11bQotICAgIC8vIGlzIHNtYWxsZXIgdGhhbiAyNC4KKyAgICAvLyBhcm02NCBzdXBwb3J0cyAxNCAtIDMzIHJuZCBiaXRzIGRlcGVuZGluZyBvbiBwYWdlIHNpemUgYW5kIEFSTTY0X1ZBX0JJVFMuCisgICAgLy8gVGhlIGtlcm5lbCAoNi41KSBzdGlsbCBkZWZhdWx0cyB0byAzOSB2YSBiaXRzIGZvciA0S2lCIHBhZ2VzLCBzbyBzaGlwcGluZworICAgIC8vIGRldmljZXMgYXJlIG9ubHkgZ2V0dGluZyAyNCBiaXRzIG9mIHJhbmRvbW5lc3MgaW4gcHJhY3RpY2UuCiAgICAgaWYgKFNldE1tYXBSbmRCaXRzTWluKDMzLCAyNCwgZmFsc2UpICYmICghSGFzMzJCaXRBYmkoKSB8fCBTZXRNbWFwUm5kQml0c01pbigxNiwgMTYsIHRydWUpKSkgewogICAgICAgICByZXR1cm4ge307CiAgICAgfQogI2VsaWYgZGVmaW5lZChfX3Jpc2N2KQotICAgIC8vIFRPRE86IHN2NDggYW5kIHN2NTcgd2VyZSBib3RoIGFkZGVkIHRvIHRoZSBrZXJuZWwgdGhpcyB5ZWFyLCBzbyB3ZQotICAgIC8vIHByb2JhYmx5IGp1c3QgbmVlZCBzb21lIGtlcm5lbCBmaXhlcyB0byBlbmFibGUgaGlnaGVyIEFTTFIgcmFuZG9taXphdGlvbiwKLSAgICAvLyBidXQgZm9yIG5vdyAyNCBpcyB0aGUgbWF4aW11bSB0aGF0IHRoZSBrZXJuZWwgc3VwcG9ydHMuCi0gICAgaWYgKFNldE1tYXBSbmRCaXRzTWluKDI0LCAxOCwgZmFsc2UpKSB7CisgICAgLy8gcmlzY3Y2NCBzdXBwb3J0cyAyNCBybmQgYml0cyB3aXRoIFN2MzksIGFuZCBzdGFydGluZyB3aXRoIHRoZSA2Ljkga2VybmVsLAorICAgIC8vIDMzIGJpdHMgd2l0aCBTdjQ4IGFuZCBTdjU3LgorICAgIGlmIChTZXRNbWFwUm5kQml0c01pbigzMywgMjQsIGZhbHNlKSkgewogICAgICAgICByZXR1cm4ge307CiAgICAgfQogI2VsaWYgZGVmaW5lZChfX3g4Nl82NF9fKQogICAgIC8vIHg4Nl82NCBzdXBwb3J0cyAyOCAtIDMyIHJuZCBiaXRzLCBidXQgQW5kcm9pZCB3YW50cyB0byBlbnN1cmUgdGhhdCB0aGUKLSAgICAvLyB0aGVvcmV0aWNhbCBtYXhpbXVtIG9mIDMyIGJpdHMgaXMgYWx3YXlzIHN1cHBvcnRlZCBhbmQgdXNlZC4KLSAgICBpZiAoU2V0TW1hcFJuZEJpdHNNaW4oMzIsIDMyLCBmYWxzZSkgJiYgKCFIYXMzMkJpdEFiaSgpIHx8IFNldE1tYXBSbmRCaXRzTWluKDE2LCAxNiwgdHJ1ZSkpKSB7CisgICAgLy8gdGhlb3JldGljYWwgbWF4aW11bSBvZiAzMiBiaXRzIGlzIGFsd2F5cyBzdXBwb3J0ZWQgYW5kIHVzZWQ7IGV4Y2VwdCBpbgorICAgIC8vIHRoZSBjYXNlIG9mIHRoZSB4ODYgcGFnZSBzaXplIGVtdWxhdG9yIHdoaWNoIHN1cHBvcnRzIGEgbWF4aW11bQorICAgIC8vIG9mIDMwIGJpdHMgZm9yIDE2ayBwYWdlIHNpemUsIG9yIDI4IGJpdHMgZm9yIDY0ayBwYWdlIHNpemUuCisgICAgaW50IG1heF9iaXRzID0gMzIgLSAoc3RhdGljX2Nhc3Q8aW50Pihsb2cyKGdldHBhZ2VzaXplKCkpKSAtIDEyKTsKKyAgICBpZiAoU2V0TW1hcFJuZEJpdHNNaW4obWF4X2JpdHMsIG1heF9iaXRzLCBmYWxzZSkgJiYKKyAgICAgICAgKCFIYXMzMkJpdEFiaSgpIHx8IFNldE1tYXBSbmRCaXRzTWluKDE2LCAxNiwgdHJ1ZSkpKSB7CiAgICAgICAgIHJldHVybiB7fTsKICAgICB9CiAjZWxpZiBkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX19pMzg2X18pCmRpZmYgLS1naXQgYS9pbml0L3NlbGludXguY3BwIGIvaW5pdC9zZWxpbnV4LmNwcAppbmRleCA5MDdlYjgwLi41Y2VkMGI4IDEwMDY0NAotLS0gYS9pbml0L3NlbGludXguY3BwCisrKyBiL2luaXQvc2VsaW51eC5jcHAKQEAgLTI2LDI5ICsyNiwyNiBAQAogLy8gVGhlIG1vbm9saXRoaWMgcG9saWN5IHZhcmlhbnQgaXMgZm9yIGxlZ2FjeSBub24tdHJlYmxlIGRldmljZXMgdGhhdCBjb250YWluIGEgc2luZ2xlIFNFUG9saWN5CiAvLyBmaWxlIGxvY2F0ZWQgYXQgL3NlcG9saWN5IGFuZCBpcyBkaXJlY3RseSBsb2FkZWQgaW50byB0aGUga2VybmVsIFNFTGludXggc3Vic3lzdGVtLgogCi0vLyBUaGUgc3BsaXQgcG9saWN5IGlzIGZvciBzdXBwb3J0aW5nIHRyZWJsZSBkZXZpY2VzIGFuZCB1cGRhdGVhYmxlIGFwZXhlcy4gIEl0IHNwbGl0cyB0aGUgU0VQb2xpY3kKLS8vIGFjcm9zcyBmaWxlcyBvbiAvc3lzdGVtL2V0Yy9zZWxpbnV4ICh0aGUgJ3BsYXQnIHBvcnRpb24gb2YgdGhlIHBvbGljeSksIC92ZW5kb3IvZXRjL3NlbGludXgKLS8vICh0aGUgJ3ZlbmRvcicgcG9ydGlvbiBvZiB0aGUgcG9saWN5KSwgL3N5c3RlbV9leHQvZXRjL3NlbGludXgsIC9wcm9kdWN0L2V0Yy9zZWxpbnV4LAotLy8gL29kbS9ldGMvc2VsaW51eCwgYW5kIC9kZXYvc2VsaW51eCAodGhlIGFwZXggcG9ydGlvbiBvZiBwb2xpY3kpLiAgVGhpcyBpcyBuZWNlc3NhcnkgdG8gYWxsb3cKLS8vIGltYWdlcyB0byBiZSB1cGRhdGVkIGluZGVwZW5kZW50bHkgb2YgdGhlIHZlbmRvciBpbWFnZSwgd2hpbGUgbWFpbnRhaW5pbmcgY29udHJpYnV0aW9ucyBmcm9tCi0vLyBtdWx0aXBsZSBwYXJ0aXRpb25zIGluIHRoZSBTRVBvbGljeS4gIFRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgZm9yIFZUUyB0ZXN0aW5nLCB3aGVyZSB0aGUKLS8vIFNFUG9saWN5IG9uIHRoZSBHb29nbGUgU3lzdGVtIEltYWdlIG1heSBub3QgYmUgaWRlbnRpY2FsIHRvIHRoZSBzeXN0ZW0gaW1hZ2Ugc2hpcHBlZCBvbiBhCi0vLyB2ZW5kb3IncyBkZXZpY2UuCisvLyBUaGUgc3BsaXQgcG9saWN5IGlzIGZvciBzdXBwb3J0aW5nIHRyZWJsZSBkZXZpY2VzLiAgSXQgc3BsaXRzIHRoZSBTRVBvbGljeSBhY3Jvc3MgZmlsZXMgb24KKy8vIC9zeXN0ZW0vZXRjL3NlbGludXggKHRoZSAncGxhdCcgcG9ydGlvbiBvZiB0aGUgcG9saWN5KSBhbmQgL3ZlbmRvci9ldGMvc2VsaW51eCAodGhlICd2ZW5kb3InCisvLyBwb3J0aW9uIG9mIHRoZSBwb2xpY3kpLiAgVGhpcyBpcyBuZWNlc3NhcnkgdG8gYWxsb3cgdGhlIHN5c3RlbSBpbWFnZSB0byBiZSB1cGRhdGVkIGluZGVwZW5kZW50bHkKKy8vIG9mIHRoZSB2ZW5kb3IgaW1hZ2UsIHdoaWxlIG1haW50YWluaW5nIGNvbnRyaWJ1dGlvbnMgZnJvbSBib3RoIHBhcnRpdGlvbnMgaW4gdGhlIFNFUG9saWN5LiAgVGhpcworLy8gaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgZm9yIFZUUyB0ZXN0aW5nLCB3aGVyZSB0aGUgU0VQb2xpY3kgb24gdGhlIEdvb2dsZSBTeXN0ZW0gSW1hZ2UgbWF5IG5vdCBiZQorLy8gaWRlbnRpY2FsIHRvIHRoZSBzeXN0ZW0gaW1hZ2Ugc2hpcHBlZCBvbiBhIHZlbmRvcidzIGRldmljZS4KIAogLy8gVGhlIHNwbGl0IFNFUG9saWN5IGlzIGxvYWRlZCBhcyBkZXNjcmliZWQgYmVsb3c6CiAvLyAxKSBUaGVyZSBpcyBhIHByZWNvbXBpbGVkIFNFUG9saWN5IGxvY2F0ZWQgYXQgZWl0aGVyIC92ZW5kb3IvZXRjL3NlbGludXgvcHJlY29tcGlsZWRfc2Vwb2xpY3kgb3IKIC8vICAgIC9vZG0vZXRjL3NlbGludXgvcHJlY29tcGlsZWRfc2Vwb2xpY3kgaWYgb2RtIHBhcml0aW9uIGlzIHByZXNlbnQuICBTdG9yZWQgYWxvbmcgd2l0aCB0aGlzIGZpbGUKLS8vICAgIGFyZSB0aGUgc2hhMjU2IGhhc2hlcyBvZiB0aGUgcGFydHMgb2YgdGhlIFNFUG9saWN5IG9uIC9zeXN0ZW0sIC9zeXN0ZW1fZXh0LCAvcHJvZHVjdCwgYW5kIGFwZXgKLS8vICAgIHRoYXQgd2VyZSB1c2VkIHRvIGNvbXBpbGUgdGhpcyBwcmVjb21waWxlZCBwb2xpY3kuICBUaGUgc3lzdGVtIHBhcnRpdGlvbiBjb250YWlucyBhIHNpbWlsYXIKLS8vICAgIHNoYTI1NiBvZiB0aGUgcGFydHMgb2YgdGhlIFNFUG9saWN5IHRoYXQgaXQgY3VycmVudGx5IGNvbnRhaW5zLiBTeW1tZXRyaWNhbGx5LCBzeXN0ZW1fZXh0LAotLy8gICAgcHJvZHVjdCwgYW5kIGFwZXggY29udGFpbiBzaGEyNTYgaGFzaGVzIG9mIHRoZWlyIFNFUG9saWN5LiBJbml0IGxvYWRzIHRoaXMKKy8vICAgIGFyZSB0aGUgc2hhMjU2IGhhc2hlcyBvZiB0aGUgcGFydHMgb2YgdGhlIFNFUG9saWN5IG9uIC9zeXN0ZW0sIC9zeXN0ZW1fZXh0IGFuZCAvcHJvZHVjdCB0aGF0CisvLyAgICB3ZXJlIHVzZWQgdG8gY29tcGlsZSB0aGlzIHByZWNvbXBpbGVkIHBvbGljeS4gIFRoZSBzeXN0ZW0gcGFydGl0aW9uIGNvbnRhaW5zIGEgc2ltaWxhciBzaGEyNTYKKy8vICAgIG9mIHRoZSBwYXJ0cyBvZiB0aGUgU0VQb2xpY3kgdGhhdCBpdCBjdXJyZW50bHkgY29udGFpbnMuICBTeW1tZXRyaWNhbGx5LCBzeXN0ZW1fZXh0IGFuZAorLy8gICAgcHJvZHVjdCBwYXJpdGl0aW9uIGNvbnRhaW4gc2hhMjU2IGhhc2hlcyBvZiB0aGVpciBTRVBvbGljeS4gIFRoZSBpbml0IGxvYWRzIHRoaXMKIC8vICAgIHByZWNvbXBpbGVkX3NlcG9saWN5IGRpcmVjdGx5IGlmIGFuZCBvbmx5IGlmIHRoZSBoYXNoZXMgYWxvbmcgd2l0aCB0aGUgcHJlY29tcGlsZWQgU0VQb2xpY3kgb24KLS8vICAgIC92ZW5kb3Igb3IgL29kbSBtYXRjaCB0aGUgaGFzaGVzIGZvciBzeXN0ZW0sIHN5c3RlbV9leHQsIHByb2R1Y3QsIGFuZCBhcGV4IFNFUG9saWN5LAotLy8gICAgcmVzcGVjdGl2ZWx5LgotLy8gMikgSWYgdGhlc2UgaGFzaGVzIGRvIG5vdCBtYXRjaCwgdGhlbiBlaXRoZXIgL3N5c3RlbSBvciAvc3lzdGVtX2V4dCAvcHJvZHVjdCwgb3IgYXBleCAob3Igc29tZSBvZgotLy8gICAgdGhlbSkgaGF2ZSBiZWVuIHVwZGF0ZWQgb3V0IG9mIHN5bmMgd2l0aCAvdmVuZG9yIChvciAvb2RtIGlmIGl0IGlzIHByZXNlbnQpIGFuZCB0aGUgaW5pdCBuZWVkcwotLy8gICAgdG8gY29tcGlsZSB0aGUgU0VQb2xpY3kuICAvc3lzdGVtIGNvbnRhaW5zIHRoZSBTRVBvbGljeSBjb21waWxlciwgc2VjaWxjLCBhbmQgaXQgaXMgdXNlZCBieQotLy8gICAgdGhlIE9wZW5TcGxpdFBvbGljeSgpIGZ1bmN0aW9uIGJlbG93IHRvIGNvbXBpbGUgdGhlIFNFUG9saWN5IHRvIGEgdGVtcCBkaXJlY3RvcnkgYW5kIGxvYWQgaXQuCisvLyAgICAvdmVuZG9yIG9yIC9vZG0gbWF0Y2ggdGhlIGhhc2hlcyBmb3Igc3lzdGVtLCBzeXN0ZW1fZXh0IGFuZCBwcm9kdWN0IFNFUG9saWN5LCByZXNwZWN0aXZlbHkuCisvLyAyKSBJZiB0aGVzZSBoYXNoZXMgZG8gbm90IG1hdGNoLCB0aGVuIGVpdGhlciAvc3lzdGVtIG9yIC9zeXN0ZW1fZXh0IG9yIC9wcm9kdWN0IChvciBzb21lIG9mIHRoZW0pCisvLyAgICBoYXZlIGJlZW4gdXBkYXRlZCBvdXQgb2Ygc3luYyB3aXRoIC92ZW5kb3IgKG9yIC9vZG0gaWYgaXQgaXMgcHJlc2VudCkgYW5kIHRoZSBpbml0IG5lZWRzIHRvCisvLyAgICBjb21waWxlIHRoZSBTRVBvbGljeS4gIC9zeXN0ZW0gY29udGFpbnMgdGhlIFNFUG9saWN5IGNvbXBpbGVyLCBzZWNpbGMsIGFuZCBpdCBpcyB1c2VkIGJ5IHRoZQorLy8gICAgT3BlblNwbGl0UG9saWN5KCkgZnVuY3Rpb24gYmVsb3cgdG8gY29tcGlsZSB0aGUgU0VQb2xpY3kgdG8gYSB0ZW1wIGRpcmVjdG9yeSBhbmQgbG9hZCBpdC4KIC8vICAgIFRoYXQgZnVuY3Rpb24gY29udGFpbnMgZXZlbiBtb3JlIGRvY3VtZW50YXRpb24gd2l0aCB0aGUgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiBob3cKIC8vICAgIHRoZSBTRVBvbGljeSBpcyBjb21waWxlZCBpZiBuZWVkZWQuCiAKQEAgLTYxLDI1ICs1OCwyMCBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KIAotI2luY2x1ZGUgPENlcnRVdGlscy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9jaHJvbm9fdXRpbHMuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3BhcnNlaW50Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Jlc3VsdC5oPgotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zY29wZWd1YXJkLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9hdmZfY2NfZmxhZ3MuaD4KICNpbmNsdWRlIDxmc19hdmIvZnNfYXZiLmg+CiAjaW5jbHVkZSA8ZnNfbWdyLmg+Ci0jaW5jbHVkZSA8ZnN2ZXJpdHlfaW5pdC5oPgogI2luY2x1ZGUgPGxpYmdzaS9saWJnc2kuaD4KICNpbmNsdWRlIDxsaWJzbmFwc2hvdC9zbmFwc2hvdC5oPgotI2luY2x1ZGUgPG1pbmlfa2V5Y3RsX3V0aWxzLmg+CiAjaW5jbHVkZSA8c2VsaW51eC9hbmRyb2lkLmg+Ci0jaW5jbHVkZSA8emlwYXJjaGl2ZS96aXBfYXJjaGl2ZS5oPgogCiAjaW5jbHVkZSAiYmxvY2tfZGV2X2luaXRpYWxpemVyLmgiCiAjaW5jbHVkZSAiZGVidWdfcmFtZGlzay5oIgpAQCAtMTAzLDIzICs5NSwxNCBAQAogZW51bSBFbmZvcmNpbmdTdGF0dXMgeyBTRUxJTlVYX1BFUk1JU1NJVkUsIFNFTElOVVhfRU5GT1JDSU5HIH07CiAKIEVuZm9yY2luZ1N0YXR1cyBTdGF0dXNGcm9tUHJvcGVydHkoKSB7Ci0gICAgRW5mb3JjaW5nU3RhdHVzIHN0YXR1cyA9IFNFTElOVVhfRU5GT1JDSU5HOwotCi0gICAgSW1wb3J0S2VybmVsQ21kbGluZShbJl0oY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gICAgICAgIGlmIChrZXkgPT0gImFuZHJvaWRib290LnNlbGludXgiICYmIHZhbHVlID09ICJwZXJtaXNzaXZlIikgewotICAgICAgICAgICAgc3RhdHVzID0gU0VMSU5VWF9QRVJNSVNTSVZFOwotICAgICAgICB9Ci0gICAgfSk7Ci0KLSAgICBpZiAoc3RhdHVzID09IFNFTElOVVhfRU5GT1JDSU5HKSB7Ci0gICAgICAgIEltcG9ydEJvb3Rjb25maWcoWyZdKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICAgICAgICAgICAgaWYgKGtleSA9PSAiYW5kcm9pZGJvb3Quc2VsaW51eCIgJiYgdmFsdWUgPT0gInBlcm1pc3NpdmUiKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gU0VMSU5VWF9QRVJNSVNTSVZFOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKKyAgICBzdGQ6OnN0cmluZyB2YWx1ZTsKKyAgICBpZiAoYW5kcm9pZDo6ZnNfbWdyOjpHZXRLZXJuZWxDbWRsaW5lKCJhbmRyb2lkYm9vdC5zZWxpbnV4IiwgJnZhbHVlKSAmJiB2YWx1ZSA9PSAicGVybWlzc2l2ZSIpIHsKKyAgICAgICAgcmV0dXJuIFNFTElOVVhfUEVSTUlTU0lWRTsKICAgICB9Ci0KLSAgICByZXR1cm4gc3RhdHVzOworICAgIGlmIChhbmRyb2lkOjpmc19tZ3I6OkdldEJvb3Rjb25maWcoImFuZHJvaWRib290LnNlbGludXgiLCAmdmFsdWUpICYmIHZhbHVlID09ICJwZXJtaXNzaXZlIikgeworICAgICAgICByZXR1cm4gU0VMSU5VWF9QRVJNSVNTSVZFOworICAgIH0KKyAgICByZXR1cm4gU0VMSU5VWF9FTkZPUkNJTkc7CiB9CiAKIGJvb2wgSXNFbmZvcmNpbmcoKSB7CkBAIC0xMjksOTcgKzExMiw2IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLS8vIEZvcmtzLCBleGVjdXRlcyB0aGUgcHJvdmlkZWQgcHJvZ3JhbSBpbiB0aGUgY2hpbGQsIGFuZCB3YWl0cyBmb3IgdGhlIGNvbXBsZXRpb24gaW4gdGhlIHBhcmVudC4KLS8vIENoaWxkJ3Mgc3RkZXJyIGlzIGNhcHR1cmVkIGFuZCBsb2dnZWQgdXNpbmcgTE9HKEVSUk9SKS4KLWJvb2wgRm9ya0V4ZWN2ZUFuZFdhaXRGb3JDb21wbGV0aW9uKGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBjaGFyKiBjb25zdCBhcmd2W10pIHsKLSAgICAvLyBDcmVhdGUgYSBwaXBlIHVzZWQgZm9yIHJlZGlyZWN0aW5nIGNoaWxkIHByb2Nlc3MncyBvdXRwdXQuCi0gICAgLy8gKiBwaXBlX2Zkc1swXSBpcyB0aGUgRkQgdGhlIHBhcmVudCB3aWxsIHVzZSBmb3IgcmVhZGluZy4KLSAgICAvLyAqIHBpcGVfZmRzWzFdIGlzIHRoZSBGRCB0aGUgY2hpbGQgd2lsbCB1c2UgZm9yIHdyaXRpbmcuCi0gICAgaW50IHBpcGVfZmRzWzJdOwotICAgIGlmIChwaXBlKHBpcGVfZmRzKSA9PSAtMSkgewotICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBwaXBlIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHBpZF90IGNoaWxkX3BpZCA9IGZvcmsoKTsKLSAgICBpZiAoY2hpbGRfcGlkID09IC0xKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZm9yayBmb3IgIiA8PCBmaWxlbmFtZTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmIChjaGlsZF9waWQgPT0gMCkgewotICAgICAgICAvLyBmb3JrIHN1Y2NlZWRlZCAtLSB0aGlzIGlzIGV4ZWN1dGluZyBpbiB0aGUgY2hpbGQgcHJvY2VzcwotCi0gICAgICAgIC8vIENsb3NlIHRoZSBwaXBlIEZEIG5vdCB1c2VkIGJ5IHRoaXMgcHJvY2VzcwotICAgICAgICBjbG9zZShwaXBlX2Zkc1swXSk7Ci0KLSAgICAgICAgLy8gUmVkaXJlY3Qgc3RkZXJyIHRvIHRoZSBwaXBlIEZEIHByb3ZpZGVkIGJ5IHRoZSBwYXJlbnQKLSAgICAgICAgaWYgKFRFTVBfRkFJTFVSRV9SRVRSWShkdXAyKHBpcGVfZmRzWzFdLCBTVERFUlJfRklMRU5PKSkgPT0gLTEpIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcmVkaXJlY3Qgc3RkZXJyIG9mICIgPDwgZmlsZW5hbWU7Ci0gICAgICAgICAgICBfZXhpdCgxMjcpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGNsb3NlKHBpcGVfZmRzWzFdKTsKLQotICAgICAgICBpZiAoZXhlY3YoZmlsZW5hbWUsIGFyZ3YpID09IC0xKSB7Ci0gICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGV4ZWN2ZSAiIDw8IGZpbGVuYW1lOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIC8vIFVucmVhY2hhYmxlIGJlY2F1c2UgZXhlY3ZlIHdpbGwgaGF2ZSBzdWNjZWVkZWQgYW5kIHJlcGxhY2VkIHRoaXMgY29kZQotICAgICAgICAvLyB3aXRoIGNoaWxkIHByb2Nlc3MncyBjb2RlLgotICAgICAgICBfZXhpdCgxMjcpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gZm9yayBzdWNjZWVkZWQgLS0gdGhpcyBpcyBleGVjdXRpbmcgaW4gdGhlIG9yaWdpbmFsL3BhcmVudCBwcm9jZXNzCi0KLSAgICAgICAgLy8gQ2xvc2UgdGhlIHBpcGUgRkQgbm90IHVzZWQgYnkgdGhpcyBwcm9jZXNzCi0gICAgICAgIGNsb3NlKHBpcGVfZmRzWzFdKTsKLQotICAgICAgICAvLyBMb2cgdGhlIHJlZGlyZWN0ZWQgb3V0cHV0IG9mIHRoZSBjaGlsZCBwcm9jZXNzLgotICAgICAgICAvLyBJdCdzIHVuZm9ydHVuYXRlIHRoYXQgdGhlcmUncyBubyBzdGFuZGFyZCB3YXkgdG8gb2J0YWluIGFuIGlzdHJlYW0gZm9yIGEgZmlsZSBkZXNjcmlwdG9yLgotICAgICAgICAvLyBBcyBhIHJlc3VsdCwgd2UncmUgYnVmZmVyaW5nIGFsbCBvdXRwdXQgYW5kIGxvZ2dpbmcgaXQgaW4gb25lIGdvIGF0IHRoZSBlbmQgb2YgdGhlCi0gICAgICAgIC8vIGludm9jYXRpb24sIGluc3RlYWQgb2YgbG9nZ2luZyBpdCBhcyBpdCBjb21lcyBpbi4KLSAgICAgICAgY29uc3QgaW50IGNoaWxkX291dF9mZCA9IHBpcGVfZmRzWzBdOwotICAgICAgICBzdGQ6OnN0cmluZyBjaGlsZF9vdXRwdXQ7Ci0gICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhZEZkVG9TdHJpbmcoY2hpbGRfb3V0X2ZkLCAmY2hpbGRfb3V0cHV0KSkgewotICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBjYXB0dXJlIGZ1bGwgb3V0cHV0IG9mICIgPDwgZmlsZW5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgY2xvc2UoY2hpbGRfb3V0X2ZkKTsKLSAgICAgICAgaWYgKCFjaGlsZF9vdXRwdXQuZW1wdHkoKSkgewotICAgICAgICAgICAgLy8gTG9nIGNhcHR1cmVkIG91dHB1dCwgbGluZSBieSBsaW5lLCBiZWNhdXNlIExPRyBleHBlY3RzIHRvIGJlIGludm9rZWQgZm9yIGVhY2ggbGluZQotICAgICAgICAgICAgc3RkOjppc3RyaW5nc3RyZWFtIGluKGNoaWxkX291dHB1dCk7Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZyBsaW5lOwotICAgICAgICAgICAgd2hpbGUgKHN0ZDo6Z2V0bGluZShpbiwgbGluZSkpIHsKLSAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8IGZpbGVuYW1lIDw8ICI6ICIgPDwgbGluZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdhaXQgZm9yIGNoaWxkIHRvIHRlcm1pbmF0ZQotICAgICAgICBpbnQgc3RhdHVzOwotICAgICAgICBpZiAoVEVNUF9GQUlMVVJFX1JFVFJZKHdhaXRwaWQoY2hpbGRfcGlkLCAmc3RhdHVzLCAwKSkgIT0gY2hpbGRfcGlkKSB7Ci0gICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHdhaXQgZm9yICIgPDwgZmlsZW5hbWU7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoV0lGRVhJVEVEKHN0YXR1cykpIHsKLSAgICAgICAgICAgIGludCBzdGF0dXNfY29kZSA9IFdFWElUU1RBVFVTKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzX2NvZGUgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8IGZpbGVuYW1lIDw8ICIgZXhpdGVkIHdpdGggc3RhdHVzICIgPDwgc3RhdHVzX2NvZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoV0lGU0lHTkFMRUQoc3RhdHVzKSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCBmaWxlbmFtZSA8PCAiIGtpbGxlZCBieSBzaWduYWwgIiA8PCBXVEVSTVNJRyhzdGF0dXMpOwotICAgICAgICB9IGVsc2UgaWYgKFdJRlNUT1BQRUQoc3RhdHVzKSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCBmaWxlbmFtZSA8PCAiIHN0b3BwZWQgYnkgc2lnbmFsICIgPDwgV1NUT1BTSUcoc3RhdHVzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIndhaXRwaWQgZm9yICIgPDwgZmlsZW5hbWUgPDwgIiByZXR1cm5lZCB1bmV4cGVjdGVkIHN0YXR1czogIiA8PCBzdGF0dXM7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCiBib29sIFJlYWRGaXJzdExpbmUoY29uc3QgY2hhciogZmlsZSwgc3RkOjpzdHJpbmcqIGxpbmUpIHsKICAgICBsaW5lLT5jbGVhcigpOwogCkBAIC0yNTYsNyArMTQ4LDYgQEAKICAgICAgICAgICAgICBwcmVjb21waWxlZF9zZXBvbGljeSArICIuc3lzdGVtX2V4dF9zZXBvbGljeV9hbmRfbWFwcGluZy5zaGEyNTYifSwKICAgICAgICAgICAgIHsiL3Byb2R1Y3QvZXRjL3NlbGludXgvcHJvZHVjdF9zZXBvbGljeV9hbmRfbWFwcGluZy5zaGEyNTYiLAogICAgICAgICAgICAgIHByZWNvbXBpbGVkX3NlcG9saWN5ICsgIi5wcm9kdWN0X3NlcG9saWN5X2FuZF9tYXBwaW5nLnNoYTI1NiJ9LAotICAgICAgICAgICAgeyIvZGV2L3NlbGludXgvYXBleF9zZXBvbGljeS5zaGEyNTYiLCBwcmVjb21waWxlZF9zZXBvbGljeSArICIuYXBleF9zZXBvbGljeS5zaGEyNTYifSwKICAgICB9OwogCiAgICAgZm9yIChjb25zdCBhdXRvJiBbYWN0dWFsX2lkX3BhdGgsIHByZWNvbXBpbGVkX2lkX3BhdGhdIDogc2Vwb2xpY3lfaGFzaGVzKSB7CkBAIC0yOTksNiArMTkwLDIyIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK2ludCBHZXRWZW5kb3JHZW5mc1ZlcnNpb24oKSB7CisgICAgc3RkOjpzdHJpbmcgbGluZTsKKyAgICBpZiAoIVJlYWRGaXJzdExpbmUoIi92ZW5kb3IvZXRjL3NlbGludXgvZ2VuZnNfbGFiZWxzX3ZlcnNpb24udHh0IiwgJmxpbmUpKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcmVhZCAvdmVuZG9yL2V0Yy9zZWxpbnV4L2dlbmZzX2xhYmVsc192ZXJzaW9uLnR4dDsgYXNzdW1pbmcgaXQncyAiCisgICAgICAgICAgICAgICAgICAgICAgICIyMDI0MDQiOworICAgICAgICByZXR1cm4gMjAyNDA0OworICAgIH0KKyAgICBpbnQgdmVyc2lvbjsKKyAgICBpZiAoIVBhcnNlSW50KGxpbmUsICZ2ZXJzaW9uKSkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHBhcnNlIHRoZSBnZW5mcyBsYWJlbHMgdmVyc2lvbiAiIDw8IGxpbmUKKyAgICAgICAgICAgICAgICAgICAgPDwgIjsgYXNzdW1pbmcgaXQncyAyMDI0MDQiOworICAgICAgICByZXR1cm4gMjAyNDA0OworICAgIH0KKyAgICByZXR1cm4gdmVyc2lvbjsKK30KKwogY29uc3RleHByIGNvbnN0IGNoYXIgcGxhdF9wb2xpY3lfY2lsX2ZpbGVbXSA9ICIvc3lzdGVtL2V0Yy9zZWxpbnV4L3BsYXRfc2Vwb2xpY3kuY2lsIjsKIAogYm9vbCBJc1NwbGl0UG9saWN5RGV2aWNlKCkgewpAQCAtMzM1LDcgKzI0Miw3IEBACiAgICAgLy8gKiB2ZW5kb3IgLS0gcG9saWN5IG5lZWRlZCBkdWUgdG8gbG9naWMgY29udGFpbmVkIGluIHRoZSB2ZW5kb3IgaW1hZ2UsCiAgICAgLy8gKiBtYXBwaW5nIC0tIG1hcHBpbmcgcG9saWN5IHdoaWNoIGhlbHBzIHByZXNlcnZlIGZvcndhcmQtY29tcGF0aWJpbGl0eSBvZiBub24tcGxhdGZvcm0gcG9saWN5CiAgICAgLy8gICB3aXRoIG5ld2VyIHZlcnNpb25zIG9mIHBsYXRmb3JtIHBvbGljeS4KLSAgICAvLyAqIChvcHRpb25hbCkgcG9saWN5IG5lZWRlZCBkdWUgdG8gbG9naWMgb24gcHJvZHVjdCwgc3lzdGVtX2V4dCwgb2RtLCBvciBhcGV4LgorICAgIC8vICogKG9wdGlvbmFsKSBwb2xpY3kgbmVlZGVkIGR1ZSB0byBsb2dpYyBvbiBwcm9kdWN0LCBzeXN0ZW1fZXh0LCBvciBvZG0gaW1hZ2VzLgogICAgIC8vIHNlY2lsYyBpcyBpbnZva2VkIHRvIGNvbXBpbGUgdGhlIGFib3ZlIHRocmVlIHBvbGljeSBmaWxlcyBpbnRvIGEgc2luZ2xlIG1vbm9saXRoaWMgcG9saWN5CiAgICAgLy8gZmlsZS4gVGhpcyBmaWxlIGlzIHRoZW4gbG9hZGVkIGludG8gdGhlIGtlcm5lbC4KIApAQCAtNDMxLDE0ICszMzgsMTcgQEAKICAgICBpZiAoYWNjZXNzKG9kbV9wb2xpY3lfY2lsX2ZpbGUuY19zdHIoKSwgRl9PSykgPT0gLTEpIHsKICAgICAgICAgb2RtX3BvbGljeV9jaWxfZmlsZS5jbGVhcigpOwogICAgIH0KLQotICAgIC8vIGFwZXhfc2Vwb2xpY3kuY2lsIGlzIGRlZmF1bHQgYnV0IG9wdGlvbmFsLgotICAgIHN0ZDo6c3RyaW5nIGFwZXhfcG9saWN5X2NpbF9maWxlKCIvZGV2L3NlbGludXgvYXBleF9zZXBvbGljeS5jaWwiKTsKLSAgICBpZiAoYWNjZXNzKGFwZXhfcG9saWN5X2NpbF9maWxlLmNfc3RyKCksIEZfT0spID09IC0xKSB7Ci0gICAgICAgIGFwZXhfcG9saWN5X2NpbF9maWxlLmNsZWFyKCk7Ci0gICAgfQogICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHZlcnNpb25fYXNfc3RyaW5nID0gc3RkOjp0b19zdHJpbmcoU0VQT0xJQ1lfVkVSU0lPTik7CiAKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZ2VuZnNfY2lsX2ZpbGVzOworCisgICAgaW50IHZlbmRvcl9nZW5mc192ZXJzaW9uID0gR2V0VmVuZG9yR2VuZnNWZXJzaW9uKCk7CisgICAgc3RkOjpzdHJpbmcgZ2VuZnNfY2lsX2ZpbGUgPQorICAgICAgICAgICAgc3RkOjpmb3JtYXQoIi9zeXN0ZW0vZXRjL3NlbGludXgvcGxhdF9zZXBvbGljeV9nZW5mc197fS5jaWwiLCB2ZW5kb3JfZ2VuZnNfdmVyc2lvbik7CisgICAgaWYgKGFjY2VzcyhnZW5mc19jaWxfZmlsZS5jX3N0cigpLCBGX09LKSAhPSAwKSB7CisgICAgICAgIGdlbmZzX2NpbF9maWxlLmNsZWFyKCk7CisgICAgfQorCiAgICAgLy8gY2xhbmctZm9ybWF0IG9mZgogICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBjb21waWxlX2FyZ3MgewogICAgICAgICAiL3N5c3RlbS9iaW4vc2VjaWxjIiwKQEAgLTQ3OSw4ICszODksOCBAQAogICAgIGlmICghb2RtX3BvbGljeV9jaWxfZmlsZS5lbXB0eSgpKSB7CiAgICAgICAgIGNvbXBpbGVfYXJncy5wdXNoX2JhY2sob2RtX3BvbGljeV9jaWxfZmlsZS5jX3N0cigpKTsKICAgICB9Ci0gICAgaWYgKCFhcGV4X3BvbGljeV9jaWxfZmlsZS5lbXB0eSgpKSB7Ci0gICAgICAgIGNvbXBpbGVfYXJncy5wdXNoX2JhY2soYXBleF9wb2xpY3lfY2lsX2ZpbGUuY19zdHIoKSk7CisgICAgaWYgKCFnZW5mc19jaWxfZmlsZS5lbXB0eSgpKSB7CisgICAgICAgIGNvbXBpbGVfYXJncy5wdXNoX2JhY2soZ2VuZnNfY2lsX2ZpbGUuY19zdHIoKSk7CiAgICAgfQogICAgIGNvbXBpbGVfYXJncy5wdXNoX2JhY2sobnVsbHB0cik7CiAKQEAgLTQ5OCw3ICs0MDgsNyBAQAogYm9vbCBPcGVuTW9ub2xpdGhpY1BvbGljeShQb2xpY3lGaWxlKiBwb2xpY3lfZmlsZSkgewogICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrU2Vwb2xpY3lGaWxlW10gPSAiL3NlcG9saWN5IjsKIAotICAgIExPRyhWRVJCT1NFKSA8PCAiT3BlbmluZyBTRUxpbnV4IHBvbGljeSBmcm9tIG1vbm9saXRoaWMgZmlsZSI7CisgICAgTE9HKElORk8pIDw8ICJPcGVuaW5nIFNFTGludXggcG9saWN5IGZyb20gbW9ub2xpdGhpYyBmaWxlICIgPDwga1NlcG9saWN5RmlsZTsKICAgICBwb2xpY3lfZmlsZS0+ZmQucmVzZXQob3BlbihrU2Vwb2xpY3lGaWxlLCBPX1JET05MWSB8IE9fQ0xPRVhFQyB8IE9fTk9GT0xMT1cpKTsKICAgICBpZiAocG9saWN5X2ZpbGUtPmZkIDwgMCkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG9wZW4gbW9ub2xpdGhpYyBTRUxpbnV4IHBvbGljeSI7CkBAIC01MDgsMjI4ICs0MTgsNiBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1jb25zdGV4cHIgY29uc3QgY2hhcioga1NpZ25pbmdDZXJ0UmVsZWFzZSA9Ci0gICAgICAgICIvc3lzdGVtL2V0Yy9zZWxpbnV4L2NvbS5hbmRyb2lkLnNlcG9saWN5LmNlcnQtcmVsZWFzZS5kZXIiOwotY29uc3RleHByIGNvbnN0IGNoYXIqIGtGc1Zlcml0eVByb2NQYXRoID0gIi9wcm9jL3N5cy9mcy92ZXJpdHkiOwotY29uc3Qgc3RkOjpzdHJpbmcga1NlcG9saWN5QXBleE1ldGFkYXRhRGlyID0gIi9tZXRhZGF0YS9zZXBvbGljeS8iOwotY29uc3Qgc3RkOjpzdHJpbmcga1NlcG9saWN5QXBleFN5c3RlbURpciA9ICIvc3lzdGVtL2V0Yy9zZWxpbnV4L2FwZXgvIjsKLWNvbnN0IHN0ZDo6c3RyaW5nIGtTZXBvbGljeVppcCA9ICJTRVBvbGljeS56aXAiOwotY29uc3Qgc3RkOjpzdHJpbmcga1NlcG9saWN5U2lnbmF0dXJlID0gIlNFUG9saWN5LnppcC5zaWciOwotCi1jb25zdCBzdGQ6OnN0cmluZyBrVG1wZnNEaXIgPSAiL2Rldi9zZWxpbnV4LyI7Ci0KLS8vIEZpbGVzIHRoYXQgYXJlIGRlbGV0ZWQgYWZ0ZXIgcG9saWN5IGlzIGNvbXBpbGVkL2xvYWRlZC4KLWNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBrQXBleFNlcG9saWN5VG1weyJhcGV4X3NlcG9saWN5LmNpbCIsICJhcGV4X3NlcG9saWN5LnNoYTI1NiJ9OwotLy8gRmlsZXMgdGhhdCBuZWVkIHRvIHBlcnNpc3QgYmVjYXVzZSB0aGV5IGFyZSB1c2VkIGJ5IHVzZXJzcGFjZSBwcm9jZXNzZXMuCi1jb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4ga0FwZXhTZXBvbGljeXsiYXBleF9maWxlX2NvbnRleHRzIiwgImFwZXhfcHJvcGVydHlfY29udGV4dHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFwZXhfc2VydmljZV9jb250ZXh0cyIsICJhcGV4X3NlYXBwX2NvbnRleHRzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcGV4X3Rlc3QifTsKLQotUmVzdWx0PHZvaWQ+IENyZWF0ZVRtcGZzRGlyKCkgewotICAgIG1vZGVfdCBtb2RlID0gMDc0NDsKLSAgICBzdHJ1Y3Qgc3RhdCBzdGF0X2RhdGE7Ci0gICAgaWYgKHN0YXQoa1RtcGZzRGlyLmNfc3RyKCksICZzdGF0X2RhdGEpICE9IDApIHsKLSAgICAgICAgaWYgKGVycm5vICE9IEVOT0VOVCkgewotICAgICAgICAgICAgcmV0dXJuIEVycm5vRXJyb3IoKSA8PCAiQ291bGQgbm90IHN0YXQgIiA8PCBrVG1wZnNEaXI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1rZGlyKGtUbXBmc0Rpci5jX3N0cigpLCBtb2RlKSAhPSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJDb3VsZCBub3QgbWtkaXIgIiA8PCBrVG1wZnNEaXI7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoIVNfSVNESVIoc3RhdF9kYXRhLnN0X21vZGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCBrVG1wZnNEaXIgPDwgIiBleGlzdHMgYW5kIGlzIG5vdCBhIGRpcmVjdG9yeS4iOwotICAgICAgICB9Ci0gICAgICAgIExPRyhXQVJOSU5HKSA8PCAiRGlyZWN0b3J5ICIgPDwga1RtcGZzRGlyIDw8ICIgYWxyZWFkeSBleGlzdHMiOwotICAgIH0KLQotICAgIC8vIE5lZWQgdG8gbWFudWFsbHkgY2FsbCBjaG1vZCBiZWNhdXNlIG1rZGlyIHdpbGwgY3JlYXRlIGEgZm9sZGVyIHdpdGgKLSAgICAvLyBwZXJtaXNzaW9ucyBtb2RlICYgfnVtYXNrLgotICAgIGlmIChjaG1vZChrVG1wZnNEaXIuY19zdHIoKSwgbW9kZSkgIT0gMCkgewotICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJDb3VsZCBub3QgY2htb2QgIiA8PCBrVG1wZnNEaXI7Ci0gICAgfQotCi0gICAgcmV0dXJuIHt9OwotfQotCi1SZXN1bHQ8dm9pZD4gUHV0RmlsZUluVG1wZnMoWmlwQXJjaGl2ZUhhbmRsZSBhcmNoaXZlLCBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIHsKLSAgICBaaXBFbnRyeSBlbnRyeTsKLSAgICBzdGQ6OnN0cmluZyBkc3RQYXRoID0ga1RtcGZzRGlyICsgZmlsZU5hbWU7Ci0KLSAgICBpbnQgcmV0ID0gRmluZEVudHJ5KGFyY2hpdmUsIGZpbGVOYW1lLCAmZW50cnkpOwotICAgIGlmIChyZXQgIT0gMCkgewotICAgICAgICAvLyBBbGwgZmlsZXMgYXJlIG9wdGlvbmFsLiBJZiBhIGZpbGUgZG9lc24ndCBleGlzdCwgcmV0dXJuIHdpdGhvdXQgZXJyb3IuCi0gICAgICAgIHJldHVybiB7fTsKLSAgICB9Ci0KLSAgICB1bmlxdWVfZmQgZmQoVEVNUF9GQUlMVVJFX1JFVFJZKAotICAgICAgICAgICAgb3Blbihkc3RQYXRoLmNfc3RyKCksIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0NMT0VYRUMsIFNfSVJVU1IgfCBTX0lXVVNSKSkpOwotICAgIGlmIChmZCA9PSAtMSkgewotICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJGYWlsZWQgdG8gb3BlbiAiIDw8IGRzdFBhdGg7Ci0gICAgfQotCi0gICAgcmV0ID0gRXh0cmFjdEVudHJ5VG9GaWxlKGFyY2hpdmUsICZlbnRyeSwgZmQuZ2V0KCkpOwotICAgIGlmIChyZXQgIT0gMCkgewotICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiRmFpbGVkIHRvIGV4dHJhY3QgZW50cnkgXCIiIDw8IGZpbGVOYW1lIDw8ICJcIiAoIgotICAgICAgICAgICAgICAgICAgICAgICA8PCBlbnRyeS51bmNvbXByZXNzZWRfbGVuZ3RoIDw8ICIgYnl0ZXMpIHRvIFwiIiA8PCBkc3RQYXRoCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIjogIiA8PCBFcnJvckNvZGVTdHJpbmcocmV0KTsKLSAgICB9Ci0KLSAgICByZXR1cm4ge307Ci19Ci0KLVJlc3VsdDx2b2lkPiBHZXRQb2xpY3lGcm9tQXBleChjb25zdCBzdGQ6OnN0cmluZyYgZGlyKSB7Ci0gICAgTE9HKElORk8pIDw8ICJMb2FkaW5nIEFQRVggU2Vwb2xpY3kgZnJvbSAiIDw8IGRpciArIGtTZXBvbGljeVppcDsKLSAgICB1bmlxdWVfZmQgZmQob3BlbigoZGlyICsga1NlcG9saWN5WmlwKS5jX3N0cigpLCBPX1JET05MWSB8IE9fQklOQVJZIHwgT19DTE9FWEVDKSk7Ci0gICAgaWYgKGZkIDwgMCkgewotICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJGYWlsZWQgdG8gb3BlbiBwYWNrYWdlICIgPDwgZGlyICsga1NlcG9saWN5WmlwOwotICAgIH0KLQotICAgIFppcEFyY2hpdmVIYW5kbGUgaGFuZGxlOwotICAgIGludCByZXQgPSBPcGVuQXJjaGl2ZUZkKGZkLmdldCgpLCAoZGlyICsga1NlcG9saWN5WmlwKS5jX3N0cigpLCAmaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qYXNzdW1lX293bmVyc2hpcD0qL2ZhbHNlKTsKLSAgICBpZiAocmV0IDwgMCkgewotICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiRmFpbGVkIHRvIG9wZW4gcGFja2FnZSAiIDw8IGRpciArIGtTZXBvbGljeVppcCA8PCAiOiAiCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IEVycm9yQ29kZVN0cmluZyhyZXQpOwotICAgIH0KLQotICAgIGF1dG8gaGFuZGxlX2d1YXJkID0gYW5kcm9pZDo6YmFzZTo6bWFrZV9zY29wZV9ndWFyZChbJmhhbmRsZV0geyBDbG9zZUFyY2hpdmUoaGFuZGxlKTsgfSk7Ci0KLSAgICBhdXRvIGNyZWF0ZSA9IENyZWF0ZVRtcGZzRGlyKCk7Ci0gICAgaWYgKCFjcmVhdGUub2soKSkgewotICAgICAgICByZXR1cm4gY3JlYXRlLmVycm9yKCk7Ci0gICAgfQotCi0gICAgZm9yIChjb25zdCBhdXRvJiBmaWxlIDoga0FwZXhTZXBvbGljeSkgewotICAgICAgICBhdXRvIGV4dHJhY3QgPSBQdXRGaWxlSW5UbXBmcyhoYW5kbGUsIGZpbGUpOwotICAgICAgICBpZiAoIWV4dHJhY3Qub2soKSkgewotICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3QuZXJyb3IoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBmb3IgKGNvbnN0IGF1dG8mIGZpbGUgOiBrQXBleFNlcG9saWN5VG1wKSB7Ci0gICAgICAgIGF1dG8gZXh0cmFjdCA9IFB1dEZpbGVJblRtcGZzKGhhbmRsZSwgZmlsZSk7Ci0gICAgICAgIGlmICghZXh0cmFjdC5vaygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXh0cmFjdC5lcnJvcigpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB7fTsKLX0KLQotUmVzdWx0PHZvaWQ+IExvYWRTZXBvbGljeUFwZXhDZXJ0cygpIHsKLSAgICBrZXlfc2VyaWFsX3Qga2V5cmluZ19pZCA9IGFuZHJvaWQ6OkdldEtleXJpbmdJZCgiLmZzLXZlcml0eSIpOwotICAgIGlmIChrZXlyaW5nX2lkIDwgMCkgewotICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiRmFpbGVkIHRvIGZpbmQgLmZzLXZlcml0eSBrZXlyaW5nIGlkIjsKLSAgICB9Ci0KLSAgICAvLyBUT0RPKGIvMTk5OTE0MjI3KSB0aGUgcmVsZWFzZSBrZXkgc2hvdWxkIGFsd2F5cyBleGlzdC4gT25jZSBpdCdzIGNoZWNrZWQgaW4sIHN0YXJ0Ci0gICAgLy8gdGhyb3dpbmcgYW4gZXJyb3IgaGVyZSBpZiBpdCBkb2Vzbid0IGV4aXN0LgotICAgIGlmIChhY2Nlc3Moa1NpZ25pbmdDZXJ0UmVsZWFzZSwgRl9PSykgPT0gMCkgewotICAgICAgICBMb2FkS2V5RnJvbUZpbGUoa2V5cmluZ19pZCwgImZzdl9zZXBvbGljeV9hcGV4X3JlbGVhc2UiLCBrU2lnbmluZ0NlcnRSZWxlYXNlKTsKLSAgICB9Ci0gICAgcmV0dXJuIHt9OwotfQotCi1SZXN1bHQ8dm9pZD4gU2Vwb2xpY3lGc1Zlcml0eUNoZWNrKCkgewotICAgIHJldHVybiBFcnJvcigpIDw8ICJUT0RPIGltcGxlbWVudCBzdXBwb3J0IGZvciBmc3Zlcml0eSBTRVBvbGljeS4iOwotfQotCi1SZXN1bHQ8dm9pZD4gU2Vwb2xpY3lDaGVja1NpZ25hdHVyZShjb25zdCBzdGQ6OnN0cmluZyYgZGlyKSB7Ci0gICAgc3RkOjpzdHJpbmcgc2lnbmF0dXJlOwotICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZyhkaXIgKyBrU2Vwb2xpY3lTaWduYXR1cmUsICZzaWduYXR1cmUpKSB7Ci0gICAgICAgIHJldHVybiBFcnJub0Vycm9yKCkgPDwgIkZhaWxlZCB0byByZWFkICIgPDwga1NlcG9saWN5U2lnbmF0dXJlOwotICAgIH0KLQotICAgIHN0ZDo6ZnN0cmVhbSBzZXBvbGljeVppcChkaXIgKyBrU2Vwb2xpY3laaXAsIHN0ZDo6aW9zOjppbiB8IHN0ZDo6aW9zOjpiaW5hcnkpOwotICAgIGlmICghc2Vwb2xpY3laaXApIHsKLSAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgIkZhaWxlZCB0byBvcGVuICIgPDwga1NlcG9saWN5WmlwOwotICAgIH0KLSAgICBzZXBvbGljeVppcC5zZWVrZygwKTsKLSAgICBzdGQ6OnN0cmluZyBzZXBvbGljeVN0cigoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KHNlcG9saWN5WmlwKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpOwotCi0gICAgYXV0byByZWxlYXNlS2V5ID0gZXh0cmFjdFB1YmxpY0tleUZyb21YNTA5KGtTaWduaW5nQ2VydFJlbGVhc2UpOwotICAgIGlmICghcmVsZWFzZUtleS5vaygpKSB7Ci0gICAgICAgIHJldHVybiByZWxlYXNlS2V5LmVycm9yKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZlcmlmeVNpZ25hdHVyZShzZXBvbGljeVN0ciwgc2lnbmF0dXJlLCAqcmVsZWFzZUtleSk7Ci19Ci0KLVJlc3VsdDx2b2lkPiBTZXBvbGljeVZlcmlmeShjb25zdCBzdGQ6OnN0cmluZyYgZGlyLCBib29sIHN1cHBvcnRzRnNWZXJpdHkpIHsKLSAgICBpZiAoc3VwcG9ydHNGc1Zlcml0eSkgewotICAgICAgICBhdXRvIGZzVmVyaXR5Q2hlY2sgPSBTZXBvbGljeUZzVmVyaXR5Q2hlY2soKTsKLSAgICAgICAgaWYgKGZzVmVyaXR5Q2hlY2sub2soKSkgewotICAgICAgICAgICAgcmV0dXJuIGZzVmVyaXR5Q2hlY2s7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETyhiLzE5OTkxNDIyNykgSWYgdGhlIGRldmljZSBzdXBwb3J0cyBmc3Zlcml0eSwgYnV0IHdlIGZhaWwgaGVyZSwgd2Ugc2hvdWxkIGZhaWwgdG8KLSAgICAgICAgLy8gYm9vdCBhbmQgbm90IGNhcnJ5IG9uLiBGb3Igbm93LCBmYWxsYmFjayB0byBhIHNpZ25hdHVyZSBjaGVja3VudGlsIHRoZSBmc3Zlcml0eQotICAgICAgICAvLyBsb2dpYyBpcyBpbXBsZW1lbnRlZC4KLSAgICAgICAgTE9HKElORk8pIDw8ICJGYWxsaW5nIGJhY2sgdG8gc3RhbmRhcmQgc2lnbmF0dXJlIGNoZWNrLiAiIDw8IGZzVmVyaXR5Q2hlY2suZXJyb3IoKTsKLSAgICB9Ci0KLSAgICBhdXRvIHNlcG9saWN5U2lnbmF0dXJlID0gU2Vwb2xpY3lDaGVja1NpZ25hdHVyZShkaXIpOwotICAgIGlmICghc2Vwb2xpY3lTaWduYXR1cmUub2soKSkgewotICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiQXBleCBTRVBvbGljeSBmYWlsZWQgc2lnbmF0dXJlIGNoZWNrIjsKLSAgICB9Ci0gICAgcmV0dXJuIHt9OwotfQotCi12b2lkIENsZWFudXBBcGV4U2Vwb2xpY3koKSB7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBmaWxlIDoga0FwZXhTZXBvbGljeVRtcCkgewotICAgICAgICBzdGQ6OnN0cmluZyBwYXRoID0ga1RtcGZzRGlyICsgZmlsZTsKLSAgICAgICAgdW5saW5rKHBhdGguY19zdHIoKSk7Ci0gICAgfQotfQotCi0vLyBVcGRhdGFibGUgc2Vwb2xpY3kgaXMgc2hpcHBlZCB3aXRoaW4gYW4gemlwIHdpdGhpbiBhbiBBUEVYLiBCZWNhdXNlCi0vLyBpdCBuZWVkcyB0byBiZSBhdmFpbGFibGUgYmVmb3JlIEFwZXhlcyBhcmUgbW91bnRlZCwgYXBleGQgY29waWVzCi0vLyB0aGUgemlwIGZyb20gdGhlIEFQRVggYW5kIHN0b3JlcyBpdCBpbiAvbWV0YWRhdGEvc2Vwb2xpY3kuIElmIHRoZXJlIGlzCi0vLyBubyB1cGRhdGFibGUgc2Vwb2xpY3kgaW4gL21ldGFkYXRhL3NlcG9saWN5LCB0aGVuIHRoZSB1cGRhdGFibGUgcG9saWN5IGlzCi0vLyBsb2FkZWQgZnJvbSAvc3lzdGVtL2V0Yy9zZWxpbnV4L2FwZXguIEluaXQgcGVyZm9ybXMgdGhlIGZvbGxvd2luZwotLy8gc3RlcHMgb24gYm9vdDoKLS8vCi0vLyAxLiBWYWxpZGF0ZXMgdGhlIHppcCBieSBjaGVja2luZyBpdHMgc2lnbmF0dXJlIGFnYWluc3QgYSBwdWJsaWMga2V5IHRoYXQgaXMKLS8vIHN0b3JlZCBpbiAvc3lzdGVtL2V0Yy9zZWxpbnV4LgotLy8gMi4gRXh0cmFjdHMgZmlsZXMgZnJvbSB6aXAgYW5kIHN0b3JlcyB0aGVtIGluIC9kZXYvc2VsaW51eC4KLS8vIDMuIENoZWNrcyBpZiB0aGUgYXBleF9zZXBvbGljeS5zaGEyNTYgbWF0Y2hlcyB0aGUgc2hhMjU2IG9mIHByZWNvbXBpbGVkX3NlcG9saWN5LgotLy8gaWYgc28sIHRoZSBwcmVjb21waWxlZCBzZXBvbGljeSBpcyB1c2VkLiBPdGhlcndpc2UsIGFuIG9uLWRldmljZSBjb21waWxlIG9mIHRoZSBwb2xpY3kKLS8vIGlzIHVzZWQuIFRoaXMgaXMgdGhlIHNhbWUgZmxvdyBhcyBvbi1kZXZpY2UgY29tcGlsYXRpb24gb2YgcG9saWN5IGZvciBUcmVibGUuCi0vLyA0LiBDbGVhbnMgdXAgZmlsZXMgaW4gL2Rldi9zZWxpbnV4IHdoaWNoIGFyZSBubyBsb25nZXIgbmVlZGVkLgotLy8gNS4gUmVzdG9yZWNvbnMgdGhlIHJlbWFpbmluZyBmaWxlcyBpbiAvZGV2L3NlbGludXguCi0vLyA2LiBTZXRzIHNlbGludXggaW50byBlbmZvcmNpbmcgbW9kZSBhbmQgY29udGludWVzIG5vcm1hbCBib290aW5nLgotLy8KLXZvaWQgUHJlcGFyZUFwZXhTZXBvbGljeSgpIHsKLSAgICBib29sIHN1cHBvcnRzRnNWZXJpdHkgPSBhY2Nlc3Moa0ZzVmVyaXR5UHJvY1BhdGgsIEZfT0spID09IDA7Ci0gICAgaWYgKHN1cHBvcnRzRnNWZXJpdHkpIHsKLSAgICAgICAgYXV0byBsb2FkU2Vwb2xpY3lBcGV4Q2VydHMgPSBMb2FkU2Vwb2xpY3lBcGV4Q2VydHMoKTsKLSAgICAgICAgaWYgKCFsb2FkU2Vwb2xpY3lBcGV4Q2VydHMub2soKSkgewotICAgICAgICAgICAgLy8gVE9ETyhiLzE5OTkxNDIyNykgSWYgdGhlIGRldmljZSBzdXBwb3J0cyBmc3Zlcml0eSwgYnV0IHdlIGZhaWwgaGVyZSwgd2Ugc2hvdWxkIGZhaWwKLSAgICAgICAgICAgIC8vIHRvIGJvb3QgYW5kIG5vdCBjYXJyeSBvbi4gRm9yIG5vdywgZmFsbGJhY2sgdG8gYSBzaWduYXR1cmUgY2hlY2t1bnRpbCB0aGUgZnN2ZXJpdHkKLSAgICAgICAgICAgIC8vIGxvZ2ljIGlzIGltcGxlbWVudGVkLgotICAgICAgICAgICAgTE9HKElORk8pIDw8IGxvYWRTZXBvbGljeUFwZXhDZXJ0cy5lcnJvcigpOwotICAgICAgICB9Ci0gICAgfQotICAgIC8vIElmIGFwZXggc2Vwb2xpY3kgemlwIGV4aXN0cyBpbiAvbWV0YWRhdGEvc2Vwb2xpY3ksIHVzZSB0aGF0LCBvdGhlcndpc2UgdXNlIHZlcnNpb24gb24KLSAgICAvLyAvc3lzdGVtLgotICAgIGF1dG8gZGlyID0gKGFjY2Vzcygoa1NlcG9saWN5QXBleE1ldGFkYXRhRGlyICsga1NlcG9saWN5WmlwKS5jX3N0cigpLCBGX09LKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICA/IGtTZXBvbGljeUFwZXhNZXRhZGF0YURpcgotICAgICAgICAgICAgICAgICAgICAgICA6IGtTZXBvbGljeUFwZXhTeXN0ZW1EaXI7Ci0KLSAgICBhdXRvIHNlcG9saWN5VmVyaWZ5ID0gU2Vwb2xpY3lWZXJpZnkoZGlyLCBzdXBwb3J0c0ZzVmVyaXR5KTsKLSAgICBpZiAoIXNlcG9saWN5VmVyaWZ5Lm9rKCkpIHsKLSAgICAgICAgTE9HKElORk8pIDw8ICJFcnJvcjogIiA8PCBzZXBvbGljeVZlcmlmeS5lcnJvcigpOwotICAgICAgICAvLyBJZiBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGZhaWxzLCBmYWxsIGJhY2sgdG8gdmVyc2lvbiBvbiAvc3lzdGVtLgotICAgICAgICAvLyBUaGlzIGZpbGUgZG9lc24ndCBuZWVkIHRvIGJlIHZlcmlmaWVkIGJlY2F1c2UgaXQgbGl2ZXMgb24gdGhlIHN5c3RlbSBwYXJ0aXRpb24gd2hpY2gKLSAgICAgICAgLy8gaXMgc2lnbmVkIGFuZCBwcm90ZWN0ZWQgYnkgdmVyaWZpZWQgYm9vdC4KLSAgICAgICAgZGlyID0ga1NlcG9saWN5QXBleFN5c3RlbURpcjsKLSAgICB9Ci0KLSAgICBhdXRvIGFwZXggPSBHZXRQb2xpY3lGcm9tQXBleChkaXIpOwotICAgIGlmICghYXBleC5vaygpKSB7Ci0gICAgICAgIC8vIFRPRE8oYi8xOTk5MTQyMjcpIE1ha2UgZmFpbHVyZSBmYXRhbC4gRm9yIG5vdyBjb250aW51ZSBib290aW5nIHdpdGggbm9uLWFwZXggc2Vwb2xpY3kuCi0gICAgICAgIExPRyhFUlJPUikgPDwgYXBleC5lcnJvcigpOwotICAgIH0KLX0KLQogdm9pZCBSZWFkUG9saWN5KHN0ZDo6c3RyaW5nKiBwb2xpY3kpIHsKICAgICBQb2xpY3lGaWxlIHBvbGljeV9maWxlOwogCkBAIC03NTMsMTAgKzQ0MSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKSBmYWlsZWQiOwogICAgICAgICB9CiAgICAgfQotCi0gICAgaWYgKGF1dG8gcmVzdWx0ID0gV3JpdGVGaWxlKCIvc3lzL2ZzL3NlbGludXgvY2hlY2tyZXFwcm90IiwgIjAiKTsgIXJlc3VsdC5vaygpKSB7Ci0gICAgICAgIExPRyhGQVRBTCkgPDwgIlVuYWJsZSB0byB3cml0ZSB0byAvc3lzL2ZzL3NlbGludXgvY2hlY2tyZXFwcm90OiAiIDw8IHJlc3VsdC5lcnJvcigpOwotICAgIH0KIH0KIAogY29uc3RleHByIHNpemVfdCBrS2xvZ01lc3NhZ2VTaXplID0gMTAyNDsKQEAgLTc4MCw2ICs0NjQsMTQgQEAKICAgICBURU1QX0ZBSUxVUkVfUkVUUlkoc2VuZChmZC5nZXQoKSwgJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwgMCkpOwogfQogCitpbnQgUmVzdG9yZWNvbklmRXhpc3RzKGNvbnN0IGNoYXIqIHBhdGgsIHVuc2lnbmVkIGludCBmbGFncykgeworICAgIGlmIChhY2Nlc3MocGF0aCwgRl9PSykgIT0gMCAmJiBlcnJubyA9PSBFTk9FTlQpIHsKKyAgICAgICAgLy8gQXZvaWQgZXJyb3IgbWVzc2FnZSBmb3IgcGF0aCB0aGF0IGlzIGV4cGVjdGVkIHRvIG5vdCBhbHdheXMgZXhpc3QuCisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gc2VsaW51eF9hbmRyb2lkX3Jlc3RvcmVjb24ocGF0aCwgZmxhZ3MpOworfQorCiB9ICAvLyBuYW1lc3BhY2UKIAogdm9pZCBTZWxpbnV4UmVzdG9yZUNvbnRleHQoKSB7CkBAIC04MDIsMTQgKzQ5NCwxNCBAQAogICAgIHNlbGludXhfYW5kcm9pZF9yZXN0b3JlY29uKCIvZGV2L2RldmljZS1tYXBwZXIiLCAwKTsKIAogICAgIHNlbGludXhfYW5kcm9pZF9yZXN0b3JlY29uKCIvYXBleCIsIDApOwotCisgICAgc2VsaW51eF9hbmRyb2lkX3Jlc3RvcmVjb24oIi9ib290c3RyYXAtYXBleCIsIDApOwogICAgIHNlbGludXhfYW5kcm9pZF9yZXN0b3JlY29uKCIvbGlua2VyY29uZmlnIiwgMCk7CiAKICAgICAvLyBhZGIgcmVtb3VudCwgc25hcHNob3QtYmFzZWQgdXBkYXRlcywgYW5kIERTVXMgYWxsIGNyZWF0ZSBmaWxlcyBkdXJpbmcKICAgICAvLyBmaXJzdC1zdGFnZSBpbml0LgotICAgIHNlbGludXhfYW5kcm9pZF9yZXN0b3JlY29uKFNuYXBzaG90TWFuYWdlcjo6R2V0R2xvYmFsUm9sbGJhY2tJbmRpY2F0b3JQYXRoKCkuY19zdHIoKSwgMCk7Ci0gICAgc2VsaW51eF9hbmRyb2lkX3Jlc3RvcmVjb24oIi9tZXRhZGF0YS9nc2kiLCBTRUxJTlVYX0FORFJPSURfUkVTVE9SRUNPTl9SRUNVUlNFIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VMSU5VWF9BTkRST0lEX1JFU1RPUkVDT05fU0tJUF9TRUhBU0gpOworICAgIFJlc3RvcmVjb25JZkV4aXN0cyhTbmFwc2hvdE1hbmFnZXI6OkdldEdsb2JhbFJvbGxiYWNrSW5kaWNhdG9yUGF0aCgpLmNfc3RyKCksIDApOworICAgIFJlc3RvcmVjb25JZkV4aXN0cygiL21ldGFkYXRhL2dzaSIsCisgICAgICAgICAgICAgICAgICAgICAgIFNFTElOVVhfQU5EUk9JRF9SRVNUT1JFQ09OX1JFQ1VSU0UgfCBTRUxJTlVYX0FORFJPSURfUkVTVE9SRUNPTl9TS0lQX1NFSEFTSCk7CiB9CiAKIGludCBTZWxpbnV4S2xvZ0NhbGxiYWNrKGludCB0eXBlLCBjb25zdCBjaGFyKiBmbXQsIC4uLikgewpAQCAtODUxLDYgKzU0MywxMCBAQAogfQogCiBpbnQgU2VsaW51eEdldFZlbmRvckFuZHJvaWRWZXJzaW9uKCkgeworICAgIGlmIChJc01pY3JvZHJvaWQoKSkgeworICAgICAgICAvLyBBcyBvZiBub3cgTWljcm9kcm9pZCBkb2Vzbid0IGhhdmUgYW55IHZlbmRvciBjb2RlLgorICAgICAgICByZXR1cm4gX19BTkRST0lEX0FQSV9GVVRVUkVfXzsKKyAgICB9CiAgICAgc3RhdGljIGludCB2ZW5kb3JfYW5kcm9pZF92ZXJzaW9uID0gW10gewogICAgICAgICBpZiAoIUlzU3BsaXRQb2xpY3lEZXZpY2UoKSkgewogICAgICAgICAgICAgLy8gSWYgdGhpcyBkZXZpY2UgZG9lcyBub3Qgc3BsaXQgc2Vwb2xpY3kgZmlsZXMsIGl0J3Mgbm90IGEgVHJlYmxlIGRldmljZSBhbmQgdGhlcmVmb3JlLApAQCAtOTU0LDYgKzY1MCwyNiBAQAogICAgIH0KIH0KIAorLy8gRW5jYXBzdWxhdGVzIHN0ZXBzIHRvIGxvYWQgU0VMaW51eCBwb2xpY3kgaW4gTWljcm9kcm9pZC4KKy8vIFNvIGZhciB0aGUgcHJvY2VzcyBpcyB2ZXJ5IHN0cmFpZ2h0Zm9yd2FyZCAtIGp1c3QgbG9hZCB0aGUgcHJlY29tcGlsZWQgcG9saWN5IGZyb20gL3N5c3RlbS4KK3ZvaWQgTG9hZFNlbGludXhQb2xpY3lNaWNyb2Ryb2lkKCkgeworICAgIGNvbnN0ZXhwciBjb25zdCBjaGFyIGtNaWNyb2Ryb2lkUHJlY29tcGlsZWRTZXBvbGljeVtdID0KKyAgICAgICAgICAgICIvc3lzdGVtL2V0Yy9zZWxpbnV4L21pY3JvZHJvaWRfcHJlY29tcGlsZWRfc2Vwb2xpY3kiOworCisgICAgTE9HKElORk8pIDw8ICJPcGVuaW5nIFNFTGludXggcG9saWN5IGZyb20gIiA8PCBrTWljcm9kcm9pZFByZWNvbXBpbGVkU2Vwb2xpY3k7CisgICAgdW5pcXVlX2ZkIHBvbGljeV9mZChvcGVuKGtNaWNyb2Ryb2lkUHJlY29tcGlsZWRTZXBvbGljeSwgT19SRE9OTFkgfCBPX0NMT0VYRUMgfCBPX05PRk9MTE9XKSk7CisgICAgaWYgKHBvbGljeV9mZCA8IDApIHsKKyAgICAgICAgUExPRyhGQVRBTCkgPDwgIkZhaWxlZCB0byBvcGVuICIgPDwga01pY3JvZHJvaWRQcmVjb21waWxlZFNlcG9saWN5OworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHBvbGljeTsKKyAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlYWRGZFRvU3RyaW5nKHBvbGljeV9mZCwgJnBvbGljeSkpIHsKKyAgICAgICAgUExPRyhGQVRBTCkgPDwgIkZhaWxlZCB0byByZWFkIHBvbGljeSBmaWxlOiAiIDw8IGtNaWNyb2Ryb2lkUHJlY29tcGlsZWRTZXBvbGljeTsKKyAgICB9CisKKyAgICBMb2FkU2VsaW51eFBvbGljeShwb2xpY3kpOworfQorCiAvLyBUaGUgU0VMaW51eCBzZXR1cCBwcm9jZXNzIGlzIGNhcmVmdWxseSBvcmNoZXN0cmF0ZWQgYXJvdW5kIHNuYXB1c2VyZC4gUG9saWN5CiAvLyBtdXN0IGJlIGxvYWRlZCBvZmYgZHluYW1pYyBwYXJ0aXRpb25zLCBhbmQgZHVyaW5nIGFuIE9UQSwgdGhvc2UgcGFydGl0aW9ucwogLy8gY2Fubm90IGJlIHJlYWQgd2l0aG91dCBzbmFwdXNlcmQuIEJ1dCwgd2l0aCBrZXJuZWwtcHJpdmlsZWdlZCBzbmFwdXNlcmQKQEAgLTk2OSwzNCArNjg1LDE5IEBACiAvLyAgKDUpIFJlLWxhdW5jaCBzbmFwdXNlcmQgYW5kIGF0dGFjaCBpdCB0byB0aGUgZG0tdXNlciBkZXZpY2VzIGZyb20gc3RlcCAoMikuCiAvLwogLy8gQWZ0ZXIgdGhpcyBzZXF1ZW5jZSwgaXQgaXMgc2FmZSB0byBlbmFibGUgZW5mb3JjaW5nIG1vZGUgYW5kIGNvbnRpbnVlIGJvb3RpbmcuCi1pbnQgU2V0dXBTZWxpbnV4KGNoYXIqKiBhcmd2KSB7Ci0gICAgU2V0U3RkaW9Ub0Rldk51bGwoYXJndik7Ci0gICAgSW5pdEtlcm5lbExvZ2dpbmcoYXJndik7Ci0KLSAgICBpZiAoUkVCT09UX0JPT1RMT0FERVJfT05fUEFOSUMpIHsKLSAgICAgICAgSW5zdGFsbFJlYm9vdFNpZ25hbEhhbmRsZXJzKCk7Ci0gICAgfQotCi0gICAgYm9vdF9jbG9jazo6dGltZV9wb2ludCBzdGFydF90aW1lID0gYm9vdF9jbG9jazo6bm93KCk7Ci0KK3ZvaWQgTG9hZFNlbGludXhQb2xpY3lBbmRyb2lkKCkgewogICAgIE1vdW50TWlzc2luZ1N5c3RlbVBhcnRpdGlvbnMoKTsKIAotICAgIFNlbGludXhTZXR1cEtlcm5lbExvZ2dpbmcoKTsKLQogICAgIExPRyhJTkZPKSA8PCAiT3BlbmluZyBTRUxpbnV4IHBvbGljeSI7CiAKLSAgICBQcmVwYXJlQXBleFNlcG9saWN5KCk7Ci0KICAgICAvLyBSZWFkIHRoZSBwb2xpY3kgYmVmb3JlIHBvdGVudGlhbGx5IGtpbGxpbmcgc25hcHVzZXJkLgogICAgIHN0ZDo6c3RyaW5nIHBvbGljeTsKICAgICBSZWFkUG9saWN5KCZwb2xpY3kpOwotICAgIENsZWFudXBBcGV4U2Vwb2xpY3koKTsKIAogICAgIGF1dG8gc25hcHVzZXJkX2hlbHBlciA9IFNuYXB1c2VyZFNlbGludXhIZWxwZXI6OkNyZWF0ZUlmTmVlZGVkKCk7CiAgICAgaWYgKHNuYXB1c2VyZF9oZWxwZXIpIHsKLSAgICAgICAgLy8gS2lsbCB0aGUgb2xkIHNuYXB1c2VkIHRvIGF2b2lkIGF1ZGl0IG1lc3NhZ2VzLiBBZnRlciB0aGlzIHdlIGNhbm5vdAotICAgICAgICAvLyByZWFkIGZyb20gL3N5c3RlbSAob3Igb3RoZXIgZHluYW1pYyBwYXJ0aXRpb25zKSB1bnRpbCB3ZSBjYWxsCi0gICAgICAgIC8vIEZpbmlzaFRyYW5zaXRpb24oKS4KKyAgICAgICAgLy8gS2lsbCB0aGUgb2xkIHNuYXB1c2VkIHRvIGF2b2lkIGF1ZGl0IG1lc3NhZ2VzLiBBZnRlciB0aGlzIHdlIGNhbm5vdCByZWFkIGZyb20gL3N5c3RlbQorICAgICAgICAvLyAob3Igb3RoZXIgZHluYW1pYyBwYXJ0aXRpb25zKSB1bnRpbCB3ZSBjYWxsIEZpbmlzaFRyYW5zaXRpb24oKS4KICAgICAgICAgc25hcHVzZXJkX2hlbHBlci0+U3RhcnRUcmFuc2l0aW9uKCk7CiAgICAgfQogCkBAIC0xMDA3LDE2ICs3MDgsMzggQEAKICAgICAgICAgc25hcHVzZXJkX2hlbHBlci0+RmluaXNoVHJhbnNpdGlvbigpOwogICAgICAgICBzbmFwdXNlcmRfaGVscGVyID0gbnVsbHB0cjsKICAgICB9Cit9CiAKLSAgICAvLyBUaGlzIHJlc3RvcmVjb24gaXMgaW50ZW50aW9uYWxseSBkb25lIGJlZm9yZSBTZWxpbnV4U2V0RW5mb3JjZW1lbnQgYmVjYXVzZSB0aGUgcGVybWlzc2lvbnMKLSAgICAvLyBuZWVkZWQgdG8gdHJhbnNpdGlvbiBmaWxlcyBmcm9tIHRtcGZzIHRvICpfY29udGV4dHNfZmlsZSBjb250ZXh0IHNob3VsZCBub3QgYmUgZ3JhbnRlZCB0bwotICAgIC8vIGFueSBwcm9jZXNzIGFmdGVyIHNlbGludXggaXMgc2V0IGludG8gZW5mb3JjaW5nIG1vZGUuCi0gICAgaWYgKHNlbGludXhfYW5kcm9pZF9yZXN0b3JlY29uKCIvZGV2L3NlbGludXgvIiwgU0VMSU5VWF9BTkRST0lEX1JFU1RPUkVDT05fUkVDVVJTRSkgPT0gLTEpIHsKLSAgICAgICAgUExPRyhGQVRBTCkgPDwgInJlc3RvcmVjb24gZmFpbGVkIG9mIC9kZXYvc2VsaW51eCBmYWlsZWQiOworaW50IFNldHVwU2VsaW51eChjaGFyKiogYXJndikgeworICAgIFNldFN0ZGlvVG9EZXZOdWxsKGFyZ3YpOworICAgIEluaXRLZXJuZWxMb2dnaW5nKGFyZ3YpOworCisgICAgaWYgKFJFQk9PVF9CT09UTE9BREVSX09OX1BBTklDKSB7CisgICAgICAgIEluc3RhbGxSZWJvb3RTaWduYWxIYW5kbGVycygpOworICAgIH0KKworICAgIGJvb3RfY2xvY2s6OnRpbWVfcG9pbnQgc3RhcnRfdGltZSA9IGJvb3RfY2xvY2s6Om5vdygpOworCisgICAgU2VsaW51eFNldHVwS2VybmVsTG9nZ2luZygpOworCisgICAgLy8gVE9ETyhiLzI4NzIwNjQ5Nyk6IHJlZmFjdG9yIGludG8gZGlmZmVyZW50IGhlYWRlcnMgdG8gb25seSBpbmNsdWRlIHdoYXQgd2UgbmVlZC4KKyAgICBpZiAoSXNNaWNyb2Ryb2lkKCkpIHsKKyAgICAgICAgTG9hZFNlbGludXhQb2xpY3lNaWNyb2Ryb2lkKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTG9hZFNlbGludXhQb2xpY3lBbmRyb2lkKCk7CiAgICAgfQogCiAgICAgU2VsaW51eFNldEVuZm9yY2VtZW50KCk7CiAKKyAgICBpZiAoSXNNaWNyb2Ryb2lkKCkgJiYgYW5kcm9pZDo6dmlydHVhbGl6YXRpb246OklzT3BlbkRpY2VDaGFuZ2VzRmxhZ0VuYWJsZWQoKSkgeworICAgICAgICAvLyBXZSBydW4gcmVzdG9yZWNvbiBvZiAvbWljcm9kcm9pZF9yZXNvdXJjZXMgd2hpbGUgd2UgYXJlIHN0aWxsIGluIGtlcm5lbCBjb250ZXh0IHRvIGF2b2lkCisgICAgICAgIC8vIGdyYW50aW5nIGluaXQgYHRtcGZzOmZpbGUgcmVsYWJlbGZyb21gIGNhcGFiaWxpdHkuCisgICAgICAgIGNvbnN0IGludCBmbGFncyA9IFNFTElOVVhfQU5EUk9JRF9SRVNUT1JFQ09OX1JFQ1VSU0U7CisgICAgICAgIGlmIChzZWxpbnV4X2FuZHJvaWRfcmVzdG9yZWNvbigiL21pY3JvZHJvaWRfcmVzb3VyY2VzIiwgZmxhZ3MpID09IC0xKSB7CisgICAgICAgICAgICBQTE9HKEZBVEFMKSA8PCAicmVzdG9yZWNvbiBvZiAvbWljcm9kcm9pZF9yZXNvdXJjZXMgZmFpbGVkIjsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIFdlJ3JlIGluIHRoZSBrZXJuZWwgZG9tYWluIGFuZCB3YW50IHRvIHRyYW5zaXRpb24gdG8gdGhlIGluaXQgZG9tYWluLiAgRmlsZSBzeXN0ZW1zIHRoYXQKICAgICAvLyBzdG9yZSBTRUxhYmVscyBpbiB0aGVpciB4YXR0cnMsIHN1Y2ggYXMgZXh0NCBkbyBub3QgbmVlZCBhbiBleHBsaWNpdCByZXN0b3JlY29uIGhlcmUsCiAgICAgLy8gYnV0IG90aGVyIGZpbGUgc3lzdGVtcyBkby4gIEluIHBhcnRpY3VsYXIsIHRoaXMgaXMgbmVlZGVkIGZvciByYW1kaXNrcyBzdWNoIGFzIHRoZQpkaWZmIC0tZ2l0IGEvaW5pdC9zZXJ2aWNlLmNwcCBiL2luaXQvc2VydmljZS5jcHAKaW5kZXggZThkMGQ0OS4uZDc2YTVkNSAxMDA2NDQKLS0tIGEvaW5pdC9zZXJ2aWNlLmNwcAorKysgYi9pbml0L3NlcnZpY2UuY3BwCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8Y3V0aWxzL3NvY2tldHMuaD4KICNpbmNsdWRlIDxwcm9jZXNzZ3JvdXAvcHJvY2Vzc2dyb3VwLmg+CiAjaW5jbHVkZSA8c2VsaW51eC9zZWxpbnV4Lmg+CisjaW5jbHVkZSA8c3lzL3NpZ25hbGZkLmg+CiAKICNpbmNsdWRlIDxzdHJpbmc+CiAKQEAgLTUwLDcgKzUxLDYgQEAKICNlbmRpZgogCiAjaWZkZWYgSU5JVF9GVUxMX1NPVVJDRVMKLSNpbmNsdWRlIDxBcGV4UHJvcGVydGllcy5zeXNwcm9wLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9hcGktbGV2ZWwuaD4KIAogI2luY2x1ZGUgIm1vdW50X25hbWVzcGFjZS5oIgpAQCAtNjksNiArNjksNyBAQAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6U2V0UHJvcGVydHk7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjpTdGFydHNXaXRoOwogdXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOwogdXNpbmcgYW5kcm9pZDo6YmFzZTo6V3JpdGVTdHJpbmdUb0ZpbGU7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTE0MCw5ICsxNDEsMTAgQEAKIAogU2VydmljZTo6U2VydmljZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgU3ViY29udGV4dCogc3ViY29udGV4dF9mb3JfcmVzdGFydF9jb21tYW5kcywKICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpCi0gICAgOiBTZXJ2aWNlKG5hbWUsIDAsIDAsIDAsIHt9LCAwLCAiIiwgc3ViY29udGV4dF9mb3JfcmVzdGFydF9jb21tYW5kcywgZmlsZW5hbWUsIGFyZ3MpIHt9CisgICAgOiBTZXJ2aWNlKG5hbWUsIDAsIHN0ZDo6bnVsbG9wdCwgMCwge30sIDAsICIiLCBzdWJjb250ZXh0X2Zvcl9yZXN0YXJ0X2NvbW1hbmRzLCBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgYXJncykge30KIAotU2VydmljZTo6U2VydmljZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgdW5zaWduZWQgZmxhZ3MsIHVpZF90IHVpZCwgZ2lkX3QgZ2lkLAorU2VydmljZTo6U2VydmljZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgdW5zaWduZWQgZmxhZ3MsIHN0ZDo6b3B0aW9uYWw8dWlkX3Q+IHVpZCwgZ2lkX3QgZ2lkLAogICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxnaWRfdD4mIHN1cHBfZ2lkcywgaW50IG5hbWVzcGFjZV9mbGFncywKICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY2xhYmVsLCBTdWJjb250ZXh0KiBzdWJjb250ZXh0X2Zvcl9yZXN0YXJ0X2NvbW1hbmRzLAogICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncykKQEAgLTE1Myw3ICsxNTUsNyBAQAogICAgICAgY3Jhc2hfY291bnRfKDApLAogICAgICAgcHJvY19hdHRyX3suaW9wcmlvX2NsYXNzID0gSW9TY2hlZENsYXNzX05PTkUsCiAgICAgICAgICAgICAgICAgIC5pb3ByaW9fcHJpID0gMCwKLSAgICAgICAgICAgICAgICAgLnVpZCA9IHVpZCwKKyAgICAgICAgICAgICAgICAgLnBhcnNlZF91aWQgPSB1aWQsCiAgICAgICAgICAgICAgICAgIC5naWQgPSBnaWQsCiAgICAgICAgICAgICAgICAgIC5zdXBwX2dpZHMgPSBzdXBwX2dpZHMsCiAgICAgICAgICAgICAgICAgIC5wcmlvcml0eSA9IDB9LApAQCAtMTk0LDI4ICsxOTYsMjAgQEAKICAgICB9CiB9CiAKLXZvaWQgU2VydmljZTo6S2lsbFByb2Nlc3NHcm91cChpbnQgc2lnbmFsLCBib29sIHJlcG9ydF9vbmVzaG90KSB7Ci0gICAgLy8gSWYgd2UndmUgYWxyZWFkeSBzZWVuIGEgc3VjY2Vzc2Z1bCByZXN1bHQgZnJvbSBraWxsUHJvY2Vzc0dyb3VwKigpLCB0aGVuIHdlIGhhdmUgcmVtb3ZlZAotICAgIC8vIHRoZSBjZ3JvdXAgYWxyZWFkeSBhbmQgY2FsbGluZyB0aGVzZSBmdW5jdGlvbnMgYSBzZWNvbmQgdGltZSB3aWxsIHNpbXBseSByZXN1bHQgaW4gYW4gZXJyb3IuCi0gICAgLy8gVGhpcyBpcyB0cnVlIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggc2lnbmFsIHdhcyBzZW50LgotICAgIC8vIFRoZXNlIGZ1bmN0aW9ucyBoYW5kbGUgdGhlaXIgb3duIGxvZ2dpbmcsIHNvIG5vIGFkZGl0aW9uYWwgbG9nZ2luZyBpcyBuZWVkZWQuCi0gICAgaWYgKCFwcm9jZXNzX2Nncm91cF9lbXB0eV8pIHsKK3ZvaWQgU2VydmljZTo6S2lsbFByb2Nlc3NHcm91cChpbnQgc2lnbmFsKSB7CisgICAgLy8gQWx3YXlzIGF0dGVtcHQgdGhlIHByb2Nlc3Mga2lsbCBpZiBwcm9jZXNzIGlzIHN0aWxsIHJ1bm5pbmcuCisgICAgLy8gQ2dyb3VwIGNsZWFuIHVwIHJvdXRpbmVzIGFyZSBpZGVtcG90ZW50LiBJdCdzIHNhZmUgdG8gY2FsbAorICAgIC8vIGtpbGxQcm9jZXNzR3JvdXAgcmVwZWF0ZWRseS4gRHVyaW5nIHNodXRkb3duLCBgaW5pdGAgd2lsbAorICAgIC8vIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBzZW5kIFNJR1RFUk0vU0lHS0lMTCB0byBhbGwgcHJvY2Vzc2VzLgorICAgIC8vIFRoZXNlIHNpZ25hbHMgbXVzdCBiZSBzZW50IGZvciBhIHN1Y2Nlc3NmdWwgc2h1dGRvd24uCisgICAgaWYgKCFwcm9jZXNzX2Nncm91cF9lbXB0eV8gfHwgSXNSdW5uaW5nKCkpIHsKICAgICAgICAgTE9HKElORk8pIDw8ICJTZW5kaW5nIHNpZ25hbCAiIDw8IHNpZ25hbCA8PCAiIHRvIHNlcnZpY2UgJyIgPDwgbmFtZV8gPDwgIicgKHBpZCAiIDw8IHBpZF8KICAgICAgICAgICAgICAgICAgIDw8ICIpIHByb2Nlc3MgZ3JvdXAuLi4iOwotICAgICAgICBpbnQgbWF4X3Byb2Nlc3NlcyA9IDA7CiAgICAgICAgIGludCByOwogICAgICAgICBpZiAoc2lnbmFsID09IFNJR1RFUk0pIHsKLSAgICAgICAgICAgIHIgPSBraWxsUHJvY2Vzc0dyb3VwT25jZShwcm9jX2F0dHJfLnVpZCwgcGlkXywgc2lnbmFsLCAmbWF4X3Byb2Nlc3Nlcyk7CisgICAgICAgICAgICByID0ga2lsbFByb2Nlc3NHcm91cE9uY2UodWlkKCksIHBpZF8sIHNpZ25hbCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByID0ga2lsbFByb2Nlc3NHcm91cChwcm9jX2F0dHJfLnVpZCwgcGlkXywgc2lnbmFsLCAmbWF4X3Byb2Nlc3Nlcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVwb3J0X29uZXNob3QgJiYgbWF4X3Byb2Nlc3NlcyA+IDApIHsKLSAgICAgICAgICAgIExPRyhXQVJOSU5HKQotICAgICAgICAgICAgICAgICAgICA8PCAiS2lsbGVkICIgPDwgbWF4X3Byb2Nlc3NlcwotICAgICAgICAgICAgICAgICAgICA8PCAiIGFkZGl0aW9uYWwgcHJvY2Vzc2VzIGZyb20gYSBvbmVzaG90IHByb2Nlc3MgZ3JvdXAgZm9yIHNlcnZpY2UgJyIgPDwgbmFtZV8KLSAgICAgICAgICAgICAgICAgICAgPDwgIicuIFRoaXMgaXMgbmV3IGJlaGF2aW9yLCBwcmV2aW91c2x5IGNoaWxkIHByb2Nlc3NlcyB3b3VsZCBub3QgYmUga2lsbGVkIGluICIKLSAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgY2FzZS4iOworICAgICAgICAgICAgciA9IGtpbGxQcm9jZXNzR3JvdXAodWlkKCksIHBpZF8sIHNpZ25hbCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAociA9PSAwKSBwcm9jZXNzX2Nncm91cF9lbXB0eV8gPSB0cnVlOwpAQCAtMjI4LDcgKzIyMiw3IEBACiAKIHZvaWQgU2VydmljZTo6U2V0UHJvY2Vzc0F0dHJpYnV0ZXNBbmRDYXBzKEludGVycHJvY2Vzc0ZpZm8gc2V0c2lkX2ZpbmlzaGVkKSB7CiAgICAgLy8gS2VlcCBjYXBhYmlsaXRlcyBvbiB1aWQgY2hhbmdlLgotICAgIGlmIChjYXBhYmlsaXRpZXNfICYmIHByb2NfYXR0cl8udWlkKSB7CisgICAgaWYgKGNhcGFiaWxpdGllc18gJiYgdWlkKCkpIHsKICAgICAgICAgLy8gSWYgQW5kcm9pZCBpcyBydW5uaW5nIGluIGEgY29udGFpbmVyLCBzb21lIHNlY3VyZWJpdHMgbWlnaHQgYWxyZWFkeQogICAgICAgICAvLyBiZSBsb2NrZWQsIHNvIGRvbid0IGNoYW5nZSB0aG9zZS4KICAgICAgICAgdW5zaWduZWQgbG9uZyBzZWN1cmViaXRzID0gcHJjdGwoUFJfR0VUX1NFQ1VSRUJJVFMpOwpAQCAtMjU1LDcgKzI0OSw3IEBACiAgICAgICAgIGlmICghU2V0Q2Fwc0ZvckV4ZWMoKmNhcGFiaWxpdGllc18pKSB7CiAgICAgICAgICAgICBMT0coRkFUQUwpIDw8ICJjYW5ub3Qgc2V0IGNhcGFiaWxpdGllcyBmb3IgIiA8PCBuYW1lXzsKICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAocHJvY19hdHRyXy51aWQpIHsKKyAgICB9IGVsc2UgaWYgKHVpZCgpKSB7CiAgICAgICAgIC8vIEluaGVyaXRhYmxlIGNhcHMgY2FuIGJlIG5vbi16ZXJvIHdoZW4gcnVubmluZyBpbiBhIGNvbnRhaW5lci4KICAgICAgICAgaWYgKCFEcm9wSW5oZXJpdGFibGVDYXBzKCkpIHsKICAgICAgICAgICAgIExPRyhGQVRBTCkgPDwgImNhbm5vdCBkcm9wIGluaGVyaXRhYmxlIGNhcHMgZm9yICIgPDwgbmFtZV87CkBAIC0yNjUsNyArMjU5LDcgQEAKIAogdm9pZCBTZXJ2aWNlOjpSZWFwKGNvbnN0IHNpZ2luZm9fdCYgc2lnaW5mbykgewogICAgIGlmICghKGZsYWdzXyAmIFNWQ19PTkVTSE9UKSB8fCAoZmxhZ3NfICYgU1ZDX1JFU1RBUlQpKSB7Ci0gICAgICAgIEtpbGxQcm9jZXNzR3JvdXAoU0lHS0lMTCwgZmFsc2UpOworICAgICAgICBLaWxsUHJvY2Vzc0dyb3VwKFNJR0tJTEwpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIExlZ2FjeSBiZWhhdmlvciBmcm9tIH4yMDA3IHVudGlsIEFuZHJvaWQgUjogdGhpcyBlbHNlIGJyYW5jaCBkaWQgbm90IGV4aXN0IGFuZCB3ZSBkaWQgbm90CiAgICAgICAgIC8vIGtpbGwgdGhlIHByb2Nlc3MgZ3JvdXAgaW4gdGhpcyBjYXNlLgpAQCAtMjczLDcgKzI2Nyw3IEBACiAgICAgICAgICAgICAvLyBUaGUgbmV3IGJlaGF2aW9yIGluIEFuZHJvaWQgUiBpcyB0byBraWxsIHRoZXNlIHByb2Nlc3MgZ3JvdXBzIGluIGFsbCBjYXNlcy4gIFRoZQogICAgICAgICAgICAgLy8gJ3RydWUnIHBhcmFtZXRlciBpbnN0cnVjdGlvbnMgS2lsbFByb2Nlc3NHcm91cCgpIHRvIHJlcG9ydCBhIHdhcm5pbmcgbWVzc2FnZSB3aGVyZSBpdAogICAgICAgICAgICAgLy8gZGV0ZWN0cyBhIGRpZmZlcmVuY2UgaW4gYmVoYXZpb3IgaGFzIG9jY3VycmVkLgotICAgICAgICAgICAgS2lsbFByb2Nlc3NHcm91cChTSUdLSUxMLCB0cnVlKTsKKyAgICAgICAgICAgIEtpbGxQcm9jZXNzR3JvdXAoU0lHS0lMTCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTMyMiw3ICszMTYsNyBAQAogICAgIH0KIAogI2lmIElOSVRfRlVMTF9TT1VSQ0VTCi0gICAgc3RhdGljIGJvb2wgaXNfYXBleF91cGRhdGFibGUgPSBhbmRyb2lkOjpzeXNwcm9wOjpBcGV4UHJvcGVydGllczo6dXBkYXRhYmxlKCkudmFsdWVfb3IoZmFsc2UpOworICAgIHN0YXRpYyBib29sIGlzX2FwZXhfdXBkYXRhYmxlID0gdHJ1ZTsKICNlbHNlCiAgICAgc3RhdGljIGJvb2wgaXNfYXBleF91cGRhdGFibGUgPSBmYWxzZTsKICNlbmRpZgpAQCAtMzYxLDIwICszNTUsMzUgQEAKICAgICAvLyBJZiB3ZSBjcmFzaCA+IDQgdGltZXMgaW4gJ2ZhdGFsX2NyYXNoX3dpbmRvd18nIG1pbnV0ZXMgb3IgYmVmb3JlIGJvb3RfY29tcGxldGVkLAogICAgIC8vIHJlYm9vdCBpbnRvIGJvb3Rsb2FkZXIgb3Igc2V0IGNyYXNoaW5nIHByb3BlcnR5CiAgICAgYm9vdF9jbG9jazo6dGltZV9wb2ludCBub3cgPSBib290X2Nsb2NrOjpub3coKTsKKyAgICBjb25zdGV4cHIgY29uc3QgY2hhciBuYXRpdmVfd2F0Y2hkb2dfcmVib290X3RpbWVbXSA9ICJwZXJzaXN0LmluaXQuc3ZjLmxhc3RfZmF0YWxfcmVib290X2Vwb2NoIjsKKyAgICB1aW50NjRfdCB0aHJvdHRsZV93aW5kb3cgPQorICAgICAgICAgICAgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86OnNlY29uZHM+KHN0ZDo6Y2hyb25vOjpob3VycygyNCkpLmNvdW50KCk7CiAgICAgaWYgKCgoZmxhZ3NfICYgU1ZDX0NSSVRJQ0FMKSB8fCBpc19wcm9jZXNzX3VwZGF0YWJsZSkgJiYgIShmbGFnc18gJiBTVkNfUkVTVEFSVCkgJiYKICAgICAgICAgIXdhc19sYXN0X2V4aXRfb2tfKSB7CiAgICAgICAgIGJvb2wgYm9vdF9jb21wbGV0ZWQgPSBHZXRCb29sUHJvcGVydHkoInN5cy5ib290X2NvbXBsZXRlZCIsIGZhbHNlKTsKICAgICAgICAgaWYgKG5vdyA8IHRpbWVfY3Jhc2hlZF8gKyBmYXRhbF9jcmFzaF93aW5kb3dfIHx8ICFib290X2NvbXBsZXRlZCkgewogICAgICAgICAgICAgaWYgKCsrY3Jhc2hfY291bnRfID4gNCkgewotICAgICAgICAgICAgICAgIGF1dG8gZXhpdF9yZWFzb24gPSBib290X2NvbXBsZXRlZCA/Ci0gICAgICAgICAgICAgICAgICAgICJpbiAiICsgc3RkOjp0b19zdHJpbmcoZmF0YWxfY3Jhc2hfd2luZG93Xy5jb3VudCgpKSArICIgbWludXRlcyIgOgotICAgICAgICAgICAgICAgICAgICAiYmVmb3JlIGJvb3QgY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICBhdXRvIGV4aXRfcmVhc29uID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RfY29tcGxldGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gImluICIgKyBzdGQ6OnRvX3N0cmluZyhmYXRhbF9jcmFzaF93aW5kb3dfLmNvdW50KCkpICsgIiBtaW51dGVzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJiZWZvcmUgYm9vdCBjb21wbGV0ZWQiOwogICAgICAgICAgICAgICAgIGlmIChmbGFnc18gJiBTVkNfQ1JJVElDQUwpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFHZXRCb29sUHJvcGVydHkoImluaXQuc3ZjX2RlYnVnLm5vX2ZhdGFsLiIgKyBuYW1lXywgZmFsc2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBBYm9ydHMgaW50byBgZmF0YWxfcmVib290X3RhcmdldF8nLgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0RmF0YWxSZWJvb3RUYXJnZXQoZmF0YWxfcmVib290X3RhcmdldF8pOwotICAgICAgICAgICAgICAgICAgICAgICAgTE9HKEZBVEFMKSA8PCAiY3JpdGljYWwgcHJvY2VzcyAnIiA8PCBuYW1lXyA8PCAiJyBleGl0ZWQgNCB0aW1lcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGV4aXRfcmVhc29uOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgZXBvY2hfdGltZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjpzZWNvbmRzPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKS50aW1lX3NpbmNlX2Vwb2NoKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvdW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3QgcmVib290IGFnYWluIElmIGl0IHdhcyBhbHJlYWR5IGluaXRpYXRlZCBpbiB0aGUgbGFzdCAyNGhycworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVwb2NoX3RpbWUgLSBHZXRJbnRQcm9wZXJ0eShuYXRpdmVfd2F0Y2hkb2dfcmVib290X3RpbWUsIDApID4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdHRsZV93aW5kb3cpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRQcm9wZXJ0eShuYXRpdmVfd2F0Y2hkb2dfcmVib290X3RpbWUsIHN0ZDo6dG9fc3RyaW5nKGVwb2NoX3RpbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBYm9ydHMgaW50byBgZmF0YWxfcmVib290X3RhcmdldF8nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldEZhdGFsUmVib290VGFyZ2V0KGZhdGFsX3JlYm9vdF90YXJnZXRfKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coRkFUQUwpIDw8ICJjcml0aWNhbCBwcm9jZXNzICciIDw8IG5hbWVfIDw8ICInIGV4aXRlZCA0IHRpbWVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGV4aXRfcmVhc29uOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIlJlYm9vdCBhbHJlYWR5IHBlcmZvcm1lZCBpbiBsYXN0IDI0aHJzIGJlY2F1c2Ugb2YgY3Jhc2guIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInByb2Nlc3Mgd2l0aCB1cGRhdGFibGUgY29tcG9uZW50cyAnIiA8PCBuYW1lXwpAQCAtNDIwLDcgKzQyOSw3IEBACiAgICAgICAgIH0KICAgICB9KTsKIAotICAgIGlmIChpc191cGRhdGFibGUoKSAmJiAhU2VydmljZUxpc3Q6OkdldEluc3RhbmNlKCkuSXNTZXJ2aWNlc1VwZGF0ZWQoKSkgeworICAgIGlmIChpc191cGRhdGFibGUoKSAmJiAhSXNEZWZhdWx0TW91bnROYW1lc3BhY2VSZWFkeSgpKSB7CiAgICAgICAgIC8vIERvbid0IGRlbGF5IHRoZSBzZXJ2aWNlIGZvciBFeGVjU3RhcnQoKSBhcyB0aGUgc2VtYW50aWMgaXMgdGhhdAogICAgICAgICAvLyB0aGUgY2FsbGVyIG1pZ2h0IGRlcGVuZCBvbiB0aGUgc2lkZSBlZmZlY3Qgb2YgdGhlIGV4ZWN1dGlvbi4KICAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgIkNhbm5vdCBzdGFydCBhbiB1cGRhdGFibGUgc2VydmljZSAnIiA8PCBuYW1lXwpAQCAtNDM2LDggKzQ0NSw4IEBACiAgICAgZmxhZ3NfIHw9IFNWQ19FWEVDOwogICAgIGlzX2V4ZWNfc2VydmljZV9ydW5uaW5nXyA9IHRydWU7CiAKLSAgICBMT0coSU5GTykgPDwgIlNWQ19FWEVDIHNlcnZpY2UgJyIgPDwgbmFtZV8gPDwgIicgcGlkICIgPDwgcGlkXyA8PCAiICh1aWQgIiA8PCBwcm9jX2F0dHJfLnVpZAotICAgICAgICAgICAgICA8PCAiIGdpZCAiIDw8IHByb2NfYXR0cl8uZ2lkIDw8ICIrIiA8PCBwcm9jX2F0dHJfLnN1cHBfZ2lkcy5zaXplKCkgPDwgIiBjb250ZXh0ICIKKyAgICBMT0coSU5GTykgPDwgIlNWQ19FWEVDIHNlcnZpY2UgJyIgPDwgbmFtZV8gPDwgIicgcGlkICIgPDwgcGlkXyA8PCAiICh1aWQgIiA8PCB1aWQoKSA8PCAiIGdpZCAiCisgICAgICAgICAgICAgIDw8IHByb2NfYXR0cl8uZ2lkIDw8ICIrIiA8PCBwcm9jX2F0dHJfLnN1cHBfZ2lkcy5zaXplKCkgPDwgIiBjb250ZXh0ICIKICAgICAgICAgICAgICAgPDwgKCFzZWNsYWJlbF8uZW1wdHkoKSA/IHNlY2xhYmVsXyA6ICJkZWZhdWx0IikgPDwgIikgc3RhcnRlZDsgd2FpdGluZy4uLiI7CiAKICAgICByZWJvb3Rfb25fZmFpbHVyZS5EaXNhYmxlKCk7CkBAIC00NzcsMTMgKzQ4NiwxMyBAQAogLy8gQ29uZmlndXJlcyB0aGUgbWVtb3J5IGNncm91cCBwcm9wZXJ0aWVzIGZvciB0aGUgc2VydmljZS4KIHZvaWQgU2VydmljZTo6Q29uZmlndXJlTWVtY2coKSB7CiAgICAgaWYgKHN3YXBwaW5lc3NfICE9IC0xKSB7Ci0gICAgICAgIGlmICghc2V0UHJvY2Vzc0dyb3VwU3dhcHBpbmVzcyhwcm9jX2F0dHJfLnVpZCwgcGlkXywgc3dhcHBpbmVzc18pKSB7CisgICAgICAgIGlmICghc2V0UHJvY2Vzc0dyb3VwU3dhcHBpbmVzcyh1aWQoKSwgcGlkXywgc3dhcHBpbmVzc18pKSB7CiAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAic2V0UHJvY2Vzc0dyb3VwU3dhcHBpbmVzcyBmYWlsZWQiOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKHNvZnRfbGltaXRfaW5fYnl0ZXNfICE9IC0xKSB7Ci0gICAgICAgIGlmICghc2V0UHJvY2Vzc0dyb3VwU29mdExpbWl0KHByb2NfYXR0cl8udWlkLCBwaWRfLCBzb2Z0X2xpbWl0X2luX2J5dGVzXykpIHsKKyAgICAgICAgaWYgKCFzZXRQcm9jZXNzR3JvdXBTb2Z0TGltaXQodWlkKCksIHBpZF8sIHNvZnRfbGltaXRfaW5fYnl0ZXNfKSkgewogICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgInNldFByb2Nlc3NHcm91cFNvZnRMaW1pdCBmYWlsZWQiOwogICAgICAgICB9CiAgICAgfQpAQCAtNTEwLDcgKzUxOSw3IEBACiAgICAgfQogCiAgICAgaWYgKGNvbXB1dGVkX2xpbWl0X2luX2J5dGVzICE9IHNpemVfdCgtMSkpIHsKLSAgICAgICAgaWYgKCFzZXRQcm9jZXNzR3JvdXBMaW1pdChwcm9jX2F0dHJfLnVpZCwgcGlkXywgY29tcHV0ZWRfbGltaXRfaW5fYnl0ZXMpKSB7CisgICAgICAgIGlmICghc2V0UHJvY2Vzc0dyb3VwTGltaXQodWlkKCksIHBpZF8sIGNvbXB1dGVkX2xpbWl0X2luX2J5dGVzKSkgewogICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgInNldFByb2Nlc3NHcm91cExpbWl0IGZhaWxlZCI7CiAgICAgICAgIH0KICAgICB9CkBAIC01ODEsNyArNTkwLDcgQEAKICAgICAgICAgfQogICAgIH0pOwogCi0gICAgaWYgKGlzX3VwZGF0YWJsZSgpICYmICFTZXJ2aWNlTGlzdDo6R2V0SW5zdGFuY2UoKS5Jc1NlcnZpY2VzVXBkYXRlZCgpKSB7CisgICAgaWYgKGlzX3VwZGF0YWJsZSgpICYmICFJc0RlZmF1bHRNb3VudE5hbWVzcGFjZVJlYWR5KCkpIHsKICAgICAgICAgU2VydmljZUxpc3Q6OkdldEluc3RhbmNlKCkuRGVsYXlTZXJ2aWNlKCp0aGlzKTsKICAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgIkNhbm5vdCBzdGFydCBhbiB1cGRhdGFibGUgc2VydmljZSAnIiA8PCBuYW1lXwogICAgICAgICAgICAgICAgICAgICAgICA8PCAiJyBiZWZvcmUgY29uZmlncyBmcm9tIEFQRVhlcyBhcmUgYWxsIGxvYWRlZC4gIgpAQCAtNjQ0LDggKzY1Myw2IEBACiAgICAgICAgIFNldE1vdW50TmFtZXNwYWNlKCk7CiAgICAgfQogCi0gICAgcG9zdF9kYXRhXyA9IFNlcnZpY2VMaXN0OjpHZXRJbnN0YW5jZSgpLklzUG9zdERhdGEoKTsKLQogICAgIExPRyhJTkZPKSA8PCAic3RhcnRpbmcgc2VydmljZSAnIiA8PCBuYW1lXyA8PCAiJy4uLiI7CiAKICAgICBzdGQ6OnZlY3RvcjxEZXNjcmlwdG9yPiBkZXNjcmlwdG9yczsKQEAgLTcwNywyMSArNzE0LDIwIEBACiAgICAgaWYgKENncm91cHNBdmFpbGFibGUoKSkgewogICAgICAgICBib29sIHVzZV9tZW1jZyA9IHN3YXBwaW5lc3NfICE9IC0xIHx8IHNvZnRfbGltaXRfaW5fYnl0ZXNfICE9IC0xIHx8IGxpbWl0X2luX2J5dGVzXyAhPSAtMSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0X3BlcmNlbnRfICE9IC0xIHx8ICFsaW1pdF9wcm9wZXJ0eV8uZW1wdHkoKTsKLSAgICAgICAgZXJybm8gPSAtY3JlYXRlUHJvY2Vzc0dyb3VwKHByb2NfYXR0cl8udWlkLCBwaWRfLCB1c2VfbWVtY2cpOworICAgICAgICBlcnJubyA9IC1jcmVhdGVQcm9jZXNzR3JvdXAodWlkKCksIHBpZF8sIHVzZV9tZW1jZyk7CiAgICAgICAgIGlmIChlcnJubyAhPSAwKSB7CiAgICAgICAgICAgICBSZXN1bHQ8dm9pZD4gcmVzdWx0ID0gY2dyb3Vwc19hY3RpdmF0ZWQuV3JpdGUoa0FjdGl2YXRpbmdDZ3JvdXBzRmFpbGVkKTsKICAgICAgICAgICAgIGlmICghcmVzdWx0Lm9rKCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiU2VuZGluZyBub3RpZmljYXRpb24gZmFpbGVkOiAiIDw8IHJlc3VsdC5lcnJvcigpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgImNyZWF0ZVByb2Nlc3NHcm91cCgiIDw8IHByb2NfYXR0cl8udWlkIDw8ICIsICIgPDwgcGlkXyA8PCAiLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB1c2VfbWVtY2cgPDwgIikgZmFpbGVkIGZvciBzZXJ2aWNlICciIDw8IG5hbWVfCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiJzogIiA8PCBzdHJlcnJvcihlcnJubyk7CisgICAgICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiY3JlYXRlUHJvY2Vzc0dyb3VwKCIgPDwgdWlkKCkgPDwgIiwgIiA8PCBwaWRfIDw8ICIsICIgPDwgdXNlX21lbWNnCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKSBmYWlsZWQgZm9yIHNlcnZpY2UgJyIgPDwgbmFtZV8gPDwgIic6ICIgPDwgc3RyZXJyb3IoZXJybm8pOwogICAgICAgICB9CiAKICAgICAgICAgLy8gV2hlbiB0aGUgYmxraW8gY29udHJvbGxlciBpcyBtb3VudGVkIGluIHRoZSB2MSBoaWVyYXJjaHksIE5vcm1hbElvUHJpb3JpdHkgaXMKICAgICAgICAgLy8gdGhlIGRlZmF1bHQgKC9kZXYvYmxraW8pLiBXaGVuIHRoZSBibGtpbyBjb250cm9sbGVyIGlzIG1vdW50ZWQgaW4gdGhlIHYyIGhpZXJhcmNoeSwgdGhlCiAgICAgICAgIC8vIE5vcm1hbElvUHJpb3JpdHkgcHJvZmlsZSBoYXMgdG8gYmUgYXBwbGllZCBleHBsaWNpdGx5LgotICAgICAgICBTZXRQcm9jZXNzUHJvZmlsZXMocHJvY19hdHRyXy51aWQsIHBpZF8sIHsiTm9ybWFsSW9Qcmlvcml0eSJ9KTsKKyAgICAgICAgU2V0UHJvY2Vzc1Byb2ZpbGVzKHVpZCgpLCBwaWRfLCB7Ik5vcm1hbElvUHJpb3JpdHkifSk7CiAKICAgICAgICAgaWYgKHVzZV9tZW1jZykgewogICAgICAgICAgICAgQ29uZmlndXJlTWVtY2coKTsKQEAgLTcyOSw3ICs3MzUsNyBAQAogICAgIH0KIAogICAgIGlmIChvb21fc2NvcmVfYWRqdXN0XyAhPSBERUZBVUxUX09PTV9TQ09SRV9BREpVU1QpIHsKLSAgICAgICAgTG1rZFJlZ2lzdGVyKG5hbWVfLCBwcm9jX2F0dHJfLnVpZCwgcGlkXywgb29tX3Njb3JlX2FkanVzdF8pOworICAgICAgICBMbWtkUmVnaXN0ZXIobmFtZV8sIHVpZCgpLCBwaWRfLCBvb21fc2NvcmVfYWRqdXN0Xyk7CiAgICAgfQogCiAgICAgaWYgKFJlc3VsdDx2b2lkPiByZXN1bHQgPSBjZ3JvdXBzX2FjdGl2YXRlZC5Xcml0ZShrQ2dyb3Vwc0FjdGl2YXRlZCk7ICFyZXN1bHQub2soKSkgewpAQCAtODAwLDYgKzgwNiwzNSBAQAogICAgIG1vdW50X25hbWVzcGFjZV8gPSBJc0RlZmF1bHRNb3VudE5hbWVzcGFjZVJlYWR5KCkgPyBOU19ERUZBVUxUIDogTlNfQk9PVFNUUkFQOwogfQogCitzdGF0aWMgaW50IFRocmVhZENvdW50KCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxESVIsIGRlY2x0eXBlKCZjbG9zZWRpcik+IGRpcihvcGVuZGlyKCIvcHJvYy9zZWxmL3Rhc2siKSwgY2xvc2VkaXIpOworICAgIGlmICghZGlyKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpbnQgY291bnQgPSAwOworICAgIGRpcmVudCogZW50cnk7CisgICAgd2hpbGUgKChlbnRyeSA9IHJlYWRkaXIoZGlyLmdldCgpKSkgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAoZW50cnktPmRfbmFtZVswXSAhPSAnLicpIHsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNvdW50OworfQorCisvLyBNdXN0IGJlIGNhbGxlZCBCRUZPUkUgYW55IHRocmVhZHMgYXJlIGNyZWF0ZWQuIFNlZSBhbHNvIHRoZSBzaWdwcm9jbWFzaygpIG1hbiBwYWdlLgordW5pcXVlX2ZkIFNlcnZpY2U6OkNyZWF0ZVNpZ2NobGRGZCgpIHsKKyAgICBDSEVDS19FUShUaHJlYWRDb3VudCgpLCAxKTsKKyAgICBzaWdzZXRfdCBtYXNrOworICAgIHNpZ2VtcHR5c2V0KCZtYXNrKTsKKyAgICBzaWdhZGRzZXQoJm1hc2ssIFNJR0NITEQpOworICAgIGlmIChzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZtYXNrLCBudWxscHRyKSA8IDApIHsKKyAgICAgICAgUExPRyhGQVRBTCkgPDwgIkZhaWxlZCB0byBibG9jayBTSUdDSExEIjsKKyAgICB9CisKKyAgICByZXR1cm4gdW5pcXVlX2ZkKHNpZ25hbGZkKC0xLCAmbWFzaywgU0ZEX0NMT0VYRUMpKTsKK30KKwogdm9pZCBTZXJ2aWNlOjpTZXRTdGFydGVkSW5GaXJzdFN0YWdlKHBpZF90IHBpZCkgewogICAgIExPRyhJTkZPKSA8PCAiYWRkaW5nIGZpcnN0LXN0YWdlIHNlcnZpY2UgJyIgPDwgbmFtZV8gPDwgIicuLi4iOwogCmRpZmYgLS1naXQgYS9pbml0L3NlcnZpY2UuaCBiL2luaXQvc2VydmljZS5oCmluZGV4IDhiOGFmYWYuLmFlNzU1NTMgMTAwNjQ0Ci0tLSBhL2luaXQvc2VydmljZS5oCisrKyBiL2luaXQvc2VydmljZS5oCkBAIC02MCw3ICs2MCw3IEBACiAjZGVmaW5lIFNWQ19HRU5UTEVfS0lMTCAweDIwMDAgIC8vIFRoaXMgc2VydmljZSBzaG91bGQgYmUgc3RvcHBlZCB3aXRoIFNJR1RFUk0gaW5zdGVhZCBvZiBTSUdLSUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdpbGwgc3RpbGwgYmUgU0lHS0lMTGVkIGFmdGVyIHRpbWVvdXQgcGVyaW9kIG9mIDIwMCBtcwogCi0jZGVmaW5lIE5SX1NWQ19TVVBQX0dJRFMgMTIgICAgLy8gdHdlbHZlIHN1cHBsZW1lbnRhcnkgZ3JvdXBzCisjZGVmaW5lIE5SX1NWQ19TVVBQX0dJRFMgMzIgICAgLy8gdGhpcnR5IHR3byBzdXBwbGVtZW50YXJ5IGdyb3VwcwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaW5pdCB7CkBAIC03Miw3ICs3Miw3IEBACiAgICAgU2VydmljZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgU3ViY29udGV4dCogc3ViY29udGV4dF9mb3JfcmVzdGFydF9jb21tYW5kcywKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzKTsKIAotICAgIFNlcnZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHVuc2lnbmVkIGZsYWdzLCB1aWRfdCB1aWQsIGdpZF90IGdpZCwKKyAgICBTZXJ2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCB1bnNpZ25lZCBmbGFncywgc3RkOjpvcHRpb25hbDx1aWRfdD4gdWlkLCBnaWRfdCBnaWQsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxnaWRfdD4mIHN1cHBfZ2lkcywgaW50IG5hbWVzcGFjZV9mbGFncywgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY2xhYmVsLAogICAgICAgICAgICAgU3ViY29udGV4dCogc3ViY29udGV4dF9mb3JfcmVzdGFydF9jb21tYW5kcywgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzKTsKQEAgLTExNyw3ICsxMTcsNyBAQAogICAgIGFuZHJvaWQ6OmJhc2U6OmJvb3RfY2xvY2s6OnRpbWVfcG9pbnQgdGltZV9zdGFydGVkKCkgY29uc3QgeyByZXR1cm4gdGltZV9zdGFydGVkXzsgfQogICAgIGludCBjcmFzaF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIGNyYXNoX2NvdW50XzsgfQogICAgIGludCB3YXNfbGFzdF9leGl0X29rKCkgY29uc3QgeyByZXR1cm4gd2FzX2xhc3RfZXhpdF9va187IH0KLSAgICB1aWRfdCB1aWQoKSBjb25zdCB7IHJldHVybiBwcm9jX2F0dHJfLnVpZDsgfQorICAgIHVpZF90IHVpZCgpIGNvbnN0IHsgcmV0dXJuIHByb2NfYXR0cl8udWlkKCk7IH0KICAgICBnaWRfdCBnaWQoKSBjb25zdCB7IHJldHVybiBwcm9jX2F0dHJfLmdpZDsgfQogICAgIGludCBuYW1lc3BhY2VfZmxhZ3MoKSBjb25zdCB7IHJldHVybiBuYW1lc3BhY2VzXy5mbGFnczsgfQogICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGdpZF90PiYgc3VwcF9naWRzKCkgY29uc3QgeyByZXR1cm4gcHJvY19hdHRyXy5zdXBwX2dpZHM7IH0KQEAgLTE0NCw4ICsxNDQsNiBAQAogICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjpjaHJvbm86OnNlY29uZHM+IHRpbWVvdXRfcGVyaW9kKCkgY29uc3QgeyByZXR1cm4gdGltZW91dF9wZXJpb2RfOyB9CiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzKCkgY29uc3QgeyByZXR1cm4gYXJnc187IH0KICAgICBib29sIGlzX3VwZGF0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIHVwZGF0YWJsZV87IH0KLSAgICBib29sIGlzX3Bvc3RfZGF0YSgpIGNvbnN0IHsgcmV0dXJuIHBvc3RfZGF0YV87IH0KLSAgICBib29sIGlzX2Zyb21fYXBleCgpIGNvbnN0IHsgcmV0dXJuIGJhc2U6OlN0YXJ0c1dpdGgoZmlsZW5hbWVfLCAiL2FwZXgvIik7IH0KICAgICB2b2lkIHNldF9vbmVzaG90KGJvb2wgdmFsdWUpIHsKICAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICAgICBmbGFnc18gfD0gU1ZDX09ORVNIT1Q7CkBAIC0xNTYsMTEgKzE1NCwxNSBAQAogICAgIGNvbnN0IFN1YmNvbnRleHQqIHN1YmNvbnRleHQoKSBjb25zdCB7IHJldHVybiBzdWJjb250ZXh0XzsgfQogICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGZpbGVuYW1lXzsgfQogICAgIHZvaWQgc2V0X2ZpbGVuYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7IGZpbGVuYW1lXyA9IG5hbWU7IH0KKyAgICBzdGF0aWMgaW50IEdldFNpZ2NobGRGZCgpIHsKKyAgICAgICAgc3RhdGljIGludCBzaWdjaGxkX2ZkID0gQ3JlYXRlU2lnY2hsZEZkKCkucmVsZWFzZSgpOworICAgICAgICByZXR1cm4gc2lnY2hsZF9mZDsKKyAgICB9CiAKICAgcHJpdmF0ZToKICAgICB2b2lkIE5vdGlmeVN0YXRlQ2hhbmdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuZXdfc3RhdGUpIGNvbnN0OwogICAgIHZvaWQgU3RvcE9yUmVzZXQoaW50IGhvdyk7Ci0gICAgdm9pZCBLaWxsUHJvY2Vzc0dyb3VwKGludCBzaWduYWwsIGJvb2wgcmVwb3J0X29uZXNob3QgPSBmYWxzZSk7CisgICAgdm9pZCBLaWxsUHJvY2Vzc0dyb3VwKGludCBzaWduYWwpOwogICAgIHZvaWQgU2V0UHJvY2Vzc0F0dHJpYnV0ZXNBbmRDYXBzKEludGVycHJvY2Vzc0ZpZm8gc2V0c2lkX2ZpbmlzaGVkKTsKICAgICB2b2lkIFJlc2V0RmxhZ3NGb3JTdGFydCgpOwogICAgIFJlc3VsdDx2b2lkPiBDaGVja0NvbnNvbGUoKTsKQEAgLTE2OCw2ICsxNzAsOCBAQAogICAgIHZvaWQgUnVuU2VydmljZShjb25zdCBzdGQ6OnZlY3RvcjxEZXNjcmlwdG9yPiYgZGVzY3JpcHRvcnMsIEludGVycHJvY2Vzc0ZpZm8gY2dyb3Vwc19hY3RpdmF0ZWQsCiAgICAgICAgICAgICAgICAgICAgIEludGVycHJvY2Vzc0ZpZm8gc2V0c2lkX2ZpbmlzaGVkKTsKICAgICB2b2lkIFNldE1vdW50TmFtZXNwYWNlKCk7CisgICAgc3RhdGljIDo6YW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIENyZWF0ZVNpZ2NobGRGZCgpOworCiAgICAgc3RhdGljIHVuc2lnbmVkIGxvbmcgbmV4dF9zdGFydF9vcmRlcl87CiAgICAgc3RhdGljIGJvb2wgaXNfZXhlY19zZXJ2aWNlX3J1bm5pbmdfOwogCkBAIC0yMzgsOCArMjQyLDYgQEAKIAogICAgIHN0ZDo6b3B0aW9uYWw8TW91bnROYW1lc3BhY2U+IG1vdW50X25hbWVzcGFjZV87CiAKLSAgICBib29sIHBvc3RfZGF0YV8gPSBmYWxzZTsKLQogICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IG9uX2ZhaWx1cmVfcmVib290X3RhcmdldF87CiAKICAgICBzdGQ6OnN0cmluZyBmaWxlbmFtZV87CmRpZmYgLS1naXQgYS9pbml0L3NlcnZpY2VfbGlzdC5jcHAgYi9pbml0L3NlcnZpY2VfbGlzdC5jcHAKaW5kZXggOTM3ZDgyZS4uZTZjYzJjOSAxMDA2NDQKLS0tIGEvaW5pdC9zZXJ2aWNlX2xpc3QuY3BwCisrKyBiL2luaXQvc2VydmljZV9saXN0LmNwcApAQCAtNjgsMTggKzY4LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgU2VydmljZUxpc3Q6Ok1hcmtQb3N0RGF0YSgpIHsKLSAgICBwb3N0X2RhdGFfID0gdHJ1ZTsKLX0KLQotYm9vbCBTZXJ2aWNlTGlzdDo6SXNQb3N0RGF0YSgpIHsKLSAgICByZXR1cm4gcG9zdF9kYXRhXzsKLX0KLQotdm9pZCBTZXJ2aWNlTGlzdDo6TWFya1NlcnZpY2VzVXBkYXRlKCkgewotICAgIHNlcnZpY2VzX3VwZGF0ZV9maW5pc2hlZF8gPSB0cnVlOwotCi0gICAgLy8gc3RhcnQgdGhlIGRlbGF5ZWQgc2VydmljZXMKK3ZvaWQgU2VydmljZUxpc3Q6OlN0YXJ0RGVsYXllZFNlcnZpY2VzKCkgewogICAgIGZvciAoY29uc3QgYXV0byYgbmFtZSA6IGRlbGF5ZWRfc2VydmljZV9uYW1lc18pIHsKICAgICAgICAgU2VydmljZSogc2VydmljZSA9IEZpbmRTZXJ2aWNlKG5hbWUpOwogICAgICAgICBpZiAoc2VydmljZSA9PSBudWxscHRyKSB7CkBAIC05NCw3ICs4Myw3IEBACiB9CiAKIHZvaWQgU2VydmljZUxpc3Q6OkRlbGF5U2VydmljZShjb25zdCBTZXJ2aWNlJiBzZXJ2aWNlKSB7Ci0gICAgaWYgKHNlcnZpY2VzX3VwZGF0ZV9maW5pc2hlZF8pIHsKKyAgICBpZiAoSXNEZWZhdWx0TW91bnROYW1lc3BhY2VSZWFkeSgpKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCBkZWxheSB0aGUgc3RhcnQgb2Ygc2VydmljZSAnIiA8PCBzZXJ2aWNlLm5hbWUoKQogICAgICAgICAgICAgICAgICAgIDw8ICInIGJlY2F1c2UgYWxsIHNlcnZpY2VzIGFyZSBhbHJlYWR5IHVwZGF0ZWQuIElnbm9yaW5nLiI7CiAgICAgICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL2luaXQvc2VydmljZV9saXN0LmggYi9pbml0L3NlcnZpY2VfbGlzdC5oCmluZGV4IGY4NThiYzMuLmZkN2ZjMDUgMTAwNjQ0Ci0tLSBhL2luaXQvc2VydmljZV9saXN0LmgKKysrIGIvaW5pdC9zZXJ2aWNlX2xpc3QuaApAQCAtODMsMjQgKzgzLDE0IEBACiAgICAgYXV0byBlbmQoKSBjb25zdCB7IHJldHVybiBzZXJ2aWNlc18uZW5kKCk7IH0KICAgICBjb25zdCBzdGQ6OnZlY3RvcjxTZXJ2aWNlKj4gc2VydmljZXNfaW5fc2h1dGRvd25fb3JkZXIoKSBjb25zdDsKIAotICAgIHZvaWQgTWFya1Bvc3REYXRhKCk7Ci0gICAgYm9vbCBJc1Bvc3REYXRhKCk7Ci0gICAgdm9pZCBNYXJrU2VydmljZXNVcGRhdGUoKTsKLSAgICBib29sIElzU2VydmljZXNVcGRhdGVkKCkgY29uc3QgeyByZXR1cm4gc2VydmljZXNfdXBkYXRlX2ZpbmlzaGVkXzsgfQogICAgIHZvaWQgRGVsYXlTZXJ2aWNlKGNvbnN0IFNlcnZpY2UmIHNlcnZpY2UpOwotCi0gICAgdm9pZCBSZXNldFN0YXRlKCkgewotICAgICAgICBwb3N0X2RhdGFfID0gZmFsc2U7Ci0gICAgICAgIHNlcnZpY2VzX3VwZGF0ZV9maW5pc2hlZF8gPSBmYWxzZTsKLSAgICB9CisgICAgdm9pZCBTdGFydERlbGF5ZWRTZXJ2aWNlcygpOwogCiAgICAgYXV0byBzaXplKCkgY29uc3QgeyByZXR1cm4gc2VydmljZXNfLnNpemUoKTsgfQogCiAgIHByaXZhdGU6CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFNlcnZpY2U+PiBzZXJ2aWNlc187CiAKLSAgICBib29sIHBvc3RfZGF0YV8gPSBmYWxzZTsKLSAgICBib29sIHNlcnZpY2VzX3VwZGF0ZV9maW5pc2hlZF8gPSBmYWxzZTsKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZGVsYXllZF9zZXJ2aWNlX25hbWVzXzsKIH07CiAKZGlmZiAtLWdpdCBhL2luaXQvc2VydmljZV9wYXJzZXIuY3BwIGIvaW5pdC9zZXJ2aWNlX3BhcnNlci5jcHAKaW5kZXggZTQ5ZDgyMC4uZWMzYjE3NiAxMDA2NDQKLS0tIGEvaW5pdC9zZXJ2aWNlX3BhcnNlci5jcHAKKysrIGIvaW5pdC9zZXJ2aWNlX3BhcnNlci5jcHAKQEAgLTI1LDggKzI1LDggQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3BhcnNlaW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgotI2luY2x1ZGUgPGhpZGwtdXRpbC9GUU5hbWUuaD4KICNpbmNsdWRlIDxwcm9jZXNzZ3JvdXAvcHJvY2Vzc2dyb3VwLmg+CiAjaW5jbHVkZSA8c3lzdGVtL3RocmVhZF9kZWZzLmg+CiAKQEAgLTUxLDYgKzUxLDE4IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaW5pdCB7CiAKKyNpZmRlZiBJTklUX0ZVTExfU09VUkNFUworLy8gb24gZnVsbCBzb3VyY2VzLCB3ZSBoYXZlIGJldHRlciBpbmZvcm1hdGlvbiBvbiBkZXZpY2UgdG8KKy8vIG1ha2UgdGhpcyBkZWNpc2lvbgorY29uc3RleHByIGJvb2wga0Fsd2F5c0Vycm9yVXNlclJvb3QgPSBmYWxzZTsKKyNlbHNlCitjb25zdGV4cHIgdWludDY0X3Qga0J1aWxkU2hpcHBpbmdBcGlMZXZlbCA9IEJVSUxEX1NISVBQSU5HX0FQSV9MRVZFTCArIDAgLyogKzAgaWYgZW1wdHkgKi87CisvLyBvbiBwYXJ0aWFsIHNvdXJjZXMsIHRoZSBob3N0IGJ1aWxkLCB3ZSBkb24ndCBoYXZlIHRoZSBzcGVjaWZpYworLy8gdmVuZG9yIEFQSSBsZXZlbCwgYnV0IHdlIGNhbiBlbmZvcmNlIHRoaW5ncyBiYXNlZCBvbiB0aGUKKy8vIHNoaXBwaW5nIEFQSSBsZXZlbC4KK2NvbnN0ZXhwciBib29sIGtBbHdheXNFcnJvclVzZXJSb290ID0ga0J1aWxkU2hpcHBpbmdBcGlMZXZlbCA+IF9fQU5EUk9JRF9BUElfVl9fOworI2VuZGlmCisKIFJlc3VsdDx2b2lkPiBTZXJ2aWNlUGFyc2VyOjpQYXJzZUNhcGFiaWxpdGllcyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mJiBhcmdzKSB7CiAgICAgc2VydmljZV8tPmNhcGFiaWxpdGllc18gPSAwOwogCkBAIC0xNzgsOCArMTkwLDkgQEAKICAgICBpZiAoIVBhcnNlSW50KGFyZ3NbMV0sICZzZXJ2aWNlXy0+cHJvY19hdHRyXy5wcmlvcml0eSwKICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oQU5EUk9JRF9QUklPUklUWV9ISUdIRVNUKSwgIC8vIGhpZ2hlc3QgaXMgbmVnYXRpdmUKICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oQU5EUk9JRF9QUklPUklUWV9MT1dFU1QpKSkgewotICAgICAgICByZXR1cm4gRXJyb3JmKCJwcm9jZXNzIHByaW9yaXR5IHZhbHVlIG11c3QgYmUgcmFuZ2Uge30gLSB7fSIsIEFORFJPSURfUFJJT1JJVFlfSElHSEVTVCwKLSAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1BSSU9SSVRZX0xPV0VTVCk7CisgICAgICAgIHJldHVybiBFcnJvcmYoInByb2Nlc3MgcHJpb3JpdHkgdmFsdWUgbXVzdCBiZSByYW5nZSB7fSAtIHt9IiwKKyAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KEFORFJPSURfUFJJT1JJVFlfSElHSEVTVCksCisgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihBTkRST0lEX1BSSU9SSVRZX0xPV0VTVCkpOwogICAgIH0KICAgICByZXR1cm4ge307CiB9CkBAIC0xODcsMjQgKzIwMCw2IEBACiBSZXN1bHQ8dm9pZD4gU2VydmljZVBhcnNlcjo6UGFyc2VJbnRlcmZhY2Uoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiYgYXJncykgewogICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnRlcmZhY2VfbmFtZSA9IGFyZ3NbMV07CiAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluc3RhbmNlX25hbWUgPSBhcmdzWzJdOwotCi0gICAgLy8gQUlETCBzZXJ2aWNlcyBkb24ndCB1c2UgZnVsbHkgcXVhbGlmaWVkIG5hbWVzIGFuZCBpbnN0ZWFkIGp1c3QgdXNlICJpbnRlcmZhY2UgYWlkbCA8bmFtZT4iCi0gICAgaWYgKGludGVyZmFjZV9uYW1lICE9ICJhaWRsIikgewotICAgICAgICBGUU5hbWUgZnFfbmFtZTsKLSAgICAgICAgaWYgKCFGUU5hbWU6OnBhcnNlKGludGVyZmFjZV9uYW1lLCAmZnFfbmFtZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJJbnZhbGlkIGZ1bGx5LXF1YWxpZmllZCBuYW1lIGZvciBpbnRlcmZhY2UgJyIgPDwgaW50ZXJmYWNlX25hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICInIjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghZnFfbmFtZS5pc0Z1bGx5UXVhbGlmaWVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJJbnRlcmZhY2UgbmFtZSBub3QgZnVsbHktcXVhbGlmaWVkICciIDw8IGludGVyZmFjZV9uYW1lIDw8ICInIjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmcV9uYW1lLmlzVmFsaWRWYWx1ZU5hbWUoKSkgewotICAgICAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgIkludGVyZmFjZSBuYW1lIG11c3Qgbm90IGJlIGEgdmFsdWUgbmFtZSAnIiA8PCBpbnRlcmZhY2VfbmFtZSA8PCAiJyI7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBjb25zdCBzdGQ6OnN0cmluZyBmdWxsbmFtZSA9IGludGVyZmFjZV9uYW1lICsgIi8iICsgaW5zdGFuY2VfbmFtZTsKIAogICAgIGZvciAoY29uc3QgYXV0byYgc3ZjIDogKnNlcnZpY2VfbGlzdF8pIHsKQEAgLTUzNCw3ICs1MjksNyBAQAogICAgIGlmICghdWlkLm9rKCkpIHsKICAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgIlVuYWJsZSB0byBmaW5kIFVJRCBmb3IgJyIgPDwgYXJnc1sxXSA8PCAiJzogIiA8PCB1aWQuZXJyb3IoKTsKICAgICB9Ci0gICAgc2VydmljZV8tPnByb2NfYXR0cl8udWlkID0gKnVpZDsKKyAgICBzZXJ2aWNlXy0+cHJvY19hdHRyXy5wYXJzZWRfdWlkID0gKnVpZDsKICAgICByZXR1cm4ge307CiB9CiAKQEAgLTU0MywxMiArNTM4LDkgQEAKIC8vIHdoZW4gd2UgbWlncmF0ZSB0byBjZ3JvdXBzIHYyIHdoaWxlIHRoZXNlIGhhcmRjb2RlZCBwYXRocyBzdGF5IHRoZSBzYW1lLgogc3RhdGljIHN0ZDo6b3B0aW9uYWw8Y29uc3Qgc3RkOjpzdHJpbmc+IENvbnZlcnRUYXNrRmlsZVRvUHJvZmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZSkgewogICAgIHN0YXRpYyBjb25zdCBzdGQ6Om1hcDxjb25zdCBzdGQ6OnN0cmluZywgY29uc3Qgc3RkOjpzdHJpbmc+IG1hcCA9IHsKLSAgICAgICAgICAgIHsiL2Rldi9zdHVuZS90b3AtYXBwL3Rhc2tzIiwgIk1heFBlcmZvcm1hbmNlIn0sCi0gICAgICAgICAgICB7Ii9kZXYvc3R1bmUvZm9yZWdyb3VuZC90YXNrcyIsICJIaWdoUGVyZm9ybWFuY2UifSwKICAgICAgICAgICAgIHsiL2Rldi9jcHVzZXQvY2FtZXJhLWRhZW1vbi90YXNrcyIsICJDYW1lcmFTZXJ2aWNlQ2FwYWNpdHkifSwKICAgICAgICAgICAgIHsiL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcyIsICJQcm9jZXNzQ2FwYWNpdHlIaWdoIn0sCiAgICAgICAgICAgICB7Ii9kZXYvY3B1c2V0L3N5c3RlbS1iYWNrZ3JvdW5kL3Rhc2tzIiwgIlNlcnZpY2VDYXBhY2l0eUxvdyJ9LAotICAgICAgICAgICAgeyIvZGV2L3N0dW5lL25uYXBpLWhhbC90YXNrcyIsICJOTkFwaUhBTFBlcmZvcm1hbmNlIn0sCiAgICAgICAgICAgICB7Ii9kZXYvYmxraW8vYmFja2dyb3VuZC90YXNrcyIsICJMb3dJb1ByaW9yaXR5In0sCiAgICAgfTsKICAgICBhdXRvIGl0ZXIgPSBtYXAuZmluZChmaWxlKTsKQEAgLTY3NywxMSArNjY5LDE0IEBACiAgICAgICAgIHJldHVybiB7fTsKICAgICB9CiAKLSAgICBpZiAoaW50ZXJmYWNlX2luaGVyaXRhbmNlX2hpZXJhcmNoeV8pIHsKLSAgICAgICAgaWYgKGNvbnN0IGF1dG8mIGNoZWNrX2hpZXJhcmNoeV9yZXN1bHQgPSBDaGVja0ludGVyZmFjZUluaGVyaXRhbmNlSGllcmFyY2h5KAotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlXy0+aW50ZXJmYWNlcygpLCAqaW50ZXJmYWNlX2luaGVyaXRhbmNlX2hpZXJhcmNoeV8pOwotICAgICAgICAgICAgIWNoZWNrX2hpZXJhcmNoeV9yZXN1bHQub2soKSkgewotICAgICAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgY2hlY2tfaGllcmFyY2h5X3Jlc3VsdC5lcnJvcigpOworICAgIGlmIChzZXJ2aWNlXy0+cHJvY19hdHRyXy5wYXJzZWRfdWlkID09IHN0ZDo6bnVsbG9wdCkgeworICAgICAgICBpZiAoa0Fsd2F5c0Vycm9yVXNlclJvb3QgfHwKKyAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OkdldEludFByb3BlcnR5KCJyby52ZW5kb3IuYXBpX2xldmVsIiwgMCkgPiAyMDI0MDQpIHsKKyAgICAgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJObyB1c2VyIHNwZWNpZmllZCBmb3Igc2VydmljZSAnIiA8PCBzZXJ2aWNlXy0+bmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiJywgc28gaXQgd291bGQgaGF2ZSBiZWVuIHJvb3QuIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiTm8gdXNlciBzcGVjaWZpZWQgZm9yIHNlcnZpY2UgJyIgPDwgc2VydmljZV8tPm5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICInLCBzbyBpdCBpcyByb290LiI7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2luaXQvc2VydmljZV9wYXJzZXIuaCBiL2luaXQvc2VydmljZV9wYXJzZXIuaAppbmRleCA2NzBhNWM2Li5mMDZjZmM0IDEwMDY0NAotLS0gYS9pbml0L3NlcnZpY2VfcGFyc2VyLmgKKysrIGIvaW5pdC9zZXJ2aWNlX3BhcnNlci5oCkBAIC0xOCw3ICsxOCw2IEBACiAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKLSNpbmNsdWRlICJpbnRlcmZhY2VfdXRpbHMuaCIKICNpbmNsdWRlICJwYXJzZXIuaCIKICNpbmNsdWRlICJzZXJ2aWNlLmgiCiAjaW5jbHVkZSAic2VydmljZV9saXN0LmgiCkBAIC0yOSwxMyArMjgsOCBAQAogCiBjbGFzcyBTZXJ2aWNlUGFyc2VyIDogcHVibGljIFNlY3Rpb25QYXJzZXIgewogICBwdWJsaWM6Ci0gICAgU2VydmljZVBhcnNlcigKLSAgICAgICAgICAgIFNlcnZpY2VMaXN0KiBzZXJ2aWNlX2xpc3QsIFN1YmNvbnRleHQqIHN1YmNvbnRleHQsCi0gICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPEludGVyZmFjZUluaGVyaXRhbmNlSGllcmFyY2h5TWFwPiYgaW50ZXJmYWNlX2luaGVyaXRhbmNlX2hpZXJhcmNoeSkKLSAgICAgICAgOiBzZXJ2aWNlX2xpc3RfKHNlcnZpY2VfbGlzdCksCi0gICAgICAgICAgc3ViY29udGV4dF8oc3ViY29udGV4dCksCi0gICAgICAgICAgaW50ZXJmYWNlX2luaGVyaXRhbmNlX2hpZXJhcmNoeV8oaW50ZXJmYWNlX2luaGVyaXRhbmNlX2hpZXJhcmNoeSksCi0gICAgICAgICAgc2VydmljZV8obnVsbHB0cikge30KKyAgICBTZXJ2aWNlUGFyc2VyKFNlcnZpY2VMaXN0KiBzZXJ2aWNlX2xpc3QsIFN1YmNvbnRleHQqIHN1YmNvbnRleHQpCisgICAgICAgIDogc2VydmljZV9saXN0XyhzZXJ2aWNlX2xpc3QpLCBzdWJjb250ZXh0XyhzdWJjb250ZXh0KSwgc2VydmljZV8obnVsbHB0cikge30KICAgICBSZXN1bHQ8dm9pZD4gUGFyc2VTZWN0aW9uKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYmIGFyZ3MsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lKSBvdmVycmlkZTsKICAgICBSZXN1bHQ8dm9pZD4gUGFyc2VMaW5lU2VjdGlvbihzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mJiBhcmdzLCBpbnQgbGluZSkgb3ZlcnJpZGU7CkBAIC04OCw3ICs4Miw2IEBACiAKICAgICBTZXJ2aWNlTGlzdCogc2VydmljZV9saXN0XzsKICAgICBTdWJjb250ZXh0KiBzdWJjb250ZXh0XzsKLSAgICBzdGQ6Om9wdGlvbmFsPEludGVyZmFjZUluaGVyaXRhbmNlSGllcmFyY2h5TWFwPiBpbnRlcmZhY2VfaW5oZXJpdGFuY2VfaGllcmFyY2h5XzsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8U2VydmljZT4gc2VydmljZV87CiAgICAgc3RkOjpzdHJpbmcgZmlsZW5hbWVfOwogfTsKZGlmZiAtLWdpdCBhL2luaXQvc2VydmljZV90ZXN0LmNwcCBiL2luaXQvc2VydmljZV90ZXN0LmNwcAppbmRleCA4N2EyY2U1Li41M2I1M2VkIDEwMDY0NAotLS0gYS9pbml0L3NlcnZpY2VfdGVzdC5jcHAKKysrIGIvaW5pdC9zZXJ2aWNlX3Rlc3QuY3BwCkBAIC0xNywxOCArMTcsNDUgQEAKICNpbmNsdWRlICJzZXJ2aWNlLmgiCiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8ZnN0cmVhbT4KICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dHlwZV90cmFpdHM+CiAjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CisjaW5jbHVkZSA8c2VsaW51eC9zZWxpbnV4Lmg+CisjaW5jbHVkZSA8c3lzL3NpZ25hbGZkLmg+CiAjaW5jbHVkZSAibG1rZF9zZXJ2aWNlLmgiCisjaW5jbHVkZSAicmVib290LmgiCisjaW5jbHVkZSAic2VydmljZS5oIgorI2luY2x1ZGUgInNlcnZpY2VfbGlzdC5oIgorI2luY2x1ZGUgInNlcnZpY2VfcGFyc2VyLmgiCiAjaW5jbHVkZSAidXRpbC5oIgogCit1c2luZyA6OmFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKK3VzaW5nIDo6YW5kcm9pZDo6YmFzZTo6U3RyaW5nUmVwbGFjZTsKK3VzaW5nIDo6YW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOwordXNpbmcgOjphbmRyb2lkOjpiYXNlOjpXcml0ZVN0cmluZ1RvRmQ7Cit1c2luZyA6OmFuZHJvaWQ6OmJhc2U6OldyaXRlU3RyaW5nVG9GaWxlOworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaW5pdCB7CiAKK3N0YXRpYyBzdGQ6OnN0cmluZyBHZXRTZWN1cml0eUNvbnRleHQoKSB7CisgICAgY2hhciogY3R4OworICAgIGlmIChnZXRjb24oJmN0eCkgPT0gLTEpIHsKKyAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCAiRmFpbGVkIHRvIGNhbGwgZ2V0Y29uIDogIiA8PCBzdHJlcnJvcihlcnJubyk7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHJlc3VsdHtjdHh9OworICAgIGZyZWVjb24oY3R4KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCiBURVNUKHNlcnZpY2UsIHBvZF9pbml0aWFsaXplZCkgewogICAgIGNvbnN0ZXhwciBhdXRvIG1lbW9yeV9zaXplID0gc2l6ZW9mKFNlcnZpY2UpOwogICAgIGFsaWduYXMoYWxpZ25vZihTZXJ2aWNlKSkgdW5zaWduZWQgY2hhciBvbGRfbWVtb3J5W21lbW9yeV9zaXplXTsKQEAgLTE5MCw1ICsyMTcsNjggQEAKICAgICBUZXN0X21ha2VfdGVtcG9yYXJ5X29uZXNob3Rfc2VydmljZShmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwogfQogCisvLyBSZXR1cm5zIHRoZSBwYXRoIGluIHRoZSB2MiBjZ3JvdXAgaGllcmFyY2h5IGZvciBhIGdpdmVuIHByb2Nlc3MgaW4gdGhlIGZvcm1hdCAvdWlkXyVkL3BpZF8lZC4KK3N0YXRpYyBzdGQ6OnN0cmluZyBDZ3JvdXBQYXRoKHBpZF90IHBpZCkgeworICAgIHN0ZDo6c3RyaW5nIGNncm91cF9wYXRoID0gU3RyaW5nUHJpbnRmKCIvcHJvYy8lZC9jZ3JvdXAiLCBwaWQpOworICAgIHN0ZDo6aWZzdHJlYW0gaXMoY2dyb3VwX3BhdGgsIHN0ZDo6aW9zOjppbik7CisgICAgc3RkOjpzdHJpbmcgbGluZTsKKyAgICB3aGlsZSAoc3RkOjpnZXRsaW5lKGlzLCBsaW5lKSkgeworICAgICAgICBpZiAobGluZS5zdWJzdHIoMCwgMykgPT0gIjA6OiIpIHsKKyAgICAgICAgICAgIHJldHVybiBsaW5lLnN1YnN0cigzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4ge307Cit9CisKK2NsYXNzIFNlcnZpY2VTdG9wVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPGJvb2w+IHt9OworCisvLyBCZWZvcmUgTm92ZW1iZXIgMjAyMywgcHJvY2Vzc2VzIHRoYXQgd2VyZSBtaWdyYXRlZCB0byBhbm90aGVyIHYyIGNncm91cCB3ZXJlIGlnbm9yZWQgYnkKKy8vIFNlcnZpY2U6OlN0b3AoKSBpZiB0aGVpciB1aWRfJWQvcGlkXyVkIGNncm91cCBkaXJlY3RvcnkgZ290IHJlbW92ZWQuIFRoaXMgdGVzdCwgaWYgcnVuIHdpdGggdGhlCisvLyBwYXJhbWV0ZXIgc2V0IHRvICd0cnVlJywgdmVyaWZpZXMgdGhhdCBzdWNoIHNlcnZpY2VzIGFyZSBzdG9wcGVkLgorVEVTVF9QKFNlcnZpY2VTdG9wVGVzdCwgc3RvcCkgeworICAgIGlmIChnZXR1aWQoKSAhPSAwKSB7CisgICAgICAgIEdURVNUX1NLSVAoKSA8PCAiTXVzdCBiZSBydW4gYXMgcm9vdC4iOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnN0cmluZ192aWV3IGtTZXJ2aWNlTmFtZSA9ICJTZXJ2aWNlQSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnN0cmluZ192aWV3IGtTY3JpcHRUZW1wbGF0ZSA9IFIiaW5pdCgKK3NlcnZpY2UgJG5hbWUgL3N5c3RlbS9iaW4veWVzCisgICAgdXNlciBzaGVsbAorICAgIGdyb3VwIHNoZWxsCisgICAgc2VjbGFiZWwgJHNlbGFiZWwKKylpbml0IjsKKworICAgIHN0ZDo6c3RyaW5nIHNjcmlwdCA9IFN0cmluZ1JlcGxhY2UoU3RyaW5nUmVwbGFjZShrU2NyaXB0VGVtcGxhdGUsICIkbmFtZSIsIGtTZXJ2aWNlTmFtZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiRzZWxhYmVsIiwgR2V0U2VjdXJpdHlDb250ZXh0KCksIGZhbHNlKTsKKyAgICBTZXJ2aWNlTGlzdCYgc2VydmljZV9saXN0ID0gU2VydmljZUxpc3Q6OkdldEluc3RhbmNlKCk7CisgICAgUGFyc2VyIHBhcnNlcjsKKyAgICBwYXJzZXIuQWRkU2VjdGlvblBhcnNlcigic2VydmljZSIsIHN0ZDo6bWFrZV91bmlxdWU8U2VydmljZVBhcnNlcj4oJnNlcnZpY2VfbGlzdCwgbnVsbHB0cikpOworCisgICAgVGVtcG9yYXJ5RmlsZSB0ZjsKKyAgICBBU1NFUlRfR0UodGYuZmQsIDApOworICAgIEFTU0VSVF9UUlVFKFdyaXRlU3RyaW5nVG9GZChzY3JpcHQsIHRmLmZkKSk7CisgICAgQVNTRVJUX1RSVUUocGFyc2VyLlBhcnNlQ29uZmlnKHRmLnBhdGgpKTsKKworICAgIFNlcnZpY2UqIGNvbnN0IHNlcnZpY2UgPSBTZXJ2aWNlTGlzdDo6R2V0SW5zdGFuY2UoKS5GaW5kU2VydmljZShrU2VydmljZU5hbWUpOworICAgIEFTU0VSVF9ORShzZXJ2aWNlLCBudWxscHRyKTsKKyAgICBBU1NFUlRfUkVTVUxUX09LKHNlcnZpY2UtPlN0YXJ0KCkpOworICAgIEFTU0VSVF9UUlVFKHNlcnZpY2UtPklzUnVubmluZygpKTsKKyAgICBpZiAoR2V0UGFyYW0oKSkgeworICAgICAgICBjb25zdCBwaWRfdCBwaWQgPSBzZXJ2aWNlLT5waWQoKTsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgY2dyb3VwX3BhdGggPSBDZ3JvdXBQYXRoKHBpZCk7CisgICAgICAgIEVYUEVDVF9ORShjZ3JvdXBfcGF0aCwgIiIpOworICAgICAgICBFWFBFQ1RfTkUoY2dyb3VwX3BhdGgsICIvIik7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHBpZF9zdHIgPSBzdGQ6OnRvX3N0cmluZyhwaWQpOworICAgICAgICBFWFBFQ1RfVFJVRShXcml0ZVN0cmluZ1RvRmlsZShwaWRfc3RyLCAiL3N5cy9mcy9jZ3JvdXAvY2dyb3VwLnByb2NzIikpOworICAgICAgICBFWFBFQ1RfRVEoQ2dyb3VwUGF0aChwaWQpLCAiLyIpOworICAgICAgICBFWFBFQ1RfRVEocm1kaXIoKCIvc3lzL2ZzL2Nncm91cCIgKyBjZ3JvdXBfcGF0aCkuY19zdHIoKSksIDApOworICAgIH0KKyAgICBFWFBFQ1RfRVEoMCwgU3RvcFNlcnZpY2VzQW5kTG9nVmlvbGF0aW9ucyh7c2VydmljZS0+bmFtZSgpfSwgMTBzLCAvKnRlcm1pbmF0ZT0qL3RydWUpKTsKKyAgICBTZXJ2aWNlTGlzdDo6R2V0SW5zdGFuY2UoKS5SZW1vdmVTZXJ2aWNlKCpzZXJ2aWNlKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKHNlcnZpY2UsIFNlcnZpY2VTdG9wVGVzdCwgdGVzdGluZzo6VmFsdWVzKGZhbHNlLCB0cnVlKSk7CisKIH0gIC8vIG5hbWVzcGFjZSBpbml0CiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5pdC9zZXJ2aWNlX3V0aWxzLmNwcCBiL2luaXQvc2VydmljZV91dGlscy5jcHAKaW5kZXggNzAwNGQ4ZC4uMGUxOWJjYyAxMDA2NDQKLS0tIGEvaW5pdC9zZXJ2aWNlX3V0aWxzLmNwcAorKysgYi9pbml0L3NlcnZpY2VfdXRpbHMuY3BwCkBAIC0yNzEsOCArMjcxLDggQEAKICAgICBpZiAoc2V0Z3JvdXBzKGF0dHIuc3VwcF9naWRzLnNpemUoKSwgY29uc3RfY2FzdDxnaWRfdCo+KCZhdHRyLnN1cHBfZ2lkc1swXSkpICE9IDApIHsKICAgICAgICAgcmV0dXJuIEVycm5vRXJyb3IoKSA8PCAic2V0Z3JvdXBzIGZhaWxlZCI7CiAgICAgfQotICAgIGlmIChhdHRyLnVpZCkgewotICAgICAgICBpZiAoc2V0dWlkKGF0dHIudWlkKSAhPSAwKSB7CisgICAgaWYgKGF0dHIudWlkKCkpIHsKKyAgICAgICAgaWYgKHNldHVpZChhdHRyLnVpZCgpKSAhPSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJzZXR1aWQgZmFpbGVkIjsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2luaXQvc2VydmljZV91dGlscy5oIGIvaW5pdC9zZXJ2aWNlX3V0aWxzLmgKaW5kZXggZDQxNDNhYS4uMjdlYzQ1MCAxMDA2NDQKLS0tIGEvaW5pdC9zZXJ2aWNlX3V0aWxzLmgKKysrIGIvaW5pdC9zZXJ2aWNlX3V0aWxzLmgKQEAgLTkxLDExICs5MSwxMyBAQAogICAgIElvU2NoZWRDbGFzcyBpb3ByaW9fY2xhc3M7CiAgICAgaW50IGlvcHJpb19wcmk7CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludCwgcmxpbWl0Pj4gcmxpbWl0czsKLSAgICB1aWRfdCB1aWQ7CisgICAgc3RkOjpvcHRpb25hbDx1aWRfdD4gcGFyc2VkX3VpZDsKICAgICBnaWRfdCBnaWQ7CiAgICAgc3RkOjp2ZWN0b3I8Z2lkX3Q+IHN1cHBfZ2lkczsKICAgICBpbnQgcHJpb3JpdHk7CiAgICAgYm9vbCBzdGRpb190b19rbXNnOworCisgICAgdWlkX3QgdWlkKCkgY29uc3QgeyByZXR1cm4gcGFyc2VkX3VpZC52YWx1ZV9vcigwKTsgfQogfTsKIAogaW5saW5lIGJvb2wgUmVxdWlyZXNDb25zb2xlKGNvbnN0IFByb2Nlc3NBdHRyaWJ1dGVzJiBhdHRyKSB7CmRpZmYgLS1naXQgYS9pbml0L3NpZ2NobGRfaGFuZGxlci5jcHAgYi9pbml0L3NpZ2NobGRfaGFuZGxlci5jcHAKaW5kZXggZjhjNTAxZi4uOGU5ZTcxMyAxMDA2NDQKLS0tIGEvaW5pdC9zaWdjaGxkX2hhbmRsZXIuY3BwCisrKyBiL2luaXQvc2lnY2hsZF9oYW5kbGVyLmNwcApAQCAtMTgsNiArMTgsNyBAQAogCiAjaW5jbHVkZSA8c2lnbmFsLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3NpZ25hbGZkLmg+CiAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CkBAIC0zMSw2ICszMiw3IEBACiAKICNpbmNsdWRlIDx0aHJlYWQ+CiAKKyNpbmNsdWRlICJlcG9sbC5oIgogI2luY2x1ZGUgImluaXQuaCIKICNpbmNsdWRlICJzZXJ2aWNlLmgiCiAjaW5jbHVkZSAic2VydmljZV9saXN0LmgiCkBAIC0xMTYsMzMgKzExOCw3NiBAQAogICAgIHJldHVybiBwaWQ7CiB9CiAKLXZvaWQgUmVhcEFueU91dHN0YW5kaW5nQ2hpbGRyZW4oKSB7Ci0gICAgd2hpbGUgKFJlYXBPbmVQcm9jZXNzKCkgIT0gMCkgeworc3RkOjpzZXQ8cGlkX3Q+IFJlYXBBbnlPdXRzdGFuZGluZ0NoaWxkcmVuKCkgeworICAgIHN0ZDo6c2V0PHBpZF90PiByZWFwZWRfcGlkczsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGNvbnN0IHBpZF90IHBpZCA9IFJlYXBPbmVQcm9jZXNzKCk7CisgICAgICAgIGlmIChwaWQgPD0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHJlYXBlZF9waWRzOworICAgICAgICB9CisgICAgICAgIHJlYXBlZF9waWRzLmVtcGxhY2UocGlkKTsKICAgICB9CiB9CiAKLXZvaWQgV2FpdFRvQmVSZWFwZWQoY29uc3Qgc3RkOjp2ZWN0b3I8cGlkX3Q+JiBwaWRzLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzIHRpbWVvdXQpIHsKK3N0YXRpYyB2b2lkIFJlYXBBbmRSZW1vdmUoc3RkOjp2ZWN0b3I8cGlkX3Q+JiBhbGl2ZV9waWRzKSB7CisgICAgZm9yIChhdXRvIHBpZCA6IFJlYXBBbnlPdXRzdGFuZGluZ0NoaWxkcmVuKCkpIHsKKyAgICAgICAgY29uc3QgYXV0byBpdCA9IHN0ZDo6ZmluZChhbGl2ZV9waWRzLmJlZ2luKCksIGFsaXZlX3BpZHMuZW5kKCksIHBpZCk7CisgICAgICAgIGlmIChpdCAhPSBhbGl2ZV9waWRzLmVuZCgpKSB7CisgICAgICAgICAgICBhbGl2ZV9waWRzLmVyYXNlKGl0KTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgSGFuZGxlU2lnbmFsKGludCBzaWduYWxfZmQpIHsKKyAgICBzaWduYWxmZF9zaWdpbmZvIHNpZ2luZm87CisgICAgc3NpemVfdCBieXRlc19yZWFkID0gVEVNUF9GQUlMVVJFX1JFVFJZKHJlYWQoc2lnbmFsX2ZkLCAmc2lnaW5mbywgc2l6ZW9mKHNpZ2luZm8pKSk7CisgICAgaWYgKGJ5dGVzX3JlYWQgIT0gc2l6ZW9mKHNpZ2luZm8pKSB7CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiVW5leHBlY3RlZDogIiA8PCBfX2Z1bmNfXyA8PCAiIHJlYWQgIiA8PCBieXRlc19yZWFkIDw8ICIgYnl0ZXMgaW5zdGVhZCBvZiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBzaXplb2Yoc2lnaW5mbyk7CisgICAgfQorfQorCit2b2lkIFdhaXRUb0JlUmVhcGVkKGludCBzaWdjaGxkX2ZkLCBjb25zdCBzdGQ6OnZlY3RvcjxwaWRfdD4mIHBpZHMsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgdGltZW91dCkgewogICAgIFRpbWVyIHQ7Ci0gICAgc3RkOjp2ZWN0b3I8cGlkX3Q+IGFsaXZlX3BpZHMocGlkcy5iZWdpbigpLCBwaWRzLmVuZCgpKTsKKyAgICBFcG9sbCBlcG9sbDsKKyAgICBpZiAoc2lnY2hsZF9mZCA+PSAwKSB7CisgICAgICAgIGlmIChhdXRvIHJlc3VsdCA9IGVwb2xsLk9wZW4oKTsgcmVzdWx0Lm9rKCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgIGVwb2xsLlJlZ2lzdGVySGFuZGxlcihzaWdjaGxkX2ZkLCBbc2lnY2hsZF9mZF0oKSB7IEhhbmRsZVNpZ25hbChzaWdjaGxkX2ZkKTsgfSk7CisgICAgICAgICAgICBpZiAoIXJlc3VsdC5vaygpKSB7CisgICAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgUmVnaXN0ZXJIYW5kbGVyKCkgZmFpbGVkLiBGYWxsaW5nIGJhY2sgdG8gc2xlZXBfZm9yKCk6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcmVzdWx0LmVycm9yKCk7CisgICAgICAgICAgICAgICAgc2lnY2hsZF9mZCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIgRXBvbGw6Ok9wZW4oKSBmYWlsZWQuIEZhbGxpbmcgYmFjayB0byBzbGVlcF9mb3IoKTogIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHJlc3VsdC5lcnJvcigpOworICAgICAgICAgICAgc2lnY2hsZF9mZCA9IC0xOworICAgICAgICB9CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHBpZF90PiBhbGl2ZV9waWRzKHBpZHMpOworICAgIFJlYXBBbmRSZW1vdmUoYWxpdmVfcGlkcyk7CiAgICAgd2hpbGUgKCFhbGl2ZV9waWRzLmVtcHR5KCkgJiYgdC5kdXJhdGlvbigpIDwgdGltZW91dCkgewotICAgICAgICBwaWRfdCBwaWQ7Ci0gICAgICAgIHdoaWxlICgocGlkID0gUmVhcE9uZVByb2Nlc3MoKSkgIT0gMCkgewotICAgICAgICAgICAgYXV0byBpdCA9IHN0ZDo6ZmluZChhbGl2ZV9waWRzLmJlZ2luKCksIGFsaXZlX3BpZHMuZW5kKCksIHBpZCk7Ci0gICAgICAgICAgICBpZiAoaXQgIT0gYWxpdmVfcGlkcy5lbmQoKSkgewotICAgICAgICAgICAgICAgIGFsaXZlX3BpZHMuZXJhc2UoaXQpOworICAgICAgICBpZiAoc2lnY2hsZF9mZCA+PSAwKSB7CisgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IGVwb2xsLldhaXQoc3RkOjptYXgodGltZW91dCAtIHQuZHVyYXRpb24oKSwgMG1zKSk7CisgICAgICAgICAgICBpZiAocmVzdWx0Lm9rKCkpIHsKKyAgICAgICAgICAgICAgICBSZWFwQW5kUmVtb3ZlKGFsaXZlX3BpZHMpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkVwb2xsOjpXYWl0KCkgZmFpbGVkICIgPDwgcmVzdWx0LmVycm9yKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGFsaXZlX3BpZHMuZW1wdHkoKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKDUwbXMpOworICAgICAgICBSZWFwQW5kUmVtb3ZlKGFsaXZlX3BpZHMpOwogICAgIH0KICAgICBMT0coSU5GTykgPDwgIldhaXRpbmcgZm9yICIgPDwgcGlkcy5zaXplKCkgPDwgIiBwaWRzIHRvIGJlIHJlYXBlZCB0b29rICIgPDwgdCA8PCAiIHdpdGggIgogICAgICAgICAgICAgICA8PCBhbGl2ZV9waWRzLnNpemUoKSA8PCAiIG9mIHRoZW0gc3RpbGwgcnVubmluZyI7Ci0gICAgZm9yIChwaWRfdCBwaWQgOiBwaWRzKSB7CisgICAgZm9yIChwaWRfdCBwaWQgOiBhbGl2ZV9waWRzKSB7CiAgICAgICAgIHN0ZDo6c3RyaW5nIHN0YXR1cyA9ICIobm8tc3VjaC1waWQpIjsKICAgICAgICAgUmVhZEZpbGVUb1N0cmluZyhTdHJpbmdQcmludGYoIi9wcm9jLyVkL3N0YXR1cyIsIHBpZCksICZzdGF0dXMpOwotICAgICAgICBMT0coSU5GTykgPDwgIlN0aWxsIHJ1bm5pbmc6ICIgPDwgcGlkIDw8ICcgJyA8PCBzdGF0dXM7CisgICAgICAgIExPRyhJTkZPKSA8PCAiU3RpbGwgcnVubmluZzogIiA8PCBwaWQgPDwgJ1xuJyA8PCBzdGF0dXM7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9pbml0L3NpZ2NobGRfaGFuZGxlci5oIGIvaW5pdC9zaWdjaGxkX2hhbmRsZXIuaAppbmRleCBmYWMxMDIwLi41MzUxMzAyIDEwMDY0NAotLS0gYS9pbml0L3NpZ2NobGRfaGFuZGxlci5oCisrKyBiL2luaXQvc2lnY2hsZF9oYW5kbGVyLmgKQEAgLTE4LDE0ICsxOCwxNiBAQAogI2RlZmluZSBfSU5JVF9TSUdDSExEX0hBTkRMRVJfSF8KIAogI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxzZXQ+CiAjaW5jbHVkZSA8dmVjdG9yPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaW5pdCB7CiAKLXZvaWQgUmVhcEFueU91dHN0YW5kaW5nQ2hpbGRyZW4oKTsKK3N0ZDo6c2V0PHBpZF90PiBSZWFwQW55T3V0c3RhbmRpbmdDaGlsZHJlbigpOwogCi12b2lkIFdhaXRUb0JlUmVhcGVkKGNvbnN0IHN0ZDo6dmVjdG9yPHBpZF90PiYgcGlkcywgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyB0aW1lb3V0KTsKK3ZvaWQgV2FpdFRvQmVSZWFwZWQoaW50IHNpZ2NobGRfZmQsIGNvbnN0IHN0ZDo6dmVjdG9yPHBpZF90PiYgcGlkcywKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyB0aW1lb3V0KTsKIAogfSAgLy8gbmFtZXNwYWNlIGluaXQKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9pbml0L3NuYXB1c2VyZF90cmFuc2l0aW9uLmNwcCBiL2luaXQvc25hcHVzZXJkX3RyYW5zaXRpb24uY3BwCmluZGV4IDNhOWZmNWIuLjIzNzBiYzIgMTAwNjQ0Ci0tLSBhL2luaXQvc25hcHVzZXJkX3RyYW5zaXRpb24uY3BwCisrKyBiL2luaXQvc25hcHVzZXJkX3RyYW5zaXRpb24uY3BwCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8ZmlsZXN5c3RlbT4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8c3RyaW5nX3ZpZXc+CisjaW5jbHVkZSA8dGhyZWFkPgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgpAQCAtNjEsNyArNjIsNyBAQAogc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtTbmFwdXNlcmRMYWJlbFtdID0gInU6b2JqZWN0X3I6c25hcHVzZXJkX2V4ZWM6czAiOwogc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtTbmFwdXNlcmRTb2NrZXRMYWJlbFtdID0gInU6b2JqZWN0X3I6c25hcHVzZXJkX3NvY2tldDpzMCI7CiAKLXZvaWQgTGF1bmNoRmlyc3RTdGFnZVNuYXB1c2VyZChTbmFwc2hvdERyaXZlciBkcml2ZXIpIHsKK3ZvaWQgTGF1bmNoRmlyc3RTdGFnZVNuYXB1c2VyZCgpIHsKICAgICBTb2NrZXREZXNjcmlwdG9yIHNvY2tldF9kZXNjOwogICAgIHNvY2tldF9kZXNjLm5hbWUgPSBhbmRyb2lkOjpzbmFwc2hvdDo6a1NuYXB1c2VyZFNvY2tldDsKICAgICBzb2NrZXRfZGVzYy50eXBlID0gU09DS19TVFJFQU07CkBAIC04NCwyMiArODUsMTMgQEAKICAgICBpZiAocGlkID09IDApIHsKICAgICAgICAgc29ja2V0LT5QdWJsaXNoKCk7CiAKLSAgICAgICAgaWYgKGRyaXZlciA9PSBTbmFwc2hvdERyaXZlcjo6RE1fVVNFUikgewotICAgICAgICAgICAgY2hhciBhcmcwW10gPSAiL3N5c3RlbS9iaW4vc25hcHVzZXJkIjsKLSAgICAgICAgICAgIGNoYXIgYXJnMVtdID0gIi11c2VyX3NuYXBzaG90IjsKLSAgICAgICAgICAgIGNoYXIqIGNvbnN0IGFyZ3ZbXSA9IHthcmcwLCBhcmcxLCBudWxscHRyfTsKLSAgICAgICAgICAgIGlmIChleGVjdihhcmcwLCBhcmd2KSA8IDApIHsKLSAgICAgICAgICAgICAgICBQTE9HKEZBVEFMKSA8PCAiQ2Fubm90IGxhdW5jaCBzbmFwdXNlcmQ7IGV4ZWN2IGZhaWxlZCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfZXhpdCgxMjcpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2hhciBhcmcwW10gPSAiL3N5c3RlbS9iaW4vc25hcHVzZXJkIjsKLSAgICAgICAgICAgIGNoYXIqIGNvbnN0IGFyZ3ZbXSA9IHthcmcwLCBudWxscHRyfTsKLSAgICAgICAgICAgIGlmIChleGVjdihhcmcwLCBhcmd2KSA8IDApIHsKLSAgICAgICAgICAgICAgICBQTE9HKEZBVEFMKSA8PCAiQ2Fubm90IGxhdW5jaCBzbmFwdXNlcmQ7IGV4ZWN2IGZhaWxlZCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfZXhpdCgxMjcpOworICAgICAgICBjaGFyIGFyZzBbXSA9ICIvc3lzdGVtL2Jpbi9zbmFwdXNlcmQiOworICAgICAgICBjaGFyIGFyZzFbXSA9ICItdXNlcl9zbmFwc2hvdCI7CisgICAgICAgIGNoYXIqIGNvbnN0IGFyZ3ZbXSA9IHthcmcwLCBhcmcxLCBudWxscHRyfTsKKyAgICAgICAgaWYgKGV4ZWN2KGFyZzAsIGFyZ3YpIDwgMCkgeworICAgICAgICAgICAgUExPRyhGQVRBTCkgPDwgIkNhbm5vdCBsYXVuY2ggc25hcHVzZXJkOyBleGVjdiBmYWlsZWQiOwogICAgICAgICB9CisgICAgICAgIF9leGl0KDEyNyk7CiAgICAgfQogCiAgICAgYXV0byBjbGllbnQgPSBTbmFwdXNlcmRDbGllbnQ6OkNvbm5lY3QoYW5kcm9pZDo6c25hcHNob3Q6OmtTbmFwdXNlcmRTb2NrZXQsIDEwcyk7CkBAIC0xMDgsNiArMTAwLDEwIEBACiAgICAgfQogICAgIGlmIChjbGllbnQtPlN1cHBvcnRzU2Vjb25kU3RhZ2VTb2NrZXRIYW5kb2ZmKCkpIHsKICAgICAgICAgc2V0ZW52KGtTbmFwdXNlcmRGaXJzdFN0YWdlSW5mb1ZhciwgInNvY2tldCIsIDEpOworICAgICAgICBhdXRvIHNtID0gU25hcHNob3RNYW5hZ2VyOjpOZXdGb3JGaXJzdFN0YWdlTW91bnQoKTsKKyAgICAgICAgaWYgKCFzbS0+TWFya1NuYXB1c2VyZEZyb21TeXN0ZW0oKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHVwZGF0ZSBNYXJrU25hcHVzZXJkRnJvbVN5c3RlbSI7CisgICAgICAgIH0KICAgICB9CiAKICAgICBzZXRlbnYoa1NuYXB1c2VyZEZpcnN0U3RhZ2VQaWRWYXIsIHN0ZDo6dG9fc3RyaW5nKHBpZCkuY19zdHIoKSwgMSk7CkBAIC0xOTQsMjIgKzE5MCwyMCBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIGF1dG8gc3RhcnQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihtYXAuc3RhcnQpOwotICAgICAgICBhdXRvIGxlbiA9IG1hcC5lbmQgLSBtYXAuc3RhcnQ7CisgICAgICAgIHVpbnQ2NF90IGxlbiA9IGFuZHJvaWQ6OnByb2NpbmZvOjpNYXBwZWRGaWxlU2l6ZShtYXApOwogICAgICAgICBpZiAoIWxlbikgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisKICAgICAgICAgaWYgKG1sb2NrKHN0YXJ0LCBsZW4pIDwgMCkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAibWxvY2sgZmFpbGVkLCAiIDw8IHN0YXJ0IDw8ICIgZm9yICIgPDwgbGVuIDw8ICIgYnl0ZXMuIjsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJcIiIgPDwgbWFwLm5hbWUgPDwgIlwiOiBtbG9jaygiIDw8IHN0YXJ0IDw8ICIsICIgPDwgbGVuCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKSBmYWlsZWQ6IHBnb2ZmID0gIiA8PCBtYXAucGdvZmY7CiAgICAgICAgICAgICBvayA9IGZhbHNlOwogICAgICAgICB9CiAgICAgfTsKIAogICAgIGlmICghYW5kcm9pZDo6cHJvY2luZm86OlJlYWRQcm9jZXNzTWFwcyhnZXRwaWQoKSwgY2FsbGJhY2spIHx8ICFvaykgewotICAgICAgICBMT0coRkFUQUwpIDw8ICJDb3VsZCBub3QgcHJvY2VzcyAvcHJvYy8iIDw8IGdldHBpZCgpIDw8ICIvbWFwcyBmaWxlIGZvciBpbml0LCAiCi0gICAgICAgICAgICAgICAgICAgPDwgImZhbGxpbmcgYmFjayB0byBtbG9ja2FsbCgpLiI7Ci0gICAgICAgIGlmIChtbG9ja2FsbChNQ0xfQ1VSUkVOVCkgPCAwKSB7Ci0gICAgICAgICAgICBMT0coRkFUQUwpIDw8ICJtbG9ja2FsbCBmYWlsZWQiOwotICAgICAgICB9CisgICAgICAgIExPRyhGQVRBTCkgPDwgIkNvdWxkIG5vdCBwcm9jZXNzIC9wcm9jLyIgPDwgZ2V0cGlkKCkgPDwgIi9tYXBzIGZpbGUgZm9yIGluaXQiOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvaW5pdC9zbmFwdXNlcmRfdHJhbnNpdGlvbi5oIGIvaW5pdC9zbmFwdXNlcmRfdHJhbnNpdGlvbi5oCmluZGV4IDU1N2QxMDUuLmU4NmU4ZGEgMTAwNjQ0Ci0tLSBhL2luaXQvc25hcHVzZXJkX3RyYW5zaXRpb24uaAorKysgYi9pbml0L3NuYXB1c2VyZF90cmFuc2l0aW9uLmgKQEAgLTI5LDEzICsyOSw4IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaW5pdCB7CiAKLWVudW0gY2xhc3MgU25hcHNob3REcml2ZXIgewotICAgIERNX1NOQVBTSE9ULAotICAgIERNX1VTRVIsCi19OwotCiAvLyBGb3JrIGFuZCBleGVjIGEgbmV3IGNvcHkgb2Ygc25hcHVzZXJkLgotdm9pZCBMYXVuY2hGaXJzdFN0YWdlU25hcHVzZXJkKFNuYXBzaG90RHJpdmVyIGRyaXZlcik7Cit2b2lkIExhdW5jaEZpcnN0U3RhZ2VTbmFwdXNlcmQoKTsKIAogY2xhc3MgU25hcHVzZXJkU2VsaW51eEhlbHBlciBmaW5hbCB7CiAgICAgdXNpbmcgU25hcHNob3RNYW5hZ2VyID0gYW5kcm9pZDo6c25hcHNob3Q6OlNuYXBzaG90TWFuYWdlcjsKZGlmZiAtLWdpdCBhL2luaXQvc3lzcHJvcC9BbmRyb2lkLmJwIGIvaW5pdC9zeXNwcm9wL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NmNkYzEuLjAwMDAwMDAKLS0tIGEvaW5pdC9zeXNwcm9wL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1wYWNrYWdlIHsKLSAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCi0gICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0Ci0gICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAic3lzdGVtX2NvcmVfaW5pdF9saWNlbnNlIgotICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKLSAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2NvcmVfaW5pdF9saWNlbnNlIl0sCi19Ci0KLXN5c3Byb3BfbGlicmFyeSB7Ci0gIG5hbWU6ICJjb20uYW5kcm9pZC5zeXNwcm9wLmluaXQiLAotICBzcmNzOiBbIkluaXRQcm9wZXJ0aWVzLnN5c3Byb3AiXSwKLSAgcHJvcGVydHlfb3duZXI6ICJQbGF0Zm9ybSIsCi0gIGFwaV9wYWNrYWdlczogWyJhbmRyb2lkLnN5c3Byb3AiXSwKLSAgcmVjb3ZlcnlfYXZhaWxhYmxlOiB0cnVlLAotfQpkaWZmIC0tZ2l0IGEvaW5pdC9zeXNwcm9wL0luaXRQcm9wZXJ0aWVzLnN5c3Byb3AgYi9pbml0L3N5c3Byb3AvSW5pdFByb3BlcnRpZXMuc3lzcHJvcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRjMjQzNC4uMDAwMDAwMAotLS0gYS9pbml0L3N5c3Byb3AvSW5pdFByb3BlcnRpZXMuc3lzcHJvcAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLW93bmVyOiBQbGF0Zm9ybQotbW9kdWxlOiAiYW5kcm9pZC5zeXNwcm9wLkluaXRQcm9wZXJ0aWVzIgotCi0jIFNlcnZlcyBhcyBhIHNpZ25hbCB0byBhbGwgcHJvY2Vzc2VzIHRoYXQgdXNlcnNwYWNlIHJlYm9vdCBpcyBoYXBwZW5pbmcuCi1wcm9wIHsKLSAgICBhcGlfbmFtZTogInVzZXJzcGFjZV9yZWJvb3RfaW5fcHJvZ3Jlc3MiCi0gICAgdHlwZTogQm9vbGVhbgotICAgIHNjb3BlOiBQdWJsaWMKLSAgICBhY2Nlc3M6IFJlYWRXcml0ZQotICAgIHByb3BfbmFtZTogInN5cy5pbml0LnVzZXJzcGFjZV9yZWJvb3QuaW5fcHJvZ3Jlc3MiCi0gICAgaW50ZWdlcl9hc19ib29sOiB0cnVlCi19Ci0KLSMgU2hvd3Mgd2hlbmV2ZXIgdGhlIGRldmljZSBzdXBwb3J0cyB1c2Vyc3BhY2UgcmVib290IG9yIG5vdC4KLXByb3AgewotICAgIGFwaV9uYW1lOiAiaXNfdXNlcnNwYWNlX3JlYm9vdF9zdXBwb3J0ZWQiCi0gICAgdHlwZTogQm9vbGVhbgotICAgIHNjb3BlOiBQdWJsaWMKLSAgICBhY2Nlc3M6IFJlYWRvbmx5Ci0gICAgcHJvcF9uYW1lOiAiaW5pdC51c2Vyc3BhY2VfcmVib290LmlzX3N1cHBvcnRlZCIKLSAgICBpbnRlZ2VyX2FzX2Jvb2w6IHRydWUKLX0KZGlmZiAtLWdpdCBhL2luaXQvc3lzcHJvcC9hcGkvY29tLmFuZHJvaWQuc3lzcHJvcC5pbml0LWN1cnJlbnQudHh0IGIvaW5pdC9zeXNwcm9wL2FwaS9jb20uYW5kcm9pZC5zeXNwcm9wLmluaXQtY3VycmVudC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZjRlOWEuLjAwMDAwMDAKLS0tIGEvaW5pdC9zeXNwcm9wL2FwaS9jb20uYW5kcm9pZC5zeXNwcm9wLmluaXQtY3VycmVudC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1wcm9wcyB7Ci0gIG1vZHVsZTogImFuZHJvaWQuc3lzcHJvcC5Jbml0UHJvcGVydGllcyIKLSAgcHJvcCB7Ci0gICAgYXBpX25hbWU6ICJpc191c2Vyc3BhY2VfcmVib290X3N1cHBvcnRlZCIKLSAgICBwcm9wX25hbWU6ICJpbml0LnVzZXJzcGFjZV9yZWJvb3QuaXNfc3VwcG9ydGVkIgotICAgIGludGVnZXJfYXNfYm9vbDogdHJ1ZQotICB9Ci0gIHByb3AgewotICAgIGFwaV9uYW1lOiAidXNlcnNwYWNlX3JlYm9vdF9pbl9wcm9ncmVzcyIKLSAgICBhY2Nlc3M6IFJlYWRXcml0ZQotICAgIHByb3BfbmFtZTogInN5cy5pbml0LnVzZXJzcGFjZV9yZWJvb3QuaW5fcHJvZ3Jlc3MiCi0gICAgaW50ZWdlcl9hc19ib29sOiB0cnVlCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2luaXQvc3lzcHJvcC9hcGkvY29tLmFuZHJvaWQuc3lzcHJvcC5pbml0LWxhdGVzdC50eHQgYi9pbml0L3N5c3Byb3AvYXBpL2NvbS5hbmRyb2lkLnN5c3Byb3AuaW5pdC1sYXRlc3QudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWY0ZTlhLi4wMDAwMDAwCi0tLSBhL2luaXQvc3lzcHJvcC9hcGkvY29tLmFuZHJvaWQuc3lzcHJvcC5pbml0LWxhdGVzdC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1wcm9wcyB7Ci0gIG1vZHVsZTogImFuZHJvaWQuc3lzcHJvcC5Jbml0UHJvcGVydGllcyIKLSAgcHJvcCB7Ci0gICAgYXBpX25hbWU6ICJpc191c2Vyc3BhY2VfcmVib290X3N1cHBvcnRlZCIKLSAgICBwcm9wX25hbWU6ICJpbml0LnVzZXJzcGFjZV9yZWJvb3QuaXNfc3VwcG9ydGVkIgotICAgIGludGVnZXJfYXNfYm9vbDogdHJ1ZQotICB9Ci0gIHByb3AgewotICAgIGFwaV9uYW1lOiAidXNlcnNwYWNlX3JlYm9vdF9pbl9wcm9ncmVzcyIKLSAgICBhY2Nlc3M6IFJlYWRXcml0ZQotICAgIHByb3BfbmFtZTogInN5cy5pbml0LnVzZXJzcGFjZV9yZWJvb3QuaW5fcHJvZ3Jlc3MiCi0gICAgaW50ZWdlcl9hc19ib29sOiB0cnVlCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2luaXQvdGVzdF9raWxsX3NlcnZpY2VzL0FuZHJvaWQuYnAgYi9pbml0L3Rlc3Rfa2lsbF9zZXJ2aWNlcy9BbmRyb2lkLmJwCmluZGV4IDM3MzYxYTguLmFkYTg3ZDggMTAwNjQ0Ci0tLSBhL2luaXQvdGVzdF9raWxsX3NlcnZpY2VzL0FuZHJvaWQuYnAKKysrIGIvaW5pdC90ZXN0X2tpbGxfc2VydmljZXMvQW5kcm9pZC5icApAQCAtMTAsNyArMTAsMTAgQEAKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJpbml0X2tpbGxfc2VydmljZXNfdGVzdCIsCiAgICAgc3JjczogWyJpbml0X2tpbGxfc2VydmljZXNfdGVzdC5jcHAiXSwKLSAgICBzaGFyZWRfbGliczogWyJsaWJiYXNlIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgIF0sCiAgICAgdGVzdF9zdWl0ZXM6IFsiZ2VuZXJhbC10ZXN0cyJdLAogCiAgICAgLy8gVE9ETyhiLzE1MzU2NTQ3NCk6IHN3aXRjaCBiYWNrIHRvIGF1dG8tZ2VuZXJhdGlvbgpkaWZmIC0tZ2l0IGEvaW5pdC90ZXN0X2tpbGxfc2VydmljZXMvT1dORVJTIGIvaW5pdC90ZXN0X2tpbGxfc2VydmljZXMvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMTY0YWEKLS0tIC9kZXYvbnVsbAorKysgYi9pbml0L3Rlc3Rfa2lsbF9zZXJ2aWNlcy9PV05FUlMKQEAgLTAsMCArMSBAQAorc21vcmVsYW5kQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL2luaXQvdGVzdF9raWxsX3NlcnZpY2VzL2luaXRfa2lsbF9zZXJ2aWNlc190ZXN0LmNwcCBiL2luaXQvdGVzdF9raWxsX3NlcnZpY2VzL2luaXRfa2lsbF9zZXJ2aWNlc190ZXN0LmNwcAppbmRleCA1MzU1NzAzLi5lZmJhOWY2IDEwMDY0NAotLS0gYS9pbml0L3Rlc3Rfa2lsbF9zZXJ2aWNlcy9pbml0X2tpbGxfc2VydmljZXNfdGVzdC5jcHAKKysrIGIvaW5pdC90ZXN0X2tpbGxfc2VydmljZXMvaW5pdF9raWxsX3NlcnZpY2VzX3Rlc3QuY3BwCkBAIC0xNiwxNCArMTYsMzEgQEAKIAogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8aGlkbC9TZXJ2aWNlTWFuYWdlbWVudC5oPgogCiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAKIHVzaW5nIDo6YW5kcm9pZDo6YmFzZTo6R2V0UHJvcGVydHk7CiB1c2luZyA6OmFuZHJvaWQ6OmJhc2U6OlNldFByb3BlcnR5OwordXNpbmcgOjphbmRyb2lkOjpiYXNlOjpXYWl0Rm9yUHJvcGVydHk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjppc0hpZGxTdXBwb3J0ZWQ7Cit1c2luZyBzdGQ6OmxpdGVyYWxzOjpjaHJvbm9fbGl0ZXJhbHM6Om9wZXJhdG9yIiJzOwogCiB2b2lkIEV4cGVjdEtpbGxpbmdTZXJ2aWNlUmVjb3ZlcnMoY29uc3Qgc3RkOjpzdHJpbmcmIHNlcnZpY2VfbmFtZSkgeworICAgIGlmICghaXNIaWRsU3VwcG9ydGVkKCkgJiYgc2VydmljZV9uYW1lID09ICJod3NlcnZpY2VtYW5hZ2VyIikgeworICAgICAgICBHVEVTVF9TS0lQKCkgPDwgIk5vIEhJREwgc3VwcG9ydCBvbiBkZXZpY2Ugc28gaHdzZXJ2aWNlbWFuYWdlciB3aWxsIG5vdCBiZSBydW5uaW5nIjsKKyAgICB9CisgICAgTE9HKElORk8pIDw8ICJiZWZvcmUgd2Ugc2F5IGhpIHRvICIgPDwgc2VydmljZV9uYW1lIDw8ICIsIEkgY2FuJ3QgaGF2ZSBhcGV4ZCBhcm91bmQhIjsKKworICAgIC8vIGIvMjgwNTE0MDgwIC0gc2VydmljZW1hbmFnZXIgd2lsbCByZXN0YXJ0IGFwZXhkLCBhbmQgYXBleGQgd2lsbCByZXN0YXJ0IHRoZQorICAgIC8vIHN5c3RlbSB3aGVuIGNyYXNoZWQuIFRoaXMgaXMgZmluZSBhcyB0aGUgZGV2aWNlIHJlY292ZXJzLCBidXQgaXQgY2F1c2VzCisgICAgLy8gZmxha2VzIGluIHRoaXMgdGVzdC4KKyAgICBBU1NFUlRfVFJVRShXYWl0Rm9yUHJvcGVydHkoImluaXQuc3ZjLmFwZXhkIiwgInN0b3BwZWQiLCAxMjBzKSkKKyAgICAgICAgICAgIDw8IChzeXN0ZW0oImNhdCAvZGV2L2JpbmRlcmZzL2JpbmRlcl9sb2dzL3N0YXRlIiksICJhcGV4ZCB3b24ndCBzdG9wIik7CisKKyAgICBMT0coSU5GTykgPDwgImhlbGxvICIgPDwgc2VydmljZV9uYW1lIDw8ICIhIjsKICAgICBjb25zdCBzdGQ6OnN0cmluZyBzdGF0dXNfcHJvcCA9ICJpbml0LnN2Yy4iICsgc2VydmljZV9uYW1lOwogICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHBpZF9wcm9wID0gImluaXQuc3ZjX2RlYnVnX3BpZC4iICsgc2VydmljZV9uYW1lOwogCkBAIC0zMiw2ICs0OSw3IEBACiAgICAgQVNTRVJUX0VRKCJydW5uaW5nIiwgR2V0UHJvcGVydHkoc3RhdHVzX3Byb3AsICIiKSkgPDwgc3RhdHVzX3Byb3A7CiAgICAgQVNTRVJUX05FKCIiLCBpbml0aWFsX3BpZCkgPDwgcGlkX3Byb3A7CiAKKyAgICBMT0coSU5GTykgPDwgIm9rYXksIG5vdyBnb29kYnllICIgPDwgc2VydmljZV9uYW1lOwogICAgIEVYUEVDVF9FUSgwLCBzeXN0ZW0oKCJraWxsIC05ICIgKyBpbml0aWFsX3BpZCkuY19zdHIoKSkpOwogCiAgICAgY29uc3RleHByIHNpemVfdCBrTWF4V2FpdE1pbGxpc2Vjb25kcyA9IDEwMDAwOwpAQCAtNDIsMTEgKzYwLDE2IEBACiAgICAgZm9yIChzaXplX3QgcmV0cnkgPSAwOyByZXRyeSA8IGtSZXRyeVRpbWVzOyByZXRyeSsrKSB7CiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwaWQgPSBHZXRQcm9wZXJ0eShwaWRfcHJvcCwgIiIpOwogICAgICAgICBpZiAocGlkICE9IGluaXRpYWxfcGlkICYmIHBpZCAhPSAiIikgYnJlYWs7CisgICAgICAgIExPRyhJTkZPKSA8PCAiSSBzYWlkIGdvb2RieWUgIiA8PCBzZXJ2aWNlX25hbWUgPDwgIiEiOwogICAgICAgICB1c2xlZXAoa1JldHJ5V2FpdE1pbGxpc2Vjb25kcyAqIDEwMDApOwogICAgIH0KIAorICAgIExPRyhJTkZPKSA8PCAiYXJlIHlvdSBzdGlsbCB0aGVyZSAiIDw8IHNlcnZpY2VfbmFtZSA8PCAiPyI7CisKICAgICAvLyBzdmNfZGVidWdfcGlkIGlzIHNldCBhZnRlciBzdmMgcHJvcGVydHkKICAgICBFWFBFQ1RfRVEoInJ1bm5pbmciLCBHZXRQcm9wZXJ0eShzdGF0dXNfcHJvcCwgIiIpKTsKKworICAgIExPRyhJTkZPKSA8PCAiSSdtIGRvbmUgd2l0aCAiIDw8IHNlcnZpY2VfbmFtZTsKIH0KIAogY2xhc3MgSW5pdEtpbGxTZXJ2aWNlc1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHN0ZDo6c3RyaW5nPiB7fTsKQEAgLTY0LDYgKzg3LDI1IEBACiAgICAgcmV0dXJuIGluZm8ucGFyYW07CiB9CiAKLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKERlYXRoVGVzdCwgSW5pdEtpbGxTZXJ2aWNlc1Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygibG1rZCIsICJ1ZXZlbnRkIiwgImh3c2VydmljZW1hbmFnZXIiLCAic2VydmljZW1hbmFnZXIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFByaW50TmFtZSk7CitJTlNUQU5USUFURV9URVNUX0NBU0VfUCgKKyAgICAgICAgRGVhdGhUZXN0LCBJbml0S2lsbFNlcnZpY2VzVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUT0RPOiB3ZSBtYXkgd2FudCBhIG1vcmUgYXV0b21hdGljIHdheSBvZiB0ZXN0aW5nIHRoaXMgZm9yIHNlcnZpY2VzIGJhc2VkIG9uIHNvbWUKKy8vIGNyaXRlcmlhIChlLmcuIG5vdCBkaXNhYmxlZCksIGJ1dCBmb3Igbm93IGFkZGluZyBjb3JlIHNlcnZpY2VzIG9uZSBhdCBhIHRpbWUKKworLy8gQkVHSU4gSU5URVJOQUwgT05MWSBNRVJHRSBHVUFSRCAoYWRkIHRoaW5ncyBoZXJlIGlmIGludGVybmFsIG9ubHksIG1vdmUgZG93biBsYXRlcikKKy8vIEVORCBJTlRFUk5BTCBPTkxZIE1FUkdFIEdVQVJECisKKy8vIEJFR0lOIEFPU1AgT05MWSAoYWRkIHRoaW5ncyBoZXJlIGlmIGFkZGluZyB0byBBT1NQKQorICAgICJsbWtkIiwKKyAgICAidWV2ZW50ZCIsCisgICAgImh3c2VydmljZW1hbmFnZXIiLAorICAgICJzZXJ2aWNlbWFuYWdlciIsCisgICAgInN5c3RlbV9zdXNwZW5kIgorLy8gRU5EIEFPU1AgT05MWQorCisgICAgICAgICAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9uCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgUHJpbnROYW1lKTsKZGlmZiAtLWdpdCBhL2luaXQvdGVzdF91cGdyYWRlX210ZS9BbmRyb2lkLmJwIGIvaW5pdC90ZXN0X3VwZ3JhZGVfbXRlL0FuZHJvaWQuYnAKaW5kZXggMWJmYzc2Yy4uZGZlYTMyNSAxMDA2NDQKLS0tIGEvaW5pdC90ZXN0X3VwZ3JhZGVfbXRlL0FuZHJvaWQuYnAKKysrIGIvaW5pdC90ZXN0X3VwZ3JhZGVfbXRlL0FuZHJvaWQuYnAKQEAgLTE3LDI1ICsxNywzNCBAQAogfQogCiBjY19iaW5hcnkgewotICBuYW1lOiAibXRlX3VwZ3JhZGVfdGVzdF9oZWxwZXIiLAotICBzcmNzOiBbIm10ZV91cGdyYWRlX3Rlc3RfaGVscGVyLmNwcCJdLAotICBzYW5pdGl6ZTogewotICAgIG1lbXRhZ19oZWFwOiB0cnVlLAotICAgIGRpYWc6IHsKLSAgICAgIG1lbXRhZ19oZWFwOiBmYWxzZSwKKyAgICBuYW1lOiAibXRlX3VwZ3JhZGVfdGVzdF9oZWxwZXIiLAorICAgIHNyY3M6IFsibXRlX3VwZ3JhZGVfdGVzdF9oZWxwZXIuY3BwIl0sCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWVtdGFnX2hlYXA6IHRydWUsCisgICAgICAgIGRpYWc6IHsKKyAgICAgICAgICAgIG1lbXRhZ19oZWFwOiBmYWxzZSwKKyAgICAgICAgfSwKICAgICB9LAotICB9LAotICBpbml0X3JjOiBbCi0gICAgIm10ZV91cGdyYWRlX3Rlc3QucmMiLAotICBdLAorICAgIGluaXRfcmM6IFsKKyAgICAgICAgIm10ZV91cGdyYWRlX3Rlc3QucmMiLAorICAgIF0sCiB9CiAKIGphdmFfdGVzdF9ob3N0IHsKICAgICBuYW1lOiAibXRlX3VwZ3JhZGVfdGVzdCIsCiAgICAgbGliczogWyJ0cmFkZWZlZCJdLAotICAgIHN0YXRpY19saWJzOiBbImZyYW1ld29ya3MtYmFzZS1ob3N0dXRpbHMiLCAiY3RzLWluc3RhbGwtbGliLWhvc3QiXSwKLSAgICBzcmNzOiAgWyJzcmMvKiovTXRlVXBncmFkZVRlc3QuamF2YSIsICI6bGlidG9tYnN0b25lX3Byb3RvLXNyYyJdLAotICAgIGRhdGE6IFsiOm10ZV91cGdyYWRlX3Rlc3RfaGVscGVyIiwgIm10ZV91cGdyYWRlX3Rlc3QucmMiIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MtYmFzZS1ob3N0dXRpbHMiLAorICAgICAgICAiY3RzLWluc3RhbGwtbGliLWhvc3QiLAorICAgIF0sCisgICAgc3JjczogWworICAgICAgICAic3JjLyoqL010ZVVwZ3JhZGVUZXN0LmphdmEiLAorICAgICAgICAiOmxpYnRvbWJzdG9uZV9wcm90by1zcmMiLAorICAgIF0sCisgICAgZGV2aWNlX2ZpcnN0X2RhdGE6IFsKKyAgICAgICAgIjptdGVfdXBncmFkZV90ZXN0X2hlbHBlciIsCisgICAgICAgICJtdGVfdXBncmFkZV90ZXN0LnJjIiwKKyAgICBdLAogICAgIHRlc3RfY29uZmlnOiAiQW5kcm9pZFRlc3QueG1sIiwKICAgICB0ZXN0X3N1aXRlczogWyJnZW5lcmFsLXRlc3RzIl0sCiB9CmRpZmYgLS1naXQgYS9pbml0L3Rlc3RfdXBncmFkZV9tdGUvQW5kcm9pZFRlc3QueG1sIGIvaW5pdC90ZXN0X3VwZ3JhZGVfbXRlL0FuZHJvaWRUZXN0LnhtbAppbmRleCBiODljZGU4Li5lMDhhZmMwIDEwMDY0NAotLS0gYS9pbml0L3Rlc3RfdXBncmFkZV9tdGUvQW5kcm9pZFRlc3QueG1sCisrKyBiL2luaXQvdGVzdF91cGdyYWRlX210ZS9BbmRyb2lkVGVzdC54bWwKQEAgLTIwLDExICsyMCwxMyBAQAogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUHVzaEZpbGVQcmVwYXJlciI+CiAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgogICAgICAgPG9wdGlvbiBuYW1lPSJyZW1vdW50LXN5c3RlbSIgdmFsdWU9InRydWUiIC8+Ci0gICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJtdGVfdXBncmFkZV90ZXN0LnJjLT4vc3lzdGVtL2V0Yy9pbml0L210ZV91cGdyYWRlX3Rlc3QucmMiIC8+Ci0gICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJtdGVfdXBncmFkZV90ZXN0X2hlbHBlci0+L3N5c3RlbS9iaW4vbXRlX3VwZ3JhZGVfdGVzdF9oZWxwZXIiIC8+Ci0gICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJtdGVfdXBncmFkZV90ZXN0X2hlbHBlci0+L2RhdGEvbG9jYWwvdG1wL2FwcF9wcm9jZXNzNjQiIC8+CisKKyAgICAgIDxvcHRpb24gbmFtZT0icHVzaC1maWxlIiBrZXk9Im10ZV91cGdyYWRlX3Rlc3QucmMiIHZhbHVlPSIvc3lzdGVtL2V0Yy9pbml0L210ZV91cGdyYWRlX3Rlc3QucmMiIC8+CisgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIga2V5PSJtdGVfdXBncmFkZV90ZXN0X2hlbHBlciIgdmFsdWU9Ii9zeXN0ZW0vYmluL210ZV91cGdyYWRlX3Rlc3RfaGVscGVyIiAvPgorICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiIGtleT0ibXRlX3VwZ3JhZGVfdGVzdF9oZWxwZXIiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvYXBwX3Byb2Nlc3M2NCIgLz4KKyAgICAgIDxvcHRpb24gbmFtZT0icG9zdC1wdXNoIiB2YWx1ZT0iY2htb2QgNjQ0IC9zeXN0ZW0vZXRjL2luaXQvbXRlX3VwZ3JhZGVfdGVzdC5yYyIgLz4KICAgICA8L3RhcmdldF9wcmVwYXJlcj4KICAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuSG9zdFRlc3QiID4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXIiIHZhbHVlPSJtdGVfdXBncmFkZV90ZXN0LmphciIgLz4KICAgICA8L3Rlc3Q+Ci08L2NvbmZpZ3VyYXRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvaW5pdC90ZXN0X3VwZ3JhZGVfbXRlL09XTkVSUyBiL2luaXQvdGVzdF91cGdyYWRlX210ZS9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk1ZDNjZgotLS0gL2Rldi9udWxsCisrKyBiL2luaXQvdGVzdF91cGdyYWRlX210ZS9PV05FUlMKQEAgLTAsMCArMSw0IEBACitmbWF5ZXJAZ29vZ2xlLmNvbQorCitldWdlbmlzQGdvb2dsZS5jb20KK3BjY0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9pbml0L3Rlc3RfdXBncmFkZV9tdGUvbXRlX3VwZ3JhZGVfdGVzdF9oZWxwZXIuY3BwIGIvaW5pdC90ZXN0X3VwZ3JhZGVfbXRlL210ZV91cGdyYWRlX3Rlc3RfaGVscGVyLmNwcAppbmRleCA2NzI4Y2M2Li5jNGIxNzVhIDEwMDY0NAotLS0gYS9pbml0L3Rlc3RfdXBncmFkZV9tdGUvbXRlX3VwZ3JhZGVfdGVzdF9oZWxwZXIuY3BwCisrKyBiL2luaXQvdGVzdF91cGdyYWRlX210ZS9tdGVfdXBncmFkZV90ZXN0X2hlbHBlci5jcHAKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KICNpbmNsdWRlIDx0aW1lLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CisKICNpbmNsdWRlIDxtZW1vcnk+CiAKIGludCBNYXliZURvd25ncmFkZSgpIHsKQEAgLTY1LDcgKzY2LDUgQEAKICAgICAvLyBUaGlzIGJpbmFyeSBnZXRzIHJ1biBieSBzcmMvY29tL2FuZHJvaWQvdGVzdHMvaW5pdC9NdGVVcGdyYWRlVGVzdC5qYXZhLCB3aGljaAogICAgIC8vIGFzc2VydHMgdGhhdCBpdCBjcmFzaGVzIGFzIGV4cGVjdGVkLgogICAgIGZbMTddID0gJ3gnOwotICAgIGNoYXIgYnVmWzFdOwotICAgIHJlYWQoMSwgYnVmLCAxKTsKICAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2luaXQvdGVzdF91dGlscy9zZXJ2aWNlX3V0aWxzLmNwcCBiL2luaXQvdGVzdF91dGlscy9zZXJ2aWNlX3V0aWxzLmNwcAppbmRleCA2NDI2ZWQ5Li43MDAyYTY3IDEwMDY0NAotLS0gYS9pbml0L3Rlc3RfdXRpbHMvc2VydmljZV91dGlscy5jcHAKKysrIGIvaW5pdC90ZXN0X3V0aWxzL3NlcnZpY2VfdXRpbHMuY3BwCkBAIC0zMCw4ICszMCw3IEBACiBhbmRyb2lkOjpiYXNlOjpSZXN1bHQ8U2VydmljZUludGVyZmFjZXNNYXA+IEdldE9uRGV2aWNlU2VydmljZUludGVyZmFjZXNNYXAoKSB7CiAgICAgU2VydmljZUxpc3QmIHNlcnZpY2VfbGlzdCA9IFNlcnZpY2VMaXN0OjpHZXRJbnN0YW5jZSgpOwogICAgIFBhcnNlciBwYXJzZXI7Ci0gICAgcGFyc2VyLkFkZFNlY3Rpb25QYXJzZXIoInNlcnZpY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8U2VydmljZVBhcnNlcj4oJnNlcnZpY2VfbGlzdCwgbnVsbHB0ciwgc3RkOjpudWxsb3B0KSk7CisgICAgcGFyc2VyLkFkZFNlY3Rpb25QYXJzZXIoInNlcnZpY2UiLCBzdGQ6Om1ha2VfdW5pcXVlPFNlcnZpY2VQYXJzZXI+KCZzZXJ2aWNlX2xpc3QsIG51bGxwdHIpKTsKICAgICBmb3IgKGNvbnN0IGF1dG8mIGxvY2F0aW9uIDogewogICAgICAgICAgICAgICAgICAiL2luaXQucmMiLAogICAgICAgICAgICAgICAgICAiL3N5c3RlbS9ldGMvaW5pdCIsCmRpZmYgLS1naXQgYS9pbml0L3VldmVudC5oIGIvaW5pdC91ZXZlbnQuaAppbmRleCBkYzM1ZmQ5Li5jOGNhNTJhIDEwMDY0NAotLS0gYS9pbml0L3VldmVudC5oCisrKyBiL2luaXQvdWV2ZW50LmgKQEAgLTI4LDYgKzI4LDcgQEAKICAgICBzdGQ6OnN0cmluZyBzdWJzeXN0ZW07CiAgICAgc3RkOjpzdHJpbmcgZmlybXdhcmU7CiAgICAgc3RkOjpzdHJpbmcgcGFydGl0aW9uX25hbWU7CisgICAgc3RkOjpzdHJpbmcgcGFydGl0aW9uX3V1aWQ7CiAgICAgc3RkOjpzdHJpbmcgZGV2aWNlX25hbWU7CiAgICAgc3RkOjpzdHJpbmcgbW9kYWxpYXM7CiAgICAgaW50IHBhcnRpdGlvbl9udW07CmRpZmYgLS1naXQgYS9pbml0L3VldmVudF9saXN0ZW5lci5jcHAgYi9pbml0L3VldmVudF9saXN0ZW5lci5jcHAKaW5kZXggNWRhNjc3Ny4uOTdmM2RlNiAxMDA2NDQKLS0tIGEvaW5pdC91ZXZlbnRfbGlzdGVuZXIuY3BwCisrKyBiL2luaXQvdWV2ZW50X2xpc3RlbmVyLmNwcApAQCAtNjYsNiArNjYsOSBAQAogICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKG1zZywgIlBBUlROQU1FPSIsIDkpKSB7CiAgICAgICAgICAgICBtc2cgKz0gOTsKICAgICAgICAgICAgIHVldmVudC0+cGFydGl0aW9uX25hbWUgPSBtc2c7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAobXNnLCAiUEFSVFVVSUQ9IiwgOSkpIHsKKyAgICAgICAgICAgIG1zZyArPSA5OworICAgICAgICAgICAgdWV2ZW50LT5wYXJ0aXRpb25fdXVpZCA9IG1zZzsKICAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcChtc2csICJERVZOQU1FPSIsIDgpKSB7CiAgICAgICAgICAgICBtc2cgKz0gODsKICAgICAgICAgICAgIHVldmVudC0+ZGV2aWNlX25hbWUgPSBtc2c7CkBAIC04Miw3ICs4NSw3IEBACiAgICAgaWYgKExPR19VRVZFTlRTKSB7CiAgICAgICAgIExPRyhJTkZPKSA8PCAiZXZlbnQgeyAnIiA8PCB1ZXZlbnQtPmFjdGlvbiA8PCAiJywgJyIgPDwgdWV2ZW50LT5wYXRoIDw8ICInLCAnIgogICAgICAgICAgICAgICAgICAgPDwgdWV2ZW50LT5zdWJzeXN0ZW0gPDwgIicsICciIDw8IHVldmVudC0+ZmlybXdhcmUgPDwgIicsICIgPDwgdWV2ZW50LT5tYWpvcgotICAgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCB1ZXZlbnQtPm1pbm9yIDw8ICIgfSI7CisgICAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHVldmVudC0+bWlub3IgPDwgIiwgIiA8PCB1ZXZlbnQtPnBhcnRpdGlvbl91dWlkIDw8ICIgfSI7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9pbml0L3VldmVudGQuY3BwIGIvaW5pdC91ZXZlbnRkLmNwcAppbmRleCA1ODZlMmNmLi4yODZlNDcyIDEwMDY0NAotLS0gYS9pbml0L3VldmVudGQuY3BwCisrKyBiL2luaXQvdWV2ZW50ZC5jcHAKQEAgLTI5Nyw2ICsyOTcsMTAgQEAKIH0KIAogc3RhdGljIFVldmVudGRDb25maWd1cmF0aW9uIEdldENvbmZpZ3VyYXRpb24oKSB7CisgICAgaWYgKElzTWljcm9kcm9pZCgpKSB7CisgICAgICAgIHJldHVybiBQYXJzZUNvbmZpZyh7Ii9zeXN0ZW0vZXRjL3VldmVudGQucmMiLCAiL3ZlbmRvci9ldGMvdWV2ZW50ZC5yYyJ9KTsKKyAgICB9CisKICAgICBhdXRvIGhhcmR3YXJlID0gYW5kcm9pZDo6YmFzZTo6R2V0UHJvcGVydHkoInJvLmhhcmR3YXJlIiwgIiIpOwogCiAgICAgc3RydWN0IExlZ2FjeVBhdGhJbmZvIHsKQEAgLTM0OSwxMCArMzUzLDI1IEBACiAKICAgICBhdXRvIHVldmVudGRfY29uZmlndXJhdGlvbiA9IEdldENvbmZpZ3VyYXRpb24oKTsKIAotICAgIHVldmVudF9oYW5kbGVycy5lbXBsYWNlX2JhY2soc3RkOjptYWtlX3VuaXF1ZTxEZXZpY2VIYW5kbGVyPigKKyAgICBVZXZlbnRMaXN0ZW5lciB1ZXZlbnRfbGlzdGVuZXIodWV2ZW50ZF9jb25maWd1cmF0aW9uLnVldmVudF9zb2NrZXRfcmN2YnVmX3NpemUpOworCisgICAgLy8gUmlnaHQgYWZ0ZXIgbWFraW5nIERldmljZUhhbmRsZXIsIHJlcGxheSBhbGwgZXZlbnRzIGxvb2tpbmcgZm9yIHdoaWNoCisgICAgLy8gYmxvY2sgZGV2aWNlIGhhcyB0aGUgYm9vdCBwYXJ0aXRpb24uIFRoaXMgbGV0cyB1cyBtYWtlIHN5bWxpbmtzCisgICAgLy8gZm9yIGFsbCBvZiB0aGUgb3RoZXIgcGFydGl0aW9ucyBvbiB0aGUgc2FtZSBkaXNrLiBOb3RlIHRoYXQgYnkgdGhlIHRpbWUKKyAgICAvLyB3ZSBnZXQgaGVyZSB3ZSBrbm93IHRoYXQgdGhlIGJvb3QgcGFydGl0aW9uIGhhcyBhbHJlYWR5IHNob3duIHVwIChpZgorICAgIC8vIHdlJ3JlIGxvb2tpbmcgZm9yIGl0KSBzbyBqdXN0IHJlZ2VuZXJhdGluZyBldmVudHMgaXMgZW5vdWdoIHRvIGtub3cKKyAgICAvLyB3ZSdsbCBzZWUgaXQuCisgICAgc3RkOjp1bmlxdWVfcHRyPERldmljZUhhbmRsZXI+IGRldmljZV9oYW5kbGVyID0gc3RkOjptYWtlX3VuaXF1ZTxEZXZpY2VIYW5kbGVyPigKICAgICAgICAgICAgIHN0ZDo6bW92ZSh1ZXZlbnRkX2NvbmZpZ3VyYXRpb24uZGV2X3Blcm1pc3Npb25zKSwKICAgICAgICAgICAgIHN0ZDo6bW92ZSh1ZXZlbnRkX2NvbmZpZ3VyYXRpb24uc3lzZnNfcGVybWlzc2lvbnMpLAotICAgICAgICAgICAgc3RkOjptb3ZlKHVldmVudGRfY29uZmlndXJhdGlvbi5zdWJzeXN0ZW1zKSwgYW5kcm9pZDo6ZnNfbWdyOjpHZXRCb290RGV2aWNlcygpLCB0cnVlKSk7CisgICAgICAgICAgICBzdGQ6Om1vdmUodWV2ZW50ZF9jb25maWd1cmF0aW9uLnN1YnN5c3RlbXMpLCBhbmRyb2lkOjpmc19tZ3I6OkdldEJvb3REZXZpY2VzKCksCisgICAgICAgICAgICBhbmRyb2lkOjpmc19tZ3I6OkdldEJvb3RQYXJ0VXVpZCgpLCB0cnVlKTsKKyAgICB1ZXZlbnRfbGlzdGVuZXIuUmVnZW5lcmF0ZVVldmVudHMoWyZdKGNvbnN0IFVldmVudCYgdWV2ZW50KSAtPiBMaXN0ZW5lckFjdGlvbiB7CisgICAgICAgIGJvb2wgdXVpZF9jaGVja19kb25lID0gZGV2aWNlX2hhbmRsZXItPkNoZWNrVWV2ZW50Rm9yQm9vdFBhcnRVdWlkKHVldmVudCk7CisgICAgICAgIHJldHVybiB1dWlkX2NoZWNrX2RvbmUgPyBMaXN0ZW5lckFjdGlvbjo6a1N0b3AgOiBMaXN0ZW5lckFjdGlvbjo6a0NvbnRpbnVlOworICAgIH0pOworCisgICAgdWV2ZW50X2hhbmRsZXJzLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoZGV2aWNlX2hhbmRsZXIpKTsKICAgICB1ZXZlbnRfaGFuZGxlcnMuZW1wbGFjZV9iYWNrKHN0ZDo6bWFrZV91bmlxdWU8RmlybXdhcmVIYW5kbGVyPigKICAgICAgICAgICAgIHN0ZDo6bW92ZSh1ZXZlbnRkX2NvbmZpZ3VyYXRpb24uZmlybXdhcmVfZGlyZWN0b3JpZXMpLAogICAgICAgICAgICAgc3RkOjptb3ZlKHVldmVudGRfY29uZmlndXJhdGlvbi5leHRlcm5hbF9maXJtd2FyZV9oYW5kbGVycykpKTsKQEAgLTM2MSw4ICszODAsNiBAQAogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gYmFzZV9wYXRocyA9IHsiL29kbS9saWIvbW9kdWxlcyIsICIvdmVuZG9yL2xpYi9tb2R1bGVzIn07CiAgICAgICAgIHVldmVudF9oYW5kbGVycy5lbXBsYWNlX2JhY2soc3RkOjptYWtlX3VuaXF1ZTxNb2RhbGlhc0hhbmRsZXI+KGJhc2VfcGF0aHMpKTsKICAgICB9Ci0gICAgVWV2ZW50TGlzdGVuZXIgdWV2ZW50X2xpc3RlbmVyKHVldmVudGRfY29uZmlndXJhdGlvbi51ZXZlbnRfc29ja2V0X3JjdmJ1Zl9zaXplKTsKLQogICAgIGlmICghYW5kcm9pZDo6YmFzZTo6R2V0Qm9vbFByb3BlcnR5KGtDb2xkQm9vdERvbmVQcm9wLCBmYWxzZSkpIHsKICAgICAgICAgQ29sZEJvb3QgY29sZF9ib290KHVldmVudF9saXN0ZW5lciwgdWV2ZW50X2hhbmRsZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdWV2ZW50ZF9jb25maWd1cmF0aW9uLmVuYWJsZV9wYXJhbGxlbF9yZXN0b3JlY29uLApkaWZmIC0tZ2l0IGEvaW5pdC91ZXZlbnRkX3BhcnNlci5jcHAgYi9pbml0L3VldmVudGRfcGFyc2VyLmNwcAppbmRleCBkMzQ2NzJlLi40Mzk1ZDg4IDEwMDY0NAotLS0gYS9pbml0L3VldmVudGRfcGFyc2VyLmNwcAorKysgYi9pbml0L3VldmVudGRfcGFyc2VyLmNwcApAQCAtMjE4LDYgKzIxOCwxMCBAQAogICAgICAgICBzdWJzeXN0ZW1fLmRldm5hbWVfc291cmNlXyA9IFN1YnN5c3RlbTo6REVWTkFNRV9VRVZFTlRfREVWUEFUSDsKICAgICAgICAgcmV0dXJuIHt9OwogICAgIH0KKyAgICBpZiAoYXJnc1sxXSA9PSAic3lzX25hbWUiKSB7CisgICAgICAgIHN1YnN5c3RlbV8uZGV2bmFtZV9zb3VyY2VfID0gU3Vic3lzdGVtOjpERVZOQU1FX1NZU19OQU1FOworICAgICAgICByZXR1cm4ge307CisgICAgfQogCiAgICAgcmV0dXJuIEVycm9yKCkgPDwgImludmFsaWQgZGV2bmFtZSAnIiA8PCBhcmdzWzFdIDw8ICInIjsKIH0KZGlmZiAtLWdpdCBhL2luaXQvdXRpbC5jcHAgYi9pbml0L3V0aWwuY3BwCmluZGV4IGJjOGVhNmUuLjM3NWU5MDUgMTAwNjQ0Ci0tLSBhL2luaXQvdXRpbC5jcHAKKysrIGIvaW5pdC91dGlsLmNwcApAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KICNpbmNsdWRlIDxzeXMvdW4uaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgogI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIApAQCAtNDIsNiArNDMsMTAgQEAKICNpbmNsdWRlIDxjdXRpbHMvc29ja2V0cy5oPgogI2luY2x1ZGUgPHNlbGludXgvYW5kcm9pZC5oPgogCisjaWYgZGVmaW5lZChfX0FORFJPSURfXykKKyNpbmNsdWRlIDxmc19tZ3IuaD4KKyNlbmRpZgorCiAjaWZkZWYgSU5JVF9GVUxMX1NPVVJDRVMKICNpbmNsdWRlIDxhbmRyb2lkL2FwaS1sZXZlbC5oPgogI2luY2x1ZGUgPHN5cy9zeXN0ZW1fcHJvcGVydGllcy5oPgpAQCAtNjAsOCArNjUsNiBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGluaXQgewogCi1jb25zdCBzdGQ6OnN0cmluZyBrRGVmYXVsdEFuZHJvaWREdERpcigiL3Byb2MvZGV2aWNlLXRyZWUvZmlybXdhcmUvYW5kcm9pZC8iKTsKLQogY29uc3Qgc3RkOjpzdHJpbmcga0RhdGFEaXJQcmVmaXgoIi9kYXRhLyIpOwogCiB2b2lkICgqdHJpZ2dlcl9zaHV0ZG93bikoY29uc3Qgc3RkOjpzdHJpbmcmIGNvbW1hbmQpID0gbnVsbHB0cjsKQEAgLTI0MCwzMyArMjQzLDYgQEAKICAgICByZXR1cm4gLTE7CiB9CiAKLXZvaWQgSW1wb3J0S2VybmVsQ21kbGluZShjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjpzdHJpbmcmLCBjb25zdCBzdGQ6OnN0cmluZyYpPiYgZm4pIHsKLSAgICBzdGQ6OnN0cmluZyBjbWRsaW5lOwotICAgIGFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmcoIi9wcm9jL2NtZGxpbmUiLCAmY21kbGluZSk7Ci0KLSAgICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogYW5kcm9pZDo6YmFzZTo6U3BsaXQoYW5kcm9pZDo6YmFzZTo6VHJpbShjbWRsaW5lKSwgIiAiKSkgewotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGllY2VzID0gYW5kcm9pZDo6YmFzZTo6U3BsaXQoZW50cnksICI9Iik7Ci0gICAgICAgIGlmIChwaWVjZXMuc2l6ZSgpID09IDIpIHsKLSAgICAgICAgICAgIGZuKHBpZWNlc1swXSwgcGllY2VzWzFdKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBJbXBvcnRCb290Y29uZmlnKGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnN0cmluZyYsIGNvbnN0IHN0ZDo6c3RyaW5nJik+JiBmbikgewotICAgIHN0ZDo6c3RyaW5nIGJvb3Rjb25maWc7Ci0gICAgYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZygiL3Byb2MvYm9vdGNvbmZpZyIsICZib290Y29uZmlnKTsKLQotICAgIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBhbmRyb2lkOjpiYXNlOjpTcGxpdChib290Y29uZmlnLCAiXG4iKSkgewotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGllY2VzID0gYW5kcm9pZDo6YmFzZTo6U3BsaXQoZW50cnksICI9Iik7Ci0gICAgICAgIGlmIChwaWVjZXMuc2l6ZSgpID09IDIpIHsKLSAgICAgICAgICAgIC8vIGdldCByaWQgb2YgdGhlIGV4dHJhIHNwYWNlIGJldHdlZW4gYSBsaXN0IG9mIHZhbHVlcyBhbmQgcmVtb3ZlIHRoZSBxdW90ZXMuCi0gICAgICAgICAgICBzdGQ6OnN0cmluZyB2YWx1ZSA9IGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1JlcGxhY2UocGllY2VzWzFdLCAiXCIsIFwiIiwgIiwiLCB0cnVlKTsKLSAgICAgICAgICAgIHZhbHVlLmVyYXNlKHN0ZDo6cmVtb3ZlKHZhbHVlLmJlZ2luKCksIHZhbHVlLmVuZCgpLCAnIicpLCB2YWx1ZS5lbmQoKSk7Ci0gICAgICAgICAgICBmbihhbmRyb2lkOjpiYXNlOjpUcmltKHBpZWNlc1swXSksIGFuZHJvaWQ6OmJhc2U6OlRyaW0odmFsdWUpKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQogYm9vbCBtYWtlX2Rpcihjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgbW9kZV90IG1vZGUpIHsKICAgICBzdGQ6OnN0cmluZyBzZWNvbnRleHQ7CiAgICAgaWYgKFNlbGFiZWxMb29rdXBGaWxlQ29udGV4dChwYXRoLCBtb2RlLCAmc2Vjb250ZXh0KSAmJiAhc2Vjb250ZXh0LmVtcHR5KCkpIHsKQEAgLTM3NSw0NSArMzUxLDE4IEBACiAgICAgcmV0dXJuIGRzdDsKIH0KIAotc3RhdGljIHN0ZDo6c3RyaW5nIGluaXRfYW5kcm9pZF9kdF9kaXIoKSB7Ci0gICAgLy8gVXNlIHRoZSBzdGFuZGFyZCBwcm9jZnMtYmFzZWQgcGF0aCBieSBkZWZhdWx0Ci0gICAgc3RkOjpzdHJpbmcgYW5kcm9pZF9kdF9kaXIgPSBrRGVmYXVsdEFuZHJvaWREdERpcjsKLSAgICAvLyBUaGUgcGxhdGZvcm0gbWF5IHNwZWNpZnkgYSBjdXN0b20gQW5kcm9pZCBEVCBwYXRoIGluIGtlcm5lbCBjbWRsaW5lCi0gICAgSW1wb3J0S2VybmVsQ21kbGluZShbJl0oY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gICAgICAgIGlmIChrZXkgPT0gImFuZHJvaWRib290LmFuZHJvaWRfZHRfZGlyIikgewotICAgICAgICAgICAgYW5kcm9pZF9kdF9kaXIgPSB2YWx1ZTsKLSAgICAgICAgfQotICAgIH0pOwotICAgIC8vIC4uT3IgYm9vdGNvbmZpZwotICAgIGlmIChhbmRyb2lkX2R0X2RpciA9PSBrRGVmYXVsdEFuZHJvaWREdERpcikgewotICAgICAgICBJbXBvcnRCb290Y29uZmlnKFsmXShjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChrZXkgPT0gImFuZHJvaWRib290LmFuZHJvaWRfZHRfZGlyIikgewotICAgICAgICAgICAgICAgIGFuZHJvaWRfZHRfZGlyID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIExPRyhJTkZPKSA8PCAiVXNpbmcgQW5kcm9pZCBEVCBkaXJlY3RvcnkgIiA8PCBhbmRyb2lkX2R0X2RpcjsKLSAgICByZXR1cm4gYW5kcm9pZF9kdF9kaXI7Ci19Ci0KLS8vIEZJWE1FOiBUaGUgc2FtZSBsb2dpYyBpcyBkdXBsaWNhdGVkIGluIHN5c3RlbS9jb3JlL2ZzX21nci8KLWNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfYW5kcm9pZF9kdF9kaXIoKSB7Ci0gICAgLy8gU2V0IG9uY2UgYW5kIHNhdmVzIHRpbWUgZm9yIHN1YnNlcXVlbnQgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbgotICAgIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQW5kcm9pZER0RGlyID0gaW5pdF9hbmRyb2lkX2R0X2RpcigpOwotICAgIHJldHVybiBrQW5kcm9pZER0RGlyOwotfQotCiAvLyBSZWFkcyB0aGUgY29udGVudCBvZiBkZXZpY2UgdHJlZSBmaWxlIHVuZGVyIHRoZSBwbGF0Zm9ybSdzIEFuZHJvaWQgRFQgZGlyZWN0b3J5LgogLy8gUmV0dXJucyB0cnVlIGlmIHRoZSByZWFkIGlzIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KIGJvb2wgcmVhZF9hbmRyb2lkX2R0X2ZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9wYXRoLCBzdGQ6OnN0cmluZyogZHRfY29udGVudCkgewotICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGZpbGVfbmFtZSA9IGdldF9hbmRyb2lkX2R0X2RpcigpICsgc3ViX3BhdGg7CisjaWYgZGVmaW5lZChfX0FORFJPSURfXykKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBmaWxlX25hbWUgPSBhbmRyb2lkOjpmc19tZ3I6OkdldEFuZHJvaWREdERpcigpICsgc3ViX3BhdGg7CiAgICAgaWYgKGFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmcoZmlsZV9uYW1lLCBkdF9jb250ZW50KSkgewogICAgICAgICBpZiAoIWR0X2NvbnRlbnQtPmVtcHR5KCkpIHsKICAgICAgICAgICAgIGR0X2NvbnRlbnQtPnBvcF9iYWNrKCk7ICAvLyBUcmltcyB0aGUgdHJhaWxpbmcgJ1wwJyBvdXQuCiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KKyNlbmRpZgogICAgIHJldHVybiBmYWxzZTsKIH0KIApAQCAtNjIxLDYgKzU3MCw4IEBACiAgICAgICAgICAgICB7Ii0tcmVjdXJzaXZlIiwgU0VMSU5VWF9BTkRST0lEX1JFU1RPUkVDT05fUkVDVVJTRX0sCiAgICAgICAgICAgICB7Ii0tc2tpcC1jZSIsIFNFTElOVVhfQU5EUk9JRF9SRVNUT1JFQ09OX1NLSVBDRX0sCiAgICAgICAgICAgICB7Ii0tY3Jvc3MtZmlsZXN5c3RlbXMiLCBTRUxJTlVYX0FORFJPSURfUkVTVE9SRUNPTl9DUk9TU19GSUxFU1lTVEVNU30sCisgICAgICAgICAgICB7Ii0tZm9yY2UiLCBTRUxJTlVYX0FORFJPSURfUkVTVE9SRUNPTl9GT1JDRX0sCisgICAgICAgICAgICB7Ii0tZGF0YS1kYXRhIiwgU0VMSU5VWF9BTkRST0lEX1JFU1RPUkVDT05fREFUQURBVEF9LAogICAgICAgICAgICAgezAsIDB9fTsKIAogICAgIGludCBmbGFnID0gMDsKQEAgLTczMiwxMSArNjgzLDYgQEAKICAgICBpc19kZWZhdWx0X21vdW50X25hbWVzcGFjZV9yZWFkeSA9IHRydWU7CiB9CiAKLWJvb2wgSXNNaWNyb2Ryb2lkKCkgewotICAgIHN0YXRpYyBib29sIGlzX21pY3JvZHJvaWQgPSBhbmRyb2lkOjpiYXNlOjpHZXRQcm9wZXJ0eSgicm8uaGFyZHdhcmUiLCAiIikgPT0gIm1pY3JvZHJvaWQiOwotICAgIHJldHVybiBpc19taWNyb2Ryb2lkOwotfQotCiBib29sIEhhczMyQml0QWJpKCkgewogICAgIHN0YXRpYyBib29sIGhhcyA9ICFhbmRyb2lkOjpiYXNlOjpHZXRQcm9wZXJ0eSgicm8ucHJvZHVjdC5jcHUuYWJpbGlzdDMyIiwgIiIpLmVtcHR5KCk7CiAgICAgcmV0dXJuIGhhczsKQEAgLTgwNCw1ICs3NTAsOTYgQEAKICAgICByZXR1cm4gZmlsdGVyZWRfY29uZmlnczsKIH0KIAorLy8gRm9ya3MsIGV4ZWN1dGVzIHRoZSBwcm92aWRlZCBwcm9ncmFtIGluIHRoZSBjaGlsZCwgYW5kIHdhaXRzIGZvciB0aGUgY29tcGxldGlvbiBpbiB0aGUgcGFyZW50LgorLy8gQ2hpbGQncyBzdGRlcnIgaXMgY2FwdHVyZWQgYW5kIGxvZ2dlZCB1c2luZyBMT0coRVJST1IpLgorYm9vbCBGb3JrRXhlY3ZlQW5kV2FpdEZvckNvbXBsZXRpb24oY29uc3QgY2hhciogZmlsZW5hbWUsIGNoYXIqIGNvbnN0IGFyZ3ZbXSkgeworICAgIC8vIENyZWF0ZSBhIHBpcGUgdXNlZCBmb3IgcmVkaXJlY3RpbmcgY2hpbGQgcHJvY2VzcydzIG91dHB1dC4KKyAgICAvLyAqIHBpcGVfZmRzWzBdIGlzIHRoZSBGRCB0aGUgcGFyZW50IHdpbGwgdXNlIGZvciByZWFkaW5nLgorICAgIC8vICogcGlwZV9mZHNbMV0gaXMgdGhlIEZEIHRoZSBjaGlsZCB3aWxsIHVzZSBmb3Igd3JpdGluZy4KKyAgICBpbnQgcGlwZV9mZHNbMl07CisgICAgaWYgKHBpcGUocGlwZV9mZHMpID09IC0xKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIHBpcGUiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcGlkX3QgY2hpbGRfcGlkID0gZm9yaygpOworICAgIGlmIChjaGlsZF9waWQgPT0gLTEpIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBmb3JrIGZvciAiIDw8IGZpbGVuYW1lOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGNoaWxkX3BpZCA9PSAwKSB7CisgICAgICAgIC8vIGZvcmsgc3VjY2VlZGVkIC0tIHRoaXMgaXMgZXhlY3V0aW5nIGluIHRoZSBjaGlsZCBwcm9jZXNzCisKKyAgICAgICAgLy8gQ2xvc2UgdGhlIHBpcGUgRkQgbm90IHVzZWQgYnkgdGhpcyBwcm9jZXNzCisgICAgICAgIGNsb3NlKHBpcGVfZmRzWzBdKTsKKworICAgICAgICAvLyBSZWRpcmVjdCBzdGRlcnIgdG8gdGhlIHBpcGUgRkQgcHJvdmlkZWQgYnkgdGhlIHBhcmVudAorICAgICAgICBpZiAoVEVNUF9GQUlMVVJFX1JFVFJZKGR1cDIocGlwZV9mZHNbMV0sIFNUREVSUl9GSUxFTk8pKSA9PSAtMSkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byByZWRpcmVjdCBzdGRlcnIgb2YgIiA8PCBmaWxlbmFtZTsKKyAgICAgICAgICAgIF9leGl0KDEyNyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgY2xvc2UocGlwZV9mZHNbMV0pOworCisgICAgICAgIGlmIChleGVjdihmaWxlbmFtZSwgYXJndikgPT0gLTEpIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZXhlY3ZlICIgPDwgZmlsZW5hbWU7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gVW5yZWFjaGFibGUgYmVjYXVzZSBleGVjdmUgd2lsbCBoYXZlIHN1Y2NlZWRlZCBhbmQgcmVwbGFjZWQgdGhpcyBjb2RlCisgICAgICAgIC8vIHdpdGggY2hpbGQgcHJvY2VzcydzIGNvZGUuCisgICAgICAgIF9leGl0KDEyNyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBmb3JrIHN1Y2NlZWRlZCAtLSB0aGlzIGlzIGV4ZWN1dGluZyBpbiB0aGUgb3JpZ2luYWwvcGFyZW50IHByb2Nlc3MKKworICAgICAgICAvLyBDbG9zZSB0aGUgcGlwZSBGRCBub3QgdXNlZCBieSB0aGlzIHByb2Nlc3MKKyAgICAgICAgY2xvc2UocGlwZV9mZHNbMV0pOworCisgICAgICAgIC8vIExvZyB0aGUgcmVkaXJlY3RlZCBvdXRwdXQgb2YgdGhlIGNoaWxkIHByb2Nlc3MuCisgICAgICAgIC8vIEl0J3MgdW5mb3J0dW5hdGUgdGhhdCB0aGVyZSdzIG5vIHN0YW5kYXJkIHdheSB0byBvYnRhaW4gYW4gaXN0cmVhbSBmb3IgYSBmaWxlIGRlc2NyaXB0b3IuCisgICAgICAgIC8vIEFzIGEgcmVzdWx0LCB3ZSdyZSBidWZmZXJpbmcgYWxsIG91dHB1dCBhbmQgbG9nZ2luZyBpdCBpbiBvbmUgZ28gYXQgdGhlIGVuZCBvZiB0aGUKKyAgICAgICAgLy8gaW52b2NhdGlvbiwgaW5zdGVhZCBvZiBsb2dnaW5nIGl0IGFzIGl0IGNvbWVzIGluLgorICAgICAgICBjb25zdCBpbnQgY2hpbGRfb3V0X2ZkID0gcGlwZV9mZHNbMF07CisgICAgICAgIHN0ZDo6c3RyaW5nIGNoaWxkX291dHB1dDsKKyAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpSZWFkRmRUb1N0cmluZyhjaGlsZF9vdXRfZmQsICZjaGlsZF9vdXRwdXQpKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGNhcHR1cmUgZnVsbCBvdXRwdXQgb2YgIiA8PCBmaWxlbmFtZTsKKyAgICAgICAgfQorICAgICAgICBjbG9zZShjaGlsZF9vdXRfZmQpOworICAgICAgICBpZiAoIWNoaWxkX291dHB1dC5lbXB0eSgpKSB7CisgICAgICAgICAgICAvLyBMb2cgY2FwdHVyZWQgb3V0cHV0LCBsaW5lIGJ5IGxpbmUsIGJlY2F1c2UgTE9HIGV4cGVjdHMgdG8gYmUgaW52b2tlZCBmb3IgZWFjaCBsaW5lCisgICAgICAgICAgICBzdGQ6OmlzdHJpbmdzdHJlYW0gaW4oY2hpbGRfb3V0cHV0KTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGxpbmU7CisgICAgICAgICAgICB3aGlsZSAoc3RkOjpnZXRsaW5lKGluLCBsaW5lKSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgZmlsZW5hbWUgPDwgIjogIiA8PCBsaW5lOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gV2FpdCBmb3IgY2hpbGQgdG8gdGVybWluYXRlCisgICAgICAgIGludCBzdGF0dXM7CisgICAgICAgIGlmIChURU1QX0ZBSUxVUkVfUkVUUlkod2FpdHBpZChjaGlsZF9waWQsICZzdGF0dXMsIDApKSAhPSBjaGlsZF9waWQpIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gd2FpdCBmb3IgIiA8PCBmaWxlbmFtZTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChXSUZFWElURUQoc3RhdHVzKSkgeworICAgICAgICAgICAgaW50IHN0YXR1c19jb2RlID0gV0VYSVRTVEFUVVMoc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXNfY29kZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgZmlsZW5hbWUgPDwgIiBleGl0ZWQgd2l0aCBzdGF0dXMgIiA8PCBzdGF0dXNfY29kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChXSUZTSUdOQUxFRChzdGF0dXMpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8IGZpbGVuYW1lIDw8ICIga2lsbGVkIGJ5IHNpZ25hbCAiIDw8IFdURVJNU0lHKHN0YXR1cyk7CisgICAgICAgIH0gZWxzZSBpZiAoV0lGU1RPUFBFRChzdGF0dXMpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8IGZpbGVuYW1lIDw8ICIgc3RvcHBlZCBieSBzaWduYWwgIiA8PCBXU1RPUFNJRyhzdGF0dXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAid2FpdHBpZCBmb3IgIiA8PCBmaWxlbmFtZSA8PCAiIHJldHVybmVkIHVuZXhwZWN0ZWQgc3RhdHVzOiAiIDw8IHN0YXR1czsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBpbml0CiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5pdC91dGlsLmggYi9pbml0L3V0aWwuaAppbmRleCBlNThlNzBlLi5hYTI0MTIzIDEwMDY0NAotLS0gYS9pbml0L3V0aWwuaAorKysgYi9pbml0L3V0aWwuaApAQCAtNTMsMTYgKzUzLDExIEBACiBSZXN1bHQ8dWlkX3Q+IERlY29kZVVpZChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSk7CiAKIGJvb2wgbWtkaXJfcmVjdXJzaXZlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRobmFtZSwgbW9kZV90IG1vZGUpOwotaW50IHdhaXRfZm9yX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIHN0ZDo6Y2hyb25vOjpuYW5vc2Vjb25kcyB0aW1lb3V0KTsKLXZvaWQgSW1wb3J0S2VybmVsQ21kbGluZShjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjpzdHJpbmcmLCBjb25zdCBzdGQ6OnN0cmluZyYpPiYpOwotdm9pZCBJbXBvcnRCb290Y29uZmlnKGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnN0cmluZyYsIGNvbnN0IHN0ZDo6c3RyaW5nJik+Jik7CitpbnQgd2FpdF9mb3JfZmlsZShjb25zdCBjaGFyKiBmaWxlbmFtZSwgc3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzIHRpbWVvdXQpOwogYm9vbCBtYWtlX2Rpcihjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgbW9kZV90IG1vZGUpOwogYm9vbCBpc19kaXIoY29uc3QgY2hhciogcGF0aG5hbWUpOwogUmVzdWx0PHN0ZDo6c3RyaW5nPiBFeHBhbmRQcm9wcyhjb25zdCBzdGQ6OnN0cmluZyYgc3JjKTsKIAotLy8gUmV0dXJucyB0aGUgcGxhdGZvcm0ncyBBbmRyb2lkIERUIGRpcmVjdG9yeSBhcyBzcGVjaWZpZWQgaW4gdGhlIGtlcm5lbCBjbWRsaW5lLgotLy8gSWYgdGhlIHBsYXRmb3JtIGRvZXMgbm90IGNvbmZpZ3VyZSBhIGN1c3RvbSBEVCBwYXRoLCByZXR1cm5zIHRoZSBzdGFuZGFyZCBvbmUgKGJhc2VkIGluIHByb2NmcykuCi1jb25zdCBzdGQ6OnN0cmluZyYgZ2V0X2FuZHJvaWRfZHRfZGlyKCk7CiAvLyBSZWFkcyBvciBjb21wYXJlcyB0aGUgY29udGVudCBvZiBkZXZpY2UgdHJlZSBmaWxlIHVuZGVyIHRoZSBwbGF0Zm9ybSdzIEFuZHJvaWQgRFQgZGlyZWN0b3J5LgogYm9vbCByZWFkX2FuZHJvaWRfZHRfZmlsZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX3BhdGgsIHN0ZDo6c3RyaW5nKiBkdF9jb250ZW50KTsKIGJvb2wgaXNfYW5kcm9pZF9kdF92YWx1ZV9leHBlY3RlZChjb25zdCBzdGQ6OnN0cmluZyYgc3ViX3BhdGgsIGNvbnN0IHN0ZDo6c3RyaW5nJiBleHBlY3RlZF9jb250ZW50KTsKQEAgLTEwNSw3ICsxMDAsMTQgQEAKIGJvb2wgSXNEZWZhdWx0TW91bnROYW1lc3BhY2VSZWFkeSgpOwogdm9pZCBTZXREZWZhdWx0TW91bnROYW1lc3BhY2VSZWFkeSgpOwogCi1ib29sIElzTWljcm9kcm9pZCgpOworaW5saW5lIGNvbnN0ZXhwciBib29sIElzTWljcm9kcm9pZCgpIHsKKyNpZmRlZiBNSUNST0RST0lECisgICAgcmV0dXJuIE1JQ1JPRFJPSUQ7CisjZWxzZQorICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorCiBib29sIEhhczMyQml0QWJpKCk7CiAKIHN0ZDo6c3RyaW5nIEdldEFwZXhOYW1lRnJvbUZpbGVOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKTsKQEAgLTExNSw1ICsxMTcsMTAgQEAKIC8vICgucmMgPT0gLjByYyBmb3IgcmFua2luZyBwdXJwb3NlcykKIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBGaWx0ZXJWZXJzaW9uZWRDb25maWdzKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY29uZmlncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjdGl2ZV9zZGspOworCisvLyBGb3JrcywgZXhlY3V0ZXMgdGhlIHByb3ZpZGVkIHByb2dyYW0gaW4gdGhlIGNoaWxkLCBhbmQgd2FpdHMgZm9yIHRoZSBjb21wbGV0aW9uIGluIHRoZSBwYXJlbnQuCisvLyBDaGlsZCdzIHN0ZGVyciBpcyBjYXB0dXJlZCBhbmQgbG9nZ2VkIHVzaW5nIExPRyhFUlJPUikuCitib29sIEZvcmtFeGVjdmVBbmRXYWl0Rm9yQ29tcGxldGlvbihjb25zdCBjaGFyKiBmaWxlbmFtZSwgY2hhciogY29uc3QgYXJndltdKTsKKwogfSAgLy8gbmFtZXNwYWNlIGluaXQKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9qYW5pdG9ycy9PV05FUlMgYi9qYW5pdG9ycy9PV05FUlMKaW5kZXggZDg3MTIwMS4uYzI1ZDllNCAxMDA2NDQKLS0tIGEvamFuaXRvcnMvT1dORVJTCisrKyBiL2phbml0b3JzL09XTkVSUwpAQCAtMyw1ICszLDUgQEAKIGNmZXJyaXNAZ29vZ2xlLmNvbQogZHdpbGxlbXNlbkBnb29nbGUuY29tCiBlbmhAZ29vZ2xlLmNvbQotbmFyYXlhbkBnb29nbGUuY29tCittYWNvQGdvb2dsZS5jb20KIHNhZGFmZWJyYWhpbWlAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbGliYmluZGVyd3JhcHBlci9BbmRyb2lkLmJwIGIvbGliYmluZGVyd3JhcHBlci9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWY0M2VlLi4wMDAwMDAwCi0tLSBhL2xpYmJpbmRlcndyYXBwZXIvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8vCi0vLyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLXBhY2thZ2UgewotICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJBbmRyb2lkLUFwYWNoZS0yLjAiXSwKLX0KLQotY2NfZGVmYXVsdHMgewotICAgIG5hbWU6ICJsaWJiaW5kZXJ3cmFwcGVyX2RlZmF1bHRzIiwKLQotICAgIGNmbGFnczogWwotICAgICAgICAiLVdhbGwiLAotICAgICAgICAiLVdlcnJvciIsCi0gICAgICAgICItV25vLXVudXNlZC1wYXJhbWV0ZXIiLAotCi0gICAgICAgIC8vIGZvciBsaWJjaHJvbWUKLSAgICAgICAgIi1Xbm8tc2lnbi1wcm9tbyIsCi0gICAgXSwKLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYmNocm9tZSIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgXSwKLX0KLQotLy8gbGliYmluZGVyd3JhcHBlciBzaGFyZWQgbGlicmFyeQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWNjX2xpYnJhcnlfc2hhcmVkIHsKLSAgICBuYW1lOiAibGliYmluZGVyd3JhcHBlciIsCi0gICAgZGVmYXVsdHM6IFsibGliYmluZGVyd3JhcHBlcl9kZWZhdWx0cyJdLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJiaW5kZXJfd3JhcHBlci5jYyIsCi0gICAgICAgICJyZWFsX2JpbmRlcl93cmFwcGVyLmNjIiwKLSAgICBdLAotfQotCi0vLyBsaWJiaW5kZXJ3cmFwcGVyX3Rlc3Rfc3VwcG9ydCBzdGF0aWMgbGlicmFyeQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGliYmluZGVyd3JhcHBlcl90ZXN0X3N1cHBvcnQiLAotICAgIGRlZmF1bHRzOiBbImxpYmJpbmRlcndyYXBwZXJfZGVmYXVsdHMiXSwKLQotICAgIHN0YXRpY19saWJzOiBbImxpYmd0ZXN0Il0sCi0gICAgc2hhcmVkX2xpYnM6IFsibGliYmluZGVyd3JhcHBlciJdLAotCi0gICAgc3JjczogWwotICAgICAgICAiYmluZGVyX3Rlc3RfYmFzZS5jYyIsCi0gICAgICAgICJzdHViX2JpbmRlcl93cmFwcGVyLmNjIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvbGliYmluZGVyd3JhcHBlci9iaW5kZXJfdGVzdF9iYXNlLmNjIGIvbGliYmluZGVyd3JhcHBlci9iaW5kZXJfdGVzdF9iYXNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjkzYTA0Li4wMDAwMDAwCi0tLSBhL2xpYmJpbmRlcndyYXBwZXIvYmluZGVyX3Rlc3RfYmFzZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8YmluZGVyd3JhcHBlci9iaW5kZXJfdGVzdF9iYXNlLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXJ3cmFwcGVyL2JpbmRlcl93cmFwcGVyLmg+Ci0jaW5jbHVkZSA8YmluZGVyd3JhcHBlci9zdHViX2JpbmRlcl93cmFwcGVyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotQmluZGVyVGVzdEJhc2U6OkJpbmRlclRlc3RCYXNlKCkgOiBiaW5kZXJfd3JhcHBlcl8obmV3IFN0dWJCaW5kZXJXcmFwcGVyKCkpIHsKLSAgLy8gUGFzcyBvd25lcnNoaXAuCi0gIEJpbmRlcldyYXBwZXI6OkluaXRGb3JUZXN0aW5nKGJpbmRlcl93cmFwcGVyXyk7Ci19Ci0KLUJpbmRlclRlc3RCYXNlOjp+QmluZGVyVGVzdEJhc2UoKSB7Ci0gIEJpbmRlcldyYXBwZXI6OkRlc3Ryb3koKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYmJpbmRlcndyYXBwZXIvYmluZGVyX3dyYXBwZXIuY2MgYi9saWJiaW5kZXJ3cmFwcGVyL2JpbmRlcl93cmFwcGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTljMWRmLi4wMDAwMDAwCi0tLSBhL2xpYmJpbmRlcndyYXBwZXIvYmluZGVyX3dyYXBwZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGJpbmRlcndyYXBwZXIvYmluZGVyX3dyYXBwZXIuaD4KLQotI2luY2x1ZGUgPGJhc2UvbG9nZ2luZy5oPgotCi0jaW5jbHVkZSAicmVhbF9iaW5kZXJfd3JhcHBlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIFNpbmdsZXRvbiBpbnN0YW5jZS4KLUJpbmRlcldyYXBwZXIqIEJpbmRlcldyYXBwZXI6Omluc3RhbmNlXyA9IG51bGxwdHI7Ci0KLS8vIHN0YXRpYwotdm9pZCBCaW5kZXJXcmFwcGVyOjpDcmVhdGUoKSB7Ci0gIENIRUNLKCFpbnN0YW5jZV8pIDw8ICJBbHJlYWR5IGluaXRpYWxpemVkOyBtaXNzaW5nIGNhbGwgdG8gRGVzdHJveSgpPyI7Ci0gIGluc3RhbmNlXyA9IG5ldyBSZWFsQmluZGVyV3JhcHBlcigpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQmluZGVyV3JhcHBlcjo6SW5pdEZvclRlc3RpbmcoQmluZGVyV3JhcHBlciogd3JhcHBlcikgewotICBDSEVDSyghaW5zdGFuY2VfKSA8PCAiQWxyZWFkeSBpbml0aWFsaXplZDsgbWlzc2luZyBjYWxsIHRvIERlc3Ryb3koKT8iOwotICBpbnN0YW5jZV8gPSB3cmFwcGVyOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQmluZGVyV3JhcHBlcjo6RGVzdHJveSgpIHsKLSAgQ0hFQ0soaW5zdGFuY2VfKSA8PCAiTm90IGluaXRpYWxpemVkOyBtaXNzaW5nIGNhbGwgdG8gQ3JlYXRlKCk/IjsKLSAgZGVsZXRlIGluc3RhbmNlXzsKLSAgaW5zdGFuY2VfID0gbnVsbHB0cjsKLX0KLQotLy8gc3RhdGljCi1CaW5kZXJXcmFwcGVyKiBCaW5kZXJXcmFwcGVyOjpHZXQoKSB7Ci0gIENIRUNLKGluc3RhbmNlXykgPDwgIk5vdCBpbml0aWFsaXplZDsgbWlzc2luZyBjYWxsIHRvIENyZWF0ZSgpPyI7Ci0gIHJldHVybiBpbnN0YW5jZV87Ci19Ci0KLS8vIHN0YXRpYwotQmluZGVyV3JhcHBlciogQmluZGVyV3JhcHBlcjo6R2V0T3JDcmVhdGVJbnN0YW5jZSgpIHsKLSAgaWYgKCFpbnN0YW5jZV8pCi0gICAgaW5zdGFuY2VfID0gbmV3IFJlYWxCaW5kZXJXcmFwcGVyKCk7Ci0gIHJldHVybiBpbnN0YW5jZV87Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJiaW5kZXJ3cmFwcGVyL2luY2x1ZGUvYmluZGVyd3JhcHBlci9iaW5kZXJfdGVzdF9iYXNlLmggYi9saWJiaW5kZXJ3cmFwcGVyL2luY2x1ZGUvYmluZGVyd3JhcHBlci9iaW5kZXJfdGVzdF9iYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NTQzZGUuLjAwMDAwMDAKLS0tIGEvbGliYmluZGVyd3JhcHBlci9pbmNsdWRlL2JpbmRlcndyYXBwZXIvYmluZGVyX3Rlc3RfYmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgU1lTVEVNX0NPUkVfSU5DTFVERV9CSU5ERVJXUkFQUEVSX0JJTkRFUl9URVNUX0JBU0VfSF8KLSNkZWZpbmUgU1lTVEVNX0NPUkVfSU5DTFVERV9CSU5ERVJXUkFQUEVSX0JJTkRFUl9URVNUX0JBU0VfSF8KLQotI2luY2x1ZGUgPGJhc2UvbWFjcm9zLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBTdHViQmluZGVyV3JhcHBlcjsKLQotLy8gQ2xhc3MgdGhhdCBjYW4gYmUgaW5oZXJpdGVkIGZyb20gKG9yIGFsaWFzZWQgdmlhIHR5cGVkZWYvdXNpbmcpIHdoZW4gd3JpdGluZwotLy8gdGVzdHMgdGhhdCB1c2UgU3R1YkJpbmRlck1hbmFnZXIuCi1jbGFzcyBCaW5kZXJUZXN0QmFzZSA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgQmluZGVyVGVzdEJhc2UoKTsKLSAgfkJpbmRlclRlc3RCYXNlKCkgb3ZlcnJpZGU7Ci0KLSAgU3R1YkJpbmRlcldyYXBwZXIqIGJpbmRlcl93cmFwcGVyKCkgeyByZXR1cm4gYmluZGVyX3dyYXBwZXJfOyB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIFN0dWJCaW5kZXJXcmFwcGVyKiBiaW5kZXJfd3JhcHBlcl87ICAvLyBOb3Qgb3duZWQuCi0KLSBwcml2YXRlOgotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQmluZGVyVGVzdEJhc2UpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBTWVNURU1fQ09SRV9JTkNMVURFX0JJTkRFUldSQVBQRVJfQklOREVSX1RFU1RfQkFTRV9IXwpkaWZmIC0tZ2l0IGEvbGliYmluZGVyd3JhcHBlci9pbmNsdWRlL2JpbmRlcndyYXBwZXIvYmluZGVyX3dyYXBwZXIuaCBiL2xpYmJpbmRlcndyYXBwZXIvaW5jbHVkZS9iaW5kZXJ3cmFwcGVyL2JpbmRlcl93cmFwcGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMDRiZmYuLjAwMDAwMDAKLS0tIGEvbGliYmluZGVyd3JhcHBlci9pbmNsdWRlL2JpbmRlcndyYXBwZXIvYmluZGVyX3dyYXBwZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFNZU1RFTV9DT1JFX0lOQ0xVREVfQklOREVSV1JBUFBFUl9CSU5ERVJfV1JBUFBFUl9IXwotI2RlZmluZSBTWVNURU1fQ09SRV9JTkNMVURFX0JJTkRFUldSQVBQRVJfQklOREVSX1dSQVBQRVJfSF8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSA8YmFzZS9jYWxsYmFjay5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBCQmluZGVyOwotY2xhc3MgSUJpbmRlcjsKLQotLy8gV3JhcHMgbGliYmluZGVyIHRvIG1ha2UgaXQgdGVzdGFibGUuCi0vLyBOT1RFOiBTdGF0aWMgbWV0aG9kcyBvZiB0aGlzIGNsYXNzIGFyZSBub3QgdGhyZWFkLXNhZmUuCi1jbGFzcyBCaW5kZXJXcmFwcGVyIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfkJpbmRlcldyYXBwZXIoKSB7fQotCi0gIC8vIENyZWF0ZXMgYW5kIGluaXRpYWxpemVzIHRoZSBzaW5nbGV0b24gKHVzaW5nIGEgd3JhcHBlciB0aGF0IGNvbW11bmljYXRlcwotICAvLyB3aXRoIHRoZSByZWFsIGJpbmRlciBzeXN0ZW0pLgotICBzdGF0aWMgdm9pZCBDcmVhdGUoKTsKLQotICAvLyBJbml0aWFsaXplcyB8d3JhcHBlcnwgYXMgdGhlIHNpbmdsZXRvbiwgdGFraW5nIG93bmVyc2hpcCBvZiBpdC4gVGVzdHMgdGhhdAotICAvLyB3YW50IHRvIGluamVjdCB0aGVpciBvd24gd3JhcHBlcnMgc2hvdWxkIGNhbGwgdGhpcyBpbnN0ZWFkIG9mIENyZWF0ZSgpLgotICBzdGF0aWMgdm9pZCBJbml0Rm9yVGVzdGluZyhCaW5kZXJXcmFwcGVyKiB3cmFwcGVyKTsKLQotICAvLyBEZXN0cm95cyB0aGUgc2luZ2xldG9uLiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyBDcmVhdGUoKSBvcgotICAvLyBJbml0Rm9yVGVzdGluZygpIGEgc2Vjb25kIHRpbWUuCi0gIHN0YXRpYyB2b2lkIERlc3Ryb3koKTsKLQotICAvLyBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UgcHJldmlvdXNseSBjcmVhdGVkIGJ5IENyZWF0ZSgpIG9yIHNldCBieQotICAvLyBJbml0Rm9yVGVzdGluZygpLgotICBzdGF0aWMgQmluZGVyV3JhcHBlciogR2V0KCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIGlmIGl0IHdhcyBwcmV2aW91c2x5IGNyZWF0ZWQgYnkgQ3JlYXRlKCkgb3IKLSAgLy8gc2V0IGJ5IEluaXRGb3JUZXN0aW5nKCksIG9yIGNyZWF0ZXMgYSBuZXcgb25lIGJ5IGNhbGxpbmcgQ3JlYXRlKCkuCi0gIHN0YXRpYyBCaW5kZXJXcmFwcGVyKiBHZXRPckNyZWF0ZUluc3RhbmNlKCk7Ci0KLSAgLy8gR2V0cyB0aGUgYmluZGVyIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIHNlcnZpY2UgaWRlbnRpZmllZCBieQotICAvLyB8c2VydmljZV9uYW1lfCwgcmV0dXJuaW5nIG51bGwgaW1tZWRpYXRlbHkgaWYgaXQgZG9lc24ndCBleGlzdC4KLSAgdmlydHVhbCBzcDxJQmluZGVyPiBHZXRTZXJ2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJ2aWNlX25hbWUpID0gMDsKLQotICAvLyBSZWdpc3RlcnMgfGJpbmRlcnwgYXMgfHNlcnZpY2VfbmFtZXwgd2l0aCB0aGUgc2VydmljZSBtYW5hZ2VyLgotICB2aXJ0dWFsIGJvb2wgUmVnaXN0ZXJTZXJ2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJ2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUJpbmRlcj4mIGJpbmRlcikgPSAwOwotCi0gIC8vIENyZWF0ZXMgYSBsb2NhbCBiaW5kZXIgb2JqZWN0LgotICB2aXJ0dWFsIHNwPEJCaW5kZXI+IENyZWF0ZUxvY2FsQmluZGVyKCkgPSAwOwotCi0gIC8vIFJlZ2lzdGVycyB8Y2FsbGJhY2t8IHRvIGJlIGludm9rZWQgd2hlbiB8YmluZGVyfCBkaWVzLiBJZiBhbm90aGVyIGNhbGxiYWNrCi0gIC8vIGlzIGN1cnJlbnRseSByZWdpc3RlcmVkIGZvciB8YmluZGVyfCwgaXQgd2lsbCBiZSByZXBsYWNlZC4KLSAgdmlydHVhbCBib29sIFJlZ2lzdGVyRm9yRGVhdGhOb3RpZmljYXRpb25zKAotICAgICAgY29uc3Qgc3A8SUJpbmRlcj4mIGJpbmRlciwKLSAgICAgIGNvbnN0IDo6YmFzZTo6Q2xvc3VyZSYgY2FsbGJhY2spID0gMDsKLQotICAvLyBVbnJlZ2lzdGVycyB0aGUgY2FsbGJhY2ssIGlmIGFueSwgZm9yIHxiaW5kZXJ8LgotICB2aXJ0dWFsIGJvb2wgVW5yZWdpc3RlckZvckRlYXRoTm90aWZpY2F0aW9ucyhjb25zdCBzcDxJQmluZGVyPiYgYmluZGVyKSA9IDA7Ci0KLSAgLy8gV2hlbiBjYWxsZWQgd2hpbGUgaW4gYSB0cmFuc2FjdGlvbiwgcmV0dXJucyB0aGUgY2FsbGVyJ3MgVUlEIG9yIFBJRC4KLSAgdmlydHVhbCB1aWRfdCBHZXRDYWxsaW5nVWlkKCkgPSAwOwotICB2aXJ0dWFsIHBpZF90IEdldENhbGxpbmdQaWQoKSA9IDA7Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgQmluZGVyV3JhcHBlciogaW5zdGFuY2VfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBTWVNURU1fQ09SRV9JTkNMVURFX0JJTkRFUldSQVBQRVJfQklOREVSX1dSQVBQRVJfSF8KZGlmZiAtLWdpdCBhL2xpYmJpbmRlcndyYXBwZXIvaW5jbHVkZS9iaW5kZXJ3cmFwcGVyL3N0dWJfYmluZGVyX3dyYXBwZXIuaCBiL2xpYmJpbmRlcndyYXBwZXIvaW5jbHVkZS9iaW5kZXJ3cmFwcGVyL3N0dWJfYmluZGVyX3dyYXBwZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ0NTc4ZS4uMDAwMDAwMAotLS0gYS9saWJiaW5kZXJ3cmFwcGVyL2luY2x1ZGUvYmluZGVyd3JhcHBlci9zdHViX2JpbmRlcl93cmFwcGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgU1lTVEVNX0NPUkVfSU5DTFVERV9CSU5ERVJXUkFQUEVSX1NUVUJfQklOREVSX1dSQVBQRVJfSF8KLSNkZWZpbmUgU1lTVEVNX0NPUkVfSU5DTFVERV9CSU5ERVJXUkFQUEVSX1NUVUJfQklOREVSX1dSQVBQRVJfSF8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8YmFzZS9tYWNyb3MuaD4KLSNpbmNsdWRlIDxiaW5kZXIvQmluZGVyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lCaW5kZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXJ3cmFwcGVyL2JpbmRlcl93cmFwcGVyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gU3R1YiBpbXBsZW1lbnRhdGlvbiBvZiBCaW5kZXJXcmFwcGVyIGZvciB0ZXN0aW5nLgotLy8KLS8vIEV4YW1wbGUgdXNhZ2U6Ci0vLwotLy8gRmlyc3QsIGFzc3VtaW5nIGEgYmFzZSBJRm9vIGJpbmRlciBpbnRlcmZhY2UsIGNyZWF0ZSBhIHN0dWIgY2xhc3MgdGhhdAotLy8gZGVyaXZlcyBmcm9tIEJuRm9vIHRvIGltcGxlbWVudCB0aGUgcmVjZWl2ZXIgc2lkZSBvZiB0aGUgY29tbXVuaWNhdGlvbjoKLS8vCi0vLyAgIGNsYXNzIFN0dWJGb28gOiBwdWJsaWMgQm5Gb28gewotLy8gICAgcHVibGljOgotLy8gICAgIC4uLgotLy8gICAgIHN0YXR1c190IGRvU29tZXRoaW5nKGludCBhcmcpIG92ZXJyaWRlIHsKLS8vICAgICAgIC8vIGUuZy4gc2F2ZSBwYXNzZWQtaW4gdmFsdWUgZm9yIGxhdGVyIGluc3BlY3Rpb24gYnkgdGVzdHMuCi0vLyAgICAgICByZXR1cm4gT0s7Ci0vLyAgICAgfQotLy8gICB9OwotLy8KLS8vIE5leHQsIGZyb20geW91ciB0ZXN0IGNvZGUsIGluamVjdCBhIFN0dWJCaW5kZXJNYW5hZ2VyIGVpdGhlciBkaXJlY3RseSBvciBieQotLy8gaW5oZXJpdGluZyBmcm9tIHRoZSBCaW5kZXJUZXN0QmFzZSBjbGFzczoKLS8vCi0vLyAgIFN0dWJCaW5kZXJXcmFwcGVyKiB3cmFwcGVyID0gbmV3IFN0dWJCaW5kZXJXcmFwcGVyKCk7Ci0vLyAgIEJpbmRlcldyYXBwZXI6OkluaXRGb3JUZXN0aW5nKHdyYXBwZXIpOyAgLy8gVGFrZXMgb3duZXJzaGlwLgotLy8KLS8vIEFsc28gZnJvbSB5b3VyIHRlc3QsIGNyZWF0ZSBhIFN0dWJGb28gYW5kIHJlZ2lzdGVyIGl0IHdpdGggdGhlIHdyYXBwZXI6Ci0vLwotLy8gICBTdHViRm9vKiBmb28gPSBuZXcgU3R1YkZvbygpOwotLy8gICBzcDxJQmluZGVyPiBiaW5kZXIoZm9vKTsKLS8vICAgd3JhcHBlci0+U2V0QmluZGVyRm9yU2VydmljZSgiZm9vIiwgYmluZGVyKTsKLS8vCi0vLyBUaGUgY29kZSBiZWluZyB0ZXN0ZWQgY2FuIG5vdyB1c2UgdGhlIHdyYXBwZXIgdG8gZ2V0IHRoZSBzdHViIGFuZCBjYWxsIGl0OgotLy8KLS8vICAgc3A8SUJpbmRlcj4gYmluZGVyID0gQmluZGVyV3JhcHBlcjo6R2V0KCktPkdldFNlcnZpY2UoImZvbyIpOwotLy8gICBDSEVDSyhiaW5kZXIuZ2V0KCkpOwotLy8gICBzcDxJRm9vPiBmb28gPSBpbnRlcmZhY2VfY2FzdDxJRm9vPihiaW5kZXIpOwotLy8gICBDSEVDS19FUShmb28tPmRvU29tZXRoaW5nKDMpLCBPSyk7Ci0vLwotLy8gVG8gY3JlYXRlIGEgbG9jYWwgQkJpbmRlciBvYmplY3QsIHByb2R1Y3Rpb24gY29kZSBjYW4gY2FsbAotLy8gQ3JlYXRlTG9jYWxCaW5kZXIoKS4gVGhlbiwgYSB0ZXN0IGNhbiBnZXQgdGhlIEJCaW5kZXIncyBhZGRyZXNzIHZpYQotLy8gbG9jYWxfYmluZGVycygpIHRvIGNoZWNrIHRoYXQgdGhleSdyZSBwYXNzZWQgYXMgZXhwZWN0ZWQgaW4gYmluZGVyIGNhbGxzLgotLy8KLWNsYXNzIFN0dWJCaW5kZXJXcmFwcGVyIDogcHVibGljIEJpbmRlcldyYXBwZXIgewotIHB1YmxpYzoKLSAgU3R1YkJpbmRlcldyYXBwZXIoKTsKLSAgflN0dWJCaW5kZXJXcmFwcGVyKCkgb3ZlcnJpZGU7Ci0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8QkJpbmRlcj4+JiBsb2NhbF9iaW5kZXJzKCkgY29uc3QgewotICAgIHJldHVybiBsb2NhbF9iaW5kZXJzXzsKLSAgfQotICB2b2lkIGNsZWFyX2xvY2FsX2JpbmRlcnMoKSB7IGxvY2FsX2JpbmRlcnNfLmNsZWFyKCk7IH0KLQotICB2b2lkIHNldF9jYWxsaW5nX3VpZCh1aWRfdCB1aWQpIHsgY2FsbGluZ191aWRfID0gdWlkOyB9Ci0gIHZvaWQgc2V0X2NhbGxpbmdfcGlkKHBpZF90IHBpZCkgeyBjYWxsaW5nX3BpZF8gPSBwaWQ7IH0KLQotICAvLyBTZXRzIHRoZSBiaW5kZXIgdG8gcmV0dXJuIHdoZW4gfHNlcnZpY2VfbmFtZXwgaXMgcGFzc2VkIHRvIEdldFNlcnZpY2UoKSBvcgotICAvLyBXYWl0Rm9yU2VydmljZSgpLgotICB2b2lkIFNldEJpbmRlckZvclNlcnZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHNlcnZpY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiBiaW5kZXIpOwotCi0gIC8vIFJldHVybnMgdGhlIGJpbmRlciBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgZm9yIHxzZXJ2aWNlX25hbWV8IHZpYQotICAvLyBSZWdpc3RlclNlcnZpY2UoKSwgb3IgbnVsbCBpZiB0aGUgc2VydmljZSBoYXNuJ3QgYmVlbiByZWdpc3RlcmVkLgotICBzcDxJQmluZGVyPiBHZXRSZWdpc3RlcmVkU2VydmljZShjb25zdCBzdGQ6OnN0cmluZyYgc2VydmljZV9uYW1lKSBjb25zdDsKLQotICAvLyBSdW4gdGhlIGNhbGJhY2sgaW4gfGRlYXRoX2NhbGxiYWNrc198IGNvcnJlc3BvbmRpbmcgdG8gfGJpbmRlcnwuCi0gIHZvaWQgTm90aWZ5QWJvdXRCaW5kZXJEZWF0aChjb25zdCBzcDxJQmluZGVyPiYgYmluZGVyKTsKLQotICAvLyBCaW5kZXJXcmFwcGVyOgotICBzcDxJQmluZGVyPiBHZXRTZXJ2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJ2aWNlX25hbWUpIG92ZXJyaWRlOwotICBib29sIFJlZ2lzdGVyU2VydmljZShjb25zdCBzdGQ6OnN0cmluZyYgc2VydmljZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQmluZGVyPiYgYmluZGVyKSBvdmVycmlkZTsKLSAgc3A8QkJpbmRlcj4gQ3JlYXRlTG9jYWxCaW5kZXIoKSBvdmVycmlkZTsKLSAgYm9vbCBSZWdpc3RlckZvckRlYXRoTm90aWZpY2F0aW9ucyhjb25zdCBzcDxJQmluZGVyPiYgYmluZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6YmFzZTo6Q2xvc3VyZSYgY2FsbGJhY2spIG92ZXJyaWRlOwotICBib29sIFVucmVnaXN0ZXJGb3JEZWF0aE5vdGlmaWNhdGlvbnMoY29uc3Qgc3A8SUJpbmRlcj4mIGJpbmRlcikgb3ZlcnJpZGU7Ci0gIHVpZF90IEdldENhbGxpbmdVaWQoKSBvdmVycmlkZTsKLSAgcGlkX3QgR2V0Q2FsbGluZ1BpZCgpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgdXNpbmcgU2VydmljZU1hcCA9IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzcDxJQmluZGVyPj47Ci0KLSAgLy8gTWFwIGZyb20gc2VydmljZSBuYW1lIHRvIGFzc29jaWF0ZWQgYmluZGVyIGhhbmRsZS4gVXNlZCBieSBHZXRTZXJ2aWNlKCkgYW5kCi0gIC8vIFdhaXRGb3JTZXJ2aWNlKCkuCi0gIFNlcnZpY2VNYXAgc2VydmljZXNfdG9fcmV0dXJuXzsKLQotICAvLyBNYXAgZnJvbSBzZXJ2aWNlIG5hbWUgdG8gYXNzb2NpYXRlZCBiaW5kZXIgaGFuZGxlLiBVcGRhdGVkIGJ5Ci0gIC8vIFJlZ2lzdGVyU2VydmljZSgpLgotICBTZXJ2aWNlTWFwIHJlZ2lzdGVyZWRfc2VydmljZXNfOwotCi0gIC8vIExvY2FsIGJpbmRlcnMgcmV0dXJuZWQgYnkgQ3JlYXRlTG9jYWxCaW5kZXIoKS4KLSAgc3RkOjp2ZWN0b3I8c3A8QkJpbmRlcj4+IGxvY2FsX2JpbmRlcnNfOwotCi0gIC8vIE1hcCBmcm9tIGJpbmRlciBoYW5kbGUgdG8gdGhlIGNhbGxiYWNrIHRoYXQgc2hvdWxkIGJlIGludm9rZWQgb24gYmluZGVyCi0gIC8vIGRlYXRoLgotICBzdGQ6Om1hcDxzcDxJQmluZGVyPiwgOjpiYXNlOjpDbG9zdXJlPiBkZWF0aF9jYWxsYmFja3NfOwotCi0gIC8vIFZhbHVlcyB0byByZXR1cm4gZnJvbSBHZXRDYWxsaW5nVWlkKCkgYW5kIEdldENhbGxpbmdQaWQoKTsKLSAgdWlkX3QgY2FsbGluZ191aWRfOwotICBwaWRfdCBjYWxsaW5nX3BpZF87Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFN0dWJCaW5kZXJXcmFwcGVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gU1lTVEVNX0NPUkVfSU5DTFVERV9CSU5ERVJXUkFQUEVSX1NUVUJfQklOREVSX1dSQVBQRVJfSF8KZGlmZiAtLWdpdCBhL2xpYmJpbmRlcndyYXBwZXIvcmVhbF9iaW5kZXJfd3JhcHBlci5jYyBiL2xpYmJpbmRlcndyYXBwZXIvcmVhbF9iaW5kZXJfd3JhcHBlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkzZjE4My4uMDAwMDAwMAotLS0gYS9saWJiaW5kZXJ3cmFwcGVyL3JlYWxfYmluZGVyX3dyYXBwZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJyZWFsX2JpbmRlcl93cmFwcGVyLmgiCi0KLSNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxiaW5kZXIvQmluZGVyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lCaW5kZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gQ2xhc3MgdGhhdCBoYW5kbGVzIGJpbmRlciBkZWF0aCBub3RpZmljYXRpb25zLiBsaWJiaW5kZXIgd2FudHMgdGhlIHJlY2lwaWVudAotLy8gdG8gYmUgd3JhcHBlZCBpbiBzcDw+LCBzbyByZWdpc3RlcmluZyBSZWFsQmluZGVyV3JhcHBlciBhcyBhIHJlY2lwaWVudCB3b3VsZAotLy8gYmUgYXdrd2FyZC4KLWNsYXNzIFJlYWxCaW5kZXJXcmFwcGVyOjpEZWF0aFJlY2lwaWVudCA6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7Ci0gcHVibGljOgotICBleHBsaWNpdCBEZWF0aFJlY2lwaWVudChjb25zdCA6OmJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKQotICAgICAgOiBjYWxsYmFja18oY2FsbGJhY2spIHt9Ci0gIH5EZWF0aFJlY2lwaWVudCgpID0gZGVmYXVsdDsKLQotICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudDoKLSAgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pIG92ZXJyaWRlIHsKLSAgICBjYWxsYmFja18uUnVuKCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIENhbGxiYWNrIHRvIHJ1biBpbiByZXNwb25zZSB0byBiaW5kZXIgZGVhdGguCi0gIDo6YmFzZTo6Q2xvc3VyZSBjYWxsYmFja187Ci0KLSAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKERlYXRoUmVjaXBpZW50KTsKLX07Ci0KLVJlYWxCaW5kZXJXcmFwcGVyOjpSZWFsQmluZGVyV3JhcHBlcigpID0gZGVmYXVsdDsKLQotUmVhbEJpbmRlcldyYXBwZXI6On5SZWFsQmluZGVyV3JhcHBlcigpID0gZGVmYXVsdDsKLQotc3A8SUJpbmRlcj4gUmVhbEJpbmRlcldyYXBwZXI6OkdldFNlcnZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHNlcnZpY2VfbmFtZSkgewotICBzcDxJU2VydmljZU1hbmFnZXI+IHNlcnZpY2VfbWFuYWdlciA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwotICBpZiAoIXNlcnZpY2VfbWFuYWdlci5nZXQoKSkgewotICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBnZXQgc2VydmljZSBtYW5hZ2VyIjsKLSAgICByZXR1cm4gc3A8SUJpbmRlcj4oKTsKLSAgfQotICBzcDxJQmluZGVyPiBiaW5kZXIgPQotICAgICAgc2VydmljZV9tYW5hZ2VyLT5jaGVja1NlcnZpY2UoU3RyaW5nMTYoc2VydmljZV9uYW1lLmNfc3RyKCkpKTsKLSAgaWYgKCFiaW5kZXIuZ2V0KCkpCi0gICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIGdldCBcIiIgPDwgc2VydmljZV9uYW1lIDw8ICJcIiBzZXJ2aWNlIjsKLSAgcmV0dXJuIGJpbmRlcjsKLX0KLQotYm9vbCBSZWFsQmluZGVyV3JhcHBlcjo6UmVnaXN0ZXJTZXJ2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJ2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUJpbmRlcj4mIGJpbmRlcikgewotICBzcDxJU2VydmljZU1hbmFnZXI+IHNlcnZpY2VfbWFuYWdlciA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwotICBpZiAoIXNlcnZpY2VfbWFuYWdlci5nZXQoKSkgewotICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBnZXQgc2VydmljZSBtYW5hZ2VyIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgc3RhdHVzX3Qgc3RhdHVzID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmFkZFNlcnZpY2UoCi0gICAgICBTdHJpbmcxNihzZXJ2aWNlX25hbWUuY19zdHIoKSksIGJpbmRlcik7Ci0gIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcmVnaXN0ZXIgXCIiIDw8IHNlcnZpY2VfbmFtZSA8PCAiXCIgd2l0aCBzZXJ2aWNlICIKLSAgICAgICAgICAgICAgIDw8ICJtYW5hZ2VyIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXNwPEJCaW5kZXI+IFJlYWxCaW5kZXJXcmFwcGVyOjpDcmVhdGVMb2NhbEJpbmRlcigpIHsKLSAgcmV0dXJuIHNwPEJCaW5kZXI+KG5ldyBCQmluZGVyKCkpOwotfQotCi1ib29sIFJlYWxCaW5kZXJXcmFwcGVyOjpSZWdpc3RlckZvckRlYXRoTm90aWZpY2F0aW9ucygKLSAgICBjb25zdCBzcDxJQmluZGVyPiYgYmluZGVyLAotICAgIGNvbnN0IDo6YmFzZTo6Q2xvc3VyZSYgY2FsbGJhY2spIHsKLSAgc3A8RGVhdGhSZWNpcGllbnQ+IHJlY2lwaWVudChuZXcgRGVhdGhSZWNpcGllbnQoY2FsbGJhY2spKTsKLSAgaWYgKGJpbmRlci0+bGlua1RvRGVhdGgocmVjaXBpZW50KSAhPSBPSykgewotICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byByZWdpc3RlciBmb3IgZGVhdGggbm90aWZpY2F0aW9ucyBvbiAiCi0gICAgICAgICAgICAgICA8PCBiaW5kZXIuZ2V0KCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGRlYXRoX3JlY2lwaWVudHNfW2JpbmRlcl0gPSByZWNpcGllbnQ7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFJlYWxCaW5kZXJXcmFwcGVyOjpVbnJlZ2lzdGVyRm9yRGVhdGhOb3RpZmljYXRpb25zKAotICAgIGNvbnN0IHNwPElCaW5kZXI+JiBiaW5kZXIpIHsKLSAgYXV0byBpdCA9IGRlYXRoX3JlY2lwaWVudHNfLmZpbmQoYmluZGVyKTsKLSAgaWYgKGl0ID09IGRlYXRoX3JlY2lwaWVudHNfLmVuZCgpKSB7Ci0gICAgTE9HKEVSUk9SKSA8PCAiTm90IHJlZ2lzdGVyZWQgZm9yIGRlYXRoIG5vdGlmaWNhdGlvbnMgb24gIiA8PCBiaW5kZXIuZ2V0KCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmIChiaW5kZXItPnVubGlua1RvRGVhdGgoaXQtPnNlY29uZCkgIT0gT0spIHsKLSAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gdW5yZWdpc3RlciBmb3IgZGVhdGggbm90aWZpY2F0aW9ucyBvbiAiCi0gICAgICAgICAgICAgICA8PCBiaW5kZXIuZ2V0KCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGRlYXRoX3JlY2lwaWVudHNfLmVyYXNlKGl0KTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXVpZF90IFJlYWxCaW5kZXJXcmFwcGVyOjpHZXRDYWxsaW5nVWlkKCkgewotICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotfQotCi1waWRfdCBSZWFsQmluZGVyV3JhcHBlcjo6R2V0Q2FsbGluZ1BpZCgpIHsKLSAgcmV0dXJuIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYmJpbmRlcndyYXBwZXIvcmVhbF9iaW5kZXJfd3JhcHBlci5oIGIvbGliYmluZGVyd3JhcHBlci9yZWFsX2JpbmRlcl93cmFwcGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMDUzODMuLjAwMDAwMDAKLS0tIGEvbGliYmluZGVyd3JhcHBlci9yZWFsX2JpbmRlcl93cmFwcGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBTWVNURU1fQ09SRV9MSUJCSU5ERVJXUkFQUEVSX1JFQUxfQklOREVSX1dSQVBQRVJfSF8KLSNkZWZpbmUgU1lTVEVNX0NPUkVfTElCQklOREVSV1JBUFBFUl9SRUFMX0JJTkRFUl9XUkFQUEVSX0hfCi0KLSNpbmNsdWRlIDxtYXA+Ci0KLSNpbmNsdWRlIDxiYXNlL21hY3Jvcy5oPgotI2luY2x1ZGUgPGJpbmRlcndyYXBwZXIvYmluZGVyX3dyYXBwZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBJQmluZGVyOwotCi0vLyBSZWFsIGltcGxlbWVudGF0aW9uIG9mIEJpbmRlcldyYXBwZXIuCi1jbGFzcyBSZWFsQmluZGVyV3JhcHBlciA6IHB1YmxpYyBCaW5kZXJXcmFwcGVyIHsKLSBwdWJsaWM6Ci0gIFJlYWxCaW5kZXJXcmFwcGVyKCk7Ci0gIH5SZWFsQmluZGVyV3JhcHBlcigpIG92ZXJyaWRlOwotCi0gIC8vIEJpbmRlcldyYXBwZXI6Ci0gIHNwPElCaW5kZXI+IEdldFNlcnZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHNlcnZpY2VfbmFtZSkgb3ZlcnJpZGU7Ci0gIGJvb2wgUmVnaXN0ZXJTZXJ2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJ2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiBiaW5kZXIpIG92ZXJyaWRlOwotICBzcDxCQmluZGVyPiBDcmVhdGVMb2NhbEJpbmRlcigpIG92ZXJyaWRlOwotICBib29sIFJlZ2lzdGVyRm9yRGVhdGhOb3RpZmljYXRpb25zKGNvbnN0IHNwPElCaW5kZXI+JiBiaW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjpiYXNlOjpDbG9zdXJlJiBjYWxsYmFjaykgb3ZlcnJpZGU7Ci0gIGJvb2wgVW5yZWdpc3RlckZvckRlYXRoTm90aWZpY2F0aW9ucyhjb25zdCBzcDxJQmluZGVyPiYgYmluZGVyKSBvdmVycmlkZTsKLSAgdWlkX3QgR2V0Q2FsbGluZ1VpZCgpIG92ZXJyaWRlOwotICBwaWRfdCBHZXRDYWxsaW5nUGlkKCkgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBjbGFzcyBEZWF0aFJlY2lwaWVudDsKLQotICAvLyBNYXAgZnJvbSBiaW5kZXIgaGFuZGxlIHRvIG9iamVjdCB0aGF0IHNob3VsZCBiZSBub3RpZmllZCBvZiB0aGUgYmluZGVyJ3MKLSAgLy8gZGVhdGguCi0gIHN0ZDo6bWFwPHNwPElCaW5kZXI+LCBzcDxEZWF0aFJlY2lwaWVudD4+IGRlYXRoX3JlY2lwaWVudHNfOwotCi0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihSZWFsQmluZGVyV3JhcHBlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIFNZU1RFTV9DT1JFX0xJQkJJTkRFUl9XUkFQUEVSX1JFQUxfQklOREVSX1dSQVBQRVJfSF8KZGlmZiAtLWdpdCBhL2xpYmJpbmRlcndyYXBwZXIvc3R1Yl9iaW5kZXJfd3JhcHBlci5jYyBiL2xpYmJpbmRlcndyYXBwZXIvc3R1Yl9iaW5kZXJfd3JhcHBlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU3NWY2Mi4uMDAwMDAwMAotLS0gYS9saWJiaW5kZXJ3cmFwcGVyL3N0dWJfYmluZGVyX3dyYXBwZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGJpbmRlcndyYXBwZXIvc3R1Yl9iaW5kZXJfd3JhcHBlci5oPgotCi0jaW5jbHVkZSA8YmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0JpbmRlci5oPgotI2luY2x1ZGUgPGJpbmRlci9JQmluZGVyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotU3R1YkJpbmRlcldyYXBwZXI6OlN0dWJCaW5kZXJXcmFwcGVyKCkKLSAgICA6IGNhbGxpbmdfdWlkXygtMSksCi0gICAgICBjYWxsaW5nX3BpZF8oLTEpIHt9Ci0KLVN0dWJCaW5kZXJXcmFwcGVyOjp+U3R1YkJpbmRlcldyYXBwZXIoKSA9IGRlZmF1bHQ7Ci0KLXZvaWQgU3R1YkJpbmRlcldyYXBwZXI6OlNldEJpbmRlckZvclNlcnZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHNlcnZpY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUJpbmRlcj4mIGJpbmRlcikgewotICBzZXJ2aWNlc190b19yZXR1cm5fW3NlcnZpY2VfbmFtZV0gPSBiaW5kZXI7Ci19Ci0KLXNwPElCaW5kZXI+IFN0dWJCaW5kZXJXcmFwcGVyOjpHZXRSZWdpc3RlcmVkU2VydmljZSgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2VydmljZV9uYW1lKSBjb25zdCB7Ci0gIGNvbnN0IGF1dG8gaXQgPSByZWdpc3RlcmVkX3NlcnZpY2VzXy5maW5kKHNlcnZpY2VfbmFtZSk7Ci0gIHJldHVybiBpdCAhPSByZWdpc3RlcmVkX3NlcnZpY2VzXy5lbmQoKSA/IGl0LT5zZWNvbmQgOiBzcDxJQmluZGVyPigpOwotfQotCi12b2lkIFN0dWJCaW5kZXJXcmFwcGVyOjpOb3RpZnlBYm91dEJpbmRlckRlYXRoKGNvbnN0IHNwPElCaW5kZXI+JiBiaW5kZXIpIHsKLSAgY29uc3QgYXV0byBpdCA9IGRlYXRoX2NhbGxiYWNrc18uZmluZChiaW5kZXIpOwotICBpZiAoaXQgIT0gZGVhdGhfY2FsbGJhY2tzXy5lbmQoKSkKLSAgICBpdC0+c2Vjb25kLlJ1bigpOwotfQotCi1zcDxJQmluZGVyPiBTdHViQmluZGVyV3JhcHBlcjo6R2V0U2VydmljZShjb25zdCBzdGQ6OnN0cmluZyYgc2VydmljZV9uYW1lKSB7Ci0gIGNvbnN0IGF1dG8gaXQgPSBzZXJ2aWNlc190b19yZXR1cm5fLmZpbmQoc2VydmljZV9uYW1lKTsKLSAgcmV0dXJuIGl0ICE9IHNlcnZpY2VzX3RvX3JldHVybl8uZW5kKCkgPyBpdC0+c2Vjb25kIDogc3A8SUJpbmRlcj4oKTsKLX0KLQotYm9vbCBTdHViQmluZGVyV3JhcHBlcjo6UmVnaXN0ZXJTZXJ2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJ2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUJpbmRlcj4mIGJpbmRlcikgewotICByZWdpc3RlcmVkX3NlcnZpY2VzX1tzZXJ2aWNlX25hbWVdID0gYmluZGVyOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3A8QkJpbmRlcj4gU3R1YkJpbmRlcldyYXBwZXI6OkNyZWF0ZUxvY2FsQmluZGVyKCkgewotICBzcDxCQmluZGVyPiBiaW5kZXIobmV3IEJCaW5kZXIoKSk7Ci0gIGxvY2FsX2JpbmRlcnNfLnB1c2hfYmFjayhiaW5kZXIpOwotICByZXR1cm4gYmluZGVyOwotfQotCi1ib29sIFN0dWJCaW5kZXJXcmFwcGVyOjpSZWdpc3RlckZvckRlYXRoTm90aWZpY2F0aW9ucygKLSAgICBjb25zdCBzcDxJQmluZGVyPiYgYmluZGVyLAotICAgIGNvbnN0IDo6YmFzZTo6Q2xvc3VyZSYgY2FsbGJhY2spIHsKLSAgZGVhdGhfY2FsbGJhY2tzX1tiaW5kZXJdID0gY2FsbGJhY2s7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFN0dWJCaW5kZXJXcmFwcGVyOjpVbnJlZ2lzdGVyRm9yRGVhdGhOb3RpZmljYXRpb25zKAotICAgIGNvbnN0IHNwPElCaW5kZXI+JiBiaW5kZXIpIHsKLSAgZGVhdGhfY2FsbGJhY2tzXy5lcmFzZShiaW5kZXIpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdWlkX3QgU3R1YkJpbmRlcldyYXBwZXI6OkdldENhbGxpbmdVaWQoKSB7Ci0gIHJldHVybiBjYWxsaW5nX3VpZF87Ci19Ci0KLXBpZF90IFN0dWJCaW5kZXJXcmFwcGVyOjpHZXRDYWxsaW5nUGlkKCkgewotICByZXR1cm4gY2FsbGluZ19waWRfOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGliY3J5cHRvX3V0aWxzL0FuZHJvaWQuYnAgYi9saWJjcnlwdG9fdXRpbHMvQW5kcm9pZC5icAppbmRleCAyNTU5MTM3Li5iMmFmMDZjIDEwMDY0NAotLS0gYS9saWJjcnlwdG9fdXRpbHMvQW5kcm9pZC5icAorKysgYi9saWJjcnlwdG9fdXRpbHMvQW5kcm9pZC5icApAQCAtMjQsOSArMjQsNiBAQAogICAgIHJhbWRpc2tfYXZhaWxhYmxlOiB0cnVlLAogICAgIHZlbmRvcl9yYW1kaXNrX2F2YWlsYWJsZTogdHJ1ZSwKICAgICByZWNvdmVyeV9hdmFpbGFibGU6IHRydWUsCi0gICAgdm5kazogewotICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgIH0sCiAgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCiAgICAgc3JjczogWwogICAgICAgICAiYW5kcm9pZF9wdWJrZXkuY3BwIiwKZGlmZiAtLWdpdCBhL2xpYmN1dGlscy9BbmRyb2lkLmJwIGIvbGliY3V0aWxzL0FuZHJvaWQuYnAKaW5kZXggMGI1YzEyNS4uMTAzOTI4OCAxMDA2NDQKLS0tIGEvbGliY3V0aWxzL0FuZHJvaWQuYnAKKysrIGIvbGliY3V0aWxzL0FuZHJvaWQuYnAKQEAgLTEsNCArMSw1IEBACiBwYWNrYWdlIHsKKyAgICBkZWZhdWx0X3RlYW06ICJ0cmVuZHlfdGVhbV9uYXRpdmVfdG9vbHNfbGlicmFyaWVzIiwKICAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2NvcmVfbGliY3V0aWxzX2xpY2Vuc2UiXSwKIH0KIApAQCAtNDcsNiArNDgsOCBAQAogICAgIGRlZmF1bHRzOiBbImxpYmN1dGlsc19kZWZhdWx0cyJdLAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgaGVhZGVyX2xpYnM6IFsibGlicHJvY2Vzc2dyb3VwX2hlYWRlcnMiXSwKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbImxpYnByb2Nlc3Nncm91cF9oZWFkZXJzIl0sCiAgICAgdGFyZ2V0OiB7CiAgICAgICAgIHZlbmRvcjogewogICAgICAgICAgICAgb3ZlcnJpZGVfZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlX291dHNpZGVfc3lzdGVtIl0sCkBAIC0xMTYsMjcgKzExOSw2IEBACiAgICAgfSwKIH0KIAotY2NfdGVzdCB7Ci0gICAgbmFtZTogImxpYmN1dGlsc19zb2NrZXRzX3Rlc3QiLAotICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAotICAgIHN0YXRpY19saWJzOiBbImxpYmJhc2UiLCAibGliY3V0aWxzX3NvY2tldHMiXSwKLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1XYWxsIiwKLSAgICAgICAgIi1XZXh0cmEiLAotICAgICAgICAiLVdlcnJvciIsCi0gICAgXSwKLQotICAgIHNyY3M6IFsic29ja2V0c190ZXN0LmNwcCJdLAotICAgIHRhcmdldDogewotICAgICAgICBhbmRyb2lkOiB7Ci0gICAgICAgICAgICBzcmNzOiBbCi0gICAgICAgICAgICAgICAgImFuZHJvaWRfZ2V0X2NvbnRyb2xfZmlsZV90ZXN0LmNwcCIsCi0gICAgICAgICAgICAgICAgImFuZHJvaWRfZ2V0X2NvbnRyb2xfc29ja2V0X3Rlc3QuY3BwIiwKLSAgICAgICAgICAgIF0sCi0gICAgICAgIH0sCi0gICAgfSwKLX0KLQogLy8gc29tZSBmaWxlcyBtdXN0IG5vdCBiZSBjb21waWxlZCB3aGVuIGJ1aWxkaW5nIGFnYWluc3QgTWluZ3cKIC8vIHRoZXkgY29ycmVzcG9uZCB0byBmZWF0dXJlcyBub3QgdXNlZCBieSBvdXIgaG9zdCBkZXZlbG9wbWVudCB0b29scwogLy8gd2hpY2ggYXJlIGFsc28gaGFyZCBvciBldmVuIGltcG9zc2libGUgdG8gcG9ydCB0byBuYXRpdmUgV2luMzIKQEAgLTE1MCwxMCArMTMyLDcgQEAKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjdXRpbHMiLAogICAgIGRlZmF1bHRzOiBbImxpYmN1dGlsc19kZWZhdWx0cyJdLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICAgICAgc3VwcG9ydF9zeXN0ZW1fcHJvY2VzczogdHJ1ZSwKLSAgICB9LAorICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKICAgICBzcmNzOiBbCiAgICAgICAgICJjb25maWdfdXRpbHMuY3BwIiwKICAgICAgICAgImlvc2NoZWRfcG9saWN5LmNwcCIsCkBAIC0xNjIsNyArMTQxLDYgQEAKICAgICAgICAgInByb3BlcnRpZXMuY3BwIiwKICAgICAgICAgInJlY29yZF9zdHJlYW0uY3BwIiwKICAgICAgICAgInN0cmxjcHkuYyIsCi0gICAgICAgICJ0aHJlYWRzLmNwcCIsCiAgICAgXSwKIAogICAgIHRhcmdldDogewpAQCAtMTcyLDI1ICsxNTAsMjQgQEAKICAgICAgICAgICAgICAgICAibGliYXN5bmNfc2FmZSIsCiAgICAgICAgICAgICBdLAogICAgICAgICB9LAotICAgICAgICBub3Rfd2luZG93czogewotICAgICAgICAgICAgc3JjczogbGliY3V0aWxzX25vbndpbmRvd3Nfc291cmNlcyArIFsKLSAgICAgICAgICAgICAgICAiYXNobWVtLWhvc3QuY3BwIiwKKyAgICAgICAgbGludXg6IHsKKyAgICAgICAgICAgIHNyY3M6IFsKICAgICAgICAgICAgICAgICAiY2FubmVkX2ZzX2NvbmZpZy5jcHAiLAogICAgICAgICAgICAgICAgICJmc19jb25maWcuY3BwIiwKLSAgICAgICAgICAgICAgICAidHJhY2UtaG9zdC5jcHAiLAogICAgICAgICAgICAgXSwKICAgICAgICAgfSwKLSAgICAgICAgd2luZG93czogewotICAgICAgICAgICAgaG9zdF9sZGxpYnM6IFsiLWx3czJfMzIiXSwKLQorICAgICAgICBob3N0OiB7CiAgICAgICAgICAgICBzcmNzOiBbCiAgICAgICAgICAgICAgICAgInRyYWNlLWhvc3QuY3BwIiwKKyAgICAgICAgICAgICAgICAiYXNobWVtLWhvc3QuY3BwIiwKICAgICAgICAgICAgIF0sCi0KKyAgICAgICAgfSwKKyAgICAgICAgbm90X3dpbmRvd3M6IHsKKyAgICAgICAgICAgIHNyY3M6IGxpYmN1dGlsc19ub253aW5kb3dzX3NvdXJjZXMsCisgICAgICAgIH0sCisgICAgICAgIHdpbmRvd3M6IHsKICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCi0gICAgICAgICAgICBjZmxhZ3M6IFsKLSAgICAgICAgICAgICAgICAiLURfR05VX1NPVVJDRSIsCi0gICAgICAgICAgICBdLAorICAgICAgICAgICAgaG9zdF9sZGxpYnM6IFsiLWx3czJfMzIiXSwKICAgICAgICAgfSwKICAgICAgICAgYW5kcm9pZDogewogICAgICAgICAgICAgc2FuaXRpemU6IHsKQEAgLTIwMiw4ICsxNzksNiBAQAogICAgICAgICAgICAgc3JjczogbGliY3V0aWxzX25vbndpbmRvd3Nfc291cmNlcyArIFsKICAgICAgICAgICAgICAgICAiYW5kcm9pZF9yZWJvb3QuY3BwIiwKICAgICAgICAgICAgICAgICAiYXNobWVtLWRldi5jcHAiLAotICAgICAgICAgICAgICAgICJjYW5uZWRfZnNfY29uZmlnLmNwcCIsCi0gICAgICAgICAgICAgICAgImZzX2NvbmZpZy5jcHAiLAogICAgICAgICAgICAgICAgICJrbG9nLmNwcCIsCiAgICAgICAgICAgICAgICAgInBhcnRpdGlvbl91dGlscy5jcHAiLAogICAgICAgICAgICAgICAgICJxdGFndWlkLmNwcCIsCkBAIC0yMTksMTEgKzE5NCwxOSBAQAogICAgICAgICAgICAgZXhjbHVkZV9zcmNzOiBbCiAgICAgICAgICAgICAgICAgInF0YWd1aWQuY3BwIiwKICAgICAgICAgICAgIF0sCisgICAgICAgICAgICBoZWFkZXJfYWJpX2NoZWNrZXI6IHsKKyAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgICAgICAgICAgICAgIHJlZl9kdW1wX2RpcnM6IFsiYWJpLWR1bXBzIl0sCisgICAgICAgICAgICB9LAogICAgICAgICB9LAogICAgICAgICBwcm9kdWN0OiB7CiAgICAgICAgICAgICBleGNsdWRlX3NyY3M6IFsKICAgICAgICAgICAgICAgICAicXRhZ3VpZC5jcHAiLAogICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIGhlYWRlcl9hYmlfY2hlY2tlcjogeworICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgICAgICAgICAgICAgcmVmX2R1bXBfZGlyczogWyJhYmktZHVtcHMiXSwKKyAgICAgICAgICAgIH0sCiAgICAgICAgIH0sCiAgICAgfSwKIApAQCAtMjUzLDYgKzIzNiw3IEBACiBjY19kZWZhdWx0cyB7CiAgICAgbmFtZTogImxpYmN1dGlsc190ZXN0X2RlZmF1bHQiLAogICAgIHNyY3M6IFsKKyAgICAgICAgImFzaG1lbV9iYXNlX3Rlc3QuY3BwIiwKICAgICAgICAgIm5hdGl2ZV9oYW5kbGVfdGVzdC5jcHAiLAogICAgICAgICAicHJvcGVydGllc190ZXN0LmNwcCIsCiAgICAgICAgICJzb2NrZXRzX3Rlc3QuY3BwIiwKQEAgLTI5NSw3ICsyNzksNiBAQAogICAgICJsaWJsb2ciLAogICAgICJsaWJiYXNlIiwKICAgICAibGlicHJvY2Vzc2dyb3VwIiwKLSAgICAibGliY2dyb3VwcmMiLAogXQogCiBjY190ZXN0IHsKQEAgLTMxMSwyMCArMjk0LDI2IEBACiBjY19kZWZhdWx0cyB7CiAgICAgbmFtZTogImxpYmN1dGlsc190ZXN0X3N0YXRpY19kZWZhdWx0cyIsCiAgICAgZGVmYXVsdHM6IFsibGliY3V0aWxzX3Rlc3RfZGVmYXVsdCJdLAotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJjIiwKLSAgICAgICAgImxpYmNncm91cHJjX2Zvcm1hdCIsCi0gICAgXSArIHRlc3RfbGlicmFyaWVzICsgYWx3YXlzX3N0YXRpY190ZXN0X2xpYnJhcmllcywKICAgICBzdGw6ICJsaWJjKytfc3RhdGljIiwKICAgICByZXF1aXJlX3Jvb3Q6IHRydWUsCiAKICAgICB0YXJnZXQ6IHsKICAgICAgICAgYW5kcm9pZDogewogICAgICAgICAgICAgc3RhdGljX2V4ZWN1dGFibGU6IHRydWUsCisgICAgICAgICAgICBzdGF0aWNfbGliczogWworICAgICAgICAgICAgICAgICJsaWJwcm9jZXNzZ3JvdXBfdXRpbCIsCisgICAgICAgICAgICBdICsgdGVzdF9saWJyYXJpZXMgKyBhbHdheXNfc3RhdGljX3Rlc3RfbGlicmFyaWVzLAorICAgICAgICB9LAorICAgICAgICBub3Rfd2luZG93czogeworICAgICAgICAgICAgc3RhdGljX2xpYnM6IHRlc3RfbGlicmFyaWVzICsgYWx3YXlzX3N0YXRpY190ZXN0X2xpYnJhcmllcywKICAgICAgICAgfSwKICAgICAgICAgd2luZG93czogeworICAgICAgICAgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgICAgICAgICAibGliYmFzZSIsCisgICAgICAgICAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICAgICAgICAgImxpYmN1dGlsc19zb2NrZXRzIiwKKyAgICAgICAgICAgIF0sCiAgICAgICAgICAgICBob3N0X2xkbGliczogWyItbHdzMl8zMiJdLAotCiAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICB9LAogICAgIH0sCkBAIC0zMzIsMTMgKzMyMSwxNyBAQAogCiBjY190ZXN0IHsKICAgICBuYW1lOiAibGliY3V0aWxzX3Rlc3Rfc3RhdGljIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKICAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKICAgICBkZWZhdWx0czogWyJsaWJjdXRpbHNfdGVzdF9zdGF0aWNfZGVmYXVsdHMiXSwKIH0KIAogY2NfdGVzdCB7CiAgICAgbmFtZTogIktlcm5lbExpYmN1dGlsc1Rlc3QiLAotICAgIHRlc3Rfc3VpdGVzOiBbImdlbmVyYWwtdGVzdHMiLCAidnRzIl0sCisgICAgdGVzdF9zdWl0ZXM6IFsKKyAgICAgICAgImdlbmVyYWwtdGVzdHMiLAorICAgICAgICAidnRzIiwKKyAgICBdLAogICAgIGRlZmF1bHRzOiBbImxpYmN1dGlsc190ZXN0X3N0YXRpY19kZWZhdWx0cyJdLAogICAgIHRlc3RfY29uZmlnOiAiS2VybmVsTGliY3V0aWxzVGVzdC54bWwiLAogfQpkaWZmIC0tZ2l0IGEvbGliY3V0aWxzL0tlcm5lbExpYmN1dGlsc1Rlc3QueG1sIGIvbGliY3V0aWxzL0tlcm5lbExpYmN1dGlsc1Rlc3QueG1sCmluZGV4IDQwZTRlZjQuLjk3NTBjYmYgMTAwNjQ0Ci0tLSBhL2xpYmN1dGlscy9LZXJuZWxMaWJjdXRpbHNUZXN0LnhtbAorKysgYi9saWJjdXRpbHMvS2VybmVsTGliY3V0aWxzVGVzdC54bWwKQEAgLTIyLDExICsyMiwxMSBAQAogCiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iS2VybmVsTGliY3V0aWxzVGVzdC0+L2RhdGEvbG9jYWwvdG1wL0tlcm5lbExpYmN1dGlsc1Rlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9Iktlcm5lbExpYmN1dGlsc1Rlc3QtPi9kYXRhL2xvY2FsL3Rlc3RzL3VucmVzdHJpY3RlZC9LZXJuZWxMaWJjdXRpbHNUZXN0IiAvPgogICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgogCiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90ZXN0cy91bnJlc3RyaWN0ZWQiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJLZXJuZWxMaWJjdXRpbHNUZXN0IiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9ImluY2x1ZGUtZmlsdGVyIiB2YWx1ZT0iKkFzaG1lbVRlc3QqIiAvPgogICAgIDwvdGVzdD4KZGlmZiAtLWdpdCBhL2xpYmN1dGlscy9PV05FUlMgYi9saWJjdXRpbHMvT1dORVJTCmluZGV4IDc1MjljYjkuLmUxY2JlNGEgMTAwNjQ0Ci0tLSBhL2xpYmN1dGlscy9PV05FUlMKKysrIGIvbGliY3V0aWxzL09XTkVSUwpAQCAtMSArMSwyIEBACisjIEJ1ZyBjb21wb25lbnQ6IDEyODU3NwogaW5jbHVkZSBwbGF0Zm9ybS9zeXN0ZW0vY29yZTovamFuaXRvcnMvT1dORVJTCmRpZmYgLS1naXQgYS9saWJjdXRpbHMvVEVTVF9NQVBQSU5HIGIvbGliY3V0aWxzL1RFU1RfTUFQUElORwppbmRleCBlYjYzYWE1Li43OGIzZTQ0IDEwMDY0NAotLS0gYS9saWJjdXRpbHMvVEVTVF9NQVBQSU5HCisrKyBiL2xpYmN1dGlscy9URVNUX01BUFBJTkcKQEAgLTEyLDYgKzEyLDkgQEAKICAgImtlcm5lbC1wcmVzdWJtaXQiOiBbCiAgICAgewogICAgICAgIm5hbWUiOiAibGliY3V0aWxzX3Rlc3QiCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJLZXJuZWxMaWJjdXRpbHNUZXN0IgogICAgIH0KICAgXQogfQpkaWZmIC0tZ2l0IGEvbGliY3V0aWxzL2FiaS1kdW1wcy9hcm02NC9zb3VyY2UtYmFzZWQvbGliY3V0aWxzLnNvLmxzZHVtcCBiL2xpYmN1dGlscy9hYmktZHVtcHMvYXJtNjQvc291cmNlLWJhc2VkL2xpYmN1dGlscy5zby5sc2R1bXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VkMTMxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmN1dGlscy9hYmktZHVtcHMvYXJtNjQvc291cmNlLWJhc2VkL2xpYmN1dGlscy5zby5sc2R1bXAKQEAgLTAsMCArMSwyNjg4IEBACit7CisgImFycmF5X3R5cGVzIiA6CisgWworICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElBMF9pIiwKKyAgICJuYW1lIiA6ICJpbnRbMF0iLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbmF0aXZlX2hhbmRsZS5oIgorICB9CisgXSwKKyAiYnVpbHRpbl90eXBlcyIgOgorIFsKKyAgeworICAgImFsaWdubWVudCIgOiAxLAorICAgImlzX2ludGVncmFsIiA6IHRydWUsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElhIiwKKyAgICJuYW1lIiA6ICJzaWduZWQgY2hhciIsCisgICAic2l6ZSIgOiAxCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJpc19pbnRlZ3JhbCIgOiB0cnVlLAorICAgImlzX3Vuc2lnbmVkIiA6IHRydWUsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEliIiwKKyAgICJuYW1lIiA6ICJib29sIiwKKyAgICJzaXplIiA6IDEKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAorICAgImlzX2ludGVncmFsIiA6IHRydWUsCisgICAiaXNfdW5zaWduZWQiIDogdHJ1ZSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSWMiLAorICAgIm5hbWUiIDogImNoYXIiLAorICAgInNpemUiIDogMQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElmIiwKKyAgICJuYW1lIiA6ICJmbG9hdCIsCisgICAic2l6ZSIgOiA0CisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJpc19pbnRlZ3JhbCIgOiB0cnVlLAorICAgImlzX3Vuc2lnbmVkIiA6IHRydWUsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEloIiwKKyAgICJuYW1lIiA6ICJ1bnNpZ25lZCBjaGFyIiwKKyAgICJzaXplIiA6IDEKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImlzX2ludGVncmFsIiA6IHRydWUsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElpIiwKKyAgICJuYW1lIiA6ICJpbnQiLAorICAgInNpemUiIDogNAorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiaXNfaW50ZWdyYWwiIDogdHJ1ZSwKKyAgICJpc191bnNpZ25lZCIgOiB0cnVlLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJaiIsCisgICAibmFtZSIgOiAidW5zaWduZWQgaW50IiwKKyAgICJzaXplIiA6IDQKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAorICAgImlzX2ludGVncmFsIiA6IHRydWUsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElsIiwKKyAgICJuYW1lIiA6ICJsb25nIiwKKyAgICJzaXplIiA6IDgKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAorICAgImlzX2ludGVncmFsIiA6IHRydWUsCisgICAiaXNfdW5zaWduZWQiIDogdHJ1ZSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSW0iLAorICAgIm5hbWUiIDogInVuc2lnbmVkIGxvbmciLAorICAgInNpemUiIDogOAorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDE2LAorICAgImlzX2ludGVncmFsIiA6IHRydWUsCisgICAiaXNfdW5zaWduZWQiIDogdHJ1ZSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSW8iLAorICAgIm5hbWUiIDogInVuc2lnbmVkIF9faW50MTI4IiwKKyAgICJzaXplIiA6IDE2CisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMiwKKyAgICJpc19pbnRlZ3JhbCIgOiB0cnVlLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJcyIsCisgICAibmFtZSIgOiAic2hvcnQiLAorICAgInNpemUiIDogMgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDIsCisgICAiaXNfaW50ZWdyYWwiIDogdHJ1ZSwKKyAgICJpc191bnNpZ25lZCIgOiB0cnVlLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJdCIsCisgICAibmFtZSIgOiAidW5zaWduZWQgc2hvcnQiLAorICAgInNpemUiIDogMgorICB9LAorICB7CisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEl2IiwKKyAgICJuYW1lIiA6ICJ2b2lkIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDgsCisgICAiaXNfaW50ZWdyYWwiIDogdHJ1ZSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSXgiLAorICAgIm5hbWUiIDogImxvbmcgbG9uZyIsCisgICAic2l6ZSIgOiA4CisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogOCwKKyAgICJpc19pbnRlZ3JhbCIgOiB0cnVlLAorICAgImlzX3Vuc2lnbmVkIiA6IHRydWUsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEl5IiwKKyAgICJuYW1lIiA6ICJ1bnNpZ25lZCBsb25nIGxvbmciLAorICAgInNpemUiIDogOAorICB9CisgXSwKKyAiZWxmX2Z1bmN0aW9ucyIgOgorIFsKKyAgeworICAgIm5hbWUiIDogIl9aMjNzb2NrZXRfbWFrZV9zb2NrYWRkcl91blBLY2lQMTFzb2NrYWRkcl91blBqIgorICB9LAorICB7CisgICAibmFtZSIgOiAiYW5kcm9pZF9nZXRfY29udHJvbF9maWxlIgorICB9LAorICB7CisgICAibmFtZSIgOiAiYW5kcm9pZF9nZXRfY29udHJvbF9zb2NrZXQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhbmRyb2lkX2dldF9pb3ByaW8iCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhbmRyb2lkX3JlYm9vdCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImFuZHJvaWRfc2V0X2lvcHJpbyIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImFzaG1lbV9jcmVhdGVfcmVnaW9uIgorICB9LAorICB7CisgICAibmFtZSIgOiAiYXNobWVtX2dldF9zaXplX3JlZ2lvbiIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImFzaG1lbV9waW5fcmVnaW9uIgorICB9LAorICB7CisgICAibmFtZSIgOiAiYXNobWVtX3NldF9wcm90X3JlZ2lvbiIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImFzaG1lbV91bnBpbl9yZWdpb24iCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhc2htZW1fdmFsaWQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhdHJhY2VfYXN5bmNfYmVnaW5fYm9keSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImF0cmFjZV9hc3luY19lbmRfYm9keSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImF0cmFjZV9hc3luY19mb3JfdHJhY2tfYmVnaW5fYm9keSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImF0cmFjZV9hc3luY19mb3JfdHJhY2tfZW5kX2JvZHkiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhdHJhY2VfYmVnaW5fYm9keSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImF0cmFjZV9lbmRfYm9keSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImF0cmFjZV9nZXRfZW5hYmxlZF90YWdzIgorICB9LAorICB7CisgICAibmFtZSIgOiAiYXRyYWNlX2luaXQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhdHJhY2VfaW5zdGFudF9ib2R5IgorICB9LAorICB7CisgICAibmFtZSIgOiAiYXRyYWNlX2luc3RhbnRfZm9yX3RyYWNrX2JvZHkiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhdHJhY2VfaW50NjRfYm9keSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImF0cmFjZV9pbnRfYm9keSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImF0cmFjZV9zZXRfdHJhY2luZ19lbmFibGVkIgorICB9LAorICB7CisgICAibmFtZSIgOiAiYXRyYWNlX3NldHVwIgorICB9LAorICB7CisgICAibmFtZSIgOiAiYXRyYWNlX3VwZGF0ZV90YWdzIgorICB9LAorICB7CisgICAibmFtZSIgOiAiY2FubmVkX2ZzX2NvbmZpZyIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImNvbmZpZ19ib29sIgorICB9LAorICB7CisgICAibmFtZSIgOiAiY29uZmlnX2ZpbmQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJjb25maWdfZnJlZSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImNvbmZpZ19sb2FkIgorICB9LAorICB7CisgICAibmFtZSIgOiAiY29uZmlnX2xvYWRfZmlsZSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImNvbmZpZ19ub2RlIgorICB9LAorICB7CisgICAibmFtZSIgOiAiY29uZmlnX3NldCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImNvbmZpZ19zdHIiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJmc19jb25maWciCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJmc19ta2RpcnMiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJmc19wcmVwYXJlX2RpciIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImZzX3ByZXBhcmVfZGlyX3N0cmljdCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImZzX3ByZXBhcmVfZmlsZV9zdHJpY3QiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJmc19yZWFkX2F0b21pY19pbnQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJmc193cml0ZV9hdG9taWNfaW50IgorICB9LAorICB7CisgICAibmFtZSIgOiAiZ2V0X2ZzX2NvbmZpZyIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImhhc2htYXBDcmVhdGUiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJoYXNobWFwRm9yRWFjaCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImhhc2htYXBGcmVlIgorICB9LAorICB7CisgICAibmFtZSIgOiAiaGFzaG1hcEdldCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImhhc2htYXBIYXNoIgorICB9LAorICB7CisgICAibmFtZSIgOiAiaGFzaG1hcExvY2siCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJoYXNobWFwUHV0IgorICB9LAorICB7CisgICAibmFtZSIgOiAiaGFzaG1hcFJlbW92ZSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImhhc2htYXBVbmxvY2siCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJrbG9nX3NldF9sZXZlbCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImtsb2dfd3JpdGUiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJrbG9nX3dyaXRldiIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImxvYWRfY2FubmVkX2ZzX2NvbmZpZyIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImxvYWRfZmlsZSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogIm11bHRpdXNlcl9jb252ZXJ0X3Nka19zYW5kYm94X3RvX2FwcF91aWQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJtdWx0aXVzZXJfZ2V0X2FwcF9pZCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogIm11bHRpdXNlcl9nZXRfY2FjaGVfZ2lkIgorICB9LAorICB7CisgICAibmFtZSIgOiAibXVsdGl1c2VyX2dldF9leHRfY2FjaGVfZ2lkIgorICB9LAorICB7CisgICAibmFtZSIgOiAibXVsdGl1c2VyX2dldF9leHRfZ2lkIgorICB9LAorICB7CisgICAibmFtZSIgOiAibXVsdGl1c2VyX2dldF9zZGtfc2FuZGJveF91aWQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJtdWx0aXVzZXJfZ2V0X3NoYXJlZF9hcHBfZ2lkIgorICB9LAorICB7CisgICAibmFtZSIgOiAibXVsdGl1c2VyX2dldF9zaGFyZWRfZ2lkIgorICB9LAorICB7CisgICAibmFtZSIgOiAibXVsdGl1c2VyX2dldF91aWQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJtdWx0aXVzZXJfZ2V0X3VzZXJfaWQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJuYXRpdmVfaGFuZGxlX2Nsb25lIgorICB9LAorICB7CisgICAibmFtZSIgOiAibmF0aXZlX2hhbmRsZV9jbG9zZSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogIm5hdGl2ZV9oYW5kbGVfY2xvc2Vfd2l0aF90YWciCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJuYXRpdmVfaGFuZGxlX2NyZWF0ZSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogIm5hdGl2ZV9oYW5kbGVfZGVsZXRlIgorICB9LAorICB7CisgICAibmFtZSIgOiAibmF0aXZlX2hhbmRsZV9pbml0IgorICB9LAorICB7CisgICAibmFtZSIgOiAibmF0aXZlX2hhbmRsZV9zZXRfZmRzYW5fdGFnIgorICB9LAorICB7CisgICAibmFtZSIgOiAibmF0aXZlX2hhbmRsZV91bnNldF9mZHNhbl90YWciCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJwYXJ0aXRpb25fd2lwZWQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJwcm9wZXJ0eV9nZXQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJwcm9wZXJ0eV9nZXRfYm9vbCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInByb3BlcnR5X2dldF9pbnQzMiIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInByb3BlcnR5X2dldF9pbnQ2NCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInByb3BlcnR5X2xpc3QiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJwcm9wZXJ0eV9zZXQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJyZWNvcmRfc3RyZWFtX2ZyZWUiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJyZWNvcmRfc3RyZWFtX2dldF9uZXh0IgorICB9LAorICB7CisgICAibmFtZSIgOiAicmVjb3JkX3N0cmVhbV9uZXciCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJzb2NrZXRfY2xvc2UiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJzb2NrZXRfZ2V0X2xvY2FsX3BvcnQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJzb2NrZXRfaW5hZGRyX2FueV9zZXJ2ZXIiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJzb2NrZXRfbG9jYWxfY2xpZW50IgorICB9LAorICB7CisgICAibmFtZSIgOiAic29ja2V0X2xvY2FsX2NsaWVudF9jb25uZWN0IgorICB9LAorICB7CisgICAibmFtZSIgOiAic29ja2V0X2xvY2FsX3NlcnZlciIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInNvY2tldF9sb2NhbF9zZXJ2ZXJfYmluZCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInNvY2tldF9uZXR3b3JrX2NsaWVudCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInNvY2tldF9uZXR3b3JrX2NsaWVudF90aW1lb3V0IgorICB9LAorICB7CisgICAibmFtZSIgOiAic29ja2V0X3NlbmRfYnVmZmVycyIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInN0cl9wYXJtc19hZGRfZmxvYXQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJzdHJfcGFybXNfYWRkX2ludCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInN0cl9wYXJtc19hZGRfc3RyIgorICB9LAorICB7CisgICAibmFtZSIgOiAic3RyX3Bhcm1zX2NyZWF0ZSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInN0cl9wYXJtc19jcmVhdGVfc3RyIgorICB9LAorICB7CisgICAibmFtZSIgOiAic3RyX3Bhcm1zX2RlbCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInN0cl9wYXJtc19kZXN0cm95IgorICB9LAorICB7CisgICAibmFtZSIgOiAic3RyX3Bhcm1zX2R1bXAiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJzdHJfcGFybXNfZ2V0X2Zsb2F0IgorICB9LAorICB7CisgICAibmFtZSIgOiAic3RyX3Bhcm1zX2dldF9pbnQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJzdHJfcGFybXNfZ2V0X3N0ciIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInN0cl9wYXJtc19oYXNfa2V5IgorICB9LAorICB7CisgICAibmFtZSIgOiAic3RyX3Bhcm1zX3RvX3N0ciIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInVldmVudF9iaW5kIgorICB9LAorICB7CisgICAibmFtZSIgOiAidWV2ZW50X2NyZWF0ZV9zb2NrZXQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJ1ZXZlbnRfa2VybmVsX211bHRpY2FzdF9yZWN2IgorICB9LAorICB7CisgICAibmFtZSIgOiAidWV2ZW50X2tlcm5lbF9tdWx0aWNhc3RfdWlkX3JlY3YiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJ1ZXZlbnRfa2VybmVsX3JlY3YiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJ1ZXZlbnRfb3Blbl9zb2NrZXQiCisgIH0KKyBdLAorICJlbGZfb2JqZWN0cyIgOgorIFsKKyAgeworICAgIm5hbWUiIDogImF0cmFjZV9lbmFibGVkX3RhZ3MiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhdHJhY2VfaXNfcmVhZHkiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhdHJhY2VfbWFya2VyX2ZkIgorICB9CisgXSwKKyAiZW51bV90eXBlcyIgOgorIFsKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAwLAorICAgICAibmFtZSIgOiAiSW9TY2hlZENsYXNzX05PTkUiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJJb1NjaGVkQ2xhc3NfUlQiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDIsCisgICAgICJuYW1lIiA6ICJJb1NjaGVkQ2xhc3NfQkUiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDMsCisgICAgICJuYW1lIiA6ICJJb1NjaGVkQ2xhc3NfSURMRSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJMTJJb1NjaGVkQ2xhc3MiLAorICAgIm5hbWUiIDogIklvU2NoZWRDbGFzcyIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvaW9zY2hlZF9wb2xpY3kuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfQorIF0sCisgImZ1bmN0aW9uX3R5cGVzIiA6CisgWworICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElGYlB2U19FIiwKKyAgICJuYW1lIiA6ICJib29sICh2b2lkICosIHZvaWQgKikiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB2IgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEliIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2hhc2htYXAuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJRmJQdlNfU19FIiwKKyAgICJuYW1lIiA6ICJib29sICh2b2lkICosIHZvaWQgKiwgdm9pZCAqKSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB2IgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJYiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9oYXNobWFwLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUZpUHZFIiwKKyAgICJuYW1lIiA6ICJpbnQgKHZvaWQgKikiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9oYXNobWFwLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUZ2UEtjUzBfUHZFIiwKKyAgICJuYW1lIiA6ICJ2b2lkIChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgdm9pZCAqKSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB2IgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3Byb3BlcnRpZXMuaCIKKyAgfQorIF0sCisgImZ1bmN0aW9ucyIgOgorIFsKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWRfZ2V0X2NvbnRyb2xfZmlsZSIsCisgICAibGlua2VyX3NldF9rZXkiIDogImFuZHJvaWRfZ2V0X2NvbnRyb2xfZmlsZSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9hbmRyb2lkX2dldF9jb250cm9sX2ZpbGUuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWRfZ2V0X2NvbnRyb2xfc29ja2V0IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiYW5kcm9pZF9nZXRfY29udHJvbF9zb2NrZXQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc29ja2V0cy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZF9nZXRfaW9wcmlvIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiYW5kcm9pZF9nZXRfaW9wcmlvIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVAxMklvU2NoZWRDbGFzcyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2lvc2NoZWRfcG9saWN5LmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkX3JlYm9vdCIsCisgICAibGlua2VyX3NldF9rZXkiIDogImFuZHJvaWRfcmVib290IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvYW5kcm9pZF9yZWJvb3QuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWRfc2V0X2lvcHJpbyIsCisgICAibGlua2VyX3NldF9rZXkiIDogImFuZHJvaWRfc2V0X2lvcHJpbyIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkxMklvU2NoZWRDbGFzcyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvaW9zY2hlZF9wb2xpY3kuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImFzaG1lbV9jcmVhdGVfcmVnaW9uIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiYXNobWVtX2NyZWF0ZV9yZWdpb24iLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEltIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2FzaG1lbS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYXNobWVtX2dldF9zaXplX3JlZ2lvbiIsCisgICAibGlua2VyX3NldF9rZXkiIDogImFzaG1lbV9nZXRfc2l6ZV9yZWdpb24iLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2FzaG1lbS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYXNobWVtX3Bpbl9yZWdpb24iLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhc2htZW1fcGluX3JlZ2lvbiIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEltIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJbSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9hc2htZW0uaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImFzaG1lbV9zZXRfcHJvdF9yZWdpb24iLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhc2htZW1fc2V0X3Byb3RfcmVnaW9uIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvYXNobWVtLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhc2htZW1fdW5waW5fcmVnaW9uIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiYXNobWVtX3VucGluX3JlZ2lvbiIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEltIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJbSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9hc2htZW0uaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImFzaG1lbV92YWxpZCIsCisgICAibGlua2VyX3NldF9rZXkiIDogImFzaG1lbV92YWxpZCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvYXNobWVtLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhdHJhY2VfYXN5bmNfYmVnaW5fYm9keSIsCisgICAibGlua2VyX3NldF9rZXkiIDogImF0cmFjZV9hc3luY19iZWdpbl9ib2R5IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYXRyYWNlX2FzeW5jX2VuZF9ib2R5IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiYXRyYWNlX2FzeW5jX2VuZF9ib2R5IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYXRyYWNlX2FzeW5jX2Zvcl90cmFja19iZWdpbl9ib2R5IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiYXRyYWNlX2FzeW5jX2Zvcl90cmFja19iZWdpbl9ib2R5IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYXRyYWNlX2FzeW5jX2Zvcl90cmFja19lbmRfYm9keSIsCisgICAibGlua2VyX3NldF9rZXkiIDogImF0cmFjZV9hc3luY19mb3JfdHJhY2tfZW5kX2JvZHkiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3RyYWNlLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhdHJhY2VfYmVnaW5fYm9keSIsCisgICAibGlua2VyX3NldF9rZXkiIDogImF0cmFjZV9iZWdpbl9ib2R5IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3RyYWNlLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhdHJhY2VfZW5kX2JvZHkiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhdHJhY2VfZW5kX2JvZHkiLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYXRyYWNlX2dldF9lbmFibGVkX3RhZ3MiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhdHJhY2VfZ2V0X2VuYWJsZWRfdGFncyIsCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEltIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3RyYWNlLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhdHJhY2VfaW5pdCIsCisgICAibGlua2VyX3NldF9rZXkiIDogImF0cmFjZV9pbml0IiwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvdHJhY2UuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImF0cmFjZV9pbnN0YW50X2JvZHkiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhdHJhY2VfaW5zdGFudF9ib2R5IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3RyYWNlLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhdHJhY2VfaW5zdGFudF9mb3JfdHJhY2tfYm9keSIsCisgICAibGlua2VyX3NldF9rZXkiIDogImF0cmFjZV9pbnN0YW50X2Zvcl90cmFja19ib2R5IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3RyYWNlLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhdHJhY2VfaW50NjRfYm9keSIsCisgICAibGlua2VyX3NldF9rZXkiIDogImF0cmFjZV9pbnQ2NF9ib2R5IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJbCIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYXRyYWNlX2ludF9ib2R5IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiYXRyYWNlX2ludF9ib2R5IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYXRyYWNlX3NldF90cmFjaW5nX2VuYWJsZWQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhdHJhY2Vfc2V0X3RyYWNpbmdfZW5hYmxlZCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWIiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvdHJhY2UuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImF0cmFjZV9zZXR1cCIsCisgICAibGlua2VyX3NldF9rZXkiIDogImF0cmFjZV9zZXR1cCIsCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3RyYWNlLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhdHJhY2VfdXBkYXRlX3RhZ3MiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhdHJhY2VfdXBkYXRlX3RhZ3MiLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiY2FubmVkX2ZzX2NvbmZpZyIsCisgICAibGlua2VyX3NldF9rZXkiIDogImNhbm5lZF9mc19jb25maWciLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUGoiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQaiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBqIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUG0iCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9wcml2YXRlL2Nhbm5lZF9mc19jb25maWcuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImNvbmZpZ19ib29sIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiY29uZmlnX2Jvb2wiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQNWNub2RlIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9jb25maWdfdXRpbHMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImNvbmZpZ19maW5kIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiY29uZmlnX2ZpbmQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQNWNub2RlIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElQNWNub2RlIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2NvbmZpZ191dGlscy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiY29uZmlnX2ZyZWUiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJjb25maWdfZnJlZSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA1Y25vZGUiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvY29uZmlnX3V0aWxzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJjb25maWdfbG9hZCIsCisgICAibGlua2VyX3NldF9rZXkiIDogImNvbmZpZ19sb2FkIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDVjbm9kZSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBjIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2NvbmZpZ191dGlscy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiY29uZmlnX2xvYWRfZmlsZSIsCisgICAibGlua2VyX3NldF9rZXkiIDogImNvbmZpZ19sb2FkX2ZpbGUiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQNWNub2RlIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2NvbmZpZ191dGlscy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiY29uZmlnX25vZGUiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJjb25maWdfbm9kZSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJUDVjbm9kZSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9jb25maWdfdXRpbHMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImNvbmZpZ19zZXQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJjb25maWdfc2V0IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDVjbm9kZSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9jb25maWdfdXRpbHMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImNvbmZpZ19zdHIiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJjb25maWdfc3RyIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDVjbm9kZSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJUEtjIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2NvbmZpZ191dGlscy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiZnNfY29uZmlnIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiZnNfY29uZmlnIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBqIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUGoiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQaiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBtIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvcHJpdmF0ZS9mc19jb25maWcuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImZzX21rZGlycyIsCisgICAibGlua2VyX3NldF9rZXkiIDogImZzX21rZGlycyIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvZnMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImZzX3ByZXBhcmVfZGlyIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiZnNfcHJlcGFyZV9kaXIiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvZnMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImZzX3ByZXBhcmVfZGlyX3N0cmljdCIsCisgICAibGlua2VyX3NldF9rZXkiIDogImZzX3ByZXBhcmVfZGlyX3N0cmljdCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9mcy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiZnNfcHJlcGFyZV9maWxlX3N0cmljdCIsCisgICAibGlua2VyX3NldF9rZXkiIDogImZzX3ByZXBhcmVfZmlsZV9zdHJpY3QiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvZnMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImZzX3JlYWRfYXRvbWljX2ludCIsCisgICAibGlua2VyX3NldF9rZXkiIDogImZzX3JlYWRfYXRvbWljX2ludCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2ZzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJmc193cml0ZV9hdG9taWNfaW50IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiZnNfd3JpdGVfYXRvbWljX2ludCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvZnMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImdldF9mc19jb25maWciLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJnZXRfZnNfY29uZmlnIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJYiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA5ZnNfY29uZmlnIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEliIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvcHJpdmF0ZS9mc19jb25maWcuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImhhc2htYXBDcmVhdGUiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJoYXNobWFwQ3JlYXRlIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJbSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBGaVB2RSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBGYlB2U19FIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElQN0hhc2htYXAiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvaGFzaG1hcC5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiaGFzaG1hcEZvckVhY2giLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJoYXNobWFwRm9yRWFjaCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA3SGFzaG1hcCIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBGYlB2U19TX0UiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9oYXNobWFwLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJoYXNobWFwRnJlZSIsCisgICAibGlua2VyX3NldF9rZXkiIDogImhhc2htYXBGcmVlIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDdIYXNobWFwIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2hhc2htYXAuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImhhc2htYXBHZXQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJoYXNobWFwR2V0IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDdIYXNobWFwIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVB2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2hhc2htYXAuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImhhc2htYXBIYXNoIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiaGFzaG1hcEhhc2giLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSW0iCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvaGFzaG1hcC5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiaGFzaG1hcExvY2siLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJoYXNobWFwTG9jayIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA3SGFzaG1hcCIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9oYXNobWFwLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJoYXNobWFwUHV0IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiaGFzaG1hcFB1dCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA3SGFzaG1hcCIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB2IgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVB2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2hhc2htYXAuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImhhc2htYXBSZW1vdmUiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJoYXNobWFwUmVtb3ZlIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDdIYXNobWFwIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVB2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2hhc2htYXAuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImhhc2htYXBVbmxvY2siLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJoYXNobWFwVW5sb2NrIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDdIYXNobWFwIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2hhc2htYXAuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImtsb2dfc2V0X2xldmVsIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAia2xvZ19zZXRfbGV2ZWwiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2tsb2cuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImtsb2dfd3JpdGUiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJrbG9nX3dyaXRlIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9rbG9nLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJrbG9nX3dyaXRldiIsCisgICAibGlua2VyX3NldF9rZXkiIDogImtsb2dfd3JpdGV2IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLNWlvdmVjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9rbG9nLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJsb2FkX2Nhbm5lZF9mc19jb25maWciLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJsb2FkX2Nhbm5lZF9mc19jb25maWciLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9wcml2YXRlL2Nhbm5lZF9mc19jb25maWcuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImxvYWRfZmlsZSIsCisgICAibGlua2VyX3NldF9rZXkiIDogImxvYWRfZmlsZSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBqIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElQdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9taXNjLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJtdWx0aXVzZXJfY29udmVydF9zZGtfc2FuZGJveF90b19hcHBfdWlkIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAibXVsdGl1c2VyX2NvbnZlcnRfc2RrX3NhbmRib3hfdG9fYXBwX3VpZCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWoiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbXVsdGl1c2VyLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJtdWx0aXVzZXJfZ2V0X2FwcF9pZCIsCisgICAibGlua2VyX3NldF9rZXkiIDogIm11bHRpdXNlcl9nZXRfYXBwX2lkIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9tdWx0aXVzZXIuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogIm11bHRpdXNlcl9nZXRfY2FjaGVfZ2lkIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAibXVsdGl1c2VyX2dldF9jYWNoZV9naWQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9tdWx0aXVzZXIuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogIm11bHRpdXNlcl9nZXRfZXh0X2NhY2hlX2dpZCIsCisgICAibGlua2VyX3NldF9rZXkiIDogIm11bHRpdXNlcl9nZXRfZXh0X2NhY2hlX2dpZCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElqIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL211bHRpdXNlci5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAibXVsdGl1c2VyX2dldF9leHRfZ2lkIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAibXVsdGl1c2VyX2dldF9leHRfZ2lkIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWoiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbXVsdGl1c2VyLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJtdWx0aXVzZXJfZ2V0X3Nka19zYW5kYm94X3VpZCIsCisgICAibGlua2VyX3NldF9rZXkiIDogIm11bHRpdXNlcl9nZXRfc2RrX3NhbmRib3hfdWlkIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWoiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbXVsdGl1c2VyLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJtdWx0aXVzZXJfZ2V0X3NoYXJlZF9hcHBfZ2lkIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAibXVsdGl1c2VyX2dldF9zaGFyZWRfYXBwX2dpZCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWoiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbXVsdGl1c2VyLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJtdWx0aXVzZXJfZ2V0X3NoYXJlZF9naWQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJtdWx0aXVzZXJfZ2V0X3NoYXJlZF9naWQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9tdWx0aXVzZXIuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogIm11bHRpdXNlcl9nZXRfdWlkIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAibXVsdGl1c2VyX2dldF91aWQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9tdWx0aXVzZXIuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogIm11bHRpdXNlcl9nZXRfdXNlcl9pZCIsCisgICAibGlua2VyX3NldF9rZXkiIDogIm11bHRpdXNlcl9nZXRfdXNlcl9pZCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWoiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbXVsdGl1c2VyLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJuYXRpdmVfaGFuZGxlX2Nsb25lIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAibmF0aXZlX2hhbmRsZV9jbG9uZSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLMTNuYXRpdmVfaGFuZGxlIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElQMTNuYXRpdmVfaGFuZGxlIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL25hdGl2ZV9oYW5kbGUuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogIm5hdGl2ZV9oYW5kbGVfY2xvc2UiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJuYXRpdmVfaGFuZGxlX2Nsb3NlIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEsxM25hdGl2ZV9oYW5kbGUiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbmF0aXZlX2hhbmRsZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAibmF0aXZlX2hhbmRsZV9jbG9zZV93aXRoX3RhZyIsCisgICAibGlua2VyX3NldF9rZXkiIDogIm5hdGl2ZV9oYW5kbGVfY2xvc2Vfd2l0aF90YWciLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQSzEzbmF0aXZlX2hhbmRsZSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9uYXRpdmVfaGFuZGxlLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJuYXRpdmVfaGFuZGxlX2NyZWF0ZSIsCisgICAibGlua2VyX3NldF9rZXkiIDogIm5hdGl2ZV9oYW5kbGVfY3JlYXRlIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVAxM25hdGl2ZV9oYW5kbGUiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbmF0aXZlX2hhbmRsZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAibmF0aXZlX2hhbmRsZV9kZWxldGUiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJuYXRpdmVfaGFuZGxlX2RlbGV0ZSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVAxM25hdGl2ZV9oYW5kbGUiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbmF0aXZlX2hhbmRsZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAibmF0aXZlX2hhbmRsZV9pbml0IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAibmF0aXZlX2hhbmRsZV9pbml0IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUGMiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJUDEzbmF0aXZlX2hhbmRsZSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9uYXRpdmVfaGFuZGxlLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJuYXRpdmVfaGFuZGxlX3NldF9mZHNhbl90YWciLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJuYXRpdmVfaGFuZGxlX3NldF9mZHNhbl90YWciLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQSzEzbmF0aXZlX2hhbmRsZSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9uYXRpdmVfaGFuZGxlLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJuYXRpdmVfaGFuZGxlX3Vuc2V0X2Zkc2FuX3RhZyIsCisgICAibGlua2VyX3NldF9rZXkiIDogIm5hdGl2ZV9oYW5kbGVfdW5zZXRfZmRzYW5fdGFnIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEsxM25hdGl2ZV9oYW5kbGUiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbmF0aXZlX2hhbmRsZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAicGFydGl0aW9uX3dpcGVkIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAicGFydGl0aW9uX3dpcGVkIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3BhcnRpdGlvbl91dGlscy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAicHJvcGVydHlfZ2V0IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAicHJvcGVydHlfZ2V0IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUGMiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvcHJvcGVydGllcy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAicHJvcGVydHlfZ2V0X2Jvb2wiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJwcm9wZXJ0eV9nZXRfYm9vbCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWEiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWEiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvcHJvcGVydGllcy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAicHJvcGVydHlfZ2V0X2ludDMyIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAicHJvcGVydHlfZ2V0X2ludDMyIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9wcm9wZXJ0aWVzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJwcm9wZXJ0eV9nZXRfaW50NjQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJwcm9wZXJ0eV9nZXRfaW50NjQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElsIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElsIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3Byb3BlcnRpZXMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInByb3BlcnR5X2xpc3QiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJwcm9wZXJ0eV9saXN0IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEZ2UEtjUzBfUHZFIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvcHJvcGVydGllcy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAicHJvcGVydHlfc2V0IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAicHJvcGVydHlfc2V0IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3Byb3BlcnRpZXMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInJlY29yZF9zdHJlYW1fZnJlZSIsCisgICAibGlua2VyX3NldF9rZXkiIDogInJlY29yZF9zdHJlYW1fZnJlZSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVAxMlJlY29yZFN0cmVhbSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9yZWNvcmRfc3RyZWFtLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJyZWNvcmRfc3RyZWFtX2dldF9uZXh0IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAicmVjb3JkX3N0cmVhbV9nZXRfbmV4dCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVAxMlJlY29yZFN0cmVhbSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBQdiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBtIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3JlY29yZF9zdHJlYW0uaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInJlY29yZF9zdHJlYW1fbmV3IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAicmVjb3JkX3N0cmVhbV9uZXciLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJbSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJUDEyUmVjb3JkU3RyZWFtIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3JlY29yZF9zdHJlYW0uaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInNvY2tldF9jbG9zZSIsCisgICAibGlua2VyX3NldF9rZXkiIDogInNvY2tldF9jbG9zZSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc29ja2V0cy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAic29ja2V0X2dldF9sb2NhbF9wb3J0IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAic29ja2V0X2dldF9sb2NhbF9wb3J0IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zb2NrZXRzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzb2NrZXRfaW5hZGRyX2FueV9zZXJ2ZXIiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJzb2NrZXRfaW5hZGRyX2FueV9zZXJ2ZXIiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zb2NrZXRzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzb2NrZXRfbG9jYWxfY2xpZW50IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAic29ja2V0X2xvY2FsX2NsaWVudCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3NvY2tldHMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInNvY2tldF9sb2NhbF9jbGllbnRfY29ubmVjdCIsCisgICAibGlua2VyX3NldF9rZXkiIDogInNvY2tldF9sb2NhbF9jbGllbnRfY29ubmVjdCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zb2NrZXRzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzb2NrZXRfbG9jYWxfc2VydmVyIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAic29ja2V0X2xvY2FsX3NlcnZlciIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3NvY2tldHMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInNvY2tldF9sb2NhbF9zZXJ2ZXJfYmluZCIsCisgICAibGlua2VyX3NldF9rZXkiIDogInNvY2tldF9sb2NhbF9zZXJ2ZXJfYmluZCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3NvY2tldHMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInNvY2tldF9uZXR3b3JrX2NsaWVudCIsCisgICAibGlua2VyX3NldF9rZXkiIDogInNvY2tldF9uZXR3b3JrX2NsaWVudCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3NvY2tldHMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInNvY2tldF9uZXR3b3JrX2NsaWVudF90aW1lb3V0IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAic29ja2V0X25ldHdvcmtfY2xpZW50X3RpbWVvdXQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zb2NrZXRzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzb2NrZXRfc2VuZF9idWZmZXJzIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAic29ja2V0X3NlbmRfYnVmZmVycyIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQSzIyY3V0aWxzX3NvY2tldF9idWZmZXJfdCIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSW0iCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWwiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc29ja2V0cy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAic3RyX3Bhcm1zX2FkZF9mbG9hdCIsCisgICAibGlua2VyX3NldF9rZXkiIDogInN0cl9wYXJtc19hZGRfZmxvYXQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQOXN0cl9wYXJtcyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWYiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc3RyX3Bhcm1zLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzdHJfcGFybXNfYWRkX2ludCIsCisgICAibGlua2VyX3NldF9rZXkiIDogInN0cl9wYXJtc19hZGRfaW50IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDlzdHJfcGFybXMiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3N0cl9wYXJtcy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAic3RyX3Bhcm1zX2FkZF9zdHIiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJzdHJfcGFybXNfYWRkX3N0ciIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA5c3RyX3Bhcm1zIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3N0cl9wYXJtcy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAic3RyX3Bhcm1zX2NyZWF0ZSIsCisgICAibGlua2VyX3NldF9rZXkiIDogInN0cl9wYXJtc19jcmVhdGUiLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJUDlzdHJfcGFybXMiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc3RyX3Bhcm1zLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzdHJfcGFybXNfY3JlYXRlX3N0ciIsCisgICAibGlua2VyX3NldF9rZXkiIDogInN0cl9wYXJtc19jcmVhdGVfc3RyIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElQOXN0cl9wYXJtcyIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zdHJfcGFybXMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInN0cl9wYXJtc19kZWwiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJzdHJfcGFybXNfZGVsIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDlzdHJfcGFybXMiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc3RyX3Bhcm1zLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzdHJfcGFybXNfZGVzdHJveSIsCisgICAibGlua2VyX3NldF9rZXkiIDogInN0cl9wYXJtc19kZXN0cm95IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDlzdHJfcGFybXMiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc3RyX3Bhcm1zLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzdHJfcGFybXNfZHVtcCIsCisgICAibGlua2VyX3NldF9rZXkiIDogInN0cl9wYXJtc19kdW1wIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDlzdHJfcGFybXMiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc3RyX3Bhcm1zLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzdHJfcGFybXNfZ2V0X2Zsb2F0IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAic3RyX3Bhcm1zX2dldF9mbG9hdCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA5c3RyX3Bhcm1zIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUGYiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc3RyX3Bhcm1zLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzdHJfcGFybXNfZ2V0X2ludCIsCisgICAibGlua2VyX3NldF9rZXkiIDogInN0cl9wYXJtc19nZXRfaW50IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDlzdHJfcGFybXMiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zdHJfcGFybXMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInN0cl9wYXJtc19nZXRfc3RyIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAic3RyX3Bhcm1zX2dldF9zdHIiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQOXN0cl9wYXJtcyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zdHJfcGFybXMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInN0cl9wYXJtc19oYXNfa2V5IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAic3RyX3Bhcm1zX2hhc19rZXkiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQOXN0cl9wYXJtcyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zdHJfcGFybXMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInN0cl9wYXJtc190b19zdHIiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJzdHJfcGFybXNfdG9fc3RyIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDlzdHJfcGFybXMiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVBjIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3N0cl9wYXJtcy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAidWV2ZW50X2JpbmQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJ1ZXZlbnRfYmluZCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvdWV2ZW50LmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJ1ZXZlbnRfY3JlYXRlX3NvY2tldCIsCisgICAibGlua2VyX3NldF9rZXkiIDogInVldmVudF9jcmVhdGVfc29ja2V0IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWIiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvdWV2ZW50LmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJ1ZXZlbnRfa2VybmVsX211bHRpY2FzdF9yZWN2IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAidWV2ZW50X2tlcm5lbF9tdWx0aWNhc3RfcmVjdiIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSW0iCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWwiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvdWV2ZW50LmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJ1ZXZlbnRfa2VybmVsX211bHRpY2FzdF91aWRfcmVjdiIsCisgICAibGlua2VyX3NldF9rZXkiIDogInVldmVudF9rZXJuZWxfbXVsdGljYXN0X3VpZF9yZWN2IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB2IgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJbSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBqIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElsIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3VldmVudC5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAidWV2ZW50X2tlcm5lbF9yZWN2IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAidWV2ZW50X2tlcm5lbF9yZWN2IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB2IgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJbSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWIiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQaiIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJbCIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy91ZXZlbnQuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInVldmVudF9vcGVuX3NvY2tldCIsCisgICAibGlua2VyX3NldF9rZXkiIDogInVldmVudF9vcGVuX3NvY2tldCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEliIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3VldmVudC5oIgorICB9CisgXSwKKyAiZ2xvYmFsX3ZhcnMiIDoKKyBbCisgIHsKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiYXRyYWNlX2VuYWJsZWRfdGFncyIsCisgICAibmFtZSIgOiAiYXRyYWNlX2VuYWJsZWRfdGFncyIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJbSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oIgorICB9LAorICB7CisgICAibGlua2VyX3NldF9rZXkiIDogImF0cmFjZV9pc19yZWFkeSIsCisgICAibmFtZSIgOiAiYXRyYWNlX2lzX3JlYWR5IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElOU3QzX18xNmF0b21pY0liRUUiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvdHJhY2UuaCIKKyAgfSwKKyAgeworICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhdHJhY2VfbWFya2VyX2ZkIiwKKyAgICJuYW1lIiA6ICJhdHJhY2VfbWFya2VyX2ZkIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3RyYWNlLmgiCisgIH0KKyBdLAorICJsdmFsdWVfcmVmZXJlbmNlX3R5cGVzIiA6IFtdLAorICJwb2ludGVyX3R5cGVzIiA6CisgWworICB7CisgICAiYWxpZ25tZW50IiA6IDgsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQMTJJb1NjaGVkQ2xhc3MiLAorICAgIm5hbWUiIDogIklvU2NoZWRDbGFzcyAqIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkxMklvU2NoZWRDbGFzcyIsCisgICAic2l6ZSIgOiA4LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvaW9zY2hlZF9wb2xpY3kuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUDEyUmVjb3JkU3RyZWFtIiwKKyAgICJuYW1lIiA6ICJSZWNvcmRTdHJlYW0gKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJMTJSZWNvcmRTdHJlYW0iLAorICAgInNpemUiIDogOCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3JlY29yZF9zdHJlYW0uaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUDEzbmF0aXZlX2hhbmRsZSIsCisgICAibmFtZSIgOiAibmF0aXZlX2hhbmRsZSAqIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkxM25hdGl2ZV9oYW5kbGUiLAorICAgInNpemUiIDogOCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL25hdGl2ZV9oYW5kbGUuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUDVjbm9kZSIsCisgICAibmFtZSIgOiAiY25vZGUgKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJNWNub2RlIiwKKyAgICJzaXplIiA6IDgsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9jb25maWdfdXRpbHMuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUDdIYXNobWFwIiwKKyAgICJuYW1lIiA6ICJIYXNobWFwICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTdIYXNobWFwIiwKKyAgICJzaXplIiA6IDgsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9oYXNobWFwLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogOCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVA5ZnNfY29uZmlnIiwKKyAgICJuYW1lIiA6ICJmc19jb25maWcgKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJOWZzX2NvbmZpZyIsCisgICAic2l6ZSIgOiA4LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9wcml2YXRlL2ZzX2NvbmZpZy5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDgsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQOXN0cl9wYXJtcyIsCisgICAibmFtZSIgOiAic3RyX3Bhcm1zICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTlzdHJfcGFybXMiLAorICAgInNpemUiIDogOCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3N0cl9wYXJtcy5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDgsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQRmJQdlNfRSIsCisgICAibmFtZSIgOiAiYm9vbCAoKikodm9pZCAqLCB2b2lkICopIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElGYlB2U19FIiwKKyAgICJzaXplIiA6IDgsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9oYXNobWFwLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogOCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBGYlB2U19TX0UiLAorICAgIm5hbWUiIDogImJvb2wgKCopKHZvaWQgKiwgdm9pZCAqLCB2b2lkICopIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElGYlB2U19TX0UiLAorICAgInNpemUiIDogOCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2hhc2htYXAuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEZpUHZFIiwKKyAgICJuYW1lIiA6ICJpbnQgKCopKHZvaWQgKikiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUZpUHZFIiwKKyAgICJzaXplIiA6IDgsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9oYXNobWFwLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogOCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBGdlBLY1MwX1B2RSIsCisgICAibmFtZSIgOiAidm9pZCAoKikoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIHZvaWQgKikiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUZ2UEtjUzBfUHZFIiwKKyAgICJzaXplIiA6IDgsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9wcm9wZXJ0aWVzLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogOCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLMTNuYXRpdmVfaGFuZGxlIiwKKyAgICJuYW1lIiA6ICJjb25zdCBuYXRpdmVfaGFuZGxlICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUsxM25hdGl2ZV9oYW5kbGUiLAorICAgInNpemUiIDogOCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL25hdGl2ZV9oYW5kbGUuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEsyMmN1dGlsc19zb2NrZXRfYnVmZmVyX3QiLAorICAgIm5hbWUiIDogImNvbnN0IGN1dGlsc19zb2NrZXRfYnVmZmVyX3QgKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJSzIyY3V0aWxzX3NvY2tldF9idWZmZXJfdCIsCisgICAic2l6ZSIgOiA4LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc29ja2V0cy5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDgsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQSzVpb3ZlYyIsCisgICAibmFtZSIgOiAiY29uc3QgaW92ZWMgKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJSzVpb3ZlYyIsCisgICAic2l6ZSIgOiA4LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMva2xvZy5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDgsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS2MiLAorICAgIm5hbWUiIDogImNvbnN0IGNoYXIgKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS2MiLAorICAgInNpemUiIDogOCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2NvbmZpZ191dGlscy5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDgsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS3YiLAorICAgIm5hbWUiIDogImNvbnN0IHZvaWQgKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS3YiLAorICAgInNpemUiIDogOCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3NvY2tldHMuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUFB2IiwKKyAgICJuYW1lIiA6ICJ2b2lkICoqIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIsCisgICAic2l6ZSIgOiA4LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvcmVjb3JkX3N0cmVhbS5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDgsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQYyIsCisgICAibmFtZSIgOiAiY2hhciAqIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEljIiwKKyAgICJzaXplIiA6IDgsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9jb25maWdfdXRpbHMuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUGYiLAorICAgIm5hbWUiIDogImZsb2F0ICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWYiLAorICAgInNpemUiIDogOCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3N0cl9wYXJtcy5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDgsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQaSIsCisgICAibmFtZSIgOiAiaW50ICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiLAorICAgInNpemUiIDogOCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2lvc2NoZWRfcG9saWN5LmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogOCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBqIiwKKyAgICJuYW1lIiA6ICJ1bnNpZ25lZCBpbnQgKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIsCisgICAic2l6ZSIgOiA4LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbWlzYy5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDgsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQbSIsCisgICAibmFtZSIgOiAidW5zaWduZWQgbG9uZyAqIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEltIiwKKyAgICJzaXplIiA6IDgsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9yZWNvcmRfc3RyZWFtLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogOCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVB2IiwKKyAgICJuYW1lIiA6ICJ2b2lkICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSXYiLAorICAgInNpemUiIDogOCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL21pc2MuaCIKKyAgfQorIF0sCisgInF1YWxpZmllZF90eXBlcyIgOgorIFsKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImlzX2NvbnN0IiA6IHRydWUsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLMTNuYXRpdmVfaGFuZGxlIiwKKyAgICJuYW1lIiA6ICJjb25zdCBuYXRpdmVfaGFuZGxlIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkxM25hdGl2ZV9oYW5kbGUiLAorICAgInNpemUiIDogMTIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9uYXRpdmVfaGFuZGxlLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogOCwKKyAgICJpc19jb25zdCIgOiB0cnVlLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJSzIyY3V0aWxzX3NvY2tldF9idWZmZXJfdCIsCisgICAibmFtZSIgOiAiY29uc3QgY3V0aWxzX3NvY2tldF9idWZmZXJfdCIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJMjJjdXRpbHNfc29ja2V0X2J1ZmZlcl90IiwKKyAgICJzaXplIiA6IDE2LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc29ja2V0cy5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDgsCisgICAiaXNfY29uc3QiIDogdHJ1ZSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUs1aW92ZWMiLAorICAgIm5hbWUiIDogImNvbnN0IGlvdmVjIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEk1aW92ZWMiLAorICAgInNpemUiIDogMTYsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9rbG9nLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJpc19jb25zdCIgOiB0cnVlLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS2MiLAorICAgIm5hbWUiIDogImNvbnN0IGNoYXIiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWMiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2NvbmZpZ191dGlscy5oIgorICB9LAorICB7CisgICAiaXNfY29uc3QiIDogdHJ1ZSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUt2IiwKKyAgICJuYW1lIiA6ICJjb25zdCB2b2lkIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3NvY2tldHMuaCIKKyAgfQorIF0sCisgInJlY29yZF90eXBlcyIgOgorIFsKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImZpZWxkX25hbWUiIDogInZlcnNpb24iLAorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgImZpZWxkX25hbWUiIDogIm51bUZkcyIsCisgICAgICJmaWVsZF9vZmZzZXQiIDogMzIsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAiZmllbGRfbmFtZSIgOiAibnVtSW50cyIsCisgICAgICJmaWVsZF9vZmZzZXQiIDogNjQsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAiZmllbGRfbmFtZSIgOiAiZGF0YSIsCisgICAgICJmaWVsZF9vZmZzZXQiIDogOTYsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElBMF9pIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEkxM25hdGl2ZV9oYW5kbGUiLAorICAgIm5hbWUiIDogIm5hdGl2ZV9oYW5kbGUiLAorICAgInNpemUiIDogMTIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9uYXRpdmVfaGFuZGxlLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogOCwKKyAgICJmaWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJmaWVsZF9uYW1lIiA6ICJkYXRhIiwKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLdiIKKyAgICB9LAorICAgIHsKKyAgICAgImZpZWxkX25hbWUiIDogImxlbmd0aCIsCisgICAgICJmaWVsZF9vZmZzZXQiIDogNjQsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEltIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEkyMmN1dGlsc19zb2NrZXRfYnVmZmVyX3QiLAorICAgIm5hbWUiIDogImN1dGlsc19zb2NrZXRfYnVmZmVyX3QiLAorICAgInNpemUiIDogMTYsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zb2NrZXRzLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogOCwKKyAgICJmaWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJmaWVsZF9uYW1lIiA6ICJuZXh0IiwKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA1Y25vZGUiCisgICAgfSwKKyAgICB7CisgICAgICJmaWVsZF9uYW1lIiA6ICJmaXJzdF9jaGlsZCIsCisgICAgICJmaWVsZF9vZmZzZXQiIDogNjQsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQNWNub2RlIgorICAgIH0sCisgICAgeworICAgICAiZmllbGRfbmFtZSIgOiAibGFzdF9jaGlsZCIsCisgICAgICJmaWVsZF9vZmZzZXQiIDogMTI4LAorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDVjbm9kZSIKKyAgICB9LAorICAgIHsKKyAgICAgImZpZWxkX25hbWUiIDogIm5hbWUiLAorICAgICAiZmllbGRfb2Zmc2V0IiA6IDE5MiwKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgImZpZWxkX25hbWUiIDogInZhbHVlIiwKKyAgICAgImZpZWxkX29mZnNldCIgOiAyNTYsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSTVjbm9kZSIsCisgICAibmFtZSIgOiAiY25vZGUiLAorICAgInNpemUiIDogNDAsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9jb25maWdfdXRpbHMuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAorICAgImZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImZpZWxkX25hbWUiIDogInVpZCIsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0sCisgICAgeworICAgICAiZmllbGRfbmFtZSIgOiAiZ2lkIiwKKyAgICAgImZpZWxkX29mZnNldCIgOiAzMiwKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfSwKKyAgICB7CisgICAgICJmaWVsZF9uYW1lIiA6ICJtb2RlIiwKKyAgICAgImZpZWxkX29mZnNldCIgOiA2NCwKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfSwKKyAgICB7CisgICAgICJmaWVsZF9uYW1lIiA6ICJjYXBhYmlsaXRpZXMiLAorICAgICAiZmllbGRfb2Zmc2V0IiA6IDEyOCwKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSW0iCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSTlmc19jb25maWciLAorICAgIm5hbWUiIDogImZzX2NvbmZpZyIsCisgICAic2l6ZSIgOiAyNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvcHJpdmF0ZS9mc19jb25maWcuaCIKKyAgfQorIF0sCisgInJ2YWx1ZV9yZWZlcmVuY2VfdHlwZXMiIDogW10KK30KZGlmZiAtLWdpdCBhL2xpYmN1dGlscy9hYmktZHVtcHMvYXJtX2FybTY0L3NvdXJjZS1iYXNlZC9saWJjdXRpbHMuc28ubHNkdW1wIGIvbGliY3V0aWxzL2FiaS1kdW1wcy9hcm1fYXJtNjQvc291cmNlLWJhc2VkL2xpYmN1dGlscy5zby5sc2R1bXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU0MzYxYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmN1dGlscy9hYmktZHVtcHMvYXJtX2FybTY0L3NvdXJjZS1iYXNlZC9saWJjdXRpbHMuc28ubHNkdW1wCkBAIC0wLDAgKzEsMjY4NCBAQAoreworICJhcnJheV90eXBlcyIgOgorIFsKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJQTBfaSIsCisgICAibmFtZSIgOiAiaW50WzBdIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL25hdGl2ZV9oYW5kbGUuaCIKKyAgfQorIF0sCisgImJ1aWx0aW5fdHlwZXMiIDoKKyBbCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJpc19pbnRlZ3JhbCIgOiB0cnVlLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJYSIsCisgICAibmFtZSIgOiAic2lnbmVkIGNoYXIiLAorICAgInNpemUiIDogMQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCisgICAiaXNfaW50ZWdyYWwiIDogdHJ1ZSwKKyAgICJpc191bnNpZ25lZCIgOiB0cnVlLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJYiIsCisgICAibmFtZSIgOiAiYm9vbCIsCisgICAic2l6ZSIgOiAxCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJpc19pbnRlZ3JhbCIgOiB0cnVlLAorICAgImlzX3Vuc2lnbmVkIiA6IHRydWUsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEljIiwKKyAgICJuYW1lIiA6ICJjaGFyIiwKKyAgICJzaXplIiA6IDEKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJZiIsCisgICAibmFtZSIgOiAiZmxvYXQiLAorICAgInNpemUiIDogNAorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCisgICAiaXNfaW50ZWdyYWwiIDogdHJ1ZSwKKyAgICJpc191bnNpZ25lZCIgOiB0cnVlLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJaCIsCisgICAibmFtZSIgOiAidW5zaWduZWQgY2hhciIsCisgICAic2l6ZSIgOiAxCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJpc19pbnRlZ3JhbCIgOiB0cnVlLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJaSIsCisgICAibmFtZSIgOiAiaW50IiwKKyAgICJzaXplIiA6IDQKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImlzX2ludGVncmFsIiA6IHRydWUsCisgICAiaXNfdW5zaWduZWQiIDogdHJ1ZSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSWoiLAorICAgIm5hbWUiIDogInVuc2lnbmVkIGludCIsCisgICAic2l6ZSIgOiA0CisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJpc19pbnRlZ3JhbCIgOiB0cnVlLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJbCIsCisgICAibmFtZSIgOiAibG9uZyIsCisgICAic2l6ZSIgOiA0CisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJpc19pbnRlZ3JhbCIgOiB0cnVlLAorICAgImlzX3Vuc2lnbmVkIiA6IHRydWUsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEltIiwKKyAgICJuYW1lIiA6ICJ1bnNpZ25lZCBsb25nIiwKKyAgICJzaXplIiA6IDQKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAyLAorICAgImlzX2ludGVncmFsIiA6IHRydWUsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElzIiwKKyAgICJuYW1lIiA6ICJzaG9ydCIsCisgICAic2l6ZSIgOiAyCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMiwKKyAgICJpc19pbnRlZ3JhbCIgOiB0cnVlLAorICAgImlzX3Vuc2lnbmVkIiA6IHRydWUsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEl0IiwKKyAgICJuYW1lIiA6ICJ1bnNpZ25lZCBzaG9ydCIsCisgICAic2l6ZSIgOiAyCisgIH0sCisgIHsKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSXYiLAorICAgIm5hbWUiIDogInZvaWQiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogOCwKKyAgICJpc19pbnRlZ3JhbCIgOiB0cnVlLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJeCIsCisgICAibmFtZSIgOiAibG9uZyBsb25nIiwKKyAgICJzaXplIiA6IDgKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAorICAgImlzX2ludGVncmFsIiA6IHRydWUsCisgICAiaXNfdW5zaWduZWQiIDogdHJ1ZSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSXkiLAorICAgIm5hbWUiIDogInVuc2lnbmVkIGxvbmcgbG9uZyIsCisgICAic2l6ZSIgOiA4CisgIH0KKyBdLAorICJlbGZfZnVuY3Rpb25zIiA6CisgWworICB7CisgICAibmFtZSIgOiAiX1oyM3NvY2tldF9tYWtlX3NvY2thZGRyX3VuUEtjaVAxMXNvY2thZGRyX3VuUGkiCisgIH0sCisgIHsKKyAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKKyAgICJuYW1lIiA6ICJfWk43YW5kcm9pZDRiYXNlNFRyaW1JUk5TdDNfXzExMmJhc2ljX3N0cmluZ0ljTlMyXzExY2hhcl90cmFpdHNJY0VFTlMyXzlhbGxvY2F0b3JJY0VFRUVFRVM4X09UXyIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImFuZHJvaWRfZ2V0X2NvbnRyb2xfZmlsZSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImFuZHJvaWRfZ2V0X2NvbnRyb2xfc29ja2V0IgorICB9LAorICB7CisgICAibmFtZSIgOiAiYW5kcm9pZF9nZXRfaW9wcmlvIgorICB9LAorICB7CisgICAibmFtZSIgOiAiYW5kcm9pZF9yZWJvb3QiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhbmRyb2lkX3NldF9pb3ByaW8iCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhc2htZW1fY3JlYXRlX3JlZ2lvbiIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImFzaG1lbV9nZXRfc2l6ZV9yZWdpb24iCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhc2htZW1fcGluX3JlZ2lvbiIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImFzaG1lbV9zZXRfcHJvdF9yZWdpb24iCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhc2htZW1fdW5waW5fcmVnaW9uIgorICB9LAorICB7CisgICAibmFtZSIgOiAiYXNobWVtX3ZhbGlkIgorICB9LAorICB7CisgICAibmFtZSIgOiAiYXRyYWNlX2FzeW5jX2JlZ2luX2JvZHkiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhdHJhY2VfYXN5bmNfZW5kX2JvZHkiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhdHJhY2VfYXN5bmNfZm9yX3RyYWNrX2JlZ2luX2JvZHkiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhdHJhY2VfYXN5bmNfZm9yX3RyYWNrX2VuZF9ib2R5IgorICB9LAorICB7CisgICAibmFtZSIgOiAiYXRyYWNlX2JlZ2luX2JvZHkiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhdHJhY2VfZW5kX2JvZHkiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhdHJhY2VfZ2V0X2VuYWJsZWRfdGFncyIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImF0cmFjZV9pbml0IgorICB9LAorICB7CisgICAibmFtZSIgOiAiYXRyYWNlX2luc3RhbnRfYm9keSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImF0cmFjZV9pbnN0YW50X2Zvcl90cmFja19ib2R5IgorICB9LAorICB7CisgICAibmFtZSIgOiAiYXRyYWNlX2ludDY0X2JvZHkiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhdHJhY2VfaW50X2JvZHkiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJhdHJhY2Vfc2V0X3RyYWNpbmdfZW5hYmxlZCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImF0cmFjZV9zZXR1cCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImF0cmFjZV91cGRhdGVfdGFncyIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImNhbm5lZF9mc19jb25maWciCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJjb25maWdfYm9vbCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImNvbmZpZ19maW5kIgorICB9LAorICB7CisgICAibmFtZSIgOiAiY29uZmlnX2ZyZWUiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJjb25maWdfbG9hZCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImNvbmZpZ19sb2FkX2ZpbGUiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJjb25maWdfbm9kZSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImNvbmZpZ19zZXQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJjb25maWdfc3RyIgorICB9LAorICB7CisgICAibmFtZSIgOiAiZnNfY29uZmlnIgorICB9LAorICB7CisgICAibmFtZSIgOiAiZnNfbWtkaXJzIgorICB9LAorICB7CisgICAibmFtZSIgOiAiZnNfcHJlcGFyZV9kaXIiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJmc19wcmVwYXJlX2Rpcl9zdHJpY3QiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJmc19wcmVwYXJlX2ZpbGVfc3RyaWN0IgorICB9LAorICB7CisgICAibmFtZSIgOiAiZnNfcmVhZF9hdG9taWNfaW50IgorICB9LAorICB7CisgICAibmFtZSIgOiAiZnNfd3JpdGVfYXRvbWljX2ludCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImdldF9mc19jb25maWciCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJoYXNobWFwQ3JlYXRlIgorICB9LAorICB7CisgICAibmFtZSIgOiAiaGFzaG1hcEZvckVhY2giCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJoYXNobWFwRnJlZSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImhhc2htYXBHZXQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJoYXNobWFwSGFzaCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImhhc2htYXBMb2NrIgorICB9LAorICB7CisgICAibmFtZSIgOiAiaGFzaG1hcFB1dCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogImhhc2htYXBSZW1vdmUiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJoYXNobWFwVW5sb2NrIgorICB9LAorICB7CisgICAibmFtZSIgOiAia2xvZ19zZXRfbGV2ZWwiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJrbG9nX3dyaXRlIgorICB9LAorICB7CisgICAibmFtZSIgOiAia2xvZ193cml0ZXYiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJsb2FkX2Nhbm5lZF9mc19jb25maWciCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJsb2FkX2ZpbGUiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJtdWx0aXVzZXJfY29udmVydF9zZGtfc2FuZGJveF90b19hcHBfdWlkIgorICB9LAorICB7CisgICAibmFtZSIgOiAibXVsdGl1c2VyX2dldF9hcHBfaWQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJtdWx0aXVzZXJfZ2V0X2NhY2hlX2dpZCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogIm11bHRpdXNlcl9nZXRfZXh0X2NhY2hlX2dpZCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogIm11bHRpdXNlcl9nZXRfZXh0X2dpZCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogIm11bHRpdXNlcl9nZXRfc2RrX3NhbmRib3hfdWlkIgorICB9LAorICB7CisgICAibmFtZSIgOiAibXVsdGl1c2VyX2dldF9zaGFyZWRfYXBwX2dpZCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogIm11bHRpdXNlcl9nZXRfc2hhcmVkX2dpZCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogIm11bHRpdXNlcl9nZXRfdWlkIgorICB9LAorICB7CisgICAibmFtZSIgOiAibXVsdGl1c2VyX2dldF91c2VyX2lkIgorICB9LAorICB7CisgICAibmFtZSIgOiAibmF0aXZlX2hhbmRsZV9jbG9uZSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogIm5hdGl2ZV9oYW5kbGVfY2xvc2UiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJuYXRpdmVfaGFuZGxlX2Nsb3NlX3dpdGhfdGFnIgorICB9LAorICB7CisgICAibmFtZSIgOiAibmF0aXZlX2hhbmRsZV9jcmVhdGUiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJuYXRpdmVfaGFuZGxlX2RlbGV0ZSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogIm5hdGl2ZV9oYW5kbGVfaW5pdCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogIm5hdGl2ZV9oYW5kbGVfc2V0X2Zkc2FuX3RhZyIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogIm5hdGl2ZV9oYW5kbGVfdW5zZXRfZmRzYW5fdGFnIgorICB9LAorICB7CisgICAibmFtZSIgOiAicGFydGl0aW9uX3dpcGVkIgorICB9LAorICB7CisgICAibmFtZSIgOiAicHJvcGVydHlfZ2V0IgorICB9LAorICB7CisgICAibmFtZSIgOiAicHJvcGVydHlfZ2V0X2Jvb2wiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJwcm9wZXJ0eV9nZXRfaW50MzIiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJwcm9wZXJ0eV9nZXRfaW50NjQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJwcm9wZXJ0eV9saXN0IgorICB9LAorICB7CisgICAibmFtZSIgOiAicHJvcGVydHlfc2V0IgorICB9LAorICB7CisgICAibmFtZSIgOiAicmVjb3JkX3N0cmVhbV9mcmVlIgorICB9LAorICB7CisgICAibmFtZSIgOiAicmVjb3JkX3N0cmVhbV9nZXRfbmV4dCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInJlY29yZF9zdHJlYW1fbmV3IgorICB9LAorICB7CisgICAibmFtZSIgOiAic29ja2V0X2Nsb3NlIgorICB9LAorICB7CisgICAibmFtZSIgOiAic29ja2V0X2dldF9sb2NhbF9wb3J0IgorICB9LAorICB7CisgICAibmFtZSIgOiAic29ja2V0X2luYWRkcl9hbnlfc2VydmVyIgorICB9LAorICB7CisgICAibmFtZSIgOiAic29ja2V0X2xvY2FsX2NsaWVudCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInNvY2tldF9sb2NhbF9jbGllbnRfY29ubmVjdCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInNvY2tldF9sb2NhbF9zZXJ2ZXIiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJzb2NrZXRfbG9jYWxfc2VydmVyX2JpbmQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJzb2NrZXRfbmV0d29ya19jbGllbnQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJzb2NrZXRfbmV0d29ya19jbGllbnRfdGltZW91dCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInNvY2tldF9zZW5kX2J1ZmZlcnMiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJzdHJfcGFybXNfYWRkX2Zsb2F0IgorICB9LAorICB7CisgICAibmFtZSIgOiAic3RyX3Bhcm1zX2FkZF9pbnQiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJzdHJfcGFybXNfYWRkX3N0ciIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInN0cl9wYXJtc19jcmVhdGUiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJzdHJfcGFybXNfY3JlYXRlX3N0ciIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInN0cl9wYXJtc19kZWwiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJzdHJfcGFybXNfZGVzdHJveSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInN0cl9wYXJtc19kdW1wIgorICB9LAorICB7CisgICAibmFtZSIgOiAic3RyX3Bhcm1zX2dldF9mbG9hdCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInN0cl9wYXJtc19nZXRfaW50IgorICB9LAorICB7CisgICAibmFtZSIgOiAic3RyX3Bhcm1zX2dldF9zdHIiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJzdHJfcGFybXNfaGFzX2tleSIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInN0cl9wYXJtc190b19zdHIiCisgIH0sCisgIHsKKyAgICJuYW1lIiA6ICJ1ZXZlbnRfYmluZCIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInVldmVudF9jcmVhdGVfc29ja2V0IgorICB9LAorICB7CisgICAibmFtZSIgOiAidWV2ZW50X2tlcm5lbF9tdWx0aWNhc3RfcmVjdiIKKyAgfSwKKyAgeworICAgIm5hbWUiIDogInVldmVudF9rZXJuZWxfbXVsdGljYXN0X3VpZF9yZWN2IgorICB9LAorICB7CisgICAibmFtZSIgOiAidWV2ZW50X2tlcm5lbF9yZWN2IgorICB9LAorICB7CisgICAibmFtZSIgOiAidWV2ZW50X29wZW5fc29ja2V0IgorICB9CisgXSwKKyAiZWxmX29iamVjdHMiIDoKKyBbCisgIHsKKyAgICJuYW1lIiA6ICJhdHJhY2VfZW5hYmxlZF90YWdzIgorICB9LAorICB7CisgICAibmFtZSIgOiAiYXRyYWNlX2lzX3JlYWR5IgorICB9LAorICB7CisgICAibmFtZSIgOiAiYXRyYWNlX21hcmtlcl9mZCIKKyAgfQorIF0sCisgImVudW1fdHlwZXMiIDoKKyBbCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMCwKKyAgICAgIm5hbWUiIDogIklvU2NoZWRDbGFzc19OT05FIgorICAgIH0sCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiSW9TY2hlZENsYXNzX1JUIgorICAgIH0sCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAyLAorICAgICAibmFtZSIgOiAiSW9TY2hlZENsYXNzX0JFIgorICAgIH0sCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAzLAorICAgICAibmFtZSIgOiAiSW9TY2hlZENsYXNzX0lETEUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSTEySW9TY2hlZENsYXNzIiwKKyAgICJuYW1lIiA6ICJJb1NjaGVkQ2xhc3MiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2lvc2NoZWRfcG9saWN5LmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0KKyBdLAorICJmdW5jdGlvbl90eXBlcyIgOgorIFsKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJRmJQdlNfRSIsCisgICAibmFtZSIgOiAiYm9vbCAodm9pZCAqLCB2b2lkICopIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJYiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9oYXNobWFwLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUZiUHZTX1NfRSIsCisgICAibmFtZSIgOiAiYm9vbCAodm9pZCAqLCB2b2lkICosIHZvaWQgKikiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB2IgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWIiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvaGFzaG1hcC5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElGaVB2RSIsCisgICAibmFtZSIgOiAiaW50ICh2b2lkICopIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvaGFzaG1hcC5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElGdlBLY1MwX1B2RSIsCisgICAibmFtZSIgOiAidm9pZCAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIHZvaWQgKikiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9wcm9wZXJ0aWVzLmgiCisgIH0KKyBdLAorICJmdW5jdGlvbnMiIDoKKyBbCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkX2dldF9jb250cm9sX2ZpbGUiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhbmRyb2lkX2dldF9jb250cm9sX2ZpbGUiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvYW5kcm9pZF9nZXRfY29udHJvbF9maWxlLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkX2dldF9jb250cm9sX3NvY2tldCIsCisgICAibGlua2VyX3NldF9rZXkiIDogImFuZHJvaWRfZ2V0X2NvbnRyb2xfc29ja2V0IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3NvY2tldHMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWRfZ2V0X2lvcHJpbyIsCisgICAibGlua2VyX3NldF9rZXkiIDogImFuZHJvaWRfZ2V0X2lvcHJpbyIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQMTJJb1NjaGVkQ2xhc3MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9pb3NjaGVkX3BvbGljeS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZF9yZWJvb3QiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhbmRyb2lkX3JlYm9vdCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2FuZHJvaWRfcmVib290LmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkX3NldF9pb3ByaW8iLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhbmRyb2lkX3NldF9pb3ByaW8iLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJMTJJb1NjaGVkQ2xhc3MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2lvc2NoZWRfcG9saWN5LmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhc2htZW1fY3JlYXRlX3JlZ2lvbiIsCisgICAibGlua2VyX3NldF9rZXkiIDogImFzaG1lbV9jcmVhdGVfcmVnaW9uIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9hc2htZW0uaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImFzaG1lbV9nZXRfc2l6ZV9yZWdpb24iLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhc2htZW1fZ2V0X3NpemVfcmVnaW9uIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9hc2htZW0uaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImFzaG1lbV9waW5fcmVnaW9uIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiYXNobWVtX3Bpbl9yZWdpb24iLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvYXNobWVtLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhc2htZW1fc2V0X3Byb3RfcmVnaW9uIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiYXNobWVtX3NldF9wcm90X3JlZ2lvbiIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2FzaG1lbS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYXNobWVtX3VucGluX3JlZ2lvbiIsCisgICAibGlua2VyX3NldF9rZXkiIDogImFzaG1lbV91bnBpbl9yZWdpb24iLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvYXNobWVtLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhc2htZW1fdmFsaWQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhc2htZW1fdmFsaWQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2FzaG1lbS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYXRyYWNlX2FzeW5jX2JlZ2luX2JvZHkiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhdHJhY2VfYXN5bmNfYmVnaW5fYm9keSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvdHJhY2UuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImF0cmFjZV9hc3luY19lbmRfYm9keSIsCisgICAibGlua2VyX3NldF9rZXkiIDogImF0cmFjZV9hc3luY19lbmRfYm9keSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvdHJhY2UuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImF0cmFjZV9hc3luY19mb3JfdHJhY2tfYmVnaW5fYm9keSIsCisgICAibGlua2VyX3NldF9rZXkiIDogImF0cmFjZV9hc3luY19mb3JfdHJhY2tfYmVnaW5fYm9keSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvdHJhY2UuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImF0cmFjZV9hc3luY19mb3JfdHJhY2tfZW5kX2JvZHkiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhdHJhY2VfYXN5bmNfZm9yX3RyYWNrX2VuZF9ib2R5IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYXRyYWNlX2JlZ2luX2JvZHkiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhdHJhY2VfYmVnaW5fYm9keSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYXRyYWNlX2VuZF9ib2R5IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiYXRyYWNlX2VuZF9ib2R5IiwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvdHJhY2UuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImF0cmFjZV9nZXRfZW5hYmxlZF90YWdzIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiYXRyYWNlX2dldF9lbmFibGVkX3RhZ3MiLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJeSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYXRyYWNlX2luaXQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhdHJhY2VfaW5pdCIsCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3RyYWNlLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhdHJhY2VfaW5zdGFudF9ib2R5IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiYXRyYWNlX2luc3RhbnRfYm9keSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYXRyYWNlX2luc3RhbnRfZm9yX3RyYWNrX2JvZHkiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhdHJhY2VfaW5zdGFudF9mb3JfdHJhY2tfYm9keSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYXRyYWNlX2ludDY0X2JvZHkiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhdHJhY2VfaW50NjRfYm9keSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSXgiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvdHJhY2UuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImF0cmFjZV9pbnRfYm9keSIsCisgICAibGlua2VyX3NldF9rZXkiIDogImF0cmFjZV9pbnRfYm9keSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvdHJhY2UuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImF0cmFjZV9zZXRfdHJhY2luZ19lbmFibGVkIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiYXRyYWNlX3NldF90cmFjaW5nX2VuYWJsZWQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEliIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3RyYWNlLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhdHJhY2Vfc2V0dXAiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhdHJhY2Vfc2V0dXAiLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYXRyYWNlX3VwZGF0ZV90YWdzIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiYXRyYWNlX3VwZGF0ZV90YWdzIiwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvdHJhY2UuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImNhbm5lZF9mc19jb25maWciLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJjYW5uZWRfZnNfY29uZmlnIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBqIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUGoiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQaiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB5IgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvcHJpdmF0ZS9jYW5uZWRfZnNfY29uZmlnLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJjb25maWdfYm9vbCIsCisgICAibGlua2VyX3NldF9rZXkiIDogImNvbmZpZ19ib29sIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDVjbm9kZSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvY29uZmlnX3V0aWxzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJjb25maWdfZmluZCIsCisgICAibGlua2VyX3NldF9rZXkiIDogImNvbmZpZ19maW5kIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDVjbm9kZSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJUDVjbm9kZSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9jb25maWdfdXRpbHMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImNvbmZpZ19mcmVlIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiY29uZmlnX2ZyZWUiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQNWNub2RlIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2NvbmZpZ191dGlscy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiY29uZmlnX2xvYWQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJjb25maWdfbG9hZCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA1Y25vZGUiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQYyIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9jb25maWdfdXRpbHMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImNvbmZpZ19sb2FkX2ZpbGUiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJjb25maWdfbG9hZF9maWxlIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDVjbm9kZSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9jb25maWdfdXRpbHMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImNvbmZpZ19ub2RlIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiY29uZmlnX25vZGUiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVA1Y25vZGUiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvY29uZmlnX3V0aWxzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJjb25maWdfc2V0IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiY29uZmlnX3NldCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA1Y25vZGUiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvY29uZmlnX3V0aWxzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJjb25maWdfc3RyIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiY29uZmlnX3N0ciIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA1Y25vZGUiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVBLYyIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9jb25maWdfdXRpbHMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImZzX2NvbmZpZyIsCisgICAibGlua2VyX3NldF9rZXkiIDogImZzX2NvbmZpZyIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQaiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBqIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUGoiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQeSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL3ByaXZhdGUvZnNfY29uZmlnLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJmc19ta2RpcnMiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJmc19ta2RpcnMiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEl0IgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2ZzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJmc19wcmVwYXJlX2RpciIsCisgICAibGlua2VyX3NldF9rZXkiIDogImZzX3ByZXBhcmVfZGlyIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJdCIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2ZzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJmc19wcmVwYXJlX2Rpcl9zdHJpY3QiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJmc19wcmVwYXJlX2Rpcl9zdHJpY3QiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEl0IgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvZnMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImZzX3ByZXBhcmVfZmlsZV9zdHJpY3QiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJmc19wcmVwYXJlX2ZpbGVfc3RyaWN0IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJdCIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2ZzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJmc19yZWFkX2F0b21pY19pbnQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJmc19yZWFkX2F0b21pY19pbnQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9mcy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiZnNfd3JpdGVfYXRvbWljX2ludCIsCisgICAibGlua2VyX3NldF9rZXkiIDogImZzX3dyaXRlX2F0b21pY19pbnQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2ZzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJnZXRfZnNfY29uZmlnIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiZ2V0X2ZzX2NvbmZpZyIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWIiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQOWZzX2NvbmZpZyIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJYiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL3ByaXZhdGUvZnNfY29uZmlnLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJoYXNobWFwQ3JlYXRlIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiaGFzaG1hcENyZWF0ZSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQRmlQdkUiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQRmJQdlNfRSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJUDdIYXNobWFwIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2hhc2htYXAuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImhhc2htYXBGb3JFYWNoIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiaGFzaG1hcEZvckVhY2giLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQN0hhc2htYXAiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQRmJQdlNfU19FIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvaGFzaG1hcC5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiaGFzaG1hcEZyZWUiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJoYXNobWFwRnJlZSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA3SGFzaG1hcCIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9oYXNobWFwLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJoYXNobWFwR2V0IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiaGFzaG1hcEdldCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA3SGFzaG1hcCIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB2IgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElQdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9oYXNobWFwLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJoYXNobWFwSGFzaCIsCisgICAibGlua2VyX3NldF9rZXkiIDogImhhc2htYXBIYXNoIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2hhc2htYXAuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImhhc2htYXBMb2NrIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiaGFzaG1hcExvY2siLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQN0hhc2htYXAiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvaGFzaG1hcC5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiaGFzaG1hcFB1dCIsCisgICAibGlua2VyX3NldF9rZXkiIDogImhhc2htYXBQdXQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQN0hhc2htYXAiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB2IgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElQdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9oYXNobWFwLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJoYXNobWFwUmVtb3ZlIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiaGFzaG1hcFJlbW92ZSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA3SGFzaG1hcCIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB2IgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElQdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9oYXNobWFwLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJoYXNobWFwVW5sb2NrIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiaGFzaG1hcFVubG9jayIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA3SGFzaG1hcCIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9oYXNobWFwLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJrbG9nX3NldF9sZXZlbCIsCisgICAibGlua2VyX3NldF9rZXkiIDogImtsb2dfc2V0X2xldmVsIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9rbG9nLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJrbG9nX3dyaXRlIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAia2xvZ193cml0ZSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMva2xvZy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAia2xvZ193cml0ZXYiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJrbG9nX3dyaXRldiIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQSzVpb3ZlYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMva2xvZy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAibG9hZF9jYW5uZWRfZnNfY29uZmlnIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAibG9hZF9jYW5uZWRfZnNfY29uZmlnIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvcHJpdmF0ZS9jYW5uZWRfZnNfY29uZmlnLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJsb2FkX2ZpbGUiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJsb2FkX2ZpbGUiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQaiIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJUHYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbWlzYy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAibXVsdGl1c2VyX2NvbnZlcnRfc2RrX3NhbmRib3hfdG9fYXBwX3VpZCIsCisgICAibGlua2VyX3NldF9rZXkiIDogIm11bHRpdXNlcl9jb252ZXJ0X3Nka19zYW5kYm94X3RvX2FwcF91aWQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElqIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL211bHRpdXNlci5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAibXVsdGl1c2VyX2dldF9hcHBfaWQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJtdWx0aXVzZXJfZ2V0X2FwcF9pZCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWoiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbXVsdGl1c2VyLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJtdWx0aXVzZXJfZ2V0X2NhY2hlX2dpZCIsCisgICAibGlua2VyX3NldF9rZXkiIDogIm11bHRpdXNlcl9nZXRfY2FjaGVfZ2lkIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWoiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbXVsdGl1c2VyLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJtdWx0aXVzZXJfZ2V0X2V4dF9jYWNoZV9naWQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJtdWx0aXVzZXJfZ2V0X2V4dF9jYWNoZV9naWQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9tdWx0aXVzZXIuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogIm11bHRpdXNlcl9nZXRfZXh0X2dpZCIsCisgICAibGlua2VyX3NldF9rZXkiIDogIm11bHRpdXNlcl9nZXRfZXh0X2dpZCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElqIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL211bHRpdXNlci5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAibXVsdGl1c2VyX2dldF9zZGtfc2FuZGJveF91aWQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJtdWx0aXVzZXJfZ2V0X3Nka19zYW5kYm94X3VpZCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElqIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL211bHRpdXNlci5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAibXVsdGl1c2VyX2dldF9zaGFyZWRfYXBwX2dpZCIsCisgICAibGlua2VyX3NldF9rZXkiIDogIm11bHRpdXNlcl9nZXRfc2hhcmVkX2FwcF9naWQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElqIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL211bHRpdXNlci5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAibXVsdGl1c2VyX2dldF9zaGFyZWRfZ2lkIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAibXVsdGl1c2VyX2dldF9zaGFyZWRfZ2lkIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWoiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbXVsdGl1c2VyLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJtdWx0aXVzZXJfZ2V0X3VpZCIsCisgICAibGlua2VyX3NldF9rZXkiIDogIm11bHRpdXNlcl9nZXRfdWlkIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWoiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbXVsdGl1c2VyLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJtdWx0aXVzZXJfZ2V0X3VzZXJfaWQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJtdWx0aXVzZXJfZ2V0X3VzZXJfaWQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElqIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL211bHRpdXNlci5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAibmF0aXZlX2hhbmRsZV9jbG9uZSIsCisgICAibGlua2VyX3NldF9rZXkiIDogIm5hdGl2ZV9oYW5kbGVfY2xvbmUiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQSzEzbmF0aXZlX2hhbmRsZSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJUDEzbmF0aXZlX2hhbmRsZSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9uYXRpdmVfaGFuZGxlLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJuYXRpdmVfaGFuZGxlX2Nsb3NlIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAibmF0aXZlX2hhbmRsZV9jbG9zZSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLMTNuYXRpdmVfaGFuZGxlIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL25hdGl2ZV9oYW5kbGUuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogIm5hdGl2ZV9oYW5kbGVfY2xvc2Vfd2l0aF90YWciLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJuYXRpdmVfaGFuZGxlX2Nsb3NlX3dpdGhfdGFnIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEsxM25hdGl2ZV9oYW5kbGUiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbmF0aXZlX2hhbmRsZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAibmF0aXZlX2hhbmRsZV9jcmVhdGUiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJuYXRpdmVfaGFuZGxlX2NyZWF0ZSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElQMTNuYXRpdmVfaGFuZGxlIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL25hdGl2ZV9oYW5kbGUuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogIm5hdGl2ZV9oYW5kbGVfZGVsZXRlIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAibmF0aXZlX2hhbmRsZV9kZWxldGUiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQMTNuYXRpdmVfaGFuZGxlIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL25hdGl2ZV9oYW5kbGUuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogIm5hdGl2ZV9oYW5kbGVfaW5pdCIsCisgICAibGlua2VyX3NldF9rZXkiIDogIm5hdGl2ZV9oYW5kbGVfaW5pdCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVAxM25hdGl2ZV9oYW5kbGUiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbmF0aXZlX2hhbmRsZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAibmF0aXZlX2hhbmRsZV9zZXRfZmRzYW5fdGFnIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAibmF0aXZlX2hhbmRsZV9zZXRfZmRzYW5fdGFnIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEsxM25hdGl2ZV9oYW5kbGUiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbmF0aXZlX2hhbmRsZS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAibmF0aXZlX2hhbmRsZV91bnNldF9mZHNhbl90YWciLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJuYXRpdmVfaGFuZGxlX3Vuc2V0X2Zkc2FuX3RhZyIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLMTNuYXRpdmVfaGFuZGxlIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL25hdGl2ZV9oYW5kbGUuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInBhcnRpdGlvbl93aXBlZCIsCisgICAibGlua2VyX3NldF9rZXkiIDogInBhcnRpdGlvbl93aXBlZCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9wYXJ0aXRpb25fdXRpbHMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInByb3BlcnR5X2dldCIsCisgICAibGlua2VyX3NldF9rZXkiIDogInByb3BlcnR5X2dldCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3Byb3BlcnRpZXMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInByb3BlcnR5X2dldF9ib29sIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAicHJvcGVydHlfZ2V0X2Jvb2wiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElhIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElhIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3Byb3BlcnRpZXMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInByb3BlcnR5X2dldF9pbnQzMiIsCisgICAibGlua2VyX3NldF9rZXkiIDogInByb3BlcnR5X2dldF9pbnQzMiIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvcHJvcGVydGllcy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAicHJvcGVydHlfZ2V0X2ludDY0IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAicHJvcGVydHlfZ2V0X2ludDY0IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJeCIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJeCIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9wcm9wZXJ0aWVzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJwcm9wZXJ0eV9saXN0IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAicHJvcGVydHlfbGlzdCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBGdlBLY1MwX1B2RSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB2IgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3Byb3BlcnRpZXMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInByb3BlcnR5X3NldCIsCisgICAibGlua2VyX3NldF9rZXkiIDogInByb3BlcnR5X3NldCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9wcm9wZXJ0aWVzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJyZWNvcmRfc3RyZWFtX2ZyZWUiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJyZWNvcmRfc3RyZWFtX2ZyZWUiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQMTJSZWNvcmRTdHJlYW0iCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvcmVjb3JkX3N0cmVhbS5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAicmVjb3JkX3N0cmVhbV9nZXRfbmV4dCIsCisgICAibGlua2VyX3NldF9rZXkiIDogInJlY29yZF9zdHJlYW1fZ2V0X25leHQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQMTJSZWNvcmRTdHJlYW0iCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQUHYiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQaiIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9yZWNvcmRfc3RyZWFtLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJyZWNvcmRfc3RyZWFtX25ldyIsCisgICAibGlua2VyX3NldF9rZXkiIDogInJlY29yZF9zdHJlYW1fbmV3IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVAxMlJlY29yZFN0cmVhbSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9yZWNvcmRfc3RyZWFtLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzb2NrZXRfY2xvc2UiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJzb2NrZXRfY2xvc2UiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3NvY2tldHMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInNvY2tldF9nZXRfbG9jYWxfcG9ydCIsCisgICAibGlua2VyX3NldF9rZXkiIDogInNvY2tldF9nZXRfbG9jYWxfcG9ydCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc29ja2V0cy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAic29ja2V0X2luYWRkcl9hbnlfc2VydmVyIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAic29ja2V0X2luYWRkcl9hbnlfc2VydmVyIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc29ja2V0cy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAic29ja2V0X2xvY2FsX2NsaWVudCIsCisgICAibGlua2VyX3NldF9rZXkiIDogInNvY2tldF9sb2NhbF9jbGllbnQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zb2NrZXRzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzb2NrZXRfbG9jYWxfY2xpZW50X2Nvbm5lY3QiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJzb2NrZXRfbG9jYWxfY2xpZW50X2Nvbm5lY3QiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc29ja2V0cy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAic29ja2V0X2xvY2FsX3NlcnZlciIsCisgICAibGlua2VyX3NldF9rZXkiIDogInNvY2tldF9sb2NhbF9zZXJ2ZXIiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zb2NrZXRzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzb2NrZXRfbG9jYWxfc2VydmVyX2JpbmQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJzb2NrZXRfbG9jYWxfc2VydmVyX2JpbmQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zb2NrZXRzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzb2NrZXRfbmV0d29ya19jbGllbnQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJzb2NrZXRfbmV0d29ya19jbGllbnQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zb2NrZXRzLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzb2NrZXRfbmV0d29ya19jbGllbnRfdGltZW91dCIsCisgICAibGlua2VyX3NldF9rZXkiIDogInNvY2tldF9uZXR3b3JrX2NsaWVudF90aW1lb3V0IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUGkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc29ja2V0cy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAic29ja2V0X3NlbmRfYnVmZmVycyIsCisgICAibGlua2VyX3NldF9rZXkiIDogInNvY2tldF9zZW5kX2J1ZmZlcnMiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEsyMmN1dGlsc19zb2NrZXRfYnVmZmVyX3QiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3NvY2tldHMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInN0cl9wYXJtc19hZGRfZmxvYXQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJzdHJfcGFybXNfYWRkX2Zsb2F0IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDlzdHJfcGFybXMiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElmIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3N0cl9wYXJtcy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAic3RyX3Bhcm1zX2FkZF9pbnQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJzdHJfcGFybXNfYWRkX2ludCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA5c3RyX3Bhcm1zIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zdHJfcGFybXMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInN0cl9wYXJtc19hZGRfc3RyIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAic3RyX3Bhcm1zX2FkZF9zdHIiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQOXN0cl9wYXJtcyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zdHJfcGFybXMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInN0cl9wYXJtc19jcmVhdGUiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJzdHJfcGFybXNfY3JlYXRlIiwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVA5c3RyX3Bhcm1zIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3N0cl9wYXJtcy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAic3RyX3Bhcm1zX2NyZWF0ZV9zdHIiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJzdHJfcGFybXNfY3JlYXRlX3N0ciIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJUDlzdHJfcGFybXMiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc3RyX3Bhcm1zLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzdHJfcGFybXNfZGVsIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAic3RyX3Bhcm1zX2RlbCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA5c3RyX3Bhcm1zIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3N0cl9wYXJtcy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAic3RyX3Bhcm1zX2Rlc3Ryb3kiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJzdHJfcGFybXNfZGVzdHJveSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA5c3RyX3Bhcm1zIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3N0cl9wYXJtcy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAic3RyX3Bhcm1zX2R1bXAiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJzdHJfcGFybXNfZHVtcCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA5c3RyX3Bhcm1zIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3N0cl9wYXJtcy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAic3RyX3Bhcm1zX2dldF9mbG9hdCIsCisgICAibGlua2VyX3NldF9rZXkiIDogInN0cl9wYXJtc19nZXRfZmxvYXQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQOXN0cl9wYXJtcyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBmIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3N0cl9wYXJtcy5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAic3RyX3Bhcm1zX2dldF9pbnQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJzdHJfcGFybXNfZ2V0X2ludCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA5c3RyX3Bhcm1zIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUGkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc3RyX3Bhcm1zLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzdHJfcGFybXNfZ2V0X3N0ciIsCisgICAibGlua2VyX3NldF9rZXkiIDogInN0cl9wYXJtc19nZXRfc3RyIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDlzdHJfcGFybXMiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQYyIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc3RyX3Bhcm1zLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzdHJfcGFybXNfaGFzX2tleSIsCisgICAibGlua2VyX3NldF9rZXkiIDogInN0cl9wYXJtc19oYXNfa2V5IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDlzdHJfcGFybXMiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc3RyX3Bhcm1zLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJzdHJfcGFybXNfdG9fc3RyIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAic3RyX3Bhcm1zX3RvX3N0ciIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVA5c3RyX3Bhcm1zIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElQYyIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zdHJfcGFybXMuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInVldmVudF9iaW5kIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAidWV2ZW50X2JpbmQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3VldmVudC5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAidWV2ZW50X2NyZWF0ZV9zb2NrZXQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJ1ZXZlbnRfY3JlYXRlX3NvY2tldCIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEliIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3VldmVudC5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAidWV2ZW50X2tlcm5lbF9tdWx0aWNhc3RfcmVjdiIsCisgICAibGlua2VyX3NldF9rZXkiIDogInVldmVudF9rZXJuZWxfbXVsdGljYXN0X3JlY3YiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3VldmVudC5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAidWV2ZW50X2tlcm5lbF9tdWx0aWNhc3RfdWlkX3JlY3YiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJ1ZXZlbnRfa2VybmVsX211bHRpY2FzdF91aWRfcmVjdiIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQaiIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy91ZXZlbnQuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogInVldmVudF9rZXJuZWxfcmVjdiIsCisgICAibGlua2VyX3NldF9rZXkiIDogInVldmVudF9rZXJuZWxfcmVjdiIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEliIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUGoiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvdWV2ZW50LmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJ1ZXZlbnRfb3Blbl9zb2NrZXQiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJ1ZXZlbnRfb3Blbl9zb2NrZXQiLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJYiIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy91ZXZlbnQuaCIKKyAgfQorIF0sCisgImdsb2JhbF92YXJzIiA6CisgWworICB7CisgICAibGlua2VyX3NldF9rZXkiIDogImF0cmFjZV9lbmFibGVkX3RhZ3MiLAorICAgIm5hbWUiIDogImF0cmFjZV9lbmFibGVkX3RhZ3MiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSXkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvdHJhY2UuaCIKKyAgfSwKKyAgeworICAgImxpbmtlcl9zZXRfa2V5IiA6ICJhdHJhY2VfaXNfcmVhZHkiLAorICAgIm5hbWUiIDogImF0cmFjZV9pc19yZWFkeSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTlN0M19fMTZhdG9taWNJYkVFIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3RyYWNlLmgiCisgIH0sCisgIHsKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiYXRyYWNlX21hcmtlcl9mZCIsCisgICAibmFtZSIgOiAiYXRyYWNlX21hcmtlcl9mZCIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oIgorICB9CisgXSwKKyAibHZhbHVlX3JlZmVyZW5jZV90eXBlcyIgOiBbXSwKKyAicG9pbnRlcl90eXBlcyIgOgorIFsKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUDEySW9TY2hlZENsYXNzIiwKKyAgICJuYW1lIiA6ICJJb1NjaGVkQ2xhc3MgKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJMTJJb1NjaGVkQ2xhc3MiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2lvc2NoZWRfcG9saWN5LmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVAxMlJlY29yZFN0cmVhbSIsCisgICAibmFtZSIgOiAiUmVjb3JkU3RyZWFtICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTEyUmVjb3JkU3RyZWFtIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9yZWNvcmRfc3RyZWFtLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVAxM25hdGl2ZV9oYW5kbGUiLAorICAgIm5hbWUiIDogIm5hdGl2ZV9oYW5kbGUgKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJMTNuYXRpdmVfaGFuZGxlIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9uYXRpdmVfaGFuZGxlLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVA1Y25vZGUiLAorICAgIm5hbWUiIDogImNub2RlICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTVjbm9kZSIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvY29uZmlnX3V0aWxzLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVA3SGFzaG1hcCIsCisgICAibmFtZSIgOiAiSGFzaG1hcCAqIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEk3SGFzaG1hcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvaGFzaG1hcC5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQOWZzX2NvbmZpZyIsCisgICAibmFtZSIgOiAiZnNfY29uZmlnICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTlmc19jb25maWciLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvcHJpdmF0ZS9mc19jb25maWcuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUDlzdHJfcGFybXMiLAorICAgIm5hbWUiIDogInN0cl9wYXJtcyAqIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEk5c3RyX3Bhcm1zIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zdHJfcGFybXMuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEZiUHZTX0UiLAorICAgIm5hbWUiIDogImJvb2wgKCopKHZvaWQgKiwgdm9pZCAqKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJRmJQdlNfRSIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvaGFzaG1hcC5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQRmJQdlNfU19FIiwKKyAgICJuYW1lIiA6ICJib29sICgqKSh2b2lkICosIHZvaWQgKiwgdm9pZCAqKSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJRmJQdlNfU19FIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9oYXNobWFwLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBGaVB2RSIsCisgICAibmFtZSIgOiAiaW50ICgqKSh2b2lkICopIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElGaVB2RSIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvaGFzaG1hcC5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQRnZQS2NTMF9QdkUiLAorICAgIm5hbWUiIDogInZvaWQgKCopKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCB2b2lkICopIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElGdlBLY1MwX1B2RSIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvcHJvcGVydGllcy5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQSzEzbmF0aXZlX2hhbmRsZSIsCisgICAibmFtZSIgOiAiY29uc3QgbmF0aXZlX2hhbmRsZSAqIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLMTNuYXRpdmVfaGFuZGxlIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9uYXRpdmVfaGFuZGxlLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLMjJjdXRpbHNfc29ja2V0X2J1ZmZlcl90IiwKKyAgICJuYW1lIiA6ICJjb25zdCBjdXRpbHNfc29ja2V0X2J1ZmZlcl90ICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUsyMmN1dGlsc19zb2NrZXRfYnVmZmVyX3QiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3NvY2tldHMuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEs1aW92ZWMiLAorICAgIm5hbWUiIDogImNvbnN0IGlvdmVjICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUs1aW92ZWMiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2tsb2cuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEtjIiwKKyAgICJuYW1lIiA6ICJjb25zdCBjaGFyICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtjIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9jb25maWdfdXRpbHMuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEt2IiwKKyAgICJuYW1lIiA6ICJjb25zdCB2b2lkICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUt2IiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zb2NrZXRzLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBQdiIsCisgICAibmFtZSIgOiAidm9pZCAqKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3JlY29yZF9zdHJlYW0uaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUGMiLAorICAgIm5hbWUiIDogImNoYXIgKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJYyIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvY29uZmlnX3V0aWxzLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBmIiwKKyAgICJuYW1lIiA6ICJmbG9hdCAqIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElmIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9zdHJfcGFybXMuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUGkiLAorICAgIm5hbWUiIDogImludCAqIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy9pb3NjaGVkX3BvbGljeS5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQaiIsCisgICAibmFtZSIgOiAidW5zaWduZWQgaW50ICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL21pc2MuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUHYiLAorICAgIm5hbWUiIDogInZvaWQgKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJdiIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbWlzYy5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQeSIsCisgICAibmFtZSIgOiAidW5zaWduZWQgbG9uZyBsb25nICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSXkiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvcHJpdmF0ZS9jYW5uZWRfZnNfY29uZmlnLmgiCisgIH0KKyBdLAorICJxdWFsaWZpZWRfdHlwZXMiIDoKKyBbCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJpc19jb25zdCIgOiB0cnVlLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJSzEzbmF0aXZlX2hhbmRsZSIsCisgICAibmFtZSIgOiAiY29uc3QgbmF0aXZlX2hhbmRsZSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJMTNuYXRpdmVfaGFuZGxlIiwKKyAgICJzaXplIiA6IDEyLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvbmF0aXZlX2hhbmRsZS5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiaXNfY29uc3QiIDogdHJ1ZSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUsyMmN1dGlsc19zb2NrZXRfYnVmZmVyX3QiLAorICAgIm5hbWUiIDogImNvbnN0IGN1dGlsc19zb2NrZXRfYnVmZmVyX3QiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTIyY3V0aWxzX3NvY2tldF9idWZmZXJfdCIsCisgICAic2l6ZSIgOiA4LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc29ja2V0cy5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiaXNfY29uc3QiIDogdHJ1ZSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUs1aW92ZWMiLAorICAgIm5hbWUiIDogImNvbnN0IGlvdmVjIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEk1aW92ZWMiLAorICAgInNpemUiIDogOCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2tsb2cuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAorICAgImlzX2NvbnN0IiA6IHRydWUsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLYyIsCisgICAibmFtZSIgOiAiY29uc3QgY2hhciIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJYyIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvY29uZmlnX3V0aWxzLmgiCisgIH0sCisgIHsKKyAgICJpc19jb25zdCIgOiB0cnVlLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS3YiLAorICAgIm5hbWUiIDogImNvbnN0IHZvaWQiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc29ja2V0cy5oIgorICB9CisgXSwKKyAicmVjb3JkX3R5cGVzIiA6CisgWworICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZmllbGRfbmFtZSIgOiAidmVyc2lvbiIsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAiZmllbGRfbmFtZSIgOiAibnVtRmRzIiwKKyAgICAgImZpZWxkX29mZnNldCIgOiAzMiwKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJmaWVsZF9uYW1lIiA6ICJudW1JbnRzIiwKKyAgICAgImZpZWxkX29mZnNldCIgOiA2NCwKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJmaWVsZF9uYW1lIiA6ICJkYXRhIiwKKyAgICAgImZpZWxkX29mZnNldCIgOiA5NiwKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUEwX2kiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSTEzbmF0aXZlX2hhbmRsZSIsCisgICAibmFtZSIgOiAibmF0aXZlX2hhbmRsZSIsCisgICAic2l6ZSIgOiAxMiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL25hdGl2ZV9oYW5kbGUuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImZpZWxkX25hbWUiIDogImRhdGEiLAorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEt2IgorICAgIH0sCisgICAgeworICAgICAiZmllbGRfbmFtZSIgOiAibGVuZ3RoIiwKKyAgICAgImZpZWxkX29mZnNldCIgOiAzMiwKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSTIyY3V0aWxzX3NvY2tldF9idWZmZXJfdCIsCisgICAibmFtZSIgOiAiY3V0aWxzX3NvY2tldF9idWZmZXJfdCIsCisgICAic2l6ZSIgOiA4LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvc29ja2V0cy5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZmllbGRfbmFtZSIgOiAibmV4dCIsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQNWNub2RlIgorICAgIH0sCisgICAgeworICAgICAiZmllbGRfbmFtZSIgOiAiZmlyc3RfY2hpbGQiLAorICAgICAiZmllbGRfb2Zmc2V0IiA6IDMyLAorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDVjbm9kZSIKKyAgICB9LAorICAgIHsKKyAgICAgImZpZWxkX25hbWUiIDogImxhc3RfY2hpbGQiLAorICAgICAiZmllbGRfb2Zmc2V0IiA6IDY0LAorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUDVjbm9kZSIKKyAgICB9LAorICAgIHsKKyAgICAgImZpZWxkX25hbWUiIDogIm5hbWUiLAorICAgICAiZmllbGRfb2Zmc2V0IiA6IDk2LAorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0sCisgICAgeworICAgICAiZmllbGRfbmFtZSIgOiAidmFsdWUiLAorICAgICAiZmllbGRfb2Zmc2V0IiA6IDEyOCwKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJNWNub2RlIiwKKyAgICJuYW1lIiA6ICJjbm9kZSIsCisgICAic2l6ZSIgOiAyMCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL2NvbmZpZ191dGlscy5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDgsCisgICAiZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZmllbGRfbmFtZSIgOiAidWlkIiwKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCisgICAgfSwKKyAgICB7CisgICAgICJmaWVsZF9uYW1lIiA6ICJnaWQiLAorICAgICAiZmllbGRfb2Zmc2V0IiA6IDMyLAorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9LAorICAgIHsKKyAgICAgImZpZWxkX25hbWUiIDogIm1vZGUiLAorICAgICAiZmllbGRfb2Zmc2V0IiA6IDY0LAorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJdCIKKyAgICB9LAorICAgIHsKKyAgICAgImZpZWxkX25hbWUiIDogImNhcGFiaWxpdGllcyIsCisgICAgICJmaWVsZF9vZmZzZXQiIDogMTI4LAorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJeSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJOWZzX2NvbmZpZyIsCisgICAibmFtZSIgOiAiZnNfY29uZmlnIiwKKyAgICJzaXplIiA6IDI0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJjdXRpbHMvaW5jbHVkZS9wcml2YXRlL2ZzX2NvbmZpZy5oIgorICB9CisgXSwKKyAicnZhbHVlX3JlZmVyZW5jZV90eXBlcyIgOiBbXQorfQpkaWZmIC0tZ2l0IGEvbGliY3V0aWxzL2FyY2gteDg2L2NhY2hlLmggYi9saWJjdXRpbHMvYXJjaC14ODYvY2FjaGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMyMmZlYS4uMDAwMDAwMAotLS0gYS9saWJjdXRpbHMvYXJjaC14ODYvY2FjaGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWYgZGVmaW5lZChfX3NsbV9fKQotLyogVmFsdWVzIGFyZSBvcHRpbWl6ZWQgZm9yIFNpbHZlcm1vbnQgKi8KLSNkZWZpbmUgU0hBUkVEX0NBQ0hFX1NJWkUgICAoMTAyNCoxMDI0KSAgICAgICAgIC8qIFNpbHZlcm1vbnQgTDIgQ2FjaGUgKi8KLSNkZWZpbmUgREFUQV9DQUNIRV9TSVpFICAgICAoMjQqMTAyNCkgICAgICAgICAgIC8qIFNpbHZlcm1vbnQgTDEgRGF0YSBDYWNoZSAqLwotI2Vsc2UKLS8qIFZhbHVlcyBhcmUgb3B0aW1pemVkIGZvciBBdG9tICovCi0jZGVmaW5lIFNIQVJFRF9DQUNIRV9TSVpFICAgKDUxMioxMDI0KSAgICAgICAgICAvKiBBdG9tIEwyIENhY2hlICovCi0jZGVmaW5lIERBVEFfQ0FDSEVfU0laRSAgICAgKDI0KjEwMjQpICAgICAgICAgICAvKiBBdG9tIEwxIERhdGEgQ2FjaGUgKi8KLSNlbmRpZgotCi0jZGVmaW5lIFNIQVJFRF9DQUNIRV9TSVpFX0hBTEYgIChTSEFSRURfQ0FDSEVfU0laRSAvIDIpCi0jZGVmaW5lIERBVEFfQ0FDSEVfU0laRV9IQUxGICAgIChEQVRBX0NBQ0hFX1NJWkUgLyAyKQpkaWZmIC0tZ2l0IGEvbGliY3V0aWxzL2FyY2gteDg2XzY0L2NhY2hlLmggYi9saWJjdXRpbHMvYXJjaC14ODZfNjQvY2FjaGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE0NDMwOS4uMDAwMDAwMAotLS0gYS9saWJjdXRpbHMvYXJjaC14ODZfNjQvY2FjaGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKiBWYWx1ZXMgYXJlIG9wdGltaXplZCBmb3IgU2lsdmVybW9udCAqLwotI2RlZmluZSBTSEFSRURfQ0FDSEVfU0laRQkoMTAyNCoxMDI0KQkJCS8qIFNpbHZlcm1vbnQgTDIgQ2FjaGUgKi8KLSNkZWZpbmUgREFUQV9DQUNIRV9TSVpFCQkoMjQqMTAyNCkJCQkvKiBTaWx2ZXJtb250IEwxIERhdGEgQ2FjaGUgKi8KLQotI2RlZmluZSBTSEFSRURfQ0FDSEVfU0laRV9IQUxGCShTSEFSRURfQ0FDSEVfU0laRSAvIDIpCi0jZGVmaW5lIERBVEFfQ0FDSEVfU0laRV9IQUxGCShEQVRBX0NBQ0hFX1NJWkUgLyAyKQpkaWZmIC0tZ2l0IGEvbGliY3V0aWxzL2FzaG1lbS1kZXYuY3BwIGIvbGliY3V0aWxzL2FzaG1lbS1kZXYuY3BwCmluZGV4IDU2ZDY4NzUuLjQ2YjhlZjIgMTAwNjQ0Ci0tLSBhL2xpYmN1dGlscy9hc2htZW0tZGV2LmNwcAorKysgYi9saWJjdXRpbHMvYXNobWVtLWRldi5jcHAKQEAgLTQ0LDE2ICs0NCw2IEBACiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CiAKLS8qIFdpbGwgYmUgYWRkZWQgdG8gVUFQSSBvbmNlIHVwc3RyZWFtIGNoYW5nZSBpcyBtZXJnZWQgKi8KLSNkZWZpbmUgRl9TRUFMX0ZVVFVSRV9XUklURSAweDAwMTAKLQotLyoKLSAqIFRoZSBtaW5pbXVtIHZlbmRvciBBUEkgbGV2ZWwgYXQgYW5kIGFmdGVyIHdoaWNoIGl0IGlzIHNhZmUgdG8gdXNlIG1lbWZkLgotICogVGhpcyBpcyB0byBmYWNpbGl0YXRlIGRlcHJlY2F0aW9uIG9mIGFzaG1lbS4KLSAqLwotI2RlZmluZSBNSU5fTUVNRkRfVkVORE9SX0FQSV9MRVZFTCAyOQotI2RlZmluZSBNSU5fTUVNRkRfVkVORE9SX0FQSV9MRVZFTF9DSEFSICdRJwotCiAvKiBhc2htZW0gaWRlbnRpdHkgKi8KIHN0YXRpYyBkZXZfdCBfX2FzaG1lbV9yZGV2OwogLyoKQEAgLTkxLDU1ICs4MSwxNyBAQAogCiAvKiBEZXRlcm1pbmUgaWYgdmVuZG9yIHByb2Nlc3NlcyB3b3VsZCBiZSBvayB3aXRoIG1lbWZkIGluIHRoZSBzeXN0ZW06CiAgKgotICogSWYgVk5ESyBpcyB1c2luZyBvbGRlciBsaWJjdXRpbHMsIGRvbid0IHVzZSBtZW1mZC4gVGhpcyBpcyBzbyB0aGF0IHRoZQotICogc2FtZSBzaGFyZWQgbWVtb3J5IG1lY2hhbmlzbSBpcyB1c2VkIGFjcm9zcyBiaW5kZXIgdHJhbnNhY3Rpb25zIGJldHdlZW4KLSAqIHZlbmRvciBwYXJ0aXRpb24gcHJvY2Vzc2VzIGFuZCBzeXN0ZW0gcGFydGl0aW9uIHByb2Nlc3Nlcy4KKyAqIFByZXZpb3VzbHkgdGhpcyBmdW5jdGlvbiBjaGVja2VkIGlmIG1lbWZkIGlzIHN1cHBvcnRlZCBieSBjaGVja2luZyBpZgorICogdmVuZG9yIFZOREsgdmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gUS4gQXMgd2UgY2FuIGFzc3VtZSBhbGwgdHJlYmxlbGl6ZWQKKyAqIGRldmljZSB1c2luZyB0aGlzIGNvZGUgaXMgdXAgdG8gZGF0ZSBlbm91Z2ggdG8gdXNlIG1lbWZkLCBtZW1mZCBpcyBhbGxvd2VkCisgKiBpZiB0aGUgZGV2aWNlIGlzIHRyZWJsZWxpemVkLgogICovCiBzdGF0aWMgYm9vbCBjaGVja192ZW5kb3JfbWVtZmRfYWxsb3dlZCgpIHsKLSAgICBzdGQ6OnN0cmluZyB2bmRrX3ZlcnNpb24gPSBhbmRyb2lkOjpiYXNlOjpHZXRQcm9wZXJ0eSgicm8udm5kay52ZXJzaW9uIiwgIiIpOworICAgIHN0YXRpYyBib29sIGlzX3RyZWJsZWxpemVkID0gYW5kcm9pZDo6YmFzZTo6R2V0Qm9vbFByb3BlcnR5KCJyby50cmVibGUuZW5hYmxlZCIsIGZhbHNlKTsKIAotICAgIGlmICh2bmRrX3ZlcnNpb24gPT0gIiIpIHsKLSAgICAgICAgQUxPR0UoIm1lbWZkOiByby52bmRrLnZlcnNpb24gbm90IGRlZmluZWQgb3IgaW52YWxpZCAoJXMpLCB0aGlzIGlzIG1hbmRhdGVkIHNpbmNlIFAuXG4iLAotICAgICAgICAgICAgICB2bmRrX3ZlcnNpb24uY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKiBObyBpc3N1ZXMgaWYgdmVuZG9yIGlzIHRhcmdldHRpbmcgY3VycmVudCBEZXNzZXJ0ICovCi0gICAgaWYgKHZuZGtfdmVyc2lvbiA9PSAiY3VycmVudCIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qIENoZWNrIGlmIFZOREsgdmVyc2lvbiBpcyBhIG51bWJlciBhbmQgYWN0IG9uIGl0ICovCi0gICAgY2hhciogcDsKLSAgICBsb25nIGludCB2ZXJzID0gc3RydG9sKHZuZGtfdmVyc2lvbi5jX3N0cigpLCAmcCwgMTApOwotICAgIGlmICgqcCA9PSAwKSB7Ci0gICAgICAgIGlmICh2ZXJzIDwgTUlOX01FTUZEX1ZFTkRPUl9BUElfTEVWRUwpIHsKLSAgICAgICAgICAgIEFMT0dJKCJtZW1mZDogZGV2aWNlIFZOREsgdmVyc2lvbiAoJXMpIGlzIDwgUSBzbyB1c2luZyBhc2htZW0uXG4iLAotICAgICAgICAgICAgICAgICAgdm5ka192ZXJzaW9uLmNfc3RyKCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8gTm9uLW51bWVyaWMgc2hvdWxkIGJlIGEgc2luZ2xlIEFTQ0lJIGNoYXJhY3Rlci4gQ2hhcmFjdGVycyBhZnRlciB0aGUKLSAgICAvLyBmaXJzdCBhcmUgaWdub3JlZC4KLSAgICBpZiAodG9sb3dlcih2bmRrX3ZlcnNpb25bMF0pIDwgJ2EnIHx8IHRvbG93ZXIodm5ka192ZXJzaW9uWzBdKSA+ICd6JykgewotICAgICAgICBBTE9HRSgibWVtZmQ6IHJvLnZuZGsudmVyc2lvbiBub3QgZGVmaW5lZCBvciBpbnZhbGlkICglcyksIHRoaXMgaXMgbWFuZGF0ZWQgc2luY2UgUC5cbiIsCi0gICAgICAgICAgICAgIHZuZGtfdmVyc2lvbi5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICh0b2xvd2VyKHZuZGtfdmVyc2lvblswXSkgPCB0b2xvd2VyKE1JTl9NRU1GRF9WRU5ET1JfQVBJX0xFVkVMX0NIQVIpKSB7Ci0gICAgICAgIEFMT0dJKCJtZW1mZDogZGV2aWNlIGlzIHVzaW5nIFZOREsgdmVyc2lvbiAoJXMpIHdoaWNoIGlzIGxlc3MgdGhhbiBRLiBVc2UgYXNobWVtIG9ubHkuXG4iLAotICAgICAgICAgICAgICB2bmRrX3ZlcnNpb24uY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gaXNfdHJlYmxlbGl6ZWQ7CiB9CiAKLQogLyogRGV0ZXJtaW5lIGlmIG1lbWZkIGNhbiBiZSBzdXBwb3J0ZWQuIFRoaXMgaXMganVzdCBvbmUtdGltZSBoYXJkd29yawogICogd2hpY2ggd2lsbCBiZSBjYWNoZWQgYnkgdGhlIGNhbGxlci4KICAqLwpkaWZmIC0tZ2l0IGEvbGliY3V0aWxzL2FzaG1lbS1ob3N0LmNwcCBiL2xpYmN1dGlscy9hc2htZW0taG9zdC5jcHAKaW5kZXggMmJhMWViMC4uOTAwM2I3NiAxMDA2NDQKLS0tIGEvbGliY3V0aWxzL2FzaG1lbS1ob3N0LmNwcAorKysgYi9saWJjdXRpbHMvYXNobWVtLWhvc3QuY3BwCkBAIC0xNywxMCArMTcsMTMgQEAKICNpbmNsdWRlIDxjdXRpbHMvYXNobWVtLmg+CiAKIC8qCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgdXNlci1zcGFjZSBhc2htZW0gQVBJIGZvciB0aGUgc2ltdWxhdG9yLCB3aGljaCBsYWNrcwotICogYW4gYXNobWVtLWVuYWJsZWQga2VybmVsLiBTZWUgYXNobWVtLWRldi5jIGZvciB0aGUgcmVhbCBhc2htZW0tYmFzZWQgdmVyc2lvbi4KKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB1c2VyLXNwYWNlIGFzaG1lbSBBUEkgZm9yIHRoZSBzaW11bGF0b3IsIHdoaWNoIGxhY2tzIGFuCisgKiBhc2htZW0tZW5hYmxlZCBrZXJuZWwuIFNlZSBhc2htZW0tZGV2LmMgZm9yIHRoZSByZWFsIGFzaG1lbS1iYXNlZCB2ZXJzaW9uLiAgQQorICogZGlzay1iYWNrZWQgdGVtcCBmaWxlIGlzIHRoZSBiZXN0IG9wdGlvbiB0aGF0IGlzIGNvbnNpc3RlbnRseSBzdXBwb3J0ZWQKKyAqIGFjcm9zcyBhbGwgaG9zdCBwbGF0Zm9ybXMuCiAgKi8KIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+CkBAIC0zMSw4ICszNCwxMCBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KLQogI2luY2x1ZGUgPHV0aWxzL0NvbXBhdC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOwogCiBzdGF0aWMgYm9vbCBhc2htZW1fdmFsaWRhdGVfc3RhdChpbnQgZmQsIHN0cnVjdCBzdGF0KiBidWYpIHsKICAgICBpbnQgcmVzdWx0ID0gZnN0YXQoZmQsIGJ1Zik7CkBAIC00MCwxNSArNDUsMjAgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIC8qCi0gICAgICogQ2hlY2sgaWYgdGhpcyBpcyBhbiAiYXNobWVtIiByZWdpb24uCi0gICAgICogVE9ETzogVGhpcyBpcyB2ZXJ5IGhhY2t5LCBhbmQgY2FuIGVhc2lseSBicmVhay4KLSAgICAgKiBXZSBuZWVkIHNvbWUgcmVsaWFibGUgaW5kaWNhdG9yLgotICAgICAqLwotICAgIGlmICghKGJ1Zi0+c3RfbmxpbmsgPT0gMCAmJiBTX0lTUkVHKGJ1Zi0+c3RfbW9kZSkpKSB7CisgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhbiBhc2htZW0gcmVnaW9uLiBTaW5jZSB0aGVyZSdzIG5vIHN1Y2ggdGhpbmcgb24gdGhlIGhvc3QsCisgICAgLy8gd2UgY2FuJ3QgYWN0dWFsbHkgaW1wbGVtZW50IHRoYXQuIENoZWNrIHRoYXQgaXQncyBhdCBsZWFzdCBhIHJlZ3VsYXIgZmlsZS4KKyAgICBpZiAoIVNfSVNSRUcoYnVmLT5zdF9tb2RlKSkgewogICAgICAgICBlcnJubyA9IEVOT1RUWTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KKyAgICAvLyBJbiBXaW4zMiwgdW5saWtlIFVuaXgsIHRoZSB0ZW1wIGZpbGUgaXMgbm90IHVubGlua2VkIGltbWVkaWF0ZWx5IGFmdGVyCisgICAgLy8gY3JlYXRpb24uCisjaWYgIWRlZmluZWQoX1dJTjMyKQorICAgIGlmIChidWYtPnN0X25saW5rICE9IDApIHsKKyAgICAgICAgZXJybm8gPSBFTk9UVFk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisjZW5kaWYKICAgICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtNTgsMTkgKzY4LDI0IEBACiB9CiAKIGludCBhc2htZW1fY3JlYXRlX3JlZ2lvbihjb25zdCBjaGFyKiAvKmlnbm9yZWQqLywgc2l6ZV90IHNpemUpIHsKLSAgICBjaGFyIHBhdHRlcm5bUEFUSF9NQVhdOwotICAgIHNucHJpbnRmKHBhdHRlcm4sIHNpemVvZihwYXR0ZXJuKSwgIi90bXAvYW5kcm9pZC1hc2htZW0tJWQtWFhYWFhYWFhYIiwgZ2V0cGlkKCkpOwotICAgIGludCBmZCA9IG1rc3RlbXAocGF0dGVybik7Ci0gICAgaWYgKGZkID09IC0xKSByZXR1cm4gLTE7CisgICAgLy8gRmlsZXMgcmV0dXJuZWQgYnkgdG1wZmlsZSBhcmUgYXV0b21hdGljYWxseSByZW1vdmVkLgorICAgIHN0ZDo6dW5pcXVlX3B0cjxGSUxFLCBkZWNsdHlwZSgmZmNsb3NlKT4gdG1wKHRtcGZpbGUoKSwgJmZjbG9zZSk7CiAKLSAgICB1bmxpbmsocGF0dGVybik7Ci0KLSAgICBpZiAoVEVNUF9GQUlMVVJFX1JFVFJZKGZ0cnVuY2F0ZShmZCwgc2l6ZSkpID09IC0xKSB7Ci0gICAgICBjbG9zZShmZCk7Ci0gICAgICByZXR1cm4gLTE7CisgICAgaWYgKCF0bXApIHsKKyAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLQotICAgIHJldHVybiBmZDsKKyAgICBpbnQgZmQgPSBmaWxlbm8odG1wLmdldCgpKTsKKyAgICBpZiAoZmQgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB1bmlxdWVfZmQgZHVwZmQgPSB1bmlxdWVfZmQoZHVwKGZkKSk7CisgICAgaWYgKGR1cGZkID09IC0xKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKFRFTVBfRkFJTFVSRV9SRVRSWShmdHJ1bmNhdGUoZHVwZmQsIHNpemUpKSA9PSAtMSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBkdXBmZC5yZWxlYXNlKCk7CiB9CiAKIGludCBhc2htZW1fc2V0X3Byb3RfcmVnaW9uKGludCAvKmZkKi8sIGludCAvKnByb3QqLykgewpkaWZmIC0tZ2l0IGEvbGliY3V0aWxzL2FzaG1lbV9iYXNlX3Rlc3QuY3BwIGIvbGliY3V0aWxzL2FzaG1lbV9iYXNlX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YjE0ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJjdXRpbHMvYXNobWVtX2Jhc2VfdGVzdC5jcHAKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFwcGVkX2ZpbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2FzaG1lbS5oPgorCisvKgorICogVGVzdHMgaW4gQXNobWVtQmFzZVRlc3QgYXJlIGRlc2lnbmVkIHRvIHJ1biBvbiBBbmRyb2lkIGFzIHdlbGwgYXMgaG9zdAorICogcGxhdGZvcm1zIChMaW51eCwgTWFjLCBXaW5kb3dzKS4KKyAqLworCisjaWYgZGVmaW5lZChfV0lOMzIpCitzdGF0aWMgaW5saW5lIHNpemVfdCBnZXRwYWdlc2l6ZSgpIHsKKyAgICByZXR1cm4gNDA5NjsKK30KKyNlbmRpZgorCit1c2luZyBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQ7CisKK1RFU1QoQXNobWVtQmFzZVRlc3QsIEJhc2ljVGVzdCkgeworICAgIGNvbnN0IHNpemVfdCBzaXplID0gZ2V0cGFnZXNpemUoKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhKHNpemUpOworICAgIHN0ZDo6Z2VuZXJhdGUoZGF0YS5iZWdpbigpLCBkYXRhLmVuZCgpLCBbbiA9IDBdKCkgbXV0YWJsZSB7IHJldHVybiBuKysgJiAweEZGOyB9KTsKKworICAgIHVuaXF1ZV9mZCBmZCA9IHVuaXF1ZV9mZChhc2htZW1fY3JlYXRlX3JlZ2lvbihudWxscHRyLCBzaXplKSk7CisgICAgQVNTRVJUX1RSVUUoZmQgPj0gMCk7CisgICAgQVNTRVJUX1RSVUUoYXNobWVtX3ZhbGlkKGZkKSk7CisgICAgQVNTRVJUX0VRKHNpemUsIHN0YXRpY19jYXN0PHNpemVfdD4oYXNobWVtX2dldF9zaXplX3JlZ2lvbihmZCkpKTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxhbmRyb2lkOjpiYXNlOjpNYXBwZWRGaWxlPiBtYXBwZWQgPQorICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6TWFwcGVkRmlsZTo6RnJvbUZkKGZkLCAwLCBzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFKTsKKyAgICBFWFBFQ1RfVFJVRShtYXBwZWQuZ2V0KCkgIT0gbnVsbHB0cik7CisgICAgdm9pZCogcmVnaW9uMSA9IG1hcHBlZC0+ZGF0YSgpOworICAgIEVYUEVDVF9UUlVFKHJlZ2lvbjEgIT0gbnVsbHB0cik7CisKKyAgICBtZW1jcHkocmVnaW9uMSwgZGF0YS5kYXRhKCksIHNpemUpOworICAgIEFTU0VSVF9FUSgwLCBtZW1jbXAocmVnaW9uMSwgZGF0YS5kYXRhKCksIHNpemUpKTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxhbmRyb2lkOjpiYXNlOjpNYXBwZWRGaWxlPiBtYXBwZWQyID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6Ok1hcHBlZEZpbGU6OkZyb21GZChmZCwgMCwgc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSk7CisgICAgRVhQRUNUX1RSVUUobWFwcGVkMi5nZXQoKSAhPSBudWxscHRyKTsKKyAgICB2b2lkKiByZWdpb24yID0gbWFwcGVkMi0+ZGF0YSgpOworICAgIEVYUEVDVF9UUlVFKHJlZ2lvbjIgIT0gbnVsbHB0cik7CisgICAgQVNTRVJUX0VRKDAsIG1lbWNtcChyZWdpb24yLCBkYXRhLmRhdGEoKSwgc2l6ZSkpOworfQpkaWZmIC0tZ2l0IGEvbGliY3V0aWxzL2FzaG1lbV90ZXN0LmNwcCBiL2xpYmN1dGlscy9hc2htZW1fdGVzdC5jcHAKaW5kZXggZDE1ODQyNy4uY2NiYjhjOSAxMDA2NDQKLS0tIGEvbGliY3V0aWxzL2FzaG1lbV90ZXN0LmNwcAorKysgYi9saWJjdXRpbHMvYXNobWVtX3Rlc3QuY3BwCkBAIC0yMiw2ICsyMiw4IEBACiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKKyNpbmNsdWRlIDx2ZWN0b3I+CisKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgogI2luY2x1ZGUgPGN1dGlscy9hc2htZW0uaD4KQEAgLTYxLDM4ICs2MywxNiBAQAogICAgIEVYUEVDVF9FUShwcm90LCBpb2N0bChmZCwgQVNITUVNX0dFVF9QUk9UX01BU0spKTsKIH0KIAotdm9pZCBGaWxsRGF0YSh1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YUxlbikgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGF0YUxlbjsgaSsrKSB7Cit2b2lkIEZpbGxEYXRhKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBkYXRhKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkYXRhLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGRhdGFbaV0gPSBpICYgMHhGRjsKICAgICB9CiB9CiAKLVRFU1QoQXNobWVtVGVzdCwgQmFzaWNUZXN0KSB7Ci0gICAgY29uc3RleHByIHNpemVfdCBzaXplID0gUEFHRV9TSVpFOwotICAgIHVpbnQ4X3QgZGF0YVtzaXplXTsKLSAgICBGaWxsRGF0YShkYXRhLCBzaXplKTsKLQotICAgIHVuaXF1ZV9mZCBmZDsKLSAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShUZXN0Q3JlYXRlUmVnaW9uKHNpemUsIGZkLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFKSk7Ci0KLSAgICB2b2lkKiByZWdpb24xID0gbnVsbHB0cjsKLSAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShUZXN0TW1hcChmZCwgc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgJnJlZ2lvbjEpKTsKLQotICAgIG1lbWNweShyZWdpb24xLCAmZGF0YSwgc2l6ZSk7Ci0gICAgQVNTRVJUX0VRKDAsIG1lbWNtcChyZWdpb24xLCAmZGF0YSwgc2l6ZSkpOwotCi0gICAgRVhQRUNUX0VRKDAsIG11bm1hcChyZWdpb24xLCBzaXplKSk7Ci0KLSAgICB2b2lkICpyZWdpb24yOwotICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFRlc3RNbWFwKGZkLCBzaXplLCBQUk9UX1JFQUQsICZyZWdpb24yKSk7Ci0gICAgQVNTRVJUX0VRKDAsIG1lbWNtcChyZWdpb24yLCAmZGF0YSwgc2l6ZSkpOwotICAgIEVYUEVDVF9FUSgwLCBtdW5tYXAocmVnaW9uMiwgc2l6ZSkpOwotfQotCiBURVNUKEFzaG1lbVRlc3QsIEZvcmtUZXN0KSB7Ci0gICAgY29uc3RleHByIHNpemVfdCBzaXplID0gUEFHRV9TSVpFOwotICAgIHVpbnQ4X3QgZGF0YVtzaXplXTsKLSAgICBGaWxsRGF0YShkYXRhLCBzaXplKTsKKyAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IGdldHBhZ2VzaXplKCk7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YShzaXplKTsKKyAgICBGaWxsRGF0YShkYXRhKTsKIAogICAgIHVuaXF1ZV9mZCBmZDsKICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShUZXN0Q3JlYXRlUmVnaW9uKHNpemUsIGZkLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFKSk7CkBAIC0xMDAsOCArODAsOCBAQAogICAgIHZvaWQqIHJlZ2lvbjEgPSBudWxscHRyOwogICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFRlc3RNbWFwKGZkLCBzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCAmcmVnaW9uMSkpOwogCi0gICAgbWVtY3B5KHJlZ2lvbjEsICZkYXRhLCBzaXplKTsKLSAgICBBU1NFUlRfRVEoMCwgbWVtY21wKHJlZ2lvbjEsICZkYXRhLCBzaXplKSk7CisgICAgbWVtY3B5KHJlZ2lvbjEsIGRhdGEuZGF0YSgpLCBzaXplKTsKKyAgICBBU1NFUlRfRVEoMCwgbWVtY21wKHJlZ2lvbjEsIGRhdGEuZGF0YSgpLCBzaXplKSk7CiAgICAgRVhQRUNUX0VRKDAsIG11bm1hcChyZWdpb24xLCBzaXplKSk7CiAKICAgICBBU1NFUlRfRVhJVCgKQEAgLTExMyw3ICs5Myw3IEBACiAgICAgICAgICAgICBpZiAocmVnaW9uMiA9PSBNQVBfRkFJTEVEKSB7CiAgICAgICAgICAgICAgICAgX2V4aXQoMSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWVtY21wKHJlZ2lvbjIsICZkYXRhLCBzaXplKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAobWVtY21wKHJlZ2lvbjIsIGRhdGEuZGF0YSgpLCBzaXplKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgX2V4aXQoMik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtZW1zZXQocmVnaW9uMiwgMCwgc2l6ZSk7CkBAIC0xMjIsMTAgKzEwMiwxMCBAQAogICAgICAgICB9LAogICAgICAgICA6OnRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDApLCAiIik7CiAKLSAgICBtZW1zZXQoJmRhdGEsIDAsIHNpemUpOworICAgIG1lbXNldChkYXRhLmRhdGEoKSwgMCwgc2l6ZSk7CiAgICAgdm9pZCAqcmVnaW9uMjsKICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShUZXN0TW1hcChmZCwgc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgJnJlZ2lvbjIpKTsKLSAgICBBU1NFUlRfRVEoMCwgbWVtY21wKHJlZ2lvbjIsICZkYXRhLCBzaXplKSk7CisgICAgQVNTRVJUX0VRKDAsIG1lbWNtcChyZWdpb24yLCBkYXRhLmRhdGEoKSwgc2l6ZSkpOwogICAgIEVYUEVDVF9FUSgwLCBtdW5tYXAocmVnaW9uMiwgc2l6ZSkpOwogfQogCkBAIC0xMzQsMTggKzExNCwxOSBAQAogICAgIHZvaWQqIHJlZ2lvbiA9IG51bGxwdHI7CiAKICAgICAvLyBBbGxvY2F0ZSBhIDQtcGFnZSBidWZmZXIsIGJ1dCBsZWF2ZSBwYWdlLXNpemVkIGhvbGVzIG9uIGVpdGhlciBzaWRlCi0gICAgY29uc3RleHByIHNpemVfdCBzaXplID0gUEFHRV9TSVpFICogNDsKLSAgICBjb25zdGV4cHIgc2l6ZV90IGRhdGFTaXplID0gUEFHRV9TSVpFICogMjsKLSAgICBjb25zdGV4cHIgc2l6ZV90IGhvbGVTaXplID0gUEFHRV9TSVpFOworICAgIGNvbnN0IHNpemVfdCBwYWdlU2l6ZSA9IGdldHBhZ2VzaXplKCk7CisgICAgY29uc3Qgc2l6ZV90IHNpemUgPSBwYWdlU2l6ZSAqIDQ7CisgICAgY29uc3Qgc2l6ZV90IGRhdGFTaXplID0gcGFnZVNpemUgKiAyOworICAgIGNvbnN0IHNpemVfdCBob2xlU2l6ZSA9IHBhZ2VTaXplOwogICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFRlc3RDcmVhdGVSZWdpb24oc2l6ZSwgZmQsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUpKTsKICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShUZXN0TW1hcChmZCwgZGF0YVNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsICZyZWdpb24sIGhvbGVTaXplKSk7CiAKLSAgICB1aW50OF90IGRhdGFbZGF0YVNpemVdOwotICAgIEZpbGxEYXRhKGRhdGEsIGRhdGFTaXplKTsKLSAgICBtZW1jcHkocmVnaW9uLCBkYXRhLCBkYXRhU2l6ZSk7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YShkYXRhU2l6ZSk7CisgICAgRmlsbERhdGEoZGF0YSk7CisgICAgbWVtY3B5KHJlZ2lvbiwgZGF0YS5kYXRhKCksIGRhdGFTaXplKTsKIAotICAgIGNvbnN0ZXhwciBvZmZfdCBkYXRhU3RhcnQgPSBob2xlU2l6ZTsKLSAgICBjb25zdGV4cHIgb2ZmX3QgZGF0YUVuZCA9IGRhdGFTdGFydCArIGRhdGFTaXplOworICAgIGNvbnN0IG9mZl90IGRhdGFTdGFydCA9IGhvbGVTaXplOworICAgIGNvbnN0IG9mZl90IGRhdGFFbmQgPSBkYXRhU3RhcnQgKyBkYXRhU2l6ZTsKIAogICAgIC8vIFRoZSBzZXF1ZW5jZSBvZiBzZWVrcyBiZWxvdyBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGlzOgogICAgIC8vCkBAIC0xNjMsOSArMTQ0LDEyIEBACiAgICAgICAgIC8vIEV4cGVjdGVkIGxzZWVrKCkgcmV0dXJuIHZhbHVlCiAgICAgICAgIG9mZl90IHJldDsKICAgICB9IHNlZWtzW10gPSB7Ci0gICAgICAgIHs5OSwgU0VFS19TRVQsIDk5fSwgICAgICAgICB7ZGF0YVN0YXJ0LCBTRUVLX0NVUiwgZGF0YVN0YXJ0ICsgOTl9LAotICAgICAgICB7MCwgU0VFS19EQVRBLCBkYXRhU3RhcnR9LCAge2RhdGFTdGFydCwgU0VFS19IT0xFLCBkYXRhRW5kfSwKLSAgICAgICAgey05OSwgU0VFS19FTkQsIHNpemUgLSA5OX0sIHstZGF0YVN0YXJ0LCBTRUVLX0NVUiwgZGF0YUVuZCAtIDk5fSwKKyAgICAgICAgICAgIHs5OSwgU0VFS19TRVQsIDk5fSwKKyAgICAgICAgICAgIHtkYXRhU3RhcnQsIFNFRUtfQ1VSLCBkYXRhU3RhcnQgKyA5OX0sCisgICAgICAgICAgICB7MCwgU0VFS19EQVRBLCBkYXRhU3RhcnR9LAorICAgICAgICAgICAge2RhdGFTdGFydCwgU0VFS19IT0xFLCBkYXRhRW5kfSwKKyAgICAgICAgICAgIHstOTksIFNFRUtfRU5ELCBzdGF0aWNfY2FzdDxvZmZfdD4oc2l6ZSkgLSA5OX0sCisgICAgICAgICAgICB7LWRhdGFTdGFydCwgU0VFS19DVVIsIGRhdGFFbmQgLSA5OX0sCiAgICAgfTsKICAgICBmb3IgKGNvbnN0IGF1dG8mIGNmZyA6IHNlZWtzKSB7CiAgICAgICAgIGVycm5vID0gMDsKQEAgLTE4MCw3ICsxNjQsNyBAQAogICAgICAgICAgICAgdWludDhfdCBidWZbcmVhZFNpemVdOwogCiAgICAgICAgICAgICBBU1NFUlRfRVEocmVhZFNpemUsIFRFTVBfRkFJTFVSRV9SRVRSWShyZWFkKGZkLCBidWYsIHJlYWRTaXplKSkpOwotICAgICAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChidWYsIGRhdGEgKyBkYXRhT2ZmLCByZWFkU2l6ZSkpOworICAgICAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChidWYsICZkYXRhW2RhdGFPZmZdLCByZWFkU2l6ZSkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xODksNyArMTczLDcgQEAKIAogVEVTVChBc2htZW1UZXN0LCBQcm90VGVzdCkgewogICAgIHVuaXF1ZV9mZCBmZDsKLSAgICBjb25zdGV4cHIgc2l6ZV90IHNpemUgPSBQQUdFX1NJWkU7CisgICAgY29uc3Qgc2l6ZV90IHNpemUgPSBnZXRwYWdlc2l6ZSgpOwogICAgIHZvaWQgKnJlZ2lvbjsKIAogICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFRlc3RDcmVhdGVSZWdpb24oc2l6ZSwgZmQsIFBST1RfUkVBRCkpOwpAQCAtMjE3LDcgKzIwMSw3IEBACiAKIFRFU1QoQXNobWVtVGVzdCwgRm9ya1Byb3RUZXN0KSB7CiAgICAgdW5pcXVlX2ZkIGZkOwotICAgIGNvbnN0ZXhwciBzaXplX3Qgc2l6ZSA9IFBBR0VfU0laRTsKKyAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IGdldHBhZ2VzaXplKCk7CiAKICAgICBpbnQgcHJvdEZsYWdzW10gPSB7IFBST1RfUkVBRCwgUFJPVF9XUklURSB9OwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJyYXlzaXplKHByb3RGbGFncyk7IGkrKykgewpAQCAtMjM4LDkgKzIyMiw5IEBACiB9CiAKIFRFU1QoQXNobWVtVGVzdCwgRm9ya011bHRpUmVnaW9uVGVzdCkgewotICAgIGNvbnN0ZXhwciBzaXplX3Qgc2l6ZSA9IFBBR0VfU0laRTsKLSAgICB1aW50OF90IGRhdGFbc2l6ZV07Ci0gICAgRmlsbERhdGEoZGF0YSwgc2l6ZSk7CisgICAgY29uc3Qgc2l6ZV90IHNpemUgPSBnZXRwYWdlc2l6ZSgpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEoc2l6ZSk7CisgICAgRmlsbERhdGEoZGF0YSk7CiAKICAgICBjb25zdGV4cHIgaW50IG5SZWdpb25zID0gMTY7CiAgICAgdW5pcXVlX2ZkIGZkW25SZWdpb25zXTsKQEAgLTI0OCw4ICsyMzIsOCBAQAogICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShUZXN0Q3JlYXRlUmVnaW9uKHNpemUsIGZkW2ldLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFKSk7CiAgICAgICAgIHZvaWQqIHJlZ2lvbiA9IG51bGxwdHI7CiAgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFRlc3RNbWFwKGZkW2ldLCBzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCAmcmVnaW9uKSk7Ci0gICAgICAgIG1lbWNweShyZWdpb24sICZkYXRhLCBzaXplKTsKLSAgICAgICAgQVNTRVJUX0VRKDAsIG1lbWNtcChyZWdpb24sICZkYXRhLCBzaXplKSk7CisgICAgICAgIG1lbWNweShyZWdpb24sIGRhdGEuZGF0YSgpLCBzaXplKTsKKyAgICAgICAgQVNTRVJUX0VRKDAsIG1lbWNtcChyZWdpb24sIGRhdGEuZGF0YSgpLCBzaXplKSk7CiAgICAgICAgIEVYUEVDVF9FUSgwLCBtdW5tYXAocmVnaW9uLCBzaXplKSk7CiAgICAgfQogCkBAIC0yNjIsNyArMjQ2LDcgQEAKICAgICAgICAgICAgIGlmIChyZWdpb24gPT0gTUFQX0ZBSUxFRCkgewogICAgICAgICAgICAgICAgIF9leGl0KDEpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1lbWNtcChyZWdpb24sICZkYXRhLCBzaXplKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAobWVtY21wKHJlZ2lvbiwgZGF0YS5kYXRhKCksIHNpemUpICE9IDApIHsKICAgICAgICAgICAgICAgICBtdW5tYXAocmVnaW9uLCBzaXplKTsKICAgICAgICAgICAgICAgICBfZXhpdCgyKTsKICAgICAgICAgICAgIH0KQEAgLTI3MiwxMSArMjU2LDExIEBACiAgICAgICAgIF9leGl0KDApOwogICAgIH0sIDo6dGVzdGluZzo6RXhpdGVkV2l0aENvZGUoMCksICIiKTsKIAotICAgIG1lbXNldCgmZGF0YSwgMCwgc2l6ZSk7CisgICAgbWVtc2V0KGRhdGEuZGF0YSgpLCAwLCBzaXplKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5SZWdpb25zOyBpKyspIHsKICAgICAgICAgdm9pZCAqcmVnaW9uOwogICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShUZXN0TW1hcChmZFtpXSwgc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgJnJlZ2lvbikpOwotICAgICAgICBBU1NFUlRfRVEoMCwgbWVtY21wKHJlZ2lvbiwgJmRhdGEsIHNpemUpKTsKKyAgICAgICAgQVNTRVJUX0VRKDAsIG1lbWNtcChyZWdpb24sIGRhdGEuZGF0YSgpLCBzaXplKSk7CiAgICAgICAgIEVYUEVDVF9FUSgwLCBtdW5tYXAocmVnaW9uLCBzaXplKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliY3V0aWxzL2ZzX2NvbmZpZy5jcHAgYi9saWJjdXRpbHMvZnNfY29uZmlnLmNwcAppbmRleCBmOTBhMWJjLi4yZTRiOWI0IDEwMDY0NAotLS0gYS9saWJjdXRpbHMvZnNfY29uZmlnLmNwcAorKysgYi9saWJjdXRpbHMvZnNfY29uZmlnLmNwcApAQCAtNDEsMTAgKzQxLDYgQEAKIAogI2luY2x1ZGUgImZzX2NvbmZpZy5oIgogCi0jaWZuZGVmIE9fQklOQVJZCi0jZGVmaW5lIE9fQklOQVJZIDAKLSNlbmRpZgotCiB1c2luZyBhbmRyb2lkOjpiYXNlOjpFbmRzV2l0aDsKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGg7CiAKQEAgLTcyLDEwICs2OCw2IEBACiAgICAgeyAwMTc3MSwgQUlEX1NZU1RFTSwgICAgICAgQUlEX01JU0MsICAgICAgICAgMCwgImRhdGEvbWlzYyIgfSwKICAgICB7IDAwNzc1LCBBSURfTUVESUFfUlcsICAgICBBSURfTUVESUFfUlcsICAgICAwLCAiZGF0YS9tZWRpYS9NdXNpYyIgfSwKICAgICB7IDAwNzc1LCBBSURfTUVESUFfUlcsICAgICBBSURfTUVESUFfUlcsICAgICAwLCAiZGF0YS9tZWRpYSIgfSwKLSAgICB7IDAwNzUwLCBBSURfUk9PVCwgICAgICAgICBBSURfU0hFTEwsICAgICAgICAwLCAiZGF0YS9uYXRpdmV0ZXN0IiB9LAotICAgIHsgMDA3NTAsIEFJRF9ST09ULCAgICAgICAgIEFJRF9TSEVMTCwgICAgICAgIDAsICJkYXRhL25hdGl2ZXRlc3Q2NCIgfSwKLSAgICB7IDAwNzUwLCBBSURfUk9PVCwgICAgICAgICBBSURfU0hFTEwsICAgICAgICAwLCAiZGF0YS9iZW5jaG1hcmt0ZXN0IiB9LAotICAgIHsgMDA3NTAsIEFJRF9ST09ULCAgICAgICAgIEFJRF9TSEVMTCwgICAgICAgIDAsICJkYXRhL2JlbmNobWFya3Rlc3Q2NCIgfSwKICAgICB7IDAwNzc1LCBBSURfUk9PVCwgICAgICAgICBBSURfUk9PVCwgICAgICAgICAwLCAiZGF0YS9wcmVsb2FkcyIgfSwKICAgICB7IDAwNzcxLCBBSURfU1lTVEVNLCAgICAgICBBSURfU1lTVEVNLCAgICAgICAwLCAiZGF0YSIgfSwKICAgICB7IDAwNzU1LCBBSURfUk9PVCwgICAgICAgICBBSURfU1lTVEVNLCAgICAgICAwLCAibW50IiB9LApAQCAtOTUsNyArODcsNyBAQAogICAgIHsgMDA3NTEsIEFJRF9ST09ULCAgICAgICAgIEFJRF9TSEVMTCwgICAgICAgIDAsICJ2ZW5kb3IvYmluIiB9LAogICAgIHsgMDA3NTEsIEFJRF9ST09ULCAgICAgICAgIEFJRF9TSEVMTCwgICAgICAgIDAsICJ2ZW5kb3IvYXBleC8qL2JpbiIgfSwKICAgICB7IDAwNzU1LCBBSURfUk9PVCwgICAgICAgICBBSURfU0hFTEwsICAgICAgICAwLCAidmVuZG9yIiB9LAotICAgIHsgMDA3NTUsIEFJRF9ST09ULCAgICAgICAgIEFJRF9ST09ULCAgICAgICAgIDAsIDAgfSwKKyAgICB7fSwKICAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9uCiB9OwogI2lmbmRlZiBfX0FORFJPSURfVk5ES19fCkBAIC0xNDcsMTIgKzEzOSw2IEBACiAgICAgeyAwMDY0NCwgQUlEX1NZU1RFTSwgICAgQUlEX1NZU1RFTSwgICAgMCwgImRhdGEvYXBwLXByaXZhdGUvKiIgfSwKICAgICB7IDAwNjQ0LCBBSURfQVBQLCAgICAgICBBSURfQVBQLCAgICAgICAwLCAiZGF0YS9kYXRhLyoiIH0sCiAgICAgeyAwMDY0NCwgQUlEX01FRElBX1JXLCAgQUlEX01FRElBX1JXLCAgMCwgImRhdGEvbWVkaWEvKiIgfSwKLSAgICB7IDAwNjQwLCBBSURfUk9PVCwgICAgICBBSURfU0hFTEwsICAgICAwLCAiZGF0YS9uYXRpdmV0ZXN0L3Rlc3RzLnR4dCIgfSwKLSAgICB7IDAwNjQwLCBBSURfUk9PVCwgICAgICBBSURfU0hFTEwsICAgICAwLCAiZGF0YS9uYXRpdmV0ZXN0NjQvdGVzdHMudHh0IiB9LAotICAgIHsgMDA3NTAsIEFJRF9ST09ULCAgICAgIEFJRF9TSEVMTCwgICAgIDAsICJkYXRhL25hdGl2ZXRlc3QvKiIgfSwKLSAgICB7IDAwNzUwLCBBSURfUk9PVCwgICAgICBBSURfU0hFTEwsICAgICAwLCAiZGF0YS9uYXRpdmV0ZXN0NjQvKiIgfSwKLSAgICB7IDAwNzUwLCBBSURfUk9PVCwgICAgICBBSURfU0hFTEwsICAgICAwLCAiZGF0YS9iZW5jaG1hcmt0ZXN0LyoiIH0sCi0gICAgeyAwMDc1MCwgQUlEX1JPT1QsICAgICAgQUlEX1NIRUxMLCAgICAgMCwgImRhdGEvYmVuY2htYXJrdGVzdDY0LyoiIH0sCiAgICAgeyAwMDYwMCwgQUlEX1JPT1QsICAgICAgQUlEX1JPT1QsICAgICAgMCwgImRlZmF1bHQucHJvcCIgfSwgLy8gbGVnYWN5CiAgICAgeyAwMDYwMCwgQUlEX1JPT1QsICAgICAgQUlEX1JPT1QsICAgICAgMCwgInN5c3RlbS9ldGMvcHJvcC5kZWZhdWx0IiB9LAogICAgIHsgMDA2MDAsIEFJRF9ST09ULCAgICAgIEFJRF9ST09ULCAgICAgIDAsICJvZG0vYnVpbGQucHJvcCIgfSwgLy8gbGVnYWN5OyBvbmx5IGZvciBQIHJlbGVhc2UKQEAgLTIxNCwyNCArMjAwLDQxIEBACiAjZW5kaWYKICAgICB7IDAwNzU1LCBBSURfUk9PVCwgICAgICBBSURfUk9PVCwgICAgICAwLCAiZmlyc3Rfc3RhZ2VfcmFtZGlzay9zeXN0ZW0vYmluL3Jlc2l6ZTJmcyIgfSwKICAgICB7IDAwNzU1LCBBSURfUk9PVCwgICAgICBBSURfUk9PVCwgICAgICAwLCAiZmlyc3Rfc3RhZ2VfcmFtZGlzay9zeXN0ZW0vYmluL3NuYXB1c2VyZCIgfSwKKyAgICB7IDAwNzU1LCBBSURfUk9PVCwgICAgICBBSURfUk9PVCwgICAgICAwLCAiZmlyc3Rfc3RhZ2VfcmFtZGlzay9zeXN0ZW0vYmluL3NuYXB1c2VyZF9yYW1kaXNrIiB9LAogICAgIHsgMDA3NTUsIEFJRF9ST09ULCAgICAgIEFJRF9ST09ULCAgICAgIDAsICJmaXJzdF9zdGFnZV9yYW1kaXNrL3N5c3RlbS9iaW4vdHVuZTJmcyIgfSwKICAgICB7IDAwNzU1LCBBSURfUk9PVCwgICAgICBBSURfUk9PVCwgICAgICAwLCAiZmlyc3Rfc3RhZ2VfcmFtZGlzay9zeXN0ZW0vYmluL2ZzY2suZjJmcyIgfSwKICAgICAvLyBnZW5lcmljIGRlZmF1bHRzCiAgICAgeyAwMDc1NSwgQUlEX1JPT1QsICAgICAgQUlEX1JPT1QsICAgICAgMCwgImJpbi8qIiB9LAogICAgIHsgMDA2NDAsIEFJRF9ST09ULCAgICAgIEFJRF9TSEVMTCwgICAgIDAsICJmc3RhYi4qIiB9LAogICAgIHsgMDA3NTAsIEFJRF9ST09ULCAgICAgIEFJRF9TSEVMTCwgICAgIDAsICJpbml0KiIgfSwKKyAgICB7IDAwNjQ0LCBBSURfUk9PVCwgICAgICBBSURfUk9PVCwgICAgICAwLCAiKi5yYyIgfSwKICAgICB7IDAwNzU1LCBBSURfUk9PVCwgICAgICBBSURfU0hFTEwsICAgICAwLCAib2RtL2Jpbi8qIiB9LAorICAgIHsgMDA2NDQsIEFJRF9ST09ULCAgICAgIEFJRF9ST09ULCAgICAgIDAsICJvZG0vZnJhbWV3b3JrLyoiIH0sCisgICAgeyAwMDY0NCwgQUlEX1JPT1QsICAgICAgQUlEX1JPT1QsICAgICAgMCwgIm9kbS9hcHAvKiIgfSwKKyAgICB7IDAwNjQ0LCBBSURfUk9PVCwgICAgICBBSURfUk9PVCwgICAgICAwLCAib2RtL3ByaXYtYXBwLyoiIH0sCiAgICAgeyAwMDc1NSwgQUlEX1JPT1QsICAgICAgQUlEX1NIRUxMLCAgICAgMCwgInByb2R1Y3QvYmluLyoiIH0sCiAgICAgeyAwMDc1NSwgQUlEX1JPT1QsICAgICAgQUlEX1NIRUxMLCAgICAgMCwgInByb2R1Y3QvYXBleC8qYmluLyoiIH0sCisgICAgeyAwMDY0NCwgQUlEX1JPT1QsICAgICAgQUlEX1JPT1QsICAgICAgMCwgInByb2R1Y3QvZnJhbWV3b3JrLyoiIH0sCisgICAgeyAwMDY0NCwgQUlEX1JPT1QsICAgICAgQUlEX1JPT1QsICAgICAgMCwgInByb2R1Y3QvYXBwLyoiIH0sCisgICAgeyAwMDY0NCwgQUlEX1JPT1QsICAgICAgQUlEX1JPT1QsICAgICAgMCwgInByb2R1Y3QvcHJpdi1hcHAvKiIgfSwKICAgICB7IDAwNzU1LCBBSURfUk9PVCwgICAgICBBSURfU0hFTEwsICAgICAwLCAic3lzdGVtL2Jpbi8qIiB9LAogICAgIHsgMDA3NTUsIEFJRF9ST09ULCAgICAgIEFJRF9TSEVMTCwgICAgIDAsICJzeXN0ZW0veGJpbi8qIiB9LAogICAgIHsgMDA3NTUsIEFJRF9ST09ULCAgICAgIEFJRF9TSEVMTCwgICAgIDAsICJzeXN0ZW0vYXBleC8qL2Jpbi8qIiB9LAorICAgIHsgMDA2NDQsIEFJRF9ST09ULCAgICAgIEFJRF9ST09ULCAgICAgIDAsICJzeXN0ZW0vZnJhbWV3b3JrLyoiIH0sCisgICAgeyAwMDY0NCwgQUlEX1JPT1QsICAgICAgQUlEX1JPT1QsICAgICAgMCwgInN5c3RlbS9hcHAvKiIgfSwKKyAgICB7IDAwNjQ0LCBBSURfUk9PVCwgICAgICBBSURfUk9PVCwgICAgICAwLCAic3lzdGVtL3ByaXYtYXBwLyoiIH0sCiAgICAgeyAwMDc1NSwgQUlEX1JPT1QsICAgICAgQUlEX1NIRUxMLCAgICAgMCwgInN5c3RlbV9leHQvYmluLyoiIH0sCiAgICAgeyAwMDc1NSwgQUlEX1JPT1QsICAgICAgQUlEX1NIRUxMLCAgICAgMCwgInN5c3RlbV9leHQvYXBleC8qL2Jpbi8qIiB9LAorICAgIHsgMDA2NDQsIEFJRF9ST09ULCAgICAgIEFJRF9ST09ULCAgICAgIDAsICJzeXN0ZW1fZXh0L2ZyYW1ld29yay8qIiB9LAorICAgIHsgMDA2NDQsIEFJRF9ST09ULCAgICAgIEFJRF9ST09ULCAgICAgIDAsICJzeXN0ZW1fZXh0L2FwcC8qIiB9LAorICAgIHsgMDA2NDQsIEFJRF9ST09ULCAgICAgIEFJRF9ST09ULCAgICAgIDAsICJzeXN0ZW1fZXh0L3ByaXYtYXBwLyoiIH0sCiAgICAgeyAwMDc1NSwgQUlEX1JPT1QsICAgICAgQUlEX1NIRUxMLCAgICAgMCwgInZlbmRvci9iaW4vKiIgfSwKICAgICB7IDAwNzU1LCBBSURfUk9PVCwgICAgICBBSURfU0hFTEwsICAgICAwLCAidmVuZG9yL2FwZXgvKmJpbi8qIiB9LAogICAgIHsgMDA3NTUsIEFJRF9ST09ULCAgICAgIEFJRF9TSEVMTCwgICAgIDAsICJ2ZW5kb3IveGJpbi8qIiB9LAotICAgIHsgMDA2NDQsIEFJRF9ST09ULCAgICAgIEFJRF9ST09ULCAgICAgIDAsIDAgfSwKKyAgICB7IDAwNjQ0LCBBSURfUk9PVCwgICAgICBBSURfUk9PVCwgICAgICAwLCAidmVuZG9yL2ZyYW1ld29yay8qIiB9LAorICAgIHsgMDA2NDQsIEFJRF9ST09ULCAgICAgIEFJRF9ST09ULCAgICAgIDAsICJ2ZW5kb3IvYXBwLyoiIH0sCisgICAgeyAwMDY0NCwgQUlEX1JPT1QsICAgICAgQUlEX1JPT1QsICAgICAgMCwgInZlbmRvci9wcml2LWFwcC8qIiB9LAorICAgIHt9LAogICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb24KIH07CiAjaWZuZGVmIF9fQU5EUk9JRF9WTkRLX18KQEAgLTI1NiwxMiArMjU5LDEyIEBACiAgICAgICAgIGxlbiA9IHN0cmlwKHRhcmdldF9vdXRfcGF0aCwgbGVuLCAiLyIpOwogICAgICAgICBsZW4gPSBzdHJpcCh0YXJnZXRfb3V0X3BhdGgsIGxlbiwgIi9zeXN0ZW0iKTsKICAgICAgICAgaWYgKGFzcHJpbnRmKCZuYW1lLCAiJS4qcyVzIiwgKGludClsZW4sIHRhcmdldF9vdXRfcGF0aCwgY29uZlt3aGljaF1bZGlyXSkgIT0gLTEpIHsKLSAgICAgICAgICAgIGZkID0gVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4obmFtZSwgT19SRE9OTFkgfCBPX0JJTkFSWSkpOworICAgICAgICAgICAgZmQgPSBURU1QX0ZBSUxVUkVfUkVUUlkob3BlbihuYW1lLCBPX1JET05MWSkpOwogICAgICAgICAgICAgZnJlZShuYW1lKTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoZmQgPCAwKSB7Ci0gICAgICAgIGZkID0gVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oY29uZlt3aGljaF1bZGlyXSwgT19SRE9OTFkgfCBPX0JJTkFSWSkpOworICAgICAgICBmZCA9IFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKGNvbmZbd2hpY2hdW2Rpcl0sIE9fUkRPTkxZKSk7CiAgICAgfQogICAgIHJldHVybiBmZDsKIH0KQEAgLTMyMSw4ICszMjQsOCBAQAogYXV0byBfX2Zvcl90ZXN0aW5nX29ubHlfX2ZzX2NvbmZpZ19jbXAgPSBmc19jb25maWdfY21wOwogI2VuZGlmCiAKLXZvaWQgZnNfY29uZmlnKGNvbnN0IGNoYXIqIHBhdGgsIGludCBkaXIsIGNvbnN0IGNoYXIqIHRhcmdldF9vdXRfcGF0aCwgdW5zaWduZWQqIHVpZCwgdW5zaWduZWQqIGdpZCwKLSAgICAgICAgICAgICAgIHVuc2lnbmVkKiBtb2RlLCB1aW50NjRfdCogY2FwYWJpbGl0aWVzKSB7Citib29sIGdldF9mc19jb25maWcoY29uc3QgY2hhciogcGF0aCwgYm9vbCBkaXIsIGNvbnN0IGNoYXIqIHRhcmdldF9vdXRfcGF0aCwKKyAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZnNfY29uZmlnKiBmc19jb25mKSB7CiAgICAgY29uc3Qgc3RydWN0IGZzX3BhdGhfY29uZmlnKiBwYzsKICAgICBzaXplX3Qgd2hpY2gsIHBsZW47CiAKQEAgLTM2NSwxMSArMzY4LDExIEBACiAgICAgICAgICAgICBpZiAoZnNfY29uZmlnX2NtcChkaXIsIHByZWZpeCwgbGVuLCBwYXRoLCBwbGVuKSkgewogICAgICAgICAgICAgICAgIGZyZWUocHJlZml4KTsKICAgICAgICAgICAgICAgICBjbG9zZShmZCk7Ci0gICAgICAgICAgICAgICAgKnVpZCA9IGhlYWRlci51aWQ7Ci0gICAgICAgICAgICAgICAgKmdpZCA9IGhlYWRlci5naWQ7Ci0gICAgICAgICAgICAgICAgKm1vZGUgPSAoKm1vZGUgJiAofjA3Nzc3KSkgfCBoZWFkZXIubW9kZTsKLSAgICAgICAgICAgICAgICAqY2FwYWJpbGl0aWVzID0gaGVhZGVyLmNhcGFiaWxpdGllczsKLSAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgZnNfY29uZi0+dWlkID0gaGVhZGVyLnVpZDsKKyAgICAgICAgICAgICAgICBmc19jb25mLT5naWQgPSBoZWFkZXIuZ2lkOworICAgICAgICAgICAgICAgIGZzX2NvbmYtPm1vZGUgPSBoZWFkZXIubW9kZTsKKyAgICAgICAgICAgICAgICBmc19jb25mLT5jYXBhYmlsaXRpZXMgPSBoZWFkZXIuY2FwYWJpbGl0aWVzOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZnJlZShwcmVmaXgpOwogICAgICAgICB9CkBAIC0zNzgsMTEgKzM4MSwyOCBAQAogCiAgICAgZm9yIChwYyA9IGRpciA/IGFuZHJvaWRfZGlycyA6IGFuZHJvaWRfZmlsZXM7IHBjLT5wcmVmaXg7IHBjKyspIHsKICAgICAgICAgaWYgKGZzX2NvbmZpZ19jbXAoZGlyLCBwYy0+cHJlZml4LCBzdHJsZW4ocGMtPnByZWZpeCksIHBhdGgsIHBsZW4pKSB7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGZzX2NvbmYtPnVpZCA9IHBjLT51aWQ7CisgICAgICAgICAgICBmc19jb25mLT5naWQgPSBwYy0+Z2lkOworICAgICAgICAgICAgZnNfY29uZi0+bW9kZSA9IHBjLT5tb2RlOworICAgICAgICAgICAgZnNfY29uZi0+Y2FwYWJpbGl0aWVzID0gcGMtPmNhcGFiaWxpdGllczsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgICp1aWQgPSBwYy0+dWlkOwotICAgICpnaWQgPSBwYy0+Z2lkOwotICAgICptb2RlID0gKCptb2RlICYgKH4wNzc3NykpIHwgcGMtPm1vZGU7Ci0gICAgKmNhcGFiaWxpdGllcyA9IHBjLT5jYXBhYmlsaXRpZXM7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIGZzX2NvbmZpZyhjb25zdCBjaGFyKiBwYXRoLCBpbnQgZGlyLCBjb25zdCBjaGFyKiB0YXJnZXRfb3V0X3BhdGgsIHVuc2lnbmVkKiB1aWQsIHVuc2lnbmVkKiBnaWQsCisgICAgICAgICAgICAgICB1bnNpZ25lZCogbW9kZSwgdWludDY0X3QqIGNhcGFiaWxpdGllcykgeworICAgIHN0cnVjdCBmc19jb25maWcgY29uZjsKKyAgICBpZiAoZ2V0X2ZzX2NvbmZpZyhwYXRoLCBkaXIsIHRhcmdldF9vdXRfcGF0aCwgJmNvbmYpKSB7CisgICAgICAgICp1aWQgPSBjb25mLnVpZDsKKyAgICAgICAgKmdpZCA9IGNvbmYuZ2lkOworICAgICAgICAqbW9kZSA9ICgqbW9kZSAmIFNfSUZNVCkgfCBjb25mLm1vZGU7CisgICAgICAgICpjYXBhYmlsaXRpZXMgPSBjb25mLmNhcGFiaWxpdGllczsKKyAgICB9IGVsc2UgeworICAgICAgICAqdWlkID0gQUlEX1JPT1Q7CisgICAgICAgICpnaWQgPSBBSURfUk9PVDsKKyAgICAgICAgKm1vZGUgPSAoKm1vZGUgJiBTX0lGTVQpIHwgKGRpciA/IDA3NTUgOiAwNjQ0KTsKKyAgICAgICAgKmNhcGFiaWxpdGllcyA9IDA7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3RocmVhZHMuaCBiL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90aHJlYWRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwODJjNmMuLjAwMDAwMDAKLS0tIGEvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3RocmVhZHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIDxzeXMvdHlwZXMuaD4KLQotI2lmIGRlZmluZWQoX1dJTjMyKQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNlbHNlCi0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2VuZGlmCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8KLS8vIERlcHJlY2F0ZWQ6IHVzZSBhbmRyb2lkOjpiYXNlOjpHZXRUaHJlYWRJZCBpbnN0ZWFkLCB3aGljaCBkb2Vzbid0IHRydW5jYXRlIG9uIE1hYy9XaW5kb3dzLgotLy8KLSNpZiAhZGVmaW5lZChfX0dMSUJDX18pIHx8IF9fR0xJQkNfXyA+PSAyICYmIF9fR0xJQkNfTUlOT1JfXyA8IDMyCi1leHRlcm4gcGlkX3QgZ2V0dGlkKCk7Ci0jZW5kaWYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy90cmFjZS5oIGIvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3RyYWNlLmgKaW5kZXggMzg2N2YzNC4uN2Y1NzYzNyAxMDA2NDQKLS0tIGEvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3RyYWNlLmgKKysrIGIvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3RyYWNlLmgKQEAgLTg5LDYgKzg5LDM2IEBACiAjZXJyb3IgQVRSQUNFX1RBRyBtdXN0IGJlIGRlZmluZWQgdG8gYmUgb25lIG9mIHRoZSB0YWdzIGRlZmluZWQgaW4gY3V0aWxzL3RyYWNlLmgKICNlbmRpZgogCisvKiogSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlsLiBEbyBub3QgdXNlLiAqLwordm9pZCBhdHJhY2VfYmVnaW5fYm9keShjb25zdCBjaGFyKik7CisKKy8qKiBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuIERvIG5vdCB1c2UuICovCit2b2lkIGF0cmFjZV9lbmRfYm9keSgpOworCisvKiogSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlsLiBEbyBub3QgdXNlLiAqLwordm9pZCBhdHJhY2VfYXN5bmNfYmVnaW5fYm9keShjb25zdCBjaGFyKiwgaW50MzJfdCk7CisKKy8qKiBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuIERvIG5vdCB1c2UuICovCit2b2lkIGF0cmFjZV9hc3luY19lbmRfYm9keShjb25zdCBjaGFyKiwgaW50MzJfdCk7CisKKy8qKiBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuIERvIG5vdCB1c2UuICovCit2b2lkIGF0cmFjZV9hc3luY19mb3JfdHJhY2tfYmVnaW5fYm9keShjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIGludDMyX3QpOworCisvKiogSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlsLiBEbyBub3QgdXNlLiAqLwordm9pZCBhdHJhY2VfYXN5bmNfZm9yX3RyYWNrX2VuZF9ib2R5KGNvbnN0IGNoYXIqLCBpbnQzMl90KTsKKworLyoqIEludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbC4gRG8gbm90IHVzZS4gKi8KK3ZvaWQgYXRyYWNlX2luc3RhbnRfYm9keShjb25zdCBjaGFyKik7CisKKy8qKiBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuIERvIG5vdCB1c2UuICovCit2b2lkIGF0cmFjZV9pbnN0YW50X2Zvcl90cmFja19ib2R5KGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CisKKy8qKiBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuIERvIG5vdCB1c2UuICovCit2b2lkIGF0cmFjZV9pbnRfYm9keShjb25zdCBjaGFyKiwgaW50MzJfdCk7CisKKy8qKiBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuIERvIG5vdCB1c2UuICovCit2b2lkIGF0cmFjZV9pbnQ2NF9ib2R5KGNvbnN0IGNoYXIqLCBpbnQ2NF90KTsKKwogLyoqCiAgKiBPcGVucyB0aGUgdHJhY2UgZmlsZSBmb3Igd3JpdGluZyBhbmQgcmVhZHMgdGhlIHByb3BlcnR5IGZvciBpbml0aWFsIHRhZ3MuCiAgKiBUaGUgYXRyYWNlLnRhZ3MuZW5hYmxlZmxhZ3MgcHJvcGVydHkgc2V0cyB0aGUgdGFncyB0byB0cmFjZS4KQEAgLTE1OSw3ICsxODksNiBAQAogc3RhdGljIGlubGluZSB2b2lkIGF0cmFjZV9iZWdpbih1aW50NjRfdCB0YWcsIGNvbnN0IGNoYXIqIG5hbWUpCiB7CiAgICAgaWYgKENDX1VOTElLRUxZKGF0cmFjZV9pc190YWdfZW5hYmxlZCh0YWcpKSkgewotICAgICAgICB2b2lkIGF0cmFjZV9iZWdpbl9ib2R5KGNvbnN0IGNoYXIqKTsKICAgICAgICAgYXRyYWNlX2JlZ2luX2JvZHkobmFtZSk7CiAgICAgfQogfQpAQCAtMTcyLDcgKzIwMSw2IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgYXRyYWNlX2VuZCh1aW50NjRfdCB0YWcpCiB7CiAgICAgaWYgKENDX1VOTElLRUxZKGF0cmFjZV9pc190YWdfZW5hYmxlZCh0YWcpKSkgewotICAgICAgICB2b2lkIGF0cmFjZV9lbmRfYm9keSgpOwogICAgICAgICBhdHJhY2VfZW5kX2JvZHkoKTsKICAgICB9CiB9CkBAIC0xOTAsNyArMjE4LDYgQEAKICAgICAgICAgaW50MzJfdCBjb29raWUpCiB7CiAgICAgaWYgKENDX1VOTElLRUxZKGF0cmFjZV9pc190YWdfZW5hYmxlZCh0YWcpKSkgewotICAgICAgICB2b2lkIGF0cmFjZV9hc3luY19iZWdpbl9ib2R5KGNvbnN0IGNoYXIqLCBpbnQzMl90KTsKICAgICAgICAgYXRyYWNlX2FzeW5jX2JlZ2luX2JvZHkobmFtZSwgY29va2llKTsKICAgICB9CiB9CkBAIC0yMDMsNyArMjMwLDYgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhdHJhY2VfYXN5bmNfZW5kKHVpbnQ2NF90IHRhZywgY29uc3QgY2hhciogbmFtZSwgaW50MzJfdCBjb29raWUpCiB7CiAgICAgaWYgKENDX1VOTElLRUxZKGF0cmFjZV9pc190YWdfZW5hYmxlZCh0YWcpKSkgewotICAgICAgICB2b2lkIGF0cmFjZV9hc3luY19lbmRfYm9keShjb25zdCBjaGFyKiwgaW50MzJfdCk7CiAgICAgICAgIGF0cmFjZV9hc3luY19lbmRfYm9keShuYW1lLCBjb29raWUpOwogICAgIH0KIH0KQEAgLTIyMSw3ICsyNDcsNiBAQAogc3RhdGljIGlubGluZSB2b2lkIGF0cmFjZV9hc3luY19mb3JfdHJhY2tfYmVnaW4odWludDY0X3QgdGFnLCBjb25zdCBjaGFyKiB0cmFja19uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSwgaW50MzJfdCBjb29raWUpIHsKICAgICBpZiAoQ0NfVU5MSUtFTFkoYXRyYWNlX2lzX3RhZ19lbmFibGVkKHRhZykpKSB7Ci0gICAgICAgIHZvaWQgYXRyYWNlX2FzeW5jX2Zvcl90cmFja19iZWdpbl9ib2R5KGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgaW50MzJfdCk7CiAgICAgICAgIGF0cmFjZV9hc3luY19mb3JfdHJhY2tfYmVnaW5fYm9keSh0cmFja19uYW1lLCBuYW1lLCBjb29raWUpOwogICAgIH0KIH0KQEAgLTIzNSw3ICsyNjAsNiBAQAogc3RhdGljIGlubGluZSB2b2lkIGF0cmFjZV9hc3luY19mb3JfdHJhY2tfZW5kKHVpbnQ2NF90IHRhZywgY29uc3QgY2hhciogdHJhY2tfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvb2tpZSkgewogICAgIGlmIChDQ19VTkxJS0VMWShhdHJhY2VfaXNfdGFnX2VuYWJsZWQodGFnKSkpIHsKLSAgICAgICAgdm9pZCBhdHJhY2VfYXN5bmNfZm9yX3RyYWNrX2VuZF9ib2R5KGNvbnN0IGNoYXIqLCBpbnQzMl90KTsKICAgICAgICAgYXRyYWNlX2FzeW5jX2Zvcl90cmFja19lbmRfYm9keSh0cmFja19uYW1lLCBjb29raWUpOwogICAgIH0KIH0KQEAgLTI1Miw3ICsyNzYsNiBAQAogI2RlZmluZSBBVFJBQ0VfSU5TVEFOVChuYW1lKSBhdHJhY2VfaW5zdGFudChBVFJBQ0VfVEFHLCBuYW1lKQogc3RhdGljIGlubGluZSB2b2lkIGF0cmFjZV9pbnN0YW50KHVpbnQ2NF90IHRhZywgY29uc3QgY2hhciogbmFtZSkgewogICAgIGlmIChDQ19VTkxJS0VMWShhdHJhY2VfaXNfdGFnX2VuYWJsZWQodGFnKSkpIHsKLSAgICAgICAgdm9pZCBhdHJhY2VfaW5zdGFudF9ib2R5KGNvbnN0IGNoYXIqKTsKICAgICAgICAgYXRyYWNlX2luc3RhbnRfYm9keShuYW1lKTsKICAgICB9CiB9CkBAIC0yNjksNyArMjkyLDYgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhdHJhY2VfaW5zdGFudF9mb3JfdHJhY2sodWludDY0X3QgdGFnLCBjb25zdCBjaGFyKiB0cmFja19uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuYW1lKSB7CiAgICAgaWYgKENDX1VOTElLRUxZKGF0cmFjZV9pc190YWdfZW5hYmxlZCh0YWcpKSkgewotICAgICAgICB2b2lkIGF0cmFjZV9pbnN0YW50X2Zvcl90cmFja19ib2R5KGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CiAgICAgICAgIGF0cmFjZV9pbnN0YW50X2Zvcl90cmFja19ib2R5KHRyYWNrX25hbWUsIG5hbWUpOwogICAgIH0KIH0KQEAgLTI4Miw3ICszMDQsNiBAQAogc3RhdGljIGlubGluZSB2b2lkIGF0cmFjZV9pbnQodWludDY0X3QgdGFnLCBjb25zdCBjaGFyKiBuYW1lLCBpbnQzMl90IHZhbHVlKQogewogICAgIGlmIChDQ19VTkxJS0VMWShhdHJhY2VfaXNfdGFnX2VuYWJsZWQodGFnKSkpIHsKLSAgICAgICAgdm9pZCBhdHJhY2VfaW50X2JvZHkoY29uc3QgY2hhciosIGludDMyX3QpOwogICAgICAgICBhdHJhY2VfaW50X2JvZHkobmFtZSwgdmFsdWUpOwogICAgIH0KIH0KQEAgLTI5NSw3ICszMTYsNiBAQAogc3RhdGljIGlubGluZSB2b2lkIGF0cmFjZV9pbnQ2NCh1aW50NjRfdCB0YWcsIGNvbnN0IGNoYXIqIG5hbWUsIGludDY0X3QgdmFsdWUpCiB7CiAgICAgaWYgKENDX1VOTElLRUxZKGF0cmFjZV9pc190YWdfZW5hYmxlZCh0YWcpKSkgewotICAgICAgICB2b2lkIGF0cmFjZV9pbnQ2NF9ib2R5KGNvbnN0IGNoYXIqLCBpbnQ2NF90KTsKICAgICAgICAgYXRyYWNlX2ludDY0X2JvZHkobmFtZSwgdmFsdWUpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy91ZXZlbnQuaCBiL2xpYmN1dGlscy9pbmNsdWRlL2N1dGlscy91ZXZlbnQuaAppbmRleCBkYTFjMmFhLi4xYmU5ODFiIDEwMDY0NAotLS0gYS9saWJjdXRpbHMvaW5jbHVkZS9jdXRpbHMvdWV2ZW50LmgKKysrIGIvbGliY3V0aWxzL2luY2x1ZGUvY3V0aWxzL3VldmVudC5oCkBAIC0yNCw2ICsyNCw4IEBACiBleHRlcm4gIkMiIHsKICNlbmRpZgogCitpbnQgdWV2ZW50X2NyZWF0ZV9zb2NrZXQoaW50IGJ1Zl9zeiwgYm9vbCBwYXNzY3JlZCk7CitpbnQgdWV2ZW50X2JpbmQoaW50IHNvY2tldCk7CiBpbnQgdWV2ZW50X29wZW5fc29ja2V0KGludCBidWZfc3osIGJvb2wgcGFzc2NyZWQpOwogc3NpemVfdCB1ZXZlbnRfa2VybmVsX211bHRpY2FzdF9yZWN2KGludCBzb2NrZXQsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCk7CiBzc2l6ZV90IHVldmVudF9rZXJuZWxfbXVsdGljYXN0X3VpZF9yZWN2KGludCBzb2NrZXQsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwgdWlkX3QgKnVpZCk7CmRpZmYgLS1naXQgYS9saWJjdXRpbHMvaW5jbHVkZS9wcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jYXBhYmlsaXR5LmggYi9saWJjdXRpbHMvaW5jbHVkZS9wcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jYXBhYmlsaXR5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMjdiMWQuLjAwMDAwMDAKLS0tIGEvbGliY3V0aWxzL2luY2x1ZGUvcHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY2FwYWJpbGl0eS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogVGFrZW4gZnJvbSBsaW51eC9jYXBhYmlsaXR5LmgsIHdpdGggbWlub3IgbW9kaWZpY2F0aW9ucwotICovCi0KLSNpZm5kZWYgX1NZU1RFTV9DT1JFX0lOQ0xVREVfUFJJVkFURV9BTkRST0lEX0ZJTEVTWVNURU1fQ0FQQUJJTElUWV9ICi0jZGVmaW5lIF9TWVNURU1fQ09SRV9JTkNMVURFX1BSSVZBVEVfQU5EUk9JRF9GSUxFU1lTVEVNX0NBUEFCSUxJVFlfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNkZWZpbmUgX191c2VyCi0jZGVmaW5lIF9fdTMyIHVpbnQzMl90Ci0jZGVmaW5lIF9fbGUzMiB1aW50MzJfdAotCi0jZGVmaW5lIF9MSU5VWF9DQVBBQklMSVRZX1ZFUlNJT05fMSAweDE5OTgwMzMwCi0jZGVmaW5lIF9MSU5VWF9DQVBBQklMSVRZX1UzMlNfMSAxCi0jZGVmaW5lIF9MSU5VWF9DQVBBQklMSVRZX1ZFUlNJT05fMiAweDIwMDcxMDI2Ci0jZGVmaW5lIF9MSU5VWF9DQVBBQklMSVRZX1UzMlNfMiAyCi0jZGVmaW5lIF9MSU5VWF9DQVBBQklMSVRZX1ZFUlNJT05fMyAweDIwMDgwNTIyCi0jZGVmaW5lIF9MSU5VWF9DQVBBQklMSVRZX1UzMlNfMyAyCi0KLXR5cGVkZWYgc3RydWN0IF9fdXNlcl9jYXBfaGVhZGVyX3N0cnVjdCB7Ci0gICAgX191MzIgdmVyc2lvbjsKLSAgICBpbnQgcGlkOwotfSBfX3VzZXIqIGNhcF91c2VyX2hlYWRlcl90OwotCi10eXBlZGVmIHN0cnVjdCBfX3VzZXJfY2FwX2RhdGFfc3RydWN0IHsKLSAgICBfX3UzMiBlZmZlY3RpdmU7Ci0gICAgX191MzIgcGVybWl0dGVkOwotICAgIF9fdTMyIGluaGVyaXRhYmxlOwotfSBfX3VzZXIqIGNhcF91c2VyX2RhdGFfdDsKLQotI2RlZmluZSBWRlNfQ0FQX1JFVklTSU9OX01BU0sgMHhGRjAwMDAwMAotI2RlZmluZSBWRlNfQ0FQX1JFVklTSU9OX1NISUZUIDI0Ci0jZGVmaW5lIFZGU19DQVBfRkxBR1NfTUFTSyB+VkZTX0NBUF9SRVZJU0lPTl9NQVNLCi0jZGVmaW5lIFZGU19DQVBfRkxBR1NfRUZGRUNUSVZFIDB4MDAwMDAxCi0jZGVmaW5lIFZGU19DQVBfUkVWSVNJT05fMSAweDAxMDAwMDAwCi0jZGVmaW5lIFZGU19DQVBfVTMyXzEgMQotI2RlZmluZSBYQVRUUl9DQVBTX1NaXzEgKHNpemVvZihfX2xlMzIpICogKDEgKyAyICogVkZTX0NBUF9VMzJfMSkpCi0jZGVmaW5lIFZGU19DQVBfUkVWSVNJT05fMiAweDAyMDAwMDAwCi0jZGVmaW5lIFZGU19DQVBfVTMyXzIgMgotI2RlZmluZSBYQVRUUl9DQVBTX1NaXzIgKHNpemVvZihfX2xlMzIpICogKDEgKyAyICogVkZTX0NBUF9VMzJfMikpCi0jZGVmaW5lIFhBVFRSX0NBUFNfU1ogWEFUVFJfQ0FQU19TWl8yCi0jZGVmaW5lIFZGU19DQVBfVTMyIFZGU19DQVBfVTMyXzIKLSNkZWZpbmUgVkZTX0NBUF9SRVZJU0lPTiBWRlNfQ0FQX1JFVklTSU9OXzIKLQotc3RydWN0IHZmc19jYXBfZGF0YSB7Ci0gICAgX19sZTMyIG1hZ2ljX2V0YzsKLSAgICBzdHJ1Y3QgewotICAgICAgICBfX2xlMzIgcGVybWl0dGVkOwotICAgICAgICBfX2xlMzIgaW5oZXJpdGFibGU7Ci0gICAgfSBkYXRhW1ZGU19DQVBfVTMyXTsKLX07Ci0KLSNkZWZpbmUgX0xJTlVYX0NBUEFCSUxJVFlfVkVSU0lPTiBfTElOVVhfQ0FQQUJJTElUWV9WRVJTSU9OXzEKLSNkZWZpbmUgX0xJTlVYX0NBUEFCSUxJVFlfVTMyUyBfTElOVVhfQ0FQQUJJTElUWV9VMzJTXzEKLSNkZWZpbmUgQ0FQX0NIT1dOIDAKLSNkZWZpbmUgQ0FQX0RBQ19PVkVSUklERSAxCi0jZGVmaW5lIENBUF9EQUNfUkVBRF9TRUFSQ0ggMgotI2RlZmluZSBDQVBfRk9XTkVSIDMKLSNkZWZpbmUgQ0FQX0ZTRVRJRCA0Ci0jZGVmaW5lIENBUF9LSUxMIDUKLSNkZWZpbmUgQ0FQX1NFVEdJRCA2Ci0jZGVmaW5lIENBUF9TRVRVSUQgNwotI2RlZmluZSBDQVBfU0VUUENBUCA4Ci0jZGVmaW5lIENBUF9MSU5VWF9JTU1VVEFCTEUgOQotI2RlZmluZSBDQVBfTkVUX0JJTkRfU0VSVklDRSAxMAotI2RlZmluZSBDQVBfTkVUX0JST0FEQ0FTVCAxMQotI2RlZmluZSBDQVBfTkVUX0FETUlOIDEyCi0jZGVmaW5lIENBUF9ORVRfUkFXIDEzCi0jZGVmaW5lIENBUF9JUENfTE9DSyAxNAotI2RlZmluZSBDQVBfSVBDX09XTkVSIDE1Ci0jZGVmaW5lIENBUF9TWVNfTU9EVUxFIDE2Ci0jZGVmaW5lIENBUF9TWVNfUkFXSU8gMTcKLSNkZWZpbmUgQ0FQX1NZU19DSFJPT1QgMTgKLSNkZWZpbmUgQ0FQX1NZU19QVFJBQ0UgMTkKLSNkZWZpbmUgQ0FQX1NZU19QQUNDVCAyMAotI2RlZmluZSBDQVBfU1lTX0FETUlOIDIxCi0jZGVmaW5lIENBUF9TWVNfQk9PVCAyMgotI2RlZmluZSBDQVBfU1lTX05JQ0UgMjMKLSNkZWZpbmUgQ0FQX1NZU19SRVNPVVJDRSAyNAotI2RlZmluZSBDQVBfU1lTX1RJTUUgMjUKLSNkZWZpbmUgQ0FQX1NZU19UVFlfQ09ORklHIDI2Ci0jZGVmaW5lIENBUF9NS05PRCAyNwotI2RlZmluZSBDQVBfTEVBU0UgMjgKLSNkZWZpbmUgQ0FQX0FVRElUX1dSSVRFIDI5Ci0jZGVmaW5lIENBUF9BVURJVF9DT05UUk9MIDMwCi0jZGVmaW5lIENBUF9TRVRGQ0FQIDMxCi0jZGVmaW5lIENBUF9NQUNfT1ZFUlJJREUgMzIKLSNkZWZpbmUgQ0FQX01BQ19BRE1JTiAzMwotI2RlZmluZSBDQVBfU1lTTE9HIDM0Ci0jZGVmaW5lIENBUF9XQUtFX0FMQVJNIDM1Ci0jZGVmaW5lIENBUF9CTE9DS19TVVNQRU5EIDM2Ci0jZGVmaW5lIENBUF9BVURJVF9SRUFEIDM3Ci0jZGVmaW5lIENBUF9MQVNUX0NBUCBDQVBfQVVESVRfUkVBRAotI2RlZmluZSBjYXBfdmFsaWQoeCkgKCh4KSA+PSAwICYmICh4KSA8PSBDQVBfTEFTVF9DQVApCi0jZGVmaW5lIENBUF9UT19JTkRFWCh4KSAoKHgpID4+IDUpCi0jZGVmaW5lIENBUF9UT19NQVNLKHgpICgxIDw8ICgoeCkmMzEpKQotCi0jdW5kZWYgX191c2VyCi0jdW5kZWYgX191MzIKLSN1bmRlZiBfX2xlMzIKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJjdXRpbHMvaW5jbHVkZS9wcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaCBiL2xpYmN1dGlscy9pbmNsdWRlL3ByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oCmluZGV4IDFlMDM1YmIuLmIwYmRkZjUgMTAwNjQ0Ci0tLSBhL2xpYmN1dGlscy9pbmNsdWRlL3ByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oCisrKyBiL2xpYmN1dGlscy9pbmNsdWRlL3ByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oCkBAIC0xNDEsNyArMTQxLDEwIEBACiAjZGVmaW5lIEFJRF9TREtfU0FOREJPWCAxMDkwICAgICAgLyogU0RLIHNhbmRib3ggdmlydHVhbCBVSUQgKi8KICNkZWZpbmUgQUlEX1NFQ1VSSVRZX0xPR19XUklURVIgMTA5MSAvKiB3cml0ZSB0byBzZWN1cml0eSBsb2cgKi8KICNkZWZpbmUgQUlEX1BSTkdfU0VFREVSIDEwOTIgICAgICAgICAvKiBQUk5HIHNlZWRlciBkYWVtb24gKi8KLS8qIENoYW5nZXMgdG8gdGhpcyBmaWxlIG11c3QgYmUgbWFkZSBpbiBBT1NQLCAqbm90KiBpbiBpbnRlcm5hbCBicmFuY2hlcy4gKi8KKyNkZWZpbmUgQUlEX1VQUk9CRVNUQVRTIDEwOTMgICAgICAgICAvKiB1aWQgZm9yIHVwcm9iZXN0YXRzICovCisjZGVmaW5lIEFJRF9DUk9TX0VDIDEwOTQgICAgICAgICAgICAgLyogdWlkIGZvciBhY2Nlc3NpbmcgQ2hyb21lT1MgRUMgKGNyb3NfZWMpICovCisvLyBBZGRpdGlvbnMgdG8gdGhpcyBmaWxlIG11c3QgYmUgbWFkZSBpbiBBT1NQLCAqbm90KiBpbiBpbnRlcm5hbCBicmFuY2hlcy4KKy8vIFlvdSB3aWxsIGFsc28gbmVlZCB0byB1cGRhdGUgZXhwZWN0X2lkcygpIGluIGJpb25pYy90ZXN0cy9ncnBfcHdkX3Rlc3QuY3BwLgogCiAjZGVmaW5lIEFJRF9TSEVMTCAyMDAwIC8qIGFkYiBhbmQgZGVidWcgc2hlbGwgdXNlciAqLwogI2RlZmluZSBBSURfQ0FDSEUgMjAwMSAvKiBjYWNoZSBhY2Nlc3MgKi8KQEAgLTE1Niw3ICsxNTksNyBAQAogI2RlZmluZSBBSURfT0VNX1JFU0VSVkVEX1NUQVJUIDI5MDAKICNkZWZpbmUgQUlEX09FTV9SRVNFUlZFRF9FTkQgMjk5OQogCi0vKiBUaGUgMzAwMCBzZXJpZXMgYXJlIGludGVuZGVkIGZvciB1c2UgYXMgc3VwcGxlbWVudGFsIGdyb3VwIGlkJ3Mgb25seS4KKy8qIFRoZSAzMDAwIHNlcmllcyBhcmUgaW50ZW5kZWQgZm9yIHVzZSBhcyBzdXBwbGVtZW50YWwgZ3JvdXAgaWRzIG9ubHkuCiAgKiBUaGV5IGluZGljYXRlIHNwZWNpYWwgQW5kcm9pZCBjYXBhYmlsaXRpZXMgdGhhdCB0aGUga2VybmVsIGlzIGF3YXJlIG9mLiAqLwogI2RlZmluZSBBSURfTkVUX0JUX0FETUlOIDMwMDEgLyogYmx1ZXRvb3RoOiBjcmVhdGUgYW55IHNvY2tldCAqLwogI2RlZmluZSBBSURfTkVUX0JUIDMwMDIgICAgICAgLyogYmx1ZXRvb3RoOiBjcmVhdGUgc2NvLCByZmNvbW0gb3IgbDJjYXAgc29ja2V0cyAqLwpAQCAtMTY5LDYgKzE3Miw5IEBACiAjZGVmaW5lIEFJRF9XQUtFTE9DSyAzMDEwICAgICAvKiBBbGxvdyBzeXN0ZW0gd2FrZWxvY2sgcmVhZC93cml0ZSBhY2Nlc3MgKi8KICNkZWZpbmUgQUlEX1VISUQgMzAxMSAgICAgICAgIC8qIEFsbG93IHJlYWQvd3JpdGUgdG8gL2Rldi91aGlkIG5vZGUgKi8KICNkZWZpbmUgQUlEX1JFQURUUkFDRUZTIDMwMTIgIC8qIEFsbG93IHRyYWNlZnMgcmVhZCAqLworI2RlZmluZSBBSURfVklSVFVBTE1BQ0hJTkUgMzAxMyAvKiBBbGxvd3MgVk1zIHRvIHR1bmUgZm9yIHBlcmZvcm1hbmNlKi8KKy8vIEFkZGl0aW9ucyB0byB0aGlzIGZpbGUgbXVzdCBiZSBtYWRlIGluIEFPU1AsICpub3QqIGluIGludGVybmFsIGJyYW5jaGVzLgorLy8gWW91IHdpbGwgYWxzbyBuZWVkIHRvIHVwZGF0ZSBleHBlY3RfaWRzKCkgaW4gYmlvbmljL3Rlc3RzL2dycF9wd2RfdGVzdC5jcHAuCiAKIC8qIFRoZSByYW5nZSA1MDAwLTU5OTkgaXMgYWxzbyByZXNlcnZlZCBmb3IgdmVuZG9yIHBhcnRpdGlvbi4gKi8KICNkZWZpbmUgQUlEX09FTV9SRVNFUlZFRF8yX1NUQVJUIDUwMDAKZGlmZiAtLWdpdCBhL2xpYmN1dGlscy9pbmNsdWRlL3ByaXZhdGUvZnNfY29uZmlnLmggYi9saWJjdXRpbHMvaW5jbHVkZS9wcml2YXRlL2ZzX2NvbmZpZy5oCmluZGV4IDhhOWExZmYuLjlhNzI3YmMgMTAwNjQ0Ci0tLSBhL2xpYmN1dGlscy9pbmNsdWRlL3ByaXZhdGUvZnNfY29uZmlnLmgKKysrIGIvbGliY3V0aWxzL2luY2x1ZGUvcHJpdmF0ZS9mc19jb25maWcuaApAQCAtMjEsMzAgKzIxLDM5IEBACiAKICNwcmFnbWEgb25jZQogCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAKLSNpZiBkZWZpbmVkKF9fQklPTklDX18pCiAjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgotI2Vsc2UgIC8vIGRlZmluZWQoX19CSU9OSUNfXykKLSNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jYXBhYmlsaXR5Lmg+Ci0jZW5kaWYgIC8vIGRlZmluZWQoX19CSU9OSUNfXykKIAogLyogUnVsZXMgZm9yIGRpcmVjdG9yaWVzIGFuZCBmaWxlcyBoYXMgbW92ZWQgdG8gc3lzdGVtL2NvZGUvbGliY3V0aWxzL2ZzX2NvbmZpZy5jICovCiAKIF9fQkVHSU5fREVDTFMKIAotLyoKLSAqIFVzZWQgaW46Ci0gKiAgYnVpbGQvdG9vbHMvZnNfY29uZmlnL2ZzX2NvbmZpZy5jCi0gKiAgYnVpbGQvdG9vbHMvZnNfZ2V0X3N0YXRzL2ZzX2dldF9zdGF0cy5jCi0gKiAgc3lzdGVtL2V4dHJhcy9leHQ0X3V0aWxzL21ha2VfZXh0NGZzX21haW4uYwotICogIGV4dGVybmFsL3NxdWFzaGZzLXRvb2xzL3NxdWFzaGZzLXRvb2xzL2FuZHJvaWQuYwotICogIHN5c3RlbS9jb3JlL2NwaW8vbWtib290ZnMuYwotICogIHN5c3RlbS9jb3JlL2FkYi9maWxlX3N5bmNfc2VydmljZS5jcHAKLSAqICBzeXN0ZW0vZXh0cmFzL2V4dDRfdXRpbHMvY2FubmVkX2ZzX2NvbmZpZy5jCi0gKi8KKy8qIFRoaXMgQVBJIGlzIGRlcHJlY2F0ZWQuIE5ldyB1c2VycyBzaG91bGQgY2FsbCBnZXRfZnNfY29uZmlnLiAqLwogdm9pZCBmc19jb25maWcoY29uc3QgY2hhciogcGF0aCwgaW50IGRpciwgY29uc3QgY2hhciogdGFyZ2V0X291dF9wYXRoLCB1bnNpZ25lZCogdWlkLCB1bnNpZ25lZCogZ2lkLAogICAgICAgICAgICAgICAgdW5zaWduZWQqIG1vZGUsIHVpbnQ2NF90KiBjYXBhYmlsaXRpZXMpOwogCitzdHJ1Y3QgZnNfY29uZmlnIHsKKyAgdWlkX3QgdWlkOworICBnaWRfdCBnaWQ7CisgIG1vZGVfdCBtb2RlOworICB1aW50NjRfdCBjYXBhYmlsaXRpZXM7Cit9OworCisvKgorICogSWYgYSBmaWxlIHN5c3RlbSBjb25maWd1cmF0aW9uIHdhcyBmb3VuZCBmb3IgdGhlIHNwZWNpZmllZCBwYXRoLCBzdG9yZSBpdCB0byAqY29uZi4KKyAqIFJldHVybnMgd2hldGhlciBhIGZpbGUgc3lzdGVtIGNvbmZpZ3VyYXRpb24gd2FzIGZvdW5kLgorICoKKyAqIGRpcjogV2hldGhlciBwYXRoIHJlZmVycyB0byBhIGRpcmVjdG9yeS4KKyAqIHRhcmdldF9vdXRfcGF0aDogUGF0aCB0byB0aGUgYmFzZSBkaXJlY3RvcnkgdG8gcmVhZCB0aGUgZmlsZSBzeXN0ZW0gY29uZmlndXJhdGlvbiBmcm9tLCBvciBhIG51bGwKKyAqIHBvaW50ZXIgdG8gdXNlIHRoZSByb290IGRpcmVjdG9yeSBhcyB0aGUgYmFzZS4gSG9zdCBjb2RlIHNob3VsZCBwYXNzICRBTkRST0lEX1BST0RVQ1RfT1VUIG9yCisgKiBlcXVpdmFsZW50LCBhbmQgZGV2aWNlIGNvZGUgc2hvdWxkIHBhc3MgYSBudWxsIHBvaW50ZXIuCisgKi8KK2Jvb2wgZ2V0X2ZzX2NvbmZpZyhjb25zdCBjaGFyKiBwYXRoLCBib29sIGRpciwgY29uc3QgY2hhciogdGFyZ2V0X291dF9wYXRoLAorICAgICAgICAgICAgICAgICAgIHN0cnVjdCBmc19jb25maWcqIGNvbmYpOworCiBfX0VORF9ERUNMUwpkaWZmIC0tZ2l0IGEvbGliY3V0aWxzL2luY2x1ZGVfb3V0c2lkZV9zeXN0ZW0vY3V0aWxzL3RocmVhZHMuaCBiL2xpYmN1dGlscy9pbmNsdWRlX291dHNpZGVfc3lzdGVtL2N1dGlscy90aHJlYWRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDk5MzMwZmYuLjAwMDAwMDAKLS0tIGEvbGliY3V0aWxzL2luY2x1ZGVfb3V0c2lkZV9zeXN0ZW0vY3V0aWxzL3RocmVhZHMuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL2luY2x1ZGUvY3V0aWxzL3RocmVhZHMuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYmN1dGlscy9pb3NjaGVkX3BvbGljeS5jcHAgYi9saWJjdXRpbHMvaW9zY2hlZF9wb2xpY3kuY3BwCmluZGV4IDAxMmM1MzcuLmY3YzcyNGQgMTAwNjQ0Ci0tLSBhL2xpYmN1dGlscy9pb3NjaGVkX3BvbGljeS5jcHAKKysrIGIvbGliY3V0aWxzL2lvc2NoZWRfcG9saWN5LmNwcApAQCAtMjQsOCArMjQsNyBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaWYgZGVmaW5lZChfX0FORFJPSURfXykKLSNkZWZpbmUgSU9QUklPX1dIT19QUk9DRVNTICgxKQotI2RlZmluZSBJT1BSSU9fQ0xBU1NfU0hJRlQgKDEzKQorI2luY2x1ZGUgPGxpbnV4L2lvcHJpby5oPgogI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CiAjZGVmaW5lIF9fYW5kcm9pZF91bnVzZWQKICNlbHNlCmRpZmYgLS1naXQgYS9saWJjdXRpbHMvcHJvcGVydGllcy5jcHAgYi9saWJjdXRpbHMvcHJvcGVydGllcy5jcHAKaW5kZXggMDNmMDQ5Ni4uZDNhMmI1MCAxMDA2NDQKLS0tIGEvbGliY3V0aWxzL3Byb3BlcnRpZXMuY3BwCisrKyBiL2xpYmN1dGlscy9wcm9wZXJ0aWVzLmNwcApAQCAtOTMsOCArOTMsNyBAQAogCiAjaWYgX19oYXNfaW5jbHVkZSg8c3lzL3N5c3RlbV9wcm9wZXJ0aWVzLmg+KQogCi0jZGVmaW5lIF9SRUFMTFlfSU5DTFVERV9TWVNfX1NZU1RFTV9QUk9QRVJUSUVTX0hfCi0jaW5jbHVkZSA8c3lzL19zeXN0ZW1fcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHN5cy9zeXN0ZW1fcHJvcGVydGllcy5oPgogCiBzdHJ1Y3QgY2FsbGJhY2tfZGF0YSB7CiAgICAgdm9pZCAoKmNhbGxiYWNrKShjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSwgdm9pZCogY29va2llKTsKZGlmZiAtLWdpdCBhL2xpYmN1dGlscy9zY2hlZF9wb2xpY3lfdGVzdC5jcHAgYi9saWJjdXRpbHMvc2NoZWRfcG9saWN5X3Rlc3QuY3BwCmluZGV4IDUwYmQ2ZDAuLjI2NDE3NDMgMTAwNjQ0Ci0tLSBhL2xpYmN1dGlscy9zY2hlZF9wb2xpY3lfdGVzdC5jcHAKKysrIGIvbGliY3V0aWxzL3NjaGVkX3BvbGljeV90ZXN0LmNwcApAQCAtNjcsMTMgKzY3LDYgQEAKIH0KIAogVEVTVChTY2hlZFBvbGljeSwgc2V0X3NjaGVkX3BvbGljeSkgewotICAgIGlmICghc2NoZWRib29zdF9lbmFibGVkKCkpIHsKLSAgICAgICAgLy8gc2NoZWRib29zdF9lbmFibGVkKCkgKGkuZS4gQ09ORklHX0NHUk9VUF9TQ0hFRFRVTkUpIGlzIG9wdGlvbmFsOwotICAgICAgICAvLyBpdCdzIG9ubHkgbmVlZGVkIG9uIGRldmljZXMgdXNpbmcgZW5lcmd5LWF3YXJlIHNjaGVkdWxlci4KLSAgICAgICAgR1RFU1RfTE9HXyhJTkZPKSA8PCAic2tpcHBpbmcgdGVzdCB0aGF0IHJlcXVpcmVzIENPTkZJR19DR1JPVVBfU0NIRURUVU5FIjsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQogICAgIEFTU0VSVF9FUSgwLCBzZXRfc2NoZWRfcG9saWN5KDAsIFNQX0JBQ0tHUk9VTkQpKTsKICAgICBBU1NFUlRfRVEoMCwgc2V0X2NwdXNldF9wb2xpY3koMCwgU1BfQkFDS0dST1VORCkpOwogICAgIEFzc2VydFBvbGljeShTUF9CQUNLR1JPVU5EKTsKZGlmZiAtLWdpdCBhL2xpYmN1dGlscy9zb2NrZXRfbG9jYWxfdW5peC5oIGIvbGliY3V0aWxzL3NvY2tldF9sb2NhbF91bml4LmgKaW5kZXggNDViOTg1Ni4uZWE5OGMwOCAxMDA2NDQKLS0tIGEvbGliY3V0aWxzL3NvY2tldF9sb2NhbF91bml4LmgKKysrIGIvbGliY3V0aWxzL3NvY2tldF9sb2NhbF91bml4LmgKQEAgLTE3LDYgKzE3LDggQEAKICNpZm5kZWYgX19TT0NLRVRfTE9DQUxfSAogI2RlZmluZSBfX1NPQ0tFVF9MT0NBTF9ICiAKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKICNkZWZpbmUgRklMRVNZU1RFTV9TT0NLRVRfUFJFRklYICIvdG1wLyIgCiAjZGVmaW5lIEFORFJPSURfUkVTRVJWRURfU09DS0VUX1BSRUZJWCAiL2Rldi9zb2NrZXQvIgogCmRpZmYgLS1naXQgYS9saWJjdXRpbHMvc29ja2V0c190ZXN0LmNwcCBiL2xpYmN1dGlscy9zb2NrZXRzX3Rlc3QuY3BwCmluZGV4IDFmYTQwYmMuLmY2ZjljMzYgMTAwNjQ0Ci0tLSBhL2xpYmN1dGlscy9zb2NrZXRzX3Rlc3QuY3BwCisrKyBiL2xpYmN1dGlscy9zb2NrZXRzX3Rlc3QuY3BwCkBAIC0xOSw4ICsxOSw2IEBACiAvLyBzaG91bGQgYmUgdGhlIGNhc2UgZm9yIGxvb3BiYWNrIGNvbW11bmljYXRpb24sIGJ1dCBpcyBub3QgZ3VhcmFudGVlZC4KIAogI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDx0aW1lLmg+CiAKICNpbmNsdWRlIDxjdXRpbHMvc29ja2V0cy5oPgpkaWZmIC0tZ2l0IGEvbGliY3V0aWxzL3NvY2tldHNfd2luZG93cy5jcHAgYi9saWJjdXRpbHMvc29ja2V0c193aW5kb3dzLmNwcAppbmRleCA0YWRiNzk2Li45OWEyZTJkIDEwMDY0NAotLS0gYS9saWJjdXRpbHMvc29ja2V0c193aW5kb3dzLmNwcAorKysgYi9saWJjdXRpbHMvc29ja2V0c193aW5kb3dzLmNwcApAQCAtMzUsNyArMzUsNyBAQAogLy8gY2FuIGJlIGV4dHJlbWVseSB0cmlja3kgYW5kIGNhdXNlIGRlYWRsb2NrIHdoZW4gdXNpbmcgdGhyZWFkcyBvciBhdGV4aXQoKS4KIC8vCiAvLyBCb3RoIGFkYiAoMSkgYW5kIENocm9tZSAoMikgcHVycG9zZWZ1bGx5IGF2b2lkIFdTQUNsZWFudXAoKSB3aXRoIG5vIGlzc3Vlcy4KLS8vICgxKSBodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9zeXN0ZW0vY29yZS5naXQvKy9tYXN0ZXIvYWRiL3N5c2RlcHNfd2luMzIuY3BwCisvLyAoMSkgaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vcGFja2FnZXMvbW9kdWxlcy9hZGIuZ2l0LysvbWFpbi9zeXNkZXBzX3dpbjMyLmNwcAogLy8gKDIpIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vY29kZXNlYXJjaCNjaHJvbWl1bS9zcmMvbmV0L2Jhc2Uvd2luc29ja19pbml0LmNjCiBib29sIGluaXRpYWxpemVfd2luZG93c19zb2NrZXRzKCkgewogICAgIC8vIFRoZXJlJ3Mgbm8gaGFybSBpbiBjYWxsaW5nIFdTQVN0YXJ0dXAoKSBtdWx0aXBsZSB0aW1lcyBidXQgbm8gYmVuZWZpdApkaWZmIC0tZ2l0IGEvbGliY3V0aWxzL3RocmVhZHMuY3BwIGIvbGliY3V0aWxzL3RocmVhZHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWNlN2EzLi4wMDAwMDAwCi0tLSBhL2xpYmN1dGlscy90aHJlYWRzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0qKiBDb3B5cmlnaHQgKEMpIDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNpbmNsdWRlIDxjdXRpbHMvdGhyZWFkcy5oPgotCi0jaWYgZGVmaW5lZChfX0FQUExFX18pCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jZWxpZiBkZWZpbmVkKF9fbGludXhfXykKLSNpbmNsdWRlIDxzeXNjYWxsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZWxpZiBkZWZpbmVkKF9XSU4zMikKLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19CSU9OSUNfXykgfHwgZGVmaW5lZChfX0dMSUJDX18pICYmIF9fR0xJQkNfTUlOT1JfXyA+PSAzMgotLy8gTm8gZGVmaW5pdGlvbiBuZWVkZWQgZm9yIEFuZHJvaWQgYmVjYXVzZSB3ZSdsbCBqdXN0IHBpY2sgdXAgYmlvbmljJ3MgY29weS4KLS8vIE5vIGRlZmluaXRpb24gbmVlZGVkIGZvciBHbGliYyA+PSAyLjMyIGJlY2F1c2UgaXQgZXhwb3NlcyBpdHMgb3duIGNvcHkuCi0jZWxzZQotcGlkX3QgZ2V0dGlkKCkgewotI2lmIGRlZmluZWQoX19BUFBMRV9fKQotICB1aW50NjRfdCB0aWQ7Ci0gIHB0aHJlYWRfdGhyZWFkaWRfbnAoTlVMTCwgJnRpZCk7Ci0gIHJldHVybiB0aWQ7Ci0jZWxpZiBkZWZpbmVkKF9fbGludXhfXykKLSAgcmV0dXJuIHN5c2NhbGwoX19OUl9nZXR0aWQpOwotI2VsaWYgZGVmaW5lZChfV0lOMzIpCi0gIHJldHVybiBHZXRDdXJyZW50VGhyZWFkSWQoKTsKLSNlbmRpZgotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJjdXRpbHMvdHJhY2UtZGV2LmluYyBiL2xpYmN1dGlscy90cmFjZS1kZXYuaW5jCmluZGV4IDk0OTQ1ZWMuLmM5MTFiNGYgMTAwNjQ0Ci0tLSBhL2xpYmN1dGlscy90cmFjZS1kZXYuaW5jCisrKyBiL2xpYmN1dGlscy90cmFjZS1kZXYuaW5jCkBAIC0zNiw4ICszNiw3IEBACiAjaW5jbHVkZSA8bG9nL2xvZ19wcm9wZXJ0aWVzLmg+CiAKICNpZiBkZWZpbmVkKF9fQklPTklDX18pCi0jZGVmaW5lIF9SRUFMTFlfSU5DTFVERV9TWVNfX1NZU1RFTV9QUk9QRVJUSUVTX0hfCi0jaW5jbHVkZSA8c3lzL19zeXN0ZW1fcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHN5cy9zeXN0ZW1fcHJvcGVydGllcy5oPgogI2VuZGlmCiAKIC8qKgpAQCAtNDksMTcgKzQ4LDE3IEBACiAKIGNvbnN0ZXhwciB1aW50MzJfdCBrU2VxTm9Ob3RJbml0ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KC0xKTsKIAotYXRvbWljX2Jvb2wgICAgICAgICAgICAgIGF0cmFjZV9pc19yZWFkeSAgICAgID0gQVRPTUlDX1ZBUl9JTklUKGZhbHNlKTsKK2F0b21pY19ib29sICAgICAgICAgICAgICBhdHJhY2VfaXNfcmVhZHkgICAgICA9IGZhbHNlOwogaW50ICAgICAgICAgICAgICAgICAgICAgIGF0cmFjZV9tYXJrZXJfZmQgICAgID0gLTE7CiB1aW50NjRfdCAgICAgICAgICAgICAgICAgYXRyYWNlX2VuYWJsZWRfdGFncyAgPSBBVFJBQ0VfVEFHX05PVF9SRUFEWTsKLXN0YXRpYyBhdG9taWNfYm9vbCAgICAgICBhdHJhY2VfaXNfZW5hYmxlZCAgICA9IEFUT01JQ19WQVJfSU5JVCh0cnVlKTsKK3N0YXRpYyBhdG9taWNfYm9vbCAgICAgICBhdHJhY2VfaXNfZW5hYmxlZCAgICA9IHRydWU7CiBzdGF0aWMgcHRocmVhZF9tdXRleF90ICAgYXRyYWNlX3RhZ3NfbXV0ZXggICAgPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwogCiAvKioKICAqIFNlcXVlbmNlIG51bWJlciBvZiBkZWJ1Zy5hdHJhY2UudGFncy5lbmFibGVmbGFncyB0aGUgbGFzdCB0aW1lIHRoZSBlbmFibGVkCiAgKiB0YWdzIHdlcmUgcmVsb2FkZWQuCiAgKiovCi1zdGF0aWMgX0F0b21pYyh1aW50MzJfdCkgbGFzdF9zZXF1ZW5jZV9udW1iZXIgPSBBVE9NSUNfVkFSX0lOSVQoa1NlcU5vTm90SW5pdCk7CitzdGF0aWMgX0F0b21pYyh1aW50MzJfdCkgbGFzdF9zZXF1ZW5jZV9udW1iZXIgPSBrU2VxTm9Ob3RJbml0OwogCiAjaWYgZGVmaW5lZChfX0JJT05JQ19fKQogLy8gQWxsIHplcm8gcHJvcF9pbmZvIHRoYXQgaGFzIGEgc2VxdWVuY2UgbnVtYmVyIG9mIDAuIFRoaXMgaXMgZWFzaWVyIHRoYW4KZGlmZiAtLWdpdCBhL2xpYmN1dGlscy90cmFjZS1ob3N0LmNwcCBiL2xpYmN1dGlscy90cmFjZS1ob3N0LmNwcAppbmRleCBlOWY1OGMzLi5jNDVkMDY3IDEwMDY0NAotLS0gYS9saWJjdXRpbHMvdHJhY2UtaG9zdC5jcHAKKysrIGIvbGliY3V0aWxzL3RyYWNlLWhvc3QuY3BwCkBAIC0xNiwxMSArMTYsMTAgQEAKIAogI2luY2x1ZGUgPGN1dGlscy90cmFjZS5oPgogCi1hdG9taWNfYm9vbCAgICAgICAgICAgICBhdHJhY2VfaXNfcmVhZHkgICAgICA9IEFUT01JQ19WQVJfSU5JVCh0cnVlKTsKK2F0b21pY19ib29sICAgICAgICAgICAgIGF0cmFjZV9pc19yZWFkeSAgICAgID0gdHJ1ZTsKIGludCAgICAgICAgICAgICAgICAgICAgIGF0cmFjZV9tYXJrZXJfZmQgICAgID0gLTE7CiB1aW50NjRfdCAgICAgICAgICAgICAgICBhdHJhY2VfZW5hYmxlZF90YWdzICA9IDA7CiAKLXZvaWQgYXRyYWNlX3NldF9kZWJ1Z2dhYmxlKGJvb2wgLypkZWJ1Z2dhYmxlKi8pIHt9CiB2b2lkIGF0cmFjZV9zZXRfdHJhY2luZ19lbmFibGVkKGJvb2wgLyplbmFibGVkKi8pIHt9CiB2b2lkIGF0cmFjZV91cGRhdGVfdGFncygpIHsgfQogdm9pZCBhdHJhY2Vfc2V0dXAoKSB7IH0KZGlmZiAtLWdpdCBhL2xpYmN1dGlscy91ZXZlbnQuY3BwIGIvbGliY3V0aWxzL3VldmVudC5jcHAKaW5kZXggNDBiYmQ1Yy4uZjAxYTQ3OSAxMDA2NDQKLS0tIGEvbGliY3V0aWxzL3VldmVudC5jcHAKKysrIGIvbGliY3V0aWxzL3VldmVudC5jcHAKQEAgLTkyLDIwICs5MiwyMiBAQAogICAgIHJldHVybiAtMTsKIH0KIAotaW50IHVldmVudF9vcGVuX3NvY2tldChpbnQgYnVmX3N6LCBib29sIHBhc3NjcmVkKSB7Ci0gICAgc3RydWN0IHNvY2thZGRyX25sIGFkZHI7Ci0gICAgaW50IG9uID0gcGFzc2NyZWQ7CisvKgorICogQ3JlYXRlcyBhbiB1bmJvdW5kIG5ldGxpbmsgc29ja2V0IGZvciByZWNlaXZpbmcgdWV2ZW50IG1lc3NhZ2VzLgorICogQGJ1Zl9zejogc29ja2V0IHJlY2VpdmUgYnVmZmVyIHNpemUuCisgKiBAcGFzc2NyZWQ6IHdoZXRoZXIgb3Igbm90IHRvIGVuYWJsZSByZWNlaXZpbmcgdGhlIFNDTV9DUkVERU5USUFMUyBjb250cm9sCisgKgltZXNzYWdlLgorICoKKyAqIFJldHVybnM6IGEgc29ja2V0IGRlc2NyaXB0b3IgdXBvbiBzdWNjZXNzIG9yIC0xIHVwb24gZmFpbHVyZS4KKyAqLworaW50IHVldmVudF9jcmVhdGVfc29ja2V0KGludCBidWZfc3osIGJvb2wgcGFzc2NyZWQpIHsKKyAgICBpbnQgcyA9IHNvY2tldChQRl9ORVRMSU5LLCBTT0NLX0RHUkFNIHwgU09DS19DTE9FWEVDLCBORVRMSU5LX0tPQkpFQ1RfVUVWRU5UKTsKKyAgICBpZiAocyA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKwogICAgIGludCBidWZfc3pfcmVhZGJhY2sgPSAwOwogICAgIHNvY2tsZW5fdCBvcHRsZW4gPSBzaXplb2YoYnVmX3N6X3JlYWRiYWNrKTsKLSAgICBpbnQgczsKLQotICAgIG1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKLSAgICBhZGRyLm5sX2ZhbWlseSA9IEFGX05FVExJTks7Ci0gICAgYWRkci5ubF9waWQgPSAwOwotICAgIGFkZHIubmxfZ3JvdXBzID0gMHhmZmZmZmZmZjsKLQotICAgIHMgPSBzb2NrZXQoUEZfTkVUTElOSywgU09DS19ER1JBTSB8IFNPQ0tfQ0xPRVhFQywgTkVUTElOS19LT0JKRUNUX1VFVkVOVCk7Ci0gICAgaWYgKHMgPCAwKSByZXR1cm4gLTE7CiAKICAgICBpZiAoc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsICZidWZfc3osIHNpemVvZihidWZfc3opKSA8IDAgfHwKICAgICAgICAgICBnZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgJmJ1Zl9zel9yZWFkYmFjaywgJm9wdGxlbikgPCAwKSB7CkBAIC0xMjMsOSArMTI1LDQzIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpbnQgb24gPSBwYXNzY3JlZDsKKwogICAgIHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fUEFTU0NSRUQsICZvbiwgc2l6ZW9mKG9uKSk7CiAKLSAgICBpZiAoYmluZChzLCAoc3RydWN0IHNvY2thZGRyKikmYWRkciwgc2l6ZW9mKGFkZHIpKSA8IDApIHsKKyAgICByZXR1cm4gczsKK30KKworLyoKKyAqIEJpbmRzIGEgbmV0bGluayBzb2NrZXQuIEJpbmRpbmcgYSBuZXRsaW5rIHNvY2tldCBtYWtlcyB0aGUga2VybmVsIHN0YXJ0CisgKiBzZW5kaW5nIG5ldGxpbmsgbWVzc2FnZXMgdG8gdGhhdCBuZXRsaW5rIHNvY2tldC4KKyAqCisgKiBSZXR1cm5zOiAwIHVwb24gc3VjY2VzczsgLTEgdXBvbiBlcnJvci4KKyAqLworaW50IHVldmVudF9iaW5kKGludCBzb2NrZXQpIHsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfbmwgYWRkciA9IHsKKyAgICAgICAgICAgIC5ubF9mYW1pbHkgPSBBRl9ORVRMSU5LLAorICAgICAgICAgICAgLm5sX3BpZCA9IDAsCisgICAgICAgICAgICAubmxfZ3JvdXBzID0gMHhmZmZmZmZmZiwKKyAgICB9OworICAgIHJldHVybiBiaW5kKHNvY2tldCwgKHN0cnVjdCBzb2NrYWRkciopJmFkZHIsIHNpemVvZihhZGRyKSk7Cit9CisKKy8qCisgKiBDcmVhdGVzIGEgYm91bmQgbmV0bGluayBzb2NrZXQgZm9yIHJlY2VpdmluZyB1ZXZlbnQgbWVzc2FnZXMuCisgKiBAYnVmX3N6OiBzb2NrZXQgcmVjZWl2ZSBidWZmZXIgc2l6ZS4KKyAqIEBwYXNzY3JlZDogd2hldGhlciBvciBub3QgdG8gZW5hYmxlIHJlY2VpdmluZyB0aGUgU0NNX0NSRURFTlRJQUxTIGNvbnRyb2wKKyAqCW1lc3NhZ2UuCisgKgorICogUmV0dXJuczogYSBzb2NrZXQgZGVzY3JpcHRvciB1cG9uIHN1Y2Nlc3Mgb3IgLTEgdXBvbiBmYWlsdXJlLgorICovCitpbnQgdWV2ZW50X29wZW5fc29ja2V0KGludCBidWZfc3osIGJvb2wgcGFzc2NyZWQpIHsKKyAgICBpbnQgcyA9IHVldmVudF9jcmVhdGVfc29ja2V0KGJ1Zl9zeiwgcGFzc2NyZWQpOworICAgIGlmIChzIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKHVldmVudF9iaW5kKHMpIDwgMCkgewogICAgICAgICBjbG9zZShzKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KZGlmZiAtLWdpdCBhL2xpYmRpc2tjb25maWcvQW5kcm9pZC5icCBiL2xpYmRpc2tjb25maWcvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUyM2Q0ZS4uMDAwMDAwMAotLS0gYS9saWJkaXNrY29uZmlnL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi1wYWNrYWdlIHsKLSAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCi19Ci0KLWNjX2xpYnJhcnkgewotICAgIG5hbWU6ICJsaWJkaXNrY29uZmlnIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICB9LAotICAgIHNyY3M6IFsKLSAgICAgICAgImRpc2tjb25maWcuYyIsCi0gICAgICAgICJkaXNrdXRpbHMuYyIsCi0gICAgICAgICJ3cml0ZV9sc3QuYyIsCi0gICAgICAgICJjb25maWdfbWJyLmMiLAotICAgIF0sCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLSAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCi0KLSAgICB0YXJnZXQ6IHsKLSAgICAgICAgZGFyd2luOiB7Ci0gICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKLSAgICAgICAgfSwKLSAgICAgICAgaG9zdF9saW51eDogewotICAgICAgICAgICAgY2ZsYWdzOiBbCi0gICAgICAgICAgICAgICAgIi1EX0xBUkdFRklMRTY0X1NPVVJDRSIsCi0gICAgICAgICAgICBdLAotICAgICAgICB9LAotICAgIH0sCi19CmRpZmYgLS1naXQgYS9saWJkaXNrY29uZmlnL2NvbmZpZ19tYnIuYyBiL2xpYmRpc2tjb25maWcvY29uZmlnX21ici5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2U5YmJmLi4wMDAwMDAwCi0tLSBhL2xpYmRpc2tjb25maWcvY29uZmlnX21ici5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUxICswLDAgQEAKLS8qIGxpYnMvZGlza2NvbmZpZy9kaXNrY29uZmlnLmMKLSAqCi0gKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiY29uZmlnX21iciIKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxkaXNrY29uZmlnL2Rpc2tjb25maWcuaD4KLSNpbmNsdWRlIDxsb2cvbG9nLmg+Ci0KLS8qIHN0YXJ0IGFuZCBsZW4gYXJlIGluIExCQSB1bml0cyAqLwotc3RhdGljIHZvaWQKLWNmZ19wZW50cnkoc3RydWN0IHBjX3BhcnRpdGlvbiAqcGVudHJ5LCB1aW50OF90IHN0YXR1cywgdWludDhfdCB0eXBlLAotICAgICAgICAgICB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgbGVuKQotewotICAgIGlmIChsZW4gPiAwKSB7Ci0gICAgICAgIC8qIHNlZW1zIHRoYXQgc29tZXMgQklPU2VucyBjYW4gZ2V0IHdlZGdlZCBvbiBib290IHdoaWxlIHZlcmlmeWluZwotICAgICAgICAgKiB0aGUgbWJyIGlmIHRoZXNlIGFyZSAwICovCi0gICAgICAgIG1lbXNldCgmcGVudHJ5LT5zdGFydCwgMHhmZiwgc2l6ZW9mKHN0cnVjdCBjaHMpKTsKLSAgICAgICAgbWVtc2V0KCZwZW50cnktPmVuZCwgMHhmZiwgc2l6ZW9mKHN0cnVjdCBjaHMpKTsKLSAgICB9IGVsc2UgewotICAgICAgICAvKiB6ZXJvIG91dCB0aGUgYy9oL3MgZW50cmllcy4uIHRoZXkgYXJlIG5vdCB1c2VkICovCi0gICAgICAgIG1lbXNldCgmcGVudHJ5LT5zdGFydCwgMCwgc2l6ZW9mKHN0cnVjdCBjaHMpKTsKLSAgICAgICAgbWVtc2V0KCZwZW50cnktPmVuZCwgMCwgc2l6ZW9mKHN0cnVjdCBjaHMpKTsKLSAgICB9Ci0KLSAgICBwZW50cnktPnN0YXR1cyA9IHN0YXR1czsKLSAgICBwZW50cnktPnR5cGUgPSB0eXBlOwotICAgIHBlbnRyeS0+c3RhcnRfbGJhID0gc3RhcnQ7Ci0gICAgcGVudHJ5LT5sZW5fbGJhID0gbGVuOwotCi0gICAgQUxPR0koIkNvbmZpZ3VyaW5nIHBlbnRyeS4gc3RhdHVzPTB4JXggdHlwZT0weCV4IHN0YXJ0X2xiYT0ldSBsZW5fbGJhPSV1IiwKLSAgICAgICAgIHBlbnRyeS0+c3RhdHVzLCBwZW50cnktPnR5cGUsIHBlbnRyeS0+c3RhcnRfbGJhLCBwZW50cnktPmxlbl9sYmEpOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgdWludDMyX3QKLWtiX3RvX2xiYSh1aW50MzJfdCBsZW5fa2IsIHVpbnQzMl90IHNlY3Rfc2l6ZSkKLXsKLSAgICB1aW50NjRfdCBsYmE7Ci0KLSAgICBsYmEgPSAodWludDY0X3QpbGVuX2tiICogMTAyNDsKLSAgICAvKiBidW1wIGl0IHVwIHRvIHRoZSBuZXh0IExCQSBib3VuZGFyeSBqdXN0IGluIGNhc2UgICovCi0gICAgbGJhID0gKGxiYSArICh1aW50NjRfdClzZWN0X3NpemUgLSAxKSAmIH4oKHVpbnQ2NF90KXNlY3Rfc2l6ZSAtIDEpOwotICAgIGxiYSAvPSAodWludDY0X3Qpc2VjdF9zaXplOwotICAgIGlmIChsYmEgPj0gMHhmZmZmZmZmZlVMTCkKLSAgICAgICAgQUxPR0UoIkVycm9yIGNvbnZlcnRpbmcga2IgLT4gbGJhLiAzMmJpdCBvdmVyZmxvdywgZXhwZWN0IHdlaXJkbmVzcyIpOwotICAgIHJldHVybiAodWludDMyX3QpKGxiYSAmIDB4ZmZmZmZmZmZVTEwpOwotfQotCi0KLXN0YXRpYyBzdHJ1Y3Qgd3JpdGVfbGlzdCAqCi1ta19wcmlfcGVudHJ5KHN0cnVjdCBkaXNrX2luZm8gKmRpbmZvLCBzdHJ1Y3QgcGFydF9pbmZvICpwaW5mbywgaW50IHBudW0sCi0gICAgICAgICAgICAgIHVpbnQzMl90ICpsYmEpCi17Ci0gICAgc3RydWN0IHdyaXRlX2xpc3QgKml0ZW07Ci0gICAgc3RydWN0IHBjX3BhcnRpdGlvbiAqcGVudHJ5OwotCi0gICAgaWYgKHBudW0gPj0gUENfTlVNX0JPT1RfUkVDT1JEX1BBUlRTKSB7Ci0gICAgICAgIEFMT0dFKCJNYXhpbXVtIG51bWJlciBvZiBwcmltYXJ5IHBhcnRpdGlvbiBleGNlZWRlZC4iKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKCEoaXRlbSA9IGFsbG9jX3dsKHNpemVvZihzdHJ1Y3QgcGNfcGFydGl0aW9uKSkpKSB7Ci0gICAgICAgIEFMT0dFKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBwYXJ0aXRpb24gZW50cnkuIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHsKLSAgICAgICAgLyogRE8gTk9UIERFUkVGRVJFTkNFICovCi0gICAgICAgIHN0cnVjdCBwY19ib290X3JlY29yZCAqbWJyID0gKHZvaWQgKilQQ19NQlJfRElTS19PRkZTRVQ7IAotICAgICAgICAvKiBncmFiIHRoZSBvZmZzZXQgaW4gbWJyIHdoZXJlIHRvIHdyaXRlIHRoaXMgcGFydGl0aW9uIGVudHJ5LiAqLwotICAgICAgICBpdGVtLT5vZmZzZXQgPSAobG9mZl90KSgodWludHB0cl90KSgodWludDhfdCAqKSgmbWJyLT5wdGFibGVbcG51bV0pKSk7Ci0gICAgfQotCi0gICAgcGVudHJ5ID0gKHN0cnVjdCBwY19wYXJ0aXRpb24gKikgJml0ZW0tPmRhdGE7Ci0KLSAgICAvKiBuZWVkIGEgc3RhbmRhcmQgcHJpbWFyeSBwYXJ0aXRpb24gZW50cnkgKi8KLSAgICBpZiAocGluZm8pIHsKLSAgICAgICAgLyogbmVlZCB0aGlzIHRvIGJlIDY0IGJpdCBpbiBjYXNlIGxlbl9rYiBpcyBsYXJnZSAqLwotICAgICAgICB1aW50NjRfdCBsZW5fbGJhOyAKLQotICAgICAgICBpZiAocGluZm8tPmxlbl9rYiAhPSAodWludDMyX3QpLTEpIHsKLSAgICAgICAgICAgIC8qIGJ1bXAgaXQgdXAgdG8gdGhlIG5leHQgTEJBIGJvdW5kYXJ5IGp1c3QgaW4gY2FzZSAqLwotICAgICAgICAgICAgbGVuX2xiYSA9ICgodWludDY0X3QpcGluZm8tPmxlbl9rYiAqIDEwMjQpOwotICAgICAgICAgICAgbGVuX2xiYSArPSAoKHVpbnQ2NF90KWRpbmZvLT5zZWN0X3NpemUgLSAxKTsKLSAgICAgICAgICAgIGxlbl9sYmEgJj0gfigodWludDY0X3QpZGluZm8tPnNlY3Rfc2l6ZSAtIDEpOwotICAgICAgICAgICAgbGVuX2xiYSAvPSAodWludDY0X3QpZGluZm8tPnNlY3Rfc2l6ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIG1ha2UgaXQgZmlsbCB0aGUgcmVzdCBvZiBkaXNrICovCi0gICAgICAgICAgICBsZW5fbGJhID0gZGluZm8tPm51bV9sYmEgLSAqbGJhOwotICAgICAgICB9Ci0KLSAgICAgICAgY2ZnX3BlbnRyeShwZW50cnksICgocGluZm8tPmZsYWdzICYgUEFSVF9BQ1RJVkVfRkxBRykgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDX1BBUlRfQUNUSVZFIDogUENfUEFSVF9OT1JNQUwpLAotICAgICAgICAgICAgICAgICAgIHBpbmZvLT50eXBlLCAqbGJhLCAodWludDMyX3QpbGVuX2xiYSk7Ci0KLSAgICAgICAgcGluZm8tPnN0YXJ0X2xiYSA9ICpsYmE7Ci0gICAgICAgICpsYmEgKz0gKHVpbnQzMl90KWxlbl9sYmE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLyogdGhpcyBzaG91bGQgYmUgbWFkZSBhbiBleHRlbmRlZCBwYXJ0aXRpb24sIGFuZCBzaG91bGQgdGFrZQotICAgICAgICAgKiB1cCB0aGUgcmVzdCBvZiB0aGUgZGlzayBhcyBhIHByaW1hcnkgcGFydGl0aW9uICovCi0gICAgICAgIGNmZ19wZW50cnkocGVudHJ5LCBQQ19QQVJUX05PUk1BTCwgUENfUEFSVF9UWVBFX0VYVEVOREVELAotICAgICAgICAgICAgICAgICAgICpsYmEsIGRpbmZvLT5udW1fbGJhIC0gKmxiYSk7Ci0KLSAgICAgICAgLyogbm90ZSB0aGF0IHdlIGRvIG5vdCB1cGRhdGUgdGhlICpsYmEgYmVjYXVzZSB3ZSBub3cgaGF2ZSB0bwotICAgICAgICAgKiBjcmVhdGUgYSBjaGFpbiBvZiBleHRlbmRlZCBwYXJ0aXRpb24gdGFibGVzLCBhbmQgZmlyc3Qgb25lIGlzIGF0Ci0gICAgICAgICAqICpsYmEgKi8KLSAgICB9Ci0KLSAgICByZXR1cm4gaXRlbTsKLX0KLQotCi0vKiBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgYW4gZXh0ZW5kZWQgYm9vdCByZWNvcmQgYXQgdGhlIGJlZ2lubmluZyBvZiBhbgotICogZXh0ZW5kZWQgcGFydGl0aW9uLiBUaGlzIGNyZWF0ZXMgYSBsb2dpY2FsIHBhcnRpdGlvbiBhbmQgYSBwb2ludGVyIHRvCi0gKiB0aGUgbmV4dCBFQlIuCi0gKgotICogZXh0X2xiYSA9PSBUaGUgc3RhcnQgb2YgdGhlIHRvcGxldmVsIGV4dGVuZGVkIHBhcnRpdGlvbiAocG9pbnRlZCB0byBieSB0aGUKLSAqIGVudHJ5IGluIHRoZSBNQlIpLgotICovCi1zdGF0aWMgc3RydWN0IHdyaXRlX2xpc3QgKgotbWtfZXh0X3BlbnRyeShzdHJ1Y3QgZGlza19pbmZvICpkaW5mbywgc3RydWN0IHBhcnRfaW5mbyAqcGluZm8sIHVpbnQzMl90ICpsYmEsCi0gICAgICAgICAgICAgIHVpbnQzMl90IGV4dF9sYmEsIHN0cnVjdCBwYXJ0X2luZm8gKnBuZXh0KQotewotICAgIHN0cnVjdCB3cml0ZV9saXN0ICppdGVtOwotICAgIHN0cnVjdCBwY19ib290X3JlY29yZCAqZWJyOwotICAgIHVpbnQzMl90IGxlbjsgLyogaW4gbGJhIHVuaXRzICovCi0KLSAgICBpZiAoIShpdGVtID0gYWxsb2Nfd2woc2l6ZW9mKHN0cnVjdCBwY19ib290X3JlY29yZCkpKSkgewotICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgRUJSLiIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAvKiB3ZSBhcmUgZ29pbmcgdG8gd3JpdGUgdGhlIGViciBhdCB0aGUgY3VycmVudCBMQkEsIGFuZCB0aGVuIGJ1bXAgdGhlCi0gICAgICogbGJhIGNvdW50ZXIgc2luY2UgdGhhdCBpcyB3aGVyZSB0aGUgbG9naWNhbCBkYXRhIHBhcnRpdGlvbiB3aWxsIHN0YXJ0ICovCi0gICAgaXRlbS0+b2Zmc2V0ID0gKChsb2ZmX3QpKCpsYmEpKSAqIGRpbmZvLT5zZWN0X3NpemU7Ci0gICAgKCpsYmEpKys7Ci0KLSAgICBlYnIgPSAoc3RydWN0IHBjX2Jvb3RfcmVjb3JkICopICZpdGVtLT5kYXRhOwotICAgIG1lbXNldChlYnIsIDAsIHNpemVvZihzdHJ1Y3QgcGNfYm9vdF9yZWNvcmQpKTsKLSAgICBlYnItPm1icl9zaWcgPSBQQ19CSU9TX0JPT1RfU0lHOwotCi0gICAgaWYgKHBpbmZvLT5sZW5fa2IgIT0gKHVpbnQzMl90KS0xKQotICAgICAgICBsZW4gPSBrYl90b19sYmEocGluZm8tPmxlbl9rYiwgZGluZm8tPnNlY3Rfc2l6ZSk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGlmIChwbmV4dCkgewotICAgICAgICAgICAgQUxPR0UoIk9ubHkgdGhlIGxhc3QgcGFydGl0aW9uIGNhbiBiZSBzcGVjaWZpZWQgdG8gZmlsbCB0aGUgZGlzayAiCi0gICAgICAgICAgICAgICAgICIobmFtZSA9ICclcycpIiwgcGluZm8tPm5hbWUpOwotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0gICAgICAgIGxlbiA9IGRpbmZvLT5udW1fbGJhIC0gKmxiYTsKLSAgICAgICAgLyogdXBkYXRlIHRoZSBwaW5mbyBzdHJ1Y3R1cmUgdG8gcmVmbGVjdCB0aGUgbmV3IHNpemUsIGZvcgotICAgICAgICAgKiBib29ra2VlcGluZyAqLwotICAgICAgICBwaW5mby0+bGVuX2tiID0KLSAgICAgICAgICAgICh1aW50MzJfdCkoKCh1aW50NjRfdClsZW4gKiAodWludDY0X3QpZGluZm8tPnNlY3Rfc2l6ZSkgLwotICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ2NF90KTEwMjQpKTsKLSAgICB9Ci0KLSAgICBjZmdfcGVudHJ5KCZlYnItPnB0YWJsZVtQQ19FQlJfTE9HSUNBTF9QQVJUXSwgUENfUEFSVF9OT1JNQUwsCi0gICAgICAgICAgICAgICBwaW5mby0+dHlwZSwgMSwgbGVuKTsKLQotICAgIHBpbmZvLT5zdGFydF9sYmEgPSAqbGJhOwotICAgICpsYmEgKz0gbGVuOwotCi0gICAgLyogSWYgdGhpcyBpcyBub3QgdGhlIGxhc3QgcGFydGl0aW9uLCB3ZSBoYXZlIHRvIGNyZWF0ZSBhIGxpbmsgdG8gdGhlCi0gICAgICogbmV4dCBleHRlbmRlZCBwYXJ0aXRpb24uCi0gICAgICoKLSAgICAgKiBPdGhlcndpc2UsIHRoZXJlJ3Mgbm90aGluZyB0byBkbyBzaW5jZSB0aGUgInBvaW50ZXIgZW50cnkiIGlzCi0gICAgICogYWxyZWFkeSB6ZXJvLWZpbGxlZC4KLSAgICAgKi8KLSAgICBpZiAocG5leHQpIHsKLSAgICAgICAgLyogVGhlIHN0YXJ0IGxiYSBmb3IgbmV4dCBwYXJ0aXRpb24gaXMgYW4gb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZwotICAgICAgICAgKiBvZiB0aGUgdG9wLWxldmVsIGV4dGVuZGVkIHBhcnRpdGlvbiAqLwotICAgICAgICB1aW50MzJfdCBuZXh0X3N0YXJ0X2xiYSA9ICpsYmEgLSBleHRfbGJhOwotICAgICAgICB1aW50MzJfdCBuZXh0X2xlbl9sYmE7Ci0gICAgICAgIGlmIChwbmV4dC0+bGVuX2tiICE9ICh1aW50MzJfdCktMSkKLSAgICAgICAgICAgIG5leHRfbGVuX2xiYSA9IDEgKyBrYl90b19sYmEocG5leHQtPmxlbl9rYiwgZGluZm8tPnNlY3Rfc2l6ZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG5leHRfbGVuX2xiYSA9IGRpbmZvLT5udW1fbGJhIC0gKmxiYTsKLSAgICAgICAgY2ZnX3BlbnRyeSgmZWJyLT5wdGFibGVbUENfRUJSX05FWFRfUFRSX1BBUlRdLCBQQ19QQVJUX05PUk1BTCwKLSAgICAgICAgICAgICAgICAgICBQQ19QQVJUX1RZUEVfRVhURU5ERUQsIG5leHRfc3RhcnRfbGJhLCBuZXh0X2xlbl9sYmEpOwotICAgIH0KLQotICAgIHJldHVybiBpdGVtOwotCi1mYWlsOgotICAgIGZyZWVfd2woaXRlbSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCB3cml0ZV9saXN0ICoKLW1rX21icl9zaWcoKQotewotICAgIHN0cnVjdCB3cml0ZV9saXN0ICppdGVtOwotICAgIGlmICghKGl0ZW0gPSBhbGxvY193bChzaXplb2YodWludDE2X3QpKSkpIHsKLSAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIE1CUiBzaWduYXR1cmUuIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHsKLSAgICAgICAgLyogRE8gTk9UIERFUkVGRVJFTkNFICovCi0gICAgICAgIHN0cnVjdCBwY19ib290X3JlY29yZCAqbWJyID0gKHZvaWQgKilQQ19NQlJfRElTS19PRkZTRVQ7Ci0gICAgICAgIC8qIGdyYWIgdGhlIG9mZnNldCBpbiBtYnIgd2hlcmUgdG8gd3JpdGUgbWJyIHNpZ25hdHVyZS4gKi8KLSAgICAgICAgaXRlbS0+b2Zmc2V0ID0gKGxvZmZfdCkoKHVpbnRwdHJfdCkoKHVpbnQ4X3QgKikoJm1ici0+bWJyX3NpZykpKTsKLSAgICB9Ci0KLSAgICAqKCh1aW50MTZfdCopaXRlbS0+ZGF0YSkgPSBQQ19CSU9TX0JPT1RfU0lHOwotICAgIHJldHVybiBpdGVtOwotfQotCi1zdHJ1Y3Qgd3JpdGVfbGlzdCAqCi1jb25maWdfbWJyKHN0cnVjdCBkaXNrX2luZm8gKmRpbmZvKQotewotICAgIHN0cnVjdCBwYXJ0X2luZm8gKnBpbmZvOwotICAgIHVpbnQzMl90IGN1cl9sYmEgPSBkaW5mby0+c2tpcF9sYmE7Ci0gICAgdWludDMyX3QgZXh0X2xiYSA9IDA7Ci0gICAgc3RydWN0IHdyaXRlX2xpc3QgKndyX2xpc3QgPSBOVUxMOwotICAgIHN0cnVjdCB3cml0ZV9saXN0ICp0ZW1wX3dyID0gTlVMTDsKLSAgICBpbnQgY250ID0gMDsKLSAgICBpbnQgZXh0ZW5kZWQgPSAwOwotCi0gICAgaWYgKCFkaW5mby0+cGFydF9sc3QpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgZm9yIChjbnQgPSAwOyBjbnQgPCBkaW5mby0+bnVtX3BhcnRzOyArK2NudCkgewotICAgICAgICBwaW5mbyA9ICZkaW5mby0+cGFydF9sc3RbY250XTsKLQotICAgICAgICAvKiBTaG91bGQgd2UgY3JlYXRlIGFuIGV4dGVkbmVkIHBhcnRpdGlvbj8gKi8KLSAgICAgICAgaWYgKGNudCA9PSAoUENfTlVNX0JPT1RfUkVDT1JEX1BBUlRTIC0gMSkpIHsKLSAgICAgICAgICAgIGlmIChjbnQgKyAxIDwgZGluZm8tPm51bV9wYXJ0cykgewotICAgICAgICAgICAgICAgIGV4dGVuZGVkID0gMTsKLSAgICAgICAgICAgICAgICBleHRfbGJhID0gY3VyX2xiYTsKLSAgICAgICAgICAgICAgICBpZiAoKHRlbXBfd3IgPSBta19wcmlfcGVudHJ5KGRpbmZvLCBOVUxMLCBjbnQsICZjdXJfbGJhKSkpCi0gICAgICAgICAgICAgICAgICAgIHdsaXN0X2FkZCgmd3JfbGlzdCwgdGVtcF93cik7Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgY3JlYXRlIHByaW1hcnkgZXh0ZW5kZWQgcGFydGl0aW9uLiIpOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogaWYgZXh0ZW5kZWQsIG5lZWQgMSBsYmEgZm9yIGViciAqLwotICAgICAgICBpZiAoKGN1cl9sYmEgKyBleHRlbmRlZCkgPj0gZGluZm8tPm51bV9sYmEpCi0gICAgICAgICAgICBnb3RvIG5vc3BhY2U7Ci0gICAgICAgIGVsc2UgaWYgKHBpbmZvLT5sZW5fa2IgIT0gKHVpbnQzMl90KS0xKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCBzel9sYmEgPSAocGluZm8tPmxlbl9rYiAvIGRpbmZvLT5zZWN0X3NpemUpICogMTAyNDsKLSAgICAgICAgICAgIGlmICgoY3VyX2xiYSArIHN6X2xiYSArIGV4dGVuZGVkKSA+IGRpbmZvLT5udW1fbGJhKQotICAgICAgICAgICAgICAgIGdvdG8gbm9zcGFjZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghZXh0ZW5kZWQpCi0gICAgICAgICAgICB0ZW1wX3dyID0gbWtfcHJpX3BlbnRyeShkaW5mbywgcGluZm8sIGNudCwgJmN1cl9sYmEpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHN0cnVjdCBwYXJ0X2luZm8gKnBuZXh0OwotICAgICAgICAgICAgcG5leHQgPSBjbnQgKyAxIDwgZGluZm8tPm51bV9wYXJ0cyA/ICZkaW5mby0+cGFydF9sc3RbY250KzFdIDogTlVMTDsKLSAgICAgICAgICAgIHRlbXBfd3IgPSBta19leHRfcGVudHJ5KGRpbmZvLCBwaW5mbywgJmN1cl9sYmEsIGV4dF9sYmEsIHBuZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0ZW1wX3dyKQotICAgICAgICAgICAgd2xpc3RfYWRkKCZ3cl9saXN0LCB0ZW1wX3dyKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiQ2Fubm90IGNyZWF0ZSBwYXJ0aXRpb24gJWQgKCVzKS4iLCBjbnQsIHBpbmZvLT5uYW1lKTsKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIGZpbGwgaW4gdGhlIHJlc3Qgb2YgdGhlIE1CUiB3aXRoIGVtcHR5IHBhcnRzIChpZiBuZWVkZWQpLiAqLwotICAgIGZvciAoOyBjbnQgPCBQQ19OVU1fQk9PVF9SRUNPUkRfUEFSVFM7ICsrY250KSB7Ci0gICAgICAgIHN0cnVjdCBwYXJ0X2luZm8gYmxhbms7Ci0gICAgICAgIGN1cl9sYmEgPSAwOwotICAgICAgICBtZW1zZXQoJmJsYW5rLCAwLCBzaXplb2Yoc3RydWN0IHBhcnRfaW5mbykpOwotICAgICAgICBpZiAoISh0ZW1wX3dyID0gbWtfcHJpX3BlbnRyeShkaW5mbywgJmJsYW5rLCBjbnQsICZjdXJfbGJhKSkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgY3JlYXRlIGJsYW5rIHBhcnRpdGlvbiAlZC4iLCBjbnQpOwotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0gICAgICAgIHdsaXN0X2FkZCgmd3JfbGlzdCwgdGVtcF93cik7Ci0gICAgfQotCi0gICAgaWYgKCh0ZW1wX3dyID0gbWtfbWJyX3NpZygpKSkKLSAgICAgICAgd2xpc3RfYWRkKCZ3cl9saXN0LCB0ZW1wX3dyKTsKLSAgICBlbHNlIHsKLSAgICAgICAgQUxPR0UoIkNhbm5vdCBzZXQgTUJSIHNpZ25hdHVyZSIpOwotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQotCi0gICAgcmV0dXJuIHdyX2xpc3Q7Ci0KLW5vc3BhY2U6Ci0gICAgQUxPR0UoIk5vdCBlbm91Z2ggc3BhY2UgdG8gYWRkIHBhcnR0aW9uICclcycuIiwgcGluZm8tPm5hbWUpOwotCi1mYWlsOgotICAgIHdsaXN0X2ZyZWUod3JfbGlzdCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotLyogUmV0dXJucyB0aGUgZGV2aWNlIHBhdGggb2YgdGhlIHBhcnRpdGlvbiByZWZlcnJlZCB0byBieSAnbmFtZScKLSAqIE11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KLSAqLwotY2hhciAqCi1maW5kX21icl9wYXJ0KHN0cnVjdCBkaXNrX2luZm8gKmRpbmZvLCBjb25zdCBjaGFyICpuYW1lKQotewotICAgIHN0cnVjdCBwYXJ0X2luZm8gKnBsaXN0ID0gZGluZm8tPnBhcnRfbHN0OwotICAgIGludCBudW0gPSAwOwotICAgIGNoYXIgKmRldl9uYW1lID0gTlVMTDsKLSAgICBpbnQgaGFzX2V4dGVuZGVkID0gKGRpbmZvLT5udW1fcGFydHMgPiBQQ19OVU1fQk9PVF9SRUNPUkRfUEFSVFMpOwotCi0gICAgZm9yKG51bSA9IDE7IG51bSA8PSBkaW5mby0+bnVtX3BhcnRzOyArK251bSkgewotICAgICAgICBpZiAoIXN0cmNtcChwbGlzdFtudW0tMV0ubmFtZSwgbmFtZSkpCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAobnVtID4gZGluZm8tPm51bV9wYXJ0cykKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBpZiAoaGFzX2V4dGVuZGVkICYmIChudW0gPj0gUENfTlVNX0JPT1RfUkVDT1JEX1BBUlRTKSkKLSAgICAgICAgbnVtKys7Ci0KLSAgICBpZiAoIShkZXZfbmFtZSA9IG1hbGxvYyhNQVhfTkFNRV9MRU4pKSkgewotICAgICAgICBBTE9HRSgiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeS4iKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgbnVtID0gc25wcmludGYoZGV2X25hbWUsIE1BWF9OQU1FX0xFTiwgIiVzJWQiLCBkaW5mby0+ZGV2aWNlLCBudW0pOwotICAgIGlmIChudW0gPj0gTUFYX05BTUVfTEVOKSB7Ci0gICAgICAgIEFMT0dFKCJEZXZpY2UgbmFtZSBpcyB0b28gbG9uZz8hIik7Ci0gICAgICAgIGZyZWUoZGV2X25hbWUpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZGV2X25hbWU7Ci19CmRpZmYgLS1naXQgYS9saWJkaXNrY29uZmlnL2Rpc2tjb25maWcuYyBiL2xpYmRpc2tjb25maWcvZGlza2NvbmZpZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjM0NzQ4Li4wMDAwMDAwCi0tLSBhL2xpYmRpc2tjb25maWcvZGlza2NvbmZpZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTM1ICswLDAgQEAKLS8qIGxpYnMvZGlza2NvbmZpZy9kaXNrY29uZmlnLmMKLSAqCi0gKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiZGlza2NvbmZpZyIKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgotI2luY2x1ZGUgPGxvZy9sb2cuaD4KLQotI2luY2x1ZGUgPGRpc2tjb25maWcvZGlza2NvbmZpZy5oPgotCi1zdGF0aWMgaW50Ci1wYXJzZV9sZW4oY29uc3QgY2hhciAqc3RyLCB1aW50NjRfdCAqcGxlbikKLXsKLSAgICBjaGFyIHRtcFs2NF07Ci0gICAgaW50IGxlbl9zdHI7Ci0gICAgdWludDMyX3QgbXVsdGlwbGUgPSAxOwotCi0gICAgc3RybmNweSh0bXAsIHN0ciwgc2l6ZW9mKHRtcCkpOwotICAgIHRtcFtzaXplb2YodG1wKS0xXSA9ICdcMCc7Ci0gICAgbGVuX3N0ciA9IHN0cmxlbih0bXApOwotICAgIGlmICghbGVuX3N0cikgewotICAgICAgICBBTE9HRSgiSW52YWxpZCBkaXNrIGxlbmd0aCBzcGVjaWZpZWQuIik7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIHN3aXRjaCh0bXBbbGVuX3N0ciAtIDFdKSB7Ci0gICAgICAgIGNhc2UgJ00nOiBjYXNlICdtJzoKLSAgICAgICAgICAgIC8qIG1lZ2FieXRlICovCi0gICAgICAgICAgICBtdWx0aXBsZSA8PD0gMTA7Ci0gICAgICAgIGNhc2UgJ0snOiBjYXNlICdrJzoKLSAgICAgICAgICAgIC8qIGtpbG9ieXRlcyAqLwotICAgICAgICAgICAgbXVsdGlwbGUgPDw9IDEwOwotICAgICAgICAgICAgdG1wW2xlbl9zdHIgLSAxXSA9ICdcMCc7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgICpwbGVuID0gc3RydG91bGwodG1wLCBOVUxMLCAwKTsKLSAgICBpZiAoISpwbGVuKSB7Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIGxlbmd0aCBzcGVjaWZpZWQ6ICVzIiwgc3RyKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgaWYgKCpwbGVuID09ICh1aW50NjRfdCktMSkgewotICAgICAgICBpZiAobXVsdGlwbGUgPiAxKSB7Ci0gICAgICAgICAgICBBTE9HRSgiU2l6ZSBtb2RpZmllciBpbGxlZ2FsIHdoZW4gbGVuIGlzIC0xIik7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIGNvbnZlcnQgbGVuIHRvIGtpbG9ieXRlcyAqLwotICAgICAgICBpZiAobXVsdGlwbGUgPiAxMDI0KQotICAgICAgICAgICAgbXVsdGlwbGUgPj49IDEwOwotICAgICAgICAqcGxlbiAqPSBtdWx0aXBsZTsKLQotICAgICAgICBpZiAoKnBsZW4gPiAweGZmZmZmZmZmVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiTGVuZ3RoIHNwZWNpZmllZCBpcyB0b28gbGFyZ2UhOiAlIlBSSXU2NCIgS0IiLCAqcGxlbik7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQKLWxvYWRfcGFydGl0aW9ucyhjbm9kZSAqcm9vdCwgc3RydWN0IGRpc2tfaW5mbyAqZGluZm8pCi17Ci0gICAgY25vZGUgKnBhcnRub2RlOwotCi0gICAgZGluZm8tPm51bV9wYXJ0cyA9IDA7Ci0gICAgZm9yIChwYXJ0bm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOyBwYXJ0bm9kZTsgcGFydG5vZGUgPSBwYXJ0bm9kZS0+bmV4dCkgewotICAgICAgICBzdHJ1Y3QgcGFydF9pbmZvICpwaW5mbyA9ICZkaW5mby0+cGFydF9sc3RbZGluZm8tPm51bV9wYXJ0c107Ci0gICAgICAgIGNvbnN0IGNoYXIgKnRtcDsKLQotICAgICAgICAvKiBibGVoLCBpIHdpbGwgbGVhayBtZW1vcnkgaGVyZSwgYnV0IGkgRE9OVCBDQVJFIHNpbmNlCi0gICAgICAgICAqIHRoZSBvbmx5IHJpZ2h0IHRoaW5nIHRvIGRvIHdoZW4gdGhpcyBmdW5jdGlvbiBmYWlscwotICAgICAgICAgKiBpcyB0byBxdWl0ICovCi0gICAgICAgIHBpbmZvLT5uYW1lID0gc3RyZHVwKHBhcnRub2RlLT5uYW1lKTsKLQotICAgICAgICBpZihjb25maWdfYm9vbChwYXJ0bm9kZSwgImFjdGl2ZSIsIDApKQotICAgICAgICAgICAgcGluZm8tPmZsYWdzIHw9IFBBUlRfQUNUSVZFX0ZMQUc7Ci0KLSAgICAgICAgaWYgKCEodG1wID0gY29uZmlnX3N0cihwYXJ0bm9kZSwgInR5cGUiLCBOVUxMKSkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJQYXJ0aXRpb24gdHlwZSByZXF1aXJlZDogJXMiLCBwaW5mby0+bmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHBvc3NpYmxlIHZhbHVlcyBhcmU6IGxpbnV4LCBmYXQzMiAqLwotICAgICAgICBpZiAoIXN0cmNtcCh0bXAsICJsaW51eCIpKSB7Ci0gICAgICAgICAgICBwaW5mby0+dHlwZSA9IFBDX1BBUlRfVFlQRV9MSU5VWDsKLSAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKHRtcCwgImZhdDMyIikpIHsKLSAgICAgICAgICAgIHBpbmZvLT50eXBlID0gUENfUEFSVF9UWVBFX0ZBVDMyOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIHBhcnRpdGlvbiB0eXBlIGZvdW5kOiAlcyIsIHRtcCk7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgodG1wID0gY29uZmlnX3N0cihwYXJ0bm9kZSwgImxlbiIsIE5VTEwpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICB1aW50NjRfdCBsZW47Ci0gICAgICAgICAgICBpZiAocGFyc2VfbGVuKHRtcCwgJmxlbikpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICBwaW5mby0+bGVuX2tiID0gKHVpbnQzMl90KSBsZW47Ci0gICAgICAgIH0gZWxzZSAKLSAgICAgICAgICAgIHBpbmZvLT5sZW5fa2IgPSAwOwotCi0gICAgICAgICsrZGluZm8tPm51bV9wYXJ0czsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RydWN0IGRpc2tfaW5mbyAqCi1sb2FkX2Rpc2tjb25maWcoY29uc3QgY2hhciAqZm4sIGNoYXIgKnBhdGhfb3ZlcnJpZGUpCi17Ci0gICAgc3RydWN0IGRpc2tfaW5mbyAqZGluZm87Ci0gICAgY25vZGUgKmRldnJvb3Q7Ci0gICAgY25vZGUgKnBhcnRub2RlOwotICAgIGNub2RlICpyb290ID0gY29uZmlnX25vZGUoIiIsICIiKTsKLSAgICBjb25zdCBjaGFyICp0bXA7Ci0KLSAgICBpZiAoIShkaW5mbyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGRpc2tfaW5mbykpKSkgewotICAgICAgICBBTE9HRSgiQ291bGQgbm90IG1hbGxvYyBkaXNrX2luZm8iKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIG1lbXNldChkaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBkaXNrX2luZm8pKTsKLQotICAgIGlmICghKGRpbmZvLT5wYXJ0X2xzdCA9IG1hbGxvYyhNQVhfTlVNX1BBUlRTICogc2l6ZW9mKHN0cnVjdCBwYXJ0X2luZm8pKSkpIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBtYWxsb2MgcGFydF9sc3QiKTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLSAgICBtZW1zZXQoZGluZm8tPnBhcnRfbHN0LCAwLAotICAgICAgICAgICAoTUFYX05VTV9QQVJUUyAqIHNpemVvZihzdHJ1Y3QgcGFydF9pbmZvKSkpOwotCi0gICAgY29uZmlnX2xvYWRfZmlsZShyb290LCBmbik7Ci0gICAgaWYgKHJvb3QtPmZpcnN0X2NoaWxkID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCByZWFkIGNvbmZpZyBmaWxlICVzIiwgZm4pOwotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQotCi0gICAgaWYgKCEoZGV2cm9vdCA9IGNvbmZpZ19maW5kKHJvb3QsICJkZXZpY2UiKSkpIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBmaW5kIGRldmljZSBzZWN0aW9uIGluIGNvbmZpZyBmaWxlICclcyciLCBmbik7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLQotICAgIGlmICghKHRtcCA9IGNvbmZpZ19zdHIoZGV2cm9vdCwgInBhdGgiLCBwYXRoX292ZXJyaWRlKSkpIHsKLSAgICAgICAgQUxPR0UoImRldmljZSBwYXRoIGlzIHJlcXVyaWVkIik7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0gICAgZGluZm8tPmRldmljZSA9IHN0cmR1cCh0bXApOwotCi0gICAgLyogZmluZCB0aGUgcGFydGl0aW9uIHNjaGVtZSAqLwotICAgIGlmICghKHRtcCA9IGNvbmZpZ19zdHIoZGV2cm9vdCwgInNjaGVtZSIsIE5VTEwpKSkgewotICAgICAgICBBTE9HRSgicGFydGl0aW9uIHNjaGVtZSBpcyByZXF1aXJlZCIpOwotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfSBlbHNlIGlmICghc3RyY21wKHRtcCwgIm1iciIpKSB7Ci0gICAgICAgIGRpbmZvLT5zY2hlbWUgPSBQQVJUX1NDSEVNRV9NQlI7Ci0gICAgfSBlbHNlIGlmICghc3RyY21wKHRtcCwgImdwdCIpKSB7Ci0gICAgICAgIEFMT0dFKCInZ3B0JyBwYXJ0aXRpb24gc2NoZW1lIG5vdCBzdXBwb3J0ZWQgeWV0LiIpOwotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIlVua25vd24gcGFydGl0aW9uIHNjaGVtZSBzcGVjaWZpZWQ6ICVzIiwgdG1wKTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLQotICAgIC8qIGdyYWIgdGhlIHNlY3RvciBzaXplIChpbiBieXRlcykgKi8KLSAgICB0bXAgPSBjb25maWdfc3RyKGRldnJvb3QsICJzZWN0b3Jfc2l6ZSIsICI1MTIiKTsKLSAgICBkaW5mby0+c2VjdF9zaXplID0gc3RydG9sKHRtcCwgTlVMTCwgMCk7Ci0gICAgaWYgKCFkaW5mby0+c2VjdF9zaXplKSB7Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIHNlY3RvciBzaXplOiAlcyIsIHRtcCk7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICAvKiBmaXJzdCBsYmEgd2hlcmUgdGhlIHBhcnRpdGlvbnMgd2lsbCBzdGFydCBvbiBkaXNrICovCi0gICAgaWYgKCEodG1wID0gY29uZmlnX3N0cihkZXZyb290LCAic3RhcnRfbGJhIiwgTlVMTCkpKSB7Ci0gICAgICAgIEFMT0dFKCJzdGFydF9sYmEgbXVzdCBiZSBwcm92aWRlZCIpOwotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQotCi0gICAgaWYgKCEoZGluZm8tPnNraXBfbGJhID0gc3RydG9sKHRtcCwgTlVMTCwgMCkpKSB7Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIHN0YXJ0aW5nIExCQSAob3IgemVybyk6ICVzIiwgdG1wKTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLQotICAgIC8qIE51bWJlciBvZiBMQkFzIG9uIGRpc2sgKi8KLSAgICBpZiAoISh0bXAgPSBjb25maWdfc3RyKGRldnJvb3QsICJudW1fbGJhIiwgTlVMTCkpKSB7Ci0gICAgICAgIEFMT0dFKCJudW1fbGJhIGlzIHJlcXVpcmVkIik7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0gICAgZGluZm8tPm51bV9sYmEgPSBzdHJ0b3VsKHRtcCwgTlVMTCwgMCk7Ci0KLSAgICBpZiAoIShwYXJ0bm9kZSA9IGNvbmZpZ19maW5kKGRldnJvb3QsICJwYXJ0aXRpb25zIikpKSB7Ci0gICAgICAgIEFMT0dFKCJEZXZpY2UgbXVzdCBzcGVjaWZ5IHBhcnRpdGlvbiBsaXN0Iik7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICBpZiAobG9hZF9wYXJ0aXRpb25zKHBhcnRub2RlLCBkaW5mbykpCi0gICAgICAgIGdvdG8gZmFpbDsKLQotICAgIHJldHVybiBkaW5mbzsKLQotZmFpbDoKLSAgICBpZiAoZGluZm8tPnBhcnRfbHN0KQotICAgICAgICBmcmVlKGRpbmZvLT5wYXJ0X2xzdCk7Ci0gICAgaWYgKGRpbmZvLT5kZXZpY2UpCi0gICAgICAgIGZyZWUoZGluZm8tPmRldmljZSk7Ci0gICAgZnJlZShkaW5mbyk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQKLXN5bmNfcHRhYmxlKGludCBmZCkKLXsKLSAgICBzdHJ1Y3Qgc3RhdCBzdGF0OwotICAgIGludCBydjsKLQotICAgIHN5bmMoKTsKLQotICAgIGlmIChmc3RhdChmZCwgJnN0YXQpKSB7Ci0gICAgICAgQUxPR0UoIkNhbm5vdCBzdGF0LCBlcnJubz0lZC4iLCBlcnJubyk7Ci0gICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGlmIChTX0lTQkxLKHN0YXQuc3RfbW9kZSkgJiYgKChydiA9IGlvY3RsKGZkLCBCTEtSUlBBUlQsIE5VTEwpKSA8IDApKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgcmUtcmVhZCBwYXJ0aXRpb24gdGFibGUuIFJFQk9PVCEuIChlcnJubz0lZCkiLCBlcnJubyk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiB2ZXJpZmllcyB0aGF0IHRoZSBkaXNrIGluZm8gcHJvdmlkZWQgaXMgdmFsaWQsIGFuZCBpZiBzbywKLSAqIHJldHVybnMgYW4gb3BlbiBmaWxlIGRlc2NyaXB0b3IuCi0gKgotICogVGhpcyBkb2VzIG5vdCBuZWNlc3NhcmlseSBtZWFuIHRoYXQgaXQgd2lsbCBsYXRlciBiZSBzdWNjZXNzZnVsbHkgd3JpdHRlbgotICogdGhvdWdoLiBJZiB3ZSB1c2UgdGhlIHBjLWJpb3MgcGFydGl0aW9uaW5nIHNjaGVtZSwgd2UgbXVzdCB1c2UgZXh0ZW5kZWQKLSAqIHBhcnRpdGlvbnMsIHdoaWNoIGVhdCB1cCBzb21lIGhkIHNwYWNlLiBJZiB0aGUgdXNlciBtYW51YWxseSBwcm92aXNpb25lZAotICogZXZlcnkgc2luZ2xlIHBhcnRpdGlvbiwgYnV0IGRpZCBub3QgYWNjb3VudCBmb3IgdGhlIGV4dHJhIG5lZWRlZCBzcGFjZSwKLSAqIHRoZW4gd2Ugd2lsbCBsYXRlciBmYWlsLgotICoKLSAqIFRPRE86IE1ha2UgdmFsaWRhdGlvbiBtb3JlIGNvbXBsZXRlLgotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZShzdHJ1Y3QgZGlza19pbmZvICpkaW5mbykKLXsKLSAgICBpbnQgZmQ7Ci0gICAgaW50IHNlY3Rfc3o7Ci0gICAgdWludDY0X3QgZGlza19zaXplOwotICAgIHVpbnQ2NF90IHRvdGFsX3NpemU7Ci0gICAgaW50IGNudDsKLSAgICBzdHJ1Y3Qgc3RhdCBzdGF0OwotCi0gICAgaWYgKCFkaW5mbykKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgaWYgKChmZCA9IG9wZW4oZGluZm8tPmRldmljZSwgT19SRFdSKSkgPCAwKSB7Ci0gICAgICAgIEFMT0dFKCJDYW5ub3Qgb3BlbiBkZXZpY2UgJyVzJyAoZXJybm89JWQpIiwgZGluZm8tPmRldmljZSwgZXJybm8pOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgaWYgKGZzdGF0KGZkLCAmc3RhdCkpIHsKLSAgICAgICAgQUxPR0UoIkNhbm5vdCBzdGF0IGZpbGUgJyVzJywgZXJybm89JWQuIiwgZGluZm8tPmRldmljZSwgZXJybm8pOwotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQotCi0KLSAgICAvKiBYWFg6IFNvbWUgb2YgdGhlIGNvZGUgYmVsb3cgaXMga2luZCBvZiByZWR1bmRhbnQgYW5kIHNob3VsZCBwcm9iYWJseQotICAgICAqIGJlIHJlZmFjdG9yZWQgYSBsaXR0bGUsIGJ1dCBpdCB3aWxsIGRvIGZvciBub3cuICovCi0KLSAgICAvKiBWZXJpZnkgdGhhdCB3ZSBjYW4gb3BlcmF0ZSBvbiB0aGUgZGV2aWNlIHRoYXQgd2FzIHJlcXVlc3RlZC4KLSAgICAgKiBXZSBwcmVzZW50bHkgb25seSBzdXBwb3J0IGJsb2NrIGRldmljZXMgYW5kIHJlZ3VsYXIgZmlsZSBpbWFnZXMuICovCi0gICAgaWYgKFNfSVNCTEsoc3RhdC5zdF9tb2RlKSkgewotICAgICAgICAvKiBnZXQgdGhlIHNlY3RvciBzaXplIGFuZCBtYWtlIHN1cmUgd2UgYWdyZWUgKi8KLSAgICAgICAgaWYgKGlvY3RsKGZkLCBCTEtTU1pHRVQsICZzZWN0X3N6KSA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgZ2V0IHNlY3RvciBzaXplIChlcnJubz0lZCkiLCBlcnJubyk7Ci0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXNlY3Rfc3ogfHwgc2VjdF9zeiAhPSBkaW5mby0+c2VjdF9zaXplKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRGV2aWNlIHNlY3RvciBzaXplIGlzIHplcm8gb3Igc2VjdG9yIHNpemVzIGRvIG5vdCBtYXRjaCEiKTsKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGFsbG93IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSAiZGlzayBzaXplIiBpZiB0aGV5IHByb3ZpZGVkIG51bV9sYmEgKi8KLSAgICAgICAgaWYgKCFkaW5mby0+bnVtX2xiYSkgewotICAgICAgICAgICAgaWYgKGlvY3RsKGZkLCBCTEtHRVRTSVpFNjQsICZkaXNrX3NpemUpIDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGJsb2NrIGRldmljZSBzaXplIChlcnJubz0lZCkiLCBlcnJubyk7Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogWFhYOiB3ZSBhc3N1bWUgdGhhdCB0aGUgZGlzayBoYXMgPCAyXjMyIHNlY3RvcnMgOi0pICovCi0gICAgICAgICAgICBkaW5mby0+bnVtX2xiYSA9ICh1aW50MzJfdCkoZGlza19zaXplIC8gKHVpbnQ2NF90KWRpbmZvLT5zZWN0X3NpemUpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGRpc2tfc2l6ZSA9ICh1aW50NjRfdClkaW5mby0+bnVtX2xiYSAqICh1aW50NjRfdClkaW5mby0+c2VjdF9zaXplOwotICAgIH0gZWxzZSBpZiAoU19JU1JFRyhzdGF0LnN0X21vZGUpKSB7Ci0gICAgICAgIEFMT0dJKCJSZXF1ZXN0aW5nIG9wZXJhdGlvbiBvbiBhIHJlZ3VsYXIgZmlsZSwgbm90IGJsb2NrIGRldmljZS4iKTsKLSAgICAgICAgaWYgKCFkaW5mby0+c2VjdF9zaXplKSB7Ci0gICAgICAgICAgICBBTE9HRSgiU2VjdG9yIHNpemUgZm9yIHJlZ3VsYXIgZmlsZSBpbWFnZXMgY2Fubm90IGJlIHplcm8iKTsKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGluZm8tPm51bV9sYmEpCi0gICAgICAgICAgICBkaXNrX3NpemUgPSAodWludDY0X3QpZGluZm8tPm51bV9sYmEgKiAodWludDY0X3QpZGluZm8tPnNlY3Rfc2l6ZTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBkaW5mby0+bnVtX2xiYSA9ICh1aW50MzJfdCkoc3RhdC5zdF9zaXplIC8gZGluZm8tPnNlY3Rfc2l6ZSk7Ci0gICAgICAgICAgICBkaXNrX3NpemUgPSAodWludDY0X3Qpc3RhdC5zdF9zaXplOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIkRldmljZSBkb2VzIG5vdCByZWZlciB0byBhIHJlZ3VsYXIgZmlsZSBvciBhIGJsb2NrIGRldmljZSEiKTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLQotI2lmIDEKLSAgICBBTE9HVigiRGV2aWNlL2ZpbGUgJXM6IHNpemU9JSIgUFJJdTY0ICIgYnl0ZXMsIG51bV9sYmE9JXUsIHNlY3Rfc2l6ZT0lZCIsCi0gICAgICAgICBkaW5mby0+ZGV2aWNlLCBkaXNrX3NpemUsIGRpbmZvLT5udW1fbGJhLCBkaW5mby0+c2VjdF9zaXplKTsKLSNlbmRpZgotCi0gICAgLyogc2luY2UgdGhpcyBpcyBvdXIgb2Zmc2V0IGludG8gdGhlIGRpc2ssIHdlIHN0YXJ0IG9mZiB3aXRoIHRoYXQgYXMKLSAgICAgKiBvdXIgc2l6ZSBvZiBuZWVkZWQgcGFydGl0aW9ucyAqLwotICAgIHRvdGFsX3NpemUgPSBkaW5mby0+c2tpcF9sYmEgKiBkaW5mby0+c2VjdF9zaXplOwotCi0gICAgLyogYWRkIHVwIGFsbCB0aGUgcGFydGl0aW9uIHNpemVzIGFuZCBtYWtlIHN1cmUgaXQgZml0cyAqLwotICAgIGZvciAoY250ID0gMDsgY250IDwgZGluZm8tPm51bV9wYXJ0czsgKytjbnQpIHsKLSAgICAgICAgc3RydWN0IHBhcnRfaW5mbyAqcGFydCA9ICZkaW5mby0+cGFydF9sc3RbY250XTsKLSAgICAgICAgaWYgKHBhcnQtPmxlbl9rYiAhPSAodWludDMyX3QpLTEpIHsKLSAgICAgICAgICAgIHRvdGFsX3NpemUgKz0gcGFydC0+bGVuX2tiICogMTAyNDsKLSAgICAgICAgfSBlbHNlIGlmIChwYXJ0LT5sZW5fa2IgPT0gMCkgewotICAgICAgICAgICAgQUxPR0UoIlplcm8tc2l6ZSBwYXJ0aXRpb24gJyVzJyBpcyBpbnZhbGlkLiIsIHBhcnQtPm5hbWUpOwotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogdGhlIHBhcnRpdGlvbiByZXF1ZXN0cyB0aGUgcmVzdCBvZiB0aGUgZGlzay4gKi8KLSAgICAgICAgICAgIGlmIChjbnQgKyAxICE9IGRpbmZvLT5udW1fcGFydHMpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiT25seSB0aGUgbGFzdCBwYXJ0aXRpb24gaW4gdGhlIGxpc3QgY2FuIHJlcXVlc3QgdG8gZmlsbCAiCi0gICAgICAgICAgICAgICAgICAgICAidGhlIHJlc3Qgb2YgZGlzay4iKTsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKHBhcnQtPnR5cGUgIT0gUENfUEFSVF9UWVBFX0xJTlVYKSAmJgotICAgICAgICAgICAgKHBhcnQtPnR5cGUgIT0gUENfUEFSVF9UWVBFX0ZBVDMyKSkgewotICAgICAgICAgICAgQUxPR0UoIlVua25vd24gcGFydGl0aW9uIHR5cGUgKDB4JXgpIGVuY291bnRlcmVkIGZvciBwYXJ0aXRpb24gIgotICAgICAgICAgICAgICAgICAiJyVzJ1xuIiwgcGFydC0+dHlwZSwgcGFydC0+bmFtZSk7Ci0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBvbmx5IG1hdHRlcnMgZm9yIGRpc2tzLCBub3QgZmlsZXMgKi8KLSAgICBpZiAoU19JU0JMSyhzdGF0LnN0X21vZGUpICYmIHRvdGFsX3NpemUgPiBkaXNrX3NpemUpIHsKLSAgICAgICAgQUxPR0UoIlRvdGFsIHJlcXVlc3RlZCBzaXplIG9mIHBhcnRpdGlvbnMgKCUiUFJJdTY0IikgaXMgZ3JlYXRlciB0aGFuIGRpc2sgIgotICAgICAgICAgICAgICJzaXplICglIlBSSXU2NCIpLiIsIHRvdGFsX3NpemUsIGRpc2tfc2l6ZSk7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmQ7Ci0KLWZhaWw6Ci0gICAgY2xvc2UoZmQpOwotICAgIHJldHVybiAtMTsKLX0KLQotc3RhdGljIGludAotdmFsaWRhdGVfYW5kX2NvbmZpZyhzdHJ1Y3QgZGlza19pbmZvICpkaW5mbywgaW50ICpmZCwgc3RydWN0IHdyaXRlX2xpc3QgKipsc3QpCi17Ci0gICAgKmxzdCA9IE5VTEw7Ci0gICAgKmZkID0gLTE7Ci0KLSAgICBpZiAoKCpmZCA9IHZhbGlkYXRlKGRpbmZvKSkgPCAwKQotICAgICAgICByZXR1cm4gMTsKLQotICAgIHN3aXRjaCAoZGluZm8tPnNjaGVtZSkgewotICAgICAgICBjYXNlIFBBUlRfU0NIRU1FX01CUjoKLSAgICAgICAgICAgICpsc3QgPSBjb25maWdfbWJyKGRpbmZvKTsKLSAgICAgICAgICAgIHJldHVybiAqbHN0ID09IE5VTEw7Ci0gICAgICAgIGNhc2UgUEFSVF9TQ0hFTUVfR1BUOgotICAgICAgICAgICAgLyogbm90IHN1cHBvcnRlZCB5ZXQgKi8KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCJVbmtub3duIHBhcnRpdGlvbiBzY2hlbWUuIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjbG9zZSgqZmQpOwotICAgICpsc3QgPSBOVUxMOwotICAgIHJldHVybiAxOwotfQotCi0vKiB2YWxpZGF0ZSBhbmQgcHJvY2VzcyB0aGUgZGlzayBsYXlvdXQgY29uZmlndXJhdGlvbi4KLSAqIFRoaXMgd2lsbCBjYXVzZSBhbiB1cGRhdGUgdG8gdGhlIHBhcnRpdGlvbnMnIHN0YXJ0IGxiYS4KLSAqCi0gKiBCYXNpY2FsbHksIHRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBhcHBseV9kaXNrX2NvbmZpZyBpbiB0ZXN0IG1vZGUsCi0gKiBleGNlcHQgdGhhdCB3bGlzdF9jb21taXQgaXMgbm90IGNhbGxlZCB0byBwcmludCBvdXQgdGhlIGRhdGEgdG8gYmUKLSAqIHdyaXR0ZW4uCi0gKi8KLWludAotcHJvY2Vzc19kaXNrX2NvbmZpZyhzdHJ1Y3QgZGlza19pbmZvICpkaW5mbykKLXsKLSAgICBzdHJ1Y3Qgd3JpdGVfbGlzdCAqbHN0OwotICAgIGludCBmZDsKLQotICAgIGlmICh2YWxpZGF0ZV9hbmRfY29uZmlnKGRpbmZvLCAmZmQsICZsc3QpICE9IDApCi0gICAgICAgIHJldHVybiAxOwotCi0gICAgY2xvc2UoZmQpOwotICAgIHdsaXN0X2ZyZWUobHN0KTsKLSAgICByZXR1cm4gMDsKLX0KLQotCi1pbnQKLWFwcGx5X2Rpc2tfY29uZmlnKHN0cnVjdCBkaXNrX2luZm8gKmRpbmZvLCBpbnQgdGVzdCkKLXsKLSAgICBpbnQgZmQ7Ci0gICAgc3RydWN0IHdyaXRlX2xpc3QgKndyX2xzdCA9IE5VTEw7Ci0gICAgaW50IHJ2OwotCi0gICAgaWYgKHZhbGlkYXRlX2FuZF9jb25maWcoZGluZm8sICZmZCwgJndyX2xzdCkgIT0gMCkgewotICAgICAgICBBTE9HRSgiQ29uZmlndXJhdGlvbiBpcyBpbnZhbGlkLiIpOwotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQotCi0gICAgaWYgKChydiA9IHdsaXN0X2NvbW1pdChmZCwgd3JfbHN0LCB0ZXN0KSkgPj0gMCkKLSAgICAgICAgcnYgPSB0ZXN0ID8gMCA6IHN5bmNfcHRhYmxlKGZkKTsKLQotICAgIGNsb3NlKGZkKTsKLSAgICB3bGlzdF9mcmVlKHdyX2xzdCk7Ci0gICAgcmV0dXJuIHJ2OwotCi1mYWlsOgotICAgIGNsb3NlKGZkKTsKLSAgICBpZiAod3JfbHN0KQotICAgICAgICB3bGlzdF9mcmVlKHdyX2xzdCk7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLWludAotZHVtcF9kaXNrX2NvbmZpZyhzdHJ1Y3QgZGlza19pbmZvICpkaW5mbykKLXsKLSAgICBpbnQgY250OwotICAgIHN0cnVjdCBwYXJ0X2luZm8gKnBhcnQ7Ci0KLSAgICBwcmludGYoIkRldmljZTogJXNcbiIsIGRpbmZvLT5kZXZpY2UpOwotICAgIHByaW50ZigiU2NoZW1lOiAiKTsKLSAgICBzd2l0Y2ggKGRpbmZvLT5zY2hlbWUpIHsKLSAgICAgICAgY2FzZSBQQVJUX1NDSEVNRV9NQlI6Ci0gICAgICAgICAgICBwcmludGYoIk1CUiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUEFSVF9TQ0hFTUVfR1BUOgotICAgICAgICAgICAgcHJpbnRmKCJHUFQgKHVuc3VwcG9ydGVkKSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBwcmludGYoIlVua25vd24iKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBwcmludGYgKCJcbiIpOwotCi0gICAgcHJpbnRmKCJTZWN0b3Igc2l6ZTogJWRcbiIsIGRpbmZvLT5zZWN0X3NpemUpOwotICAgIHByaW50ZigiU2tpcCBsZWFkaW5nIExCQXM6ICV1XG4iLCBkaW5mby0+c2tpcF9sYmEpOwotICAgIHByaW50ZigiTnVtYmVyIG9mIExCQXM6ICV1XG4iLCBkaW5mby0+bnVtX2xiYSk7Ci0gICAgcHJpbnRmKCJQYXJ0aXRpb25zOlxuIik7Ci0KLSAgICBmb3IgKGNudCA9IDA7IGNudCA8IGRpbmZvLT5udW1fcGFydHM7ICsrY250KSB7Ci0gICAgICAgIHBhcnQgPSAmZGluZm8tPnBhcnRfbHN0W2NudF07Ci0gICAgICAgIHByaW50ZigiXHRuYW1lID0gJXNcbiIsIHBhcnQtPm5hbWUpOwotICAgICAgICBwcmludGYoIlx0XHRmbGFncyA9ICVzXG4iLAotICAgICAgICAgICAgICAgcGFydC0+ZmxhZ3MgJiBQQVJUX0FDVElWRV9GTEFHID8gIkFjdGl2ZSIgOiAiTm9uZSIpOwotICAgICAgICBwcmludGYoIlx0XHR0eXBlID0gJXNcbiIsCi0gICAgICAgICAgICAgICBwYXJ0LT50eXBlID09IFBDX1BBUlRfVFlQRV9MSU5VWCA/ICJMaW51eCIgOiAiVW5rbm93biIpOwotICAgICAgICBpZiAocGFydC0+bGVuX2tiID09ICh1aW50MzJfdCktMSkKLSAgICAgICAgICAgIHByaW50ZigiXHRcdGxlbiA9IHJlc3Qgb2YgZGlza1xuIik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHByaW50ZigiXHRcdGxlbiA9ICV1S0JcbiIsIHBhcnQtPmxlbl9rYik7Ci0gICAgfQotICAgIHByaW50ZigiVG90YWwgbnVtYmVyIG9mIHBhcnRpdGlvbnM6ICVkXG4iLCBjbnQpOwotICAgIHByaW50ZigiXG4iKTsKLQotICAgIHJldHVybiAwOwotfQotCi1zdHJ1Y3QgcGFydF9pbmZvICoKLWZpbmRfcGFydChzdHJ1Y3QgZGlza19pbmZvICpkaW5mbywgY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBzdHJ1Y3QgcGFydF9pbmZvICpwaW5mbzsKLSAgICBpbnQgY250OwotCi0gICAgZm9yIChjbnQgPSAwOyBjbnQgPCBkaW5mby0+bnVtX3BhcnRzOyArK2NudCkgewotICAgICAgICBwaW5mbyA9ICZkaW5mby0+cGFydF9sc3RbY250XTsKLSAgICAgICAgaWYgKCFzdHJjbXAocGluZm8tPm5hbWUsIG5hbWUpKQotICAgICAgICAgICAgcmV0dXJuIHBpbmZvOwotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi0vKiBOT1RFOiBJZiB0aGUgcmV0dXJuZWQgcHRyIGlzIG5vbi1OVUxMLCBpdCBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuICovCi1jaGFyICoKLWZpbmRfcGFydF9kZXZpY2Uoc3RydWN0IGRpc2tfaW5mbyAqZGluZm8sIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgc3dpdGNoIChkaW5mby0+c2NoZW1lKSB7Ci0gICAgICAgIGNhc2UgUEFSVF9TQ0hFTUVfTUJSOgotICAgICAgICAgICAgcmV0dXJuIGZpbmRfbWJyX3BhcnQoZGluZm8sIG5hbWUpOwotICAgICAgICBjYXNlIFBBUlRfU0NIRU1FX0dQVDoKLSAgICAgICAgICAgIEFMT0dFKCJHUFQgaXMgcHJlc2VudGx5IG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoIlVua25vd24gcGFydGl0aW9uIHRhYmxlIHNjaGVtZSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvbGliZGlza2NvbmZpZy9kaXNrdXRpbHMuYyBiL2xpYmRpc2tjb25maWcvZGlza3V0aWxzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMWI0YzEuLjAwMDAwMDAKLS0tIGEvbGliZGlza2NvbmZpZy9kaXNrdXRpbHMuYworKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKiBsaWJzL2Rpc2tjb25maWcvZGlza3V0aWxzLmMKLSAqCi0gKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiZGlza3V0aWxzIgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8bG9nL2xvZy5oPgotCi0jaW5jbHVkZSA8ZGlza2NvbmZpZy9kaXNrY29uZmlnLmg+Ci0KLWludAotd3JpdGVfcmF3X2ltYWdlKGNvbnN0IGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgdGVzdCkKLXsKLSAgICBpbnQgZHN0X2ZkID0gLTE7Ci0gICAgaW50IHNyY19mZCA9IC0xOwotICAgIHVpbnQ4X3QgYnVmZmVyWzIwNDhdOwotICAgIHNzaXplX3QgbnJfYnl0ZXM7Ci0gICAgc3NpemVfdCB0bXA7Ci0gICAgaW50IGRvbmUgPSAwOwotICAgIHVpbnQ2NF90IHRvdGFsID0gMDsKLQotICAgIEFMT0dJKCJXcml0aW5nIFJBVyBpbWFnZSAnJXMnIHRvICclcycgKG9mZnNldD0lbGx1KSIsIHNyYywgZHN0LCAodW5zaWduZWQgbG9uZyBsb25nKW9mZnNldCk7Ci0gICAgaWYgKChzcmNfZmQgPSBvcGVuKHNyYywgT19SRE9OTFkpKSA8IDApIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBvcGVuICVzIGZvciByZWFkaW5nIChlcnJubz0lZCkuIiwgc3JjLCBlcnJubyk7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICBpZiAoIXRlc3QpIHsKLSAgICAgICAgaWYgKChkc3RfZmQgPSBvcGVuKGRzdCwgT19SRFdSKSkgPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IG9wZW4gJyVzJyBmb3IgcmVhZC93cml0ZSAoZXJybm89JWQpLiIsIGRzdCwgZXJybm8pOwotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxzZWVrNjQoZHN0X2ZkLCBvZmZzZXQsIFNFRUtfU0VUKSAhPSBvZmZzZXQpIHsKLSAgICAgICAgICAgIEFMT0dFKCJDb3VsZCBub3Qgc2VlayB0byBvZmZzZXQgJWxsZCBpbiAlcy4iLCAobG9uZyBsb25nKW9mZnNldCwgZHN0KTsKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHdoaWxlICghZG9uZSkgewotICAgICAgICBpZiAoKG5yX2J5dGVzID0gcmVhZChzcmNfZmQsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpKSA8IDApIHsKLSAgICAgICAgICAgIC8qIFhYWDogU2hvdWxkIHdlIG5vdCBldmVuIGJvdGhlciB3aXRoIEVJTlRSPyAqLwotICAgICAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgQUxPR0UoIkVycm9yICglZCkgd2hpbGUgcmVhZGluZyBmcm9tICclcyciLCBlcnJubywgc3JjKTsKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbnJfYnl0ZXMpIHsKLSAgICAgICAgICAgIC8qIHdlJ3JlIGRvbmUuICovCi0gICAgICAgICAgICBkb25lID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgdG90YWwgKz0gbnJfYnl0ZXM7Ci0KLSAgICAgICAgLyogc2tpcCB0aGUgd3JpdGUgbG9vcCBpZiB3ZSdyZSB0ZXN0aW5nICovCi0gICAgICAgIGlmICh0ZXN0KQotICAgICAgICAgICAgbnJfYnl0ZXMgPSAwOwotCi0gICAgICAgIHdoaWxlIChucl9ieXRlcyA+IDApIHsKLSAgICAgICAgICAgIGlmICgodG1wID0gd3JpdGUoZHN0X2ZkLCBidWZmZXIsIG5yX2J5dGVzKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgLyogWFhYOiBTaG91bGQgd2Ugbm90IGV2ZW4gYm90aGVyIHdpdGggRUlOVFI/ICovCi0gICAgICAgICAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBBTE9HRSgiRXJyb3IgKCVkKSB3aGlsZSB3cml0aW5nIHRvICclcyciLCBlcnJubywgZHN0KTsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXRtcCkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIG5yX2J5dGVzIC09IHRtcDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghZG9uZSkgewotICAgICAgICBBTE9HRSgiRXhpdGVkIHJlYWQvd3JpdGUgbG9vcCB3aXRob3V0IHNldHRpbmcgZmxhZyEgV1RGPyEiKTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLQotICAgIGlmIChkc3RfZmQgPj0gMCkKLSAgICAgICAgZnN5bmMoZHN0X2ZkKTsKLQotICAgIEFMT0dJKCJXcm90ZSAlIiBQUkl1NjQgIiBieXRlcyB0byAlcyBAICVsbGQiLCB0b3RhbCwgZHN0LCAobG9uZyBsb25nKW9mZnNldCk7Ci0KLSAgICBjbG9zZShzcmNfZmQpOwotICAgIGlmIChkc3RfZmQgPj0gMCkKLSAgICAgICAgY2xvc2UoZHN0X2ZkKTsKLSAgICByZXR1cm4gMDsKLQotZmFpbDoKLSAgICBpZiAoZHN0X2ZkID49IDApCi0gICAgICAgIGNsb3NlKGRzdF9mZCk7Ci0gICAgaWYgKHNyY19mZCA+PSAwKQotICAgICAgICBjbG9zZShzcmNfZmQpOwotICAgIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvbGliZGlza2NvbmZpZy9kdW1wX2Rpc2tjb25maWcuYyBiL2xpYmRpc2tjb25maWcvZHVtcF9kaXNrY29uZmlnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNGY2MjAuLjAwMDAwMDAKLS0tIGEvbGliZGlza2NvbmZpZy9kdW1wX2Rpc2tjb25maWcuYworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qIGxpYnMvZGlza2NvbmZpZy9kdW1wX2Rpc2tjb25maWcuYwotICoKLSAqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJkdW1wX2Rpc2tjb25maWciCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSA8bG9nL2xvZy5oPgotCi0jaW5jbHVkZSAiZGlza2NvbmZpZy5oIgotCi1pbnQKLW1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgICBzdHJ1Y3QgZGlza19pbmZvICpkaW5mbzsKLQotICAgIGlmIChhcmdjIDwgMikgewotICAgICAgICBBTE9HRSgidXNhZ2U6ICVzIDxjb25mIGZpbGU+IiwgYXJndlswXSk7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIGlmICghKGRpbmZvID0gbG9hZF9kaXNrY29uZmlnKGFyZ3ZbMV0sIE5VTEwpKSkKLSAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICBkdW1wX2Rpc2tfY29uZmlnKGRpbmZvKTsKLQotICAgIHJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9saWJkaXNrY29uZmlnL2luY2x1ZGUvZGlza2NvbmZpZy9kaXNrY29uZmlnLmggYi9saWJkaXNrY29uZmlnL2luY2x1ZGUvZGlza2NvbmZpZy9kaXNrY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NWI5OWUuLjAwMDAwMDAKLS0tIGEvbGliZGlza2NvbmZpZy9pbmNsdWRlL2Rpc2tjb25maWcvZGlza2NvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qIHN5c3RlbS9jb3JlL2luY2x1ZGUvZGlza2NvbmZpZy9kaXNrY29uZmlnLmgKLSAqCi0gKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX19MSUJTX0RJU0tDT05GSUdfSAotI2RlZmluZSBfX0xJQlNfRElTS0NPTkZJR19ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jZGVmaW5lIE1BWF9OQU1FX0xFTiAgICAgICAgICAgICAgICAgNTEyCi0jZGVmaW5lIE1BWF9OVU1fUEFSVFMgICAgICAgICAgICAgICAgMTYKLQotLyoga25vd24gcGFydGl0aW9uIHNjaGVtZXMgKi8KLSNkZWZpbmUgUEFSVF9TQ0hFTUVfTUJSICAgICAgICAgICAgICAweDEKLSNkZWZpbmUgUEFSVF9TQ0hFTUVfR1BUICAgICAgICAgICAgICAweDIKLQotLyogUEMgQmlvcyBwYXJ0aXRpb24gc3RhdHVzICovCi0jZGVmaW5lIFBDX1BBUlRfQUNUSVZFICAgICAgICAgICAgICAgMHg4MAotI2RlZmluZSBQQ19QQVJUX05PUk1BTCAgICAgICAgICAgICAgIDB4MAotCi0vKiBLbm93biAocmF0aGVyLCB1c2VkIGJ5IHVzKSBwYXJ0aXRpb24gdHlwZXMgKi8KLSNkZWZpbmUgUENfUEFSVF9UWVBFX0xJTlVYICAgICAgICAgICAweDgzCi0jZGVmaW5lIFBDX1BBUlRfVFlQRV9FWFRFTkRFRCAgICAgICAgMHgwNQotI2RlZmluZSBQQ19QQVJUX1RZUEVfRkFUMzIgICAgICAgICAgIDB4MGMKLQotI2RlZmluZSBQQ19OVU1fQk9PVF9SRUNPUkRfUEFSVFMgICAgIDQKLQotI2RlZmluZSBQQ19FQlJfTE9HSUNBTF9QQVJUICAgICAgICAgIDAKLSNkZWZpbmUgUENfRUJSX05FWFRfUFRSX1BBUlQgICAgICAgICAxCi0KLSNkZWZpbmUgUENfQklPU19CT09UX1NJRyAgICAgICAgICAgICAweEFBNTUKLQotI2RlZmluZSBQQ19NQlJfRElTS19PRkZTRVQgICAgICAgICAgIDAKLSNkZWZpbmUgUENfTUJSX1NJWkUgICAgICAgICAgICAgICAgICA1MTIKLQotI2RlZmluZSBQQVJUX0FDVElWRV9GTEFHICAgICAgICAgICAgIDB4MQotCi1zdHJ1Y3QgY2hzIHsKLSAgICB1aW50OF90IGhlYWQ7Ci0gICAgdWludDhfdCBzZWN0b3I7Ci0gICAgdWludDhfdCBjeWxpbmRlcjsKLX0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOwotCi0vKiAxNiBieXRlIHBjIHBhcnRpdGlvbiBkZXNjcmlwdG9yIHRoYXQgc2l0cyBpbiBNQlIgYW5kIEVQQlIuCi0gKiBOb3RlOiBtdWx0aS1ieXRlIGVudGl0aWVzIGhhdmUgbGl0dGxlLWVuZGlhbiBsYXlvdXQgb24gZGlzayAqLwotc3RydWN0IHBjX3BhcnRpdGlvbiB7Ci0gICAgdWludDhfdCBzdGF0dXM7ICAgICAvKiBieXRlICAwICAgICAqLwotICAgIHN0cnVjdCBjaHMgc3RhcnQ7ICAgLyogYnl0ZXMgMS0zICAgKi8KLSAgICB1aW50OF90IHR5cGU7ICAgICAgIC8qIGJ5dGUgIDQgICAgICovCi0gICAgc3RydWN0IGNocyBlbmQ7ICAgICAvKiBieXRlcyA1LTcgICAqLwotICAgIHVpbnQzMl90IHN0YXJ0X2xiYTsgLyogYnl0ZXMgOC0xMSAgKi8KLSAgICB1aW50MzJfdCBsZW5fbGJhOyAgIC8qIGJ5dGVzIDEyLTE1ICovCi19IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKLQotc3RydWN0IHBjX2Jvb3RfcmVjb3JkIHsKLSAgICB1aW50OF90IGNvZGVbNDQwXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ5dGVzIDAtNDM5ICAgKi8KLSAgICB1aW50MzJfdCBkaXNrX3NpZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ5dGVzIDQ0MC00NDMgKi8KLSAgICB1aW50MTZfdCBwYWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ5dGVzIDQ0NC00NDUgKi8KLSAgICBzdHJ1Y3QgcGNfcGFydGl0aW9uIHB0YWJsZVtQQ19OVU1fQk9PVF9SRUNPUkRfUEFSVFNdOyAgIC8qIGJ5dGVzIDQ0Ni01MDkgKi8KLSAgICB1aW50MTZfdCBtYnJfc2lnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ5dGVzIDUxMC01MTEgKi8KLX0gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOwotCi1zdHJ1Y3QgcGFydF9pbmZvIHsKLSAgICBjaGFyICpuYW1lOwotICAgIHVpbnQ4X3QgZmxhZ3M7Ci0gICAgdWludDhfdCB0eXBlOwotICAgIHVpbnQzMl90IGxlbl9rYjsgICAgICAgLyogaW4gMUstYnl0ZXMgKi8KLSAgICB1aW50MzJfdCBzdGFydF9sYmE7ICAgIC8qIHRoZSBMQkEgd2hlcmUgdGhpcyBwYXJ0aXRpb24gYmVnaW5zICovCi19OwotCi1zdHJ1Y3QgZGlza19pbmZvIHsKLSAgICBjaGFyICpkZXZpY2U7Ci0gICAgdWludDhfdCBzY2hlbWU7Ci0gICAgaW50IHNlY3Rfc2l6ZTsgICAgICAgLyogZXhwZWN0ZWQgc2VjdG9yIHNpemUgaW4gYnl0ZXMuIE1VU1QgQkUgUE9XRVIgT0YgMiAqLwotICAgIHVpbnQzMl90IHNraXBfbGJhOyAgIC8qIGluIHNlY3RvcnMgKDEgdW5pdCBvZiBMQkEpICovCi0gICAgdWludDMyX3QgbnVtX2xiYTsgICAgLyogdGhlIHNpemUgb2YgdGhlIGRpc2sgaW4gTEJBIHVuaXRzICovCi0gICAgc3RydWN0IHBhcnRfaW5mbyAqcGFydF9sc3Q7Ci0gICAgaW50IG51bV9wYXJ0czsKLX07Ci0KLXN0cnVjdCB3cml0ZV9saXN0IHsKLSAgICBzdHJ1Y3Qgd3JpdGVfbGlzdCAqbmV4dDsKLSAgICBsb2ZmX3Qgb2Zmc2V0OwotICAgIHVpbnQzMl90IGxlbjsKLSAgICB1aW50OF90IGRhdGFbMF07Ci19OwotCi0KLXN0cnVjdCB3cml0ZV9saXN0ICphbGxvY193bCh1aW50MzJfdCBkYXRhX2xlbik7Ci12b2lkIGZyZWVfd2woc3RydWN0IHdyaXRlX2xpc3QgKml0ZW0pOwotc3RydWN0IHdyaXRlX2xpc3QgKndsaXN0X2FkZChzdHJ1Y3Qgd3JpdGVfbGlzdCAqKmxzdCwgc3RydWN0IHdyaXRlX2xpc3QgKml0ZW0pOwotdm9pZCB3bGlzdF9mcmVlKHN0cnVjdCB3cml0ZV9saXN0ICpsc3QpOwotaW50IHdsaXN0X2NvbW1pdChpbnQgZmQsIHN0cnVjdCB3cml0ZV9saXN0ICpsc3QsIGludCB0ZXN0KTsKLQotc3RydWN0IGRpc2tfaW5mbyAqbG9hZF9kaXNrY29uZmlnKGNvbnN0IGNoYXIgKmZuLCBjaGFyICpwYXRoX292ZXJyaWRlKTsKLWludCBkdW1wX2Rpc2tfY29uZmlnKHN0cnVjdCBkaXNrX2luZm8gKmRpbmZvKTsKLWludCBhcHBseV9kaXNrX2NvbmZpZyhzdHJ1Y3QgZGlza19pbmZvICpkaW5mbywgaW50IHRlc3QpOwotY2hhciAqZmluZF9wYXJ0X2RldmljZShzdHJ1Y3QgZGlza19pbmZvICpkaW5mbywgY29uc3QgY2hhciAqbmFtZSk7Ci1pbnQgcHJvY2Vzc19kaXNrX2NvbmZpZyhzdHJ1Y3QgZGlza19pbmZvICpkaW5mbyk7Ci1zdHJ1Y3QgcGFydF9pbmZvICpmaW5kX3BhcnQoc3RydWN0IGRpc2tfaW5mbyAqZGluZm8sIGNvbnN0IGNoYXIgKm5hbWUpOwotCi1pbnQgd3JpdGVfcmF3X2ltYWdlKGNvbnN0IGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgdGVzdCk7Ci0KLS8qIEZvciBNQlIgcGFydGl0aW9uIHNjaGVtZXMgKi8KLXN0cnVjdCB3cml0ZV9saXN0ICpjb25maWdfbWJyKHN0cnVjdCBkaXNrX2luZm8gKmRpbmZvKTsKLWNoYXIgKmZpbmRfbWJyX3BhcnQoc3RydWN0IGRpc2tfaW5mbyAqZGluZm8sIGNvbnN0IGNoYXIgKm5hbWUpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogX19MSUJTX0RJU0tDT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvbGliZGlza2NvbmZpZy93cml0ZV9sc3QuYyBiL2xpYmRpc2tjb25maWcvd3JpdGVfbHN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZDVjMGEuLjAwMDAwMDAKLS0tIGEvbGliZGlza2NvbmZpZy93cml0ZV9sc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qIGxpYnMvZGlza2NvbmZpZy93cml0ZV9sc3QuYwotICoKLSAqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJ3cml0ZV9sc3QiCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8ZGlza2NvbmZpZy9kaXNrY29uZmlnLmg+Ci0jaW5jbHVkZSA8bG9nL2xvZy5oPgotCi1zdHJ1Y3Qgd3JpdGVfbGlzdCAqCi1hbGxvY193bCh1aW50MzJfdCBkYXRhX2xlbikKLXsKLSAgICBzdHJ1Y3Qgd3JpdGVfbGlzdCAqaXRlbTsKLQotICAgIGlmICghKGl0ZW0gPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCB3cml0ZV9saXN0KSArIGRhdGFfbGVuKSkpIHsKLSAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkuIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGl0ZW0tPmxlbiA9IGRhdGFfbGVuOwotICAgIHJldHVybiBpdGVtOwotfQotCi12b2lkCi1mcmVlX3dsKHN0cnVjdCB3cml0ZV9saXN0ICppdGVtKQotewotICAgIGlmIChpdGVtKQotICAgICAgICBmcmVlKGl0ZW0pOwotfQotCi1zdHJ1Y3Qgd3JpdGVfbGlzdCAqCi13bGlzdF9hZGQoc3RydWN0IHdyaXRlX2xpc3QgKipsc3QsIHN0cnVjdCB3cml0ZV9saXN0ICppdGVtKQotewotICAgIGl0ZW0tPm5leHQgPSAoKmxzdCk7Ci0gICAgKmxzdCA9IGl0ZW07Ci0gICAgcmV0dXJuIGl0ZW07Ci19Ci0KLXZvaWQKLXdsaXN0X2ZyZWUoc3RydWN0IHdyaXRlX2xpc3QgKmxzdCkKLXsKLSAgICBzdHJ1Y3Qgd3JpdGVfbGlzdCAqdGVtcF93cjsKLSAgICB3aGlsZSAobHN0KSB7Ci0gICAgICAgIHRlbXBfd3IgPSBsc3QtPm5leHQ7Ci0gICAgICAgIGZyZWVfd2wobHN0KTsKLSAgICAgICAgbHN0ID0gdGVtcF93cjsKLSAgICB9Ci19Ci0KLWludAotd2xpc3RfY29tbWl0KGludCBmZCwgc3RydWN0IHdyaXRlX2xpc3QgKmxzdCwgaW50IHRlc3QpCi17Ci0gICAgZm9yKDsgbHN0OyBsc3QgPSBsc3QtPm5leHQpIHsKLSAgICAgICAgaWYgKGxzZWVrNjQoZmQsIGxzdC0+b2Zmc2V0LCBTRUVLX1NFVCkgIT0gKGxvZmZfdClsc3QtPm9mZnNldCkgewotICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBzZWVrIHRvIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gKCVsbGQpLiIsIChsb25nIGxvbmcpbHN0LT5vZmZzZXQpOwotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCF0ZXN0KSB7Ci0gICAgICAgICAgICBpZiAod3JpdGUoZmQsIGxzdC0+ZGF0YSwgbHN0LT5sZW4pICE9IChpbnQpbHN0LT5sZW4pIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHdyaXRpbmcgJXUgYnl0ZXMgYXQgcG9zaXRpb24gJWxsZC4iLCBsc3QtPmxlbiwKLSAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbHN0LT5vZmZzZXQpOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBBTE9HSSgiV291bGQgd3JpdGUgJWQgYnl0ZXMgQCBvZmZzZXQgJWxsZC4iLCBsc3QtPmxlbiwgKGxvbmcgbG9uZylsc3QtPm9mZnNldCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci0KLWZhaWw6Ci0gICAgcmV0dXJuIC0xOwotfQpkaWZmIC0tZ2l0IGEvbGlibW9kcHJvYmUvQW5kcm9pZC5icCBiL2xpYm1vZHByb2JlL0FuZHJvaWQuYnAKaW5kZXggMWQ5NGE5Ni4uNzhiNGM4MyAxMDA2NDQKLS0tIGEvbGlibW9kcHJvYmUvQW5kcm9pZC5icAorKysgYi9saWJtb2Rwcm9iZS9BbmRyb2lkLmJwCkBAIC0xMCw4ICsxMCwxMCBAQAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgcmFtZGlza19hdmFpbGFibGU6IHRydWUsCiAgICAgcmVjb3ZlcnlfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZlbmRvcl9yYW1kaXNrX2F2YWlsYWJsZTogdHJ1ZSwKICAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKICAgICBzcmNzOiBbCisgICAgICAgICJleHRoYW5kbGVyLmNwcCIsCiAgICAgICAgICJsaWJtb2Rwcm9iZS5jcHAiLAogICAgICAgICAibGlibW9kcHJvYmVfZXh0LmNwcCIsCiAgICAgXSwKQEAgLTI5LDYgKzMxLDcgQEAKICAgICBdLAogICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJpbmNsdWRlLyJdLAogICAgIHNyY3M6IFsKKyAgICAgICAgImV4dGhhbmRsZXIuY3BwIiwKICAgICAgICAgImxpYm1vZHByb2JlX3Rlc3QuY3BwIiwKICAgICAgICAgImxpYm1vZHByb2JlLmNwcCIsCiAgICAgICAgICJsaWJtb2Rwcm9iZV9leHRfdGVzdC5jcHAiLApkaWZmIC0tZ2l0IGEvbGlibW9kcHJvYmUvZXh0aGFuZGxlci5jcHAgYi9saWJtb2Rwcm9iZS9leHRoYW5kbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDhjMjU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlibW9kcHJvYmUvZXh0aGFuZGxlci5jcHAKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZXh0aGFuZGxlci9leHRoYW5kbGVyLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvY2hyb25vX3V0aWxzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wYXJzZWludC5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgorI2luY2x1ZGUgPGZubWF0Y2guaD4KKyNpbmNsdWRlIDxncnAuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorCit1c2luZyBhbmRyb2lkOjpiYXNlOjpFcnJub0Vycm9yOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6RXJyb3I7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpSZWFkRmRUb1N0cmluZzsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlJlc3VsdDsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlNwbGl0OwordXNpbmcgYW5kcm9pZDo6YmFzZTo6VHJpbTsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZDsKKworUmVzdWx0PHN0ZDo6c3RyaW5nPiBSdW5FeHRlcm5hbEhhbmRsZXIoY29uc3Qgc3RkOjpzdHJpbmcmIGhhbmRsZXIsIHVpZF90IHVpZCwgZ2lkX3QgZ2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIGVudnNfbWFwKSB7CisgICAgdW5pcXVlX2ZkIGNoaWxkX3N0ZG91dDsKKyAgICB1bmlxdWVfZmQgcGFyZW50X3N0ZG91dDsKKyAgICBpZiAoIVNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0gfCBTT0NLX0NMT0VYRUMsIDAsICZjaGlsZF9zdGRvdXQsICZwYXJlbnRfc3Rkb3V0KSkgeworICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJTb2NrZXRwYWlyKCkgZm9yIHN0ZG91dCBmYWlsZWQiOworICAgIH0KKworICAgIHVuaXF1ZV9mZCBjaGlsZF9zdGRlcnI7CisgICAgdW5pcXVlX2ZkIHBhcmVudF9zdGRlcnI7CisgICAgaWYgKCFTb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfU1RSRUFNIHwgU09DS19DTE9FWEVDLCAwLCAmY2hpbGRfc3RkZXJyLCAmcGFyZW50X3N0ZGVycikpIHsKKyAgICAgICAgcmV0dXJuIEVycm5vRXJyb3IoKSA8PCAiU29ja2V0cGFpcigpIGZvciBzdGRlcnIgZmFpbGVkIjsKKyAgICB9CisKKyAgICBzaWduYWwoU0lHQ0hMRCwgU0lHX0RGTCk7CisKKyAgICBhdXRvIHBpZCA9IGZvcmsoKTsKKyAgICBpZiAocGlkIDwgMCkgeworICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJmb3JrKCkgZmFpbGVkIjsKKyAgICB9CisKKyAgICBpZiAocGlkID09IDApIHsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gZW52c19tYXAuYmVnaW4oKTsgaXQgIT0gZW52c19tYXAuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIHNldGVudihpdC0+Zmlyc3QuY19zdHIoKSwgaXQtPnNlY29uZC5jX3N0cigpLCAxKTsKKyAgICAgICAgfQorICAgICAgICBwYXJlbnRfc3Rkb3V0LnJlc2V0KCk7CisgICAgICAgIHBhcmVudF9zdGRlcnIucmVzZXQoKTsKKyAgICAgICAgY2xvc2UoU1RET1VUX0ZJTEVOTyk7CisgICAgICAgIGNsb3NlKFNUREVSUl9GSUxFTk8pOworICAgICAgICBkdXAyKGNoaWxkX3N0ZG91dC5nZXQoKSwgU1RET1VUX0ZJTEVOTyk7CisgICAgICAgIGR1cDIoY2hpbGRfc3RkZXJyLmdldCgpLCBTVERFUlJfRklMRU5PKTsKKworICAgICAgICBhdXRvIGFyZ3MgPSBTcGxpdChoYW5kbGVyLCAiICIpOworICAgICAgICBzdGQ6OnZlY3RvcjxjaGFyKj4gY19hcmdzOworICAgICAgICBmb3IgKGF1dG8mIGFyZyA6IGFyZ3MpIHsKKyAgICAgICAgICAgIGNfYXJncy5lbXBsYWNlX2JhY2soYXJnLmRhdGEoKSk7CisgICAgICAgIH0KKyAgICAgICAgY19hcmdzLmVtcGxhY2VfYmFjayhudWxscHRyKTsKKworICAgICAgICBpZiAoZ2lkICE9IDApIHsKKyAgICAgICAgICAgIGlmIChzZXRnaWQoZ2lkKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzZXRnaWQoKSBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICBfZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHNldHVpZCh1aWQpICE9IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic2V0dWlkKCkgZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICBfZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgICB9CisKKyAgICAgICAgZXhlY3YoY19hcmdzWzBdLCBjX2FyZ3MuZGF0YSgpKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJleGVjKCkgZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIF9leGl0KEVYSVRfRkFJTFVSRSk7CisgICAgfQorCisgICAgY2hpbGRfc3Rkb3V0LnJlc2V0KCk7CisgICAgY2hpbGRfc3RkZXJyLnJlc2V0KCk7CisKKyAgICBpbnQgc3RhdHVzOworICAgIHBpZF90IHdhaXRlZF9waWQgPSBURU1QX0ZBSUxVUkVfUkVUUlkod2FpdHBpZChwaWQsICZzdGF0dXMsIDApKTsKKyAgICBpZiAod2FpdGVkX3BpZCA9PSAtMSkgeworICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJ3YWl0cGlkKCkgZmFpbGVkIjsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBzdGRvdXRfY29udGVudDsKKyAgICBpZiAoIVJlYWRGZFRvU3RyaW5nKHBhcmVudF9zdGRvdXQuZ2V0KCksICZzdGRvdXRfY29udGVudCkpIHsKKyAgICAgICAgcmV0dXJuIEVycm5vRXJyb3IoKSA8PCAiUmVhZEZkVG9TdHJpbmcoKSBmb3Igc3Rkb3V0IGZhaWxlZCI7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgc3RkZXJyX2NvbnRlbnQ7CisgICAgaWYgKFJlYWRGZFRvU3RyaW5nKHBhcmVudF9zdGRlcnIuZ2V0KCksICZzdGRlcnJfY29udGVudCkpIHsKKyAgICAgICAgYXV0byBtZXNzYWdlcyA9IFNwbGl0KHN0ZGVycl9jb250ZW50LCAiXG4iKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBtZXNzYWdlIDogbWVzc2FnZXMpIHsKKyAgICAgICAgICAgIGlmICghbWVzc2FnZS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRXh0ZXJuYWwgSGFuZGxlcjogIiA8PCBtZXNzYWdlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiUmVhZEZkVG9TdHJpbmcoKSBmb3Igc3RkZXJyIGZhaWxlZCI7CisgICAgfQorCisgICAgaWYgKFdJRkVYSVRFRChzdGF0dXMpKSB7CisgICAgICAgIGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpID09IEVYSVRfU1VDQ0VTUykgeworICAgICAgICAgICAgcmV0dXJuIFRyaW0oc3Rkb3V0X2NvbnRlbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgImV4aXRlZCB3aXRoIHN0YXR1cyAiIDw8IFdFWElUU1RBVFVTKHN0YXR1cyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKFdJRlNJR05BTEVEKHN0YXR1cykpIHsKKyAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgImtpbGxlZCBieSBzaWduYWwgIiA8PCBXVEVSTVNJRyhzdGF0dXMpOworICAgIH0KKworICAgIHJldHVybiBFcnJvcigpIDw8ICJ1bmV4cGVjdGVkIGV4aXQgc3RhdHVzICIgPDwgc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvaW5pdC9ob3N0X2luaXRfdmVyaWZpZXIuaCBiL2xpYm1vZHByb2JlL2luY2x1ZGUvZXh0aGFuZGxlci9leHRoYW5kbGVyLmgKc2ltaWxhcml0eSBpbmRleCA2NiUKY29weSBmcm9tIGluaXQvaG9zdF9pbml0X3ZlcmlmaWVyLmgKY29weSB0byBsaWJtb2Rwcm9iZS9pbmNsdWRlL2V4dGhhbmRsZXIvZXh0aGFuZGxlci5oCmluZGV4IDVkMjRmMmEuLjIzMmFhOTUgMTAwNjQ0Ci0tLSBhL2luaXQvaG9zdF9pbml0X3ZlcmlmaWVyLmgKKysrIGIvbGlibW9kcHJvYmUvaW5jbHVkZS9leHRoYW5kbGVyL2V4dGhhbmRsZXIuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE1LDEzICsxNSw5IEBACiAgKi8KIAogI3ByYWdtYSBvbmNlCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Jlc3VsdC5oPgorI2luY2x1ZGUgPHN0cmluZz4KIAotI2luY2x1ZGUgPHByb3BlcnR5X2luZm9fcGFyc2VyL3Byb3BlcnR5X2luZm9fcGFyc2VyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBpbml0IHsKLQotZXh0ZXJuIGNvbnN0IGFuZHJvaWQ6OnByb3BlcnRpZXM6OlByb3BlcnR5SW5mb0FyZWEqIHByb3BlcnR5X2luZm9fYXJlYTsKLQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCithbmRyb2lkOjpiYXNlOjpSZXN1bHQ8c3RkOjpzdHJpbmc+IFJ1bkV4dGVybmFsSGFuZGxlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGhhbmRsZXIsIHVpZF90IHVpZCwgZ2lkX3QgZ2lkLAorICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgZW52c19tYXApOwpkaWZmIC0tZ2l0IGEvbGlibW9kcHJvYmUvaW5jbHVkZS9tb2Rwcm9iZS9tb2Rwcm9iZS5oIGIvbGlibW9kcHJvYmUvaW5jbHVkZS9tb2Rwcm9iZS9tb2Rwcm9iZS5oCmluZGV4IDVkNzlkNmEuLjdiNjkxYjEgMTAwNjQ0Ci0tLSBhL2xpYm1vZHByb2JlL2luY2x1ZGUvbW9kcHJvYmUvbW9kcHJvYmUuaAorKysgYi9saWJtb2Rwcm9iZS9pbmNsdWRlL21vZHByb2JlL21vZHByb2JlLmgKQEAgLTQxLDYgKzQxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHBvc3RfZGVwZW5kZW5jaWVzKTsKICAgICB2b2lkIFJlc2V0TW9kdWxlQ291bnQoKSB7IG1vZHVsZV9jb3VudF8gPSAwOyB9CiAgICAgaW50IEdldE1vZHVsZUNvdW50KCkgeyByZXR1cm4gbW9kdWxlX2NvdW50XzsgfQorICAgIGJvb2wgSXNCbG9ja2xpc3RlZChjb25zdCBzdGQ6OnN0cmluZyYgbW9kdWxlX25hbWUpOwogCiAgIHByaXZhdGU6CiAgICAgc3RkOjpzdHJpbmcgTWFrZUNhbm9uaWNhbChjb25zdCBzdGQ6OnN0cmluZyYgbW9kdWxlX3BhdGgpOwpAQCAtNTIsMTMgKzUzLDEzIEBACiAgICAgdm9pZCBBZGRPcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1vZHVsZV9uYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX25hbWUsCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKICAgICBzdGQ6OnN0cmluZyBHZXRLZXJuZWxDbWRsaW5lKCk7Ci0gICAgYm9vbCBJc0Jsb2NrbGlzdGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBtb2R1bGVfbmFtZSk7CiAKICAgICBib29sIFBhcnNlRGVwQ2FsbGJhY2soY29uc3Qgc3RkOjpzdHJpbmcmIGJhc2VfcGF0aCwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzKTsKICAgICBib29sIFBhcnNlQWxpYXNDYWxsYmFjayhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpOwogICAgIGJvb2wgUGFyc2VTb2Z0ZGVwQ2FsbGJhY2soY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzKTsKICAgICBib29sIFBhcnNlTG9hZENhbGxiYWNrKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncyk7CiAgICAgYm9vbCBQYXJzZU9wdGlvbnNDYWxsYmFjayhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpOworICAgIGJvb2wgUGFyc2VEeW5PcHRpb25zQ2FsbGJhY2soY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzKTsKICAgICBib29sIFBhcnNlQmxvY2tsaXN0Q2FsbGJhY2soY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzKTsKICAgICB2b2lkIFBhcnNlS2VybmVsQ21kbGluZU9wdGlvbnMoKTsKICAgICB2b2lkIFBhcnNlQ2ZnKGNvbnN0IHN0ZDo6c3RyaW5nJiBjZmcsIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mKT4gZik7CmRpZmYgLS1naXQgYS9saWJtb2Rwcm9iZS9saWJtb2Rwcm9iZS5jcHAgYi9saWJtb2Rwcm9iZS9saWJtb2Rwcm9iZS5jcHAKaW5kZXggMTk3MWYwMS4uYmRkMTE0YyAxMDA2NDQKLS0tIGEvbGlibW9kcHJvYmUvbGlibW9kcHJvYmUuY3BwCisrKyBiL2xpYm1vZHByb2JlL2xpYm1vZHByb2JlLmNwcApAQCAtMTcsOCArMTcsMTEgQEAKICNpbmNsdWRlIDxtb2Rwcm9iZS9tb2Rwcm9iZS5oPgogCiAjaW5jbHVkZSA8Zm5tYXRjaC5oPgorI2luY2x1ZGUgPGdycC5oPgorI2luY2x1ZGUgPHB3ZC5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPG1hcD4KQEAgLTMwLDkgKzMzLDEyIEBACiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2Nocm9ub191dGlscy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcGFyc2VpbnQuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KIAorI2luY2x1ZGUgImV4dGhhbmRsZXIvZXh0aGFuZGxlci5oIgorCiBzdGQ6OnN0cmluZyBNb2Rwcm9iZTo6TWFrZUNhbm9uaWNhbChjb25zdCBzdGQ6OnN0cmluZyYgbW9kdWxlX3BhdGgpIHsKICAgICBhdXRvIHN0YXJ0ID0gbW9kdWxlX3BhdGguZmluZF9sYXN0X29mKCcvJyk7CiAgICAgaWYgKHN0YXJ0ID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CkBAIC0xNjQsNiArMTcwLDEwIEBACiAgICAgYXV0byBpdCA9IGFyZ3MuYmVnaW4oKTsKICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSA9ICppdCsrOwogCisgICAgaWYgKHR5cGUgPT0gImR5bl9vcHRpb25zIikgeworICAgICAgICByZXR1cm4gUGFyc2VEeW5PcHRpb25zQ2FsbGJhY2soc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KGl0LCBhcmdzLmVuZCgpKSk7CisgICAgfQorCiAgICAgaWYgKHR5cGUgIT0gIm9wdGlvbnMiKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgIm5vbi1vcHRpb25zIGxpbmUgZW5jb3VudGVyZWQgaW4gbW9kdWxlcy5vcHRpb25zIjsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTk3LDYgKzIwNyw1NyBAQAogICAgIHJldHVybiB0cnVlOwogfQogCitib29sIE1vZHByb2JlOjpQYXJzZUR5bk9wdGlvbnNDYWxsYmFjayhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpIHsKKyAgICBhdXRvIGl0ID0gYXJncy5iZWdpbigpOworICAgIGludCBhcmdfc2l6ZSA9IDM7CisKKyAgICBpZiAoYXJncy5zaXplKCkgPCBhcmdfc2l6ZSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJkeW5fb3B0aW9ucyBsaW5lcyBpbiBtb2R1bGVzLm9wdGlvbnMgbXVzdCBoYXZlIGF0IGxlYXN0IiA8PCBhcmdfc2l6ZQorICAgICAgICAgICAgICAgICAgIDw8ICIgZW50cmllcywgbm90ICIgPDwgYXJncy5zaXplKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgbW9kdWxlID0gKml0Kys7CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgY2Fub25pY2FsX25hbWUgPSBNYWtlQ2Fub25pY2FsKG1vZHVsZSk7CisgICAgaWYgKGNhbm9uaWNhbF9uYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwd25hbSA9ICppdCsrOworICAgIHBhc3N3ZCogcHdkID0gZ2V0cHduYW0ocHduYW0uY19zdHIoKSk7CisgICAgaWYgKCFwd2QpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiaW52YWxpZCBoYW5kbGVyIHVpZCciIDw8IHB3bmFtIDw8ICInIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGhhbmRsZXJfd2l0aF9hcmdzID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OkpvaW4oc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KGl0LCBhcmdzLmVuZCgpKSwgJyAnKTsKKyAgICBoYW5kbGVyX3dpdGhfYXJncy5lcmFzZShzdGQ6OnJlbW92ZShoYW5kbGVyX3dpdGhfYXJncy5iZWdpbigpLCBoYW5kbGVyX3dpdGhfYXJncy5lbmQoKSwgJ1wiJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcl93aXRoX2FyZ3MuZW5kKCkpOworCisgICAgTE9HKERFQlVHKSA8PCAiTGF1bmNoaW5nIGV4dGVybmFsIG1vZHVsZSBvcHRpb25zIGhhbmRsZXI6ICciIDw8IGhhbmRsZXJfd2l0aF9hcmdzCisgICAgICAgICAgICAgICA8PCAiIGZvciBtb2R1bGU6ICIgPDwgbW9kdWxlOworCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byBzZXQgZW52cyBmb3IgZXh0ZXJuYWwgbW9kdWxlIG9wdGlvbnMgaGFuZGxlciAtIHBhc3MKKyAgICAvLyBlbXB0eSBtYXAuCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gZW52c19tYXA7CisgICAgYXV0byByZXN1bHQgPSBSdW5FeHRlcm5hbEhhbmRsZXIoaGFuZGxlcl93aXRoX2FyZ3MsIHB3ZC0+cHdfdWlkLCAwLCBlbnZzX21hcCk7CisgICAgaWYgKCFyZXN1bHQub2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJFeHRlcm5hbCBtb2R1bGUgaGFuZGxlciBmYWlsZWQ6ICIgPDwgcmVzdWx0LmVycm9yKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBMT0coSU5GTykgPDwgIkR5bmFtaWMgb3B0aW9ucyBmb3IgbW9kdWxlOiAiIDw8IG1vZHVsZSA8PCAiIGFyZSAnIiA8PCAqcmVzdWx0IDw8ICInIjsKKworICAgIGF1dG8gW3VudXNlZCwgaW5zZXJ0ZWRdID0gdGhpcy0+bW9kdWxlX29wdGlvbnNfLmVtcGxhY2UoY2Fub25pY2FsX25hbWUsICpyZXN1bHQpOworICAgIGlmICghaW5zZXJ0ZWQpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAibXVsdGlwbGUgb3B0aW9ucyBsaW5lcyBwcmVzZW50IGZvciBtb2R1bGUgIiA8PCBtb2R1bGU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKIGJvb2wgTW9kcHJvYmU6OlBhcnNlQmxvY2tsaXN0Q2FsbGJhY2soY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzKSB7CiAgICAgYXV0byBpdCA9IGFyZ3MuYmVnaW4oKTsKICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSA9ICppdCsrOwpAQCAtMjMwLDcgKzI5MSw3IEBACiAgICAgfQogCiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpbmVzID0gYW5kcm9pZDo6YmFzZTo6U3BsaXQoY2ZnX2NvbnRlbnRzLCAiXG4iKTsKLSAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nIGxpbmUgOiBsaW5lcykgeworICAgIGZvciAoY29uc3QgYXV0byYgbGluZSA6IGxpbmVzKSB7CiAgICAgICAgIGlmIChsaW5lLmVtcHR5KCkgfHwgbGluZVswXSA9PSAnIycpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CkBAIC00MjEsNyArNDgyLDggQEAKICAgICB9CiAKICAgICBpZiAoc3RyaWN0ICYmICFtb2R1bGVfbG9hZGVkKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkxvYWRXaXRoQWxpYXNlcyB3YXMgdW5hYmxlIHRvIGxvYWQgIiA8PCBtb2R1bGVfbmFtZTsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiTG9hZFdpdGhBbGlhc2VzIHdhcyB1bmFibGUgdG8gbG9hZCAiIDw8IG1vZHVsZV9uYW1lCisgICAgICAgICAgICAgICAgICAgPDwgIiwgdHJpZWQ6ICIgPDwgYW5kcm9pZDo6YmFzZTo6Sm9pbihtb2R1bGVzX3RvX2xvYWQsICIsICIpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiB0cnVlOwpAQCAtNDM5LDU0ICs1MDEsNjIgQEAKICAgICByZXR1cm4gbW9kdWxlX2Jsb2NrbGlzdF8uY291bnQoY2Fub25pY2FsX25hbWUpID4gMDsKIH0KIAotLy8gQW5vdGhlciBvcHRpb24gdG8gbG9hZCBrZXJuZWwgbW9kdWxlcy4gbG9hZCBpbiBpbmRlcGVuZGVudCBtb2R1bGVzIGluIHBhcmFsbGVsCi0vLyBhbmQgdGhlbiB1cGRhdGUgZGVwZW5kZW5jeSBsaXN0IG9mIG90aGVyIHJlbWFpbmluZyBtb2R1bGVzLCByZXBlYXQgdGhlc2Ugc3RlcHMKLS8vIHVudGlsIGFsbCBtb2R1bGVzIGFyZSBsb2FkZWQuCisvLyBBbm90aGVyIG9wdGlvbiB0byBsb2FkIGtlcm5lbCBtb2R1bGVzLiBsb2FkIGluZGVwZW5kZW50IG1vZHVsZXMgZGVwZW5kZW5jaWVzCisvLyBpbiBwYXJhbGxlbCBhbmQgdGhlbiB1cGRhdGUgZGVwZW5kZW5jeSBsaXN0IG9mIG90aGVyIHJlbWFpbmluZyBtb2R1bGVzLAorLy8gcmVwZWF0IHRoZXNlIHN0ZXBzIHVudGlsIGFsbCBtb2R1bGVzIGFyZSBsb2FkZWQuCisvLyBEaXNjYXJkIGFsbCBibG9ja2xpc3QuCisvLyBTb2Z0ZGVwcyBhcmUgdGFrZW4gY2FyZSBpbiBJbnNtb2RXaXRoRGVwcygpLgogYm9vbCBNb2Rwcm9iZTo6TG9hZE1vZHVsZXNQYXJhbGxlbChpbnQgbnVtX3RocmVhZHMpIHsKICAgICBib29sIHJldCA9IHRydWU7Ci0gICAgaW50IGNvdW50ID0gLTE7Ci0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPj4gbW9kX3dpdGhfZGVwczsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PiBtb2Rfd2l0aF9kZXBzOwogCiAgICAgLy8gR2V0IGRlcGVuZGVuY2llcwogICAgIGZvciAoY29uc3QgYXV0byYgbW9kdWxlIDogbW9kdWxlX2xvYWRfKSB7CisgICAgICAgIC8vIFNraXAgYmxvY2tsaXN0IG1vZHVsZXMKKyAgICAgICAgaWYgKElzQmxvY2tsaXN0ZWQobW9kdWxlKSkgeworICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJMTVA6IEJsb2NrbGlzdDogTW9kdWxlICIgPDwgbW9kdWxlIDw8ICIgc2tpcHBpbmcuLi4iOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KICAgICAgICAgYXV0byBkZXBlbmRlbmNpZXMgPSBHZXREZXBlbmRlbmNpZXMoTWFrZUNhbm9uaWNhbChtb2R1bGUpKTsKLQotICAgICAgICBmb3IgKGF1dG8gZGVwID0gZGVwZW5kZW5jaWVzLnJiZWdpbigpOyBkZXAgIT0gZGVwZW5kZW5jaWVzLnJlbmQoKTsgZGVwKyspIHsKLSAgICAgICAgICAgIG1vZF93aXRoX2RlcHNbbW9kdWxlXS5lbXBsYWNlKCpkZXApOworICAgICAgICBpZiAoZGVwZW5kZW5jaWVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkxNUDogSGFyZC1kZXA6IE1vZHVsZSAiIDw8IG1vZHVsZQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiIG5vdCBpbiAuZGVwIGZpbGUiOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CisgICAgICAgIG1vZF93aXRoX2RlcHNbTWFrZUNhbm9uaWNhbChtb2R1bGUpXSA9IGRlcGVuZGVuY2llczsKICAgICB9CiAKLSAgICAvLyBHZXQgc29mdCBkZXBlbmRlbmNpZXMKLSAgICBmb3IgKGNvbnN0IGF1dG8mIFtpdF9tb2QsIGl0X3NvZnRkZXBdIDogbW9kdWxlX3ByZV9zb2Z0ZGVwXykgewotICAgICAgICBpZiAobW9kX3dpdGhfZGVwcy5maW5kKE1ha2VDYW5vbmljYWwoaXRfc29mdGRlcCkpICE9IG1vZF93aXRoX2RlcHMuZW5kKCkpIHsKLSAgICAgICAgICAgIG1vZF93aXRoX2RlcHNbTWFrZUNhbm9uaWNhbChpdF9tb2QpXS5lbXBsYWNlKAotICAgICAgICAgICAgICAgIEdldERlcGVuZGVuY2llcyhNYWtlQ2Fub25pY2FsKGl0X3NvZnRkZXApKVswXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBHZXQgc29mdCBwb3N0IGRlcGVuZGVuY2llcwotICAgIGZvciAoY29uc3QgYXV0byYgW2l0X21vZCwgaXRfc29mdGRlcF0gOiBtb2R1bGVfcG9zdF9zb2Z0ZGVwXykgewotICAgICAgICBpZiAobW9kX3dpdGhfZGVwcy5maW5kKE1ha2VDYW5vbmljYWwoaXRfc29mdGRlcCkpICE9IG1vZF93aXRoX2RlcHMuZW5kKCkpIHsKLSAgICAgICAgICAgIG1vZF93aXRoX2RlcHNbTWFrZUNhbm9uaWNhbChpdF9zb2Z0ZGVwKV0uZW1wbGFjZSgKLSAgICAgICAgICAgICAgICBHZXREZXBlbmRlbmNpZXMoTWFrZUNhbm9uaWNhbChpdF9tb2QpKVswXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB3aGlsZSAoIW1vZF93aXRoX2RlcHMuZW1wdHkoKSAmJiAgY291bnQgIT0gbW9kdWxlX2xvYWRlZF8uc2l6ZSgpKSB7CisgICAgd2hpbGUgKCFtb2Rfd2l0aF9kZXBzLmVtcHR5KCkpIHsKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp0aHJlYWQ+IHRocmVhZHM7CiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtb2RzX3BhdGhfdG9fbG9hZDsKICAgICAgICAgc3RkOjptdXRleCB2ZWN0b3JfbG9jazsKLSAgICAgICAgY291bnQgPSBtb2R1bGVfbG9hZGVkXy5zaXplKCk7CiAKICAgICAgICAgLy8gRmluZCBpbmRlcGVuZGVudCBtb2R1bGVzCiAgICAgICAgIGZvciAoY29uc3QgYXV0byYgW2l0X21vZCwgaXRfZGVwXSA6IG1vZF93aXRoX2RlcHMpIHsKLSAgICAgICAgICAgIGlmIChpdF9kZXAuc2l6ZSgpID09IDEpIHsKLSAgICAgICAgICAgICAgICBpZiAobW9kdWxlX29wdGlvbnNfW2l0X21vZF0uZmluZCgibG9hZF9zZXF1ZW50aWFsPTEiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgICAgICAgICAgICAgICBpZiAoIUxvYWRXaXRoQWxpYXNlcyhpdF9tb2QsIHRydWUpICYmICFJc0Jsb2NrbGlzdGVkKGl0X21vZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtb2RzX3BhdGhfdG9fbG9hZC5lbXBsYWNlX2JhY2soaXRfbW9kKTsKKyAgICAgICAgICAgIGF1dG8gaXRkX2xhc3QgPSBpdF9kZXAucmJlZ2luKCk7CisgICAgICAgICAgICBpZiAoaXRkX2xhc3QgPT0gaXRfZGVwLnJlbmQoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgYXV0byBjbmRfbGFzdCA9IE1ha2VDYW5vbmljYWwoKml0ZF9sYXN0KTsKKyAgICAgICAgICAgIC8vIEhhcmQtZGVwZW5kZW5jaWVzIGNhbm5vdCBiZSBibG9ja2xpc3RlZAorICAgICAgICAgICAgaWYgKElzQmxvY2tsaXN0ZWQoY25kX2xhc3QpKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTE1QOiBCbG9ja2xpc3Q6IE1vZHVsZS1kZXAgIiA8PCBjbmRfbGFzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiA6IGZhaWxlZCB0byBsb2FkIG1vZHVsZSAiIDw8IGl0X21vZDsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN0ciA9ICJsb2FkX3NlcXVlbnRpYWw9MSI7CisgICAgICAgICAgICBhdXRvIGl0ID0gbW9kdWxlX29wdGlvbnNfW2NuZF9sYXN0XS5maW5kKHN0cik7CisgICAgICAgICAgICBpZiAoaXQgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgICAgICBtb2R1bGVfb3B0aW9uc19bY25kX2xhc3RdLmVyYXNlKGl0LCBpdCArIHN0ci5zaXplKCkpOworCisgICAgICAgICAgICAgICAgaWYgKCFMb2FkV2l0aEFsaWFzZXMoY25kX2xhc3QsIHRydWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChzdGQ6OmZpbmQobW9kc19wYXRoX3RvX2xvYWQuYmVnaW4oKSwgbW9kc19wYXRoX3RvX2xvYWQuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY25kX2xhc3QpID09IG1vZHNfcGF0aF90b19sb2FkLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1vZHNfcGF0aF90b19sb2FkLmVtcGxhY2VfYmFjayhjbmRfbGFzdCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC01MDIsNyArNTcyLDcgQEAKICAgICAgICAgICAgICAgICBsay51bmxvY2soKTsKICAgICAgICAgICAgICAgICByZXRfbG9hZCAmPSBMb2FkV2l0aEFsaWFzZXMobW9kX3RvX2xvYWQsIHRydWUpOwogICAgICAgICAgICAgICAgIGxrLmxvY2soKTsKLSAgICAgICAgICAgICAgICBpZiAoIXJldF9sb2FkICYmICFJc0Jsb2NrbGlzdGVkKG1vZF90b19sb2FkKSkgeworICAgICAgICAgICAgICAgIGlmICghcmV0X2xvYWQpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0ICY9IHJldF9sb2FkOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTUyMCwxNCArNTkwLDE2IEBACiAKICAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGd1YXJkKG1vZHVsZV9sb2FkZWRfbG9ja18pOwogICAgICAgICAvLyBSZW1vdmUgbG9hZGVkIG1vZHVsZSBmb3JtIG1vZF93aXRoX2RlcHMgYW5kIHNvZnQgZGVwZW5kZW5jaWVzIG9mIG90aGVyIG1vZHVsZXMKLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBtb2R1bGVfbG9hZGVkIDogbW9kdWxlX2xvYWRlZF8pIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBtb2R1bGVfbG9hZGVkIDogbW9kdWxlX2xvYWRlZF8pCiAgICAgICAgICAgICBtb2Rfd2l0aF9kZXBzLmVyYXNlKG1vZHVsZV9sb2FkZWQpOwotICAgICAgICB9CiAKICAgICAgICAgLy8gUmVtb3ZlIGxvYWRlZCBtb2R1bGUgZm9ybSBkZXBlbmRlbmNpZXMgb2Ygb3RoZXIgbW9kdWxlcyB3aGljaCBhcmUgbm90IGxvYWRlZCB5ZXQKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBtb2R1bGVfbG9hZGVkX3BhdGggOiBtb2R1bGVfbG9hZGVkX3BhdGhzXykgewogICAgICAgICAgICAgZm9yIChhdXRvJiBbbW9kLCBkZXBzXSA6IG1vZF93aXRoX2RlcHMpIHsKLSAgICAgICAgICAgICAgICBkZXBzLmVyYXNlKG1vZHVsZV9sb2FkZWRfcGF0aCk7CisgICAgICAgICAgICAgICAgYXV0byBpdCA9IHN0ZDo6ZmluZChkZXBzLmJlZ2luKCksIGRlcHMuZW5kKCksIG1vZHVsZV9sb2FkZWRfcGF0aCk7CisgICAgICAgICAgICAgICAgaWYgKGl0ICE9IGRlcHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVwcy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGlibW9kcHJvYmUvbGlibW9kcHJvYmVfZXh0LmNwcCBiL2xpYm1vZHByb2JlL2xpYm1vZHByb2JlX2V4dC5jcHAKaW5kZXggOTRhMWRjNC4uYzQ1MTllMyAxMDA2NDQKLS0tIGEvbGlibW9kcHJvYmUvbGlibW9kcHJvYmVfZXh0LmNwcAorKysgYi9saWJtb2Rwcm9iZS9saWJtb2Rwcm9iZV9leHQuY3BwCkBAIC04NCw3ICs4NCw3IEBACiB9CiAKIGJvb2wgTW9kcHJvYmU6Ok1vZHVsZUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYgbW9kdWxlX25hbWUpIHsKLSAgICBzdHJ1Y3Qgc3RhdCBmaWxlU3RhdDsKKyAgICBzdHJ1Y3Qgc3RhdCBmaWxlU3RhdCB7fTsKICAgICBpZiAoYmxvY2tsaXN0X2VuYWJsZWQgJiYgbW9kdWxlX2Jsb2NrbGlzdF8uY291bnQobW9kdWxlX25hbWUpKSB7CiAgICAgICAgIExPRyhJTkZPKSA8PCAibW9kdWxlICIgPDwgbW9kdWxlX25hbWUgPDwgIiBpcyBibG9ja2xpc3RlZCI7CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTk1LDcgKzk1LDcgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAoc3RhdChkZXBzLmZyb250KCkuY19zdHIoKSwgJmZpbGVTdGF0KSkgewotICAgICAgICBMT0coSU5GTykgPDwgIm1vZHVsZSAiIDw8IG1vZHVsZV9uYW1lIDw8ICIgZG9lcyBub3QgZXhpc3QiOworICAgICAgICBQTE9HKElORk8pIDw8ICJtb2R1bGUgIiA8PCBtb2R1bGVfbmFtZSA8PCAiIGNhbid0IGJlIGxvYWRlZDsgY2FuJ3QgYWNjZXNzICIgPDwgZGVwcy5mcm9udCgpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICghU19JU1JFRyhmaWxlU3RhdC5zdF9tb2RlKSkgewpkaWZmIC0tZ2l0IGEvbGlibmV0dXRpbHMvQW5kcm9pZC5icCBiL2xpYm5ldHV0aWxzL0FuZHJvaWQuYnAKaW5kZXggMDJiZDJlMy4uMGJjYTY2MiAxMDA2NDQKLS0tIGEvbGlibmV0dXRpbHMvQW5kcm9pZC5icAorKysgYi9saWJuZXR1dGlscy9BbmRyb2lkLmJwCkBAIC0xOCw5ICsxOCw2IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYm5ldHV0aWxzIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICB9LAogCiAgICAgc3JjczogWwogICAgICAgICAiZGhjcGNsaWVudC5jIiwKZGlmZiAtLWdpdCBhL2xpYm5ldHV0aWxzL2lmY191dGlscy5jIGIvbGlibmV0dXRpbHMvaWZjX3V0aWxzLmMKaW5kZXggNTk5OWUzOS4uN2NjYTEwNSAxMDA2NDQKLS0tIGEvbGlibmV0dXRpbHMvaWZjX3V0aWxzLmMKKysrIGIvbGlibmV0dXRpbHMvaWZjX3V0aWxzLmMKQEAgLTM2MiwxNCArMzYyLDE5IEBACiAgICAgcmV0dXJuIGVyci0+ZXJyb3I7CiB9CiAKKy8vIFBhc3MgYml0d2lzZSBjb21wbGVtZW50IG9mIHByZWZpeCBsZW5ndGggdG8gZGlzYWJsZSBEQUQsIGllLiB1c2UgfjY0IGluc3RlYWQgb2YgNjQuCiAvLyBSZXR1cm5zIHplcm8gb24gc3VjY2VzcyBhbmQgbmVnYXRpdmUgZXJybm8gb24gZmFpbHVyZS4KIGludCBpZmNfYWRkX2FkZHJlc3MoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqYWRkcmVzcywgaW50IHByZWZpeGxlbikgewotICAgIHJldHVybiBpZmNfYWN0X29uX2FkZHJlc3MoUlRNX05FV0FERFIsIG5hbWUsIGFkZHJlc3MsIHByZWZpeGxlbiwgLypub2RhZCovIGZhbHNlKTsKKyAgICBib29sIG5vZGFkID0gKHByZWZpeGxlbiA8IDApOworICAgIGlmIChub2RhZCkgcHJlZml4bGVuID0gfnByZWZpeGxlbjsKKyAgICByZXR1cm4gaWZjX2FjdF9vbl9hZGRyZXNzKFJUTV9ORVdBRERSLCBuYW1lLCBhZGRyZXNzLCBwcmVmaXhsZW4sIG5vZGFkKTsKIH0KIAogLy8gUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MgYW5kIG5lZ2F0aXZlIGVycm5vIG9uIGZhaWx1cmUuCiBpbnQgaWZjX2RlbF9hZGRyZXNzKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiBhZGRyZXNzLCBpbnQgcHJlZml4bGVuKSB7Ci0gICAgcmV0dXJuIGlmY19hY3Rfb25fYWRkcmVzcyhSVE1fREVMQUREUiwgbmFtZSwgYWRkcmVzcywgcHJlZml4bGVuLCAvKm5vZGFkKi8gZmFsc2UpOworICAgIGJvb2wgbm9kYWQgPSAocHJlZml4bGVuIDwgMCk7CisgICAgaWYgKG5vZGFkKSBwcmVmaXhsZW4gPSB+cHJlZml4bGVuOworICAgIHJldHVybiBpZmNfYWN0X29uX2FkZHJlc3MoUlRNX0RFTEFERFIsIG5hbWUsIGFkZHJlc3MsIHByZWZpeGxlbiwgbm9kYWQpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvbGlicGFja2FnZWxpc3RwYXJzZXIvaW5jbHVkZS9wYWNrYWdlbGlzdHBhcnNlci9wYWNrYWdlbGlzdHBhcnNlci5oIGIvbGlicGFja2FnZWxpc3RwYXJzZXIvaW5jbHVkZS9wYWNrYWdlbGlzdHBhcnNlci9wYWNrYWdlbGlzdHBhcnNlci5oCmluZGV4IGU4OWNiNTQuLjliZDIxMmEgMTAwNjQ0Ci0tLSBhL2xpYnBhY2thZ2VsaXN0cGFyc2VyL2luY2x1ZGUvcGFja2FnZWxpc3RwYXJzZXIvcGFja2FnZWxpc3RwYXJzZXIuaAorKysgYi9saWJwYWNrYWdlbGlzdHBhcnNlci9pbmNsdWRlL3BhY2thZ2VsaXN0cGFyc2VyL3BhY2thZ2VsaXN0cGFyc2VyLmgKQEAgLTMzLDcgKzMzLDEwIEBACiAgIC8qKiBQYWNrYWdlIG5hbWUgbGlrZSAiY29tLmFuZHJvaWQuYmxhaCIuICovCiAgIGNoYXIqIG5hbWU7CiAKLSAgLyoqIFBhY2thZ2UgdWlkIGxpa2UgMTAwMTQuICovCisgIC8qKgorICAgKiBQYWNrYWdlIHVpZCBsaWtlIDEwMDE0LgorICAgKiBOb3RlIHRoYXQgYXBleGVzIGFuZCBTREsgbGlicmFyaWVzIG1heSBoYXZlIGEgYm9ndXMgMHhmZmZmZmZmZiB2YWx1ZS4KKyAgICovCiAgIHVpZF90IHVpZDsKIAogICAvKiogUGFja2FnZSdzIEFuZHJvaWRNYW5pZmVzdC54bWwgZGVidWdnYWJsZSBmbGFnLiAqLwpkaWZmIC0tZ2l0IGEvbGlicGFja2FnZWxpc3RwYXJzZXIvcGFja2FnZWxpc3RwYXJzZXIuY3BwIGIvbGlicGFja2FnZWxpc3RwYXJzZXIvcGFja2FnZWxpc3RwYXJzZXIuY3BwCmluZGV4IDU5YzNhNzQuLjYzOGNjNDMgMTAwNjQ0Ci0tLSBhL2xpYnBhY2thZ2VsaXN0cGFyc2VyL3BhY2thZ2VsaXN0cGFyc2VyLmNwcAorKysgYi9saWJwYWNrYWdlbGlzdHBhcnNlci9wYWNrYWdlbGlzdHBhcnNlci5jcHAKQEAgLTYzLDE0ICs2MywxMyBAQAogfQogCiBzdGF0aWMgYm9vbCBwYXJzZV9saW5lKGNvbnN0IGNoYXIqIHBhdGgsIHNpemVfdCBsaW5lX251bWJlciwgY29uc3QgY2hhciogbGluZSwgcGtnX2luZm8qIGluZm8pIHsKLSAgdW5zaWduZWQgbG9uZyB1aWQ7CiAgIGludCBkZWJ1Z2dhYmxlOwogICBjaGFyKiBnaWRfbGlzdDsKICAgaW50IHByb2ZpbGVhYmxlX2Zyb21fc2hlbGwgPSAwOwotCiAgIGludCBmaWVsZHMgPQotICAgICAgc3NjYW5mKGxpbmUsICIlbXMgJWx1ICVkICVtcyAlbXMgJW1zICVkICVsZCIsICZpbmZvLT5uYW1lLCAmdWlkLCAmZGVidWdnYWJsZSwgJmluZm8tPmRhdGFfZGlyLAotICAgICAgICAgICAgICZpbmZvLT5zZWluZm8sICZnaWRfbGlzdCwgJnByb2ZpbGVhYmxlX2Zyb21fc2hlbGwsICZpbmZvLT52ZXJzaW9uX2NvZGUpOworICAgICAgc3NjYW5mKGxpbmUsICIlbXMgJXUgJWQgJW1zICVtcyAlbXMgJWQgJWxkIiwgJmluZm8tPm5hbWUsICZpbmZvLT51aWQsCisgICAgICAgICAgICAgJmRlYnVnZ2FibGUsICZpbmZvLT5kYXRhX2RpciwgJmluZm8tPnNlaW5mbywgJmdpZF9saXN0LAorICAgICAgICAgICAgICZwcm9maWxlYWJsZV9mcm9tX3NoZWxsLCAmaW5mby0+dmVyc2lvbl9jb2RlKTsKIAogICAvLyBIYW5kbGUgdGhlIG1vcmUgY29tcGxpY2F0ZWQgZ2lkcyBmaWVsZCBhbmQgZnJlZSB0aGUgdGVtcG9yYXJ5IHN0cmluZy4KICAgYm9vbCBnaWRzX29rYXkgPSBwYXJzZV9naWRzKHBhdGgsIGxpbmVfbnVtYmVyLCBnaWRfbGlzdCwgaW5mbyk7CkBAIC04NCwxNCArODMsNyBAQAogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIC8vIEV4dHJhIHZhbGlkYXRpb24uCi0gIGlmICh1aWQgPiBVSURfTUFYKSB7Ci0gICAgQUxPR0UoIiVzOiV6dTogdWlkICVsdSA+IFVJRF9NQVgiLCBwYXRoLCBsaW5lX251bWJlciwgdWlkKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaW5mby0+dWlkID0gdWlkOwotCi0gIC8vIEludGVnZXIgdG8gYm9vbCBjb252ZXJzaW9ucy4KKyAgLy8gQ29udmVydCBpbnRlZ2VycyB0byBib29scy4KICAgaW5mby0+ZGVidWdnYWJsZSA9IGRlYnVnZ2FibGU7CiAgIGluZm8tPnByb2ZpbGVhYmxlX2Zyb21fc2hlbGwgPSBwcm9maWxlYWJsZV9mcm9tX3NoZWxsOwogCmRpZmYgLS1naXQgYS9saWJwcm9jZXNzZ3JvdXAvQW5kcm9pZC5icCBiL2xpYnByb2Nlc3Nncm91cC9BbmRyb2lkLmJwCmluZGV4IGM2YTA3MzcuLjFlNzZlNzYgMTAwNjQ0Ci0tLSBhL2xpYnByb2Nlc3Nncm91cC9BbmRyb2lkLmJwCisrKyBiL2xpYnByb2Nlc3Nncm91cC9BbmRyb2lkLmJwCkBAIC0yLDE1ICsyLDM0IEBACiAgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbIkFuZHJvaWQtQXBhY2hlLTIuMCJdLAogfQogCi1jY19kZWZhdWx0cyB7Ci0gICAgbmFtZTogImxpYnByb2Nlc3Nncm91cF9kZWZhdWx0cyIsCi0gICAgY3BwX3N0ZDogImdudSsrMjAiLAotICAgIGNmbGFnczogWwotICAgICAgICAiLVdhbGwiLAotICAgICAgICAiLVdlcnJvciIsCi0gICAgICAgICItV2V4aXQtdGltZS1kZXN0cnVjdG9ycyIsCi0gICAgICAgICItV25vLXVudXNlZC1wYXJhbWV0ZXIiLAorc29vbmdfY29uZmlnX21vZHVsZV90eXBlIHsKKyAgICBuYW1lOiAibGlicHJvY2Vzc2dyb3VwX2ZsYWdfYXdhcmVfY2NfZGVmYXVsdHMiLAorICAgIG1vZHVsZV90eXBlOiAiY2NfZGVmYXVsdHMiLAorICAgIGNvbmZpZ19uYW1lc3BhY2U6ICJBTkRST0lEIiwKKyAgICBib29sX3ZhcmlhYmxlczogWworICAgICAgICAibWVtY2dfdjJfZm9yY2VfZW5hYmxlZCIsCisgICAgICAgICJjZ3JvdXBfdjJfc3lzX2FwcF9pc29sYXRpb24iLAogICAgIF0sCisgICAgcHJvcGVydGllczogWworICAgICAgICAiY2ZsYWdzIiwKKyAgICBdLAorfQorCitsaWJwcm9jZXNzZ3JvdXBfZmxhZ19hd2FyZV9jY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYnByb2Nlc3Nncm91cF9idWlsZF9mbGFnc19jYyIsCisgICAgY3BwX3N0ZDogImdudSsrMjMiLAorICAgIHNvb25nX2NvbmZpZ192YXJpYWJsZXM6IHsKKyAgICAgICAgbWVtY2dfdjJfZm9yY2VfZW5hYmxlZDogeworICAgICAgICAgICAgY2ZsYWdzOiBbCisgICAgICAgICAgICAgICAgIi1ETUVNQ0dfVjJfRk9SQ0VfRU5BQkxFRD10cnVlIiwKKyAgICAgICAgICAgIF0sCisgICAgICAgIH0sCisgICAgICAgIGNncm91cF92Ml9zeXNfYXBwX2lzb2xhdGlvbjogeworICAgICAgICAgICAgY2ZsYWdzOiBbCisgICAgICAgICAgICAgICAgIi1EQ0dST1VQX1YyX1NZU19BUFBfSVNPTEFUSU9OPXRydWUiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgfSwKKyAgICB9LAogfQogCiBjY19saWJyYXJ5X2hlYWRlcnMgewpAQCAtNTMsMTYgKzcyLDEzIEBACiAgICAgcmVjb3ZlcnlfYXZhaWxhYmxlOiB0cnVlLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgcHJvZHVjdF9hdmFpbGFibGU6IHRydWUsCi0gICAgdm5kazogewotICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgICAgICBzdXBwb3J0X3N5c3RlbV9wcm9jZXNzOiB0cnVlLAotICAgIH0sCisgICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJiYXNlIiwKLSAgICAgICAgImxpYmNncm91cHJjIiwKICAgICBdLAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJqc29uY3BwIiwKKyAgICAgICAgImxpYnByb2Nlc3Nncm91cF91dGlsIiwKICAgICBdLAogICAgIC8vIGZvciBjdXRpbHMvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oCiAgICAgaGVhZGVyX2xpYnM6IFsKQEAgLTczLDcgKzg5LDcgQEAKICAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCiAgICAgICAgICJsaWJwcm9jZXNzZ3JvdXBfaGVhZGVycyIsCiAgICAgXSwKLSAgICBkZWZhdWx0czogWyJsaWJwcm9jZXNzZ3JvdXBfZGVmYXVsdHMiXSwKKyAgICBkZWZhdWx0czogWyJsaWJwcm9jZXNzZ3JvdXBfYnVpbGRfZmxhZ3NfY2MiXSwKICAgICBhcGV4X2F2YWlsYWJsZTogWwogICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCiAgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOmFueWFwZXgiLApAQCAtODQsNyArMTAwLDcgQEAKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJ0YXNrX3Byb2ZpbGVzX3Rlc3QiLAogICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotICAgIGRlZmF1bHRzOiBbImxpYnByb2Nlc3Nncm91cF9kZWZhdWx0cyJdLAorICAgIGRlZmF1bHRzOiBbImxpYnByb2Nlc3Nncm91cF9idWlsZF9mbGFnc19jYyJdLAogICAgIHNyY3M6IFsKICAgICAgICAgInRhc2tfcHJvZmlsZXNfdGVzdC5jcHAiLAogICAgIF0sCkBAIC05NCwxMCArMTEwLDEwIEBACiAgICAgXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYmFzZSIsCi0gICAgICAgICJsaWJjZ3JvdXByYyIsCiAgICAgICAgICJsaWJwcm9jZXNzZ3JvdXAiLAogICAgIF0sCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYmdtb2NrIiwKKyAgICAgICAgImxpYnByb2Nlc3Nncm91cF91dGlsIiwKICAgICBdLAogfQpkaWZmIC0tZ2l0IGEvbGlicHJvY2Vzc2dyb3VwL09XTkVSUyBiL2xpYnByb2Nlc3Nncm91cC9PV05FUlMKaW5kZXggZDVhYTcyMS4uYWNjZDdkZiAxMDA2NDQKLS0tIGEvbGlicHJvY2Vzc2dyb3VwL09XTkVSUworKysgYi9saWJwcm9jZXNzZ3JvdXAvT1dORVJTCkBAIC0xLDQgKzEsMyBAQAogIyBCdWcgY29tcG9uZW50OiAxMjkzMDMzCiBzdXJlbmJAZ29vZ2xlLmNvbQotdGptZXJjaWVyQGdvb2dsZS5jb20KLWNhcmxvc2dhbG9AZ29vZ2xlLmNvbQordGptZXJjaWVyQGdvb2dsZS5jb20KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJwcm9jZXNzZ3JvdXAvVEVTVF9NQVBQSU5HIGIvbGlicHJvY2Vzc2dyb3VwL1RFU1RfTUFQUElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjY3MGVmCi0tLSAvZGV2L251bGwKKysrIGIvbGlicHJvY2Vzc2dyb3VwL1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDcgQEAKK3sKKyAgInByZXN1Ym1pdC1sYXJnZSI6IFsKKyAgICB7CisgICAgICAibmFtZSI6ICJTdGFnZWRSb2xsYmFja1Rlc3QiCisgICAgfQorICBdCit9CmRpZmYgLS1naXQgYS9saWJwcm9jZXNzZ3JvdXAvYnVpbGRfZmxhZ3MuaCBiL2xpYnByb2Nlc3Nncm91cC9idWlsZF9mbGFncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjM2U3ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwcm9jZXNzZ3JvdXAvYnVpbGRfZmxhZ3MuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpZm5kZWYgTUVNQ0dfVjJfRk9SQ0VfRU5BQkxFRAorI2RlZmluZSBNRU1DR19WMl9GT1JDRV9FTkFCTEVEIGZhbHNlCisjZW5kaWYKKworI2lmbmRlZiBDR1JPVVBfVjJfU1lTX0FQUF9JU09MQVRJT04KKyNkZWZpbmUgQ0dST1VQX1YyX1NZU19BUFBfSVNPTEFUSU9OIGZhbHNlCisjZW5kaWYKKworbmFtZXNwYWNlIGFuZHJvaWQ6OmxpYnByb2Nlc3Nncm91cF9mbGFncyB7CisKK2lubGluZSBjb25zdGV2YWwgYm9vbCBmb3JjZV9tZW1jZ192MigpIHsKKyAgICByZXR1cm4gTUVNQ0dfVjJfRk9SQ0VfRU5BQkxFRDsKK30KKworaW5saW5lIGNvbnN0ZXZhbCBib29sIGNncm91cF92Ml9zeXNfYXBwX2lzb2xhdGlvbigpIHsKKyAgICByZXR1cm4gQ0dST1VQX1YyX1NZU19BUFBfSVNPTEFUSU9OOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZDo6bGlicHJvY2Vzc2dyb3VwX2ZsYWdzCmRpZmYgLS1naXQgYS9saWJwcm9jZXNzZ3JvdXAvY2dyb3VwX21hcC5jcHAgYi9saWJwcm9jZXNzZ3JvdXAvY2dyb3VwX21hcC5jcHAKaW5kZXggY2U3ZjEwYi4uMzJiZWYxMyAxMDA2NDQKLS0tIGEvbGlicHJvY2Vzc2dyb3VwL2Nncm91cF9tYXAuY3BwCisrKyBiL2xpYnByb2Nlc3Nncm91cC9jZ3JvdXBfbWFwLmNwcApAQCAtMTgsNjQgKzE4LDQ5IEBACiAjZGVmaW5lIExPR19UQUcgImxpYnByb2Nlc3Nncm91cCIKIAogI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxncnAuaD4KLSNpbmNsdWRlIDxwd2QuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPHN5cy9tb3VudC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8cmVnZXg+CiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CiAjaW5jbHVkZSA8Y2dyb3VwX21hcC5oPgotI2luY2x1ZGUgPGpzb24vcmVhZGVyLmg+Ci0jaW5jbHVkZSA8anNvbi92YWx1ZS5oPgogI2luY2x1ZGUgPHByb2Nlc3Nncm91cC9wcm9jZXNzZ3JvdXAuaD4KKyNpbmNsdWRlIDxwcm9jZXNzZ3JvdXAvdXRpbC5oPgogCi11c2luZyBhbmRyb2lkOjpiYXNlOjpHZXRCb29sUHJvcGVydHk7Ci11c2luZyBhbmRyb2lkOjpiYXNlOjpTdGFydHNXaXRoOwogdXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOwotdXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOwogdXNpbmcgYW5kcm9pZDo6YmFzZTo6V3JpdGVTdHJpbmdUb0ZpbGU7CiAKIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciogQ0dST1VQX1BST0NTX0ZJTEUgPSAiL2Nncm91cC5wcm9jcyI7CiBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIqIENHUk9VUF9UQVNLU19GSUxFID0gIi90YXNrcyI7CiBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIqIENHUk9VUF9UQVNLU19GSUxFX1YyID0gIi9jZ3JvdXAudGhyZWFkcyI7CiAKLXVpbnQzMl90IENncm91cENvbnRyb2xsZXI6OnZlcnNpb24oKSBjb25zdCB7Cit1aW50MzJfdCBDZ3JvdXBDb250cm9sbGVyV3JhcHBlcjo6dmVyc2lvbigpIGNvbnN0IHsKICAgICBDSEVDSyhIYXNWYWx1ZSgpKTsKLSAgICByZXR1cm4gQUNncm91cENvbnRyb2xsZXJfZ2V0VmVyc2lvbihjb250cm9sbGVyXyk7CisgICAgcmV0dXJuIGNvbnRyb2xsZXJfLT52ZXJzaW9uKCk7CiB9CiAKLWNvbnN0IGNoYXIqIENncm91cENvbnRyb2xsZXI6Om5hbWUoKSBjb25zdCB7Citjb25zdCBjaGFyKiBDZ3JvdXBDb250cm9sbGVyV3JhcHBlcjo6bmFtZSgpIGNvbnN0IHsKICAgICBDSEVDSyhIYXNWYWx1ZSgpKTsKLSAgICByZXR1cm4gQUNncm91cENvbnRyb2xsZXJfZ2V0TmFtZShjb250cm9sbGVyXyk7CisgICAgcmV0dXJuIGNvbnRyb2xsZXJfLT5uYW1lKCk7CiB9CiAKLWNvbnN0IGNoYXIqIENncm91cENvbnRyb2xsZXI6OnBhdGgoKSBjb25zdCB7Citjb25zdCBjaGFyKiBDZ3JvdXBDb250cm9sbGVyV3JhcHBlcjo6cGF0aCgpIGNvbnN0IHsKICAgICBDSEVDSyhIYXNWYWx1ZSgpKTsKLSAgICByZXR1cm4gQUNncm91cENvbnRyb2xsZXJfZ2V0UGF0aChjb250cm9sbGVyXyk7CisgICAgcmV0dXJuIGNvbnRyb2xsZXJfLT5wYXRoKCk7CiB9CiAKLWJvb2wgQ2dyb3VwQ29udHJvbGxlcjo6SGFzVmFsdWUoKSBjb25zdCB7Citib29sIENncm91cENvbnRyb2xsZXJXcmFwcGVyOjpIYXNWYWx1ZSgpIGNvbnN0IHsKICAgICByZXR1cm4gY29udHJvbGxlcl8gIT0gbnVsbHB0cjsKIH0KIAotYm9vbCBDZ3JvdXBDb250cm9sbGVyOjpJc1VzYWJsZSgpIHsKK2Jvb2wgQ2dyb3VwQ29udHJvbGxlcldyYXBwZXI6OklzVXNhYmxlKCkgewogICAgIGlmICghSGFzVmFsdWUoKSkgcmV0dXJuIGZhbHNlOwogCiAgICAgaWYgKHN0YXRlXyA9PSBVTktOT1dOKSB7CiAgICAgICAgIGlmIChfX2J1aWx0aW5fYXZhaWxhYmxlKGFuZHJvaWQgMzAsICopKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IEFDZ3JvdXBDb250cm9sbGVyX2dldEZsYWdzKGNvbnRyb2xsZXJfKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gY29udHJvbGxlcl8tPmZsYWdzKCk7CiAgICAgICAgICAgICBzdGF0ZV8gPSAoZmxhZ3MgJiBDR1JPVVBSQ19DT05UUk9MTEVSX0ZMQUdfTU9VTlRFRCkgIT0gMCA/IFVTQUJMRSA6IE1JU1NJTkc7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzdGF0ZV8gPSBhY2Nlc3MoR2V0UHJvY3NGaWxlUGF0aCgiIiwgMCwgMCkuY19zdHIoKSwgRl9PSykgPT0gMCA/IFVTQUJMRSA6IE1JU1NJTkc7CkBAIC04NSw3ICs3MCw3IEBACiAgICAgcmV0dXJuIHN0YXRlXyA9PSBVU0FCTEU7CiB9CiAKLXN0ZDo6c3RyaW5nIENncm91cENvbnRyb2xsZXI6OkdldFRhc2tzRmlsZVBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHJlbF9wYXRoKSBjb25zdCB7CitzdGQ6OnN0cmluZyBDZ3JvdXBDb250cm9sbGVyV3JhcHBlcjo6R2V0VGFza3NGaWxlUGF0aChjb25zdCBzdGQ6OnN0cmluZyYgcmVsX3BhdGgpIGNvbnN0IHsKICAgICBzdGQ6OnN0cmluZyB0YXNrc19wYXRoID0gcGF0aCgpOwogCiAgICAgaWYgKCFyZWxfcGF0aC5lbXB0eSgpKSB7CkBAIC05NCw4ICs3OSw4IEBACiAgICAgcmV0dXJuICh2ZXJzaW9uKCkgPT0gMSkgPyB0YXNrc19wYXRoICsgQ0dST1VQX1RBU0tTX0ZJTEUgOiB0YXNrc19wYXRoICsgQ0dST1VQX1RBU0tTX0ZJTEVfVjI7CiB9CiAKLXN0ZDo6c3RyaW5nIENncm91cENvbnRyb2xsZXI6OkdldFByb2NzRmlsZVBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHJlbF9wYXRoLCB1aWRfdCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCkgY29uc3Qgeworc3RkOjpzdHJpbmcgQ2dyb3VwQ29udHJvbGxlcldyYXBwZXI6OkdldFByb2NzRmlsZVBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHJlbF9wYXRoLCB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQpIGNvbnN0IHsKICAgICBzdGQ6OnN0cmluZyBwcm9jX3BhdGgocGF0aCgpKTsKICAgICBwcm9jX3BhdGguYXBwZW5kKCIvIikuYXBwZW5kKHJlbF9wYXRoKTsKICAgICBwcm9jX3BhdGggPSByZWdleF9yZXBsYWNlKHByb2NfcGF0aCwgc3RkOjpyZWdleCgiPHVpZD4iKSwgc3RkOjp0b19zdHJpbmcodWlkKSk7CkBAIC0xMDQsNyArODksNyBAQAogICAgIHJldHVybiBwcm9jX3BhdGguYXBwZW5kKENHUk9VUF9QUk9DU19GSUxFKTsKIH0KIAotYm9vbCBDZ3JvdXBDb250cm9sbGVyOjpHZXRUYXNrR3JvdXAoaW50IHRpZCwgc3RkOjpzdHJpbmcqIGdyb3VwKSBjb25zdCB7Citib29sIENncm91cENvbnRyb2xsZXJXcmFwcGVyOjpHZXRUYXNrR3JvdXAocGlkX3QgdGlkLCBzdGQ6OnN0cmluZyogZ3JvdXApIGNvbnN0IHsKICAgICBzdGQ6OnN0cmluZyBmaWxlX25hbWUgPSBTdHJpbmdQcmludGYoIi9wcm9jLyVkL2Nncm91cCIsIHRpZCk7CiAgICAgc3RkOjpzdHJpbmcgY29udGVudDsKICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmcoZmlsZV9uYW1lLCAmY29udGVudCkpIHsKQEAgLTE0Miw4ICsxMjcsOCBAQAogfQogCiBDZ3JvdXBNYXA6OkNncm91cE1hcCgpIHsKLSAgICBpZiAoIUxvYWRSY0ZpbGUoKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJDZ3JvdXBNYXA6OkxvYWRSY0ZpbGUgY2FsbGVkIGZvciBbIiA8PCBnZXRwaWQoKSA8PCAiXSBmYWlsZWQiOworICAgIGlmICghTG9hZERlc2NyaXB0b3JzKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2dyb3VwTWFwOjpMb2FkRGVzY3JpcHRvcnMgY2FsbGVkIGZvciBbIiA8PCBnZXRwaWQoKSA8PCAiXSBmYWlsZWQiOwogICAgIH0KIH0KIApAQCAtMTU0LDkgKzEzOSw5IEBACiAgICAgcmV0dXJuICppbnN0YW5jZTsKIH0KIAotYm9vbCBDZ3JvdXBNYXA6OkxvYWRSY0ZpbGUoKSB7Citib29sIENncm91cE1hcDo6TG9hZERlc2NyaXB0b3JzKCkgewogICAgIGlmICghbG9hZGVkXykgewotICAgICAgICBsb2FkZWRfID0gKEFDZ3JvdXBGaWxlX2dldFZlcnNpb24oKSAhPSAwKTsKKyAgICAgICAgbG9hZGVkXyA9IFJlYWREZXNjcmlwdG9ycygmZGVzY3JpcHRvcnNfKTsKICAgICB9CiAgICAgcmV0dXJuIGxvYWRlZF87CiB9CkBAIC0xNjQsODYgKzE0OSw1MSBAQAogdm9pZCBDZ3JvdXBNYXA6OlByaW50KCkgY29uc3QgewogICAgIGlmICghbG9hZGVkXykgewogICAgICAgICBMT0coRVJST1IpIDw8ICJDZ3JvdXBNYXA6OlByaW50IGNhbGxlZCBmb3IgWyIgPDwgZ2V0cGlkKCkKLSAgICAgICAgICAgICAgICAgICA8PCAiXSBmYWlsZWQsIFJDIGZpbGUgd2FzIG5vdCBpbml0aWFsaXplZCBwcm9wZXJseSI7CisgICAgICAgICAgICAgICAgICAgPDwgIl0gZmFpbGVkLCBjZ3JvdXBzIHdlcmUgbm90IGluaXRpYWxpemVkIHByb3Blcmx5IjsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBMT0coSU5GTykgPDwgIkZpbGUgdmVyc2lvbiA9ICIgPDwgQUNncm91cEZpbGVfZ2V0VmVyc2lvbigpOwotICAgIExPRyhJTkZPKSA8PCAiRmlsZSBjb250cm9sbGVyIGNvdW50ID0gIiA8PCBBQ2dyb3VwRmlsZV9nZXRDb250cm9sbGVyQ291bnQoKTsKKyAgICBMT0coSU5GTykgPDwgIkNvbnRyb2xsZXIgY291bnQgPSAiIDw8IGRlc2NyaXB0b3JzXy5zaXplKCk7CiAKICAgICBMT0coSU5GTykgPDwgIk1vdW50ZWQgY2dyb3VwczoiOwogCi0gICAgYXV0byBjb250cm9sbGVyX2NvdW50ID0gQUNncm91cEZpbGVfZ2V0Q29udHJvbGxlckNvdW50KCk7Ci0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvbnRyb2xsZXJfY291bnQ7ICsraSkgewotICAgICAgICBjb25zdCBBQ2dyb3VwQ29udHJvbGxlciogY29udHJvbGxlciA9IEFDZ3JvdXBGaWxlX2dldENvbnRyb2xsZXIoaSk7Ci0gICAgICAgIGlmIChfX2J1aWx0aW5fYXZhaWxhYmxlKGFuZHJvaWQgMzAsICopKSB7Ci0gICAgICAgICAgICBMT0coSU5GTykgPDwgIlx0IiA8PCBBQ2dyb3VwQ29udHJvbGxlcl9nZXROYW1lKGNvbnRyb2xsZXIpIDw8ICIgdmVyICIKLSAgICAgICAgICAgICAgICAgICAgICA8PCBBQ2dyb3VwQ29udHJvbGxlcl9nZXRWZXJzaW9uKGNvbnRyb2xsZXIpIDw8ICIgcGF0aCAiCi0gICAgICAgICAgICAgICAgICAgICAgPDwgQUNncm91cENvbnRyb2xsZXJfZ2V0UGF0aChjb250cm9sbGVyKSA8PCAiIGZsYWdzICIKLSAgICAgICAgICAgICAgICAgICAgICA8PCBBQ2dyb3VwQ29udHJvbGxlcl9nZXRGbGFncyhjb250cm9sbGVyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiXHQiIDw8IEFDZ3JvdXBDb250cm9sbGVyX2dldE5hbWUoY29udHJvbGxlcikgPDwgIiB2ZXIgIgotICAgICAgICAgICAgICAgICAgICAgIDw8IEFDZ3JvdXBDb250cm9sbGVyX2dldFZlcnNpb24oY29udHJvbGxlcikgPDwgIiBwYXRoICIKLSAgICAgICAgICAgICAgICAgICAgICA8PCBBQ2dyb3VwQ29udHJvbGxlcl9nZXRQYXRoKGNvbnRyb2xsZXIpOwotICAgICAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiBbbmFtZSwgZGVzY3JpcHRvcl0gOiBkZXNjcmlwdG9yc18pIHsKKyAgICAgICAgTE9HKElORk8pIDw8ICJcdCIgPDwgZGVzY3JpcHRvci5jb250cm9sbGVyKCktPm5hbWUoKSA8PCAiIHZlciAiCisgICAgICAgICAgICAgICAgICA8PCBkZXNjcmlwdG9yLmNvbnRyb2xsZXIoKS0+dmVyc2lvbigpIDw8ICIgcGF0aCAiCisgICAgICAgICAgICAgICAgICA8PCBkZXNjcmlwdG9yLmNvbnRyb2xsZXIoKS0+cGF0aCgpIDw8ICIgZmxhZ3MgIgorICAgICAgICAgICAgICAgICAgPDwgZGVzY3JpcHRvci5jb250cm9sbGVyKCktPmZsYWdzKCk7CiAgICAgfQogfQogCi1DZ3JvdXBDb250cm9sbGVyIENncm91cE1hcDo6RmluZENvbnRyb2xsZXIoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIGNvbnN0IHsKK0Nncm91cENvbnRyb2xsZXJXcmFwcGVyIENncm91cE1hcDo6RmluZENvbnRyb2xsZXIoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIGNvbnN0IHsKICAgICBpZiAoIWxvYWRlZF8pIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2dyb3VwTWFwOjpGaW5kQ29udHJvbGxlciBjYWxsZWQgZm9yIFsiIDw8IGdldHBpZCgpCi0gICAgICAgICAgICAgICAgICAgPDwgIl0gZmFpbGVkLCBSQyBmaWxlIHdhcyBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkiOwotICAgICAgICByZXR1cm4gQ2dyb3VwQ29udHJvbGxlcihudWxscHRyKTsKKyAgICAgICAgICAgICAgICAgICA8PCAiXSBmYWlsZWQsIGNncm91cHMgd2VyZSBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkiOworICAgICAgICByZXR1cm4gQ2dyb3VwQ29udHJvbGxlcldyYXBwZXIobnVsbHB0cik7CiAgICAgfQogCi0gICAgYXV0byBjb250cm9sbGVyX2NvdW50ID0gQUNncm91cEZpbGVfZ2V0Q29udHJvbGxlckNvdW50KCk7Ci0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvbnRyb2xsZXJfY291bnQ7ICsraSkgewotICAgICAgICBjb25zdCBBQ2dyb3VwQ29udHJvbGxlciogY29udHJvbGxlciA9IEFDZ3JvdXBGaWxlX2dldENvbnRyb2xsZXIoaSk7Ci0gICAgICAgIGlmIChuYW1lID09IEFDZ3JvdXBDb250cm9sbGVyX2dldE5hbWUoY29udHJvbGxlcikpIHsKLSAgICAgICAgICAgIHJldHVybiBDZ3JvdXBDb250cm9sbGVyKGNvbnRyb2xsZXIpOwotICAgICAgICB9CisgICAgaWYgKGNvbnN0IGF1dG8gaXQgPSBkZXNjcmlwdG9yc18uZmluZChuYW1lKTsgaXQgIT0gZGVzY3JpcHRvcnNfLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBDZ3JvdXBDb250cm9sbGVyV3JhcHBlcihpdC0+c2Vjb25kLmNvbnRyb2xsZXIoKSk7CiAgICAgfQogCi0gICAgcmV0dXJuIENncm91cENvbnRyb2xsZXIobnVsbHB0cik7CisgICAgcmV0dXJuIENncm91cENvbnRyb2xsZXJXcmFwcGVyKG51bGxwdHIpOwogfQogCi1DZ3JvdXBDb250cm9sbGVyIENncm91cE1hcDo6RmluZENvbnRyb2xsZXJCeVBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIGNvbnN0IHsKK0Nncm91cENvbnRyb2xsZXJXcmFwcGVyIENncm91cE1hcDo6RmluZENvbnRyb2xsZXJCeVBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIGNvbnN0IHsKICAgICBpZiAoIWxvYWRlZF8pIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2dyb3VwTWFwOjpGaW5kQ29udHJvbGxlckJ5UGF0aCBjYWxsZWQgZm9yIFsiIDw8IGdldHBpZCgpCi0gICAgICAgICAgICAgICAgICAgPDwgIl0gZmFpbGVkLCBSQyBmaWxlIHdhcyBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkiOwotICAgICAgICByZXR1cm4gQ2dyb3VwQ29udHJvbGxlcihudWxscHRyKTsKKyAgICAgICAgICAgICAgICAgICA8PCAiXSBmYWlsZWQsIGNncm91cHMgd2VyZSBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkiOworICAgICAgICByZXR1cm4gQ2dyb3VwQ29udHJvbGxlcldyYXBwZXIobnVsbHB0cik7CiAgICAgfQogCi0gICAgYXV0byBjb250cm9sbGVyX2NvdW50ID0gQUNncm91cEZpbGVfZ2V0Q29udHJvbGxlckNvdW50KCk7Ci0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvbnRyb2xsZXJfY291bnQ7ICsraSkgewotICAgICAgICBjb25zdCBBQ2dyb3VwQ29udHJvbGxlciogY29udHJvbGxlciA9IEFDZ3JvdXBGaWxlX2dldENvbnRyb2xsZXIoaSk7Ci0gICAgICAgIGlmIChTdGFydHNXaXRoKHBhdGgsIEFDZ3JvdXBDb250cm9sbGVyX2dldFBhdGgoY29udHJvbGxlcikpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ2dyb3VwQ29udHJvbGxlcihjb250cm9sbGVyKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIFtuYW1lLCBkZXNjcmlwdG9yXSA6IGRlc2NyaXB0b3JzXykgeworICAgICAgICBpZiAocGF0aC5zdGFydHNfd2l0aChkZXNjcmlwdG9yLmNvbnRyb2xsZXIoKS0+cGF0aCgpKSkgeworICAgICAgICAgICAgcmV0dXJuIENncm91cENvbnRyb2xsZXJXcmFwcGVyKGRlc2NyaXB0b3IuY29udHJvbGxlcigpKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBDZ3JvdXBDb250cm9sbGVyKG51bGxwdHIpOworICAgIHJldHVybiBDZ3JvdXBDb250cm9sbGVyV3JhcHBlcihudWxscHRyKTsKIH0KIAotaW50IENncm91cE1hcDo6QWN0aXZhdGVDb250cm9sbGVycyhjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgY29uc3QgewotICAgIGlmIChfX2J1aWx0aW5fYXZhaWxhYmxlKGFuZHJvaWQgMzAsICopKSB7Ci0gICAgICAgIGF1dG8gY29udHJvbGxlcl9jb3VudCA9IEFDZ3JvdXBGaWxlX2dldENvbnRyb2xsZXJDb3VudCgpOwotICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY29udHJvbGxlcl9jb3VudDsgKytpKSB7Ci0gICAgICAgICAgICBjb25zdCBBQ2dyb3VwQ29udHJvbGxlciogY29udHJvbGxlciA9IEFDZ3JvdXBGaWxlX2dldENvbnRyb2xsZXIoaSk7Ci0gICAgICAgICAgICBjb25zdCB1aW50MzJfdCBmbGFncyA9IEFDZ3JvdXBDb250cm9sbGVyX2dldEZsYWdzKGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgaWYgKGZsYWdzICYgQ0dST1VQUkNfQ09OVFJPTExFUl9GTEFHX05FRURTX0FDVElWQVRJT04pIHsKLSAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdHIoIisiKTsKLSAgICAgICAgICAgICAgICBzdHIuYXBwZW5kKEFDZ3JvdXBDb250cm9sbGVyX2dldE5hbWUoY29udHJvbGxlcikpOwotICAgICAgICAgICAgICAgIGlmICghV3JpdGVTdHJpbmdUb0ZpbGUoc3RyLCBwYXRoICsgIi9jZ3JvdXAuc3VidHJlZV9jb250cm9sIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgQ0dST1VQUkNfQ09OVFJPTExFUl9GTEFHX09QVElPTkFMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQTE9HKFdBUk5JTkcpIDw8ICJBY3RpdmF0aW9uIG9mIGNncm91cCBjb250cm9sbGVyICIgPDwgc3RyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZmFpbGVkIGluIHBhdGggIiA8PCBwYXRoOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIC1FTk9TWVM7Citib29sIENncm91cE1hcDo6QWN0aXZhdGVDb250cm9sbGVycyhjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgY29uc3QgeworICAgIHJldHVybiA6OkFjdGl2YXRlQ29udHJvbGxlcnMocGF0aCwgZGVzY3JpcHRvcnNfKTsKIH0KZGlmZiAtLWdpdCBhL2xpYnByb2Nlc3Nncm91cC9jZ3JvdXBfbWFwLmggYi9saWJwcm9jZXNzZ3JvdXAvY2dyb3VwX21hcC5oCmluZGV4IDVjZGY4YjIuLmZiOTkwNzYgMTAwNjQ0Ci0tLSBhL2xpYnByb2Nlc3Nncm91cC9jZ3JvdXBfbWFwLmgKKysrIGIvbGlicHJvY2Vzc2dyb3VwL2Nncm91cF9tYXAuaApAQCAtMTYsMjMgKzE2LDIwIEBACiAKICNwcmFnbWEgb25jZQogCi0jaW5jbHVkZSA8c3lzL2NkZWZzLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPGNzdGRpbnQ+CiAjaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KIAotI2luY2x1ZGUgPGFuZHJvaWQvY2dyb3VwcmMuaD4KKyNpbmNsdWRlIDxwcm9jZXNzZ3JvdXAvY2dyb3VwX2NvbnRyb2xsZXIuaD4KKyNpbmNsdWRlIDxwcm9jZXNzZ3JvdXAvdXRpbC5oPgogCi0vLyBDb252ZW5pZW50IHdyYXBwZXIgb2YgYW4gQUNncm91cENvbnRyb2xsZXIgcG9pbnRlci4KLWNsYXNzIENncm91cENvbnRyb2xsZXIgeworLy8gQ29udmVuaWVudCB3cmFwcGVyIG9mIGEgQ2dyb3VwQ29udHJvbGxlciBwb2ludGVyLgorY2xhc3MgQ2dyb3VwQ29udHJvbGxlcldyYXBwZXIgewogICBwdWJsaWM6CiAgICAgLy8gRG9lcyBub3Qgb3duIGNvbnRyb2xsZXIKLSAgICBleHBsaWNpdCBDZ3JvdXBDb250cm9sbGVyKGNvbnN0IEFDZ3JvdXBDb250cm9sbGVyKiBjb250cm9sbGVyKQotICAgICAgICA6IGNvbnRyb2xsZXJfKGNvbnRyb2xsZXIpLCBzdGF0ZV8oVU5LTk9XTikge30KKyAgICBleHBsaWNpdCBDZ3JvdXBDb250cm9sbGVyV3JhcHBlcihjb25zdCBDZ3JvdXBDb250cm9sbGVyKiBjb250cm9sbGVyKQorICAgICAgICA6IGNvbnRyb2xsZXJfKGNvbnRyb2xsZXIpIHt9CiAKICAgICB1aW50MzJfdCB2ZXJzaW9uKCkgY29uc3Q7CiAgICAgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0OwpAQCAtNDMsNyArNDAsOCBAQAogCiAgICAgc3RkOjpzdHJpbmcgR2V0VGFza3NGaWxlUGF0aChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgY29uc3Q7CiAgICAgc3RkOjpzdHJpbmcgR2V0UHJvY3NGaWxlUGF0aChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgdWlkX3QgdWlkLCBwaWRfdCBwaWQpIGNvbnN0OwotICAgIGJvb2wgR2V0VGFza0dyb3VwKGludCB0aWQsIHN0ZDo6c3RyaW5nKiBncm91cCkgY29uc3Q7CisgICAgYm9vbCBHZXRUYXNrR3JvdXAocGlkX3QgdGlkLCBzdGQ6OnN0cmluZyogZ3JvdXApIGNvbnN0OworCiAgIHByaXZhdGU6CiAgICAgZW51bSBDb250cm9sbGVyU3RhdGUgewogICAgICAgICBVTktOT1dOID0gMCwKQEAgLTUxLDIzICs0OSwyMSBAQAogICAgICAgICBNSVNTSU5HID0gMiwKICAgICB9OwogCi0gICAgY29uc3QgQUNncm91cENvbnRyb2xsZXIqIGNvbnRyb2xsZXJfID0gbnVsbHB0cjsKLSAgICBDb250cm9sbGVyU3RhdGUgc3RhdGVfOworICAgIGNvbnN0IENncm91cENvbnRyb2xsZXIqIGNvbnRyb2xsZXJfID0gbnVsbHB0cjsgLy8gQ2dyb3VwTWFwIG93bnMgdGhlIG9iamVjdCBiZWhpbmQgdGhpcyBwb2ludGVyCisgICAgQ29udHJvbGxlclN0YXRlIHN0YXRlXyA9IENvbnRyb2xsZXJTdGF0ZTo6VU5LTk9XTjsKIH07CiAKIGNsYXNzIENncm91cE1hcCB7CiAgIHB1YmxpYzoKLSAgICAvLyBTZWxpbnV4IHBvbGljeSBlbnN1cmVzIG9ubHkgaW5pdCBwcm9jZXNzIGNhbiBzdWNjZXNzZnVsbHkgdXNlIHRoaXMgZnVuY3Rpb24KLSAgICBzdGF0aWMgYm9vbCBTZXR1cENncm91cHMoKTsKLQogICAgIHN0YXRpYyBDZ3JvdXBNYXAmIEdldEluc3RhbmNlKCk7Ci0gICAgQ2dyb3VwQ29udHJvbGxlciBGaW5kQ29udHJvbGxlcihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgY29uc3Q7Ci0gICAgQ2dyb3VwQ29udHJvbGxlciBGaW5kQ29udHJvbGxlckJ5UGF0aChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgY29uc3Q7Ci0gICAgaW50IEFjdGl2YXRlQ29udHJvbGxlcnMoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIGNvbnN0OworICAgIENncm91cENvbnRyb2xsZXJXcmFwcGVyIEZpbmRDb250cm9sbGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSBjb25zdDsKKyAgICBDZ3JvdXBDb250cm9sbGVyV3JhcHBlciBGaW5kQ29udHJvbGxlckJ5UGF0aChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgY29uc3Q7CisgICAgYm9vbCBBY3RpdmF0ZUNvbnRyb2xsZXJzKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSBjb25zdDsKIAogICBwcml2YXRlOgogICAgIGJvb2wgbG9hZGVkXyA9IGZhbHNlOworICAgIENncm91cERlc2NyaXB0b3JNYXAgZGVzY3JpcHRvcnNfOwogICAgIENncm91cE1hcCgpOwotICAgIGJvb2wgTG9hZFJjRmlsZSgpOworICAgIGJvb2wgTG9hZERlc2NyaXB0b3JzKCk7CiAgICAgdm9pZCBQcmludCgpIGNvbnN0OwogfTsKZGlmZiAtLWdpdCBhL2xpYnByb2Nlc3Nncm91cC9jZ3JvdXByYy9BbmRyb2lkLmJwIGIvbGlicHJvY2Vzc2dyb3VwL2Nncm91cHJjL0FuZHJvaWQuYnAKaW5kZXggNzUyMmNmZS4uMzhiMmZhMyAxMDA2NDQKLS0tIGEvbGlicHJvY2Vzc2dyb3VwL2Nncm91cHJjL0FuZHJvaWQuYnAKKysrIGIvbGlicHJvY2Vzc2dyb3VwL2Nncm91cHJjL0FuZHJvaWQuYnAKQEAgLTMyLDggKzMyLDggQEAKICAgICAgICAgc3ltYm9sX2ZpbGU6ICJsaWJjZ3JvdXByYy5tYXAudHh0IiwKICAgICB9LAogICAgIHNyY3M6IFsKLSAgICAgICAgImNncm91cF9jb250cm9sbGVyLmNwcCIsCi0gICAgICAgICJjZ3JvdXBfZmlsZS5jcHAiLAorICAgICAgICAiYV9jZ3JvdXBfY29udHJvbGxlci5jcHAiLAorICAgICAgICAiYV9jZ3JvdXBfZmlsZS5jcHAiLAogICAgIF0sCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2FsbCIsCkBAIC00OSw3ICs0OSw4IEBACiAgICAgICAgICJsaWJiYXNlIiwKICAgICBdLAogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJjZ3JvdXByY19mb3JtYXQiLAorICAgICAgICAibGlianNvbmNwcCIsCisgICAgICAgICJsaWJwcm9jZXNzZ3JvdXBfdXRpbCIsCiAgICAgXSwKICAgICBzdHViczogewogICAgICAgICBzeW1ib2xfZmlsZTogImxpYmNncm91cHJjLm1hcC50eHQiLApkaWZmIC0tZ2l0IGEvbGlicHJvY2Vzc2dyb3VwL2Nncm91cHJjL2Nncm91cF9jb250cm9sbGVyLmNwcCBiL2xpYnByb2Nlc3Nncm91cC9jZ3JvdXByYy9hX2Nncm91cF9jb250cm9sbGVyLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGlicHJvY2Vzc2dyb3VwL2Nncm91cHJjL2Nncm91cF9jb250cm9sbGVyLmNwcApyZW5hbWUgdG8gbGlicHJvY2Vzc2dyb3VwL2Nncm91cHJjL2FfY2dyb3VwX2NvbnRyb2xsZXIuY3BwCmRpZmYgLS1naXQgYS9saWJwcm9jZXNzZ3JvdXAvY2dyb3VwcmMvYV9jZ3JvdXBfZmlsZS5jcHAgYi9saWJwcm9jZXNzZ3JvdXAvY2dyb3VwcmMvYV9jZ3JvdXBfZmlsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNjODM3NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnByb2Nlc3Nncm91cC9jZ3JvdXByYy9hX2Nncm91cF9maWxlLmNwcApAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGl0ZXJhdG9yPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2Nncm91cHJjLmg+CisjaW5jbHVkZSA8cHJvY2Vzc2dyb3VwL3V0aWwuaD4KKworI2luY2x1ZGUgImNncm91cHJjX2ludGVybmFsLmgiCisKK3N0YXRpYyBDZ3JvdXBEZXNjcmlwdG9yTWFwKiBMb2FkRGVzY3JpcHRvcnMoKSB7CisgICAgQ2dyb3VwRGVzY3JpcHRvck1hcCogZGVzY3JpcHRvcnMgPSBuZXcgQ2dyb3VwRGVzY3JpcHRvck1hcDsKKyAgICBpZiAoIVJlYWREZXNjcmlwdG9ycyhkZXNjcmlwdG9ycykpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGxvYWQgY2dyb3VwIGRlc2NyaXB0aW9uIGZpbGUiOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIGRlc2NyaXB0b3JzOworfQorCitzdGF0aWMgY29uc3QgQ2dyb3VwRGVzY3JpcHRvck1hcCogR2V0SW5zdGFuY2UoKSB7CisgICAgLy8gRGVsaWJlcmF0ZWx5IGxlYWsgdGhpcyBvYmplY3QgKG5vdCBtdW5tYXApIHRvIGF2b2lkIGEgcmFjZSBiZXR3ZWVuIGRlc3RydWN0aW9uIG9uCisgICAgLy8gcHJvY2VzcyBleGl0IGFuZCBjb25jdXJyZW50IGFjY2VzcyBmcm9tIGFub3RoZXIgdGhyZWFkLgorICAgIHN0YXRpYyBjb25zdCBDZ3JvdXBEZXNjcmlwdG9yTWFwKiBkZXNjcmlwdG9ycyA9IExvYWREZXNjcmlwdG9ycygpOworICAgIHJldHVybiBkZXNjcmlwdG9yczsKK30KKwordWludDMyX3QgQUNncm91cEZpbGVfZ2V0VmVyc2lvbigpIHsKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IEZJTEVfVkVSU0lPTl8xID0gMTsKKyAgICBhdXRvIGRlc2NyaXB0b3JzID0gR2V0SW5zdGFuY2UoKTsKKyAgICBpZiAoZGVzY3JpcHRvcnMgPT0gbnVsbHB0cikgcmV0dXJuIDA7CisgICAgLy8gVGhlcmUgaGFzIG9ubHkgZXZlciBiZWVuIG9uZSB2ZXJzaW9uLCBhbmQgdGhlcmUgd2lsbCBiZSBubyBtb3JlIHNpbmNlIGNncm91cC5yYyBpcyBubyBtb3JlCisgICAgcmV0dXJuIEZJTEVfVkVSU0lPTl8xOworfQorCit1aW50MzJfdCBBQ2dyb3VwRmlsZV9nZXRDb250cm9sbGVyQ291bnQoKSB7CisgICAgYXV0byBkZXNjcmlwdG9ycyA9IEdldEluc3RhbmNlKCk7CisgICAgaWYgKGRlc2NyaXB0b3JzID09IG51bGxwdHIpIHJldHVybiAwOworICAgIHJldHVybiBkZXNjcmlwdG9ycy0+c2l6ZSgpOworfQorCitjb25zdCBBQ2dyb3VwQ29udHJvbGxlciogQUNncm91cEZpbGVfZ2V0Q29udHJvbGxlcih1aW50MzJfdCBpbmRleCkgeworICAgIGF1dG8gZGVzY3JpcHRvcnMgPSBHZXRJbnN0YW5jZSgpOworICAgIGlmIChkZXNjcmlwdG9ycyA9PSBudWxscHRyKSByZXR1cm4gbnVsbHB0cjsKKyAgICBDSEVDSyhpbmRleCA8IGRlc2NyaXB0b3JzLT5zaXplKCkpOworICAgIC8vIEFsdGhvdWdoIHRoZSBvYmplY3QgaXMgbm90IGFjdHVhbGx5IGFuIEFDZ3JvdXBDb250cm9sbGVyIG9iamVjdCwgYWxsIEFDZ3JvdXBDb250cm9sbGVyXyoKKyAgICAvLyBmdW5jdGlvbnMgaW1wbGljaXRseSBjb252ZXJ0IEFDZ3JvdXBDb250cm9sbGVyKiBiYWNrIHRvIENncm91cENvbnRyb2xsZXIqIGJlZm9yZSBpbnZva2luZworICAgIC8vIG1lbWJlciBmdW5jdGlvbnMuCisgICAgY29uc3QgQ2dyb3VwQ29udHJvbGxlciogcCA9IHN0ZDo6bmV4dChkZXNjcmlwdG9ycy0+YmVnaW4oKSwgaW5kZXgpLT5zZWNvbmQuY29udHJvbGxlcigpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBBQ2dyb3VwQ29udHJvbGxlcio+KHApOworfQpkaWZmIC0tZ2l0IGEvbGlicHJvY2Vzc2dyb3VwL2Nncm91cHJjL2Nncm91cF9maWxlLmNwcCBiL2xpYnByb2Nlc3Nncm91cC9jZ3JvdXByYy9jZ3JvdXBfZmlsZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNmQ4NDEuLjAwMDAwMDAKLS0tIGEvbGlicHJvY2Vzc2dyb3VwL2Nncm91cHJjL2Nncm91cF9maWxlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2Nncm91cHJjLmg+Ci0jaW5jbHVkZSA8cHJvY2Vzc2dyb3VwL3Byb2Nlc3Nncm91cC5oPgotCi0jaW5jbHVkZSAiY2dyb3VwcmNfaW50ZXJuYWwuaCIKLQotdXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOwotdXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOwotCi11c2luZyBhbmRyb2lkOjpjZ3JvdXByYzo6Zm9ybWF0OjpDZ3JvdXBDb250cm9sbGVyOwotdXNpbmcgYW5kcm9pZDo6Y2dyb3VwcmM6OmZvcm1hdDo6Q2dyb3VwRmlsZTsKLQotc3RhdGljIENncm91cEZpbGUqIExvYWRSY0ZpbGUoKSB7Ci0gICAgc3RydWN0IHN0YXQgc2I7Ci0KLSAgICB1bmlxdWVfZmQgZmQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oQ0dST1VQU19SQ19QQVRILCBPX1JET05MWSB8IE9fQ0xPRVhFQykpKTsKLSAgICBpZiAoZmQgPCAwKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJvcGVuKCkgZmFpbGVkIGZvciAiIDw8IENHUk9VUFNfUkNfUEFUSDsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotCi0gICAgaWYgKGZzdGF0KGZkLCAmc2IpIDwgMCkgewotICAgICAgICBQTE9HKEVSUk9SKSA8PCAiZnN0YXQoKSBmYWlsZWQgZm9yICIgPDwgQ0dST1VQU19SQ19QQVRIOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICBzaXplX3QgZmlsZV9zaXplID0gc2Iuc3Rfc2l6ZTsKLSAgICBpZiAoZmlsZV9zaXplIDwgc2l6ZW9mKENncm91cEZpbGUpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgZmlsZSBmb3JtYXQgIiA8PCBDR1JPVVBTX1JDX1BBVEg7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLQotICAgIENncm91cEZpbGUqIGZpbGVfZGF0YSA9IChDZ3JvdXBGaWxlKiltbWFwKG51bGxwdHIsIGZpbGVfc2l6ZSwgUFJPVF9SRUFELCBNQVBfU0hBUkVELCBmZCwgMCk7Ci0gICAgaWYgKGZpbGVfZGF0YSA9PSBNQVBfRkFJTEVEKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gbW1hcCAiIDw8IENHUk9VUFNfUkNfUEFUSDsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotCi0gICAgaWYgKGZpbGVfZGF0YS0+dmVyc2lvbl8gIT0gQ2dyb3VwRmlsZTo6RklMRV9DVVJSX1ZFUlNJT04pIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCBDR1JPVVBTX1JDX1BBVEggPDwgIiBmaWxlIHZlcnNpb24gbWlzbWF0Y2giOwotICAgICAgICBtdW5tYXAoZmlsZV9kYXRhLCBmaWxlX3NpemUpOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICBhdXRvIGV4cGVjdGVkID0gc2l6ZW9mKENncm91cEZpbGUpICsgZmlsZV9kYXRhLT5jb250cm9sbGVyX2NvdW50XyAqIHNpemVvZihDZ3JvdXBDb250cm9sbGVyKTsKLSAgICBpZiAoZmlsZV9zaXplICE9IGV4cGVjdGVkKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgQ0dST1VQU19SQ19QQVRIIDw8ICIgZmlsZSBoYXMgaW52YWxpZCBzaXplLCBleHBlY3RlZCAiIDw8IGV4cGVjdGVkCi0gICAgICAgICAgICAgICAgICAgPDwgIiwgYWN0dWFsICIgPDwgZmlsZV9zaXplOwotICAgICAgICBtdW5tYXAoZmlsZV9kYXRhLCBmaWxlX3NpemUpOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmlsZV9kYXRhOwotfQotCi1zdGF0aWMgQ2dyb3VwRmlsZSogR2V0SW5zdGFuY2UoKSB7Ci0gICAgLy8gRGVsaWJlcmF0ZWx5IGxlYWsgdGhpcyBvYmplY3QgKG5vdCBtdW5tYXApIHRvIGF2b2lkIGEgcmFjZSBiZXR3ZWVuIGRlc3RydWN0aW9uIG9uCi0gICAgLy8gcHJvY2VzcyBleGl0IGFuZCBjb25jdXJyZW50IGFjY2VzcyBmcm9tIGFub3RoZXIgdGhyZWFkLgotICAgIHN0YXRpYyBhdXRvKiBmaWxlID0gTG9hZFJjRmlsZSgpOwotICAgIHJldHVybiBmaWxlOwotfQotCi11aW50MzJfdCBBQ2dyb3VwRmlsZV9nZXRWZXJzaW9uKCkgewotICAgIGF1dG8gZmlsZSA9IEdldEluc3RhbmNlKCk7Ci0gICAgaWYgKGZpbGUgPT0gbnVsbHB0cikgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIGZpbGUtPnZlcnNpb25fOwotfQotCi11aW50MzJfdCBBQ2dyb3VwRmlsZV9nZXRDb250cm9sbGVyQ291bnQoKSB7Ci0gICAgYXV0byBmaWxlID0gR2V0SW5zdGFuY2UoKTsKLSAgICBpZiAoZmlsZSA9PSBudWxscHRyKSByZXR1cm4gMDsKLSAgICByZXR1cm4gZmlsZS0+Y29udHJvbGxlcl9jb3VudF87Ci19Ci0KLWNvbnN0IEFDZ3JvdXBDb250cm9sbGVyKiBBQ2dyb3VwRmlsZV9nZXRDb250cm9sbGVyKHVpbnQzMl90IGluZGV4KSB7Ci0gICAgYXV0byBmaWxlID0gR2V0SW5zdGFuY2UoKTsKLSAgICBpZiAoZmlsZSA9PSBudWxscHRyKSByZXR1cm4gbnVsbHB0cjsKLSAgICBDSEVDSyhpbmRleCA8IGZpbGUtPmNvbnRyb2xsZXJfY291bnRfKTsKLSAgICAvLyBBbHRob3VnaCB0aGUgb2JqZWN0IGlzIG5vdCBhY3R1YWxseSBhbiBBQ2dyb3VwQ29udHJvbGxlciBvYmplY3QsIGFsbCBBQ2dyb3VwQ29udHJvbGxlcl8qCi0gICAgLy8gZnVuY3Rpb25zIGltcGxpY2l0bHkgY29udmVydCBBQ2dyb3VwQ29udHJvbGxlciogYmFjayB0byBDZ3JvdXBDb250cm9sbGVyKiBiZWZvcmUgaW52b2tpbmcKLSAgICAvLyBtZW1iZXIgZnVuY3Rpb25zLgotICAgIHJldHVybiBzdGF0aWNfY2FzdDxBQ2dyb3VwQ29udHJvbGxlcio+KCZmaWxlLT5jb250cm9sbGVyc19baW5kZXhdKTsKLX0KZGlmZiAtLWdpdCBhL2xpYnByb2Nlc3Nncm91cC9jZ3JvdXByYy9jZ3JvdXByY19pbnRlcm5hbC5oIGIvbGlicHJvY2Vzc2dyb3VwL2Nncm91cHJjL2Nncm91cHJjX2ludGVybmFsLmgKaW5kZXggY2QwMmYwMy4uZDUxNzcwMyAxMDA2NDQKLS0tIGEvbGlicHJvY2Vzc2dyb3VwL2Nncm91cHJjL2Nncm91cHJjX2ludGVybmFsLmgKKysrIGIvbGlicHJvY2Vzc2dyb3VwL2Nncm91cHJjL2Nncm91cHJjX2ludGVybmFsLmgKQEAgLTE2LDkgKzE2LDYgQEAKIAogI3ByYWdtYSBvbmNlCiAKLSNpbmNsdWRlIDxhbmRyb2lkL2Nncm91cHJjLmg+CisjaW5jbHVkZSA8cHJvY2Vzc2dyb3VwL2Nncm91cF9jb250cm9sbGVyLmg+CiAKLSNpbmNsdWRlIDxwcm9jZXNzZ3JvdXAvZm9ybWF0L2Nncm91cF9jb250cm9sbGVyLmg+Ci0jaW5jbHVkZSA8cHJvY2Vzc2dyb3VwL2Zvcm1hdC9jZ3JvdXBfZmlsZS5oPgotCi1zdHJ1Y3QgQUNncm91cENvbnRyb2xsZXIgOiBhbmRyb2lkOjpjZ3JvdXByYzo6Zm9ybWF0OjpDZ3JvdXBDb250cm9sbGVyIHt9Oworc3RydWN0IEFDZ3JvdXBDb250cm9sbGVyIDogQ2dyb3VwQ29udHJvbGxlciB7fTsKZGlmZiAtLWdpdCBhL2xpYnByb2Nlc3Nncm91cC9jZ3JvdXByY19mb3JtYXQvaW5jbHVkZS9wcm9jZXNzZ3JvdXAvZm9ybWF0L2Nncm91cF9maWxlLmggYi9saWJwcm9jZXNzZ3JvdXAvY2dyb3VwcmNfZm9ybWF0L2luY2x1ZGUvcHJvY2Vzc2dyb3VwL2Zvcm1hdC9jZ3JvdXBfZmlsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTY3OGExLi4wMDAwMDAwCi0tLSBhL2xpYnByb2Nlc3Nncm91cC9jZ3JvdXByY19mb3JtYXQvaW5jbHVkZS9wcm9jZXNzZ3JvdXAvZm9ybWF0L2Nncm91cF9maWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxwcm9jZXNzZ3JvdXAvZm9ybWF0L2Nncm91cF9jb250cm9sbGVyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBjZ3JvdXByYyB7Ci1uYW1lc3BhY2UgZm9ybWF0IHsKLQotc3RydWN0IENncm91cEZpbGUgewotICAgIHVpbnQzMl90IHZlcnNpb25fOwotICAgIHVpbnQzMl90IGNvbnRyb2xsZXJfY291bnRfOwotICAgIENncm91cENvbnRyb2xsZXIgY29udHJvbGxlcnNfW107Ci0KLSAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IEZJTEVfVkVSU0lPTl8xID0gMTsKLSAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IEZJTEVfQ1VSUl9WRVJTSU9OID0gRklMRV9WRVJTSU9OXzE7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZm9ybWF0Ci19ICAvLyBuYW1lc3BhY2UgY2dyb3VwcmMKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJwcm9jZXNzZ3JvdXAvaW5jbHVkZS9wcm9jZXNzZ3JvdXAvcHJvY2Vzc2dyb3VwLmggYi9saWJwcm9jZXNzZ3JvdXAvaW5jbHVkZS9wcm9jZXNzZ3JvdXAvcHJvY2Vzc2dyb3VwLmgKaW5kZXggZGJhZWI5My4uODA1Nzc1NyAxMDA2NDQKLS0tIGEvbGlicHJvY2Vzc2dyb3VwL2luY2x1ZGUvcHJvY2Vzc2dyb3VwL3Byb2Nlc3Nncm91cC5oCisrKyBiL2xpYnByb2Nlc3Nncm91cC9pbmNsdWRlL3Byb2Nlc3Nncm91cC9wcm9jZXNzZ3JvdXAuaApAQCAtMjYsMjUgKzI2LDI3IEBACiAKIF9fQkVHSU5fREVDTFMKIAotc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBDR1JPVVBWMl9DT05UUk9MTEVSX05BTUUgPSAiY2dyb3VwMiI7CitzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIqIENHUk9VUFYyX0hJRVJBUkNIWV9OQU1FID0gImNncm91cDIiOworW1tkZXByZWNhdGVkXV0gc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBDR1JPVVBWMl9DT05UUk9MTEVSX05BTUUgPSAiY2dyb3VwMiI7CiAKIGJvb2wgQ2dyb3Vwc0F2YWlsYWJsZSgpOwogYm9vbCBDZ3JvdXBHZXRDb250cm9sbGVyUGF0aChjb25zdCBzdGQ6OnN0cmluZyYgY2dyb3VwX25hbWUsIHN0ZDo6c3RyaW5nKiBwYXRoKTsKIGJvb2wgQ2dyb3VwR2V0Q29udHJvbGxlckZyb21QYXRoKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBzdGQ6OnN0cmluZyogY2dyb3VwX25hbWUpOwogYm9vbCBDZ3JvdXBHZXRBdHRyaWJ1dGVQYXRoKGNvbnN0IHN0ZDo6c3RyaW5nJiBhdHRyX25hbWUsIHN0ZDo6c3RyaW5nKiBwYXRoKTsKLWJvb2wgQ2dyb3VwR2V0QXR0cmlidXRlUGF0aEZvclRhc2soY29uc3Qgc3RkOjpzdHJpbmcmIGF0dHJfbmFtZSwgaW50IHRpZCwgc3RkOjpzdHJpbmcqIHBhdGgpOworYm9vbCBDZ3JvdXBHZXRBdHRyaWJ1dGVQYXRoRm9yVGFzayhjb25zdCBzdGQ6OnN0cmluZyYgYXR0cl9uYW1lLCBwaWRfdCB0aWQsIHN0ZDo6c3RyaW5nKiBwYXRoKTsKIAotYm9vbCBTZXRUYXNrUHJvZmlsZXMoaW50IHRpZCwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwcm9maWxlcywgYm9vbCB1c2VfZmRfY2FjaGUgPSBmYWxzZSk7Citib29sIFNldFRhc2tQcm9maWxlcyhwaWRfdCB0aWQsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcHJvZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICBib29sIHVzZV9mZF9jYWNoZSA9IGZhbHNlKTsKIGJvb2wgU2V0UHJvY2Vzc1Byb2ZpbGVzKHVpZF90IHVpZCwgcGlkX3QgcGlkLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHByb2ZpbGVzKTsKIGJvb2wgU2V0VXNlclByb2ZpbGVzKHVpZF90IHVpZCwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwcm9maWxlcyk7CiAKIF9fRU5EX0RFQ0xTCiAKLWJvb2wgU2V0VGFza1Byb2ZpbGVzKGludCB0aWQsIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxzdGQ6OnN0cmluZ192aWV3PiBwcm9maWxlcywKK2Jvb2wgU2V0VGFza1Byb2ZpbGVzKHBpZF90IHRpZCwgc3RkOjppbml0aWFsaXplcl9saXN0PHN0ZDo6c3RyaW5nX3ZpZXc+IHByb2ZpbGVzLAogICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfZmRfY2FjaGUgPSBmYWxzZSk7CiBib29sIFNldFByb2Nlc3NQcm9maWxlcyh1aWRfdCB1aWQsIHBpZF90IHBpZCwgc3RkOjppbml0aWFsaXplcl9saXN0PHN0ZDo6c3RyaW5nX3ZpZXc+IHByb2ZpbGVzKTsKICNpZiBfTElCQ1BQX1NURF9WRVIgPiAxNwotYm9vbCBTZXRUYXNrUHJvZmlsZXMoaW50IHRpZCwgc3RkOjpzcGFuPGNvbnN0IHN0ZDo6c3RyaW5nX3ZpZXc+IHByb2ZpbGVzLAorYm9vbCBTZXRUYXNrUHJvZmlsZXMocGlkX3QgdGlkLCBzdGQ6OnNwYW48Y29uc3Qgc3RkOjpzdHJpbmdfdmlldz4gcHJvZmlsZXMsCiAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZV9mZF9jYWNoZSA9IGZhbHNlKTsKIGJvb2wgU2V0UHJvY2Vzc1Byb2ZpbGVzKHVpZF90IHVpZCwgcGlkX3QgcGlkLCBzdGQ6OnNwYW48Y29uc3Qgc3RkOjpzdHJpbmdfdmlldz4gcHJvZmlsZXMpOwogI2VuZGlmCkBAIC01NSw3ICs1Nyw3IEBACiAKIGJvb2wgU2V0UHJvY2Vzc1Byb2ZpbGVzQ2FjaGVkKHVpZF90IHVpZCwgcGlkX3QgcGlkLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHByb2ZpbGVzKTsKIAotc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBDR1JPVVBTX1JDX1BBVEggPSAiL2Rldi9jZ3JvdXBfaW5mby9jZ3JvdXAucmMiOworW1tkZXByZWNhdGVkXV0gc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBDR1JPVVBTX1JDX1BBVEggPSAiL2Rldi9jZ3JvdXBfaW5mby9jZ3JvdXAucmMiOwogCiBib29sIFVzZVBlckFwcE1lbWNnKCk7CiAKQEAgLTY0LDQxICs2NiwzNyBAQAogLy8gc2hvdWxkIGJlIGFjdGl2ZSBhZ2Fpbi4gRS5nLiBaeWdvdGUgc3BlY2lhbGl6YXRpb24gZm9yIGNoaWxkIHByb2Nlc3MuCiB2b2lkIERyb3BUYXNrUHJvZmlsZXNSZXNvdXJjZUNhY2hpbmcoKTsKIAotLy8gUmV0dXJuIDAgYW5kIHJlbW92ZXMgdGhlIGNncm91cCBpZiB0aGVyZSBhcmUgbm8gbG9uZ2VyIGFueSBwcm9jZXNzZXMgaW4gaXQuCi0vLyBSZXR1cm5zIC0xIGluIHRoZSBjYXNlIG9mIGFuIGVycm9yIG9jY3VycmluZyBvciBpZiB0aGVyZSBhcmUgcHJvY2Vzc2VzIHN0aWxsIHJ1bm5pbmcKLS8vIGV2ZW4gYWZ0ZXIgcmV0cnlpbmcgZm9yIHVwIHRvIDIwMG1zLgotLy8gSWYgbWF4X3Byb2Nlc3NlcyBpcyBub3QgbnVsbHB0ciwgaXQgcmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcHJvY2Vzc2VzIHNlZW4gaW4gdGhlIGNncm91cAotLy8gZHVyaW5nIHRoZSBraWxsaW5nIHByb2Nlc3MuICBOb3RlIHRoYXQgdGhpcyBjYW4gYmUgMCBpZiBhbGwgcHJvY2Vzc2VzIGZyb20gdGhlIHByb2Nlc3MgZ3JvdXAgaGF2ZQotLy8gYWxyZWFkeSBiZWVuIHRlcm1pbmF0ZWQuCi1pbnQga2lsbFByb2Nlc3NHcm91cCh1aWRfdCB1aWQsIGludCBpbml0aWFsUGlkLCBpbnQgc2lnbmFsLCBpbnQqIG1heF9wcm9jZXNzZXMgPSBudWxscHRyKTsKKy8vIFJldHVybiAwIGlmIGFsbCBwcm9jZXNzZXMgd2VyZSBraWxsZWQgYW5kIHRoZSBjZ3JvdXAgd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkLgorLy8gUmV0dXJucyAtMSBpbiB0aGUgY2FzZSBvZiBhbiBlcnJvciBvY2N1cnJpbmcgb3IgaWYgdGhlcmUgYXJlIHByb2Nlc3NlcyBzdGlsbCBydW5uaW5nLgoraW50IGtpbGxQcm9jZXNzR3JvdXAodWlkX3QgdWlkLCBwaWRfdCBpbml0aWFsUGlkLCBpbnQgc2lnbmFsKTsKIAogLy8gUmV0dXJucyB0aGUgc2FtZSBhcyBraWxsUHJvY2Vzc0dyb3VwKCksIGhvd2V2ZXIgaXQgZG9lcyBub3QgcmV0cnksIHdoaWNoIG1lYW5zCiAvLyB0aGF0IGl0IG9ubHkgcmV0dXJucyAwIGluIHRoZSBjYXNlIHRoYXQgdGhlIGNncm91cCBleGlzdHMgYW5kIGl0IGNvbnRhaW5zIG5vIHByb2Nlc3Nlcy4KLWludCBraWxsUHJvY2Vzc0dyb3VwT25jZSh1aWRfdCB1aWQsIGludCBpbml0aWFsUGlkLCBpbnQgc2lnbmFsLCBpbnQqIG1heF9wcm9jZXNzZXMgPSBudWxscHRyKTsKK2ludCBraWxsUHJvY2Vzc0dyb3VwT25jZSh1aWRfdCB1aWQsIHBpZF90IGluaXRpYWxQaWQsIGludCBzaWduYWwpOwogCiAvLyBTZW5kcyB0aGUgcHJvdmlkZWQgc2lnbmFsIHRvIGFsbCBtZW1iZXJzIG9mIGEgcHJvY2VzcyBncm91cCwgYnV0IGRvZXMgbm90IHdhaXQgZm9yIHByb2Nlc3NlcyB0bwogLy8gZXhpdCwgb3IgZm9yIHRoZSBjZ3JvdXAgdG8gYmUgcmVtb3ZlZC4gQ2FsbGVycyBzaG91bGQgYWxzbyBlbnN1cmUgdGhhdCBraWxsUHJvY2Vzc0dyb3VwIGlzIGNhbGxlZAotLy8gbGF0ZXIgdG8gZW5zdXJlIHRoZSBjZ3JvdXAgaXMgZnVsbHkgcmVtb3ZlZCwgb3RoZXJ3aXNlIHN5c3RlbSByZXNvdXJjZXMgbWF5IGxlYWsuCi1pbnQgc2VuZFNpZ25hbFRvUHJvY2Vzc0dyb3VwKHVpZF90IHVpZCwgaW50IGluaXRpYWxQaWQsIGludCBzaWduYWwpOworLy8gbGF0ZXIgdG8gZW5zdXJlIHRoZSBjZ3JvdXAgaXMgZnVsbHkgcmVtb3ZlZCwgb3RoZXJ3aXNlIHN5c3RlbSByZXNvdXJjZXMgd2lsbCBsZWFrLgorLy8gUmV0dXJucyB0cnVlIGlmIG5vIGVycm9ycyBhcmUgZW5jb3VudGVyZWQgc2VuZGluZyBzaWduYWxzLCBvdGhlcndpc2UgZmFsc2UuCitib29sIHNlbmRTaWduYWxUb1Byb2Nlc3NHcm91cCh1aWRfdCB1aWQsIHBpZF90IGluaXRpYWxQaWQsIGludCBzaWduYWwpOwogCi1pbnQgY3JlYXRlUHJvY2Vzc0dyb3VwKHVpZF90IHVpZCwgaW50IGluaXRpYWxQaWQsIGJvb2wgbWVtQ29udHJvbCA9IGZhbHNlKTsKK2ludCBjcmVhdGVQcm9jZXNzR3JvdXAodWlkX3QgdWlkLCBwaWRfdCBpbml0aWFsUGlkLCBib29sIG1lbUNvbnRyb2wgPSBmYWxzZSk7CiAKIC8vIFNldCB2YXJpb3VzIHByb3BlcnRpZXMgb2YgYSBwcm9jZXNzIGdyb3VwLiBGb3IgdGhlc2UgZnVuY3Rpb25zIHRvIHdvcmssIHRoZSBwcm9jZXNzIGdyb3VwIG11c3QKIC8vIGhhdmUgYmVlbiBjcmVhdGVkIGJ5IHBhc3NpbmcgbWVtQ29udHJvbD10cnVlIHRvIGNyZWF0ZVByb2Nlc3NHcm91cC4KLWJvb2wgc2V0UHJvY2Vzc0dyb3VwU3dhcHBpbmVzcyh1aWRfdCB1aWQsIGludCBpbml0aWFsUGlkLCBpbnQgc3dhcHBpbmVzcyk7Ci1ib29sIHNldFByb2Nlc3NHcm91cFNvZnRMaW1pdCh1aWRfdCB1aWQsIGludCBpbml0aWFsUGlkLCBpbnQ2NF90IHNvZnRMaW1pdEluQnl0ZXMpOwotYm9vbCBzZXRQcm9jZXNzR3JvdXBMaW1pdCh1aWRfdCB1aWQsIGludCBpbml0aWFsUGlkLCBpbnQ2NF90IGxpbWl0SW5CeXRlcyk7Citib29sIHNldFByb2Nlc3NHcm91cFN3YXBwaW5lc3ModWlkX3QgdWlkLCBwaWRfdCBpbml0aWFsUGlkLCBpbnQgc3dhcHBpbmVzcyk7Citib29sIHNldFByb2Nlc3NHcm91cFNvZnRMaW1pdCh1aWRfdCB1aWQsIHBpZF90IGluaXRpYWxQaWQsIGludDY0X3Qgc29mdExpbWl0SW5CeXRlcyk7Citib29sIHNldFByb2Nlc3NHcm91cExpbWl0KHVpZF90IHVpZCwgcGlkX3QgaW5pdGlhbFBpZCwgaW50NjRfdCBsaW1pdEluQnl0ZXMpOwogCi12b2lkIHJlbW92ZUFsbFByb2Nlc3NHcm91cHModm9pZCk7CiB2b2lkIHJlbW92ZUFsbEVtcHR5UHJvY2Vzc0dyb3Vwcyh2b2lkKTsKIAogLy8gUHJvdmlkZXMgdGhlIHBhdGggZm9yIGFuIGF0dHJpYnV0ZSBpbiBhIHNwZWNpZmljIHByb2Nlc3MgZ3JvdXAKIC8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBlcnJvciwgdHJ1ZSBpbiBjYXNlIG9mIHN1Y2Nlc3MKLWJvb2wgZ2V0QXR0cmlidXRlUGF0aEZvclRhc2soY29uc3Qgc3RkOjpzdHJpbmcmIGF0dHJfbmFtZSwgaW50IHRpZCwgc3RkOjpzdHJpbmcqIHBhdGgpOworYm9vbCBnZXRBdHRyaWJ1dGVQYXRoRm9yVGFzayhjb25zdCBzdGQ6OnN0cmluZyYgYXR0cl9uYW1lLCBwaWRfdCB0aWQsIHN0ZDo6c3RyaW5nKiBwYXRoKTsKIAogLy8gQ2hlY2sgaWYgYSBwcm9maWxlIGNhbiBiZSBhcHBsaWVkIHdpdGhvdXQgZmFpbGluZy4KIC8vIFJldHVybnMgdHJ1ZSBpZiBpdCBjYW4gYmUgYXBwbGllZCB3aXRob3V0IGZhaWxpbmcsIGZhbHNlIG90aGVyd2lzZQotYm9vbCBpc1Byb2ZpbGVWYWxpZEZvclByb2Nlc3MoY29uc3Qgc3RkOjpzdHJpbmcmIHByb2ZpbGVfbmFtZSwgaW50IHVpZCwgaW50IHBpZCk7Citib29sIGlzUHJvZmlsZVZhbGlkRm9yUHJvY2Vzcyhjb25zdCBzdGQ6OnN0cmluZyYgcHJvZmlsZV9uYW1lLCB1aWRfdCB1aWQsIHBpZF90IHBpZCk7CiAKICNlbmRpZiAvLyBfX0FORFJPSURfVk5ES19fCiAKZGlmZiAtLWdpdCBhL2xpYnByb2Nlc3Nncm91cC9pbmNsdWRlL3Byb2Nlc3Nncm91cC9zY2hlZF9wb2xpY3kuaCBiL2xpYnByb2Nlc3Nncm91cC9pbmNsdWRlL3Byb2Nlc3Nncm91cC9zY2hlZF9wb2xpY3kuaAppbmRleCBhMTg4NDdlLi45MmNkMzY3IDEwMDY0NAotLS0gYS9saWJwcm9jZXNzZ3JvdXAvaW5jbHVkZS9wcm9jZXNzZ3JvdXAvc2NoZWRfcG9saWN5LmgKKysrIGIvbGlicHJvY2Vzc2dyb3VwL2luY2x1ZGUvcHJvY2Vzc2dyb3VwL3NjaGVkX3BvbGljeS5oCkBAIC0yOSwxNCArMjksNiBAQAogICovCiBleHRlcm4gYm9vbCBjcHVzZXRzX2VuYWJsZWQoKTsKIAotLyoKLSAqIENoZWNrIGlmIExpbnV4IGtlcm5lbCBlbmFibGVzIFNDSEVEVFVORSBmZWF0dXJlIChvbmx5IGF2YWlsYWJsZSBpbiBBbmRyb2lkCi0gKiBjb21tb24ga2VybmVsIG9yIExpbmFybyBMU0ssIG5vdCBpbiBtYWlubGluZSBMaW51eCBhcyBvZiB2NC45KQotICoKLSAqIFJldHVybiB2YWx1ZTogMSBpZiBMaW51eCBrZXJuZWwgQ09ORklHX0NHUk9VUF9TQ0hFRFRVTkU9eTsgMCBvdGhlcndpc2UuCi0gKi8KLWV4dGVybiBib29sIHNjaGVkYm9vc3RfZW5hYmxlZCgpOwotCiAvKiBLZWVwIGluIHN5bmMgd2l0aCBUSFJFQURfR1JPVVBfKiBpbiBmcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhL2FuZHJvaWQvb3MvUHJvY2Vzcy5qYXZhICovCiB0eXBlZGVmIGVudW0gewogICAgIFNQX0RFRkFVTFQgPSAtMSwKQEAgLTQ4LDYgKzQwLDcgQEAKICAgICBTUF9UT1BfQVBQID0gNSwKICAgICBTUF9SVF9BUFAgPSA2LAogICAgIFNQX1JFU1RSSUNURUQgPSA3LAorICAgIFNQX0ZPUkVHUk9VTkRfV0lORE9XID0gOCwKICAgICBTUF9DTlQsCiAgICAgU1BfTUFYID0gU1BfQ05UIC0gMSwKICAgICBTUF9TWVNURU1fREVGQVVMVCA9IFNQX0ZPUkVHUk9VTkQsCmRpZmYgLS1naXQgYS9pbml0L2hvc3RfaW5pdF92ZXJpZmllci5oIGIvbGlicHJvY2Vzc2dyb3VwL2ludGVybmFsLmgKc2ltaWxhcml0eSBpbmRleCA2OCUKcmVuYW1lIGZyb20gaW5pdC9ob3N0X2luaXRfdmVyaWZpZXIuaApyZW5hbWUgdG8gbGlicHJvY2Vzc2dyb3VwL2ludGVybmFsLmgKaW5kZXggNWQyNGYyYS4uZWY4NTU3OSAxMDA2NDQKLS0tIGEvaW5pdC9ob3N0X2luaXRfdmVyaWZpZXIuaAorKysgYi9saWJwcm9jZXNzZ3JvdXAvaW50ZXJuYWwuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE2LDEyICsxNiw2IEBACiAKICNwcmFnbWEgb25jZQogCi0jaW5jbHVkZSA8cHJvcGVydHlfaW5mb19wYXJzZXIvcHJvcGVydHlfaW5mb19wYXJzZXIuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CiAKLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBpbml0IHsKLQotZXh0ZXJuIGNvbnN0IGFuZHJvaWQ6OnByb3BlcnRpZXM6OlByb3BlcnR5SW5mb0FyZWEqIHByb3BlcnR5X2luZm9fYXJlYTsKLQotfSAgLy8gbmFtZXNwYWNlIGluaXQKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgQ0dST1VQX1YyX1JPT1RfREVGQVVMVCA9ICIvc3lzL2ZzL2Nncm91cCI7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGlicHJvY2Vzc2dyb3VwL3Byb2Nlc3Nncm91cC5jcHAgYi9saWJwcm9jZXNzZ3JvdXAvcHJvY2Vzc2dyb3VwLmNwcAppbmRleCAyMzRiNzkzLi45NTIyMTU5IDEwMDY0NAotLS0gYS9saWJwcm9jZXNzZ3JvdXAvcHJvY2Vzc2dyb3VwLmNwcAorKysgYi9saWJwcm9jZXNzZ3JvdXAvcHJvY2Vzc2dyb3VwLmNwcApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHBvbGwuaD4KICNpbmNsdWRlIDxzaWduYWwuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtMzAsMzAgKzMxLDMyIEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8Y3N0cmluZz4KICNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPG11dGV4PgogI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3RyaW5nX3ZpZXc+CiAjaW5jbHVkZSA8dGhyZWFkPgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KICNpbmNsdWRlIDxwcm9jZXNzZ3JvdXAvcHJvY2Vzc2dyb3VwLmg+CiAjaW5jbHVkZSA8dGFza19wcm9maWxlcy5oPgogCiB1c2luZyBhbmRyb2lkOjpiYXNlOjpHZXRCb29sUHJvcGVydHk7Ci11c2luZyBhbmRyb2lkOjpiYXNlOjpTdGFydHNXaXRoOwogdXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOwogdXNpbmcgYW5kcm9pZDo6YmFzZTo6V3JpdGVTdHJpbmdUb0ZpbGU7CiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKIAotI2RlZmluZSBQUk9DRVNTR1JPVVBfQ0dST1VQX1BST0NTX0ZJTEUgIi9jZ3JvdXAucHJvY3MiCisjZGVmaW5lIFBST0NFU1NHUk9VUF9DR1JPVVBfUFJPQ1NfRklMRSAiY2dyb3VwLnByb2NzIgorI2RlZmluZSBQUk9DRVNTR1JPVVBfQ0dST1VQX0tJTExfRklMRSAiY2dyb3VwLmtpbGwiCisjZGVmaW5lIFBST0NFU1NHUk9VUF9DR1JPVVBfRVZFTlRTX0ZJTEUgImNncm91cC5ldmVudHMiCiAKIGJvb2wgQ2dyb3Vwc0F2YWlsYWJsZSgpIHsKICAgICBzdGF0aWMgYm9vbCBjZ3JvdXBzX2F2YWlsYWJsZSA9IGFjY2VzcygiL3Byb2MvY2dyb3VwcyIsIEZfT0spID09IDA7CkBAIC03NCw4ICs3NywyMyBAQAogICAgIHJldHVybiB0cnVlOwogfQogCitzdGF0aWMgYm9vbCBDZ3JvdXBLaWxsQXZhaWxhYmxlKCkgeworICAgIHN0YXRpYyBzdGQ6Om9uY2VfZmxhZyBmOworICAgIHN0YXRpYyBib29sIGNncm91cF9raWxsX2F2YWlsYWJsZSA9IGZhbHNlOworICAgIHN0ZDo6Y2FsbF9vbmNlKGYsIFtdKCkgeworICAgICAgICBzdGQ6OnN0cmluZyBjZ19raWxsOworICAgICAgICBDZ3JvdXBHZXRDb250cm9sbGVyUGF0aChDR1JPVVBWMl9ISUVSQVJDSFlfTkFNRSwgJmNnX2tpbGwpOworICAgICAgICAvLyBjZ3JvdXAua2lsbCBpcyBub3Qgb24gdGhlIHJvb3QgY2dyb3VwLCBzbyBjaGVjayBhIG5vbi1yb290IGNncm91cCB0aGF0IHNob3VsZCBhbHdheXMKKyAgICAgICAgLy8gZXhpc3QKKyAgICAgICAgY2dfa2lsbCA9IENvbnZlcnRVaWRUb1BhdGgoY2dfa2lsbC5jX3N0cigpLCBBSURfUk9PVCkgKyAnLycgKyBQUk9DRVNTR1JPVVBfQ0dST1VQX0tJTExfRklMRTsKKyAgICAgICAgY2dyb3VwX2tpbGxfYXZhaWxhYmxlID0gYWNjZXNzKGNnX2tpbGwuY19zdHIoKSwgRl9PSykgPT0gMDsKKyAgICB9KTsKKworICAgIHJldHVybiBjZ3JvdXBfa2lsbF9hdmFpbGFibGU7Cit9CisKIHN0YXRpYyBib29sIENncm91cEdldE1lbWNnQXBwc1BhdGgoc3RkOjpzdHJpbmcqIHBhdGgpIHsKLSAgICBDZ3JvdXBDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBDZ3JvdXBNYXA6OkdldEluc3RhbmNlKCkuRmluZENvbnRyb2xsZXIoIm1lbW9yeSIpOworICAgIENncm91cENvbnRyb2xsZXJXcmFwcGVyIGNvbnRyb2xsZXIgPSBDZ3JvdXBNYXA6OkdldEluc3RhbmNlKCkuRmluZENvbnRyb2xsZXIoIm1lbW9yeSIpOwogCiAgICAgaWYgKCFjb250cm9sbGVyLkhhc1ZhbHVlKCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTIwLDcgKzEzOCw3IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgQ2dyb3VwR2V0QXR0cmlidXRlUGF0aEZvclRhc2soY29uc3Qgc3RkOjpzdHJpbmcmIGF0dHJfbmFtZSwgaW50IHRpZCwgc3RkOjpzdHJpbmcqIHBhdGgpIHsKK2Jvb2wgQ2dyb3VwR2V0QXR0cmlidXRlUGF0aEZvclRhc2soY29uc3Qgc3RkOjpzdHJpbmcmIGF0dHJfbmFtZSwgcGlkX3QgdGlkLCBzdGQ6OnN0cmluZyogcGF0aCkgewogICAgIGNvbnN0IFRhc2tQcm9maWxlcyYgdHAgPSBUYXNrUHJvZmlsZXM6OkdldEluc3RhbmNlKCk7CiAgICAgY29uc3QgSVByb2ZpbGVBdHRyaWJ1dGUqIGF0dHIgPSB0cC5HZXRBdHRyaWJ1dGUoYXR0cl9uYW1lKTsKIApAQCAtMTI5LDcgKzE0Nyw3IEBACiAgICAgfQogCiAgICAgaWYgKCFhdHRyLT5HZXRQYXRoRm9yVGFzayh0aWQsIHBhdGgpKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZmluZCBjZ3JvdXAgZm9yIHRpZCAiIDw8IHRpZDsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGZpbmQgY2dyb3VwIGZvciB0aWQgIiA8PCB0aWQ7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTE3MSwxNyArMTg5LDE4IEBACiAgICAgICAgICAgICB1aWQsIHBpZCwgc3RkOjpzcGFuPGNvbnN0IHN0ZDo6c3RyaW5nPihwcm9maWxlcyksIHRydWUpOwogfQogCi1ib29sIFNldFRhc2tQcm9maWxlcyhpbnQgdGlkLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHByb2ZpbGVzLCBib29sIHVzZV9mZF9jYWNoZSkgeworYm9vbCBTZXRUYXNrUHJvZmlsZXMocGlkX3QgdGlkLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHByb2ZpbGVzLCBib29sIHVzZV9mZF9jYWNoZSkgewogICAgIHJldHVybiBUYXNrUHJvZmlsZXM6OkdldEluc3RhbmNlKCkuU2V0VGFza1Byb2ZpbGVzKHRpZCwgc3RkOjpzcGFuPGNvbnN0IHN0ZDo6c3RyaW5nPihwcm9maWxlcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlX2ZkX2NhY2hlKTsKIH0KIAotYm9vbCBTZXRUYXNrUHJvZmlsZXMoaW50IHRpZCwgc3RkOjppbml0aWFsaXplcl9saXN0PHN0ZDo6c3RyaW5nX3ZpZXc+IHByb2ZpbGVzLCBib29sIHVzZV9mZF9jYWNoZSkgeworYm9vbCBTZXRUYXNrUHJvZmlsZXMocGlkX3QgdGlkLCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8c3RkOjpzdHJpbmdfdmlldz4gcHJvZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICBib29sIHVzZV9mZF9jYWNoZSkgewogICAgIHJldHVybiBUYXNrUHJvZmlsZXM6OkdldEluc3RhbmNlKCkuU2V0VGFza1Byb2ZpbGVzKAogICAgICAgICAgICAgdGlkLCBzdGQ6OnNwYW48Y29uc3Qgc3RkOjpzdHJpbmdfdmlldz4ocHJvZmlsZXMpLCB1c2VfZmRfY2FjaGUpOwogfQogCi1ib29sIFNldFRhc2tQcm9maWxlcyhpbnQgdGlkLCBzdGQ6OnNwYW48Y29uc3Qgc3RkOjpzdHJpbmdfdmlldz4gcHJvZmlsZXMsIGJvb2wgdXNlX2ZkX2NhY2hlKSB7Citib29sIFNldFRhc2tQcm9maWxlcyhwaWRfdCB0aWQsIHN0ZDo6c3Bhbjxjb25zdCBzdGQ6OnN0cmluZ192aWV3PiBwcm9maWxlcywgYm9vbCB1c2VfZmRfY2FjaGUpIHsKICAgICByZXR1cm4gVGFza1Byb2ZpbGVzOjpHZXRJbnN0YW5jZSgpLlNldFRhc2tQcm9maWxlcyh0aWQsIHByb2ZpbGVzLCB1c2VfZmRfY2FjaGUpOwogfQogCkBAIC0yMDUsMjkgKzIyNCwyNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKIH0KIAotc3RhdGljIHN0ZDo6c3RyaW5nIENvbnZlcnRVaWRUb1BhdGgoY29uc3QgY2hhciogY2dyb3VwLCB1aWRfdCB1aWQpIHsKLSAgICByZXR1cm4gU3RyaW5nUHJpbnRmKCIlcy91aWRfJWQiLCBjZ3JvdXAsIHVpZCk7Ci19CitzdGF0aWMgaW50IFJlbW92ZUNncm91cChjb25zdCBjaGFyKiBjZ3JvdXAsIHVpZF90IHVpZCwgcGlkX3QgcGlkKSB7CisgICAgYXV0byBwYXRoID0gQ29udmVydFVpZFBpZFRvUGF0aChjZ3JvdXAsIHVpZCwgcGlkKTsKKyAgICBpbnQgcmV0ID0gVEVNUF9GQUlMVVJFX1JFVFJZKHJtZGlyKHBhdGguY19zdHIoKSkpOwogCi1zdGF0aWMgc3RkOjpzdHJpbmcgQ29udmVydFVpZFBpZFRvUGF0aChjb25zdCBjaGFyKiBjZ3JvdXAsIHVpZF90IHVpZCwgaW50IHBpZCkgewotICAgIHJldHVybiBTdHJpbmdQcmludGYoIiVzL3VpZF8lZC9waWRfJWQiLCBjZ3JvdXAsIHVpZCwgcGlkKTsKLX0KKyAgICBpZiAoIXJldCAmJiB1aWQgPj0gQUlEX0lTT0xBVEVEX1NUQVJUICYmIHVpZCA8PSBBSURfSVNPTEFURURfRU5EKSB7CisgICAgICAgIC8vIElzb2xhdGVkIFVJRHMgYXJlIHVubGlrZWx5IHRvIGJlIHJldXNlZCBzb29uIGFmdGVyIHJlbW92YWwsCisgICAgICAgIC8vIHNvIGZyZWUgdXAgdGhlIGtlcm5lbCByZXNvdXJjZXMgZm9yIHRoZSBVSUQgbGV2ZWwgY2dyb3VwLgorICAgICAgICBwYXRoID0gQ29udmVydFVpZFRvUGF0aChjZ3JvdXAsIHVpZCk7CisgICAgICAgIHJldCA9IFRFTVBfRkFJTFVSRV9SRVRSWShybWRpcihwYXRoLmNfc3RyKCkpKTsKKyAgICB9CiAKLXN0YXRpYyBpbnQgUmVtb3ZlUHJvY2Vzc0dyb3VwKGNvbnN0IGNoYXIqIGNncm91cCwgdWlkX3QgdWlkLCBpbnQgcGlkLCB1bnNpZ25lZCBpbnQgcmV0cmllcykgewotICAgIGludCByZXQgPSAwOwotICAgIGF1dG8gdWlkX3BpZF9wYXRoID0gQ29udmVydFVpZFBpZFRvUGF0aChjZ3JvdXAsIHVpZCwgcGlkKTsKLSAgICBhdXRvIHVpZF9wYXRoID0gQ29udmVydFVpZFRvUGF0aChjZ3JvdXAsIHVpZCk7Ci0KLSAgICB3aGlsZSAocmV0cmllcy0tKSB7Ci0gICAgICAgIHJldCA9IHJtZGlyKHVpZF9waWRfcGF0aC5jX3N0cigpKTsKLSAgICAgICAgaWYgKCFyZXQgfHwgZXJybm8gIT0gRUJVU1kpIGJyZWFrOwotICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoNW1zKTsKKyAgICBpZiAocmV0IDwgMCAmJiBlcnJubyA9PSBFTk9FTlQpIHsKKyAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBpZGVtcG9ldGVudCwgYnV0IHN0aWxsIHdhcm4gaGVyZS4KKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJSZW1vdmVDZ3JvdXA6ICIgPDwgcGF0aCA8PCAiIGRvZXMgbm90IGV4aXN0LiI7CisgICAgICAgIHJldCA9IDA7CiAgICAgfQogCiAgICAgcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGJvb2wgUmVtb3ZlVWlkUHJvY2Vzc0dyb3Vwcyhjb25zdCBzdGQ6OnN0cmluZyYgdWlkX3BhdGgsIGJvb2wgZW1wdHlfb25seSkgeworc3RhdGljIGJvb2wgUmVtb3ZlRW1wdHlVaWRDZ3JvdXBzKGNvbnN0IHN0ZDo6c3RyaW5nJiB1aWRfcGF0aCkgewogICAgIHN0ZDo6dW5pcXVlX3B0cjxESVIsIGRlY2x0eXBlKCZjbG9zZWRpcik+IHVpZChvcGVuZGlyKHVpZF9wYXRoLmNfc3RyKCkpLCBjbG9zZWRpcik7CiAgICAgYm9vbCBlbXB0eSA9IHRydWU7CiAgICAgaWYgKHVpZCAhPSBOVUxMKSB7CkBAIC0yMzcsMjYgKzI1NCwxMSBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoIVN0YXJ0c1dpdGgoZGlyLT5kX25hbWUsICJwaWRfIikpIHsKKyAgICAgICAgICAgIGlmICghc3RkOjpzdHJpbmdfdmlldyhkaXItPmRfbmFtZSkuc3RhcnRzX3dpdGgoInBpZF8iKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBhdXRvIHBhdGggPSBTdHJpbmdQcmludGYoIiVzLyVzIiwgdWlkX3BhdGguY19zdHIoKSwgZGlyLT5kX25hbWUpOwotICAgICAgICAgICAgaWYgKGVtcHR5X29ubHkpIHsKLSAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgICAgICAgICAgICAgICBhdXRvIHByb2NzX2ZpbGUgPSBTdHJpbmdQcmludGYoIiVzLyVzIiwgcGF0aC5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTR1JPVVBfQ0dST1VQX1BST0NTX0ZJTEUpOwotICAgICAgICAgICAgICAgIGlmIChzdGF0KHByb2NzX2ZpbGUuY19zdHIoKSwgJnN0KSA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGdldCBzdGF0cyBmb3IgIiA8PCBwcm9jc19maWxlOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHN0LnN0X3NpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNraXAgbm9uLWVtcHR5IGdyb3VwcwotICAgICAgICAgICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgIlNraXBwaW5nIG5vbi1lbXB0eSBncm91cCAiIDw8IHBhdGg7Ci0gICAgICAgICAgICAgICAgICAgIGVtcHR5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiUmVtb3ZpbmcgIiA8PCBwYXRoOwogICAgICAgICAgICAgaWYgKHJtZGlyKHBhdGguY19zdHIoKSkgPT0gLTEpIHsKICAgICAgICAgICAgICAgICBpZiAoZXJybm8gIT0gRUJVU1kpIHsKQEAgLTI2OSwxMSArMjcxLDEzIEBACiAgICAgcmV0dXJuIGVtcHR5OwogfQogCi12b2lkIHJlbW92ZUFsbFByb2Nlc3NHcm91cHNJbnRlcm5hbChib29sIGVtcHR5X29ubHkpIHsKK3ZvaWQgcmVtb3ZlQWxsRW1wdHlQcm9jZXNzR3JvdXBzKCkgeworICAgIExPRyhWRVJCT1NFKSA8PCAicmVtb3ZlQWxsRW1wdHlQcm9jZXNzR3JvdXBzKCkiOworCiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNncm91cHM7CiAgICAgc3RkOjpzdHJpbmcgcGF0aCwgbWVtY2dfYXBwc19wYXRoOwogCi0gICAgaWYgKENncm91cEdldENvbnRyb2xsZXJQYXRoKENHUk9VUFYyX0NPTlRST0xMRVJfTkFNRSwgJnBhdGgpKSB7CisgICAgaWYgKENncm91cEdldENvbnRyb2xsZXJQYXRoKENHUk9VUFYyX0hJRVJBUkNIWV9OQU1FLCAmcGF0aCkpIHsKICAgICAgICAgY2dyb3Vwcy5wdXNoX2JhY2socGF0aCk7CiAgICAgfQogICAgIGlmIChDZ3JvdXBHZXRNZW1jZ0FwcHNQYXRoKCZtZW1jZ19hcHBzX3BhdGgpICYmIG1lbWNnX2FwcHNfcGF0aCAhPSBwYXRoKSB7CkBAIC0yOTEsMTIgKzI5NSwxMiBAQAogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoIVN0YXJ0c1dpdGgoZGlyLT5kX25hbWUsICJ1aWRfIikpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXN0ZDo6c3RyaW5nX3ZpZXcoZGlyLT5kX25hbWUpLnN0YXJ0c193aXRoKCJ1aWRfIikpIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgYXV0byBwYXRoID0gU3RyaW5nUHJpbnRmKCIlcy8lcyIsIGNncm91cF9yb290X3BhdGguY19zdHIoKSwgZGlyLT5kX25hbWUpOwotICAgICAgICAgICAgICAgIGlmICghUmVtb3ZlVWlkUHJvY2Vzc0dyb3VwcyhwYXRoLCBlbXB0eV9vbmx5KSkgeworICAgICAgICAgICAgICAgIGlmICghUmVtb3ZlRW1wdHlVaWRDZ3JvdXBzKHBhdGgpKSB7CiAgICAgICAgICAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiU2tpcCByZW1vdmluZyAiIDw8IHBhdGg7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KQEAgLTMwOSwxNiArMzEzLDYgQEAKICAgICB9CiB9CiAKLXZvaWQgcmVtb3ZlQWxsUHJvY2Vzc0dyb3VwcygpIHsKLSAgICBMT0coVkVSQk9TRSkgPDwgInJlbW92ZUFsbFByb2Nlc3NHcm91cHMoKSI7Ci0gICAgcmVtb3ZlQWxsUHJvY2Vzc0dyb3Vwc0ludGVybmFsKGZhbHNlKTsKLX0KLQotdm9pZCByZW1vdmVBbGxFbXB0eVByb2Nlc3NHcm91cHMoKSB7Ci0gICAgTE9HKFZFUkJPU0UpIDw8ICJyZW1vdmVBbGxFbXB0eVByb2Nlc3NHcm91cHMoKSI7Ci0gICAgcmVtb3ZlQWxsUHJvY2Vzc0dyb3Vwc0ludGVybmFsKHRydWUpOwotfQotCiAvKioKICAqIFByb2Nlc3MgZ3JvdXBzIGFyZSBwcmltYXJpbHkgY3JlYXRlZCBieSB0aGUgWnlnb3RlLCBtZWFuaW5nIHRoYXQgdWlkL3BpZCBncm91cHMgYXJlIGNyZWF0ZWQgYnkKICAqIHRoZSB1c2VyIHJvb3QuIE93bmVyc2hpcCBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgY2dyb3VwIGFuZCBhbGwgb2YgaXRzIGZpbGVzIG11c3QgdGh1cyBiZQpAQCAtMzY4LDM1ICszNjIsNTUgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLS8vIFJldHVybnMgbnVtYmVyIG9mIHByb2Nlc3NlcyBraWxsZWQgb24gc3VjY2VzcwotLy8gUmV0dXJucyAwIGlmIHRoZXJlIGFyZSBubyBwcm9jZXNzZXMgaW4gdGhlIHByb2Nlc3MgY2dyb3VwIGxlZnQgdG8ga2lsbAotLy8gUmV0dXJucyAtMSBvbiBlcnJvcgotc3RhdGljIGludCBEb0tpbGxQcm9jZXNzR3JvdXBPbmNlKGNvbnN0IGNoYXIqIGNncm91cCwgdWlkX3QgdWlkLCBpbnQgaW5pdGlhbFBpZCwgaW50IHNpZ25hbCkgewotICAgIC8vIFdlIHNlcGFyYXRlIGFsbCBvZiB0aGUgcGlkcyBpbiB0aGUgY2dyb3VwIGludG8gdGhvc2UgcGlkcyB0aGF0IGFyZSBhbHNvIHRoZSBsZWFkZXJzIG9mCi0gICAgLy8gcHJvY2VzcyBncm91cHMgKHN0b3JlZCBpbiB0aGUgcGdpZHMgc2V0KSBhbmQgdGhvc2UgdGhhdCBhcmUgbm90IChzdG9yZWQgaW4gdGhlIHBpZHMgc2V0KS4KLSAgICBzdGQ6OnNldDxwaWRfdD4gcGdpZHM7Ci0gICAgcGdpZHMuZW1wbGFjZShpbml0aWFsUGlkKTsKLSAgICBzdGQ6OnNldDxwaWRfdD4gcGlkczsKLSAgICBpbnQgcHJvY2Vzc2VzID0gMDsKLQotICAgIHN0ZDo6dW5pcXVlX3B0cjxGSUxFLCBkZWNsdHlwZSgmZmNsb3NlKT4gZmQobnVsbHB0ciwgZmNsb3NlKTsKK2Jvb2wgc2VuZFNpZ25hbFRvUHJvY2Vzc0dyb3VwKHVpZF90IHVpZCwgcGlkX3QgaW5pdGlhbFBpZCwgaW50IHNpZ25hbCkgeworICAgIHN0ZDo6c2V0PHBpZF90PiBwZ2lkcywgcGlkczsKIAogICAgIGlmIChDZ3JvdXBzQXZhaWxhYmxlKCkpIHsKLSAgICAgICAgYXV0byBwYXRoID0gQ29udmVydFVpZFBpZFRvUGF0aChjZ3JvdXAsIHVpZCwgaW5pdGlhbFBpZCkgKyBQUk9DRVNTR1JPVVBfQ0dST1VQX1BST0NTX0ZJTEU7Ci0gICAgICAgIGZkLnJlc2V0KGZvcGVuKHBhdGguY19zdHIoKSwgInJlIikpOwotICAgICAgICBpZiAoIWZkKSB7Ci0gICAgICAgICAgICBpZiAoZXJybm8gPT0gRU5PRU5UKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBoYXBwZW5zIHdoZW4gcHJvY2VzcyBpcyBhbHJlYWR5IGRlYWQKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgc3RkOjpzdHJpbmcgaGllcmFyY2h5X3Jvb3RfcGF0aCwgY2dyb3VwX3YyX3BhdGg7CisgICAgICAgIENncm91cEdldENvbnRyb2xsZXJQYXRoKENHUk9VUFYyX0hJRVJBUkNIWV9OQU1FLCAmaGllcmFyY2h5X3Jvb3RfcGF0aCk7CisgICAgICAgIGNncm91cF92Ml9wYXRoID0gQ29udmVydFVpZFBpZFRvUGF0aChoaWVyYXJjaHlfcm9vdF9wYXRoLmNfc3RyKCksIHVpZCwgaW5pdGlhbFBpZCk7CisKKyAgICAgICAgaWYgKHNpZ25hbCA9PSBTSUdLSUxMICYmIENncm91cEtpbGxBdmFpbGFibGUoKSkgeworICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJVc2luZyAiIDw8IFBST0NFU1NHUk9VUF9DR1JPVVBfS0lMTF9GSUxFIDw8ICIgdG8gU0lHS0lMTCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgY2dyb3VwX3YyX3BhdGg7CisKKyAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8ga2lsbCB0aGUgcHJvY2VzcyBncm91cCBpbiBhZGRpdGlvbiB0byB0aGUgY2dyb3VwLiBGb3Igbm9ybWFsIGFwcHMgdGhleQorICAgICAgICAgICAgLy8gc2hvdWxkIGNvbXBsZXRlbHkgb3ZlcmxhcCwgYnV0IHN5c3RlbV9zZXJ2ZXIga2lsbHMgZGVwZW5kIG9uIHByb2Nlc3MgZ3JvdXAga2lsbHMgdG8KKyAgICAgICAgICAgIC8vIHRha2UgZG93biBhcHBzIHdoaWNoIGFyZSBpbiB0aGVpciBvd24gY2dyb3VwcyBhbmQgbm90IGluZGl2aWR1YWxseSB0YXJnZXRlZC4KKyAgICAgICAgICAgIGlmIChraWxsKC1pbml0aWFsUGlkLCBzaWduYWwpID09IC0xICYmIGVycm5vICE9IEVTUkNIKSB7CisgICAgICAgICAgICAgICAgUExPRyhXQVJOSU5HKSA8PCAia2lsbCgiIDw8IC1pbml0aWFsUGlkIDw8ICIsICIgPDwgc2lnbmFsIDw8ICIpIGZhaWxlZCI7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBQTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIgZmFpbGVkIHRvIG9wZW4gcHJvY2VzcyBjZ3JvdXAgdWlkICIgPDwgdWlkIDw8ICIgcGlkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5pdGlhbFBpZDsKLSAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcga2lsbGZpbGVwYXRoID0gY2dyb3VwX3YyX3BhdGggKyAnLycgKyBQUk9DRVNTR1JPVVBfQ0dST1VQX0tJTExfRklMRTsKKyAgICAgICAgICAgIGlmIChXcml0ZVN0cmluZ1RvRmlsZSgiMSIsIGtpbGxmaWxlcGF0aCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byB3cml0ZSAxIHRvICIgPDwga2lsbGZpbGVwYXRoOworICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIGNncm91cC5wcm9jcyBiZWxvdworICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgLy8gU2luY2UgY2dyb3VwLmtpbGwgb25seSBzZW5kcyBTSUdLSUxMcywgd2UgcmVhZCBjZ3JvdXAucHJvY3MgdG8gZmluZCBlYWNoIHByb2Nlc3MgdG8KKyAgICAgICAgLy8gc2lnbmFsIGluZGl2aWR1YWxseS4gVGhpcyBpcyBtb3JlIGNvc3RseSB0aGFuIHVzaW5nIGNncm91cC5raWxsIGZvciBTSUdLSUxMcy4KKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJVc2luZyAiIDw8IFBST0NFU1NHUk9VUF9DR1JPVVBfUFJPQ1NfRklMRSA8PCAiIHRvIHNpZ25hbCAoIiA8PCBzaWduYWwKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIpICIgPDwgY2dyb3VwX3YyX3BhdGg7CisKKyAgICAgICAgLy8gV2Ugc2VwYXJhdGUgYWxsIG9mIHRoZSBwaWRzIGluIHRoZSBjZ3JvdXAgaW50byB0aG9zZSBwaWRzIHRoYXQgYXJlIGFsc28gdGhlIGxlYWRlcnMgb2YKKyAgICAgICAgLy8gcHJvY2VzcyBncm91cHMgKHN0b3JlZCBpbiB0aGUgcGdpZHMgc2V0KSBhbmQgdGhvc2UgdGhhdCBhcmUgbm90IChzdG9yZWQgaW4gdGhlIHBpZHMgc2V0KS4KKyAgICAgICAgY29uc3QgYXV0byBwcm9jc2ZpbGVwYXRoID0gY2dyb3VwX3YyX3BhdGggKyAnLycgKyBQUk9DRVNTR1JPVVBfQ0dST1VQX1BST0NTX0ZJTEU7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxGSUxFLCBkZWNsdHlwZSgmZmNsb3NlKT4gZnAoZm9wZW4ocHJvY3NmaWxlcGF0aC5jX3N0cigpLCAicmUiKSwgZmNsb3NlKTsKKyAgICAgICAgaWYgKCFmcCkgeworICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgb25seSBoYXBwZW4gaWYgdGhlIGNncm91cCBoYXMgYWxyZWFkeSBiZWVuIHJlbW92ZWQgd2l0aCBhIHN1Y2Nlc3NmdWwgY2FsbAorICAgICAgICAgICAgLy8gdG8ga2lsbFByb2Nlc3NHcm91cC4gQ2FsbGVycyBzaG91bGQgb25seSByZXRyeSBzZW5kU2lnbmFsVG9Qcm9jZXNzR3JvdXAgb3IKKyAgICAgICAgICAgIC8vIGtpbGxQcm9jZXNzR3JvdXAgY2FsbHMgaWYgdGhleSBmYWlsIHdpdGhvdXQgRU5PRU5ULgorICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBvcGVuICIgPDwgcHJvY3NmaWxlcGF0aDsKKyAgICAgICAgICAgIGtpbGwoLWluaXRpYWxQaWQsIHNpZ25hbCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKwogICAgICAgICBwaWRfdCBwaWQ7CiAgICAgICAgIGJvb2wgZmlsZV9pc19lbXB0eSA9IHRydWU7Ci0gICAgICAgIHdoaWxlIChmc2NhbmYoZmQuZ2V0KCksICIlZFxuIiwgJnBpZCkgPT0gMSAmJiBwaWQgPj0gMCkgewotICAgICAgICAgICAgcHJvY2Vzc2VzKys7CisgICAgICAgIHdoaWxlIChmc2NhbmYoZnAuZ2V0KCksICIlZFxuIiwgJnBpZCkgPT0gMSAmJiBwaWQgPj0gMCkgewogICAgICAgICAgICAgZmlsZV9pc19lbXB0eSA9IGZhbHNlOwogICAgICAgICAgICAgaWYgKHBpZCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIG5ldmVyIGhhcHBlbi4uLiAgYnV0IGlmIGl0IGRvZXMsIHRyeWluZyB0byBraWxsIHRoaXMKQEAgLTQyNiw2ICs0NDAsOCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcGdpZHMuZW1wbGFjZShpbml0aWFsUGlkKTsKKwogICAgIC8vIEtpbGwgYWxsIHByb2Nlc3MgZ3JvdXBzLgogICAgIGZvciAoY29uc3QgYXV0byBwZ2lkIDogcGdpZHMpIHsKICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJLaWxsaW5nIHByb2Nlc3MgZ3JvdXAgIiA8PCAtcGdpZCA8PCAiIGluIHVpZCAiIDw8IHVpZApAQCAtNDQ2LDExMiArNDYyLDE4MyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuICghZmQgfHwgZmVvZihmZC5nZXQoKSkpID8gcHJvY2Vzc2VzIDogLTE7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBpbnQgS2lsbFByb2Nlc3NHcm91cCh1aWRfdCB1aWQsIGludCBpbml0aWFsUGlkLCBpbnQgc2lnbmFsLCBpbnQgcmV0cmllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIG1heF9wcm9jZXNzZXMpIHsKLSAgICBDSEVDS19HRSh1aWQsIDApOwotICAgIENIRUNLX0dUKGluaXRpYWxQaWQsIDApOwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyB0b01pbGxpc2VjKFQmJiBkdXJhdGlvbikgeworICAgIHJldHVybiBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzPihkdXJhdGlvbik7Cit9CiAKLSAgICBzdGQ6OnN0cmluZyBoaWVyYXJjaHlfcm9vdF9wYXRoOwotICAgIGlmIChDZ3JvdXBzQXZhaWxhYmxlKCkpIHsKLSAgICAgICAgQ2dyb3VwR2V0Q29udHJvbGxlclBhdGgoQ0dST1VQVjJfQ09OVFJPTExFUl9OQU1FLCAmaGllcmFyY2h5X3Jvb3RfcGF0aCk7Ci0gICAgfQotICAgIGNvbnN0IGNoYXIqIGNncm91cCA9IGhpZXJhcmNoeV9yb290X3BhdGguY19zdHIoKTsKK2VudW0gY2xhc3MgcG9wdWxhdGVkX3N0YXR1cworeworICAgIHBvcHVsYXRlZCwKKyAgICBub3RfcG9wdWxhdGVkLAorICAgIGVycm9yCit9OwogCi0gICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCBzdGFydCA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOworc3RhdGljIHBvcHVsYXRlZF9zdGF0dXMgY2dyb3VwSXNQb3B1bGF0ZWQoaW50IGV2ZW50c19mZCkgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIFBPUFVMQVRFRF9LRVkoInBvcHVsYXRlZCAiKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIE1BWF9FVkVOVFNfRklMRV9TSVpFID0gMzI7CiAKLSAgICBpZiAobWF4X3Byb2Nlc3NlcyAhPSBudWxscHRyKSB7Ci0gICAgICAgICptYXhfcHJvY2Vzc2VzID0gMDsKKyAgICBzdGQ6OnN0cmluZyBidWY7CisgICAgYnVmLnJlc2l6ZShNQVhfRVZFTlRTX0ZJTEVfU0laRSk7CisgICAgc3NpemVfdCBsZW4gPSBURU1QX0ZBSUxVUkVfUkVUUlkocHJlYWQoZXZlbnRzX2ZkLCBidWYuZGF0YSgpLCBidWYuc2l6ZSgpLCAwKSk7CisgICAgaWYgKGxlbiA9PSAtMSkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IHJlYWQgY2dyb3VwLmV2ZW50czogIjsKKyAgICAgICAgLy8gUG90ZW50aWFsbHkgRU5PREVWIGlmIHRoZSBjZ3JvdXAgaGFzIGJlZW4gcmVtb3ZlZCBzaW5jZSB3ZSBvcGVuZWQgdGhpcyBmaWxlLCBidXQgdGhhdAorICAgICAgICAvLyBzaG91bGRuJ3QgaGF2ZSBoYXBwZW5lZCB5ZXQuCisgICAgICAgIHJldHVybiBwb3B1bGF0ZWRfc3RhdHVzOjplcnJvcjsKICAgICB9CiAKLSAgICBpbnQgcmV0cnkgPSByZXRyaWVzOwotICAgIGludCBwcm9jZXNzZXM7Ci0gICAgd2hpbGUgKChwcm9jZXNzZXMgPSBEb0tpbGxQcm9jZXNzR3JvdXBPbmNlKGNncm91cCwgdWlkLCBpbml0aWFsUGlkLCBzaWduYWwpKSA+IDApIHsKLSAgICAgICAgaWYgKG1heF9wcm9jZXNzZXMgIT0gbnVsbHB0ciAmJiBwcm9jZXNzZXMgPiAqbWF4X3Byb2Nlc3NlcykgewotICAgICAgICAgICAgKm1heF9wcm9jZXNzZXMgPSBwcm9jZXNzZXM7Ci0gICAgICAgIH0KLSAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJLaWxsZWQgIiA8PCBwcm9jZXNzZXMgPDwgIiBwcm9jZXNzZXMgZm9yIHByb2Nlc3Nncm91cCAiIDw8IGluaXRpYWxQaWQ7Ci0gICAgICAgIGlmICghQ2dyb3Vwc0F2YWlsYWJsZSgpKSB7Ci0gICAgICAgICAgICAvLyBtYWtlcyBubyBzZW5zZSB0byByZXRyeSwgYmVjYXVzZSB0aGVyZSBhcmUgbm8gY2dyb3VwX3Byb2NzIGZpbGUKLSAgICAgICAgICAgIHByb2Nlc3NlcyA9IDA7ICAvLyBubyByZW1haW5pbmcgcHJvY2Vzc2VzCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0cnkgPiAwKSB7Ci0gICAgICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoNW1zKTsKLSAgICAgICAgICAgIC0tcmV0cnk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQorICAgIGlmIChsZW4gPT0gMCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjZ3JvdXAuZXZlbnRzIEVPRiI7CisgICAgICAgIHJldHVybiBwb3B1bGF0ZWRfc3RhdHVzOjplcnJvcjsKICAgICB9CiAKLSAgICBpZiAocHJvY2Vzc2VzIDwgMCkgewotICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRXJyb3IgZW5jb3VudGVyZWQga2lsbGluZyBwcm9jZXNzIGNncm91cCB1aWQgIiA8PCB1aWQgPDwgIiBwaWQgIgotICAgICAgICAgICAgICAgICAgICA8PCBpbml0aWFsUGlkOworICAgIGJ1Zi5yZXNpemUobGVuKTsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcG9zID0gYnVmLmZpbmQoUE9QVUxBVEVEX0tFWSk7CisgICAgaWYgKHBvcyA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgZmluZCBwb3B1bGF0ZWQga2V5IGluIGNncm91cC5ldmVudHMiOworICAgICAgICByZXR1cm4gcG9wdWxhdGVkX3N0YXR1czo6ZXJyb3I7CisgICAgfQorCisgICAgaWYgKHBvcyArIFBPUFVMQVRFRF9LRVkuc2l6ZSgpICsgMSA+IGxlbikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJQYXJ0aWFsIHJlYWQgb2YgY2dyb3VwLmV2ZW50cyI7CisgICAgICAgIHJldHVybiBwb3B1bGF0ZWRfc3RhdHVzOjplcnJvcjsKKyAgICB9CisKKyAgICByZXR1cm4gYnVmW3BvcyArIFBPUFVMQVRFRF9LRVkuc2l6ZSgpXSA9PSAnMScgPworICAgICAgICBwb3B1bGF0ZWRfc3RhdHVzOjpwb3B1bGF0ZWQgOiBwb3B1bGF0ZWRfc3RhdHVzOjpub3RfcG9wdWxhdGVkOworfQorCisvLyBUaGUgZGVmYXVsdCB0aW1lb3V0IG9mIDIyMDBtcyBjb21lcyBmcm9tIHRoZSBkZWZhdWx0IG51bWJlciBvZiByZXRyaWVzIGluIGEgcHJldmlvdXMKKy8vIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24uIFRoZSBkZWZhdWx0IHJldHJ5IHZhbHVlIHdhcyA0MCBmb3Iga2lsbGluZyBhbmQgNDAwIGZvciBjZ3JvdXAKKy8vIHJlbW92YWwgd2l0aCA1bXMgc2xlZXBzIGJldHdlZW4gZWFjaCByZXRyeS4KK3N0YXRpYyBpbnQgS2lsbFByb2Nlc3NHcm91cCgKKyAgICAgICAgdWlkX3QgdWlkLCBwaWRfdCBpbml0aWFsUGlkLCBpbnQgc2lnbmFsLCBib29sIG9uY2UgPSBmYWxzZSwKKyAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCB1bnRpbCA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpICsgMjIwMG1zKSB7CisgICAgaWYgKHVpZCA8IDApIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCBfX2Z1bmNfXyA8PCAiOiBpbnZhbGlkIFVJRCAiIDw8IHVpZDsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoaW5pdGlhbFBpZCA8PSAwKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogaW52YWxpZCBQSUQgIiA8PCBpbml0aWFsUGlkOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCBlbmQgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKLSAgICBhdXRvIG1zID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4oZW5kIC0gc3RhcnQpLmNvdW50KCk7CisgICAgLy8gQWx3YXlzIGF0dGVtcHQgdG8gc2VuZCBhIGtpbGwgc2lnbmFsIHRvIGF0IGxlYXN0IHRoZSBpbml0aWFsUGlkLCBhdCBsZWFzdCBvbmNlLCByZWdhcmRsZXNzIG9mCisgICAgLy8gd2hldGhlciBpdHMgY2dyb3VwIGV4aXN0cyBvciBub3QuIFRoaXMgc2hvdWxkIG9ubHkgYmUgbmVjZXNzYXJ5IGlmIGEgYnVnIHJlc3VsdHMgaW4gdGhlCisgICAgLy8gbWlncmF0aW9uIG9mIHRoZSB0YXJnZXRlZCBwcm9jZXNzIG91dCBvZiBpdHMgY2dyb3VwLCB3aGljaCB3ZSB3aWxsIGFsc28gYXR0ZW1wdCB0byBraWxsLgorICAgIGNvbnN0IGJvb2wgc2lnbmFsX3JldCA9IHNlbmRTaWduYWxUb1Byb2Nlc3NHcm91cCh1aWQsIGluaXRpYWxQaWQsIHNpZ25hbCk7CiAKLSAgICAvLyBXZSBvbmx5IGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mICdwcm9jZXNzZXMnIHdoZW4ga2lsbGluZyB0aGUgcHJvY2Vzc2VzLgotICAgIC8vIEluIHRoZSByZXRyaWVzID09IDAgY2FzZSwgd2Ugb25seSBraWxsIHRoZSBwcm9jZXNzZXMgb25jZSBhbmQgdGhlcmVmb3JlCi0gICAgLy8gd2lsbCBub3QgaGF2ZSB3YWl0ZWQgdGhlbiByZWNhbGN1bGF0ZWQgaG93IG1hbnkgcHJvY2Vzc2VzIGFyZSByZW1haW5pbmcKLSAgICAvLyBhZnRlciB0aGUgZmlyc3Qgc2lnbmFscyBoYXZlIGJlZW4gc2VudC4KLSAgICAvLyBMb2dnaW5nIGFueXRoaW5nIHJlZ2FyZGluZyB0aGUgbnVtYmVyIG9mICdwcm9jZXNzZXMnIGhlcmUgZG9lcyBub3QgbWFrZSBzZW5zZS4KKyAgICBpZiAoIUNncm91cHNBdmFpbGFibGUoKSB8fCAhc2lnbmFsX3JldCkgcmV0dXJuIHNpZ25hbF9yZXQgPyAwIDogLTE7CiAKLSAgICBpZiAocHJvY2Vzc2VzID09IDApIHsKLSAgICAgICAgaWYgKHJldHJpZXMgPiAwKSB7Ci0gICAgICAgICAgICBMT0coSU5GTykgPDwgIlN1Y2Nlc3NmdWxseSBraWxsZWQgcHJvY2VzcyBjZ3JvdXAgdWlkICIgPDwgdWlkIDw8ICIgcGlkICIgPDwgaW5pdGlhbFBpZAotICAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW4gIiA8PCBzdGF0aWNfY2FzdDxpbnQ+KG1zKSA8PCAibXMiOworICAgIHN0ZDo6c3RyaW5nIGhpZXJhcmNoeV9yb290X3BhdGg7CisgICAgQ2dyb3VwR2V0Q29udHJvbGxlclBhdGgoQ0dST1VQVjJfSElFUkFSQ0hZX05BTUUsICZoaWVyYXJjaHlfcm9vdF9wYXRoKTsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGNncm91cF92Ml9wYXRoID0KKyAgICAgICAgICAgIENvbnZlcnRVaWRQaWRUb1BhdGgoaGllcmFyY2h5X3Jvb3RfcGF0aC5jX3N0cigpLCB1aWQsIGluaXRpYWxQaWQpOworCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgZXZlbnRzZmlsZSA9IGNncm91cF92Ml9wYXRoICsgJy8nICsgUFJPQ0VTU0dST1VQX0NHUk9VUF9FVkVOVFNfRklMRTsKKyAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgZXZlbnRzX2ZkKG9wZW4oZXZlbnRzZmlsZS5jX3N0cigpLCBPX1JET05MWSkpOworICAgIGlmIChldmVudHNfZmQuZ2V0KCkgPT0gLTEpIHsKKyAgICAgICAgUExPRyhXQVJOSU5HKSA8PCAiRXJyb3Igb3BlbmluZyAiIDw8IGV2ZW50c2ZpbGUgPDwgIiBmb3IgS2lsbFByb2Nlc3NHcm91cCI7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBzdHJ1Y3QgcG9sbGZkIGZkcyA9IHsKKyAgICAgICAgLmZkID0gZXZlbnRzX2ZkLAorICAgICAgICAuZXZlbnRzID0gUE9MTFBSSSwKKyAgICB9OworCisgICAgY29uc3Qgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCBzdGFydCA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOworCisgICAgLy8gVGhlIHByaW1hcnkgcmVhc29uIHRvIGxvb3AgaGVyZSBpcyB0byBjYXB0dXJlIGFueSBuZXcgZm9ya3Mgb3IgbWlncmF0aW9ucyB0aGF0IGNvdWxkIG9jY3VyCisgICAgLy8gYWZ0ZXIgd2Ugc2VuZCBzaWduYWxzIHRvIHRoZSBvcmlnaW5hbCBzZXQgb2YgcHJvY2Vzc2VzLCBidXQgYmVmb3JlIGFsbCBvZiB0aG9zZSBwcm9jZXNzZXMKKyAgICAvLyBleGl0IGFuZCB0aGUgY2dyb3VwIGJlY29tZXMgdW5wb3B1bGF0ZWQsIG9yIGJlZm9yZSB3ZSByZW1vdmUgdGhlIGNncm91cC4gV2UgdHJ5IGhhcmQgdG8KKyAgICAvLyBlbnN1cmUgdGhpcyBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5IHRvIGF2b2lkIHBlcm1hbmVudCBtZW1vcnkgbGVha3MsIGJ1dCB3ZSBzdGlsbCBwbGFjZSBhCisgICAgLy8gbGFyZ2UgZGVmYXVsdCB1cHBlciBib3VuZCBvbiB0aGUgYW1vdW50IG9mIHRpbWUgd2Ugc3BlbmQgaW4gdGhpcyBsb29wLiBUaGUgYW1vdW50IG9mIENQVQorICAgIC8vIGNvbnRlbnRpb24sIGFuZCB0aGUgYW1vdW50IG9mIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIGluIGRvX2V4aXQgZm9yIGVhY2ggcHJvY2VzcworICAgIC8vIGRldGVybWluZXMgaG93IGxvbmcgdGhpcyB3aWxsIHRha2UuCisgICAgaW50IHJldDsKKyAgICBkbyB7CisgICAgICAgIHBvcHVsYXRlZF9zdGF0dXMgcG9wdWxhdGVkOworICAgICAgICB3aGlsZSAoKHBvcHVsYXRlZCA9IGNncm91cElzUG9wdWxhdGVkKGV2ZW50c19mZC5nZXQoKSkpID09IHBvcHVsYXRlZF9zdGF0dXM6OnBvcHVsYXRlZCAmJgorICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkgPCB1bnRpbCkgeworCisgICAgICAgICAgICBzZW5kU2lnbmFsVG9Qcm9jZXNzR3JvdXAodWlkLCBpbml0aWFsUGlkLCBzaWduYWwpOworICAgICAgICAgICAgaWYgKG9uY2UpIHsKKyAgICAgICAgICAgICAgICBwb3B1bGF0ZWQgPSBjZ3JvdXBJc1BvcHVsYXRlZChldmVudHNfZmQuZ2V0KCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb25zdCBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50IHBvbGxfc3RhcnQgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKKworICAgICAgICAgICAgaWYgKHBvbGxfc3RhcnQgPCB1bnRpbCkKKyAgICAgICAgICAgICAgICByZXQgPSBURU1QX0ZBSUxVUkVfUkVUUlkocG9sbCgmZmRzLCAxLCB0b01pbGxpc2VjKHVudGlsIC0gcG9sbF9zdGFydCkuY291bnQoKSkpOworCisgICAgICAgICAgICBpZiAocmV0ID09IC0xKSB7CisgICAgICAgICAgICAgICAgLy8gRmFsbGJhY2sgdG8gNW1zIHNsZWVwcyBpZiBwb2xsIGZhaWxzCisgICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIlBvbGwgb24gIiA8PCBldmVudHNmaWxlIDw8ICJmYWlsZWQiOworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OnRpbWVfcG9pbnQgbm93ID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CisgICAgICAgICAgICAgICAgaWYgKG5vdyA8IHVudGlsKQorICAgICAgICAgICAgICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjptaW4oNW1zLCB0b01pbGxpc2VjKHVudGlsIC0gbm93KSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgIldhaXRlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdG9NaWxsaXNlYyhzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKSAtIHBvbGxfc3RhcnQpLmNvdW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIG1zIGZvciAiIDw8IGV2ZW50c2ZpbGUgPDwgIiBwb2xsIjsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghQ2dyb3Vwc0F2YWlsYWJsZSgpKSB7Ci0gICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmUsIGlmIGNncm91cHMgaXNuJ3QgYXZhaWxhYmxlCi0gICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY29uc3Qgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBraWxsX2R1cmF0aW9uID0KKyAgICAgICAgICAgICAgICB0b01pbGxpc2VjKHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpIC0gc3RhcnQpOworCisgICAgICAgIGlmIChwb3B1bGF0ZWQgPT0gcG9wdWxhdGVkX3N0YXR1czo6cG9wdWxhdGVkKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIlN0aWxsIHdhaXRpbmcgb24gcHJvY2VzcyhlcykgdG8gZXhpdCBmb3IgY2dyb3VwICIgPDwgY2dyb3VwX3YyX3BhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGFmdGVyICIgPDwga2lsbF9kdXJhdGlvbi5jb3VudCgpIDw8ICIgbXMiOworICAgICAgICAgICAgLy8gV2UnbGwgc3RpbGwgdHJ5IHRoZSBjZ3JvdXAgcmVtb3ZhbCBiZWxvdyB3aGljaCB3ZSBleHBlY3QgdG8gbG9nIGFuIGVycm9yLgorICAgICAgICB9IGVsc2UgaWYgKHBvcHVsYXRlZCA9PSBwb3B1bGF0ZWRfc3RhdHVzOjpub3RfcG9wdWxhdGVkKSB7CisgICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgIktpbGxlZCBhbGwgcHJvY2Vzc2VzIHVuZGVyIGNncm91cCAiIDw8IGNncm91cF92Ml9wYXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBhZnRlciAiIDw8IGtpbGxfZHVyYXRpb24uY291bnQoKSA8PCAiIG1zIjsKICAgICAgICAgfQogCi0gICAgICAgIC8vIDQwMCByZXRyaWVzIGNvcnJlc3BvbmQgdG8gMiBzZWNzIG1heCB0aW1lb3V0Ci0gICAgICAgIGludCBlcnIgPSBSZW1vdmVQcm9jZXNzR3JvdXAoY2dyb3VwLCB1aWQsIGluaXRpYWxQaWQsIDQwMCk7CisgICAgICAgIHJldCA9IFJlbW92ZUNncm91cChoaWVyYXJjaHlfcm9vdF9wYXRoLmNfc3RyKCksIHVpZCwgaW5pdGlhbFBpZCk7CisgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIHJlbW92ZSBjZ3JvdXAgIiA8PCBjZ3JvdXBfdjJfcGF0aDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgTE9HKElORk8pIDw8ICJSZW1vdmVkIGNncm91cCAiIDw8IGNncm91cF92Ml9wYXRoOwogCiAgICAgICAgIGlmIChpc01lbW9yeUNncm91cFN1cHBvcnRlZCgpICYmIFVzZVBlckFwcE1lbWNnKCkpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgcGVyLWFwcGxpY2F0aW9uIG1lbWNnIHYxIGNhc2Ugc2hvdWxkIGV2ZW50dWFsbHkgYmUgcmVtb3ZlZCBhZnRlciBtaWdyYXRpb24gdG8KKyAgICAgICAgICAgIC8vIG1lbWNnIHYyLgogICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWVtY2dfYXBwc19wYXRoOwogICAgICAgICAgICAgaWYgKENncm91cEdldE1lbWNnQXBwc1BhdGgoJm1lbWNnX2FwcHNfcGF0aCkgJiYKLSAgICAgICAgICAgICAgICBSZW1vdmVQcm9jZXNzR3JvdXAobWVtY2dfYXBwc19wYXRoLmNfc3RyKCksIHVpZCwgaW5pdGlhbFBpZCwgNDAwKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgKHJldCA9IFJlbW92ZUNncm91cChtZW1jZ19hcHBzX3BhdGguY19zdHIoKSwgdWlkLCBpbml0aWFsUGlkKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgY29uc3QgYXV0byBtZW1jZ192MV9jZ3JvdXBfcGF0aCA9CisgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0VWlkUGlkVG9QYXRoKG1lbWNnX2FwcHNfcGF0aC5jX3N0cigpLCB1aWQsIGluaXRpYWxQaWQpOworICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gcmVtb3ZlIG1lbWNnIHYxIGNncm91cCAiIDw8IG1lbWNnX3YxX2Nncm91cF9wYXRoOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAocmV0cmllcyA+IDApIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBraWxsIHByb2Nlc3MgY2dyb3VwIHVpZCAiIDw8IHVpZCA8PCAiIHBpZCAiIDw8IGluaXRpYWxQaWQKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBpbiAiIDw8IHN0YXRpY19jYXN0PGludD4obXMpIDw8ICJtcywgIiA8PCBwcm9jZXNzZXMKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBwcm9jZXNzZXMgcmVtYWluIjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQorICAgICAgICBpZiAob25jZSkgYnJlYWs7CisgICAgICAgIGlmIChzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKSA+PSB1bnRpbCkgYnJlYWs7CisgICAgfSB3aGlsZSAocmV0ICYmIGVycm5vID09IEVCVVNZKTsKKworICAgIHJldHVybiByZXQ7CiB9CiAKLWludCBraWxsUHJvY2Vzc0dyb3VwKHVpZF90IHVpZCwgaW50IGluaXRpYWxQaWQsIGludCBzaWduYWwsIGludCogbWF4X3Byb2Nlc3NlcykgewotICAgIHJldHVybiBLaWxsUHJvY2Vzc0dyb3VwKHVpZCwgaW5pdGlhbFBpZCwgc2lnbmFsLCA0MCAvKnJldHJpZXMqLywgbWF4X3Byb2Nlc3Nlcyk7CitpbnQga2lsbFByb2Nlc3NHcm91cCh1aWRfdCB1aWQsIHBpZF90IGluaXRpYWxQaWQsIGludCBzaWduYWwpIHsKKyAgICByZXR1cm4gS2lsbFByb2Nlc3NHcm91cCh1aWQsIGluaXRpYWxQaWQsIHNpZ25hbCk7CiB9CiAKLWludCBraWxsUHJvY2Vzc0dyb3VwT25jZSh1aWRfdCB1aWQsIGludCBpbml0aWFsUGlkLCBpbnQgc2lnbmFsLCBpbnQqIG1heF9wcm9jZXNzZXMpIHsKLSAgICByZXR1cm4gS2lsbFByb2Nlc3NHcm91cCh1aWQsIGluaXRpYWxQaWQsIHNpZ25hbCwgMCAvKnJldHJpZXMqLywgbWF4X3Byb2Nlc3Nlcyk7CitpbnQga2lsbFByb2Nlc3NHcm91cE9uY2UodWlkX3QgdWlkLCBwaWRfdCBpbml0aWFsUGlkLCBpbnQgc2lnbmFsKSB7CisgICAgcmV0dXJuIEtpbGxQcm9jZXNzR3JvdXAodWlkLCBpbml0aWFsUGlkLCBzaWduYWwsIHRydWUpOwogfQogCi1pbnQgc2VuZFNpZ25hbFRvUHJvY2Vzc0dyb3VwKHVpZF90IHVpZCwgaW50IGluaXRpYWxQaWQsIGludCBzaWduYWwpIHsKLSAgICBzdGQ6OnN0cmluZyBoaWVyYXJjaHlfcm9vdF9wYXRoOwotICAgIGlmIChDZ3JvdXBzQXZhaWxhYmxlKCkpIHsKLSAgICAgICAgQ2dyb3VwR2V0Q29udHJvbGxlclBhdGgoQ0dST1VQVjJfQ09OVFJPTExFUl9OQU1FLCAmaGllcmFyY2h5X3Jvb3RfcGF0aCk7Ci0gICAgfQotICAgIGNvbnN0IGNoYXIqIGNncm91cCA9IGhpZXJhcmNoeV9yb290X3BhdGguY19zdHIoKTsKLSAgICByZXR1cm4gRG9LaWxsUHJvY2Vzc0dyb3VwT25jZShjZ3JvdXAsIHVpZCwgaW5pdGlhbFBpZCwgc2lnbmFsKTsKLX0KLQotc3RhdGljIGludCBjcmVhdGVQcm9jZXNzR3JvdXBJbnRlcm5hbCh1aWRfdCB1aWQsIGludCBpbml0aWFsUGlkLCBzdGQ6OnN0cmluZyBjZ3JvdXAsCitzdGF0aWMgaW50IGNyZWF0ZVByb2Nlc3NHcm91cEludGVybmFsKHVpZF90IHVpZCwgcGlkX3QgaW5pdGlhbFBpZCwgc3RkOjpzdHJpbmcgY2dyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFjdGl2YXRlX2NvbnRyb2xsZXJzKSB7CiAgICAgYXV0byB1aWRfcGF0aCA9IENvbnZlcnRVaWRUb1BhdGgoY2dyb3VwLmNfc3RyKCksIHVpZCk7CiAKQEAgLTU3NCwxMCArNjYxLDkgQEAKICAgICAgICAgcmV0dXJuIC1lcnJubzsKICAgICB9CiAgICAgaWYgKGFjdGl2YXRlX2NvbnRyb2xsZXJzKSB7Ci0gICAgICAgIHJldCA9IENncm91cE1hcDo6R2V0SW5zdGFuY2UoKS5BY3RpdmF0ZUNvbnRyb2xsZXJzKHVpZF9wYXRoKTsKLSAgICAgICAgaWYgKHJldCkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGFjdGl2YXRlIGNvbnRyb2xsZXJzIGluICIgPDwgdWlkX3BhdGg7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAoIUNncm91cE1hcDo6R2V0SW5zdGFuY2UoKS5BY3RpdmF0ZUNvbnRyb2xsZXJzKHVpZF9wYXRoKSkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBhY3RpdmF0ZSBjb250cm9sbGVycyBpbiAiIDw8IHVpZF9wYXRoOworICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKICAgICAgICAgfQogICAgIH0KIApAQCAtNTg4LDcgKzY3NCw3IEBACiAgICAgICAgIHJldHVybiAtZXJybm87CiAgICAgfQogCi0gICAgYXV0byB1aWRfcGlkX3Byb2NzX2ZpbGUgPSB1aWRfcGlkX3BhdGggKyBQUk9DRVNTR1JPVVBfQ0dST1VQX1BST0NTX0ZJTEU7CisgICAgYXV0byB1aWRfcGlkX3Byb2NzX2ZpbGUgPSB1aWRfcGlkX3BhdGggKyAnLycgKyBQUk9DRVNTR1JPVVBfQ0dST1VQX1BST0NTX0ZJTEU7CiAKICAgICBpZiAoIVdyaXRlU3RyaW5nVG9GaWxlKHN0ZDo6dG9fc3RyaW5nKGluaXRpYWxQaWQpLCB1aWRfcGlkX3Byb2NzX2ZpbGUpKSB7CiAgICAgICAgIHJldCA9IC1lcnJubzsKQEAgLTU5OCwxMiArNjg0LDE4IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotaW50IGNyZWF0ZVByb2Nlc3NHcm91cCh1aWRfdCB1aWQsIGludCBpbml0aWFsUGlkLCBib29sIG1lbUNvbnRyb2wpIHsKLSAgICBDSEVDS19HRSh1aWQsIDApOwotICAgIENIRUNLX0dUKGluaXRpYWxQaWQsIDApOworaW50IGNyZWF0ZVByb2Nlc3NHcm91cCh1aWRfdCB1aWQsIHBpZF90IGluaXRpYWxQaWQsIGJvb2wgbWVtQ29udHJvbCkgeworICAgIGlmICh1aWQgPCAwKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgX19mdW5jX18gPDwgIjogaW52YWxpZCBVSUQgIiA8PCB1aWQ7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGluaXRpYWxQaWQgPD0gMCkgeworICAgICAgICBMT0coRVJST1IpIDw8IF9fZnVuY19fIDw8ICI6IGludmFsaWQgUElEICIgPDwgaW5pdGlhbFBpZDsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAogICAgIGlmIChtZW1Db250cm9sICYmICFVc2VQZXJBcHBNZW1jZygpKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJzZXJ2aWNlIG1lbW9yeSBjb250cm9scyBhcmUgdXNlZCB3aXRob3V0IHBlci1wcm9jZXNzIG1lbW9yeSBjZ3JvdXAgc3VwcG9ydCI7CisgICAgICAgIExPRyhFUlJPUikgPDwgInNlcnZpY2UgbWVtb3J5IGNvbnRyb2xzIGFyZSB1c2VkIHdpdGhvdXQgcGVyLXByb2Nlc3MgbWVtb3J5IGNncm91cCBzdXBwb3J0IjsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCkBAIC02MTksMTkgKzcxMSwxOSBAQAogICAgIH0KIAogICAgIHN0ZDo6c3RyaW5nIGNncm91cDsKLSAgICBDZ3JvdXBHZXRDb250cm9sbGVyUGF0aChDR1JPVVBWMl9DT05UUk9MTEVSX05BTUUsICZjZ3JvdXApOworICAgIENncm91cEdldENvbnRyb2xsZXJQYXRoKENHUk9VUFYyX0hJRVJBUkNIWV9OQU1FLCAmY2dyb3VwKTsKICAgICByZXR1cm4gY3JlYXRlUHJvY2Vzc0dyb3VwSW50ZXJuYWwodWlkLCBpbml0aWFsUGlkLCBjZ3JvdXAsIHRydWUpOwogfQogCi1zdGF0aWMgYm9vbCBTZXRQcm9jZXNzR3JvdXBWYWx1ZShpbnQgdGlkLCBjb25zdCBzdGQ6OnN0cmluZyYgYXR0cl9uYW1lLCBpbnQ2NF90IHZhbHVlKSB7CitzdGF0aWMgYm9vbCBTZXRQcm9jZXNzR3JvdXBWYWx1ZShwaWRfdCB0aWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBhdHRyX25hbWUsIGludDY0X3QgdmFsdWUpIHsKICAgICBpZiAoIWlzTWVtb3J5Q2dyb3VwU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgIk1lbWNnIGlzIG5vdCBtb3VudGVkLiI7CisgICAgICAgIExPRyhFUlJPUikgPDwgIk1lbWNnIGlzIG5vdCBtb3VudGVkLiI7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBzdGQ6OnN0cmluZyBwYXRoOwogICAgIGlmICghQ2dyb3VwR2V0QXR0cmlidXRlUGF0aEZvclRhc2soYXR0cl9uYW1lLCB0aWQsICZwYXRoKSkgewotICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGZpbmQgYXR0cmlidXRlICciIDw8IGF0dHJfbmFtZSA8PCAiJyI7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBmaW5kIGF0dHJpYnV0ZSAnIiA8PCBhdHRyX25hbWUgPDwgIiciOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkBAIC02NDIsMjMgKzczNCwyMyBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIHNldFByb2Nlc3NHcm91cFN3YXBwaW5lc3ModWlkX3QsIGludCBwaWQsIGludCBzd2FwcGluZXNzKSB7Citib29sIHNldFByb2Nlc3NHcm91cFN3YXBwaW5lc3ModWlkX3QsIHBpZF90IHBpZCwgaW50IHN3YXBwaW5lc3MpIHsKICAgICByZXR1cm4gU2V0UHJvY2Vzc0dyb3VwVmFsdWUocGlkLCAiTWVtU3dhcHBpbmVzcyIsIHN3YXBwaW5lc3MpOwogfQogCi1ib29sIHNldFByb2Nlc3NHcm91cFNvZnRMaW1pdCh1aWRfdCwgaW50IHBpZCwgaW50NjRfdCBzb2Z0X2xpbWl0X2luX2J5dGVzKSB7Citib29sIHNldFByb2Nlc3NHcm91cFNvZnRMaW1pdCh1aWRfdCwgcGlkX3QgcGlkLCBpbnQ2NF90IHNvZnRfbGltaXRfaW5fYnl0ZXMpIHsKICAgICByZXR1cm4gU2V0UHJvY2Vzc0dyb3VwVmFsdWUocGlkLCAiTWVtU29mdExpbWl0Iiwgc29mdF9saW1pdF9pbl9ieXRlcyk7CiB9CiAKLWJvb2wgc2V0UHJvY2Vzc0dyb3VwTGltaXQodWlkX3QsIGludCBwaWQsIGludDY0X3QgbGltaXRfaW5fYnl0ZXMpIHsKK2Jvb2wgc2V0UHJvY2Vzc0dyb3VwTGltaXQodWlkX3QsIHBpZF90IHBpZCwgaW50NjRfdCBsaW1pdF9pbl9ieXRlcykgewogICAgIHJldHVybiBTZXRQcm9jZXNzR3JvdXBWYWx1ZShwaWQsICJNZW1MaW1pdCIsIGxpbWl0X2luX2J5dGVzKTsKIH0KIAotYm9vbCBnZXRBdHRyaWJ1dGVQYXRoRm9yVGFzayhjb25zdCBzdGQ6OnN0cmluZyYgYXR0cl9uYW1lLCBpbnQgdGlkLCBzdGQ6OnN0cmluZyogcGF0aCkgeworYm9vbCBnZXRBdHRyaWJ1dGVQYXRoRm9yVGFzayhjb25zdCBzdGQ6OnN0cmluZyYgYXR0cl9uYW1lLCBwaWRfdCB0aWQsIHN0ZDo6c3RyaW5nKiBwYXRoKSB7CiAgICAgcmV0dXJuIENncm91cEdldEF0dHJpYnV0ZVBhdGhGb3JUYXNrKGF0dHJfbmFtZSwgdGlkLCBwYXRoKTsKIH0KIAotYm9vbCBpc1Byb2ZpbGVWYWxpZEZvclByb2Nlc3MoY29uc3Qgc3RkOjpzdHJpbmcmIHByb2ZpbGVfbmFtZSwgaW50IHVpZCwgaW50IHBpZCkgeworYm9vbCBpc1Byb2ZpbGVWYWxpZEZvclByb2Nlc3MoY29uc3Qgc3RkOjpzdHJpbmcmIHByb2ZpbGVfbmFtZSwgdWlkX3QgdWlkLCBwaWRfdCBwaWQpIHsKICAgICBjb25zdCBUYXNrUHJvZmlsZSogdHAgPSBUYXNrUHJvZmlsZXM6OkdldEluc3RhbmNlKCkuR2V0UHJvZmlsZShwcm9maWxlX25hbWUpOwogCiAgICAgaWYgKHRwID09IG51bGxwdHIpIHsKQEAgLTY2Niw0ICs3NTgsNCBAQAogICAgIH0KIAogICAgIHJldHVybiB0cC0+SXNWYWxpZEZvclByb2Nlc3ModWlkLCBwaWQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL2xpYnByb2Nlc3Nncm91cC9wcm9maWxlcy9BbmRyb2lkLmJwIGIvbGlicHJvY2Vzc2dyb3VwL3Byb2ZpbGVzL0FuZHJvaWQuYnAKaW5kZXggODg1OTcxYS4uYmFhNDU0NiAxMDA2NDQKLS0tIGEvbGlicHJvY2Vzc2dyb3VwL3Byb2ZpbGVzL0FuZHJvaWQuYnAKKysrIGIvbGlicHJvY2Vzc2dyb3VwL3Byb2ZpbGVzL0FuZHJvaWQuYnAKQEAgLTEzLDE3ICsxMywxMyBAQAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKIHBhY2thZ2UgeworICAgIGRlZmF1bHRfdGVhbTogInRyZW5keV90ZWFtX2FuZHJvaWRfa2VybmVsIiwKICAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCiB9CiAKIHByZWJ1aWx0X2V0YyB7CiAgICAgbmFtZTogImNncm91cHMuanNvbiIsCiAgICAgc3JjOiAiY2dyb3Vwcy5qc29uIiwKLSAgICByZXF1aXJlZDogWwotICAgICAgICAiY2dyb3Vwc18yOC5qc29uIiwKLSAgICAgICAgImNncm91cHNfMjkuanNvbiIsCi0gICAgICAgICJjZ3JvdXBzXzMwLmpzb24iLAotICAgIF0sCiB9CiAKIHByZWJ1aWx0X2V0YyB7CkBAIC0zNCw0OSArMzAsOCBAQAogfQogCiBwcmVidWlsdF9ldGMgewotICAgIG5hbWU6ICJjZ3JvdXBzXzI4Lmpzb24iLAotICAgIHNyYzogImNncm91cHNfMjguanNvbiIsCi0gICAgc3ViX2RpcjogInRhc2tfcHJvZmlsZXMiLAotfQotCi1wcmVidWlsdF9ldGMgewotICAgIG5hbWU6ICJjZ3JvdXBzXzI5Lmpzb24iLAotICAgIHNyYzogImNncm91cHNfMjkuanNvbiIsCi0gICAgc3ViX2RpcjogInRhc2tfcHJvZmlsZXMiLAotfQotCi1wcmVidWlsdF9ldGMgewotICAgIG5hbWU6ICJjZ3JvdXBzXzMwLmpzb24iLAotICAgIHNyYzogImNncm91cHNfMzAuanNvbiIsCi0gICAgc3ViX2RpcjogInRhc2tfcHJvZmlsZXMiLAotfQotCi1wcmVidWlsdF9ldGMgewogICAgIG5hbWU6ICJ0YXNrX3Byb2ZpbGVzLmpzb24iLAogICAgIHNyYzogInRhc2tfcHJvZmlsZXMuanNvbiIsCi0gICAgcmVxdWlyZWQ6IFsKLSAgICAgICAgInRhc2tfcHJvZmlsZXNfMjguanNvbiIsCi0gICAgICAgICJ0YXNrX3Byb2ZpbGVzXzI5Lmpzb24iLAotICAgICAgICAidGFza19wcm9maWxlc18zMC5qc29uIiwKLSAgICBdLAotfQotCi1wcmVidWlsdF9ldGMgewotICAgIG5hbWU6ICJ0YXNrX3Byb2ZpbGVzXzI4Lmpzb24iLAotICAgIHNyYzogInRhc2tfcHJvZmlsZXNfMjguanNvbiIsCi0gICAgc3ViX2RpcjogInRhc2tfcHJvZmlsZXMiLAotfQotCi1wcmVidWlsdF9ldGMgewotICAgIG5hbWU6ICJ0YXNrX3Byb2ZpbGVzXzI5Lmpzb24iLAotICAgIHNyYzogInRhc2tfcHJvZmlsZXNfMjkuanNvbiIsCi0gICAgc3ViX2RpcjogInRhc2tfcHJvZmlsZXMiLAotfQotCi1wcmVidWlsdF9ldGMgewotICAgIG5hbWU6ICJ0YXNrX3Byb2ZpbGVzXzMwLmpzb24iLAotICAgIHNyYzogInRhc2tfcHJvZmlsZXNfMzAuanNvbiIsCi0gICAgc3ViX2RpcjogInRhc2tfcHJvZmlsZXMiLAogfQogCiBjY19kZWZhdWx0cyB7CmRpZmYgLS1naXQgYS9saWJwcm9jZXNzZ3JvdXAvcHJvZmlsZXMvY2dyb3Vwcy5wcm90byBiL2xpYnByb2Nlc3Nncm91cC9wcm9maWxlcy9jZ3JvdXBzLnByb3RvCmluZGV4IGYyZGUzNDUuLmQyZmQ0NzIgMTAwNjQ0Ci0tLSBhL2xpYnByb2Nlc3Nncm91cC9wcm9maWxlcy9jZ3JvdXBzLnByb3RvCisrKyBiL2xpYnByb2Nlc3Nncm91cC9wcm9maWxlcy9jZ3JvdXBzLnByb3RvCkBAIC0yNCw3ICsyNCw3IEBACiAgICAgQ2dyb3VwczIgY2dyb3VwczIgPSAyIFtqc29uX25hbWUgPSAiQ2dyb3VwczIiXTsKIH0KIAotLy8gTmV4dDogOAorLy8gTmV4dDogOQogbWVzc2FnZSBDZ3JvdXAgewogICAgIHN0cmluZyBjb250cm9sbGVyID0gMSBbanNvbl9uYW1lID0gIkNvbnRyb2xsZXIiXTsKICAgICBzdHJpbmcgcGF0aCA9IDIgW2pzb25fbmFtZSA9ICJQYXRoIl07CkBAIC0zNiw2ICszNiw3IEBACiAvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2RlZmF1bHQKICAgICBib29sIG5lZWRzX2FjdGl2YXRpb24gPSA2IFtqc29uX25hbWUgPSAiTmVlZHNBY3RpdmF0aW9uIl07CiAgICAgYm9vbCBpc19vcHRpb25hbCA9IDcgW2pzb25fbmFtZSA9ICJPcHRpb25hbCJdOworICAgIHVpbnQzMiBtYXhfYWN0aXZhdGlvbl9kZXB0aCA9IDggW2pzb25fbmFtZSA9ICJNYXhBY3RpdmF0aW9uRGVwdGgiXTsKIH0KIAogLy8gTmV4dDogNgpkaWZmIC0tZ2l0IGEvbGlicHJvY2Vzc2dyb3VwL3Byb2ZpbGVzL2Nncm91cHNfMjguanNvbiBiL2xpYnByb2Nlc3Nncm91cC9wcm9maWxlcy9jZ3JvdXBzXzI4Lmpzb24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZDQ5MjkuLjAwMDAwMDAKLS0tIGEvbGlicHJvY2Vzc2dyb3VwL3Byb2ZpbGVzL2Nncm91cHNfMjguanNvbgorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXsKLSAgIkNncm91cHMiOiBbCi0gICAgewotICAgICAgIkNvbnRyb2xsZXIiOiAic2NoZWR0dW5lIiwKLSAgICAgICJQYXRoIjogIi9kZXYvc3R1bmUiLAotICAgICAgIk1vZGUiOiAiMDc1NSIsCi0gICAgICAiVUlEIjogInN5c3RlbSIsCi0gICAgICAiR0lEIjogInN5c3RlbSIKLSAgICB9Ci0gIF0KLX0KZGlmZiAtLWdpdCBhL2xpYnByb2Nlc3Nncm91cC9wcm9maWxlcy9jZ3JvdXBzXzI5Lmpzb24gYi9saWJwcm9jZXNzZ3JvdXAvcHJvZmlsZXMvY2dyb3Vwc18yOS5qc29uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2Q0OTI5Li4wMDAwMDAwCi0tLSBhL2xpYnByb2Nlc3Nncm91cC9wcm9maWxlcy9jZ3JvdXBzXzI5Lmpzb24KKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi17Ci0gICJDZ3JvdXBzIjogWwotICAgIHsKLSAgICAgICJDb250cm9sbGVyIjogInNjaGVkdHVuZSIsCi0gICAgICAiUGF0aCI6ICIvZGV2L3N0dW5lIiwKLSAgICAgICJNb2RlIjogIjA3NTUiLAotICAgICAgIlVJRCI6ICJzeXN0ZW0iLAotICAgICAgIkdJRCI6ICJzeXN0ZW0iCi0gICAgfQotICBdCi19CmRpZmYgLS1naXQgYS9saWJwcm9jZXNzZ3JvdXAvcHJvZmlsZXMvY2dyb3Vwc18zMC5qc29uIGIvbGlicHJvY2Vzc2dyb3VwL3Byb2ZpbGVzL2Nncm91cHNfMzAuanNvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBhMDc0Yi4uMDAwMDAwMAotLS0gYS9saWJwcm9jZXNzZ3JvdXAvcHJvZmlsZXMvY2dyb3Vwc18zMC5qc29uCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotewotICAiQ2dyb3VwcyI6IFsKLSAgICB7Ci0gICAgICAiQ29udHJvbGxlciI6ICJzY2hlZHR1bmUiLAotICAgICAgIlBhdGgiOiAiL2Rldi9zdHVuZSIsCi0gICAgICAiTW9kZSI6ICIwNzU1IiwKLSAgICAgICJVSUQiOiAic3lzdGVtIiwKLSAgICAgICJHSUQiOiAic3lzdGVtIiwKLSAgICAgICJPcHRpb25hbCI6IHRydWUKLSAgICB9Ci0gIF0KLX0KZGlmZiAtLWdpdCBhL2xpYnByb2Nlc3Nncm91cC9wcm9maWxlcy90YXNrX3Byb2ZpbGVzLmpzb24gYi9saWJwcm9jZXNzZ3JvdXAvcHJvZmlsZXMvdGFza19wcm9maWxlcy5qc29uCmluZGV4IDFmYzY2YmEuLjI4OTAyZWYgMTAwNjQ0Ci0tLSBhL2xpYnByb2Nlc3Nncm91cC9wcm9maWxlcy90YXNrX3Byb2ZpbGVzLmpzb24KKysrIGIvbGlicHJvY2Vzc2dyb3VwL3Byb2ZpbGVzL3Rhc2tfcHJvZmlsZXMuanNvbgpAQCAtMTEsNiArMTEsMTEgQEAKICAgICAgICJGaWxlIjogImZvcmVncm91bmQvY3B1cyIKICAgICB9LAogICAgIHsKKyAgICAgICJOYW1lIjogIkhpZ2hDYXBhY2l0eVdJQ1BVcyIsCisgICAgICAiQ29udHJvbGxlciI6ICJjcHVzZXQiLAorICAgICAgIkZpbGUiOiAiZm9yZWdyb3VuZF93aW5kb3cvY3B1cyIKKyAgICB9LAorICAgIHsKICAgICAgICJOYW1lIjogIk1heENhcGFjaXR5Q1BVcyIsCiAgICAgICAiQ29udHJvbGxlciI6ICJjcHVzZXQiLAogICAgICAgIkZpbGUiOiAidG9wLWFwcC9jcHVzIgpAQCAtMTU5LDYgKzE2NCwxOSBAQAogICAgICAgXQogICAgIH0sCiAgICAgeworICAgICAgIk5hbWUiOiAiSGlnaFBlcmZvcm1hbmNlV0kiLAorICAgICAgIkFjdGlvbnMiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAiTmFtZSI6ICJKb2luQ2dyb3VwIiwKKyAgICAgICAgICAiUGFyYW1zIjoKKyAgICAgICAgICB7CisgICAgICAgICAgICAiQ29udHJvbGxlciI6ICJjcHUiLAorICAgICAgICAgICAgIlBhdGgiOiAiZm9yZWdyb3VuZF93aW5kb3ciCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICB7CiAgICAgICAiTmFtZSI6ICJNYXhQZXJmb3JtYW5jZSIsCiAgICAgICAiQWN0aW9ucyI6IFsKICAgICAgICAgewpAQCAtMTg1LDYgKzIwMywxOSBAQAogICAgICAgXQogICAgIH0sCiAgICAgeworICAgICAgIk5hbWUiOiAiUmVhbFRpbWVJbnB1dFNjaGVkdWxpbmciLAorICAgICAgIkFjdGlvbnMiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAiTmFtZSI6ICJTZXRTY2hlZHVsZXJQb2xpY3kiLAorICAgICAgICAgICJQYXJhbXMiOgorICAgICAgICAgIHsKKyAgICAgICAgICAgICJQb2xpY3kiOiAiU0NIRURfRklGTyIsCisgICAgICAgICAgICAiUHJpb3JpdHkiOiAiMiIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgIHsKICAgICAgICJOYW1lIjogIkNhbWVyYVNlcnZpY2VQZXJmb3JtYW5jZSIsCiAgICAgICAiQWN0aW9ucyI6IFsKICAgICAgICAgewpAQCAtMzgyLDYgKzQxMywxOSBAQAogICAgICAgXQogICAgIH0sCiAgICAgeworICAgICAgIk5hbWUiOiAiUHJvY2Vzc0NhcGFjaXR5SGlnaFdJIiwKKyAgICAgICJBY3Rpb25zIjogWworICAgICAgICB7CisgICAgICAgICAgIk5hbWUiOiAiSm9pbkNncm91cCIsCisgICAgICAgICAgIlBhcmFtcyI6CisgICAgICAgICAgeworICAgICAgICAgICAgIkNvbnRyb2xsZXIiOiAiY3B1c2V0IiwKKyAgICAgICAgICAgICJQYXRoIjogImZvcmVncm91bmRfd2luZG93IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgewogICAgICAgIk5hbWUiOiAiUHJvY2Vzc0NhcGFjaXR5TWF4IiwKICAgICAgICJBY3Rpb25zIjogWwogICAgICAgICB7CkBAIC01NDEsMzMgKzU4NSw2IEBACiAgICAgfSwKIAogICAgIHsKLSAgICAgICJOYW1lIjogIlBlcmZCb29zdCIsCi0gICAgICAiQWN0aW9ucyI6IFsKLSAgICAgICAgewotICAgICAgICAgICJOYW1lIjogIlNldENsYW1wcyIsCi0gICAgICAgICAgIlBhcmFtcyI6Ci0gICAgICAgICAgewotICAgICAgICAgICAgIkJvb3N0IjogIjUwJSIsCi0gICAgICAgICAgICAiQ2xhbXAiOiAiMCIKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIF0KLSAgICB9LAotICAgIHsKLSAgICAgICJOYW1lIjogIlBlcmZDbGFtcCIsCi0gICAgICAiQWN0aW9ucyI6IFsKLSAgICAgICAgewotICAgICAgICAgICJOYW1lIjogIlNldENsYW1wcyIsCi0gICAgICAgICAgIlBhcmFtcyI6Ci0gICAgICAgICAgewotICAgICAgICAgICAgIkJvb3N0IjogIjAiLAotICAgICAgICAgICAgIkNsYW1wIjogIjMwJSIKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIF0KLSAgICB9LAotCi0gICAgewogICAgICAgIk5hbWUiOiAiTG93TWVtb3J5VXNhZ2UiLAogICAgICAgIkFjdGlvbnMiOiBbCiAgICAgICAgIHsKQEAgLTYzOSw2ICs2NTYsMTAgQEAKICAgICAgICJQcm9maWxlcyI6IFsgIkhpZ2hQZXJmb3JtYW5jZSIsICJIaWdoSW9Qcmlvcml0eSIsICJUaW1lclNsYWNrTm9ybWFsIiBdCiAgICAgfSwKICAgICB7CisgICAgICAiTmFtZSI6ICJTQ0hFRF9TUF9GT1JFR1JPVU5EX1dJTkRPVyIsCisgICAgICAiUHJvZmlsZXMiOiBbICJIaWdoUGVyZm9ybWFuY2VXSSIsICJIaWdoSW9Qcmlvcml0eSIsICJUaW1lclNsYWNrTm9ybWFsIiBdCisgICAgfSwKKyAgICB7CiAgICAgICAiTmFtZSI6ICJTQ0hFRF9TUF9UT1BfQVBQIiwKICAgICAgICJQcm9maWxlcyI6IFsgIk1heFBlcmZvcm1hbmNlIiwgIk1heElvUHJpb3JpdHkiLCAiVGltZXJTbGFja05vcm1hbCIgXQogICAgIH0sCkBAIC02NjcsNiArNjg4LDEwIEBACiAgICAgICAiUHJvZmlsZXMiOiBbICJIaWdoUGVyZm9ybWFuY2UiLCAiUHJvY2Vzc0NhcGFjaXR5SGlnaCIsICJIaWdoSW9Qcmlvcml0eSIsICJUaW1lclNsYWNrTm9ybWFsIiBdCiAgICAgfSwKICAgICB7CisgICAgICAiTmFtZSI6ICJDUFVTRVRfU1BfRk9SRUdST1VORF9XSU5ET1ciLAorICAgICAgIlByb2ZpbGVzIjogWyAiSGlnaFBlcmZvcm1hbmNlV0kiLCAiUHJvY2Vzc0NhcGFjaXR5SGlnaFdJIiwgIkhpZ2hJb1ByaW9yaXR5IiwgIlRpbWVyU2xhY2tOb3JtYWwiIF0KKyAgICB9LAorICAgIHsKICAgICAgICJOYW1lIjogIkNQVVNFVF9TUF9UT1BfQVBQIiwKICAgICAgICJQcm9maWxlcyI6IFsgIk1heFBlcmZvcm1hbmNlIiwgIlByb2Nlc3NDYXBhY2l0eU1heCIsICJNYXhJb1ByaW9yaXR5IiwgIlRpbWVyU2xhY2tOb3JtYWwiIF0KICAgICB9LApAQCAtNjg5LDYgKzcxNCwxMCBAQAogICAgIHsKICAgICAgICJOYW1lIjogIk90YVByb2ZpbGVzIiwKICAgICAgICJQcm9maWxlcyI6IFsgIlNlcnZpY2VDYXBhY2l0eUxvdyIsICJMb3dJb1ByaW9yaXR5IiwgIkhpZ2hFbmVyZ3lTYXZpbmciIF0KKyAgICB9LAorICAgIHsKKyAgICAgICJOYW1lIjogIklucHV0UG9saWN5IiwKKyAgICAgICJQcm9maWxlcyI6IFsgIlJlYWxUaW1lSW5wdXRTY2hlZHVsaW5nIiwgIk1heFBlcmZvcm1hbmNlIiwgIlByb2Nlc3NDYXBhY2l0eU1heCIsICJUaW1lclNsYWNrTm9ybWFsIiBdCiAgICAgfQogICBdCiB9CmRpZmYgLS1naXQgYS9saWJwcm9jZXNzZ3JvdXAvcHJvZmlsZXMvdGFza19wcm9maWxlc18yOC5qc29uIGIvbGlicHJvY2Vzc2dyb3VwL3Byb2ZpbGVzL3Rhc2tfcHJvZmlsZXNfMjguanNvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdiZTU0OC4uMDAwMDAwMAotLS0gYS9saWJwcm9jZXNzZ3JvdXAvcHJvZmlsZXMvdGFza19wcm9maWxlc18yOC5qc29uCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLXsKLSAgIkF0dHJpYnV0ZXMiOiBbCi0gICAgewotICAgICAgIk5hbWUiOiAiU1R1bmVCb29zdCIsCi0gICAgICAiQ29udHJvbGxlciI6ICJzY2hlZHR1bmUiLAotICAgICAgIkZpbGUiOiAic2NoZWR0dW5lLmJvb3N0IgotICAgIH0sCi0gICAgewotICAgICAgIk5hbWUiOiAiU1R1bmVQcmVmZXJJZGxlIiwKLSAgICAgICJDb250cm9sbGVyIjogInNjaGVkdHVuZSIsCi0gICAgICAiRmlsZSI6ICJzY2hlZHR1bmUucHJlZmVyX2lkbGUiCi0gICAgfQotICBdLAotCi0gICJQcm9maWxlcyI6IFsKLSAgICB7Ci0gICAgICAiTmFtZSI6ICJIaWdoRW5lcmd5U2F2aW5nIiwKLSAgICAgICJBY3Rpb25zIjogWwotICAgICAgICB7Ci0gICAgICAgICAgIk5hbWUiOiAiSm9pbkNncm91cCIsCi0gICAgICAgICAgIlBhcmFtcyI6Ci0gICAgICAgICAgewotICAgICAgICAgICAgIkNvbnRyb2xsZXIiOiAic2NoZWR0dW5lIiwKLSAgICAgICAgICAgICJQYXRoIjogImJhY2tncm91bmQiCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBdCi0gICAgfSwKLSAgICB7Ci0gICAgICAiTmFtZSI6ICJOb3JtYWxQZXJmb3JtYW5jZSIsCi0gICAgICAiQWN0aW9ucyI6IFsKLSAgICAgICAgewotICAgICAgICAgICJOYW1lIjogIkpvaW5DZ3JvdXAiLAotICAgICAgICAgICJQYXJhbXMiOgotICAgICAgICAgIHsKLSAgICAgICAgICAgICJDb250cm9sbGVyIjogInNjaGVkdHVuZSIsCi0gICAgICAgICAgICAiUGF0aCI6ICIiCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBdCi0gICAgfSwKLSAgICB7Ci0gICAgICAiTmFtZSI6ICJTZXJ2aWNlUGVyZm9ybWFuY2UiLAotICAgICAgIkFjdGlvbnMiOiBbCi0gICAgICAgIHsKLSAgICAgICAgICAiTmFtZSI6ICJKb2luQ2dyb3VwIiwKLSAgICAgICAgICAiUGFyYW1zIjoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAiQ29udHJvbGxlciI6ICJzY2hlZHR1bmUiLAotICAgICAgICAgICAgIlBhdGgiOiAiYmFja2dyb3VuZCIKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIF0KLSAgICB9LAotICAgIHsKLSAgICAgICJOYW1lIjogIkhpZ2hQZXJmb3JtYW5jZSIsCi0gICAgICAiQWN0aW9ucyI6IFsKLSAgICAgICAgewotICAgICAgICAgICJOYW1lIjogIkpvaW5DZ3JvdXAiLAotICAgICAgICAgICJQYXJhbXMiOgotICAgICAgICAgIHsKLSAgICAgICAgICAgICJDb250cm9sbGVyIjogInNjaGVkdHVuZSIsCi0gICAgICAgICAgICAiUGF0aCI6ICJmb3JlZ3JvdW5kIgotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgXQotICAgIH0sCi0gICAgewotICAgICAgIk5hbWUiOiAiTWF4UGVyZm9ybWFuY2UiLAotICAgICAgIkFjdGlvbnMiOiBbCi0gICAgICAgIHsKLSAgICAgICAgICAiTmFtZSI6ICJKb2luQ2dyb3VwIiwKLSAgICAgICAgICAiUGFyYW1zIjoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAiQ29udHJvbGxlciI6ICJzY2hlZHR1bmUiLAotICAgICAgICAgICAgIlBhdGgiOiAidG9wLWFwcCIKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIF0KLSAgICB9LAotICAgIHsKLSAgICAgICJOYW1lIjogIlJlYWx0aW1lUGVyZm9ybWFuY2UiLAotICAgICAgIkFjdGlvbnMiOiBbCi0gICAgICAgIHsKLSAgICAgICAgICAiTmFtZSI6ICJKb2luQ2dyb3VwIiwKLSAgICAgICAgICAiUGFyYW1zIjoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAiQ29udHJvbGxlciI6ICJzY2hlZHR1bmUiLAotICAgICAgICAgICAgIlBhdGgiOiAicnQiCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBdCi0gICAgfSwKLSAgICB7Ci0gICAgICAiTmFtZSI6ICJDYW1lcmFTZXJ2aWNlUGVyZm9ybWFuY2UiLAotICAgICAgIkFjdGlvbnMiOiBbCi0gICAgICAgIHsKLSAgICAgICAgICAiTmFtZSI6ICJKb2luQ2dyb3VwIiwKLSAgICAgICAgICAiUGFyYW1zIjoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAiQ29udHJvbGxlciI6ICJzY2hlZHR1bmUiLAotICAgICAgICAgICAgIlBhdGgiOiAiY2FtZXJhLWRhZW1vbiIKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIF0KLSAgICB9LAotICAgIHsKLSAgICAgICJOYW1lIjogIk5OQXBpSEFMUGVyZm9ybWFuY2UiLAotICAgICAgIkFjdGlvbnMiOiBbCi0gICAgICAgIHsKLSAgICAgICAgICAiTmFtZSI6ICJKb2luQ2dyb3VwIiwKLSAgICAgICAgICAiUGFyYW1zIjoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAiQ29udHJvbGxlciI6ICJzY2hlZHR1bmUiLAotICAgICAgICAgICAgIlBhdGgiOiAibm5hcGktaGFsIgotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgXQotICAgIH0sCi0gICAgewotICAgICAgIk5hbWUiOiAiRGV4Mm9hdFBlcmZvcm1hbmNlIiwKLSAgICAgICJBY3Rpb25zIjogWwotICAgICAgICB7Ci0gICAgICAgICAgIk5hbWUiOiAiSm9pbkNncm91cCIsCi0gICAgICAgICAgIlBhcmFtcyI6Ci0gICAgICAgICAgewotICAgICAgICAgICAgIkNvbnRyb2xsZXIiOiAic2NoZWR0dW5lIiwKLSAgICAgICAgICAgICJQYXRoIjogImJhY2tncm91bmQiCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBdCi0gICAgfSwKLSAgICB7Ci0gICAgICAiTmFtZSI6ICJDcHVQb2xpY3lTcHJlYWQiLAotICAgICAgIkFjdGlvbnMiOiBbCi0gICAgICAgIHsKLSAgICAgICAgICAiTmFtZSI6ICJTZXRBdHRyaWJ1dGUiLAotICAgICAgICAgICJQYXJhbXMiOgotICAgICAgICAgIHsKLSAgICAgICAgICAgICJOYW1lIjogIlNUdW5lUHJlZmVySWRsZSIsCi0gICAgICAgICAgICAiVmFsdWUiOiAiMSIKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIF0KLSAgICB9LAotICAgIHsKLSAgICAgICJOYW1lIjogIkNwdVBvbGljeVBhY2siLAotICAgICAgIkFjdGlvbnMiOiBbCi0gICAgICAgIHsKLSAgICAgICAgICAiTmFtZSI6ICJTZXRBdHRyaWJ1dGUiLAotICAgICAgICAgICJQYXJhbXMiOgotICAgICAgICAgIHsKLSAgICAgICAgICAgICJOYW1lIjogIlNUdW5lUHJlZmVySWRsZSIsCi0gICAgICAgICAgICAiVmFsdWUiOiAiMCIKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIF0KLSAgICB9Ci0gIF0KLX0KZGlmZiAtLWdpdCBhL2xpYnByb2Nlc3Nncm91cC9wcm9maWxlcy90YXNrX3Byb2ZpbGVzXzI5Lmpzb24gYi9saWJwcm9jZXNzZ3JvdXAvcHJvZmlsZXMvdGFza19wcm9maWxlc18yOS5qc29uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTc0YzhkLi4wMDAwMDAwCi0tLSBhL2xpYnByb2Nlc3Nncm91cC9wcm9maWxlcy90YXNrX3Byb2ZpbGVzXzI5Lmpzb24KKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotewotICAiQXR0cmlidXRlcyI6IFsKLSAgICB7Ci0gICAgICAiTmFtZSI6ICJTVHVuZUJvb3N0IiwKLSAgICAgICJDb250cm9sbGVyIjogInNjaGVkdHVuZSIsCi0gICAgICAiRmlsZSI6ICJzY2hlZHR1bmUuYm9vc3QiCi0gICAgfSwKLSAgICB7Ci0gICAgICAiTmFtZSI6ICJTVHVuZVByZWZlcklkbGUiLAotICAgICAgIkNvbnRyb2xsZXIiOiAic2NoZWR0dW5lIiwKLSAgICAgICJGaWxlIjogInNjaGVkdHVuZS5wcmVmZXJfaWRsZSIKLSAgICB9Ci0gIF0sCi0KLSAgIlByb2ZpbGVzIjogWwotICAgIHsKLSAgICAgICJOYW1lIjogIkhpZ2hFbmVyZ3lTYXZpbmciLAotICAgICAgIkFjdGlvbnMiOiBbCi0gICAgICAgIHsKLSAgICAgICAgICAiTmFtZSI6ICJKb2luQ2dyb3VwIiwKLSAgICAgICAgICAiUGFyYW1zIjoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAiQ29udHJvbGxlciI6ICJzY2hlZHR1bmUiLAotICAgICAgICAgICAgIlBhdGgiOiAiYmFja2dyb3VuZCIKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIF0KLSAgICB9LAotICAgIHsKLSAgICAgICJOYW1lIjogIk5vcm1hbFBlcmZvcm1hbmNlIiwKLSAgICAgICJBY3Rpb25zIjogWwotICAgICAgICB7Ci0gICAgICAgICAgIk5hbWUiOiAiSm9pbkNncm91cCIsCi0gICAgICAgICAgIlBhcmFtcyI6Ci0gICAgICAgICAgewotICAgICAgICAgICAgIkNvbnRyb2xsZXIiOiAic2NoZWR0dW5lIiwKLSAgICAgICAgICAgICJQYXRoIjogIiIKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIF0KLSAgICB9LAotICAgIHsKLSAgICAgICJOYW1lIjogIkhpZ2hQZXJmb3JtYW5jZSIsCi0gICAgICAiQWN0aW9ucyI6IFsKLSAgICAgICAgewotICAgICAgICAgICJOYW1lIjogIkpvaW5DZ3JvdXAiLAotICAgICAgICAgICJQYXJhbXMiOgotICAgICAgICAgIHsKLSAgICAgICAgICAgICJDb250cm9sbGVyIjogInNjaGVkdHVuZSIsCi0gICAgICAgICAgICAiUGF0aCI6ICJmb3JlZ3JvdW5kIgotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgXQotICAgIH0sCi0gICAgewotICAgICAgIk5hbWUiOiAiU2VydmljZVBlcmZvcm1hbmNlIiwKLSAgICAgICJBY3Rpb25zIjogWwotICAgICAgICB7Ci0gICAgICAgICAgIk5hbWUiOiAiSm9pbkNncm91cCIsCi0gICAgICAgICAgIlBhcmFtcyI6Ci0gICAgICAgICAgewotICAgICAgICAgICAgIkNvbnRyb2xsZXIiOiAic2NoZWR0dW5lIiwKLSAgICAgICAgICAgICJQYXRoIjogImJhY2tncm91bmQiCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBdCi0gICAgfSwKLSAgICB7Ci0gICAgICAiTmFtZSI6ICJNYXhQZXJmb3JtYW5jZSIsCi0gICAgICAiQWN0aW9ucyI6IFsKLSAgICAgICAgewotICAgICAgICAgICJOYW1lIjogIkpvaW5DZ3JvdXAiLAotICAgICAgICAgICJQYXJhbXMiOgotICAgICAgICAgIHsKLSAgICAgICAgICAgICJDb250cm9sbGVyIjogInNjaGVkdHVuZSIsCi0gICAgICAgICAgICAiUGF0aCI6ICJ0b3AtYXBwIgotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgXQotICAgIH0sCi0gICAgewotICAgICAgIk5hbWUiOiAiUmVhbHRpbWVQZXJmb3JtYW5jZSIsCi0gICAgICAiQWN0aW9ucyI6IFsKLSAgICAgICAgewotICAgICAgICAgICJOYW1lIjogIkpvaW5DZ3JvdXAiLAotICAgICAgICAgICJQYXJhbXMiOgotICAgICAgICAgIHsKLSAgICAgICAgICAgICJDb250cm9sbGVyIjogInNjaGVkdHVuZSIsCi0gICAgICAgICAgICAiUGF0aCI6ICJydCIKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIF0KLSAgICB9LAotICAgIHsKLSAgICAgICJOYW1lIjogIkNhbWVyYVNlcnZpY2VQZXJmb3JtYW5jZSIsCi0gICAgICAiQWN0aW9ucyI6IFsKLSAgICAgICAgewotICAgICAgICAgICJOYW1lIjogIkpvaW5DZ3JvdXAiLAotICAgICAgICAgICJQYXJhbXMiOgotICAgICAgICAgIHsKLSAgICAgICAgICAgICJDb250cm9sbGVyIjogInNjaGVkdHVuZSIsCi0gICAgICAgICAgICAiUGF0aCI6ICJjYW1lcmEtZGFlbW9uIgotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgXQotICAgIH0sCi0gICAgewotICAgICAgIk5hbWUiOiAiTk5BcGlIQUxQZXJmb3JtYW5jZSIsCi0gICAgICAiQWN0aW9ucyI6IFsKLSAgICAgICAgewotICAgICAgICAgICJOYW1lIjogIkpvaW5DZ3JvdXAiLAotICAgICAgICAgICJQYXJhbXMiOgotICAgICAgICAgIHsKLSAgICAgICAgICAgICJDb250cm9sbGVyIjogInNjaGVkdHVuZSIsCi0gICAgICAgICAgICAiUGF0aCI6ICJubmFwaS1oYWwiCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBdCi0gICAgfSwKLSAgICB7Ci0gICAgICAiTmFtZSI6ICJEZXgyb2F0UGVyZm9ybWFuY2UiLAotICAgICAgIkFjdGlvbnMiOiBbCi0gICAgICAgIHsKLSAgICAgICAgICAiTmFtZSI6ICJKb2luQ2dyb3VwIiwKLSAgICAgICAgICAiUGFyYW1zIjoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAiQ29udHJvbGxlciI6ICJzY2hlZHR1bmUiLAotICAgICAgICAgICAgIlBhdGgiOiAiYmFja2dyb3VuZCIKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIF0KLSAgICB9LAotICAgIHsKLSAgICAgICJOYW1lIjogIkNwdVBvbGljeVNwcmVhZCIsCi0gICAgICAiQWN0aW9ucyI6IFsKLSAgICAgICAgewotICAgICAgICAgICJOYW1lIjogIlNldEF0dHJpYnV0ZSIsCi0gICAgICAgICAgIlBhcmFtcyI6Ci0gICAgICAgICAgewotICAgICAgICAgICAgIk5hbWUiOiAiU1R1bmVQcmVmZXJJZGxlIiwKLSAgICAgICAgICAgICJWYWx1ZSI6ICIxIgotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgXQotICAgIH0sCi0gICAgewotICAgICAgIk5hbWUiOiAiQ3B1UG9saWN5UGFjayIsCi0gICAgICAiQWN0aW9ucyI6IFsKLSAgICAgICAgewotICAgICAgICAgICJOYW1lIjogIlNldEF0dHJpYnV0ZSIsCi0gICAgICAgICAgIlBhcmFtcyI6Ci0gICAgICAgICAgewotICAgICAgICAgICAgIk5hbWUiOiAiU1R1bmVQcmVmZXJJZGxlIiwKLSAgICAgICAgICAgICJWYWx1ZSI6ICIwIgotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgXQotICAgIH0KLSAgXQotfQpkaWZmIC0tZ2l0IGEvbGlicHJvY2Vzc2dyb3VwL3Byb2ZpbGVzL3Rhc2tfcHJvZmlsZXNfMzAuanNvbiBiL2xpYnByb2Nlc3Nncm91cC9wcm9maWxlcy90YXNrX3Byb2ZpbGVzXzMwLmpzb24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YmU1NDguLjAwMDAwMDAKLS0tIGEvbGlicHJvY2Vzc2dyb3VwL3Byb2ZpbGVzL3Rhc2tfcHJvZmlsZXNfMzAuanNvbgorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi17Ci0gICJBdHRyaWJ1dGVzIjogWwotICAgIHsKLSAgICAgICJOYW1lIjogIlNUdW5lQm9vc3QiLAotICAgICAgIkNvbnRyb2xsZXIiOiAic2NoZWR0dW5lIiwKLSAgICAgICJGaWxlIjogInNjaGVkdHVuZS5ib29zdCIKLSAgICB9LAotICAgIHsKLSAgICAgICJOYW1lIjogIlNUdW5lUHJlZmVySWRsZSIsCi0gICAgICAiQ29udHJvbGxlciI6ICJzY2hlZHR1bmUiLAotICAgICAgIkZpbGUiOiAic2NoZWR0dW5lLnByZWZlcl9pZGxlIgotICAgIH0KLSAgXSwKLQotICAiUHJvZmlsZXMiOiBbCi0gICAgewotICAgICAgIk5hbWUiOiAiSGlnaEVuZXJneVNhdmluZyIsCi0gICAgICAiQWN0aW9ucyI6IFsKLSAgICAgICAgewotICAgICAgICAgICJOYW1lIjogIkpvaW5DZ3JvdXAiLAotICAgICAgICAgICJQYXJhbXMiOgotICAgICAgICAgIHsKLSAgICAgICAgICAgICJDb250cm9sbGVyIjogInNjaGVkdHVuZSIsCi0gICAgICAgICAgICAiUGF0aCI6ICJiYWNrZ3JvdW5kIgotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgXQotICAgIH0sCi0gICAgewotICAgICAgIk5hbWUiOiAiTm9ybWFsUGVyZm9ybWFuY2UiLAotICAgICAgIkFjdGlvbnMiOiBbCi0gICAgICAgIHsKLSAgICAgICAgICAiTmFtZSI6ICJKb2luQ2dyb3VwIiwKLSAgICAgICAgICAiUGFyYW1zIjoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAiQ29udHJvbGxlciI6ICJzY2hlZHR1bmUiLAotICAgICAgICAgICAgIlBhdGgiOiAiIgotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgXQotICAgIH0sCi0gICAgewotICAgICAgIk5hbWUiOiAiU2VydmljZVBlcmZvcm1hbmNlIiwKLSAgICAgICJBY3Rpb25zIjogWwotICAgICAgICB7Ci0gICAgICAgICAgIk5hbWUiOiAiSm9pbkNncm91cCIsCi0gICAgICAgICAgIlBhcmFtcyI6Ci0gICAgICAgICAgewotICAgICAgICAgICAgIkNvbnRyb2xsZXIiOiAic2NoZWR0dW5lIiwKLSAgICAgICAgICAgICJQYXRoIjogImJhY2tncm91bmQiCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBdCi0gICAgfSwKLSAgICB7Ci0gICAgICAiTmFtZSI6ICJIaWdoUGVyZm9ybWFuY2UiLAotICAgICAgIkFjdGlvbnMiOiBbCi0gICAgICAgIHsKLSAgICAgICAgICAiTmFtZSI6ICJKb2luQ2dyb3VwIiwKLSAgICAgICAgICAiUGFyYW1zIjoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAiQ29udHJvbGxlciI6ICJzY2hlZHR1bmUiLAotICAgICAgICAgICAgIlBhdGgiOiAiZm9yZWdyb3VuZCIKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIF0KLSAgICB9LAotICAgIHsKLSAgICAgICJOYW1lIjogIk1heFBlcmZvcm1hbmNlIiwKLSAgICAgICJBY3Rpb25zIjogWwotICAgICAgICB7Ci0gICAgICAgICAgIk5hbWUiOiAiSm9pbkNncm91cCIsCi0gICAgICAgICAgIlBhcmFtcyI6Ci0gICAgICAgICAgewotICAgICAgICAgICAgIkNvbnRyb2xsZXIiOiAic2NoZWR0dW5lIiwKLSAgICAgICAgICAgICJQYXRoIjogInRvcC1hcHAiCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBdCi0gICAgfSwKLSAgICB7Ci0gICAgICAiTmFtZSI6ICJSZWFsdGltZVBlcmZvcm1hbmNlIiwKLSAgICAgICJBY3Rpb25zIjogWwotICAgICAgICB7Ci0gICAgICAgICAgIk5hbWUiOiAiSm9pbkNncm91cCIsCi0gICAgICAgICAgIlBhcmFtcyI6Ci0gICAgICAgICAgewotICAgICAgICAgICAgIkNvbnRyb2xsZXIiOiAic2NoZWR0dW5lIiwKLSAgICAgICAgICAgICJQYXRoIjogInJ0IgotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgXQotICAgIH0sCi0gICAgewotICAgICAgIk5hbWUiOiAiQ2FtZXJhU2VydmljZVBlcmZvcm1hbmNlIiwKLSAgICAgICJBY3Rpb25zIjogWwotICAgICAgICB7Ci0gICAgICAgICAgIk5hbWUiOiAiSm9pbkNncm91cCIsCi0gICAgICAgICAgIlBhcmFtcyI6Ci0gICAgICAgICAgewotICAgICAgICAgICAgIkNvbnRyb2xsZXIiOiAic2NoZWR0dW5lIiwKLSAgICAgICAgICAgICJQYXRoIjogImNhbWVyYS1kYWVtb24iCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBdCi0gICAgfSwKLSAgICB7Ci0gICAgICAiTmFtZSI6ICJOTkFwaUhBTFBlcmZvcm1hbmNlIiwKLSAgICAgICJBY3Rpb25zIjogWwotICAgICAgICB7Ci0gICAgICAgICAgIk5hbWUiOiAiSm9pbkNncm91cCIsCi0gICAgICAgICAgIlBhcmFtcyI6Ci0gICAgICAgICAgewotICAgICAgICAgICAgIkNvbnRyb2xsZXIiOiAic2NoZWR0dW5lIiwKLSAgICAgICAgICAgICJQYXRoIjogIm5uYXBpLWhhbCIKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIF0KLSAgICB9LAotICAgIHsKLSAgICAgICJOYW1lIjogIkRleDJvYXRQZXJmb3JtYW5jZSIsCi0gICAgICAiQWN0aW9ucyI6IFsKLSAgICAgICAgewotICAgICAgICAgICJOYW1lIjogIkpvaW5DZ3JvdXAiLAotICAgICAgICAgICJQYXJhbXMiOgotICAgICAgICAgIHsKLSAgICAgICAgICAgICJDb250cm9sbGVyIjogInNjaGVkdHVuZSIsCi0gICAgICAgICAgICAiUGF0aCI6ICJiYWNrZ3JvdW5kIgotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgXQotICAgIH0sCi0gICAgewotICAgICAgIk5hbWUiOiAiQ3B1UG9saWN5U3ByZWFkIiwKLSAgICAgICJBY3Rpb25zIjogWwotICAgICAgICB7Ci0gICAgICAgICAgIk5hbWUiOiAiU2V0QXR0cmlidXRlIiwKLSAgICAgICAgICAiUGFyYW1zIjoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAiTmFtZSI6ICJTVHVuZVByZWZlcklkbGUiLAotICAgICAgICAgICAgIlZhbHVlIjogIjEiCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBdCi0gICAgfSwKLSAgICB7Ci0gICAgICAiTmFtZSI6ICJDcHVQb2xpY3lQYWNrIiwKLSAgICAgICJBY3Rpb25zIjogWwotICAgICAgICB7Ci0gICAgICAgICAgIk5hbWUiOiAiU2V0QXR0cmlidXRlIiwKLSAgICAgICAgICAiUGFyYW1zIjoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAiTmFtZSI6ICJTVHVuZVByZWZlcklkbGUiLAotICAgICAgICAgICAgIlZhbHVlIjogIjAiCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBdCi0gICAgfQotICBdCi19CmRpZmYgLS1naXQgYS9saWJwcm9jZXNzZ3JvdXAvc2NoZWRfcG9saWN5LmNwcCBiL2xpYnByb2Nlc3Nncm91cC9zY2hlZF9wb2xpY3kuY3BwCmluZGV4IDE2OWIxZDMuLjVhNTNjMzUgMTAwNjQ0Ci0tLSBhL2xpYnByb2Nlc3Nncm91cC9zY2hlZF9wb2xpY3kuY3BwCisrKyBiL2xpYnByb2Nlc3Nncm91cC9zY2hlZF9wb2xpY3kuY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAjZGVmaW5lIExPR19UQUcgIlNjaGVkUG9saWN5IgogCiAjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KQEAgLTM4LDcgKzM5LDcgQEAKIAogI2lmIGRlZmluZWQoX19BTkRST0lEX18pCiAKLWludCBzZXRfY3B1c2V0X3BvbGljeShpbnQgdGlkLCBTY2hlZFBvbGljeSBwb2xpY3kpIHsKK2ludCBzZXRfY3B1c2V0X3BvbGljeShwaWRfdCB0aWQsIFNjaGVkUG9saWN5IHBvbGljeSkgewogICAgIGlmICh0aWQgPT0gMCkgewogICAgICAgICB0aWQgPSBHZXRUaHJlYWRJZCgpOwogICAgIH0KQEAgLTU3LDYgKzU4LDggQEAKICAgICAgICAgICAgIHJldHVybiBTZXRUYXNrUHJvZmlsZXModGlkLCB7IkNQVVNFVF9TUF9TWVNURU0ifSwgdHJ1ZSkgPyAwIDogLTE7CiAgICAgICAgIGNhc2UgU1BfUkVTVFJJQ1RFRDoKICAgICAgICAgICAgIHJldHVybiBTZXRUYXNrUHJvZmlsZXModGlkLCB7IkNQVVNFVF9TUF9SRVNUUklDVEVEIn0sIHRydWUpID8gMCA6IC0xOworICAgICAgICBjYXNlIFNQX0ZPUkVHUk9VTkRfV0lORE9XOgorICAgICAgICAgICAgcmV0dXJuIFNldFRhc2tQcm9maWxlcyh0aWQsIHsiQ1BVU0VUX1NQX0ZPUkVHUk9VTkRfV0lORE9XIn0sIHRydWUpID8gMCA6IC0xOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQpAQCAtNjQsNyArNjcsNyBAQAogICAgIHJldHVybiAwOwogfQogCi1pbnQgc2V0X3NjaGVkX3BvbGljeShpbnQgdGlkLCBTY2hlZFBvbGljeSBwb2xpY3kpIHsKK2ludCBzZXRfc2NoZWRfcG9saWN5KHBpZF90IHRpZCwgU2NoZWRQb2xpY3kgcG9saWN5KSB7CiAgICAgaWYgKHRpZCA9PSAwKSB7CiAgICAgICAgIHRpZCA9IEdldFRocmVhZElkKCk7CiAgICAgfQpAQCAtMTA5LDYgKzExMiw5IEBACiAgICAgICAgIGNhc2UgU1BfUlRfQVBQOgogICAgICAgICAgICAgU0xPR0QoIlJUICB0aWQgJWQgKCVzKSIsIHRpZCwgdGhyZWFkX25hbWUpOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1BfRk9SRUdST1VORF9XSU5ET1c6CisgICAgICAgICAgICBTTE9HRCgiV0kgIHRpZCAlZCAoJXMpIiwgdGlkLCB0aHJlYWRfbmFtZSk7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIFNMT0dEKCI/Pz8gdGlkICVkICglcykiLCB0aWQsIHRocmVhZF9uYW1lKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTI4LDYgKzEzNCw4IEBACiAgICAgICAgICAgICByZXR1cm4gU2V0VGFza1Byb2ZpbGVzKHRpZCwgeyJTQ0hFRF9TUF9TWVNURU0ifSwgdHJ1ZSkgPyAwIDogLTE7CiAgICAgICAgIGNhc2UgU1BfUlRfQVBQOgogICAgICAgICAgICAgcmV0dXJuIFNldFRhc2tQcm9maWxlcyh0aWQsIHsiU0NIRURfU1BfUlRfQVBQIn0sIHRydWUpID8gMCA6IC0xOworICAgICAgICBjYXNlIFNQX0ZPUkVHUk9VTkRfV0lORE9XOgorICAgICAgICAgICAgcmV0dXJuIFNldFRhc2tQcm9maWxlcyh0aWQsIHsiU0NIRURfU1BfRk9SRUdST1VORF9XSU5ET1cifSwgdHJ1ZSkgPyAwIDogLTE7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gU2V0VGFza1Byb2ZpbGVzKHRpZCwgeyJTQ0hFRF9TUF9ERUZBVUxUIn0sIHRydWUpID8gMCA6IC0xOwogICAgIH0KQEAgLTE0MCwyMSArMTQ4LDExIEBACiAgICAgcmV0dXJuIGVuYWJsZWQ7CiB9CiAKLXN0YXRpYyBib29sIHNjaGVkdHVuZV9lbmFibGVkKCkgewotICAgIHJldHVybiAoQ2dyb3VwTWFwOjpHZXRJbnN0YW5jZSgpLkZpbmRDb250cm9sbGVyKCJzY2hlZHR1bmUiKS5Jc1VzYWJsZSgpKTsKLX0KLQogc3RhdGljIGJvb2wgY3B1Y3RsX2VuYWJsZWQoKSB7CiAgICAgcmV0dXJuIChDZ3JvdXBNYXA6OkdldEluc3RhbmNlKCkuRmluZENvbnRyb2xsZXIoImNwdSIpLklzVXNhYmxlKCkpOwogfQogCi1ib29sIHNjaGVkYm9vc3RfZW5hYmxlZCgpIHsKLSAgICBzdGF0aWMgYm9vbCBlbmFibGVkID0gc2NoZWR0dW5lX2VuYWJsZWQoKSB8fCBjcHVjdGxfZW5hYmxlZCgpOwotCi0gICAgcmV0dXJuIGVuYWJsZWQ7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0Q0dyb3VwU3Vic3lzKGludCB0aWQsIGNvbnN0IGNoYXIqIHN1YnN5cywgc3RkOjpzdHJpbmcmIHN1Ymdyb3VwKSB7CitzdGF0aWMgaW50IGdldENHcm91cFN1YnN5cyhwaWRfdCB0aWQsIGNvbnN0IGNoYXIqIHN1YnN5cywgc3RkOjpzdHJpbmcmIHN1Ymdyb3VwKSB7CiAgICAgYXV0byBjb250cm9sbGVyID0gQ2dyb3VwTWFwOjpHZXRJbnN0YW5jZSgpLkZpbmRDb250cm9sbGVyKHN1YnN5cyk7CiAKICAgICBpZiAoIWNvbnRyb2xsZXIuSXNVc2FibGUoKSkgcmV0dXJuIC0xOwpAQCAtMTc4LDYgKzE3Niw4IEBACiAgICAgICAgICpwb2xpY3kgPSBTUF9UT1BfQVBQOwogICAgIH0gZWxzZSBpZiAoZ3JvdXAgPT0gInJlc3RyaWN0ZWQiKSB7CiAgICAgICAgICpwb2xpY3kgPSBTUF9SRVNUUklDVEVEOworICAgIH0gZWxzZSBpZiAoZ3JvdXAgPT0gImZvcmVncm91bmRfd2luZG93IikgeworICAgICAgICAqcG9saWN5ID0gU1BfRk9SRUdST1VORF9XSU5ET1c7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZXJybm8gPSBFUkFOR0U7CiAgICAgICAgIHJldHVybiAtMTsKQEAgLTE4NSwxNSArMTg1LDE0IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLWludCBnZXRfc2NoZWRfcG9saWN5KGludCB0aWQsIFNjaGVkUG9saWN5KiBwb2xpY3kpIHsKK2ludCBnZXRfc2NoZWRfcG9saWN5KHBpZF90IHRpZCwgU2NoZWRQb2xpY3kqIHBvbGljeSkgewogICAgIGlmICh0aWQgPT0gMCkgewogICAgICAgICB0aWQgPSBHZXRUaHJlYWRJZCgpOwogICAgIH0KIAogICAgIHN0ZDo6c3RyaW5nIGdyb3VwOwotICAgIGlmIChzY2hlZGJvb3N0X2VuYWJsZWQoKSkgewotICAgICAgICBpZiAoKGdldENHcm91cFN1YnN5cyh0aWQsICJzY2hlZHR1bmUiLCBncm91cCkgPCAwKSAmJgotICAgICAgICAgICAgKGdldENHcm91cFN1YnN5cyh0aWQsICJjcHUiLCBncm91cCkgPCAwKSkgeworICAgIGlmIChjcHVjdGxfZW5hYmxlZCgpKSB7CisgICAgICAgIGlmIChnZXRDR3JvdXBTdWJzeXModGlkLCAiY3B1IiwgZ3JvdXApIDwgMCkgewogICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGZpbmQgY3B1IGNncm91cCBmb3IgdGlkICIgPDwgdGlkOwogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CkBAIC0yMzQsNyArMjMzLDcgQEAKICAgICBzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga1NjaGVkUG9saWN5TmFtZXNbXSA9IHsKICAgICAgICAgICAgIFtTUF9CQUNLR1JPVU5EXSA9ICJiZyIsIFtTUF9GT1JFR1JPVU5EXSA9ICJmZyIsIFtTUF9TWVNURU1dID0gIiAgIiwKICAgICAgICAgICAgIFtTUF9BVURJT19BUFBdID0gImFhIiwgIFtTUF9BVURJT19TWVNdID0gImFzIiwgIFtTUF9UT1BfQVBQXSA9ICJ0YSIsCi0gICAgICAgICAgICBbU1BfUlRfQVBQXSA9ICJydCIsICAgICBbU1BfUkVTVFJJQ1RFRF0gPSAicnMiLAorICAgICAgICAgICAgW1NQX1JUX0FQUF0gPSAicnQiLCAgICAgW1NQX1JFU1RSSUNURURdID0gInJzIiwgW1NQX0ZPUkVHUk9VTkRfV0lORE9XXSA9ICJ3aSIsCiAgICAgfTsKICAgICBzdGF0aWNfYXNzZXJ0KGFycmF5c2l6ZShrU2NoZWRQb2xpY3lOYW1lcykgPT0gU1BfQ05ULCAibWlzc2luZyBuYW1lIik7CiAgICAgaWYgKHBvbGljeSA8IFNQX0JBQ0tHUk9VTkQgfHwgcG9saWN5ID49IFNQX0NOVCkgewpAQCAtMjQ4LDE0ICsyNDcsMTYgQEAKICAgICAgKiAgY3B1c2V0IHByb2ZpbGUgYXJyYXkgZm9yOgogICAgICAqICBTUF9ERUZBVUxUKC0xKSwgU1BfQkFDS0dST1VORCgwKSwgU1BfRk9SRUdST1VORCgxKSwKICAgICAgKiAgU1BfU1lTVEVNKDIpLCBTUF9BVURJT19BUFAoMyksIFNQX0FVRElPX1NZUyg0KSwKLSAgICAgKiAgU1BfVE9QX0FQUCg1KSwgU1BfUlRfQVBQKDYpLCBTUF9SRVNUUklDVEVEKDcpCisgICAgICogIFNQX1RPUF9BUFAoNSksIFNQX1JUX0FQUCg2KSwgU1BfUkVTVFJJQ1RFRCg3KSwKKyAgICAgKiAgU1BfRk9SRUdST1VORF9XSU5ET1coOCkKICAgICAgKiAgaW5kZXggaXMgcG9saWN5ICsgMQogICAgICAqICB0aGlzIG5lZWQga2VlcCBpbiBzeW5jIHdpdGggU2NoZWRQb2xpY3kgZW51bQogICAgICAqLwogICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhcioga0NwdXNldFByb2ZpbGVzW1NQX0NOVCArIDFdID0gewotICAgICAgICAgICAgIkNQVVNFVF9TUF9ERUZBVUxUIiwgIkNQVVNFVF9TUF9CQUNLR1JPVU5EIiwgIkNQVVNFVF9TUF9GT1JFR1JPVU5EIiwKLSAgICAgICAgICAgICJDUFVTRVRfU1BfU1lTVEVNIiwgICJDUFVTRVRfU1BfRk9SRUdST1VORCIsICJDUFVTRVRfU1BfRk9SRUdST1VORCIsCi0gICAgICAgICAgICAiQ1BVU0VUX1NQX1RPUF9BUFAiLCAiQ1BVU0VUX1NQX0RFRkFVTFQiLCAgICAiQ1BVU0VUX1NQX1JFU1RSSUNURUQifTsKKyAgICAgICAgICAgICJDUFVTRVRfU1BfREVGQVVMVCIsICAgICAgIkNQVVNFVF9TUF9CQUNLR1JPVU5EIiwgIkNQVVNFVF9TUF9GT1JFR1JPVU5EIiwKKyAgICAgICAgICAgICJDUFVTRVRfU1BfU1lTVEVNIiwgICAgICAgIkNQVVNFVF9TUF9GT1JFR1JPVU5EIiwgIkNQVVNFVF9TUF9GT1JFR1JPVU5EIiwKKyAgICAgICAgICAgICJDUFVTRVRfU1BfVE9QX0FQUCIsICAgICAgIkNQVVNFVF9TUF9ERUZBVUxUIiwgICAgIkNQVVNFVF9TUF9SRVNUUklDVEVEIiwKKyAgICAgICAgICAgICJDUFVTRVRfU1BfRk9SRUdST1VORF9XSU5ET1cifTsKICAgICBpZiAocG9saWN5IDwgU1BfREVGQVVMVCB8fCBwb2xpY3kgPj0gU1BfQ05UKSB7CiAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KQEAgLTI2NywxNCArMjY4LDE2IEBACiAgICAgICogIHNjaGVkIHByb2ZpbGUgYXJyYXkgZm9yOgogICAgICAqICBTUF9ERUZBVUxUKC0xKSwgU1BfQkFDS0dST1VORCgwKSwgU1BfRk9SRUdST1VORCgxKSwKICAgICAgKiAgU1BfU1lTVEVNKDIpLCBTUF9BVURJT19BUFAoMyksIFNQX0FVRElPX1NZUyg0KSwKLSAgICAgKiAgU1BfVE9QX0FQUCg1KSwgU1BfUlRfQVBQKDYpLCBTUF9SRVNUUklDVEVEKDcpCisgICAgICogIFNQX1RPUF9BUFAoNSksIFNQX1JUX0FQUCg2KSwgU1BfUkVTVFJJQ1RFRCg3KSwKKyAgICAgKiAgU1BfRk9SRUdST1VORF9XSU5ET1coOCkKICAgICAgKiAgaW5kZXggaXMgcG9saWN5ICsgMQogICAgICAqICB0aGlzIG5lZWQga2VlcCBpbiBzeW5jIHdpdGggU2NoZWRQb2xpY3kgZW51bQogICAgICAqLwogICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhcioga1NjaGVkUHJvZmlsZXNbU1BfQ05UICsgMV0gPSB7Ci0gICAgICAgICAgICAiU0NIRURfU1BfREVGQVVMVCIsICJTQ0hFRF9TUF9CQUNLR1JPVU5EIiwgIlNDSEVEX1NQX0ZPUkVHUk9VTkQiLAotICAgICAgICAgICAgIlNDSEVEX1NQX1NZU1RFTSIsICAiU0NIRURfU1BfRk9SRUdST1VORCIsICJTQ0hFRF9TUF9GT1JFR1JPVU5EIiwKLSAgICAgICAgICAgICJTQ0hFRF9TUF9UT1BfQVBQIiwgIlNDSEVEX1NQX1JUX0FQUCIsICAgICAiU0NIRURfU1BfREVGQVVMVCJ9OworICAgICAgICAgICAgIlNDSEVEX1NQX0RFRkFVTFQiLCAgICAgICJTQ0hFRF9TUF9CQUNLR1JPVU5EIiwgIlNDSEVEX1NQX0ZPUkVHUk9VTkQiLAorICAgICAgICAgICAgIlNDSEVEX1NQX1NZU1RFTSIsICAgICAgICJTQ0hFRF9TUF9GT1JFR1JPVU5EIiwgIlNDSEVEX1NQX0ZPUkVHUk9VTkQiLAorICAgICAgICAgICAgIlNDSEVEX1NQX1RPUF9BUFAiLCAgICAgICJTQ0hFRF9TUF9SVF9BUFAiLCAgICAgIlNDSEVEX1NQX0RFRkFVTFQiLAorICAgICAgICAgICAgIlNDSEVEX1NQX0ZPUkVHUk9VTkRfV0lORE9XIn07CiAgICAgaWYgKHBvbGljeSA8IFNQX0RFRkFVTFQgfHwgcG9saWN5ID49IFNQX0NOVCkgewogICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CmRpZmYgLS1naXQgYS9saWJwcm9jZXNzZ3JvdXAvc2V0dXAvQW5kcm9pZC5icCBiL2xpYnByb2Nlc3Nncm91cC9zZXR1cC9BbmRyb2lkLmJwCmluZGV4IGVhNmMyNDcuLjI1NzM3ZjUgMTAwNjQ0Ci0tLSBhL2xpYnByb2Nlc3Nncm91cC9zZXR1cC9BbmRyb2lkLmJwCisrKyBiL2xpYnByb2Nlc3Nncm91cC9zZXR1cC9BbmRyb2lkLmJwCkBAIC0yOSwxMSArMjksMTAgQEAKICAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJiYXNlIiwKLSAgICAgICAgImxpYmNncm91cHJjIiwKICAgICAgICAgImxpYmpzb25jcHAiLAogICAgIF0sCiAgICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYmNncm91cHJjX2Zvcm1hdCIsCisgICAgICAgICJsaWJwcm9jZXNzZ3JvdXBfdXRpbCIsCiAgICAgXSwKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGlicHJvY2Vzc2dyb3VwX2hlYWRlcnMiLApAQCAtNDEsOCArNDAsNSBAQAogICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKICAgICAgICAgImxpYnByb2Nlc3Nncm91cF9oZWFkZXJzIiwKICAgICBdLAotICAgIGNmbGFnczogWwotICAgICAgICAiLVdhbGwiLAotICAgICAgICAiLVdlcnJvciIsCi0gICAgXSwKKyAgICBkZWZhdWx0czogWyJsaWJwcm9jZXNzZ3JvdXBfYnVpbGRfZmxhZ3NfY2MiXSwKIH0KZGlmZiAtLWdpdCBhL2xpYnByb2Nlc3Nncm91cC9zZXR1cC9jZ3JvdXBfZGVzY3JpcHRvci5oIGIvbGlicHJvY2Vzc2dyb3VwL3NldHVwL2Nncm91cF9kZXNjcmlwdG9yLmgKaW5kZXggNjk5YzAzYy4uMWFmZDJlZSAxMDA2NDQKLS0tIGEvbGlicHJvY2Vzc2dyb3VwL3NldHVwL2Nncm91cF9kZXNjcmlwdG9yLmgKKysrIGIvbGlicHJvY2Vzc2dyb3VwL3NldHVwL2Nncm91cF9kZXNjcmlwdG9yLmgKQEAgLTE2LDE4ICsxNiwyMSBAQAogCiAjcHJhZ21hIG9uY2UKIAotI2luY2x1ZGUgPHByb2Nlc3Nncm91cC9mb3JtYXQvY2dyb3VwX2NvbnRyb2xsZXIuaD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN0cmluZz4KIAotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGNncm91cHJjIHsKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSA8cHJvY2Vzc2dyb3VwL2Nncm91cF9jb250cm9sbGVyLmg+CiAKIC8vIENvbXBsZXRlIGNvbnRyb2xsZXIgZGVzY3JpcHRpb24gZm9yIG1vdW50aW5nIGNncm91cHMKIGNsYXNzIENncm91cERlc2NyaXB0b3IgewogICBwdWJsaWM6CiAgICAgQ2dyb3VwRGVzY3JpcHRvcih1aW50MzJfdCB2ZXJzaW9uLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICBtb2RlX3QgbW9kZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHVpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIGdpZCwgdWludDMyX3QgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgbW9kZV90IG1vZGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiB1aWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBnaWQsIHVpbnQzMl90IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4X2FjdGl2YXRpb25fZGVwdGgpOwogCi0gICAgY29uc3QgZm9ybWF0OjpDZ3JvdXBDb250cm9sbGVyKiBjb250cm9sbGVyKCkgY29uc3QgeyByZXR1cm4gJmNvbnRyb2xsZXJfOyB9CisgICAgY29uc3QgQ2dyb3VwQ29udHJvbGxlciogY29udHJvbGxlcigpIGNvbnN0IHsgcmV0dXJuICZjb250cm9sbGVyXzsgfQogICAgIG1vZGVfdCBtb2RlKCkgY29uc3QgeyByZXR1cm4gbW9kZV87IH0KICAgICBzdGQ6OnN0cmluZyB1aWQoKSBjb25zdCB7IHJldHVybiB1aWRfOyB9CiAgICAgc3RkOjpzdHJpbmcgZ2lkKCkgY29uc3QgeyByZXR1cm4gZ2lkXzsgfQpAQCAtMzUsMTEgKzM4LDggQEAKICAgICB2b2lkIHNldF9tb3VudGVkKGJvb2wgbW91bnRlZCk7CiAKICAgcHJpdmF0ZToKLSAgICBmb3JtYXQ6OkNncm91cENvbnRyb2xsZXIgY29udHJvbGxlcl87CisgICAgQ2dyb3VwQ29udHJvbGxlciBjb250cm9sbGVyXzsKICAgICBtb2RlX3QgbW9kZV8gPSAwOwogICAgIHN0ZDo6c3RyaW5nIHVpZF87CiAgICAgc3RkOjpzdHJpbmcgZ2lkXzsKIH07Ci0KLX0gIC8vIG5hbWVzcGFjZSBjZ3JvdXByYwotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnByb2Nlc3Nncm91cC9zZXR1cC9jZ3JvdXBfbWFwX3dyaXRlLmNwcCBiL2xpYnByb2Nlc3Nncm91cC9zZXR1cC9jZ3JvdXBfbWFwX3dyaXRlLmNwcAppbmRleCBmYmVlZGY5Li5kMDViZjI0IDEwMDY0NAotLS0gYS9saWJwcm9jZXNzZ3JvdXAvc2V0dXAvY2dyb3VwX21hcF93cml0ZS5jcHAKKysrIGIvbGlicHJvY2Vzc2dyb3VwL3NldHVwL2Nncm91cF9tYXBfd3JpdGUuY3BwCkBAIC0yMiwzNSArMjIsMjIgQEAKICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPGdycC5oPgogI2luY2x1ZGUgPHB3ZC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAjaW5jbHVkZSA8c3lzL21vdW50Lmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx0aW1lLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKLSNpbmNsdWRlIDxyZWdleD4KKyNpbmNsdWRlIDxvcHRpb25hbD4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9jZ3JvdXByYy5oPgotI2luY2x1ZGUgPGpzb24vcmVhZGVyLmg+Ci0jaW5jbHVkZSA8anNvbi92YWx1ZS5oPgotI2luY2x1ZGUgPHByb2Nlc3Nncm91cC9mb3JtYXQvY2dyb3VwX2ZpbGUuaD4KKyNpbmNsdWRlIDxwcm9jZXNzZ3JvdXAvY2dyb3VwX2Rlc2NyaXB0b3IuaD4KICNpbmNsdWRlIDxwcm9jZXNzZ3JvdXAvcHJvY2Vzc2dyb3VwLmg+CiAjaW5jbHVkZSA8cHJvY2Vzc2dyb3VwL3NldHVwLmg+CisjaW5jbHVkZSA8cHJvY2Vzc2dyb3VwL3V0aWwuaD4KIAotI2luY2x1ZGUgImNncm91cF9kZXNjcmlwdG9yLmgiCi0KLXVzaW5nIGFuZHJvaWQ6OmJhc2U6OkdldFVpbnRQcm9wZXJ0eTsKLXVzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKLXVzaW5nIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZDsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGNncm91cHJjIHsKKyNpbmNsdWRlICIuLi9idWlsZF9mbGFncy5oIgorI2luY2x1ZGUgIi4uL2ludGVybmFsLmgiCiAKIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciogQ0dST1VQU19ERVNDX0ZJTEUgPSAiL2V0Yy9jZ3JvdXBzLmpzb24iOwogc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBDR1JPVVBTX0RFU0NfVkVORE9SX0ZJTEUgPSAiL3ZlbmRvci9ldGMvY2dyb3Vwcy5qc29uIjsKQEAgLTE0NCwxMjIgKzEzMSwxNSBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgdm9pZCBNZXJnZUNncm91cFRvRGVzY3JpcHRvcnMoc3RkOjptYXA8c3RkOjpzdHJpbmcsIENncm91cERlc2NyaXB0b3I+KiBkZXNjcmlwdG9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBKc29uOjpWYWx1ZSYgY2dyb3VwLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcm9vdF9wYXRoLCBpbnQgY2dyb3Vwc192ZXJzaW9uKSB7Ci0gICAgY29uc3Qgc3RkOjpzdHJpbmcgY2dyb3VwX3BhdGggPSBjZ3JvdXBbIlBhdGgiXS5hc1N0cmluZygpOwotICAgIHN0ZDo6c3RyaW5nIHBhdGg7Ci0KLSAgICBpZiAoIXJvb3RfcGF0aC5lbXB0eSgpKSB7Ci0gICAgICAgIHBhdGggPSByb290X3BhdGg7Ci0gICAgICAgIGlmIChjZ3JvdXBfcGF0aCAhPSAiLiIpIHsKLSAgICAgICAgICAgIHBhdGggKz0gIi8iOwotICAgICAgICAgICAgcGF0aCArPSBjZ3JvdXBfcGF0aDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBhdGggPSBjZ3JvdXBfcGF0aDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBjb250cm9sbGVyX2ZsYWdzID0gMDsKLQotICAgIGlmIChjZ3JvdXBbIk5lZWRzQWN0aXZhdGlvbiJdLmlzQm9vbCgpICYmIGNncm91cFsiTmVlZHNBY3RpdmF0aW9uIl0uYXNCb29sKCkpIHsKLSAgICAgICAgY29udHJvbGxlcl9mbGFncyB8PSBDR1JPVVBSQ19DT05UUk9MTEVSX0ZMQUdfTkVFRFNfQUNUSVZBVElPTjsKLSAgICB9Ci0KLSAgICBpZiAoY2dyb3VwWyJPcHRpb25hbCJdLmlzQm9vbCgpICYmIGNncm91cFsiT3B0aW9uYWwiXS5hc0Jvb2woKSkgewotICAgICAgICBjb250cm9sbGVyX2ZsYWdzIHw9IENHUk9VUFJDX0NPTlRST0xMRVJfRkxBR19PUFRJT05BTDsKLSAgICB9Ci0KLSAgICBDZ3JvdXBEZXNjcmlwdG9yIGRlc2NyaXB0b3IoCi0gICAgICAgICAgICBjZ3JvdXBzX3ZlcnNpb24sIG5hbWUsIHBhdGgsIHN0ZDo6c3RydG91bChjZ3JvdXBbIk1vZGUiXS5hc1N0cmluZygpLmNfc3RyKCksIDAsIDgpLAotICAgICAgICAgICAgY2dyb3VwWyJVSUQiXS5hc1N0cmluZygpLCBjZ3JvdXBbIkdJRCJdLmFzU3RyaW5nKCksIGNvbnRyb2xsZXJfZmxhZ3MpOwotCi0gICAgYXV0byBpdGVyID0gZGVzY3JpcHRvcnMtPmZpbmQobmFtZSk7Ci0gICAgaWYgKGl0ZXIgPT0gZGVzY3JpcHRvcnMtPmVuZCgpKSB7Ci0gICAgICAgIGRlc2NyaXB0b3JzLT5lbXBsYWNlKG5hbWUsIGRlc2NyaXB0b3IpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGl0ZXItPnNlY29uZCA9IGRlc2NyaXB0b3I7Ci0gICAgfQotfQotCi1zdGF0aWMgYm9vbCBSZWFkRGVzY3JpcHRvcnNGcm9tRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIENncm91cERlc2NyaXB0b3I+KiBkZXNjcmlwdG9ycykgewotICAgIHN0ZDo6dmVjdG9yPENncm91cERlc2NyaXB0b3I+IHJlc3VsdDsKLSAgICBzdGQ6OnN0cmluZyBqc29uX2RvYzsKLQotICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZyhmaWxlX25hbWUsICZqc29uX2RvYykpIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byByZWFkIHRhc2sgcHJvZmlsZXMgZnJvbSAiIDw8IGZpbGVfbmFtZTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEpzb246OkNoYXJSZWFkZXJCdWlsZGVyIGJ1aWxkZXI7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPEpzb246OkNoYXJSZWFkZXI+IHJlYWRlcihidWlsZGVyLm5ld0NoYXJSZWFkZXIoKSk7Ci0gICAgSnNvbjo6VmFsdWUgcm9vdDsKLSAgICBzdGQ6OnN0cmluZyBlcnJvck1lc3NhZ2U7Ci0gICAgaWYgKCFyZWFkZXItPnBhcnNlKCYqanNvbl9kb2MuYmVnaW4oKSwgJipqc29uX2RvYy5lbmQoKSwgJnJvb3QsICZlcnJvck1lc3NhZ2UpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBwYXJzZSBjZ3JvdXBzIGRlc2NyaXB0aW9uOiAiIDw8IGVycm9yTWVzc2FnZTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmIChyb290LmlzTWVtYmVyKCJDZ3JvdXBzIikpIHsKLSAgICAgICAgY29uc3QgSnNvbjo6VmFsdWUmIGNncm91cHMgPSByb290WyJDZ3JvdXBzIl07Ci0gICAgICAgIGZvciAoSnNvbjo6VmFsdWU6OkFycmF5SW5kZXggaSA9IDA7IGkgPCBjZ3JvdXBzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lID0gY2dyb3Vwc1tpXVsiQ29udHJvbGxlciJdLmFzU3RyaW5nKCk7Ci0gICAgICAgICAgICBNZXJnZUNncm91cFRvRGVzY3JpcHRvcnMoZGVzY3JpcHRvcnMsIGNncm91cHNbaV0sIG5hbWUsICIiLCAxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChyb290LmlzTWVtYmVyKCJDZ3JvdXBzMiIpKSB7Ci0gICAgICAgIGNvbnN0IEpzb246OlZhbHVlJiBjZ3JvdXBzMiA9IHJvb3RbIkNncm91cHMyIl07Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHJvb3RfcGF0aCA9IGNncm91cHMyWyJQYXRoIl0uYXNTdHJpbmcoKTsKLSAgICAgICAgTWVyZ2VDZ3JvdXBUb0Rlc2NyaXB0b3JzKGRlc2NyaXB0b3JzLCBjZ3JvdXBzMiwgQ0dST1VQVjJfQ09OVFJPTExFUl9OQU1FLCAiIiwgMik7Ci0KLSAgICAgICAgY29uc3QgSnNvbjo6VmFsdWUmIGNoaWxkR3JvdXBzID0gY2dyb3VwczJbIkNvbnRyb2xsZXJzIl07Ci0gICAgICAgIGZvciAoSnNvbjo6VmFsdWU6OkFycmF5SW5kZXggaSA9IDA7IGkgPCBjaGlsZEdyb3Vwcy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGNoaWxkR3JvdXBzW2ldWyJDb250cm9sbGVyIl0uYXNTdHJpbmcoKTsKLSAgICAgICAgICAgIE1lcmdlQ2dyb3VwVG9EZXNjcmlwdG9ycyhkZXNjcmlwdG9ycywgY2hpbGRHcm91cHNbaV0sIG5hbWUsIHJvb3RfcGF0aCwgMik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgUmVhZERlc2NyaXB0b3JzKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBDZ3JvdXBEZXNjcmlwdG9yPiogZGVzY3JpcHRvcnMpIHsKLSAgICAvLyBsb2FkIHN5c3RlbSBjZ3JvdXAgZGVzY3JpcHRvcnMKLSAgICBpZiAoIVJlYWREZXNjcmlwdG9yc0Zyb21GaWxlKENHUk9VUFNfREVTQ19GSUxFLCBkZXNjcmlwdG9ycykpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIGxvYWQgQVBJLWxldmVsIHNwZWNpZmljIHN5c3RlbSBjZ3JvdXBzIGRlc2NyaXB0b3JzIGlmIGF2YWlsYWJsZQotICAgIHVuc2lnbmVkIGludCBhcGlfbGV2ZWwgPSBHZXRVaW50UHJvcGVydHk8dW5zaWduZWQgaW50Pigicm8ucHJvZHVjdC5maXJzdF9hcGlfbGV2ZWwiLCAwKTsKLSAgICBpZiAoYXBpX2xldmVsID4gMCkgewotICAgICAgICBzdGQ6OnN0cmluZyBhcGlfY2dyb3Vwc19wYXRoID0KLSAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoVEVNUExBVEVfQ0dST1VQU19ERVNDX0FQSV9GSUxFLCBhcGlfbGV2ZWwpOwotICAgICAgICBpZiAoIWFjY2VzcyhhcGlfY2dyb3Vwc19wYXRoLmNfc3RyKCksIEZfT0spIHx8IGVycm5vICE9IEVOT0VOVCkgewotICAgICAgICAgICAgaWYgKCFSZWFkRGVzY3JpcHRvcnNGcm9tRmlsZShhcGlfY2dyb3Vwc19wYXRoLCBkZXNjcmlwdG9ycykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBsb2FkIHZlbmRvciBjZ3JvdXAgZGVzY3JpcHRvcnMgaWYgdGhlIGZpbGUgZXhpc3RzCi0gICAgaWYgKCFhY2Nlc3MoQ0dST1VQU19ERVNDX1ZFTkRPUl9GSUxFLCBGX09LKSAmJgotICAgICAgICAhUmVhZERlc2NyaXB0b3JzRnJvbUZpbGUoQ0dST1VQU19ERVNDX1ZFTkRPUl9GSUxFLCBkZXNjcmlwdG9ycykpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCiAvLyBUbyBhdm9pZCBpc3N1ZXMgaW4gc2RrX21hYyBidWlsZAogI2lmIGRlZmluZWQoX19BTkRST0lEX18pCiAKLXN0YXRpYyBib29sIElzT3B0aW9uYWxDb250cm9sbGVyKGNvbnN0IGZvcm1hdDo6Q2dyb3VwQ29udHJvbGxlciogY29udHJvbGxlcikgeworc3RhdGljIGJvb2wgSXNPcHRpb25hbENvbnRyb2xsZXIoY29uc3QgQ2dyb3VwQ29udHJvbGxlciogY29udHJvbGxlcikgewogICAgIHJldHVybiBjb250cm9sbGVyLT5mbGFncygpICYgQ0dST1VQUkNfQ09OVFJPTExFUl9GTEFHX09QVElPTkFMOwogfQogCiBzdGF0aWMgYm9vbCBNb3VudFYyQ2dyb3VwQ29udHJvbGxlcihjb25zdCBDZ3JvdXBEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSB7Ci0gICAgY29uc3QgZm9ybWF0OjpDZ3JvdXBDb250cm9sbGVyKiBjb250cm9sbGVyID0gZGVzY3JpcHRvci5jb250cm9sbGVyKCk7CisgICAgY29uc3QgQ2dyb3VwQ29udHJvbGxlciogY29udHJvbGxlciA9IGRlc2NyaXB0b3IuY29udHJvbGxlcigpOwogCiAgICAgLy8gL3N5cy9mcy9jZ3JvdXAgaXMgY3JlYXRlZCBieSBjZ3JvdXAyIHdpdGggc3BlY2lmaWMgc2VsaW51eCBwZXJtaXNzaW9ucywKICAgICAvLyB0cnkgdG8gY3JlYXRlIGFnYWluIGluIGNhc2UgdGhlIG1vdW50IHBvaW50IGlzIGNoYW5nZWQKQEAgLTI5MywzNCArMTczLDE4IEBACiB9CiAKIHN0YXRpYyBib29sIEFjdGl2YXRlVjJDZ3JvdXBDb250cm9sbGVyKGNvbnN0IENncm91cERlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIHsKLSAgICBjb25zdCBmb3JtYXQ6OkNncm91cENvbnRyb2xsZXIqIGNvbnRyb2xsZXIgPSBkZXNjcmlwdG9yLmNvbnRyb2xsZXIoKTsKKyAgICBjb25zdCBDZ3JvdXBDb250cm9sbGVyKiBjb250cm9sbGVyID0gZGVzY3JpcHRvci5jb250cm9sbGVyKCk7CiAKICAgICBpZiAoIU1rZGlyKGNvbnRyb2xsZXItPnBhdGgoKSwgZGVzY3JpcHRvci5tb2RlKCksIGRlc2NyaXB0b3IudWlkKCksIGRlc2NyaXB0b3IuZ2lkKCkpKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBjcmVhdGUgZGlyZWN0b3J5IGZvciAiIDw8IGNvbnRyb2xsZXItPm5hbWUoKSA8PCAiIGNncm91cCI7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoY29udHJvbGxlci0+ZmxhZ3MoKSAmIENHUk9VUFJDX0NPTlRST0xMRVJfRkxBR19ORUVEU19BQ1RJVkFUSU9OKSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHN0ciA9ICIrIjsKLSAgICAgICAgc3RyICs9IGNvbnRyb2xsZXItPm5hbWUoKTsKLSAgICAgICAgc3RkOjpzdHJpbmcgcGF0aCA9IGNvbnRyb2xsZXItPnBhdGgoKTsKLSAgICAgICAgcGF0aCArPSAiL2Nncm91cC5zdWJ0cmVlX2NvbnRyb2wiOwotCi0gICAgICAgIGlmICghYmFzZTo6V3JpdGVTdHJpbmdUb0ZpbGUoc3RyLCBwYXRoKSkgewotICAgICAgICAgICAgaWYgKElzT3B0aW9uYWxDb250cm9sbGVyKGNvbnRyb2xsZXIpKSB7Ci0gICAgICAgICAgICAgICAgUExPRyhJTkZPKSA8PCAiRmFpbGVkIHRvIGFjdGl2YXRlIG9wdGlvbmFsIGNvbnRyb2xsZXIgIiA8PCBjb250cm9sbGVyLT5uYW1lKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGFjdGl2YXRlIGNvbnRyb2xsZXIgIiA8PCBjb250cm9sbGVyLT5uYW1lKCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gOjpBY3RpdmF0ZUNvbnRyb2xsZXJzKGNvbnRyb2xsZXItPnBhdGgoKSwge3tjb250cm9sbGVyLT5uYW1lKCksIGRlc2NyaXB0b3J9fSk7CiB9CiAKIHN0YXRpYyBib29sIE1vdW50VjFDZ3JvdXBDb250cm9sbGVyKGNvbnN0IENncm91cERlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIHsKLSAgICBjb25zdCBmb3JtYXQ6OkNncm91cENvbnRyb2xsZXIqIGNvbnRyb2xsZXIgPSBkZXNjcmlwdG9yLmNvbnRyb2xsZXIoKTsKKyAgICBjb25zdCBDZ3JvdXBDb250cm9sbGVyKiBjb250cm9sbGVyID0gZGVzY3JpcHRvci5jb250cm9sbGVyKCk7CiAKICAgICAvLyBta2RpciA8cGF0aD4gW21vZGVdIFtvd25lcl0gW2dyb3VwXQogICAgIGlmICghTWtkaXIoY29udHJvbGxlci0+cGF0aCgpLCBkZXNjcmlwdG9yLm1vZGUoKSwgZGVzY3JpcHRvci51aWQoKSwgZGVzY3JpcHRvci5naWQoKSkpIHsKQEAgLTM1NSwxMCArMjE5LDEwIEBACiB9CiAKIHN0YXRpYyBib29sIFNldHVwQ2dyb3VwKGNvbnN0IENncm91cERlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIHsKLSAgICBjb25zdCBmb3JtYXQ6OkNncm91cENvbnRyb2xsZXIqIGNvbnRyb2xsZXIgPSBkZXNjcmlwdG9yLmNvbnRyb2xsZXIoKTsKKyAgICBjb25zdCBDZ3JvdXBDb250cm9sbGVyKiBjb250cm9sbGVyID0gZGVzY3JpcHRvci5jb250cm9sbGVyKCk7CiAKICAgICBpZiAoY29udHJvbGxlci0+dmVyc2lvbigpID09IDIpIHsKLSAgICAgICAgaWYgKCFzdHJjbXAoY29udHJvbGxlci0+bmFtZSgpLCBDR1JPVVBWMl9DT05UUk9MTEVSX05BTUUpKSB7CisgICAgICAgIGlmICghc3RyY21wKGNvbnRyb2xsZXItPm5hbWUoKSwgQ0dST1VQVjJfSElFUkFSQ0hZX05BTUUpKSB7CiAgICAgICAgICAgICByZXR1cm4gTW91bnRWMkNncm91cENvbnRyb2xsZXIoZGVzY3JpcHRvcik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXR1cm4gQWN0aXZhdGVWMkNncm91cENvbnRyb2xsZXIoZGVzY3JpcHRvcik7CkBAIC0zNzcsMzkgKzI0MSwxNCBAQAogCiAjZW5kaWYKIAotc3RhdGljIGJvb2wgV3JpdGVSY0ZpbGUoY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIENncm91cERlc2NyaXB0b3I+JiBkZXNjcmlwdG9ycykgewotICAgIHVuaXF1ZV9mZCBmZChURU1QX0ZBSUxVUkVfUkVUUlkob3BlbihDR1JPVVBTX1JDX1BBVEgsIE9fQ1JFQVQgfCBPX1dST05MWSB8IE9fVFJVTkMgfCBPX0NMT0VYRUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USCkpKTsKLSAgICBpZiAoZmQgPCAwKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJvcGVuKCkgZmFpbGVkIGZvciAiIDw8IENHUk9VUFNfUkNfUEFUSDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZvcm1hdDo6Q2dyb3VwRmlsZSBmbDsKLSAgICBmbC52ZXJzaW9uXyA9IGZvcm1hdDo6Q2dyb3VwRmlsZTo6RklMRV9DVVJSX1ZFUlNJT047Ci0gICAgZmwuY29udHJvbGxlcl9jb3VudF8gPSBkZXNjcmlwdG9ycy5zaXplKCk7Ci0gICAgaW50IHJldCA9IFRFTVBfRkFJTFVSRV9SRVRSWSh3cml0ZShmZCwgJmZsLCBzaXplb2YoZmwpKSk7Ci0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgIndyaXRlKCkgZmFpbGVkIGZvciAiIDw8IENHUk9VUFNfUkNfUEFUSDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZvciAoY29uc3QgYXV0byYgW25hbWUsIGRlc2NyaXB0b3JdIDogZGVzY3JpcHRvcnMpIHsKLSAgICAgICAgcmV0ID0gVEVNUF9GQUlMVVJFX1JFVFJZKAotICAgICAgICAgICAgICAgIHdyaXRlKGZkLCBkZXNjcmlwdG9yLmNvbnRyb2xsZXIoKSwgc2l6ZW9mKGZvcm1hdDo6Q2dyb3VwQ29udHJvbGxlcikpKTsKLSAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJ3cml0ZSgpIGZhaWxlZCBmb3IgIiA8PCBDR1JPVVBTX1JDX1BBVEg7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQogQ2dyb3VwRGVzY3JpcHRvcjo6Q2dyb3VwRGVzY3JpcHRvcih1aW50MzJfdCB2ZXJzaW9uLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIG1vZGVfdCBtb2RlLCBjb25zdCBzdGQ6OnN0cmluZyYgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2lkLCB1aW50MzJfdCBmbGFncyA9IDApCi0gICAgOiBjb250cm9sbGVyXyh2ZXJzaW9uLCBmbGFncywgbmFtZSwgcGF0aCksIG1vZGVfKG1vZGUpLCB1aWRfKHVpZCksIGdpZF8oZ2lkKSB7fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2lkLCB1aW50MzJfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4X2FjdGl2YXRpb25fZGVwdGgpCisgICAgOiBjb250cm9sbGVyXyh2ZXJzaW9uLCBmbGFncywgbmFtZSwgcGF0aCwgbWF4X2FjdGl2YXRpb25fZGVwdGgpLAorICAgICAgbW9kZV8obW9kZSksCisgICAgICB1aWRfKHVpZCksCisgICAgICBnaWRfKGdpZCkge30KIAogdm9pZCBDZ3JvdXBEZXNjcmlwdG9yOjpzZXRfbW91bnRlZChib29sIG1vdW50ZWQpIHsKICAgICB1aW50MzJfdCBmbGFncyA9IGNvbnRyb2xsZXJfLmZsYWdzKCk7CkBAIC00MjEsMjYgKzI2MCw2MiBAQAogICAgIGNvbnRyb2xsZXJfLnNldF9mbGFncyhmbGFncyk7CiB9CiAKLX0gIC8vIG5hbWVzcGFjZSBjZ3JvdXByYwotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK3N0YXRpYyBzdGQ6Om9wdGlvbmFsPGJvb2w+IE1HTFJVRGlzYWJsZWQoKSB7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmlsZV9uYW1lID0gIi9zeXMva2VybmVsL21tL2xydV9nZW4vZW5hYmxlZCI7CisgICAgc3RkOjpzdHJpbmcgY29udGVudDsKKyAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmcoZmlsZV9uYW1lLCAmY29udGVudCkpIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byByZWFkIE1HTFJVIHN0YXRlIGZyb20gIiA8PCBmaWxlX25hbWU7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisKKyAgICByZXR1cm4gY29udGVudCA9PSAiMHgwMDAwIjsKK30KKworc3RhdGljIHN0ZDo6b3B0aW9uYWw8Ym9vbD4gTUVNQ0dEaXNhYmxlZChjb25zdCBDZ3JvdXBEZXNjcmlwdG9yTWFwJiBkZXNjcmlwdG9ycykgeworICAgIHN0ZDo6c3RyaW5nIGNncm91cF92Ml9yb290ID0gQ0dST1VQX1YyX1JPT1RfREVGQVVMVDsKKyAgICBjb25zdCBhdXRvIGl0ID0gZGVzY3JpcHRvcnMuZmluZChDR1JPVVBWMl9ISUVSQVJDSFlfTkFNRSk7CisgICAgaWYgKGl0ID09IGRlc2NyaXB0b3JzLmVuZCgpKSB7CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiTm8gQ2dyb3VwczIgcGF0aCBmb3VuZCBpbiBjZ3JvdXBzLmpzb24uIFZlbmRvciBoYXMgbW9kaWZpZWQgQW5kcm9pZCwgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJrZXJuZWwgbWVtb3J5IHVzZSB3aWxsIGJlIGhpZ2hlciB0aGFuIGludGVuZGVkLiI7CisgICAgfSBlbHNlIGlmIChpdC0+c2Vjb25kLmNvbnRyb2xsZXIoKS0+cGF0aCgpICE9IGNncm91cF92Ml9yb290KSB7CisgICAgICAgIGNncm91cF92Ml9yb290ID0gaXQtPnNlY29uZC5jb250cm9sbGVyKCktPnBhdGgoKTsKKyAgICB9CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBmaWxlX25hbWUgPSBjZ3JvdXBfdjJfcm9vdCArICIvY2dyb3VwLmNvbnRyb2xsZXJzIjsKKyAgICBzdGQ6OnN0cmluZyBjb250ZW50OworICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZyhmaWxlX25hbWUsICZjb250ZW50KSkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlYWQgY2dyb3VwIGNvbnRyb2xsZXJzIGZyb20gIiA8PCBmaWxlX25hbWU7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSd2ZSBmb3JjZWQgbWVtY2cgdG8gdjIgYW5kIGl0J3Mgbm90IGF2YWlsYWJsZSwgdGhlbiBpdCBjb3VsZCBvbmx5IGhhdmUgYmVlbiBkaXNhYmxlZAorICAgIC8vIG9uIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lIChHS0kgc2V0cyBDT05GSUdfTUVNQ0cpLgorICAgIHJldHVybiBjb250ZW50LmZpbmQoIm1lbW9yeSIpID09IHN0ZDo6c3RyaW5nOjpucG9zOworfQorCitzdGF0aWMgYm9vbCBDcmVhdGVWMlN1YkhpZXJhcmNoeShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgY29uc3QgQ2dyb3VwRGVzY3JpcHRvck1hcCYgZGVzY3JpcHRvcnMpIHsKKyAgICBjb25zdCBhdXRvIGNndjJfaXRlciA9IGRlc2NyaXB0b3JzLmZpbmQoQ0dST1VQVjJfSElFUkFSQ0hZX05BTUUpOworICAgIGlmIChjZ3YyX2l0ZXIgPT0gZGVzY3JpcHRvcnMuZW5kKCkpIHJldHVybiBmYWxzZTsKKyAgICBjb25zdCBDZ3JvdXBEZXNjcmlwdG9yIGNndjJfZGVzY3JpcHRvciA9IGNndjJfaXRlci0+c2Vjb25kOworCisgICAgaWYgKCFNa2RpcihwYXRoLCBjZ3YyX2Rlc2NyaXB0b3IubW9kZSgpLCBjZ3YyX2Rlc2NyaXB0b3IudWlkKCksIGNndjJfZGVzY3JpcHRvci5naWQoKSkpIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBjcmVhdGUgZGlyZWN0b3J5IGZvciAiIDw8IHBhdGg7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBBY3RpdmF0ZSBhbGwgdjIgY29udHJvbGxlcnMgaW4gcGF0aCBzbyB0aGV5IGNhbiBiZSBhY3RpdmF0ZWQgaW4KKyAgICAvLyBjaGlsZHJlbiBhcyB0aGV5IGFyZSBjcmVhdGVkLgorICAgIHJldHVybiA6OkFjdGl2YXRlQ29udHJvbGxlcnMocGF0aCwgZGVzY3JpcHRvcnMpOworfQogCiBib29sIENncm91cFNldHVwKCkgewotICAgIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpjZ3JvdXByYzsKLQotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBDZ3JvdXBEZXNjcmlwdG9yPiBkZXNjcmlwdG9yczsKKyAgICBDZ3JvdXBEZXNjcmlwdG9yTWFwIGRlc2NyaXB0b3JzOwogCiAgICAgaWYgKGdldHBpZCgpICE9IDEpIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2dyb3VwIHNldHVwIGNhbiBiZSBkb25lIG9ubHkgYnkgaW5pdCBwcm9jZXNzIjsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIC8vIE1ha2Ugc3VyZSB3ZSBkbyB0aGlzIG9ubHkgb25lIHRpbWUuIE5vIG5lZWQgZm9yIHN0ZDo6Y2FsbF9vbmNlIGJlY2F1c2UKLSAgICAvLyBpbml0IGlzIGEgc2luZ2xlLXRocmVhZGVkIHByb2Nlc3MKLSAgICBpZiAoYWNjZXNzKENHUk9VUFNfUkNfUEFUSCwgRl9PSykgPT0gMCkgewotICAgICAgICBMT0coV0FSTklORykgPDwgIkF0dGVtcHQgdG8gY2FsbCBDZ3JvdXBTZXR1cCgpIG1vcmUgdGhhbiBvbmNlIjsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCiAgICAgLy8gbG9hZCBjZ3JvdXBzLmpzb24gZmlsZQogICAgIGlmICghUmVhZERlc2NyaXB0b3JzKCZkZXNjcmlwdG9ycykpIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGxvYWQgY2dyb3VwIGRlc2NyaXB0aW9uIGZpbGUiOwpAQCAtNDQ5LDMzICszMjQsNDEgQEAKIAogICAgIC8vIHNldHVwIGNncm91cHMKICAgICBmb3IgKGF1dG8mIFtuYW1lLCBkZXNjcmlwdG9yXSA6IGRlc2NyaXB0b3JzKSB7Ci0gICAgICAgIGlmIChTZXR1cENncm91cChkZXNjcmlwdG9yKSkgewotICAgICAgICAgICAgZGVzY3JpcHRvci5zZXRfbW91bnRlZCh0cnVlKTsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGRlc2NyaXB0b3IuY29udHJvbGxlcigpLT5mbGFncygpICYgQ0dST1VQUkNfQ09OVFJPTExFUl9GTEFHX01PVU5URUQpIHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiQXR0ZW1wdCB0byBjYWxsIENncm91cFNldHVwKCkgbW9yZSB0aGFuIG9uY2UiOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIVNldHVwQ2dyb3VwKGRlc2NyaXB0b3IpKSB7CiAgICAgICAgICAgICAvLyBpc3N1ZSBhIHdhcm5pbmcgYW5kIHByb2NlZWQgd2l0aCB0aGUgbmV4dCBjZ3JvdXAKICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiRmFpbGVkIHRvIHNldHVwICIgPDwgbmFtZSA8PCAiIGNncm91cCI7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBta2RpciA8Q0dST1VQU19SQ19ESVI+IDA3MTEgc3lzdGVtIHN5c3RlbQotICAgIGlmICghTWtkaXIoYW5kcm9pZDo6YmFzZTo6RGlybmFtZShDR1JPVVBTX1JDX1BBVEgpLCAwNzExLCAic3lzdGVtIiwgInN5c3RlbSIpKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBjcmVhdGUgZGlyZWN0b3J5IGZvciAiIDw8IENHUk9VUFNfUkNfUEFUSCA8PCAiIGZpbGUiOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGFuZHJvaWQ6OmxpYnByb2Nlc3Nncm91cF9mbGFnczo6Zm9yY2VfbWVtY2dfdjIoKSkgeworICAgICAgICBpZiAoTUdMUlVEaXNhYmxlZCgpLnZhbHVlX29yKGZhbHNlKSkgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJNZW1jZyBmb3JjZWQgdG8gdjIgaGllcmFyY2h5IHdpdGggTUdMUlUgZGlzYWJsZWQhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiR2xvYmFsIHJlY2xhaW0gcGVyZm9ybWFuY2Ugd2lsbCBzdWZmZXIuIjsKKyAgICAgICAgfQorICAgICAgICBpZiAoTUVNQ0dEaXNhYmxlZChkZXNjcmlwdG9ycykudmFsdWVfb3IoZmFsc2UpKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIk1lbWNnIGZvcmNlZCB0byB2MiBoaWVyYXJjaHkgd2hpbGUgbWVtY2cgaXMgZGlzYWJsZWQgYnkga2VybmVsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiY29tbWFuZCBsaW5lISI7CisgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBHZW5lcmF0ZSA8Q0dST1VQU19SQ19GSUxFPiBmaWxlIHdoaWNoIGNhbiBiZSBkaXJlY3RseSBtbWFwcGVkIGludG8KLSAgICAvLyBwcm9jZXNzIG1lbW9yeS4gVGhpcyBvcHRpbWl6ZXMgcGVyZm9ybWFuY2UsIG1lbW9yeSB1c2FnZQotICAgIC8vIGFuZCBsaW1pdHMgaW5mcm9ybWF0aW9uIHNoYXJlZCB3aXRoIHVucHJpdmlsZWdlZCBwcm9jZXNzZXMKLSAgICAvLyB0byB0aGUgbWluaW11bSBzdWJzZXQgb2YgaW5mb3JtYXRpb24gZnJvbSBjZ3JvdXBzLmpzb24KLSAgICBpZiAoIVdyaXRlUmNGaWxlKGRlc2NyaXB0b3JzKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gd3JpdGUgIiA8PCBDR1JPVVBTX1JDX1BBVEggPDwgIiBmaWxlIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KKyAgICAvLyBTeXN0ZW0gLyBhcHAgaXNvbGF0aW9uLgorICAgIC8vIFRoaXMgcmVhbGx5IGJlbG9uZ3MgaW4gZWFybHktaW5pdCBpbiBpbml0LnJjLCBidXQgd2UgY2Fubm90IHVzZSB0aGUgZmxhZyB0aGVyZS4KKyAgICBpZiAoYW5kcm9pZDo6bGlicHJvY2Vzc2dyb3VwX2ZsYWdzOjpjZ3JvdXBfdjJfc3lzX2FwcF9pc29sYXRpb24oKSkgeworICAgICAgICBjb25zdCBhdXRvIGl0ID0gZGVzY3JpcHRvcnMuZmluZChDR1JPVVBWMl9ISUVSQVJDSFlfTkFNRSk7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGNncm91cF92Ml9yb290ID0gKGl0ID09IGRlc2NyaXB0b3JzLmVuZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDR1JPVVBfVjJfUk9PVF9ERUZBVUxUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGl0LT5zZWNvbmQuY29udHJvbGxlcigpLT5wYXRoKCk7CiAKLSAgICAvLyBjaG1vZCAwNjQ0IDxDR1JPVVBTX1JDX1BBVEg+Ci0gICAgaWYgKGZjaG1vZGF0KEFUX0ZEQ1dELCBDR1JPVVBTX1JDX1BBVEgsIDA2NDQsIEFUX1NZTUxJTktfTk9GT0xMT1cpIDwgMCkgewotICAgICAgICBQTE9HKEVSUk9SKSA8PCAiZmNobW9kYXQoKSBmYWlsZWQiOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIExPRyhJTkZPKSA8PCAiVXNpbmcgc3lzdGVtL2FwcCBpc29sYXRpb24gdW5kZXI6ICIgPDwgY2dyb3VwX3YyX3Jvb3Q7CisgICAgICAgIGlmICghQ3JlYXRlVjJTdWJIaWVyYXJjaHkoY2dyb3VwX3YyX3Jvb3QgKyAiL2FwcHMiLCBkZXNjcmlwdG9ycykgfHwKKyAgICAgICAgICAgICFDcmVhdGVWMlN1YkhpZXJhcmNoeShjZ3JvdXBfdjJfcm9vdCArICIvc3lzdGVtIiwgZGVzY3JpcHRvcnMpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL2xpYnByb2Nlc3Nncm91cC90YXNrX3Byb2ZpbGVzLmNwcCBiL2xpYnByb2Nlc3Nncm91cC90YXNrX3Byb2ZpbGVzLmNwcAppbmRleCBmNTFiMDc2Li5kYzZjOGMwIDEwMDY0NAotLS0gYS9saWJwcm9jZXNzZ3JvdXAvdGFza19wcm9maWxlcy5jcHAKKysrIGIvbGlicHJvY2Vzc2dyb3VwL3Rhc2tfcHJvZmlsZXMuY3BwCkBAIC0xNywxMCArMTcsMTggQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAibGlicHJvY2Vzc2dyb3VwIgogCi0jaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDx0YXNrX3Byb2ZpbGVzLmg+CisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8b3B0aW9uYWw+CiAjaW5jbHVkZSA8c3RyaW5nPgogCisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CkBAIC0yOCwxNiArMzYsMTMgQEAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS90aHJlYWRzLmg+CiAKKyNpbmNsdWRlIDxidWlsZF9mbGFncy5oPgorCiAjaW5jbHVkZSA8Y3V0aWxzL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KIAogI2luY2x1ZGUgPGpzb24vcmVhZGVyLmg+CiAjaW5jbHVkZSA8anNvbi92YWx1ZS5oPgogCi0vLyBUbyBhdm9pZCBpc3N1ZXMgaW4gc2RrX21hYyBidWlsZAotI2lmIGRlZmluZWQoX19BTkRST0lEX18pCi0jaW5jbHVkZSA8c3lzL3ByY3RsLmg+Ci0jZW5kaWYKLQogdXNpbmcgYW5kcm9pZDo6YmFzZTo6R2V0VGhyZWFkSWQ7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjpHZXRVaW50UHJvcGVydHk7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7CkBAIC01MCw2ICs1NSw3IEBACiAKIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciogVEVNUExBVEVfVEFTS19QUk9GSUxFX0FQSV9GSUxFID0KICAgICAgICAgIi9ldGMvdGFza19wcm9maWxlcy90YXNrX3Byb2ZpbGVzXyV1Lmpzb24iOworbmFtZXNwYWNlIHsKIAogY2xhc3MgRmRDYWNoZUhlbHBlciB7CiAgIHB1YmxpYzoKQEAgLTYwLDggKzY2LDExIEBACiAgICAgfTsKIAogICAgIHN0YXRpYyB2b2lkIENhY2hlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQmIGZkKTsKKwogICAgIHN0YXRpYyB2b2lkIERyb3AoYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkJiBmZCk7CisKICAgICBzdGF0aWMgdm9pZCBJbml0KGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQmIGZkKTsKKwogICAgIHN0YXRpYyBib29sIElzQ2FjaGVkKGNvbnN0IGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCYgZmQpIHsgcmV0dXJuIGZkID4gRkRTX0lOQUNDRVNTSUJMRTsgfQogCiAgIHByaXZhdGU6CkBAIC0xMTIsNiArMTIxLDE3IEBACiAgICAgcmV0dXJuIHBhdGguZmluZCgiPHVpZD4iLCAwKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyB8fCBwYXRoLmZpbmQoIjxwaWQ+IiwgMCkgIT0gc3RkOjpzdHJpbmc6Om5wb3M7CiB9CiAKK3N0ZDo6b3B0aW9uYWw8bG9uZz4gcmVhZExvbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICAgIGNoYXIqIGVuZDsKKyAgICBjb25zdCBsb25nIHJlc3VsdCA9IHN0cnRvbChzdHIuY19zdHIoKSwgJmVuZCwgMTApOworICAgIGlmIChlbmQgPiBzdHIuY19zdHIoKSkgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gc3RkOjpudWxsb3B0OworfQorCit9ICAvLyBuYW1lc3BhY2UKKwogSVByb2ZpbGVBdHRyaWJ1dGU6On5JUHJvZmlsZUF0dHJpYnV0ZSgpID0gZGVmYXVsdDsKIAogY29uc3Qgc3RkOjpzdHJpbmcmIFByb2ZpbGVBdHRyaWJ1dGU6OmZpbGVfbmFtZSgpIGNvbnN0IHsKQEAgLTExOSwyNCArMTM5LDQyIEBACiAgICAgcmV0dXJuIGZpbGVfbmFtZV87CiB9CiAKLXZvaWQgUHJvZmlsZUF0dHJpYnV0ZTo6UmVzZXQoY29uc3QgQ2dyb3VwQ29udHJvbGxlciYgY29udHJvbGxlciwgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfdjJfbmFtZSkgewordm9pZCBQcm9maWxlQXR0cmlidXRlOjpSZXNldChjb25zdCBDZ3JvdXBDb250cm9sbGVyV3JhcHBlciYgY29udHJvbGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfdjJfbmFtZSkgewogICAgIGNvbnRyb2xsZXJfID0gY29udHJvbGxlcjsKICAgICBmaWxlX25hbWVfID0gZmlsZV9uYW1lOwogICAgIGZpbGVfdjJfbmFtZV8gPSBmaWxlX3YyX25hbWU7CiB9CiAKK3N0YXRpYyBib29sIGlzU3lzdGVtQXBwKHVpZF90IHVpZCkgeworICAgIHJldHVybiB1aWQgPCBBSURfQVBQX1NUQVJUOworfQorCitzdGQ6OnN0cmluZyBDb252ZXJ0VWlkVG9QYXRoKGNvbnN0IGNoYXIqIHJvb3RfY2dyb3VwX3BhdGgsIHVpZF90IHVpZCkgeworICAgIGlmIChhbmRyb2lkOjpsaWJwcm9jZXNzZ3JvdXBfZmxhZ3M6OmNncm91cF92Ml9zeXNfYXBwX2lzb2xhdGlvbigpKSB7CisgICAgICAgIGlmIChpc1N5c3RlbUFwcCh1aWQpKQorICAgICAgICAgICAgcmV0dXJuIFN0cmluZ1ByaW50ZigiJXMvc3lzdGVtL3VpZF8ldSIsIHJvb3RfY2dyb3VwX3BhdGgsIHVpZCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmdQcmludGYoIiVzL2FwcHMvdWlkXyV1Iiwgcm9vdF9jZ3JvdXBfcGF0aCwgdWlkKTsKKyAgICB9CisgICAgcmV0dXJuIFN0cmluZ1ByaW50ZigiJXMvdWlkXyV1Iiwgcm9vdF9jZ3JvdXBfcGF0aCwgdWlkKTsKK30KKworc3RkOjpzdHJpbmcgQ29udmVydFVpZFBpZFRvUGF0aChjb25zdCBjaGFyKiByb290X2Nncm91cF9wYXRoLCB1aWRfdCB1aWQsIHBpZF90IHBpZCkgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHVpZF9wYXRoID0gQ29udmVydFVpZFRvUGF0aChyb290X2Nncm91cF9wYXRoLCB1aWQpOworICAgIHJldHVybiBTdHJpbmdQcmludGYoIiVzL3BpZF8lZCIsIHVpZF9wYXRoLmNfc3RyKCksIHBpZCk7Cit9CisKIGJvb2wgUHJvZmlsZUF0dHJpYnV0ZTo6R2V0UGF0aEZvclByb2Nlc3ModWlkX3QgdWlkLCBwaWRfdCBwaWQsIHN0ZDo6c3RyaW5nKiBwYXRoKSBjb25zdCB7CiAgICAgaWYgKGNvbnRyb2xsZXIoKS0+dmVyc2lvbigpID09IDIpIHsKLSAgICAgICAgLy8gYWxsIGNncm91cCB2MiBhdHRyaWJ1dGVzIHVzZSB0aGUgc2FtZSBwcm9jZXNzIGdyb3VwIGhpZXJhcmNoeQotICAgICAgICAqcGF0aCA9IFN0cmluZ1ByaW50ZigiJXMvdWlkXyV1L3BpZF8lZC8lcyIsIGNvbnRyb2xsZXIoKS0+cGF0aCgpLCB1aWQsIHBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9uYW1lKCkuY19zdHIoKSk7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGNncm91cF9wYXRoID0gQ29udmVydFVpZFBpZFRvUGF0aChjb250cm9sbGVyKCktPnBhdGgoKSwgdWlkLCBwaWQpOworICAgICAgICAqcGF0aCA9IGNncm91cF9wYXRoICsgIi8iICsgZmlsZV9uYW1lKCk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1cm4gR2V0UGF0aEZvclRhc2socGlkLCBwYXRoKTsKIH0KIAotYm9vbCBQcm9maWxlQXR0cmlidXRlOjpHZXRQYXRoRm9yVGFzayhpbnQgdGlkLCBzdGQ6OnN0cmluZyogcGF0aCkgY29uc3QgeworYm9vbCBQcm9maWxlQXR0cmlidXRlOjpHZXRQYXRoRm9yVGFzayhwaWRfdCB0aWQsIHN0ZDo6c3RyaW5nKiBwYXRoKSBjb25zdCB7CiAgICAgc3RkOjpzdHJpbmcgc3ViZ3JvdXA7CiAgICAgaWYgKCFjb250cm9sbGVyKCktPkdldFRhc2tHcm91cCh0aWQsICZzdWJncm91cCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTU1LDcwICsxOTMsMzEgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorLy8gTk9URTogVGhpcyBmdW5jdGlvbiBpcyBmb3IgY2dyb3VwIHYyIG9ubHkKIGJvb2wgUHJvZmlsZUF0dHJpYnV0ZTo6R2V0UGF0aEZvclVJRCh1aWRfdCB1aWQsIHN0ZDo6c3RyaW5nKiBwYXRoKSBjb25zdCB7CiAgICAgaWYgKHBhdGggPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICAqcGF0aCA9IFN0cmluZ1ByaW50ZigiJXMvdWlkXyV1LyVzIiwgY29udHJvbGxlcigpLT5wYXRoKCksIHVpZCwgZmlsZV9uYW1lKCkuY19zdHIoKSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgY2dyb3VwX3BhdGggPSBDb252ZXJ0VWlkVG9QYXRoKGNvbnRyb2xsZXIoKS0+cGF0aCgpLCB1aWQpOworICAgICpwYXRoID0gY2dyb3VwX3BhdGggKyAiLyIgKyBmaWxlX25hbWUoKTsKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBTZXRDbGFtcHNBY3Rpb246OkV4ZWN1dGVGb3JQcm9jZXNzKHVpZF90LCBwaWRfdCkgY29uc3QgewotICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0IHdoZW4ga2VybmVsIHN1cHBvcnRzIHV0aWxfY2xhbXAKLSAgICBMT0coV0FSTklORykgPDwgIlNldENsYW1wc0FjdGlvbjo6RXhlY3V0ZUZvclByb2Nlc3MgaXMgbm90IHN1cHBvcnRlZCI7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIFNldENsYW1wc0FjdGlvbjo6RXhlY3V0ZUZvclRhc2soaW50KSBjb25zdCB7Ci0gICAgLy8gVE9ETzogYWRkIHN1cHBvcnQgd2hlbiBrZXJuZWwgc3VwcG9ydHMgdXRpbF9jbGFtcAotICAgIExPRyhXQVJOSU5HKSA8PCAiU2V0Q2xhbXBzQWN0aW9uOjpFeGVjdXRlRm9yVGFzayBpcyBub3Qgc3VwcG9ydGVkIjsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vIFRvIGF2b2lkIGlzc3VlcyBpbiBzZGtfbWFjIGJ1aWxkCi0jaWYgZGVmaW5lZChfX0FORFJPSURfXykKLQotYm9vbCBTZXRUaW1lclNsYWNrQWN0aW9uOjpJc1RpbWVyU2xhY2tTdXBwb3J0ZWQoaW50IHRpZCkgewotICAgIGF1dG8gZmlsZSA9IFN0cmluZ1ByaW50ZigiL3Byb2MvJWQvdGltZXJzbGFja19ucyIsIHRpZCk7Ci0KLSAgICByZXR1cm4gKGFjY2VzcyhmaWxlLmNfc3RyKCksIFdfT0spID09IDApOwotfQotCi1ib29sIFNldFRpbWVyU2xhY2tBY3Rpb246OkV4ZWN1dGVGb3JUYXNrKGludCB0aWQpIGNvbnN0IHsKLSAgICBzdGF0aWMgYm9vbCBzeXNfc3VwcG9ydHNfdGltZXJzbGFjayA9IElzVGltZXJTbGFja1N1cHBvcnRlZCh0aWQpOwotCi0gICAgLy8gdjQuNisga2VybmVscyBzdXBwb3J0IHRoZSAvcHJvYy88dGlkPi90aW1lcnNsYWNrX25zIGludGVyZmFjZS4KLSAgICAvLyBUT0RPOiBvbmNlIHdlJ3ZlIGJhY2twb3J0ZWQgdGhpcywgbG9nIGlmIHRoZSBvcGVuKDIpIGZhaWxzLgotICAgIGlmIChzeXNfc3VwcG9ydHNfdGltZXJzbGFjaykgewotICAgICAgICBhdXRvIGZpbGUgPSBTdHJpbmdQcmludGYoIi9wcm9jLyVkL3RpbWVyc2xhY2tfbnMiLCB0aWQpOwotICAgICAgICBpZiAoIVdyaXRlU3RyaW5nVG9GaWxlKHN0ZDo6dG9fc3RyaW5nKHNsYWNrXyksIGZpbGUpKSB7Ci0gICAgICAgICAgICBpZiAoZXJybm8gPT0gRU5PRU5UKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBoYXBwZW5zIHdoZW4gcHJvY2VzcyBpcyBhbHJlYWR5IGRlYWQKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJzZXRfdGltZXJzbGFja19ucyB3cml0ZSBmYWlsZWQiOworYm9vbCBTZXRUaW1lclNsYWNrQWN0aW9uOjpFeGVjdXRlRm9yVGFzayhwaWRfdCB0aWQpIGNvbnN0IHsKKyAgICBjb25zdCBhdXRvIGZpbGUgPSBTdHJpbmdQcmludGYoIi9wcm9jLyVkL3RpbWVyc2xhY2tfbnMiLCB0aWQpOworICAgIGlmICghV3JpdGVTdHJpbmdUb0ZpbGUoc3RkOjp0b19zdHJpbmcoc2xhY2tfKSwgZmlsZSkpIHsKKyAgICAgICAgaWYgKGVycm5vID09IEVOT0VOVCkgeworICAgICAgICAgICAgLy8gVGhpcyBoYXBwZW5zIHdoZW4gcHJvY2VzcyBpcyBhbHJlYWR5IGRlYWQKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVE9ETzogUmVtb3ZlIHdoZW4gL3Byb2MvPHRpZD4vdGltZXJzbGFja19ucyBpbnRlcmZhY2UgaXMgYmFja3BvcnRlZC4KLSAgICBpZiAodGlkID09IDAgfHwgdGlkID09IEdldFRocmVhZElkKCkpIHsKLSAgICAgICAgaWYgKHByY3RsKFBSX1NFVF9USU1FUlNMQUNLLCBzbGFja18pID09IC0xKSB7Ci0gICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAic2V0X3RpbWVyc2xhY2tfbnMgcHJjdGwgZmFpbGVkIjsKLSAgICAgICAgfQorICAgICAgICBQTE9HKEVSUk9SKSA8PCAic2V0X3RpbWVyc2xhY2tfbnMgd3JpdGUgZmFpbGVkIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIHJldHVybiB0cnVlOwogfQogCi0jZWxzZQotCi1ib29sIFNldFRpbWVyU2xhY2tBY3Rpb246OkV4ZWN1dGVGb3JUYXNrKGludCkgY29uc3QgewotICAgIHJldHVybiB0cnVlOwotfTsKLQotI2VuZGlmCi0KIGJvb2wgU2V0QXR0cmlidXRlQWN0aW9uOjpXcml0ZVZhbHVlVG9GaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSBjb25zdCB7CiAgICAgaWYgKCFXcml0ZVN0cmluZ1RvRmlsZSh2YWx1ZV8sIHBhdGgpKSB7CiAgICAgICAgIGlmIChhY2Nlc3MocGF0aC5jX3N0cigpLCBGX09LKSA8IDApIHsKQEAgLTI1MCw3ICsyNDksNyBAQAogICAgIHJldHVybiBXcml0ZVZhbHVlVG9GaWxlKHBhdGgpOwogfQogCi1ib29sIFNldEF0dHJpYnV0ZUFjdGlvbjo6RXhlY3V0ZUZvclRhc2soaW50IHRpZCkgY29uc3QgeworYm9vbCBTZXRBdHRyaWJ1dGVBY3Rpb246OkV4ZWN1dGVGb3JUYXNrKHBpZF90IHRpZCkgY29uc3QgewogICAgIHN0ZDo6c3RyaW5nIHBhdGg7CiAKICAgICBpZiAoIWF0dHJpYnV0ZV8tPkdldFBhdGhGb3JUYXNrKHRpZCwgJnBhdGgpKSB7CkBAIC0yODgsNyArMjg3LDcgQEAKICAgICByZXR1cm4gSXNWYWxpZEZvclRhc2socGlkKTsKIH0KIAotYm9vbCBTZXRBdHRyaWJ1dGVBY3Rpb246OklzVmFsaWRGb3JUYXNrKGludCB0aWQpIGNvbnN0IHsKK2Jvb2wgU2V0QXR0cmlidXRlQWN0aW9uOjpJc1ZhbGlkRm9yVGFzayhwaWRfdCB0aWQpIGNvbnN0IHsKICAgICBzdGQ6OnN0cmluZyBwYXRoOwogCiAgICAgaWYgKCFhdHRyaWJ1dGVfLT5HZXRQYXRoRm9yVGFzayh0aWQsICZwYXRoKSkgewpAQCAtMzA5LDE0ICszMDgsMTQgQEAKICAgICByZXR1cm4gb3B0aW9uYWxfOwogfQogCi1TZXRDZ3JvdXBBY3Rpb246OlNldENncm91cEFjdGlvbihjb25zdCBDZ3JvdXBDb250cm9sbGVyJiBjLCBjb25zdCBzdGQ6OnN0cmluZyYgcCkKK1NldENncm91cEFjdGlvbjo6U2V0Q2dyb3VwQWN0aW9uKGNvbnN0IENncm91cENvbnRyb2xsZXJXcmFwcGVyJiBjLCBjb25zdCBzdGQ6OnN0cmluZyYgcCkKICAgICA6IGNvbnRyb2xsZXJfKGMpLCBwYXRoXyhwKSB7CiAgICAgRmRDYWNoZUhlbHBlcjo6SW5pdChjb250cm9sbGVyXy5HZXRUYXNrc0ZpbGVQYXRoKHBhdGhfKSwgZmRfW1Byb2ZpbGVBY3Rpb246OlJDVF9UQVNLXSk7CiAgICAgLy8gdWlkIGFuZCBwaWQgZG9uJ3QgbWF0dGVyIGJlY2F1c2UgSXNBcHBEZXBlbmRlbnRQYXRoIGVuc3VyZXMgdGhlIHBhdGggZG9lc24ndCB1c2UgdGhlbQogICAgIEZkQ2FjaGVIZWxwZXI6OkluaXQoY29udHJvbGxlcl8uR2V0UHJvY3NGaWxlUGF0aChwYXRoXywgMCwgMCksIGZkX1tQcm9maWxlQWN0aW9uOjpSQ1RfUFJPQ0VTU10pOwogfQogCi1ib29sIFNldENncm91cEFjdGlvbjo6QWRkVGlkVG9DZ3JvdXAoaW50IHRpZCwgaW50IGZkLCBjb25zdCBjaGFyKiBjb250cm9sbGVyX25hbWUpIHsKK2Jvb2wgU2V0Q2dyb3VwQWN0aW9uOjpBZGRUaWRUb0Nncm91cChwaWRfdCB0aWQsIGludCBmZCwgUmVzb3VyY2VDYWNoZVR5cGUgY2FjaGVfdHlwZSkgY29uc3QgewogICAgIGlmICh0aWQgPD0gMCkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC0zMzIsNiArMzMxLDcgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCisgICAgY29uc3QgY2hhciogY29udHJvbGxlcl9uYW1lID0gY29udHJvbGxlcigpLT5uYW1lKCk7CiAgICAgLy8gRU5PU1BDIGlzIHJldHVybmVkIHdoZW4gY3B1c2V0IGNncm91cCB0aGF0IHdlIGFyZSBqb2luaW5nIGhhcyBubyBvbmxpbmUgY3B1cwogICAgIGlmIChlcnJubyA9PSBFTk9TUEMgJiYgIXN0cmNtcChjb250cm9sbGVyX25hbWUsICJjcHVzZXQiKSkgewogICAgICAgICAvLyBUaGlzIGlzIGFuIGFibm9ybWFsIGNhc2UgaGFwcGVuaW5nIG9ubHkgaW4gdGVzdGluZywgc28gcmVwb3J0IGl0IG9ubHkgb25jZQpAQCAtMzQ1LDcgKzM0NSw4IEBACiAgICAgICAgICAgICAgICAgICAgPDwgIicgaW50byBjcHVzZXQgYmVjYXVzZSBhbGwgY3B1cyBpbiB0aGF0IGNwdXNldCBhcmUgb2ZmbGluZSI7CiAgICAgICAgIGVtcHR5X2NwdXNldF9yZXBvcnRlZCA9IHRydWU7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgIkFkZFRpZFRvQ2dyb3VwIGZhaWxlZCB0byB3cml0ZSAnIiA8PCB2YWx1ZSA8PCAiJzsgZmQ9IiA8PCBmZDsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIkFkZFRpZFRvQ2dyb3VwIGZhaWxlZCB0byB3cml0ZSAnIiA8PCB2YWx1ZSA8PCAiJzsgcGF0aD0iIDw8IHBhdGhfIDw8ICI7ICIKKyAgICAgICAgICAgICAgICAgICAgPDwgKGNhY2hlX3R5cGUgPT0gUkNUX1RBU0sgPyAidGFzayIgOiAicHJvY2VzcyIpOwogICAgIH0KIAogICAgIHJldHVybiBmYWxzZTsKQEAgLTM1Niw3ICszNTcsNyBAQAogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGZkX211dGV4Xyk7CiAgICAgaWYgKEZkQ2FjaGVIZWxwZXI6OklzQ2FjaGVkKGZkX1tjYWNoZV90eXBlXSkpIHsKICAgICAgICAgLy8gZmQgaXMgY2FjaGVkLCByZXVzZSBpdAotICAgICAgICBpZiAoIUFkZFRpZFRvQ2dyb3VwKGlkLCBmZF9bY2FjaGVfdHlwZV0sIGNvbnRyb2xsZXIoKS0+bmFtZSgpKSkgeworICAgICAgICBpZiAoIUFkZFRpZFRvQ2dyb3VwKGlkLCBmZF9bY2FjaGVfdHlwZV0sIGNhY2hlX3R5cGUpKSB7CiAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gYWRkIHRhc2sgaW50byBjZ3JvdXAiOwogICAgICAgICAgICAgcmV0dXJuIFByb2ZpbGVBY3Rpb246OkZBSUw7CiAgICAgICAgIH0KQEAgLTM5MSw3ICszOTIsNyBAQAogICAgICAgICBQTE9HKFdBUk5JTkcpIDw8IE5hbWUoKSA8PCAiOjoiIDw8IF9fZnVuY19fIDw8ICI6IGZhaWxlZCB0byBvcGVuICIgPDwgcHJvY3NfcGF0aDsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBpZiAoIUFkZFRpZFRvQ2dyb3VwKHBpZCwgdG1wX2ZkLCBjb250cm9sbGVyKCktPm5hbWUoKSkpIHsKKyAgICBpZiAoIUFkZFRpZFRvQ2dyb3VwKHBpZCwgdG1wX2ZkLCBSQ1RfUFJPQ0VTUykpIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGFkZCB0YXNrIGludG8gY2dyb3VwIjsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTM5OSw3ICs0MDAsNyBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIFNldENncm91cEFjdGlvbjo6RXhlY3V0ZUZvclRhc2soaW50IHRpZCkgY29uc3QgeworYm9vbCBTZXRDZ3JvdXBBY3Rpb246OkV4ZWN1dGVGb3JUYXNrKHBpZF90IHRpZCkgY29uc3QgewogICAgIENhY2hlVXNlUmVzdWx0IHJlc3VsdCA9IFVzZUNhY2hlZEZkKFByb2ZpbGVBY3Rpb246OlJDVF9UQVNLLCB0aWQpOwogICAgIGlmIChyZXN1bHQgIT0gUHJvZmlsZUFjdGlvbjo6VU5VU0VEKSB7CiAgICAgICAgIHJldHVybiByZXN1bHQgPT0gUHJvZmlsZUFjdGlvbjo6U1VDQ0VTUzsKQEAgLTQxMiw3ICs0MTMsNyBAQAogICAgICAgICBQTE9HKFdBUk5JTkcpIDw8IE5hbWUoKSA8PCAiOjoiIDw8IF9fZnVuY19fIDw8ICI6IGZhaWxlZCB0byBvcGVuICIgPDwgdGFza3NfcGF0aDsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBpZiAoIUFkZFRpZFRvQ2dyb3VwKHRpZCwgdG1wX2ZkLCBjb250cm9sbGVyKCktPm5hbWUoKSkpIHsKKyAgICBpZiAoIUFkZFRpZFRvQ2dyb3VwKHRpZCwgdG1wX2ZkLCBSQ1RfVEFTSykpIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGFkZCB0YXNrIGludG8gY2dyb3VwIjsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTQ4Nyw3ICs0ODgsNyBAQAogfQogCiBib29sIFdyaXRlRmlsZUFjdGlvbjo6V3JpdGVWYWx1ZVRvRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWVfLCBSZXNvdXJjZUNhY2hlVHlwZSBjYWNoZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVpZCwgaW50IHBpZCwgYm9vbCBsb2dmYWlsdXJlcykgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLCBwaWRfdCBwaWQsIGJvb2wgbG9nZmFpbHVyZXMpIGNvbnN0IHsKICAgICBzdGQ6OnN0cmluZyB2YWx1ZSh2YWx1ZV8pOwogCiAgICAgdmFsdWUgPSBTdHJpbmdSZXBsYWNlKHZhbHVlLCAiPHVpZD4iLCBzdGQ6OnRvX3N0cmluZyh1aWQpLCB0cnVlKTsKQEAgLTU2Miw3ICs1NjMsNyBAQAogICAgIERJUiogZDsKICAgICBzdHJ1Y3QgZGlyZW50KiBkZTsKICAgICBjaGFyIHByb2NfcGF0aFsyNTVdOwotICAgIGludCB0X3BpZDsKKyAgICBwaWRfdCB0X3BpZDsKIAogICAgIHNwcmludGYocHJvY19wYXRoLCAiL3Byb2MvJWQvdGFzayIsIHBpZCk7CiAgICAgaWYgKCEoZCA9IG9wZW5kaXIocHJvY19wYXRoKSkpIHsKQEAgLTU4OCw3ICs1ODksNyBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIFdyaXRlRmlsZUFjdGlvbjo6RXhlY3V0ZUZvclRhc2soaW50IHRpZCkgY29uc3QgeworYm9vbCBXcml0ZUZpbGVBY3Rpb246OkV4ZWN1dGVGb3JUYXNrKHBpZF90IHRpZCkgY29uc3QgewogICAgIHJldHVybiBXcml0ZVZhbHVlVG9GaWxlKHZhbHVlXywgUHJvZmlsZUFjdGlvbjo6UkNUX1RBU0ssIGdldHVpZCgpLCB0aWQsIGxvZ2ZhaWx1cmVzXyk7CiB9CiAKQEAgLTY0Niw2ICs2NDcsNTcgQEAKICAgICByZXR1cm4gYWNjZXNzKHRhc2tfcGF0aF8uY19zdHIoKSwgV19PSykgPT0gMDsKIH0KIAorYm9vbCBTZXRTY2hlZHVsZXJQb2xpY3lBY3Rpb246OmlzTm9ybWFsUG9saWN5KGludCBwb2xpY3kpIHsKKyAgICByZXR1cm4gcG9saWN5ID09IFNDSEVEX09USEVSIHx8IHBvbGljeSA9PSBTQ0hFRF9CQVRDSCB8fCBwb2xpY3kgPT0gU0NIRURfSURMRTsKK30KKworYm9vbCBTZXRTY2hlZHVsZXJQb2xpY3lBY3Rpb246OnRvUHJpb3JpdHkoaW50IHBvbGljeSwgaW50IHZpcnR1YWxfcHJpb3JpdHksIGludCYgcHJpb3JpdHlfb3V0KSB7CisgICAgY29uc3RleHByIGludCBWSVJUVUFMX1BSSU9SSVRZX01JTiA9IDE7CisgICAgY29uc3RleHByIGludCBWSVJUVUFMX1BSSU9SSVRZX01BWCA9IDk5OworCisgICAgaWYgKHZpcnR1YWxfcHJpb3JpdHkgPCBWSVJUVUFMX1BSSU9SSVRZX01JTiB8fCB2aXJ0dWFsX3ByaW9yaXR5ID4gVklSVFVBTF9QUklPUklUWV9NQVgpIHsKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJTZXRTY2hlZHVsZXJQb2xpY3k6IGludmFsaWQgcHJpb3JpdHkgKCIgPDwgdmlydHVhbF9wcmlvcml0eQorICAgICAgICAgICAgICAgICAgICAgPDwgIikgZm9yIHBvbGljeSAoIiA8PCBwb2xpY3kgPDwgIikiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3QgaW50IG1pbiA9IHNjaGVkX2dldF9wcmlvcml0eV9taW4ocG9saWN5KTsKKyAgICBpZiAobWluID09IC0xKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJTZXRTY2hlZHVsZXJQb2xpY3k6IENhbm5vdCBnZXQgbWluIHNjaGVkIHByaW9yaXR5IGZvciBwb2xpY3kgIiA8PCBwb2xpY3k7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBpbnQgbWF4ID0gc2NoZWRfZ2V0X3ByaW9yaXR5X21heChwb2xpY3kpOworICAgIGlmIChtYXggPT0gLTEpIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIlNldFNjaGVkdWxlclBvbGljeTogQ2Fubm90IGdldCBtYXggc2NoZWQgcHJpb3JpdHkgZm9yIHBvbGljeSAiIDw8IHBvbGljeTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaW9yaXR5X291dCA9IG1pbiArICh2aXJ0dWFsX3ByaW9yaXR5IC0gVklSVFVBTF9QUklPUklUWV9NSU4pICogKG1heCAtIG1pbikgLworICAgICAgICAoVklSVFVBTF9QUklPUklUWV9NQVggLSBWSVJUVUFMX1BSSU9SSVRZX01JTik7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTZXRTY2hlZHVsZXJQb2xpY3lBY3Rpb246OkV4ZWN1dGVGb3JUYXNrKHBpZF90IHRpZCkgY29uc3QgeworICAgIHN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbSA9IHt9OworICAgIHBhcmFtLnNjaGVkX3ByaW9yaXR5ID0gaXNOb3JtYWxQb2xpY3kocG9saWN5XykgPyAwIDogKnByaW9yaXR5X29yX25pY2VfOworICAgIGlmIChzY2hlZF9zZXRzY2hlZHVsZXIodGlkLCBwb2xpY3lfLCAmcGFyYW0pID09IC0xKSB7CisgICAgICAgIFBMT0coV0FSTklORykgPDwgIlNldFNjaGVkdWxlclBvbGljeTogRmFpbGVkIHRvIGFwcGx5IHNjaGVkdWxlciBwb2xpY3kgKCIgPDwgcG9saWN5XworICAgICAgICAgICAgICAgICAgICAgIDw8ICIpIHdpdGggcHJpb3JpdHkgKCIgPDwgKnByaW9yaXR5X29yX25pY2VfIDw8ICIpIHRvIHRpZCAiIDw8IHRpZDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChpc05vcm1hbFBvbGljeShwb2xpY3lfKSAmJiBwcmlvcml0eV9vcl9uaWNlXyAmJgorICAgICAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIHRpZCwgKnByaW9yaXR5X29yX25pY2VfKSA9PSAtMSkgeworICAgICAgICBQTE9HKFdBUk5JTkcpIDw8ICJTZXRTY2hlZHVsZXJQb2xpY3k6IEZhaWxlZCB0byBhcHBseSBuaWNlICgiIDw8ICpwcmlvcml0eV9vcl9uaWNlXworICAgICAgICAgICAgICAgICAgICAgIDw8ICIpIHRvIHRpZCAiIDw8IHRpZDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCiBib29sIEFwcGx5UHJvZmlsZUFjdGlvbjo6RXhlY3V0ZUZvclByb2Nlc3ModWlkX3QgdWlkLCBwaWRfdCBwaWQpIGNvbnN0IHsKICAgICBmb3IgKGNvbnN0IGF1dG8mIHByb2ZpbGUgOiBwcm9maWxlc18pIHsKICAgICAgICAgcHJvZmlsZS0+RXhlY3V0ZUZvclByb2Nlc3ModWlkLCBwaWQpOwpAQCAtNjUzLDcgKzcwNSw3IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgQXBwbHlQcm9maWxlQWN0aW9uOjpFeGVjdXRlRm9yVGFzayhpbnQgdGlkKSBjb25zdCB7Citib29sIEFwcGx5UHJvZmlsZUFjdGlvbjo6RXhlY3V0ZUZvclRhc2socGlkX3QgdGlkKSBjb25zdCB7CiAgICAgZm9yIChjb25zdCBhdXRvJiBwcm9maWxlIDogcHJvZmlsZXNfKSB7CiAgICAgICAgIHByb2ZpbGUtPkV4ZWN1dGVGb3JUYXNrKHRpZCk7CiAgICAgfQpAQCAtNjgxLDcgKzczMyw3IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgQXBwbHlQcm9maWxlQWN0aW9uOjpJc1ZhbGlkRm9yVGFzayhpbnQgdGlkKSBjb25zdCB7Citib29sIEFwcGx5UHJvZmlsZUFjdGlvbjo6SXNWYWxpZEZvclRhc2socGlkX3QgdGlkKSBjb25zdCB7CiAgICAgZm9yIChjb25zdCBhdXRvJiBwcm9maWxlIDogcHJvZmlsZXNfKSB7CiAgICAgICAgIGlmICghcHJvZmlsZS0+SXNWYWxpZEZvclRhc2sodGlkKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNzA1LDcgKzc1Nyw3IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgVGFza1Byb2ZpbGU6OkV4ZWN1dGVGb3JUYXNrKGludCB0aWQpIGNvbnN0IHsKK2Jvb2wgVGFza1Byb2ZpbGU6OkV4ZWN1dGVGb3JUYXNrKHBpZF90IHRpZCkgY29uc3QgewogICAgIGlmICh0aWQgPT0gMCkgewogICAgICAgICB0aWQgPSBHZXRUaHJlYWRJZCgpOwogICAgIH0KQEAgLTc1OSw3ICs4MTEsNyBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIFRhc2tQcm9maWxlOjpJc1ZhbGlkRm9yVGFzayhpbnQgdGlkKSBjb25zdCB7Citib29sIFRhc2tQcm9maWxlOjpJc1ZhbGlkRm9yVGFzayhwaWRfdCB0aWQpIGNvbnN0IHsKICAgICBmb3IgKGNvbnN0IGF1dG8mIGVsZW1lbnQgOiBlbGVtZW50c18pIHsKICAgICAgICAgaWYgKCFlbGVtZW50LT5Jc1ZhbGlkRm9yVGFzayh0aWQpKSByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtODY2LDIwICs5MTgsMjMgQEAKIAogICAgICAgICAgICAgICAgIGF1dG8gY29udHJvbGxlciA9IGNnX21hcC5GaW5kQ29udHJvbGxlcihjb250cm9sbGVyX25hbWUpOwogICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVyLkhhc1ZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+QWRkKHN0ZDo6bWFrZV91bmlxdWU8U2V0Q2dyb3VwQWN0aW9uPihjb250cm9sbGVyLCBwYXRoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVyLnZlcnNpb24oKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5BZGQoc3RkOjptYWtlX3VuaXF1ZTxTZXRDZ3JvdXBBY3Rpb24+KGNvbnRyb2xsZXIsIHBhdGgpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiQSBKb2luQ2dyb3VwIGFjdGlvbiBpbiB0aGUgIiA8PCBwcm9maWxlX25hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHByb2ZpbGUgaXMgdXNlZCBmb3IgY29udHJvbGxlciAiIDw8IGNvbnRyb2xsZXJfbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW4gdGhlIGNncm91cCB2MiBoaWVyYXJjaHkgYW5kIHdpbGwgYmUgaWdub3JlZCI7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkpvaW5DZ3JvdXA6IGNvbnRyb2xsZXIgIiA8PCBjb250cm9sbGVyX25hbWUgPDwgIiBpcyBub3QgZm91bmQiOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uX25hbWUgPT0gIlNldFRpbWVyU2xhY2siKSB7Ci0gICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc2xhY2tfdmFsdWUgPSBwYXJhbXNfdmFsWyJTbGFjayJdLmFzU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgY2hhciogZW5kOwotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2xhY2s7Ci0KLSAgICAgICAgICAgICAgICBzbGFjayA9IHN0cnRvdWwoc2xhY2tfdmFsdWUuY19zdHIoKSwgJmVuZCwgMTApOwotICAgICAgICAgICAgICAgIGlmIChlbmQgPiBzbGFja192YWx1ZS5jX3N0cigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPkFkZChzdGQ6Om1ha2VfdW5pcXVlPFNldFRpbWVyU2xhY2tBY3Rpb24+KHNsYWNrKSk7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgc2xhY2tfc3RyaW5nID0gcGFyYW1zX3ZhbFsiU2xhY2siXS5hc1N0cmluZygpOworICAgICAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8bG9uZz4gc2xhY2sgPSByZWFkTG9uZyhzbGFja19zdHJpbmcpOworICAgICAgICAgICAgICAgIGlmIChzbGFjayAmJiAqc2xhY2sgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5BZGQoc3RkOjptYWtlX3VuaXF1ZTxTZXRUaW1lclNsYWNrQWN0aW9uPigqc2xhY2spKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIlNldFRpbWVyU2xhY2s6IGludmFsaWQgcGFyYW1ldGVyOiAiIDw8IHNsYWNrX3ZhbHVlOworICAgICAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIlNldFRpbWVyU2xhY2s6IGludmFsaWQgcGFyYW1ldGVyOiAiIDw8IHNsYWNrX3N0cmluZzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbl9uYW1lID09ICJTZXRBdHRyaWJ1dGUiKSB7CiAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgYXR0cl9uYW1lID0gcGFyYW1zX3ZhbFsiTmFtZSJdLmFzU3RyaW5nKCk7CkBAIC04OTMsMjMgKzk0OCw2IEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJTZXRBdHRyaWJ1dGU6IHVua25vd24gYXR0cmlidXRlOiAiIDw8IGF0dHJfbmFtZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbl9uYW1lID09ICJTZXRDbGFtcHMiKSB7Ci0gICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgYm9vc3RfdmFsdWUgPSBwYXJhbXNfdmFsWyJCb29zdCJdLmFzU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xhbXBfdmFsdWUgPSBwYXJhbXNfdmFsWyJDbGFtcCJdLmFzU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgY2hhciogZW5kOwotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYm9vc3Q7Ci0KLSAgICAgICAgICAgICAgICBib29zdCA9IHN0cnRvdWwoYm9vc3RfdmFsdWUuY19zdHIoKSwgJmVuZCwgMTApOwotICAgICAgICAgICAgICAgIGlmIChlbmQgPiBib29zdF92YWx1ZS5jX3N0cigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgY2xhbXAgPSBzdHJ0b3VsKGNsYW1wX3ZhbHVlLmNfc3RyKCksICZlbmQsIDEwKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVuZCA+IGNsYW1wX3ZhbHVlLmNfc3RyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPkFkZChzdGQ6Om1ha2VfdW5pcXVlPFNldENsYW1wc0FjdGlvbj4oYm9vc3QsIGNsYW1wKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIlNldENsYW1wczogaW52YWxpZCBwYXJhbWV0ZXIgIiA8PCBjbGFtcF92YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiU2V0Q2xhbXBzOiBpbnZhbGlkIHBhcmFtZXRlcjogIiA8PCBib29zdF92YWx1ZTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbl9uYW1lID09ICJXcml0ZUZpbGUiKSB7CiAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgYXR0cl9maWxlcGF0aCA9IHBhcmFtc192YWxbIkZpbGVQYXRoIl0uYXNTdHJpbmcoKTsKICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBhdHRyX3Byb2NmaWxlcGF0aCA9IHBhcmFtc192YWxbIlByb2NGaWxlUGF0aCJdLmFzU3RyaW5nKCk7CkBAIC05MjcsNiArOTY1LDczIEBACiAgICAgICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiV3JpdGVGaWxlOiBpbnZhbGlkIHBhcmFtZXRlcjogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImVtcHR5IHZhbHVlIjsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbl9uYW1lID09ICJTZXRTY2hlZHVsZXJQb2xpY3kiKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gUE9MSUNZX01BUCA9IHsKKyAgICAgICAgICAgICAgICAgICAgeyJTQ0hFRF9PVEhFUiIsIFNDSEVEX09USEVSfSwKKyAgICAgICAgICAgICAgICAgICAgeyJTQ0hFRF9CQVRDSCIsIFNDSEVEX0JBVENIfSwKKyAgICAgICAgICAgICAgICAgICAgeyJTQ0hFRF9JRExFIiwgU0NIRURfSURMRX0sCisgICAgICAgICAgICAgICAgICAgIHsiU0NIRURfRklGTyIsIFNDSEVEX0ZJRk99LAorICAgICAgICAgICAgICAgICAgICB7IlNDSEVEX1JSIiwgU0NIRURfUlJ9LAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcG9saWN5X3N0ciA9IHBhcmFtc192YWxbIlBvbGljeSJdLmFzU3RyaW5nKCk7CisKKyAgICAgICAgICAgICAgICBjb25zdCBhdXRvIGl0ID0gUE9MSUNZX01BUC5maW5kKHBvbGljeV9zdHIpOworICAgICAgICAgICAgICAgIGlmIChpdCA9PSBQT0xJQ1lfTUFQLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiU2V0U2NoZWR1bGVyUG9saWN5OiBpbnZhbGlkIHBvbGljeSAiIDw8IHBvbGljeV9zdHI7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbnN0IGludCBwb2xpY3kgPSBpdC0+c2Vjb25kOworCisgICAgICAgICAgICAgICAgaWYgKFNldFNjaGVkdWxlclBvbGljeUFjdGlvbjo6aXNOb3JtYWxQb2xpY3kocG9saWN5KSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zX3ZhbC5pc01lbWJlcigiUHJpb3JpdHkiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJTZXRTY2hlZHVsZXJQb2xpY3k6IE5vcm1hbCBwb2xpY2llcyAoIiA8PCBwb2xpY3lfc3RyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIikgdXNlIE5pY2UgdmFsdWVzLCBub3QgUHJpb3JpdHkgdmFsdWVzIjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXNfdmFsLmlzTWVtYmVyKCJOaWNlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHByZXNlbnQsIHRoaXMgb3B0aW9uYWwgdmFsdWUgd2lsbCBiZSBwYXNzZWQgaW4gYW4gYWRkaXRpb25hbCBzeXNjYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBzZXRwcmlvcml0eSgpLCBzaW5jZSB0aGUgc2NoZWRfcHJpb3JpdHkgdmFsdWUgbXVzdCBiZSAwIGZvciBjYWxscyB0bworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NoZWRfc2V0c2NoZWR1bGVyKCkgd2l0aCAibm9ybWFsIiBwb2xpY2llcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG5pY2Vfc3RyaW5nID0gcGFyYW1zX3ZhbFsiTmljZSJdLmFzU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPGludD4gbmljZSA9IHJlYWRMb25nKG5pY2Vfc3RyaW5nKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuaWNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKEZBVEFMKSA8PCAiSW52YWxpZCBuaWNlIHZhbHVlIHNwZWNpZmllZDogIiA8PCBuaWNlX3N0cmluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBMSU5VWF9NSU5fTklDRSA9IC0yMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBMSU5VWF9NQVhfTklDRSA9IDE5OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpuaWNlIDwgTElOVVhfTUlOX05JQ0UgfHwgKm5pY2UgPiBMSU5VWF9NQVhfTklDRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiU2V0U2NoZWR1bGVyUG9saWN5OiBQcm92aWRlZCBuaWNlICgiIDw8ICpuaWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpIGFwcGVhcnMgb3V0IG9mIHJhbmdlLiI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5BZGQoc3RkOjptYWtlX3VuaXF1ZTxTZXRTY2hlZHVsZXJQb2xpY3lBY3Rpb24+KHBvbGljeSwgKm5pY2UpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPkFkZChzdGQ6Om1ha2VfdW5pcXVlPFNldFNjaGVkdWxlclBvbGljeUFjdGlvbj4ocG9saWN5KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zX3ZhbC5pc01lbWJlcigiTmljZSIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIlNldFNjaGVkdWxlclBvbGljeTogUmVhbC10aW1lIHBvbGljaWVzICgiIDw8IHBvbGljeV9zdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKSB1c2UgUHJpb3JpdHkgdmFsdWVzLCBub3QgTmljZSB2YWx1ZXMiOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhICJ2aXJ0dWFsIHByaW9yaXR5IiBhcyBkZXNjcmliZWQgYnkgYG1hbiAyIHNjaGVkX2dldF9wcmlvcml0eV9taW5gCisgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgd2lsbCBiZSBtYXBwZWQgb250byB0aGUgZm9sbG93aW5nIHJhbmdlIGZvciB0aGUgcHJvdmlkZWQgcG9saWN5OgorICAgICAgICAgICAgICAgICAgICAvLyBbc2NoZWRfZ2V0X3ByaW9yaXR5X21pbigpLCBzY2hlZF9nZXRfcHJpb3JpdHlfbWF4KCldCisKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgcHJpb3JpdHlfc3RyaW5nID0gcGFyYW1zX3ZhbFsiUHJpb3JpdHkiXS5hc1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPGxvbmc+IHZpcnR1YWxfcHJpb3JpdHkgPSByZWFkTG9uZyhwcmlvcml0eV9zdHJpbmcpOworICAgICAgICAgICAgICAgICAgICBpZiAodmlydHVhbF9wcmlvcml0eSAmJiAqdmlydHVhbF9wcmlvcml0eSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmlvcml0eTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTZXRTY2hlZHVsZXJQb2xpY3lBY3Rpb246OnRvUHJpb3JpdHkocG9saWN5LCAqdmlydHVhbF9wcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+QWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxTZXRTY2hlZHVsZXJQb2xpY3lBY3Rpb24+KHBvbGljeSwgcHJpb3JpdHkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiSW52YWxpZCBwcmlvcml0eSB2YWx1ZTogIiA8PCBwcmlvcml0eV9zdHJpbmc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiVW5rbm93biBwcm9maWxlIGFjdGlvbjogIiA8PCBhY3Rpb25fbmFtZTsKICAgICAgICAgICAgIH0KQEAgLTEwMzUsNyArMTE0MCw3IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotYm9vbCBUYXNrUHJvZmlsZXM6OlNldFRhc2tQcm9maWxlcyhpbnQgdGlkLCBzdGQ6OnNwYW48Y29uc3QgVD4gcHJvZmlsZXMsIGJvb2wgdXNlX2ZkX2NhY2hlKSB7Citib29sIFRhc2tQcm9maWxlczo6U2V0VGFza1Byb2ZpbGVzKHBpZF90IHRpZCwgc3RkOjpzcGFuPGNvbnN0IFQ+IHByb2ZpbGVzLCBib29sIHVzZV9mZF9jYWNoZSkgewogICAgIGJvb2wgc3VjY2VzcyA9IHRydWU7CiAgICAgZm9yIChjb25zdCBhdXRvJiBuYW1lIDogcHJvZmlsZXMpIHsKICAgICAgICAgVGFza1Byb2ZpbGUqIHByb2ZpbGUgPSBHZXRQcm9maWxlKG5hbWUpOwpAQCAtMTA2MSw5ICsxMTY2LDkgQEAKIHRlbXBsYXRlIGJvb2wgVGFza1Byb2ZpbGVzOjpTZXRQcm9jZXNzUHJvZmlsZXModWlkX3QgdWlkLCBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3Bhbjxjb25zdCBzdGQ6OnN0cmluZ192aWV3PiBwcm9maWxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfZmRfY2FjaGUpOwotdGVtcGxhdGUgYm9vbCBUYXNrUHJvZmlsZXM6OlNldFRhc2tQcm9maWxlcyhpbnQgdGlkLCBzdGQ6OnNwYW48Y29uc3Qgc3RkOjpzdHJpbmc+IHByb2ZpbGVzLAordGVtcGxhdGUgYm9vbCBUYXNrUHJvZmlsZXM6OlNldFRhc2tQcm9maWxlcyhwaWRfdCB0aWQsIHN0ZDo6c3Bhbjxjb25zdCBzdGQ6OnN0cmluZz4gcHJvZmlsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX2ZkX2NhY2hlKTsKLXRlbXBsYXRlIGJvb2wgVGFza1Byb2ZpbGVzOjpTZXRUYXNrUHJvZmlsZXMoaW50IHRpZCwgc3RkOjpzcGFuPGNvbnN0IHN0ZDo6c3RyaW5nX3ZpZXc+IHByb2ZpbGVzLAordGVtcGxhdGUgYm9vbCBUYXNrUHJvZmlsZXM6OlNldFRhc2tQcm9maWxlcyhwaWRfdCB0aWQsIHN0ZDo6c3Bhbjxjb25zdCBzdGQ6OnN0cmluZ192aWV3PiBwcm9maWxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfZmRfY2FjaGUpOwogdGVtcGxhdGUgYm9vbCBUYXNrUHJvZmlsZXM6OlNldFVzZXJQcm9maWxlcyh1aWRfdCB1aWQsIHN0ZDo6c3Bhbjxjb25zdCBzdGQ6OnN0cmluZz4gcHJvZmlsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX2ZkX2NhY2hlKTsKZGlmZiAtLWdpdCBhL2xpYnByb2Nlc3Nncm91cC90YXNrX3Byb2ZpbGVzLmggYi9saWJwcm9jZXNzZ3JvdXAvdGFza19wcm9maWxlcy5oCmluZGV4IDQ2NjNmNjQuLmQwYjUwNDMgMTAwNjQ0Ci0tLSBhL2xpYnByb2Nlc3Nncm91cC90YXNrX3Byb2ZpbGVzLmgKKysrIGIvbGlicHJvY2Vzc2dyb3VwL3Rhc2tfcHJvZmlsZXMuaApAQCAtMTYsMTEgKzE2LDEyIEBACiAKICNwcmFnbWEgb25jZQogCi0jaW5jbHVkZSA8c3lzL2NkZWZzLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKwogI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8b3B0aW9uYWw+CiAjaW5jbHVkZSA8c3Bhbj4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8c3RyaW5nX3ZpZXc+CkBAIC0zMiwxMiArMzMsMTIgQEAKIGNsYXNzIElQcm9maWxlQXR0cmlidXRlIHsKICAgcHVibGljOgogICAgIHZpcnR1YWwgfklQcm9maWxlQXR0cmlidXRlKCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBSZXNldChjb25zdCBDZ3JvdXBDb250cm9sbGVyJiBjb250cm9sbGVyLCBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV9uYW1lLAorICAgIHZpcnR1YWwgdm9pZCBSZXNldChjb25zdCBDZ3JvdXBDb250cm9sbGVyV3JhcHBlciYgY29udHJvbGxlciwgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfdjJfbmFtZSkgPSAwOwotICAgIHZpcnR1YWwgY29uc3QgQ2dyb3VwQ29udHJvbGxlciogY29udHJvbGxlcigpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGNvbnN0IENncm91cENvbnRyb2xsZXJXcmFwcGVyKiBjb250cm9sbGVyKCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfbmFtZSgpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgR2V0UGF0aEZvclByb2Nlc3ModWlkX3QgdWlkLCBwaWRfdCBwaWQsIHN0ZDo6c3RyaW5nKiBwYXRoKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBib29sIEdldFBhdGhGb3JUYXNrKGludCB0aWQsIHN0ZDo6c3RyaW5nKiBwYXRoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBib29sIEdldFBhdGhGb3JUYXNrKHBpZF90IHRpZCwgc3RkOjpzdHJpbmcqIHBhdGgpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgR2V0UGF0aEZvclVJRCh1aWRfdCB1aWQsIHN0ZDo6c3RyaW5nKiBwYXRoKSBjb25zdCA9IDA7CiB9OwogCkBAIC00NiwyMiArNDcsMjIgQEAKICAgICAvLyBDZ3JvdXAgYXR0cmlidXRlcyBtYXkgaGF2ZSBkaWZmZXJlbnQgbmFtZXMgaW4gdGhlIHYxIGFuZCB2MiBoaWVyYXJjaGllcy4gSWYgYGZpbGVfdjJfbmFtZWAgaXMKICAgICAvLyBub3QgZW1wdHksIGBmaWxlX25hbWVgIGlzIHRoZSBuYW1lIGZvciB0aGUgdjEgaGllcmFyY2h5IGFuZCBgZmlsZV92Ml9uYW1lYCBpcyB0aGUgbmFtZSBmb3IKICAgICAvLyB0aGUgdjIgaGllcmFyY2h5LiBJZiBgZmlsZV92Ml9uYW1lYCBpcyBlbXB0eSwgYGZpbGVfbmFtZWAgaXMgdXNlZCBmb3IgYm90aCBoaWVyYXJjaGllcy4KLSAgICBQcm9maWxlQXR0cmlidXRlKGNvbnN0IENncm91cENvbnRyb2xsZXImIGNvbnRyb2xsZXIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlX25hbWUsCisgICAgUHJvZmlsZUF0dHJpYnV0ZShjb25zdCBDZ3JvdXBDb250cm9sbGVyV3JhcHBlciYgY29udHJvbGxlciwgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlX3YyX25hbWUpCiAgICAgICAgIDogY29udHJvbGxlcl8oY29udHJvbGxlciksIGZpbGVfbmFtZV8oZmlsZV9uYW1lKSwgZmlsZV92Ml9uYW1lXyhmaWxlX3YyX25hbWUpIHt9CiAgICAgflByb2ZpbGVBdHRyaWJ1dGUoKSA9IGRlZmF1bHQ7CiAKLSAgICBjb25zdCBDZ3JvdXBDb250cm9sbGVyKiBjb250cm9sbGVyKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gJmNvbnRyb2xsZXJfOyB9CisgICAgY29uc3QgQ2dyb3VwQ29udHJvbGxlcldyYXBwZXIqIGNvbnRyb2xsZXIoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAmY29udHJvbGxlcl87IH0KICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV9uYW1lKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCBSZXNldChjb25zdCBDZ3JvdXBDb250cm9sbGVyJiBjb250cm9sbGVyLCBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV9uYW1lLAorICAgIHZvaWQgUmVzZXQoY29uc3QgQ2dyb3VwQ29udHJvbGxlcldyYXBwZXImIGNvbnRyb2xsZXIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlX25hbWUsCiAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV92Ml9uYW1lKSBvdmVycmlkZTsKIAogICAgIGJvb2wgR2V0UGF0aEZvclByb2Nlc3ModWlkX3QgdWlkLCBwaWRfdCBwaWQsIHN0ZDo6c3RyaW5nKiBwYXRoKSBjb25zdCBvdmVycmlkZTsKLSAgICBib29sIEdldFBhdGhGb3JUYXNrKGludCB0aWQsIHN0ZDo6c3RyaW5nKiBwYXRoKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sIEdldFBhdGhGb3JUYXNrKHBpZF90IHRpZCwgc3RkOjpzdHJpbmcqIHBhdGgpIGNvbnN0IG92ZXJyaWRlOwogICAgIGJvb2wgR2V0UGF0aEZvclVJRCh1aWRfdCB1aWQsIHN0ZDo6c3RyaW5nKiBwYXRoKSBjb25zdCBvdmVycmlkZTsKIAogICBwcml2YXRlOgotICAgIENncm91cENvbnRyb2xsZXIgY29udHJvbGxlcl87CisgICAgQ2dyb3VwQ29udHJvbGxlcldyYXBwZXIgY29udHJvbGxlcl87CiAgICAgc3RkOjpzdHJpbmcgZmlsZV9uYW1lXzsKICAgICBzdGQ6OnN0cmluZyBmaWxlX3YyX25hbWVfOwogfTsKQEAgLTc3LDQ1ICs3OCwzMCBAQAogCiAgICAgLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgd2lsbCBmYWlsCiAgICAgdmlydHVhbCBib29sIEV4ZWN1dGVGb3JQcm9jZXNzKHVpZF90LCBwaWRfdCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIGJvb2wgRXhlY3V0ZUZvclRhc2soaW50KSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgYm9vbCBFeGVjdXRlRm9yVGFzayhwaWRfdCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KICAgICB2aXJ0dWFsIGJvb2wgRXhlY3V0ZUZvclVJRCh1aWRfdCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KIAogICAgIHZpcnR1YWwgdm9pZCBFbmFibGVSZXNvdXJjZUNhY2hpbmcoUmVzb3VyY2VDYWNoZVR5cGUpIHt9CiAgICAgdmlydHVhbCB2b2lkIERyb3BSZXNvdXJjZUNhY2hpbmcoUmVzb3VyY2VDYWNoZVR5cGUpIHt9Ci0gICAgdmlydHVhbCBib29sIElzVmFsaWRGb3JQcm9jZXNzKHVpZF90IHVpZCwgcGlkX3QgcGlkKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9vbCBJc1ZhbGlkRm9yVGFzayhpbnQgdGlkKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgYm9vbCBJc1ZhbGlkRm9yUHJvY2Vzcyh1aWRfdCwgcGlkX3QpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgdmlydHVhbCBib29sIElzVmFsaWRGb3JUYXNrKHBpZF90KSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogCiAgIHByb3RlY3RlZDoKICAgICBlbnVtIENhY2hlVXNlUmVzdWx0IHsgU1VDQ0VTUywgRkFJTCwgVU5VU0VEIH07CiB9OwogCiAvLyBQcm9maWxlIGFjdGlvbnMKLWNsYXNzIFNldENsYW1wc0FjdGlvbiA6IHB1YmxpYyBQcm9maWxlQWN0aW9uIHsKLSAgcHVibGljOgotICAgIFNldENsYW1wc0FjdGlvbihpbnQgYm9vc3QsIGludCBjbGFtcCkgbm9leGNlcHQgOiBib29zdF8oYm9vc3QpLCBjbGFtcF8oY2xhbXApIHt9Ci0KLSAgICBjb25zdCBjaGFyKiBOYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gIlNldENsYW1wcyI7IH0KLSAgICBib29sIEV4ZWN1dGVGb3JQcm9jZXNzKHVpZF90IHVpZCwgcGlkX3QgcGlkKSBjb25zdCBvdmVycmlkZTsKLSAgICBib29sIEV4ZWN1dGVGb3JUYXNrKGludCB0aWQpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHByb3RlY3RlZDoKLSAgICBpbnQgYm9vc3RfOwotICAgIGludCBjbGFtcF87Ci19OwotCiBjbGFzcyBTZXRUaW1lclNsYWNrQWN0aW9uIDogcHVibGljIFByb2ZpbGVBY3Rpb24gewogICBwdWJsaWM6CiAgICAgU2V0VGltZXJTbGFja0FjdGlvbih1bnNpZ25lZCBsb25nIHNsYWNrKSBub2V4Y2VwdCA6IHNsYWNrXyhzbGFjaykge30KIAogICAgIGNvbnN0IGNoYXIqIE5hbWUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAiU2V0VGltZXJTbGFjayI7IH0KLSAgICBib29sIEV4ZWN1dGVGb3JUYXNrKGludCB0aWQpIGNvbnN0IG92ZXJyaWRlOwotICAgIGJvb2wgSXNWYWxpZEZvclByb2Nlc3ModWlkX3QgdWlkLCBwaWRfdCBwaWQpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KLSAgICBib29sIElzVmFsaWRGb3JUYXNrKGludCB0aWQpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKyAgICBib29sIEV4ZWN1dGVGb3JUYXNrKHBpZF90IHRpZCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgYm9vbCBJc1ZhbGlkRm9yUHJvY2Vzcyh1aWRfdCwgcGlkX3QpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKyAgICBib29sIElzVmFsaWRGb3JUYXNrKHBpZF90KSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CiAKICAgcHJpdmF0ZToKICAgICB1bnNpZ25lZCBsb25nIHNsYWNrXzsKLQotICAgIHN0YXRpYyBib29sIElzVGltZXJTbGFja1N1cHBvcnRlZChpbnQgdGlkKTsKIH07CiAKIC8vIFNldCBhdHRyaWJ1dGUgcHJvZmlsZSBlbGVtZW50CkBAIC0xMjYsMTAgKzExMiwxMCBAQAogCiAgICAgY29uc3QgY2hhciogTmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICJTZXRBdHRyaWJ1dGUiOyB9CiAgICAgYm9vbCBFeGVjdXRlRm9yUHJvY2Vzcyh1aWRfdCB1aWQsIHBpZF90IHBpZCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgYm9vbCBFeGVjdXRlRm9yVGFzayhpbnQgdGlkKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sIEV4ZWN1dGVGb3JUYXNrKHBpZF90IHRpZCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgYm9vbCBFeGVjdXRlRm9yVUlEKHVpZF90IHVpZCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgYm9vbCBJc1ZhbGlkRm9yUHJvY2Vzcyh1aWRfdCB1aWQsIHBpZF90IHBpZCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgYm9vbCBJc1ZhbGlkRm9yVGFzayhpbnQgdGlkKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sIElzVmFsaWRGb3JUYXNrKHBpZF90IHRpZCkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgcHJpdmF0ZToKICAgICBjb25zdCBJUHJvZmlsZUF0dHJpYnV0ZSogYXR0cmlidXRlXzsKQEAgLTE0MiwyNSArMTI4LDI1IEBACiAvLyBTZXQgY2dyb3VwIHByb2ZpbGUgZWxlbWVudAogY2xhc3MgU2V0Q2dyb3VwQWN0aW9uIDogcHVibGljIFByb2ZpbGVBY3Rpb24gewogICBwdWJsaWM6Ci0gICAgU2V0Q2dyb3VwQWN0aW9uKGNvbnN0IENncm91cENvbnRyb2xsZXImIGMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwKTsKKyAgICBTZXRDZ3JvdXBBY3Rpb24oY29uc3QgQ2dyb3VwQ29udHJvbGxlcldyYXBwZXImIGMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwKTsKIAogICAgIGNvbnN0IGNoYXIqIE5hbWUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAiU2V0Q2dyb3VwIjsgfQogICAgIGJvb2wgRXhlY3V0ZUZvclByb2Nlc3ModWlkX3QgdWlkLCBwaWRfdCBwaWQpIGNvbnN0IG92ZXJyaWRlOwotICAgIGJvb2wgRXhlY3V0ZUZvclRhc2soaW50IHRpZCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgYm9vbCBFeGVjdXRlRm9yVGFzayhwaWRfdCB0aWQpIGNvbnN0IG92ZXJyaWRlOwogICAgIHZvaWQgRW5hYmxlUmVzb3VyY2VDYWNoaW5nKFJlc291cmNlQ2FjaGVUeXBlIGNhY2hlX3R5cGUpIG92ZXJyaWRlOwogICAgIHZvaWQgRHJvcFJlc291cmNlQ2FjaGluZyhSZXNvdXJjZUNhY2hlVHlwZSBjYWNoZV90eXBlKSBvdmVycmlkZTsKICAgICBib29sIElzVmFsaWRGb3JQcm9jZXNzKHVpZF90IHVpZCwgcGlkX3QgcGlkKSBjb25zdCBvdmVycmlkZTsKLSAgICBib29sIElzVmFsaWRGb3JUYXNrKGludCB0aWQpIGNvbnN0IG92ZXJyaWRlOworICAgIGJvb2wgSXNWYWxpZEZvclRhc2socGlkX3QgdGlkKSBjb25zdCBvdmVycmlkZTsKIAotICAgIGNvbnN0IENncm91cENvbnRyb2xsZXIqIGNvbnRyb2xsZXIoKSBjb25zdCB7IHJldHVybiAmY29udHJvbGxlcl87IH0KKyAgICBjb25zdCBDZ3JvdXBDb250cm9sbGVyV3JhcHBlciogY29udHJvbGxlcigpIGNvbnN0IHsgcmV0dXJuICZjb250cm9sbGVyXzsgfQogCiAgIHByaXZhdGU6Ci0gICAgQ2dyb3VwQ29udHJvbGxlciBjb250cm9sbGVyXzsKKyAgICBDZ3JvdXBDb250cm9sbGVyV3JhcHBlciBjb250cm9sbGVyXzsKICAgICBzdGQ6OnN0cmluZyBwYXRoXzsKICAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgZmRfW1Byb2ZpbGVBY3Rpb246OlJDVF9DT1VOVF07CiAgICAgbXV0YWJsZSBzdGQ6Om11dGV4IGZkX211dGV4XzsKIAotICAgIHN0YXRpYyBib29sIEFkZFRpZFRvQ2dyb3VwKGludCB0aWQsIGludCBmZCwgY29uc3QgY2hhciogY29udHJvbGxlcl9uYW1lKTsKKyAgICBib29sIEFkZFRpZFRvQ2dyb3VwKHBpZF90IHRpZCwgaW50IGZkLCBSZXNvdXJjZUNhY2hlVHlwZSBjYWNoZV90eXBlKSBjb25zdDsKICAgICBDYWNoZVVzZVJlc3VsdCBVc2VDYWNoZWRGZChSZXNvdXJjZUNhY2hlVHlwZSBjYWNoZV90eXBlLCBpbnQgaWQpIGNvbnN0OwogfTsKIApAQCAtMTcyLDExICsxNTgsMTEgQEAKIAogICAgIGNvbnN0IGNoYXIqIE5hbWUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAiV3JpdGVGaWxlIjsgfQogICAgIGJvb2wgRXhlY3V0ZUZvclByb2Nlc3ModWlkX3QgdWlkLCBwaWRfdCBwaWQpIGNvbnN0IG92ZXJyaWRlOwotICAgIGJvb2wgRXhlY3V0ZUZvclRhc2soaW50IHRpZCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgYm9vbCBFeGVjdXRlRm9yVGFzayhwaWRfdCB0aWQpIGNvbnN0IG92ZXJyaWRlOwogICAgIHZvaWQgRW5hYmxlUmVzb3VyY2VDYWNoaW5nKFJlc291cmNlQ2FjaGVUeXBlIGNhY2hlX3R5cGUpIG92ZXJyaWRlOwogICAgIHZvaWQgRHJvcFJlc291cmNlQ2FjaGluZyhSZXNvdXJjZUNhY2hlVHlwZSBjYWNoZV90eXBlKSBvdmVycmlkZTsKICAgICBib29sIElzVmFsaWRGb3JQcm9jZXNzKHVpZF90IHVpZCwgcGlkX3QgcGlkKSBjb25zdCBvdmVycmlkZTsKLSAgICBib29sIElzVmFsaWRGb3JUYXNrKGludCB0aWQpIGNvbnN0IG92ZXJyaWRlOworICAgIGJvb2wgSXNWYWxpZEZvclRhc2socGlkX3QgdGlkKSBjb25zdCBvdmVycmlkZTsKIAogICBwcml2YXRlOgogICAgIHN0ZDo6c3RyaW5nIHRhc2tfcGF0aF8sIHByb2NfcGF0aF8sIHZhbHVlXzsKQEAgLTE4NCwxMSArMTcwLDMwIEBACiAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGZkX1tQcm9maWxlQWN0aW9uOjpSQ1RfQ09VTlRdOwogICAgIG11dGFibGUgc3RkOjptdXRleCBmZF9tdXRleF87CiAKLSAgICBib29sIFdyaXRlVmFsdWVUb0ZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlLCBSZXNvdXJjZUNhY2hlVHlwZSBjYWNoZV90eXBlLCBpbnQgdWlkLCBpbnQgcGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvZ2ZhaWx1cmVzKSBjb25zdDsKKyAgICBib29sIFdyaXRlVmFsdWVUb0ZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlLCBSZXNvdXJjZUNhY2hlVHlwZSBjYWNoZV90eXBlLCB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwgYm9vbCBsb2dmYWlsdXJlcykgY29uc3Q7CiAgICAgQ2FjaGVVc2VSZXN1bHQgVXNlQ2FjaGVkRmQoUmVzb3VyY2VDYWNoZVR5cGUgY2FjaGVfdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSBjb25zdDsKIH07CiAKKy8vIFNldCBzY2hlZHVsZXIgcG9saWN5IGFjdGlvbgorY2xhc3MgU2V0U2NoZWR1bGVyUG9saWN5QWN0aW9uIDogcHVibGljIFByb2ZpbGVBY3Rpb24geworICBwdWJsaWM6CisgICAgU2V0U2NoZWR1bGVyUG9saWN5QWN0aW9uKGludCBwb2xpY3kpCisgICAgICAgIDogcG9saWN5Xyhwb2xpY3kpIHt9CisgICAgU2V0U2NoZWR1bGVyUG9saWN5QWN0aW9uKGludCBwb2xpY3ksIGludCBwcmlvcml0eV9vcl9uaWNlKQorICAgICAgICA6IHBvbGljeV8ocG9saWN5KSwgcHJpb3JpdHlfb3JfbmljZV8ocHJpb3JpdHlfb3JfbmljZSkge30KKworICAgIGNvbnN0IGNoYXIqIE5hbWUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAiU2V0U2NoZWR1bGVyUG9saWN5IjsgfQorICAgIGJvb2wgRXhlY3V0ZUZvclRhc2socGlkX3QgdGlkKSBjb25zdCBvdmVycmlkZTsKKworICAgIHN0YXRpYyBib29sIGlzTm9ybWFsUG9saWN5KGludCBwb2xpY3kpOworICAgIHN0YXRpYyBib29sIHRvUHJpb3JpdHkoaW50IHBvbGljeSwgaW50IHZpcnR1YWxfcHJpb3JpdHksIGludCYgcHJpb3JpdHlfb3V0KTsKKworICBwcml2YXRlOgorICAgIGludCBwb2xpY3lfOworICAgIHN0ZDo6b3B0aW9uYWw8aW50PiBwcmlvcml0eV9vcl9uaWNlXzsKK307CisKIGNsYXNzIFRhc2tQcm9maWxlIHsKICAgcHVibGljOgogICAgIFRhc2tQcm9maWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSA6IG5hbWVfKG5hbWUpLCByZXNfY2FjaGVkXyhmYWxzZSkge30KQEAgLTE5OCwxMiArMjAzLDEyIEBACiAgICAgdm9pZCBNb3ZlVG8oVGFza1Byb2ZpbGUqIHByb2ZpbGUpOwogCiAgICAgYm9vbCBFeGVjdXRlRm9yUHJvY2Vzcyh1aWRfdCB1aWQsIHBpZF90IHBpZCkgY29uc3Q7Ci0gICAgYm9vbCBFeGVjdXRlRm9yVGFzayhpbnQgdGlkKSBjb25zdDsKKyAgICBib29sIEV4ZWN1dGVGb3JUYXNrKHBpZF90IHRpZCkgY29uc3Q7CiAgICAgYm9vbCBFeGVjdXRlRm9yVUlEKHVpZF90IHVpZCkgY29uc3Q7CiAgICAgdm9pZCBFbmFibGVSZXNvdXJjZUNhY2hpbmcoUHJvZmlsZUFjdGlvbjo6UmVzb3VyY2VDYWNoZVR5cGUgY2FjaGVfdHlwZSk7CiAgICAgdm9pZCBEcm9wUmVzb3VyY2VDYWNoaW5nKFByb2ZpbGVBY3Rpb246OlJlc291cmNlQ2FjaGVUeXBlIGNhY2hlX3R5cGUpOwogICAgIGJvb2wgSXNWYWxpZEZvclByb2Nlc3ModWlkX3QgdWlkLCBwaWRfdCBwaWQpIGNvbnN0OwotICAgIGJvb2wgSXNWYWxpZEZvclRhc2soaW50IHRpZCkgY29uc3Q7CisgICAgYm9vbCBJc1ZhbGlkRm9yVGFzayhwaWRfdCB0aWQpIGNvbnN0OwogCiAgIHByaXZhdGU6CiAgICAgY29uc3Qgc3RkOjpzdHJpbmcgbmFtZV87CkBAIC0yMTksMTEgKzIyNCwxMSBAQAogCiAgICAgY29uc3QgY2hhciogTmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICJBcHBseVByb2ZpbGVBY3Rpb24iOyB9CiAgICAgYm9vbCBFeGVjdXRlRm9yUHJvY2Vzcyh1aWRfdCB1aWQsIHBpZF90IHBpZCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgYm9vbCBFeGVjdXRlRm9yVGFzayhpbnQgdGlkKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sIEV4ZWN1dGVGb3JUYXNrKHBpZF90IHRpZCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgdm9pZCBFbmFibGVSZXNvdXJjZUNhY2hpbmcoUHJvZmlsZUFjdGlvbjo6UmVzb3VyY2VDYWNoZVR5cGUgY2FjaGVfdHlwZSkgb3ZlcnJpZGU7CiAgICAgdm9pZCBEcm9wUmVzb3VyY2VDYWNoaW5nKFByb2ZpbGVBY3Rpb246OlJlc291cmNlQ2FjaGVUeXBlIGNhY2hlX3R5cGUpIG92ZXJyaWRlOwogICAgIGJvb2wgSXNWYWxpZEZvclByb2Nlc3ModWlkX3QgdWlkLCBwaWRfdCBwaWQpIGNvbnN0IG92ZXJyaWRlOwotICAgIGJvb2wgSXNWYWxpZEZvclRhc2soaW50IHRpZCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgYm9vbCBJc1ZhbGlkRm9yVGFzayhwaWRfdCB0aWQpIGNvbnN0IG92ZXJyaWRlOwogCiAgIHByaXZhdGU6CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPFRhc2tQcm9maWxlPj4gcHJvZmlsZXNfOwpAQCAtMjQwLDcgKzI0NSw3IEBACiAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgICAgYm9vbCBTZXRQcm9jZXNzUHJvZmlsZXModWlkX3QgdWlkLCBwaWRfdCBwaWQsIHN0ZDo6c3Bhbjxjb25zdCBUPiBwcm9maWxlcywgYm9vbCB1c2VfZmRfY2FjaGUpOwogICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICAgIGJvb2wgU2V0VGFza1Byb2ZpbGVzKGludCB0aWQsIHN0ZDo6c3Bhbjxjb25zdCBUPiBwcm9maWxlcywgYm9vbCB1c2VfZmRfY2FjaGUpOworICAgIGJvb2wgU2V0VGFza1Byb2ZpbGVzKHBpZF90IHRpZCwgc3RkOjpzcGFuPGNvbnN0IFQ+IHByb2ZpbGVzLCBib29sIHVzZV9mZF9jYWNoZSk7CiAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgICAgYm9vbCBTZXRVc2VyUHJvZmlsZXModWlkX3QgdWlkLCBzdGQ6OnNwYW48Y29uc3QgVD4gcHJvZmlsZXMsIGJvb2wgdXNlX2ZkX2NhY2hlKTsKIApAQCAtMjUyLDMgKzI1Nyw2IEBACiAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c2hhcmVkX3B0cjxUYXNrUHJvZmlsZT4sIHN0ZDo6bGVzczw+PiBwcm9maWxlc187CiAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6dW5pcXVlX3B0cjxJUHJvZmlsZUF0dHJpYnV0ZT4sIHN0ZDo6bGVzczw+PiBhdHRyaWJ1dGVzXzsKIH07CisKK3N0ZDo6c3RyaW5nIENvbnZlcnRVaWRUb1BhdGgoY29uc3QgY2hhciogcm9vdF9jZ3JvdXBfcGF0aCwgdWlkX3QgdWlkKTsKK3N0ZDo6c3RyaW5nIENvbnZlcnRVaWRQaWRUb1BhdGgoY29uc3QgY2hhciogcm9vdF9jZ3JvdXBfcGF0aCwgdWlkX3QgdWlkLCBwaWRfdCBwaWQpOwpkaWZmIC0tZ2l0IGEvbGlicHJvY2Vzc2dyb3VwL3Rhc2tfcHJvZmlsZXNfdGVzdC5jcHAgYi9saWJwcm9jZXNzZ3JvdXAvdGFza19wcm9maWxlc190ZXN0LmNwcAppbmRleCA5OWQ4MTlhLi5kZmY2ZDY3IDEwMDY0NAotLS0gYS9saWJwcm9jZXNzZ3JvdXAvdGFza19wcm9maWxlc190ZXN0LmNwcAorKysgYi9saWJwcm9jZXNzZ3JvdXAvdGFza19wcm9maWxlc190ZXN0LmNwcApAQCAtMTAyLDIxICsxMDIsMjAgQEAKICAgcHVibGljOgogICAgIFByb2ZpbGVBdHRyaWJ1dGVNb2NrKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlX25hbWUpIDogZmlsZV9uYW1lXyhmaWxlX25hbWUpIHt9CiAgICAgflByb2ZpbGVBdHRyaWJ1dGVNb2NrKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwotICAgIHZvaWQgUmVzZXQoY29uc3QgQ2dyb3VwQ29udHJvbGxlciYgY29udHJvbGxlciwgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlX3YyX25hbWUpIG92ZXJyaWRlIHsKKyAgICB2b2lkIFJlc2V0KGNvbnN0IENncm91cENvbnRyb2xsZXJXcmFwcGVyJiwgY29uc3Qgc3RkOjpzdHJpbmcmLCBjb25zdCBzdGQ6OnN0cmluZyYpIG92ZXJyaWRlIHsKICAgICAgICAgQ0hFQ0soZmFsc2UpOwogICAgIH0KLSAgICBjb25zdCBDZ3JvdXBDb250cm9sbGVyKiBjb250cm9sbGVyKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIGNvbnN0IENncm91cENvbnRyb2xsZXJXcmFwcGVyKiBjb250cm9sbGVyKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgICBDSEVDSyhmYWxzZSk7CiAgICAgICAgIHJldHVybiB7fTsKICAgICB9CiAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfbmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZpbGVfbmFtZV87IH0KLSAgICBib29sIEdldFBhdGhGb3JQcm9jZXNzKHVpZF90IHVpZCwgcGlkX3QgcGlkLCBzdGQ6OnN0cmluZyogcGF0aCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIGJvb2wgR2V0UGF0aEZvclByb2Nlc3ModWlkX3QsIHBpZF90IHBpZCwgc3RkOjpzdHJpbmcqIHBhdGgpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgICAgcmV0dXJuIEdldFBhdGhGb3JUYXNrKHBpZCwgcGF0aCk7CiAgICAgfQotICAgIGJvb2wgR2V0UGF0aEZvclRhc2soaW50IHRpZCwgc3RkOjpzdHJpbmcqIHBhdGgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBib29sIEdldFBhdGhGb3JUYXNrKGludCwgc3RkOjpzdHJpbmcqIHBhdGgpIGNvbnN0IG92ZXJyaWRlIHsKICNpZmRlZiBfX0FORFJPSURfXwotICAgICAgICBDSEVDSyhDZ3JvdXBHZXRDb250cm9sbGVyUGF0aChDR1JPVVBWMl9DT05UUk9MTEVSX05BTUUsIHBhdGgpKTsKKyAgICAgICAgQ0hFQ0soQ2dyb3VwR2V0Q29udHJvbGxlclBhdGgoQ0dST1VQVjJfSElFUkFSQ0hZX05BTUUsIHBhdGgpKTsKICAgICAgICAgQ0hFQ0tfR1QocGF0aC0+bGVuZ3RoKCksIDApOwogICAgICAgICBpZiAocGF0aC0+cmJlZ2luKClbMF0gIT0gJy8nKSB7CiAgICAgICAgICAgICAqcGF0aCArPSAiLyI7CmRpZmYgLS1naXQgYS9saWJwcm9jZXNzZ3JvdXAvY2dyb3VwcmNfZm9ybWF0L0FuZHJvaWQuYnAgYi9saWJwcm9jZXNzZ3JvdXAvdXRpbC9BbmRyb2lkLmJwCnNpbWlsYXJpdHkgaW5kZXggNjMlCmNvcHkgZnJvbSBsaWJwcm9jZXNzZ3JvdXAvY2dyb3VwcmNfZm9ybWF0L0FuZHJvaWQuYnAKY29weSB0byBsaWJwcm9jZXNzZ3JvdXAvdXRpbC9BbmRyb2lkLmJwCmluZGV4IDA1OTA5MjQuLjFjNzRkNGUgMTAwNjQ0Ci0tLSBhL2xpYnByb2Nlc3Nncm91cC9jZ3JvdXByY19mb3JtYXQvQW5kcm9pZC5icAorKysgYi9saWJwcm9jZXNzZ3JvdXAvdXRpbC9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsNCBAQAorLy8KIC8vIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAvLwogLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CkBAIC0xMSwyOSArMTIsNDcgQEAKIC8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisvLwogCiBwYWNrYWdlIHsKKyAgICBkZWZhdWx0X3RlYW06ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX2tlcm5lbCIsCiAgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbIkFuZHJvaWQtQXBhY2hlLTIuMCJdLAogfQogCiBjY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYmNncm91cHJjX2Zvcm1hdCIsCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgbmFtZTogImxpYnByb2Nlc3Nncm91cF91dGlsIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHByb2R1Y3RfYXZhaWxhYmxlOiB0cnVlLAogICAgIHJhbWRpc2tfYXZhaWxhYmxlOiB0cnVlLAogICAgIHZlbmRvcl9yYW1kaXNrX2F2YWlsYWJsZTogdHJ1ZSwKICAgICByZWNvdmVyeV9hdmFpbGFibGU6IHRydWUsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCiAgICAgbmF0aXZlX2JyaWRnZV9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgc3JjczogWwotICAgICAgICAiY2dyb3VwX2NvbnRyb2xsZXIuY3BwIiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOmFueWFwZXgiLAogICAgIF0sCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2FsbCIsCi0gICAgICAgICItV2Vycm9yIiwKLSAgICBdLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjMwIiwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCiAgICAgICAgICJpbmNsdWRlIiwKICAgICBdLAorICAgIHNyY3M6IFsKKyAgICAgICAgImNncm91cF9jb250cm9sbGVyLmNwcCIsCisgICAgICAgICJjZ3JvdXBfZGVzY3JpcHRvci5jcHAiLAorICAgICAgICAidXRpbC5jcHAiLAorICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmJhc2UiLAogICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmpzb25jcHAiLAorICAgIF0sCisgICAgZGVmYXVsdHM6IFsibGlicHJvY2Vzc2dyb3VwX2J1aWxkX2ZsYWdzX2NjIl0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJsaWJwcm9jZXNzZ3JvdXBfdXRpbF90ZXN0IiwKKyAgICBzdGF0aWNfbGliczogWyJsaWJwcm9jZXNzZ3JvdXBfdXRpbCJdLAorICAgIHNyY3M6IFsidGVzdHMvdXRpbC5jcHAiXSwKKyAgICB0ZXN0X3N1aXRlczogWyJnZW5lcmFsLXRlc3RzIl0sCiB9CmRpZmYgLS1naXQgYS9saWJwcm9jZXNzZ3JvdXAvdXRpbC9PV05FUlMgYi9saWJwcm9jZXNzZ3JvdXAvdXRpbC9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRlYTQwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnByb2Nlc3Nncm91cC91dGlsL09XTkVSUwpAQCAtMCwwICsxLDMgQEAKKyMgQnVnIGNvbXBvbmVudDogMTI5MzAzMworc3VyZW5iQGdvb2dsZS5jb20KK3RqbWVyY2llckBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9saWJwcm9jZXNzZ3JvdXAvdXRpbC9URVNUX01BUFBJTkcgYi9saWJwcm9jZXNzZ3JvdXAvdXRpbC9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFlMjY1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnByb2Nlc3Nncm91cC91dGlsL1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDcgQEAKK3sKKyAgInBvc3RzdWJtaXQiOiBbCisgICAgeworICAgICAgIm5hbWUiOiAibGlicHJvY2Vzc2dyb3VwX3V0aWxfdGVzdCIKKyAgICB9CisgIF0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJwcm9jZXNzZ3JvdXAvY2dyb3VwcmNfZm9ybWF0L2Nncm91cF9jb250cm9sbGVyLmNwcCBiL2xpYnByb2Nlc3Nncm91cC91dGlsL2Nncm91cF9jb250cm9sbGVyLmNwcApzaW1pbGFyaXR5IGluZGV4IDc1JQpyZW5hbWUgZnJvbSBsaWJwcm9jZXNzZ3JvdXAvY2dyb3VwcmNfZm9ybWF0L2Nncm91cF9jb250cm9sbGVyLmNwcApyZW5hbWUgdG8gbGlicHJvY2Vzc2dyb3VwL3V0aWwvY2dyb3VwX2NvbnRyb2xsZXIuY3BwCmluZGV4IDIwMmIyM2UuLmZiNDE2ODAgMTAwNjQ0Ci0tLSBhL2xpYnByb2Nlc3Nncm91cC9jZ3JvdXByY19mb3JtYXQvY2dyb3VwX2NvbnRyb2xsZXIuY3BwCisrKyBiL2xpYnByb2Nlc3Nncm91cC91dGlsL2Nncm91cF9jb250cm9sbGVyLmNwcApAQCAtMTQsMjUgKzE0LDE2IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8cHJvY2Vzc2dyb3VwL2Zvcm1hdC9jZ3JvdXBfY29udHJvbGxlci5oPgorI2luY2x1ZGUgPHByb2Nlc3Nncm91cC9jZ3JvdXBfY29udHJvbGxlci5oPgogCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgY2dyb3VwcmMgewotbmFtZXNwYWNlIGZvcm1hdCB7Ci0KLUNncm91cENvbnRyb2xsZXI6OkNncm91cENvbnRyb2xsZXIoKSA6IHZlcnNpb25fKDApLCBmbGFnc18oMCkgewotICAgIG1lbXNldChuYW1lXywgMCwgc2l6ZW9mKG5hbWVfKSk7Ci0gICAgbWVtc2V0KHBhdGhfLCAwLCBzaXplb2YocGF0aF8pKTsKLX0KKyNpbmNsdWRlIDxjc3RyaW5nPgogCiBDZ3JvdXBDb250cm9sbGVyOjpDZ3JvdXBDb250cm9sbGVyKHVpbnQzMl90IHZlcnNpb24sIHVpbnQzMl90IGZsYWdzLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpCi0gICAgOiBDZ3JvdXBDb250cm9sbGVyKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgdWludDMyX3QgbWF4X2FjdGl2YXRpb25fZGVwdGgpCisgICAgOiB2ZXJzaW9uXyh2ZXJzaW9uKSwgZmxhZ3NfKGZsYWdzKSwgbWF4X2FjdGl2YXRpb25fZGVwdGhfKG1heF9hY3RpdmF0aW9uX2RlcHRoKSB7CiAgICAgLy8gc3RybGNweSBpc24ndCBhdmFpbGFibGUgb24gaG9zdC4gQWx0aG91Z2ggdGhlcmUgaXMgYW4gaW1wbGVtZW50YXRpb24KICAgICAvLyBpbiBsaWN1dGlscywgbGliY3V0aWxzIGl0c2VsZiBkZXBlbmRzIG9uIGxpYmNncm91cHJjX2Zvcm1hdCwgY2F1c2luZwogICAgIC8vIGEgY2lyY3VsYXIgZGVwZW5kZW5jeS4KLSAgICB2ZXJzaW9uXyA9IHZlcnNpb247Ci0gICAgZmxhZ3NfID0gZmxhZ3M7CiAgICAgc3RybmNweShuYW1lXywgbmFtZS5jX3N0cigpLCBzaXplb2YobmFtZV8pIC0gMSk7CiAgICAgbmFtZV9bc2l6ZW9mKG5hbWVfKSAtIDFdID0gJ1wwJzsKICAgICBzdHJuY3B5KHBhdGhfLCBwYXRoLmNfc3RyKCksIHNpemVvZihwYXRoXykgLSAxKTsKQEAgLTQ3LDYgKzM4LDEwIEBACiAgICAgcmV0dXJuIGZsYWdzXzsKIH0KIAordWludDMyX3QgQ2dyb3VwQ29udHJvbGxlcjo6bWF4X2FjdGl2YXRpb25fZGVwdGgoKSBjb25zdCB7CisgICAgcmV0dXJuIG1heF9hY3RpdmF0aW9uX2RlcHRoXzsKK30KKwogY29uc3QgY2hhciogQ2dyb3VwQ29udHJvbGxlcjo6bmFtZSgpIGNvbnN0IHsKICAgICByZXR1cm4gbmFtZV87CiB9CkBAIC01Nyw4ICs1Miw0IEBACiAKIHZvaWQgQ2dyb3VwQ29udHJvbGxlcjo6c2V0X2ZsYWdzKHVpbnQzMl90IGZsYWdzKSB7CiAgICAgZmxhZ3NfID0gZmxhZ3M7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBmb3JtYXQKLX0gIC8vIG5hbWVzcGFjZSBjZ3JvdXByYwotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJwcm9jZXNzZ3JvdXAvdXRpbC9jZ3JvdXBfZGVzY3JpcHRvci5jcHAgYi9saWJwcm9jZXNzZ3JvdXAvdXRpbC9jZ3JvdXBfZGVzY3JpcHRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQzMzQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnByb2Nlc3Nncm91cC91dGlsL2Nncm91cF9kZXNjcmlwdG9yLmNwcApAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHByb2Nlc3Nncm91cC9jZ3JvdXBfZGVzY3JpcHRvci5oPgorCisjaW5jbHVkZSA8cHJvY2Vzc2dyb3VwL3V0aWwuaD4gIC8vIEZvciBmbGFnIHZhbHVlcworCitDZ3JvdXBEZXNjcmlwdG9yOjpDZ3JvdXBEZXNjcmlwdG9yKHVpbnQzMl90IHZlcnNpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgbW9kZV90IG1vZGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnaWQsIHVpbnQzMl90IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhfYWN0aXZhdGlvbl9kZXB0aCkKKyAgICA6IGNvbnRyb2xsZXJfKHZlcnNpb24sIGZsYWdzLCBuYW1lLCBwYXRoLCBtYXhfYWN0aXZhdGlvbl9kZXB0aCksCisgICAgICBtb2RlXyhtb2RlKSwKKyAgICAgIHVpZF8odWlkKSwKKyAgICAgIGdpZF8oZ2lkKSB7fQorCit2b2lkIENncm91cERlc2NyaXB0b3I6OnNldF9tb3VudGVkKGJvb2wgbW91bnRlZCkgeworICAgIHVpbnQzMl90IGZsYWdzID0gY29udHJvbGxlcl8uZmxhZ3MoKTsKKyAgICBpZiAobW91bnRlZCkgeworICAgICAgICBmbGFncyB8PSBDR1JPVVBSQ19DT05UUk9MTEVSX0ZMQUdfTU9VTlRFRDsKKyAgICB9IGVsc2UgeworICAgICAgICBmbGFncyAmPSB+Q0dST1VQUkNfQ09OVFJPTExFUl9GTEFHX01PVU5URUQ7CisgICAgfQorICAgIGNvbnRyb2xsZXJfLnNldF9mbGFncyhmbGFncyk7Cit9CmRpZmYgLS1naXQgYS9saWJwcm9jZXNzZ3JvdXAvY2dyb3VwcmNfZm9ybWF0L2luY2x1ZGUvcHJvY2Vzc2dyb3VwL2Zvcm1hdC9jZ3JvdXBfY29udHJvbGxlci5oIGIvbGlicHJvY2Vzc2dyb3VwL3V0aWwvaW5jbHVkZS9wcm9jZXNzZ3JvdXAvY2dyb3VwX2NvbnRyb2xsZXIuaApzaW1pbGFyaXR5IGluZGV4IDcxJQpyZW5hbWUgZnJvbSBsaWJwcm9jZXNzZ3JvdXAvY2dyb3VwcmNfZm9ybWF0L2luY2x1ZGUvcHJvY2Vzc2dyb3VwL2Zvcm1hdC9jZ3JvdXBfY29udHJvbGxlci5oCnJlbmFtZSB0byBsaWJwcm9jZXNzZ3JvdXAvdXRpbC9pbmNsdWRlL3Byb2Nlc3Nncm91cC9jZ3JvdXBfY29udHJvbGxlci5oCmluZGV4IDQwZDg1NDguLmZlNmE4MjkgMTAwNjQ0Ci0tLSBhL2xpYnByb2Nlc3Nncm91cC9jZ3JvdXByY19mb3JtYXQvaW5jbHVkZS9wcm9jZXNzZ3JvdXAvZm9ybWF0L2Nncm91cF9jb250cm9sbGVyLmgKKysrIGIvbGlicHJvY2Vzc2dyb3VwL3V0aWwvaW5jbHVkZS9wcm9jZXNzZ3JvdXAvY2dyb3VwX2NvbnRyb2xsZXIuaApAQCAtMTYsMjIgKzE2LDIwIEBACiAKICNwcmFnbWEgb25jZQogCi0jaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgogI2luY2x1ZGUgPHN0cmluZz4KIAotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGNncm91cHJjIHsKLW5hbWVzcGFjZSBmb3JtYXQgewotCi0vLyBNaW5pbWFsIGNvbnRyb2xsZXIgZGVzY3JpcHRpb24gdG8gYmUgbW1hcHBlZCBpbnRvIHByb2Nlc3MgYWRkcmVzcyBzcGFjZQorLy8gTWluaW1hbCBjb250cm9sbGVyIGRlc2NyaXB0aW9uCiBzdHJ1Y3QgQ2dyb3VwQ29udHJvbGxlciB7CiAgIHB1YmxpYzoKLSAgICBDZ3JvdXBDb250cm9sbGVyKCk7CisgICAgQ2dyb3VwQ29udHJvbGxlcigpID0gZGVmYXVsdDsKICAgICBDZ3JvdXBDb250cm9sbGVyKHVpbnQzMl90IHZlcnNpb24sIHVpbnQzMl90IGZsYWdzLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCB1aW50MzJfdCBtYXhfYWN0aXZhdGlvbl9kZXB0aCk7CiAKICAgICB1aW50MzJfdCB2ZXJzaW9uKCkgY29uc3Q7CiAgICAgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKKyAgICB1aW50MzJfdCBtYXhfYWN0aXZhdGlvbl9kZXB0aCgpIGNvbnN0OwogICAgIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdDsKICAgICBjb25zdCBjaGFyKiBwYXRoKCkgY29uc3Q7CiAKQEAgLTQxLDEyICszOSw5IEBACiAgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgQ0dST1VQX05BTUVfQlVGX1NaID0gMTY7CiAgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgQ0dST1VQX1BBVEhfQlVGX1NaID0gMzI7CiAKLSAgICB1aW50MzJfdCB2ZXJzaW9uXzsKLSAgICB1aW50MzJfdCBmbGFnc187Ci0gICAgY2hhciBuYW1lX1tDR1JPVVBfTkFNRV9CVUZfU1pdOwotICAgIGNoYXIgcGF0aF9bQ0dST1VQX1BBVEhfQlVGX1NaXTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmb3JtYXQKLX0gIC8vIG5hbWVzcGFjZSBjZ3JvdXByYwotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyAgICB1aW50MzJfdCB2ZXJzaW9uXyA9IDA7CisgICAgdWludDMyX3QgZmxhZ3NfID0gMDsKKyAgICB1aW50MzJfdCBtYXhfYWN0aXZhdGlvbl9kZXB0aF8gPSBVSU5UMzJfTUFYOworICAgIGNoYXIgbmFtZV9bQ0dST1VQX05BTUVfQlVGX1NaXSA9IHt9OworICAgIGNoYXIgcGF0aF9bQ0dST1VQX1BBVEhfQlVGX1NaXSA9IHt9OworfTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJwcm9jZXNzZ3JvdXAvdXRpbC9pbmNsdWRlL3Byb2Nlc3Nncm91cC9jZ3JvdXBfZGVzY3JpcHRvci5oIGIvbGlicHJvY2Vzc2dyb3VwL3V0aWwvaW5jbHVkZS9wcm9jZXNzZ3JvdXAvY2dyb3VwX2Rlc2NyaXB0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWZkMmVlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicHJvY2Vzc2dyb3VwL3V0aWwvaW5jbHVkZS9wcm9jZXNzZ3JvdXAvY2dyb3VwX2Rlc2NyaXB0b3IuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlIDxwcm9jZXNzZ3JvdXAvY2dyb3VwX2NvbnRyb2xsZXIuaD4KKworLy8gQ29tcGxldGUgY29udHJvbGxlciBkZXNjcmlwdGlvbiBmb3IgbW91bnRpbmcgY2dyb3VwcworY2xhc3MgQ2dyb3VwRGVzY3JpcHRvciB7CisgIHB1YmxpYzoKKyAgICBDZ3JvdXBEZXNjcmlwdG9yKHVpbnQzMl90IHZlcnNpb24sIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgIG1vZGVfdCBtb2RlLCBjb25zdCBzdGQ6OnN0cmluZyYgdWlkLCBjb25zdCBzdGQ6OnN0cmluZyYgZ2lkLCB1aW50MzJfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1heF9hY3RpdmF0aW9uX2RlcHRoKTsKKworICAgIGNvbnN0IENncm91cENvbnRyb2xsZXIqIGNvbnRyb2xsZXIoKSBjb25zdCB7IHJldHVybiAmY29udHJvbGxlcl87IH0KKyAgICBtb2RlX3QgbW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1vZGVfOyB9CisgICAgc3RkOjpzdHJpbmcgdWlkKCkgY29uc3QgeyByZXR1cm4gdWlkXzsgfQorICAgIHN0ZDo6c3RyaW5nIGdpZCgpIGNvbnN0IHsgcmV0dXJuIGdpZF87IH0KKworICAgIHZvaWQgc2V0X21vdW50ZWQoYm9vbCBtb3VudGVkKTsKKworICBwcml2YXRlOgorICAgIENncm91cENvbnRyb2xsZXIgY29udHJvbGxlcl87CisgICAgbW9kZV90IG1vZGVfID0gMDsKKyAgICBzdGQ6OnN0cmluZyB1aWRfOworICAgIHN0ZDo6c3RyaW5nIGdpZF87Cit9OwpkaWZmIC0tZ2l0IGEvbGlicHJvY2Vzc2dyb3VwL3V0aWwvaW5jbHVkZS9wcm9jZXNzZ3JvdXAvdXRpbC5oIGIvbGlicHJvY2Vzc2dyb3VwL3V0aWwvaW5jbHVkZS9wcm9jZXNzZ3JvdXAvdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjN2IzMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwcm9jZXNzZ3JvdXAvdXRpbC9pbmNsdWRlL3Byb2Nlc3Nncm91cC91dGlsLmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImNncm91cF9kZXNjcmlwdG9yLmgiCisKKy8vIER1cGxpY2F0ZWQgZnJvbSBjZ3JvdXByYy5oLiBEb24ndCBkZXBlbmQgb24gbGliY2dyb3VwcmMgaGVyZS4KKyNkZWZpbmUgQ0dST1VQUkNfQ09OVFJPTExFUl9GTEFHX01PVU5URUQgMHgxCisjZGVmaW5lIENHUk9VUFJDX0NPTlRST0xMRVJfRkxBR19ORUVEU19BQ1RJVkFUSU9OIDB4MgorI2RlZmluZSBDR1JPVVBSQ19DT05UUk9MTEVSX0ZMQUdfT1BUSU9OQUwgMHg0CisKK3Vuc2lnbmVkIGludCBHZXRDZ3JvdXBEZXB0aChjb25zdCBzdGQ6OnN0cmluZyYgY29udHJvbGxlcl9yb290LCBjb25zdCBzdGQ6OnN0cmluZyYgY2dyb3VwX3BhdGgpOworCit1c2luZyBDZ3JvdXBDb250cm9sbGVyTmFtZSA9IHN0ZDo6c3RyaW5nOwordXNpbmcgQ2dyb3VwRGVzY3JpcHRvck1hcCA9IHN0ZDo6bWFwPENncm91cENvbnRyb2xsZXJOYW1lLCBDZ3JvdXBEZXNjcmlwdG9yPjsKK2Jvb2wgUmVhZERlc2NyaXB0b3JzKENncm91cERlc2NyaXB0b3JNYXAqIGRlc2NyaXB0b3JzKTsKKworYm9vbCBBY3RpdmF0ZUNvbnRyb2xsZXJzKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBjb25zdCBDZ3JvdXBEZXNjcmlwdG9yTWFwJiBkZXNjcmlwdG9ycyk7CmRpZmYgLS1naXQgYS9saWJwcm9jZXNzZ3JvdXAvdXRpbC90ZXN0cy91dGlsLmNwcCBiL2xpYnByb2Nlc3Nncm91cC91dGlsL3Rlc3RzL3V0aWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYWVmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwcm9jZXNzZ3JvdXAvdXRpbC90ZXN0cy91dGlsLmNwcApAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxwcm9jZXNzZ3JvdXAvdXRpbC5oPgorCisjaW5jbHVkZSAiZ3Rlc3QvZ3Rlc3QuaCIKKworVEVTVChFbXB0eUlucHV0cywgYm90aEVtcHR5KSB7CisgICAgRVhQRUNUX0VRKEdldENncm91cERlcHRoKHt9LCB7fSksIDApOworfQorCitURVNUKEVtcHR5SW5wdXRzLCByb290RW1wdHkpIHsKKyAgICBFWFBFQ1RfRVEoR2V0Q2dyb3VwRGVwdGgoe30sICJmb28iKSwgMCk7Cit9CisKK1RFU1QoRW1wdHlJbnB1dHMsIHBhdGhFbXB0eSkgeworICAgIEVYUEVDVF9FUShHZXRDZ3JvdXBEZXB0aCgiZm9vIiwge30pLCAwKTsKK30KKworVEVTVChJbnZhbGlkSW5wdXRzLCBwYXRoTm90SW5Sb290KSB7CisgICAgRVhQRUNUX0VRKEdldENncm91cERlcHRoKCJmb28iLCAiYmFyIiksIDApOworfQorCitURVNUKEludmFsaWRJbnB1dHMsIHJvb3RMYXJnZXJUaGFuUGF0aCkgeworICAgIEVYUEVDVF9FUShHZXRDZ3JvdXBEZXB0aCgiL2EvbG9uZy9wYXRoIiwgIi9zaG9ydCIpLCAwKTsKK30KKworVEVTVChJbnZhbGlkSW5wdXRzLCBwYXRoTGFyZ2VyVGhhblJvb3QpIHsKKyAgICBFWFBFQ1RfRVEoR2V0Q2dyb3VwRGVwdGgoIi9zaG9ydCIsICIvYS9sb25nL3BhdGgiKSwgMCk7Cit9CisKK1RFU1QoSW52YWxpZElucHV0cywgbWlzc2luZ1NlcGFyYXRvcikgeworICAgIEVYUEVDVF9FUShHZXRDZ3JvdXBEZXB0aCgiL2NvbnRyb2xsZXIvcm9vdCIsICIvY29udHJvbGxlci9yb290Y2dyb3VwIiksIDApOworfQorCitURVNUKEV4dHJhU2VwYXJhdG9ycywgcm9vdCkgeworICAgIEVYUEVDVF9FUShHZXRDZ3JvdXBEZXB0aCgiLy8vc3lzL2ZzL2Nncm91cCIsICIvc3lzL2ZzL2Nncm91cC9hL2IvYyIpLCAzKTsKKyAgICBFWFBFQ1RfRVEoR2V0Q2dyb3VwRGVwdGgoIi9zeXMvLy9mcy9jZ3JvdXAiLCAiL3N5cy9mcy9jZ3JvdXAvYS9iL2MiKSwgMyk7CisgICAgRVhQRUNUX0VRKEdldENncm91cERlcHRoKCIvc3lzL2ZzLy8vY2dyb3VwIiwgIi9zeXMvZnMvY2dyb3VwL2EvYi9jIiksIDMpOworCisgICAgRVhQRUNUX0VRKEdldENncm91cERlcHRoKCIvc3lzL2ZzL2Nncm91cCIsICIvLy9zeXMvZnMvY2dyb3VwL2EvYi9jIiksIDMpOworICAgIEVYUEVDVF9FUShHZXRDZ3JvdXBEZXB0aCgiL3N5cy9mcy9jZ3JvdXAiLCAiL3N5cy8vL2ZzL2Nncm91cC9hL2IvYyIpLCAzKTsKKyAgICBFWFBFQ1RfRVEoR2V0Q2dyb3VwRGVwdGgoIi9zeXMvZnMvY2dyb3VwIiwgIi9zeXMvZnMvLy9jZ3JvdXAvYS9iL2MiKSwgMyk7CisgICAgRVhQRUNUX0VRKEdldENncm91cERlcHRoKCIvc3lzL2ZzL2Nncm91cCIsICIvc3lzL2ZzL2Nncm91cC8vL2EvYi9jIiksIDMpOworICAgIEVYUEVDVF9FUShHZXRDZ3JvdXBEZXB0aCgiL3N5cy9mcy9jZ3JvdXAiLCAiL3N5cy9mcy9jZ3JvdXAvYS8vL2IvYyIpLCAzKTsKKyAgICBFWFBFQ1RfRVEoR2V0Q2dyb3VwRGVwdGgoIi9zeXMvZnMvY2dyb3VwIiwgIi9zeXMvZnMvY2dyb3VwL2EvYi8vL2MiKSwgMyk7Cit9CisKK1RFU1QoU2VwYXJhdG9yRW5kaW5ncywgcm9vdEVuZHNJblNlcGFyYXRvcikgeworICAgIEVYUEVDVF9FUShHZXRDZ3JvdXBEZXB0aCgiL3N5cy9mcy9jZ3JvdXAvIiwgIi9zeXMvZnMvY2dyb3VwL2EvYiIpLCAyKTsKKyAgICBFWFBFQ1RfRVEoR2V0Q2dyb3VwRGVwdGgoIi9zeXMvZnMvY2dyb3VwLy8vIiwgIi9zeXMvZnMvY2dyb3VwL2EvYiIpLCAyKTsKKyAgICBFWFBFQ1RfRVEoR2V0Q2dyb3VwRGVwdGgoIi9zeXMvZnMvY2dyb3VwLyIsICIvc3lzL2ZzL2Nncm91cC9hL2IvIiksIDIpOworICAgIEVYUEVDVF9FUShHZXRDZ3JvdXBEZXB0aCgiL3N5cy9mcy9jZ3JvdXAvLy8iLCAiL3N5cy9mcy9jZ3JvdXAvYS9iLyIpLCAyKTsKK30KKworVEVTVChTZXBhcmF0b3JFbmRpbmdzLCBwYXRoRW5kc0luU2VwYXJhdG9yKSB7CisgICAgRVhQRUNUX0VRKEdldENncm91cERlcHRoKCIvc3lzL2ZzL2Nncm91cCIsICIvc3lzL2ZzL2Nncm91cC9hL2IvIiksIDIpOworICAgIEVYUEVDVF9FUShHZXRDZ3JvdXBEZXB0aCgiL3N5cy9mcy9jZ3JvdXAiLCAiL3N5cy9mcy9jZ3JvdXAvYS9iLy8vIiksIDIpOworICAgIEVYUEVDVF9FUShHZXRDZ3JvdXBEZXB0aCgiL3N5cy9mcy9jZ3JvdXAvIiwgIi9zeXMvZnMvY2dyb3VwL2EvYi8iKSwgMik7CisgICAgRVhQRUNUX0VRKEdldENncm91cERlcHRoKCIvc3lzL2ZzL2Nncm91cC8iLCAiL3N5cy9mcy9jZ3JvdXAvYS9iLy8vIiksIDIpOworfQorCitURVNUKFZhbGlkSW5wdXRzLCByb290SGFzWmVyb0RlcHRoKSB7CisgICAgRVhQRUNUX0VRKEdldENncm91cERlcHRoKCIvc3lzL2ZzL2Nncm91cCIsICIvc3lzL2ZzL2Nncm91cCIpLCAwKTsKKyAgICBFWFBFQ1RfRVEoR2V0Q2dyb3VwRGVwdGgoIi9zeXMvZnMvY2dyb3VwLyIsICIvc3lzL2ZzL2Nncm91cCIpLCAwKTsKKyAgICBFWFBFQ1RfRVEoR2V0Q2dyb3VwRGVwdGgoIi9zeXMvZnMvY2dyb3VwIiwgIi9zeXMvZnMvY2dyb3VwLyIpLCAwKTsKKyAgICBFWFBFQ1RfRVEoR2V0Q2dyb3VwRGVwdGgoIi9zeXMvZnMvY2dyb3VwLyIsICIvc3lzL2ZzL2Nncm91cC8iKSwgMCk7Cit9CisKK1RFU1QoVmFsaWRJbnB1dHMsIGF0TGVhc3REZXB0aDEwKSB7CisgICAgRVhQRUNUX0VRKEdldENncm91cERlcHRoKCIvc3lzL2ZzL2Nncm91cCIsICIvc3lzL2ZzL2Nncm91cC9hL2IvYy9kL2UvZi9nL2gvaS9qIiksIDEwKTsKK30KKworVEVTVChWYWxpZElucHV0cywgYW5kcm9pZENncm91cE5hbWVzKSB7CisgICAgRVhQRUNUX0VRKEdldENncm91cERlcHRoKCIvc3lzL2ZzL2Nncm91cCIsICIvc3lzL2ZzL2Nncm91cC9zeXN0ZW0vdWlkXzAvcGlkXzEwMDAiKSwgMyk7CisgICAgRVhQRUNUX0VRKEdldENncm91cERlcHRoKCIvc3lzL2ZzL2Nncm91cCIsICIvc3lzL2ZzL2Nncm91cC91aWRfMC9waWRfMTAwMCIpLCAyKTsKKworICAgIEVYUEVDVF9FUShHZXRDZ3JvdXBEZXB0aCgiL3N5cy9mcy9jZ3JvdXAiLCAiL3N5cy9mcy9jZ3JvdXAvYXBwcy91aWRfMTAwMDAwL3BpZF8xMDAwIiksIDMpOworICAgIEVYUEVDVF9FUShHZXRDZ3JvdXBEZXB0aCgiL3N5cy9mcy9jZ3JvdXAiLCAiL3N5cy9mcy9jZ3JvdXAvdWlkXzEwMDAwMC9waWRfMTAwMCIpLCAyKTsKKworICAgIEVYUEVDVF9FUShHZXRDZ3JvdXBEZXB0aCgiL3N5cy9mcy9jZ3JvdXAiLCAiL3N5cy9mcy9jZ3JvdXAvYXBwcyIpLCAxKTsKKyAgICBFWFBFQ1RfRVEoR2V0Q2dyb3VwRGVwdGgoIi9zeXMvZnMvY2dyb3VwIiwgIi9zeXMvZnMvY2dyb3VwL3N5c3RlbSIpLCAxKTsKK30KKworVEVTVChWYWxpZElucHV0cywgYW5kcm9pZENncm91cE5hbWVzX25vbkRlZmF1bHRSb290KSB7CisgICAgRVhQRUNUX0VRKEdldENncm91cERlcHRoKCIvY3VzdG9tL3Jvb3QiLCAiL2N1c3RvbS9yb290L3N5c3RlbS91aWRfMC9waWRfMTAwMCIpLCAzKTsKKyAgICBFWFBFQ1RfRVEoR2V0Q2dyb3VwRGVwdGgoIi9jdXN0b20vcm9vdCIsICIvY3VzdG9tL3Jvb3QvdWlkXzAvcGlkXzEwMDAiKSwgMik7CisKKyAgICBFWFBFQ1RfRVEoR2V0Q2dyb3VwRGVwdGgoIi9jdXN0b20vcm9vdCIsICIvY3VzdG9tL3Jvb3QvYXBwcy91aWRfMTAwMDAwL3BpZF8xMDAwIiksIDMpOworICAgIEVYUEVDVF9FUShHZXRDZ3JvdXBEZXB0aCgiL2N1c3RvbS9yb290IiwgIi9jdXN0b20vcm9vdC91aWRfMTAwMDAwL3BpZF8xMDAwIiksIDIpOworCisgICAgRVhQRUNUX0VRKEdldENncm91cERlcHRoKCIvY3VzdG9tL3Jvb3QiLCAiL2N1c3RvbS9yb290L2FwcHMiKSwgMSk7CisgICAgRVhQRUNUX0VRKEdldENncm91cERlcHRoKCIvY3VzdG9tL3Jvb3QiLCAiL2N1c3RvbS9yb290L3N5c3RlbSIpLCAxKTsKK30KZGlmZiAtLWdpdCBhL2xpYnByb2Nlc3Nncm91cC91dGlsL3V0aWwuY3BwIGIvbGlicHJvY2Vzc2dyb3VwL3V0aWwvdXRpbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQwMTY3NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnByb2Nlc3Nncm91cC91dGlsL3V0aWwuY3BwCkBAIC0wLDAgKzEsMjc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHByb2Nlc3Nncm91cC91dGlsLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8b3B0aW9uYWw+CisjaW5jbHVkZSA8c3RyaW5nX3ZpZXc+CisKKyNpbmNsdWRlIDxtbnRlbnQuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKyNpbmNsdWRlIDxqc29uL3JlYWRlci5oPgorI2luY2x1ZGUgPGpzb24vdmFsdWUuaD4KKworI2luY2x1ZGUgIi4uL2J1aWxkX2ZsYWdzLmgiCisjaW5jbHVkZSAiLi4vaW50ZXJuYWwuaCIKKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6R2V0VWludFByb3BlcnR5OworCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgY29uc3QgY2hhciogQ0dST1VQU19ERVNDX0ZJTEUgPSAiL2V0Yy9jZ3JvdXBzLmpzb24iOworY29uc3RleHByIGNvbnN0IGNoYXIqIENHUk9VUFNfREVTQ19WRU5ET1JfRklMRSA9ICIvdmVuZG9yL2V0Yy9jZ3JvdXBzLmpzb24iOworY29uc3RleHByIGNvbnN0IGNoYXIqIFRFTVBMQVRFX0NHUk9VUFNfREVTQ19BUElfRklMRSA9ICIvZXRjL3Rhc2tfcHJvZmlsZXMvY2dyb3Vwc18ldS5qc29uIjsKKworLy8gVGhpcyBzaG91bGQgbWF0Y2ggdGhlIHB1YmxpY2x5IGRlY2xhcmVkIHZhbHVlIGluIHByb2Nlc3Nncm91cC5oLAorLy8gYnV0IHdlIGRvbid0IHdhbnQgdGhpcyBsaWJyYXJ5IHRvIGRlcGVuZCBvbiBsaWJwcm9jZXNzZ3JvdXAuCitjb25zdGV4cHIgc3RkOjpzdHJpbmcgQ0dST1VQVjJfSElFUkFSQ0hZX05BTUVfSU5URVJOQUwgPSAiY2dyb3VwMiI7CisKK2NvbnN0IGNoYXIgU0VQID0gJy8nOworCitzdGQ6OnN0cmluZyBEZWR1cGxpY2F0ZUFuZFRyaW1TZXBhcmF0b3JzKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7CisgICAgYm9vbCBsYXN0V2FzU2VwID0gZmFsc2U7CisgICAgc3RkOjpzdHJpbmcgcmV0OworCisgICAgc3RkOjpjb3B5X2lmKHBhdGguYmVnaW4oKSwgcGF0aC5lbmQoKSwgc3RkOjpiYWNrX2luc2VydGVyKHJldCksIFsmbGFzdFdhc1NlcF0oY2hhciBjKSB7CisgICAgICAgIGlmIChsYXN0V2FzU2VwKSB7CisgICAgICAgICAgICBpZiAoYyA9PSBTRVApIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGxhc3RXYXNTZXAgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmIChjID09IFNFUCkgeworICAgICAgICAgICAgbGFzdFdhc1NlcCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSk7CisKKyAgICBpZiAocmV0Lmxlbmd0aCgpID4gMSAmJiByZXQuYmFjaygpID09IFNFUCkgcmV0LnBvcF9iYWNrKCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIE1lcmdlQ2dyb3VwVG9EZXNjcmlwdG9ycyhDZ3JvdXBEZXNjcmlwdG9yTWFwKiBkZXNjcmlwdG9ycywgY29uc3QgSnNvbjo6VmFsdWUmIGNncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgcm9vdF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNncm91cHNfdmVyc2lvbikgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGNncm91cF9wYXRoID0gY2dyb3VwWyJQYXRoIl0uYXNTdHJpbmcoKTsKKyAgICBzdGQ6OnN0cmluZyBwYXRoOworCisgICAgaWYgKCFyb290X3BhdGguZW1wdHkoKSkgeworICAgICAgICBwYXRoID0gcm9vdF9wYXRoOworICAgICAgICBpZiAoY2dyb3VwX3BhdGggIT0gIi4iKSB7CisgICAgICAgICAgICBwYXRoICs9ICIvIjsKKyAgICAgICAgICAgIHBhdGggKz0gY2dyb3VwX3BhdGg7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBwYXRoID0gY2dyb3VwX3BhdGg7CisgICAgfQorCisgICAgdWludDMyX3QgY29udHJvbGxlcl9mbGFncyA9IDA7CisKKyAgICBpZiAoY2dyb3VwWyJOZWVkc0FjdGl2YXRpb24iXS5pc0Jvb2woKSAmJiBjZ3JvdXBbIk5lZWRzQWN0aXZhdGlvbiJdLmFzQm9vbCgpKSB7CisgICAgICAgIGNvbnRyb2xsZXJfZmxhZ3MgfD0gQ0dST1VQUkNfQ09OVFJPTExFUl9GTEFHX05FRURTX0FDVElWQVRJT047CisgICAgfQorCisgICAgaWYgKGNncm91cFsiT3B0aW9uYWwiXS5pc0Jvb2woKSAmJiBjZ3JvdXBbIk9wdGlvbmFsIl0uYXNCb29sKCkpIHsKKyAgICAgICAgY29udHJvbGxlcl9mbGFncyB8PSBDR1JPVVBSQ19DT05UUk9MTEVSX0ZMQUdfT1BUSU9OQUw7CisgICAgfQorCisgICAgdWludDMyX3QgbWF4X2FjdGl2YXRpb25fZGVwdGggPSBVSU5UMzJfTUFYOworICAgIGlmIChjZ3JvdXAuaXNNZW1iZXIoIk1heEFjdGl2YXRpb25EZXB0aCIpKSB7CisgICAgICAgIG1heF9hY3RpdmF0aW9uX2RlcHRoID0gY2dyb3VwWyJNYXhBY3RpdmF0aW9uRGVwdGgiXS5hc1VJbnQoKTsKKyAgICB9CisKKyAgICBDZ3JvdXBEZXNjcmlwdG9yIGRlc2NyaXB0b3IoCisgICAgICAgICAgICBjZ3JvdXBzX3ZlcnNpb24sIG5hbWUsIHBhdGgsIHN0ZDo6c3RydG91bChjZ3JvdXBbIk1vZGUiXS5hc1N0cmluZygpLmNfc3RyKCksIDAsIDgpLAorICAgICAgICAgICAgY2dyb3VwWyJVSUQiXS5hc1N0cmluZygpLCBjZ3JvdXBbIkdJRCJdLmFzU3RyaW5nKCksIGNvbnRyb2xsZXJfZmxhZ3MsCisgICAgICAgICAgICBtYXhfYWN0aXZhdGlvbl9kZXB0aCk7CisKKyAgICBhdXRvIGl0ZXIgPSBkZXNjcmlwdG9ycy0+ZmluZChuYW1lKTsKKyAgICBpZiAoaXRlciA9PSBkZXNjcmlwdG9ycy0+ZW5kKCkpIHsKKyAgICAgICAgZGVzY3JpcHRvcnMtPmVtcGxhY2UobmFtZSwgZGVzY3JpcHRvcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaXRlci0+c2Vjb25kID0gZGVzY3JpcHRvcjsKKyAgICB9Cit9CisKK2Jvb2wgUmVhZERlc2NyaXB0b3JzRnJvbUZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfbmFtZSwgQ2dyb3VwRGVzY3JpcHRvck1hcCogZGVzY3JpcHRvcnMpIHsKKyAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgZm9yY2VfbWVtY2dfdjIgPSBhbmRyb2lkOjpsaWJwcm9jZXNzZ3JvdXBfZmxhZ3M6OmZvcmNlX21lbWNnX3YyKCk7CisgICAgc3RkOjp2ZWN0b3I8Q2dyb3VwRGVzY3JpcHRvcj4gcmVzdWx0OworICAgIHN0ZDo6c3RyaW5nIGpzb25fZG9jOworCisgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpSZWFkRmlsZVRvU3RyaW5nKGZpbGVfbmFtZSwgJmpzb25fZG9jKSkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlYWQgdGFzayBwcm9maWxlcyBmcm9tICIgPDwgZmlsZV9uYW1lOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgSnNvbjo6Q2hhclJlYWRlckJ1aWxkZXIgYnVpbGRlcjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SnNvbjo6Q2hhclJlYWRlcj4gcmVhZGVyKGJ1aWxkZXIubmV3Q2hhclJlYWRlcigpKTsKKyAgICBKc29uOjpWYWx1ZSByb290OworICAgIHN0ZDo6c3RyaW5nIGVycm9yTWVzc2FnZTsKKyAgICBpZiAoIXJlYWRlci0+cGFyc2UoJipqc29uX2RvYy5iZWdpbigpLCAmKmpzb25fZG9jLmVuZCgpLCAmcm9vdCwgJmVycm9yTWVzc2FnZSkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHBhcnNlIGNncm91cHMgZGVzY3JpcHRpb246ICIgPDwgZXJyb3JNZXNzYWdlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHJvb3QuaXNNZW1iZXIoIkNncm91cHMiKSkgeworICAgICAgICBjb25zdCBKc29uOjpWYWx1ZSYgY2dyb3VwcyA9IHJvb3RbIkNncm91cHMiXTsKKyAgICAgICAgZm9yIChKc29uOjpWYWx1ZTo6QXJyYXlJbmRleCBpID0gMDsgaSA8IGNncm91cHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBjZ3JvdXBzW2ldWyJDb250cm9sbGVyIl0uYXNTdHJpbmcoKTsKKworICAgICAgICAgICAgaWYgKGZvcmNlX21lbWNnX3YyICYmIG5hbWUgPT0gIm1lbW9yeSIpIGNvbnRpbnVlOworCisgICAgICAgICAgICBNZXJnZUNncm91cFRvRGVzY3JpcHRvcnMoZGVzY3JpcHRvcnMsIGNncm91cHNbaV0sIG5hbWUsICIiLCAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgbWVtY2d2Ml9wcmVzZW50ID0gZmFsc2U7CisgICAgc3RkOjpzdHJpbmcgcm9vdF9wYXRoOworICAgIGlmIChyb290LmlzTWVtYmVyKCJDZ3JvdXBzMiIpKSB7CisgICAgICAgIGNvbnN0IEpzb246OlZhbHVlJiBjZ3JvdXBzMiA9IHJvb3RbIkNncm91cHMyIl07CisgICAgICAgIHJvb3RfcGF0aCA9IGNncm91cHMyWyJQYXRoIl0uYXNTdHJpbmcoKTsKKyAgICAgICAgTWVyZ2VDZ3JvdXBUb0Rlc2NyaXB0b3JzKGRlc2NyaXB0b3JzLCBjZ3JvdXBzMiwgQ0dST1VQVjJfSElFUkFSQ0hZX05BTUVfSU5URVJOQUwsICIiLCAyKTsKKworICAgICAgICBjb25zdCBKc29uOjpWYWx1ZSYgY2hpbGRHcm91cHMgPSBjZ3JvdXBzMlsiQ29udHJvbGxlcnMiXTsKKyAgICAgICAgZm9yIChKc29uOjpWYWx1ZTo6QXJyYXlJbmRleCBpID0gMDsgaSA8IGNoaWxkR3JvdXBzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lID0gY2hpbGRHcm91cHNbaV1bIkNvbnRyb2xsZXIiXS5hc1N0cmluZygpOworCisgICAgICAgICAgICBpZiAoZm9yY2VfbWVtY2dfdjIgJiYgbmFtZSA9PSAibWVtb3J5IikgbWVtY2d2Ml9wcmVzZW50ID0gdHJ1ZTsKKworICAgICAgICAgICAgTWVyZ2VDZ3JvdXBUb0Rlc2NyaXB0b3JzKGRlc2NyaXB0b3JzLCBjaGlsZEdyb3Vwc1tpXSwgbmFtZSwgcm9vdF9wYXRoLCAyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmb3JjZV9tZW1jZ192MiAmJiAhbWVtY2d2Ml9wcmVzZW50KSB7CisgICAgICAgIExPRyhJTkZPKSA8PCAiRm9yY2luZyBtZW1jZyB0byB2MiBoaWVyYXJjaHkiOworICAgICAgICBKc29uOjpWYWx1ZSBtZW1jZ3YyOworICAgICAgICBtZW1jZ3YyWyJDb250cm9sbGVyIl0gPSAibWVtb3J5IjsKKyAgICAgICAgbWVtY2d2MlsiTmVlZHNBY3RpdmF0aW9uIl0gPSB0cnVlOworICAgICAgICBtZW1jZ3YyWyJQYXRoIl0gPSAiLiI7CisgICAgICAgIG1lbWNndjJbIk9wdGlvbmFsIl0gPSB0cnVlOyAgLy8gSW4gY2FzZSBvZiBjZ3JvdXBfZGlzYWJsZWQ9bWVtb3J5LCBzbyB3ZSBjYW4gc3RpbGwgYm9vdAorICAgICAgICBNZXJnZUNncm91cFRvRGVzY3JpcHRvcnMoZGVzY3JpcHRvcnMsIG1lbWNndjIsICJtZW1vcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdF9wYXRoLmVtcHR5KCkgPyBDR1JPVVBfVjJfUk9PVF9ERUZBVUxUIDogcm9vdF9wYXRoLCAyKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordXNpbmcgTW91bnREaXIgPSBzdGQ6OnN0cmluZzsKK3VzaW5nIE1vdW50T3B0cyA9IHN0ZDo6c3RyaW5nOworc3RhdGljIHN0ZDo6b3B0aW9uYWw8c3RkOjptYXA8TW91bnREaXIsIE1vdW50T3B0cz4+IFJlYWRDZ3JvdXBWMU1vdW50cygpIHsKKyAgICBGSUxFKiBmcCA9IHNldG1udGVudCgiL3Byb2MvbW91bnRzIiwgInIiKTsKKyAgICBpZiAoZnAgPT0gbnVsbHB0cikgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlYWQgbW91bnRzIjsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKKyAgICB9CisKKyAgICBzdGQ6Om1hcDxNb3VudERpciwgTW91bnRPcHRzPiBtb3VudHM7CisgICAgY29uc3Qgc3RkOjpzdHJpbmdfdmlldyBDR1JPVVBfVjFfVFlQRSA9ICJjZ3JvdXAiOworICAgIGZvciAobW50ZW50KiBtZW50cnkgPSBnZXRtbnRlbnQoZnApOyBtZW50cnkgIT0gbnVsbHB0cjsgbWVudHJ5ID0gZ2V0bW50ZW50KGZwKSkgeworICAgICAgICBpZiAobWVudHJ5LT5tbnRfdHlwZSAmJiBDR1JPVVBfVjFfVFlQRSA9PSBtZW50cnktPm1udF90eXBlICYmCisgICAgICAgICAgICBtZW50cnktPm1udF9kaXIgJiYgbWVudHJ5LT5tbnRfb3B0cykgeworICAgICAgICAgICAgbW91bnRzW21lbnRyeS0+bW50X2Rpcl0gPSBtZW50cnktPm1udF9vcHRzOworICAgICAgICB9CisgICAgfQorICAgIGVuZG1udGVudChmcCk7CisKKyAgICByZXR1cm4gbW91bnRzOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKKwordW5zaWduZWQgaW50IEdldENncm91cERlcHRoKGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250cm9sbGVyX3Jvb3QsIGNvbnN0IHN0ZDo6c3RyaW5nJiBjZ3JvdXBfcGF0aCkgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGRlZHVwZWRfcm9vdCA9IERlZHVwbGljYXRlQW5kVHJpbVNlcGFyYXRvcnMoY29udHJvbGxlcl9yb290KTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBkZWR1cGVkX3BhdGggPSBEZWR1cGxpY2F0ZUFuZFRyaW1TZXBhcmF0b3JzKGNncm91cF9wYXRoKTsKKworICAgIGlmIChkZWR1cGVkX3Jvb3QuZW1wdHkoKSB8fCBkZWR1cGVkX3BhdGguZW1wdHkoKSB8fCAhZGVkdXBlZF9wYXRoLnN0YXJ0c193aXRoKGRlZHVwZWRfcm9vdCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIHN0ZDo6Y291bnQoZGVkdXBlZF9wYXRoLmJlZ2luKCkgKyBkZWR1cGVkX3Jvb3Quc2l6ZSgpLCBkZWR1cGVkX3BhdGguZW5kKCksIFNFUCk7Cit9CisKK2Jvb2wgUmVhZERlc2NyaXB0b3JzKENncm91cERlc2NyaXB0b3JNYXAqIGRlc2NyaXB0b3JzKSB7CisgICAgLy8gbG9hZCBzeXN0ZW0gY2dyb3VwIGRlc2NyaXB0b3JzCisgICAgaWYgKCFSZWFkRGVzY3JpcHRvcnNGcm9tRmlsZShDR1JPVVBTX0RFU0NfRklMRSwgZGVzY3JpcHRvcnMpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBsb2FkIEFQSS1sZXZlbCBzcGVjaWZpYyBzeXN0ZW0gY2dyb3VwcyBkZXNjcmlwdG9ycyBpZiBhdmFpbGFibGUKKyAgICB1bnNpZ25lZCBpbnQgYXBpX2xldmVsID0gR2V0VWludFByb3BlcnR5PHVuc2lnbmVkIGludD4oInJvLnByb2R1Y3QuZmlyc3RfYXBpX2xldmVsIiwgMCk7CisgICAgaWYgKGFwaV9sZXZlbCA+IDApIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgYXBpX2Nncm91cHNfcGF0aCA9CisgICAgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKFRFTVBMQVRFX0NHUk9VUFNfREVTQ19BUElfRklMRSwgYXBpX2xldmVsKTsKKyAgICAgICAgaWYgKCFhY2Nlc3MoYXBpX2Nncm91cHNfcGF0aC5jX3N0cigpLCBGX09LKSB8fCBlcnJubyAhPSBFTk9FTlQpIHsKKyAgICAgICAgICAgIGlmICghUmVhZERlc2NyaXB0b3JzRnJvbUZpbGUoYXBpX2Nncm91cHNfcGF0aCwgZGVzY3JpcHRvcnMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gbG9hZCB2ZW5kb3IgY2dyb3VwIGRlc2NyaXB0b3JzIGlmIHRoZSBmaWxlIGV4aXN0cworICAgIGlmICghYWNjZXNzKENHUk9VUFNfREVTQ19WRU5ET1JfRklMRSwgRl9PSykgJiYKKyAgICAgICAgIVJlYWREZXNjcmlwdG9yc0Zyb21GaWxlKENHUk9VUFNfREVTQ19WRU5ET1JfRklMRSwgZGVzY3JpcHRvcnMpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBjaGVjayBmb3IgdjEgbW91bnQvdXNhYmlsaXR5IHN0YXR1cworICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjptYXA8TW91bnREaXIsIE1vdW50T3B0cz4+IHYxTW91bnRzOworICAgIGZvciAoYXV0byYgW25hbWUsIGRlc2NyaXB0b3JdIDogKmRlc2NyaXB0b3JzKSB7CisgICAgICAgIGNvbnN0IENncm91cENvbnRyb2xsZXIqIGNvbnN0IGNvbnRyb2xsZXIgPSBkZXNjcmlwdG9yLmNvbnRyb2xsZXIoKTsKKworICAgICAgICBpZiAoY29udHJvbGxlci0+dmVyc2lvbigpICE9IDEpIGNvbnRpbnVlOworCisgICAgICAgIC8vIFJlYWQgb25seSBvbmNlLCBhbmQgb25seSBpZiB3ZSBoYXZlIGF0IGxlYXN0IG9uZSB2MSBjb250cm9sbGVyCisgICAgICAgIGlmICghdjFNb3VudHMpIHsKKyAgICAgICAgICAgIHYxTW91bnRzID0gUmVhZENncm91cFYxTW91bnRzKCk7CisgICAgICAgICAgICBpZiAoIXYxTW91bnRzKSByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29uc3QgYXV0byBpdCA9IHYxTW91bnRzLT5maW5kKGNvbnRyb2xsZXItPnBhdGgoKSk7IGl0ICE9IHYxTW91bnRzLT5lbmQoKSkgeworICAgICAgICAgICAgaWYgKGl0LT5zZWNvbmQuY29udGFpbnMoY29udHJvbGxlci0+bmFtZSgpKSkgZGVzY3JpcHRvci5zZXRfbW91bnRlZCh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEFjdGl2YXRlQ29udHJvbGxlcnMoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIGNvbnN0IENncm91cERlc2NyaXB0b3JNYXAmIGRlc2NyaXB0b3JzKSB7CisgICAgZm9yIChjb25zdCBhdXRvJiBbbmFtZSwgZGVzY3JpcHRvcl0gOiBkZXNjcmlwdG9ycykgeworICAgICAgICBjb25zdCB1aW50MzJfdCBmbGFncyA9IGRlc2NyaXB0b3IuY29udHJvbGxlcigpLT5mbGFncygpOworICAgICAgICBjb25zdCB1aW50MzJfdCBtYXhfYWN0aXZhdGlvbl9kZXB0aCA9IGRlc2NyaXB0b3IuY29udHJvbGxlcigpLT5tYXhfYWN0aXZhdGlvbl9kZXB0aCgpOworICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgZGVwdGggPSBHZXRDZ3JvdXBEZXB0aChkZXNjcmlwdG9yLmNvbnRyb2xsZXIoKS0+cGF0aCgpLCBwYXRoKTsKKworICAgICAgICBpZiAoZmxhZ3MgJiBDR1JPVVBSQ19DT05UUk9MTEVSX0ZMQUdfTkVFRFNfQUNUSVZBVElPTiAmJiBkZXB0aCA8IG1heF9hY3RpdmF0aW9uX2RlcHRoKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdHIoIisiKTsKKyAgICAgICAgICAgIHN0ci5hcHBlbmQoZGVzY3JpcHRvci5jb250cm9sbGVyKCktPm5hbWUoKSk7CisgICAgICAgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OldyaXRlU3RyaW5nVG9GaWxlKHN0ciwgcGF0aCArICIvY2dyb3VwLnN1YnRyZWVfY29udHJvbCIpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgQ0dST1VQUkNfQ09OVFJPTExFUl9GTEFHX09QVElPTkFMKSB7CisgICAgICAgICAgICAgICAgICAgIFBMT0coV0FSTklORykgPDwgIkFjdGl2YXRpb24gb2YgY2dyb3VwIGNvbnRyb2xsZXIgIiA8PCBzdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZhaWxlZCBpbiBwYXRoICIgPDwgcGF0aDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCmRpZmYgLS1naXQgYS9saWJzcGFyc2UvQW5kcm9pZC5icCBiL2xpYnNwYXJzZS9BbmRyb2lkLmJwCmluZGV4IDhlODNlMTYuLjQ0OTA3YTEgMTAwNjQ0Ci0tLSBhL2xpYnNwYXJzZS9BbmRyb2lkLmJwCisrKyBiL2xpYnNwYXJzZS9BbmRyb2lkLmJwCkBAIC0yOCw2ICsyOCw5IEBACiAgICAgICAgICJsaWJiYXNlIiwKICAgICBdLAogICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgICAgIH0sCiAgICAgICAgIHdpbmRvd3M6IHsKICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgIH0sCkBAIC0zOCw5ICs0MSw4IEBACiAgICAgXSwKIH0KIAotY2NfYmluYXJ5IHsKK2NjX2JpbmFyeV9ob3N0IHsKICAgICBuYW1lOiAic2ltZzJpbWciLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogICAgIHNyY3M6IFsKICAgICAgICAgInNpbWcyaW1nLmNwcCIsCiAgICAgICAgICJzcGFyc2VfY3JjMzIuY3BwIiwKQEAgLTUyLDExICs1NCwxNSBAQAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKIH0KIAotY2NfYmluYXJ5IHsKK2NjX2JpbmFyeV9ob3N0IHsKICAgICBuYW1lOiAiaW1nMnNpbWciLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogICAgIHNyY3M6IFsiaW1nMnNpbWcuY3BwIl0sCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYnNwYXJzZSIsCmRpZmYgLS1naXQgYS9saWJzdGF0cy9PV05FUlMgYi9saWJzdGF0cy9PV05FUlMKaW5kZXggZDM5MTY3OS4uZWZkMzY4NiAxMDA2NDQKLS0tIGEvbGlic3RhdHMvT1dORVJTCisrKyBiL2xpYnN0YXRzL09XTkVSUwpAQCAtMSw4ICsxLDggQEAKIGplZmZyZXlodWFuZ0Bnb29nbGUuY29tCi1qdG5ndXllbkBnb29nbGUuY29tCittb25pY2Ftd2FuZ0Bnb29nbGUuY29tCiBtdWhhbW1hZHFAZ29vZ2xlLmNvbQorcmF5aGRlekBnb29nbGUuY29tCiBzaGFyYWllbmtvQGdvb2dsZS5jb20KIHNpbmdodGVqaW5kZXJAZ29vZ2xlLmNvbQogdHNhaWNocmlzdGluZUBnb29nbGUuY29tCiB5YW9jaGVuQGdvb2dsZS5jb20KLXlyb0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9saWJzdGF0cy9leHByZXNzbG9nL0FuZHJvaWQuYnAgYi9saWJzdGF0cy9leHByZXNzbG9nL0FuZHJvaWQuYnAKaW5kZXggMDA0ZjhiOS4uZjcwMjUyYSAxMDA2NDQKLS0tIGEvbGlic3RhdHMvZXhwcmVzc2xvZy9BbmRyb2lkLmJwCisrKyBiL2xpYnN0YXRzL2V4cHJlc3Nsb2cvQW5kcm9pZC5icApAQCAtMSw0ICsxLDMgQEAKLQogLy8KIC8vIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAvLwpAQCAtMTYsNiArMTUsNyBAQAogLy8KIHBhY2thZ2UgewogICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJBbmRyb2lkLUFwYWNoZS0yLjAiXSwKKyAgICBkZWZhdWx0X3RlYW06ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX3RlbGVtZXRyeV9jbGllbnRfaW5mcmEiLAogfQogCiBjY19kZWZhdWx0cyB7CkBAIC0yOCw2ICsyOCw3IEBACiAKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJleHByZXNzbG9nIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKICAgICBkZWZhdWx0czogWyJleHByZXNzbG9nX2RlZmF1bHRzIl0sCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItRE5BTUVTUEFDRV9GT1JfSEFTSF9GVU5DVElPTlM9ZmFybWhhc2giLApAQCAtNDcsNiArNDgsMTEgQEAKICAgICAgICAgImxpYnN0YXRzc29ja2V0IiwKICAgICBdLAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjMzIiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5idHNlcnZpY2VzIiwKKyAgICBdLAogfQogCiBnZW5ydWxlIHsKQEAgLTY5LDEyICs3NSwxOCBAQAogCiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYnN0YXRzbG9nX2V4cHJlc3MiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogICAgIGdlbmVyYXRlZF9zb3VyY2VzOiBbInN0YXRzbG9nX2V4cHJlc3MuY3BwIl0sCiAgICAgZ2VuZXJhdGVkX2hlYWRlcnM6IFsic3RhdHNsb2dfZXhwcmVzcy5oIl0sCiAgICAgZXhwb3J0X2dlbmVyYXRlZF9oZWFkZXJzOiBbInN0YXRzbG9nX2V4cHJlc3MuaCJdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJzdGF0c3NvY2tldCIsCiAgICAgXSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIzMyIsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQuYnRzZXJ2aWNlcyIsCisgICAgXSwKIH0KIAogY2NfdGVzdCB7CkBAIC0xMDksNSArMTIxLDUgQEAKICAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJzdGF0c3NvY2tldCIsCi0gICAgXQorICAgIF0sCiB9CmRpZmYgLS1naXQgYS9saWJzdGF0cy9wdWxsX2xhenkvQW5kcm9pZC5icCBiL2xpYnN0YXRzL3B1bGxfbGF6eS9BbmRyb2lkLmJwCmluZGV4IDY1ZGNlMjYuLjcxYWYxNzAgMTAwNjQ0Ci0tLSBhL2xpYnN0YXRzL3B1bGxfbGF6eS9BbmRyb2lkLmJwCisrKyBiL2xpYnN0YXRzL3B1bGxfbGF6eS9BbmRyb2lkLmJwCkBAIC0zMiw3ICszMiw3IEBACiAgICAgICAgICItV2FsbCIsCiAgICAgICAgICItV2Vycm9yIiwKICAgICBdLAotICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyIsICJtdHMtc3RhdHNkIl0sCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCiAgICAgdGVzdF9jb25maWc6ICJsaWJzdGF0c3B1bGxfbGF6eV90ZXN0LnhtbCIsCiAgICAgLy8gVE9ETyhiLzE1MzU4ODk5MCk6IFJlbW92ZSB3aGVuIHRoZSBidWlsZCBzeXN0ZW0gcHJvcGVybHkgc2VwYXJhdGVzLgogICAgIC8vIDMyYml0IGFuZCA2NGJpdCBhcmNoaXRlY3R1cmVzLgpkaWZmIC0tZ2l0IGEvbGlic3RhdHMvcHVsbF9ydXN0L0FuZHJvaWQuYnAgYi9saWJzdGF0cy9wdWxsX3J1c3QvQW5kcm9pZC5icAppbmRleCA4NWEzOGY4Li4yYTg5MzllIDEwMDY0NAotLS0gYS9saWJzdGF0cy9wdWxsX3J1c3QvQW5kcm9pZC5icAorKysgYi9saWJzdGF0cy9wdWxsX3J1c3QvQW5kcm9pZC5icApAQCAtMjgsNyArMjgsNiBAQAogICAgIF0sCiAgICAgc291cmNlX3N0ZW06ICJiaW5kaW5ncyIsCiAgICAgYmluZGdlbl9mbGFnczogWwotICAgICAgICAiLS1zaXplX3QtaXMtdXNpemUiLAogICAgICAgICAiLS1hbGxvd2xpc3QtZnVuY3Rpb249QVN0YXRzRXZlbnRMaXN0X2FkZFN0YXRzRXZlbnQiLAogICAgICAgICAiLS1hbGxvd2xpc3QtZnVuY3Rpb249QVN0YXRzRXZlbnRfLioiLAogICAgICAgICAiLS1hbGxvd2xpc3QtZnVuY3Rpb249QVN0YXRzTWFuYWdlcl8uKiIsCkBAIC02MSw3ICs2MCw2IEBACiAgICAgY3JhdGVfbmFtZTogInN0YXRzcHVsbF9ydXN0IiwKICAgICBzcmNzOiBbInN0YXRzX3B1bGwucnMiXSwKICAgICBydXN0bGliczogWwotICAgICAgICAibGlibGF6eV9zdGF0aWMiLAogICAgICAgICAibGlibG9nX3J1c3QiLAogICAgICAgICAibGlic3RhdHNsb2dfcnVzdF9oZWFkZXIiLAogICAgICAgICAibGlic3RhdHNwdWxsX2JpbmRnZW4iLApkaWZmIC0tZ2l0IGEvbGlic3RhdHMvcHVsbF9ydXN0L3N0YXRzX3B1bGwucnMgYi9saWJzdGF0cy9wdWxsX3J1c3Qvc3RhdHNfcHVsbC5ycwppbmRleCAwOWIyNjIzLi4wMzkyOWUzIDEwMDY0NAotLS0gYS9saWJzdGF0cy9wdWxsX3J1c3Qvc3RhdHNfcHVsbC5ycworKysgYi9saWJzdGF0cy9wdWxsX3J1c3Qvc3RhdHNfcHVsbC5ycwpAQCAtMTQsMTMgKzE0LDEyIEBACiAKIC8vISBBIFJ1c3QgaW50ZXJmYWNlIGZvciB0aGUgU3RhdHNEIHB1bGwgQVBJLgogCi11c2UgbGF6eV9zdGF0aWM6Omxhenlfc3RhdGljOwogdXNlIHN0YXRzbG9nX3J1c3RfaGVhZGVyOjp7QXRvbXMsIFN0YXQsIFN0YXRzRXJyb3J9OwogdXNlIHN0YXRzcHVsbF9iaW5kZ2VuOjoqOwogdXNlIHN0ZDo6Y29sbGVjdGlvbnM6Okhhc2hNYXA7CiB1c2Ugc3RkOjpjb252ZXJ0OjpUcnlJbnRvOwogdXNlIHN0ZDo6b3M6OnJhdzo6Y192b2lkOwotdXNlIHN0ZDo6c3luYzo6TXV0ZXg7Cit1c2Ugc3RkOjpzeW5jOjp7TGF6eUxvY2ssIE11dGV4fTsKIAogLy8vIFRoZSByZXR1cm4gdmFsdWUgb2YgY2FsbGJhY2tzLgogcHViIHR5cGUgU3RhdHNQdWxsUmVzdWx0ID0gVmVjPEJveDxkeW4gU3RhdD4+OwpAQCAtMTA3LDExICsxMDYsMTIgQEAKICAgICB9CiB9CiAKLWxhenlfc3RhdGljISB7Ci0gICAgc3RhdGljIHJlZiBDT09LSUVTOiBNdXRleDxIYXNoTWFwPGkzMiwgZm4oKSAtPiBTdGF0c1B1bGxSZXN1bHQ+PiA9IE11dGV4OjpuZXcoSGFzaE1hcDo6bmV3KCkpOwotfQorc3RhdGljIENPT0tJRVM6IExhenlMb2NrPE11dGV4PEhhc2hNYXA8aTMyLCBmbigpIC0+IFN0YXRzUHVsbFJlc3VsdD4+PiA9CisgICAgTGF6eUxvY2s6Om5ldyh8fCBNdXRleDo6bmV3KEhhc2hNYXA6Om5ldygpKSk7CiAKLS8vIFNhZmV0eTogV2Ugc3RvcmUgb3VyIGNhbGxiYWNrcyBpbiB0aGUgZ2xvYmFsIHNvIHRoZXkgYXJlIHZhbGlkLgorLy8vICMgU2FmZXR5CisvLy8KKy8vLyBgZGF0YWAgbXVzdCBiZSBhIHZhbGlkIHBvaW50ZXIgd2l0aCBubyBhbGlhc2VzLgogdW5zYWZlIGV4dGVybiAiQyIgZm4gY2FsbGJhY2tfd3JhcHBlcigKICAgICBhdG9tX3RhZzogaTMyLAogICAgIGRhdGE6ICptdXQgQVN0YXRzRXZlbnRMaXN0LApAQCAtMTI2LDcgKzEyNiw4IEBACiAgICAgICAgICAgICAgICAgbGV0IHN0YXRzID0gY2IoKTsKICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gc3RhdHMKICAgICAgICAgICAgICAgICAgICAgLml0ZXIoKQotICAgICAgICAgICAgICAgICAgICAubWFwKHxzdGF0fCBzdGF0LmFkZF9hc3RhdHNfZXZlbnQoJm11dCAqZGF0YSkpCisgICAgICAgICAgICAgICAgICAgIC8vIFNhZmV0eTogVGhlIGNhbGxlciBwcm9taXNlcyB0aGF0IGBkYXRhYCBpcyB2YWxpZCBhbmQgdW5hbGlhc2VkLgorICAgICAgICAgICAgICAgICAgICAubWFwKHxzdGF0fCBzdGF0LmFkZF9hc3RhdHNfZXZlbnQodW5zYWZlIHsgJm11dCAqZGF0YSB9KSkKICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3Q6OjxSZXN1bHQ8VmVjPCgpPiwgU3RhdHNFcnJvcj4+KCk7CiAgICAgICAgICAgICAgICAgbWF0Y2ggcmVzdWx0IHsKICAgICAgICAgICAgICAgICAgICAgT2soXykgPT4gewpkaWZmIC0tZ2l0IGEvbGlic3RhdHMvcHVzaF9jb21wYXQvQW5kcm9pZC5icCBiL2xpYnN0YXRzL3B1c2hfY29tcGF0L0FuZHJvaWQuYnAKaW5kZXggODE5MDY2ZS4uYzVjMTkzNCAxMDA2NDQKLS0tIGEvbGlic3RhdHMvcHVzaF9jb21wYXQvQW5kcm9pZC5icAorKysgYi9saWJzdGF0cy9wdXNoX2NvbXBhdC9BbmRyb2lkLmJwCkBAIC0yNiw3ICsyNiw3IEBACiBjY19kZWZhdWx0cyB7CiAgICAgbmFtZTogImxpYnN0YXRzcHVzaF9jb21wYXRfZGVmYXVsdHMiLAogICAgIHNyY3M6IFsKLSAgICAgICAgInN0YXRzZF93cml0ZXIuYyIsCisgICAgICAgICJzdGF0c2Rfd3JpdGVyLmNwcCIsCiAgICAgICAgICJzdGF0c19ldmVudF9saXN0LmMiLAogICAgICAgICAiU3RhdHNFdmVudENvbXBhdC5jcHAiCiAgICAgXSwKZGlmZiAtLWdpdCBhL2xpYnN0YXRzL3B1c2hfY29tcGF0L3N0YXRzZF93cml0ZXIuYyBiL2xpYnN0YXRzL3B1c2hfY29tcGF0L3N0YXRzZF93cml0ZXIuY3BwCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIGxpYnN0YXRzL3B1c2hfY29tcGF0L3N0YXRzZF93cml0ZXIuYwpyZW5hbWUgdG8gbGlic3RhdHMvcHVzaF9jb21wYXQvc3RhdHNkX3dyaXRlci5jcHAKaW5kZXggNDgxOGQxMS4uYTM2MDBmMyAxMDA2NDQKLS0tIGEvbGlic3RhdHMvcHVzaF9jb21wYXQvc3RhdHNkX3dyaXRlci5jCisrKyBiL2xpYnN0YXRzL3B1c2hfY29tcGF0L3N0YXRzZF93cml0ZXIuY3BwCkBAIC0xNSw5ICsxNSw5IEBACiAgKi8KICNpbmNsdWRlICJzdGF0c2Rfd3JpdGVyLmgiCiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdGhyZWFkcy5oPgogI2luY2x1ZGUgPGN1dGlscy9mcy5oPgogI2luY2x1ZGUgPGN1dGlscy9zb2NrZXRzLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KQEAgLTEwOCw3ICsxMDgsNyBAQAogICAgICAgICAgICAgICAgICAgICBjYXNlIC1FQ09OTlJFRlVTRUQ6CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgLUVOT0VOVDoKICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBhdG9taWNfZXhjaGFuZ2UoJnN0YXRzZExvZ2dlcldyaXRlLnNvY2ssIHJldCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEZBTExUSFJVICovCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KQEAgLTE4OCw3ICsxODgsNyBAQAogICAgICAqICB9OwogICAgICAqLwogCi0gICAgaGVhZGVyLnRpZCA9IGdldHRpZCgpOworICAgIGhlYWRlci50aWQgPSBhbmRyb2lkOjpiYXNlOjpHZXRUaHJlYWRJZCgpOwogICAgIGhlYWRlci5yZWFsdGltZS50dl9zZWMgPSB0cy0+dHZfc2VjOwogICAgIGhlYWRlci5yZWFsdGltZS50dl9uc2VjID0gdHMtPnR2X25zZWM7CiAKQEAgLTI3Miw3ICsyNzIsNyBAQAogICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKICAgICAgICAgICAgICAgICByZXQgPSAtZXJybm87CiAgICAgICAgICAgICB9Ci0gICAgICAgIC8qIEZBTExUSFJVICovCisgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KZGlmZiAtLWdpdCBhL2xpYnN0YXRzL3B1c2hfY29tcGF0L3N0YXRzZF93cml0ZXIuaCBiL2xpYnN0YXRzL3B1c2hfY29tcGF0L3N0YXRzZF93cml0ZXIuaAppbmRleCBmZTJkMzdjLi5mMDMwYjk2IDEwMDY0NAotLS0gYS9saWJzdGF0cy9wdXNoX2NvbXBhdC9zdGF0c2Rfd3JpdGVyLmgKKysrIGIvbGlic3RhdHMvcHVzaF9jb21wYXQvc3RhdHNkX3dyaXRlci5oCkBAIC0yMSw2ICsyMSw4IEBACiAjaW5jbHVkZSA8c3RkYXRvbWljLmg+CiAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgogCitfX0JFR0lOX0RFQ0xTCisKIC8qKgogICogSW50ZXJuYWwgbG9jayBzaG91bGQgbm90IGJlIGV4cG9zZWQuIFRoaXMgaXMgYmFkIGRlc2lnbi4KICAqIFRPRE86IHJld3JpdGUgaXQgaW4gYysrIGNvZGUgYW5kIGVuY2Fwc3VsYXRlIHRoZSBmdW5jdGlvbmFsaXR5IGluIGEKQEAgLTQyLDQgKzQ0LDYgQEAKICAgICB2b2lkICgqbm90ZURyb3ApKGludCBlcnJvciwgaW50IHRhZyk7CiB9OwogCitfX0VORF9ERUNMUworCiAjZW5kaWYgIC8vIEFORFJPSURfU1RBVFNfTE9HX1NUQVRTX1dSSVRFUl9ICmRpZmYgLS1naXQgYS9saWJzdGF0cy9zb2NrZXRfbGF6eS9BbmRyb2lkLmJwIGIvbGlic3RhdHMvc29ja2V0X2xhenkvQW5kcm9pZC5icAppbmRleCBiMmNkN2IyLi45NDVhN2M0IDEwMDY0NAotLS0gYS9saWJzdGF0cy9zb2NrZXRfbGF6eS9BbmRyb2lkLmJwCisrKyBiL2xpYnN0YXRzL3NvY2tldF9sYXp5L0FuZHJvaWQuYnAKQEAgLTcsNiArNywxMiBAQAogCiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYnN0YXRzc29ja2V0X2xhenkiLAorICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJzdGF0c3NvY2tldF9oZWFkZXJzIiwKICAgICBdLApAQCAtMjgsNyArMzQsOSBAQAogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKLSAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiLCAibXRzLXN0YXRzZCJdLAorICAgIHRlc3Rfc3VpdGVzOiBbCisgICAgICAgICJkZXZpY2UtdGVzdHMiLAorICAgIF0sCiAgICAgdGVzdF9jb25maWc6ICJsaWJzdGF0c3NvY2tldF9sYXp5X3Rlc3QueG1sIiwKICAgICAvLyBUT0RPKGIvMTUzNTg4OTkwKTogUmVtb3ZlIHdoZW4gdGhlIGJ1aWxkIHN5c3RlbSBwcm9wZXJseSBzZXBhcmF0ZXMuCiAgICAgLy8gMzJiaXQgYW5kIDY0Yml0IGFyY2hpdGVjdHVyZXMuCmRpZmYgLS1naXQgYS9pbml0L2hvc3RfaW5pdF92ZXJpZmllci5oIGIvbGlic3RhdHMvc29ja2V0X2xhenkvaW5jbHVkZS9zdGF0c3NvY2tldF9sYXp5LmgKc2ltaWxhcml0eSBpbmRleCA2MyUKY29weSBmcm9tIGluaXQvaG9zdF9pbml0X3ZlcmlmaWVyLmgKY29weSB0byBsaWJzdGF0cy9zb2NrZXRfbGF6eS9pbmNsdWRlL3N0YXRzc29ja2V0X2xhenkuaAppbmRleCA1ZDI0ZjJhLi43ZGRhMGJhIDEwMDY0NAotLS0gYS9pbml0L2hvc3RfaW5pdF92ZXJpZmllci5oCisrKyBiL2xpYnN0YXRzL3NvY2tldF9sYXp5L2luY2x1ZGUvc3RhdHNzb2NrZXRfbGF6eS5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTYsMTIgKzE2LDEwIEBACiAKICNwcmFnbWEgb25jZQogCi0jaW5jbHVkZSA8cHJvcGVydHlfaW5mb19wYXJzZXIvcHJvcGVydHlfaW5mb19wYXJzZXIuaD4KK25hbWVzcGFjZSBhbmRyb2lkOjpzdGF0c3NvY2tldDo6bGF6eSB7CiAKLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBpbml0IHsKKy8vIFNlZSBpZiBsaWJzdGF0c3NvY2tldC5zbyBpcyBhdmFpbGFibGUuIEVhcmx5IHByb2Nlc3NlcyByZWx5aW5nIG9uIF9sYXp5IG1pZ2h0IG5vdCBoYXZlIGFjY2VzcworLy8gdG8gbGlic3RhdHNzb2NrZXQuc28gd2hlbiB0aGV5IHN0YXJ0IGJlZm9yZSB0aGUgU3RhdHNEIEFQRVggaXMgYXZhaWxhYmxlLgorYm9vbCBJc0F2YWlsYWJsZSgpOwogCi1leHRlcm4gY29uc3QgYW5kcm9pZDo6cHJvcGVydGllczo6UHJvcGVydHlJbmZvQXJlYSogcHJvcGVydHlfaW5mb19hcmVhOwotCi19ICAvLyBuYW1lc3BhY2UgaW5pdAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkOjpzdGF0c3NvY2tldDo6bGF6eQpkaWZmIC0tZ2l0IGEvbGlic3RhdHMvc29ja2V0X2xhenkvbGlic3RhdHNzb2NrZXRfbGF6eS5jcHAgYi9saWJzdGF0cy9zb2NrZXRfbGF6eS9saWJzdGF0c3NvY2tldF9sYXp5LmNwcAppbmRleCBkZDkzZWViLi5kOTA3YzdlIDEwMDY0NAotLS0gYS9saWJzdGF0cy9zb2NrZXRfbGF6eS9saWJzdGF0c3NvY2tldF9sYXp5LmNwcAorKysgYi9saWJzdGF0cy9zb2NrZXRfbGF6eS9saWJzdGF0c3NvY2tldF9sYXp5LmNwcApAQCAtMjMsOCArMjMsMTAgQEAKIAogI2luY2x1ZGUgImxvZy9sb2cuaCIKIAotI2luY2x1ZGUgInN0YXRzX2V2ZW50LmgiCi0jaW5jbHVkZSAic3RhdHNfc29ja2V0LmgiCisjaW5jbHVkZSA8c3RhdHNfZXZlbnQuaD4KKyNpbmNsdWRlIDxzdGF0c19zb2NrZXQuaD4KKworI2luY2x1ZGUgInN0YXRzc29ja2V0X2xhenkuaCIKIAogLy8gVGhpcyBmaWxlIHByb3ZpZGVzIGEgbGF6eSBpbnRlcmZhY2UgdG8gbGlic3RhdHNzb2NrZXQuc28gdG8gYWRkcmVzcyBlYXJseSBib290IGRlcGVuZGVuY2llcy4KIC8vIFNwZWNpZmljYWxseSBib290YW5pbWF0aW9uLCBzdXJmYWNlZmxpbmdlciwgYW5kIGxta2QgcnVuIGJlZm9yZSB0aGUgc3RhdHNkIEFQRVggaXMgbG9hZGVkIGFuZApAQCAtNDUsNiArNDcsNyBAQAogICAgIGtfQVN0YXRzRXZlbnRfd3JpdGVCb29sLAogICAgIGtfQVN0YXRzRXZlbnRfd3JpdGVCeXRlQXJyYXksCiAgICAga19BU3RhdHNFdmVudF93cml0ZVN0cmluZywKKyAgICBrX0FTdGF0c0V2ZW50X3dyaXRlU3RyaW5nQXJyYXksCiAgICAga19BU3RhdHNFdmVudF93cml0ZUF0dHJpYnV0aW9uQ2hhaW4sCiAgICAga19BU3RhdHNFdmVudF9hZGRCb29sQW5ub3RhdGlvbiwKICAgICBrX0FTdGF0c0V2ZW50X2FkZEludDMyQW5ub3RhdGlvbiwKQEAgLTc2LDYgKzc5LDEzIEBACiAgICAgcmV0dXJuIGRsb3BlbigibGlic3RhdHNzb2NrZXQuc28iLCBkbG9wZW5fZmxhZ3MpOwogfQogCituYW1lc3BhY2UgYW5kcm9pZDo6c3RhdHNzb2NrZXQ6OmxhenkgeworYm9vbCBJc0F2YWlsYWJsZSgpIHsKKyAgICBzdGF0aWMgY29uc3Qgdm9pZCogaGFuZGxlID0gTG9hZExpYnN0YXRzc29ja2V0KFJUTERfTk9XKTsKKyAgICByZXR1cm4gaGFuZGxlICE9IG51bGxwdHI7Cit9Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZDo6c3RhdHNzb2NrZXQ6OmxhenkKKwogLy8KIC8vIEluaXRpYWxpemF0aW9uIGFuZCBzeW1ib2wgYmluZGluZy4KIApAQCAtMTA0LDYgKzExNCw3IEBACiAgICAgQklORF9TWU1CT0woQVN0YXRzRXZlbnRfd3JpdGVCb29sKTsKICAgICBCSU5EX1NZTUJPTChBU3RhdHNFdmVudF93cml0ZUJ5dGVBcnJheSk7CiAgICAgQklORF9TWU1CT0woQVN0YXRzRXZlbnRfd3JpdGVTdHJpbmcpOworICAgIEJJTkRfU1lNQk9MKEFTdGF0c0V2ZW50X3dyaXRlU3RyaW5nQXJyYXkpOwogICAgIEJJTkRfU1lNQk9MKEFTdGF0c0V2ZW50X3dyaXRlQXR0cmlidXRpb25DaGFpbik7CiAgICAgQklORF9TWU1CT0woQVN0YXRzRXZlbnRfYWRkQm9vbEFubm90YXRpb24pOwogICAgIEJJTkRfU1lNQk9MKEFTdGF0c0V2ZW50X2FkZEludDMyQW5ub3RhdGlvbik7CkBAIC0xNzksNiArMTkwLDExIEBACiAgICAgSU5WT0tFX01FVEhPRChBU3RhdHNFdmVudF93cml0ZVN0cmluZywgZXZlbnQsIHZhbHVlKTsKIH0KIAordm9pZCBBU3RhdHNFdmVudF93cml0ZVN0cmluZ0FycmF5KEFTdGF0c0V2ZW50KiBldmVudCwgY29uc3QgY2hhciogY29uc3QqIGVsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1FbGVtZW50cykgeworICAgIElOVk9LRV9NRVRIT0QoQVN0YXRzRXZlbnRfd3JpdGVTdHJpbmdBcnJheSwgZXZlbnQsIGVsZW1lbnRzLCBudW1FbGVtZW50cyk7Cit9CisKIHZvaWQgQVN0YXRzRXZlbnRfd3JpdGVBdHRyaWJ1dGlvbkNoYWluKEFTdGF0c0V2ZW50KiBldmVudCwgY29uc3QgdWludDMyX3QqIHVpZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb25zdCogdGFncywgdWludDhfdCBudW1Ob2RlcykgewogICAgIElOVk9LRV9NRVRIT0QoQVN0YXRzRXZlbnRfd3JpdGVBdHRyaWJ1dGlvbkNoYWluLCBldmVudCwgdWlkcywgdGFncywgbnVtTm9kZXMpOwpAQCAtMTk4LDQgKzIxNCw0IEBACiAKIHZvaWQgQVN0YXRzU29ja2V0X2Nsb3NlKCkgewogICAgIElOVk9LRV9NRVRIT0QoQVN0YXRzU29ja2V0X2Nsb3NlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9saWJzdGF0cy9zb2NrZXRfbGF6eS90ZXN0cy9saWJzdGF0c3NvY2tldF9sYXp5X3Rlc3QuY3BwIGIvbGlic3RhdHMvc29ja2V0X2xhenkvdGVzdHMvbGlic3RhdHNzb2NrZXRfbGF6eV90ZXN0LmNwcAppbmRleCBmZTEzNTk4Li43MzNmMWU0IDEwMDY0NAotLS0gYS9saWJzdGF0cy9zb2NrZXRfbGF6eS90ZXN0cy9saWJzdGF0c3NvY2tldF9sYXp5X3Rlc3QuY3BwCisrKyBiL2xpYnN0YXRzL3NvY2tldF9sYXp5L3Rlc3RzL2xpYnN0YXRzc29ja2V0X2xhenlfdGVzdC5jcHAKQEAgLTIxLDYgKzIxLDggQEAKICNpbmNsdWRlICJzdGF0c19ldmVudC5oIgogI2luY2x1ZGUgInN0YXRzX3NvY2tldC5oIgogCisjaW5jbHVkZSAic3RhdHNzb2NrZXRfbGF6eS5oIgorCiAvLyBUaGUgdGVzdHMgaGVyZSBhcmUganVzdCBmb3IgdGhlIGNhc2Ugd2hlbiBsaWJzdGF0c3NvY2tldC5zbyBjYW5ub3QgYmUgbG9hZGVkIGJ5CiAvLyBsaWJzdGF0c3NvY2tldF9sYXp5LgogY2xhc3MgTGlic3RhdHNzb2NrZXRMYXp5VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewpAQCAtNDcsNiArNDksNyBAQAogICAgIEVYUEVDVF9ERUFUSChBU3RhdHNFdmVudF93cml0ZUJvb2woZXZlbnQsIGZhbHNlKSwga0xvYWRGYWlsZWQpOwogICAgIEVYUEVDVF9ERUFUSChBU3RhdHNFdmVudF93cml0ZUJ5dGVBcnJheShldmVudCwgTlVMTCwgMCksIGtMb2FkRmFpbGVkKTsKICAgICBFWFBFQ1RfREVBVEgoQVN0YXRzRXZlbnRfd3JpdGVTdHJpbmcoZXZlbnQsIE5VTEwpLCBrTG9hZEZhaWxlZCk7CisgICAgRVhQRUNUX0RFQVRIKEFTdGF0c0V2ZW50X3dyaXRlU3RyaW5nQXJyYXkoZXZlbnQsIE5VTEwsIDApLCBrTG9hZEZhaWxlZCk7CiAgICAgRVhQRUNUX0RFQVRIKEFTdGF0c0V2ZW50X3dyaXRlQXR0cmlidXRpb25DaGFpbihldmVudCwgTlVMTCwgTlVMTCwgMCksIGtMb2FkRmFpbGVkKTsKIAogICAgIEVYUEVDVF9ERUFUSChBU3RhdHNFdmVudF9hZGRCb29sQW5ub3RhdGlvbihldmVudCwgMCwgZmFsc2UpLCBrTG9hZEZhaWxlZCk7CkBAIC01NSw0ICs1OCw4IEBACiAKIFRFU1RfRihMaWJzdGF0c3NvY2tldExhenlUZXN0LCBOb0xpYnN0YXRzc29ja2V0Rm9yU3RhdHNTb2NrZXQpIHsKICAgICBFWFBFQ1RfREVBVEgoQVN0YXRzU29ja2V0X2Nsb3NlKCksIGtMb2FkRmFpbGVkKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CisKK1RFU1RfRihMaWJzdGF0c3NvY2tldExhenlUZXN0LCBJc0F2YWlsYWJsZUZhbHNlKSB7CisgICAgRVhQRUNUX0ZBTFNFKGFuZHJvaWQ6OnN0YXRzc29ja2V0OjpsYXp5OjpJc0F2YWlsYWJsZSgpKTsKK30KZGlmZiAtLWdpdCBhL2xpYnN5bmMvQW5kcm9pZC5icCBiL2xpYnN5bmMvQW5kcm9pZC5icAppbmRleCBiNmI0YTZlLi45OWM4OGNmIDEwMDY0NAotLS0gYS9saWJzeW5jL0FuZHJvaWQuYnAKKysrIGIvbGlic3luYy9BbmRyb2lkLmJwCkBAIC0yNyw5ICsyNyw2IEBACiAgICAgbmFtZTogImxpYnN5bmMiLAogICAgIHN5bWJvbF9maWxlOiAibGlic3luYy5tYXAudHh0IiwKICAgICBmaXJzdF92ZXJzaW9uOiAiMjYiLAotICAgIGV4cG9ydF9oZWFkZXJfbGliczogWwotICAgICAgICAibGlic3luY19oZWFkZXJzIiwKLSAgICBdLAogfQogCiBjY19kZWZhdWx0cyB7CmRpZmYgLS1naXQgYS9saWJzeXN1dGlscy9BbmRyb2lkLmJwIGIvbGlic3lzdXRpbHMvQW5kcm9pZC5icAppbmRleCA1ZjQ3MmIyLi44NDJkYjQwIDEwMDY0NAotLS0gYS9saWJzeXN1dGlscy9BbmRyb2lkLmJwCisrKyBiL2xpYnN5c3V0aWxzL0FuZHJvaWQuYnAKQEAgLTUsOSArNSw2IEBACiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlic3lzdXRpbHMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgdm5kazogewotICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgIH0sCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJzcmMvU29ja2V0TGlzdGVuZXIuY3BwIiwKQEAgLTI5LDYgKzI2LDEwIEBACiAgICAgICAgICJsaWJsb2ciLAogICAgIF0sCiAKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAiYnBmX2hlYWRlcnMiLAorICAgIF0sCisKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKIAogICAgIHRpZHk6IHRydWUsCmRpZmYgLS1naXQgYS9saWJzeXN1dGlscy9pbmNsdWRlL3N5c3V0aWxzL1NvY2tldExpc3RlbmVyLmggYi9saWJzeXN1dGlscy9pbmNsdWRlL3N5c3V0aWxzL1NvY2tldExpc3RlbmVyLmgKaW5kZXggNjdhNjkxYS4uYTdmZDA5ZSAxMDA2NDQKLS0tIGEvbGlic3lzdXRpbHMvaW5jbHVkZS9zeXN1dGlscy9Tb2NrZXRMaXN0ZW5lci5oCisrKyBiL2xpYnN5c3V0aWxzL2luY2x1ZGUvc3lzdXRpbHMvU29ja2V0TGlzdGVuZXIuaApAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPHB0aHJlYWQuaD4KIAogI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSA8c3lzdXRpbHMvU29ja2V0Q2xpZW50Lmg+CiAjaW5jbHVkZSAiU29ja2V0Q2xpZW50Q29tbWFuZC5oIgpkaWZmIC0tZ2l0IGEvbGlic3lzdXRpbHMvc3JjL05ldGxpbmtFdmVudC5jcHAgYi9saWJzeXN1dGlscy9zcmMvTmV0bGlua0V2ZW50LmNwcAppbmRleCA1MTVjYzEwLi41NWJiZTQ2IDEwMDY0NAotLS0gYS9saWJzeXN1dGlscy9zcmMvTmV0bGlua0V2ZW50LmNwcAorKysgYi9saWJzeXN1dGlscy9zcmMvTmV0bGlua0V2ZW50LmNwcApAQCAtMzcsMTAgKzM3LDEyIEBACiAjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wYXJzZWludC5oPgorI2luY2x1ZGUgPGJwZi9LZXJuZWxVdGlscy5oPgogI2luY2x1ZGUgPGxvZy9sb2cuaD4KICNpbmNsdWRlIDxzeXN1dGlscy9OZXRsaW5rRXZlbnQuaD4KIAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6UGFyc2VJbnQ7Cit1c2luZyBhbmRyb2lkOjpicGY6OmlzS2VybmVsNjRCaXQ7CiAKIC8qIEZyb20ga2VybmVsJ3MgbmV0L25ldGZpbHRlci94dF9xdW90YTIuYyAqLwogY29uc3QgaW50IExPQ0FMX1FMT0dfTkxfRVZFTlQgPSAxMTI7CkBAIC0xMzgsNjAgKzE0MCw2IEBACiBzdGF0aWNfYXNzZXJ0KHNpemVvZih1bG9nX3BhY2tldF9tc2czMl90KSA9PSAxNjgpOwogc3RhdGljX2Fzc2VydChzaXplb2YodWxvZ19wYWNrZXRfbXNnNjRfdCkgPT0gMTkyKTsKIAotLy8gRmlndXJlIG91dCB0aGUgYml0bmVzcyBvZiB1c2Vyc3BhY2UuCi0vLyBUcml2aWFsIGFuZCBrbm93biBhdCBjb21waWxlIHRpbWUuCi1zdGF0aWMgYm9vbCBpc1VzZXJzcGFjZTY0Yml0KHZvaWQpIHsKLSAgICByZXR1cm4gc2l6ZW9mKGxvbmcpID09IDg7Ci19Ci0KLS8vIEZpZ3VyZSBvdXQgdGhlIGJpdG5lc3Mgb2YgdGhlIGtlcm5lbC4KLXN0YXRpYyBib29sIGlzS2VybmVsNjRCaXQodm9pZCkgewotICAgIC8vIGEgNjQtYml0IHVzZXJzcGFjZSByZXF1aXJlcyBhIDY0LWJpdCBrZXJuZWwKLSAgICBpZiAoaXNVc2Vyc3BhY2U2NGJpdCgpKSByZXR1cm4gdHJ1ZTsKLQotICAgIHN0YXRpYyBib29sIGluaXQgPSBmYWxzZTsKLSAgICBzdGF0aWMgYm9vbCBjYWNoZSA9IGZhbHNlOwotICAgIGlmIChpbml0KSByZXR1cm4gY2FjaGU7Ci0KLSAgICAvLyBSZXRyaWV2ZSBjdXJyZW50IHBlcnNvbmFsaXR5IC0gb24gTGludXggdGhpcyBzeXN0ZW0gY2FsbCAqY2Fubm90KiBmYWlsLgotICAgIGludCBwID0gcGVyc29uYWxpdHkoMHhmZmZmZmZmZik7Ci0gICAgLy8gQnV0IGlmIGl0IGRvZXMganVzdCBhc3N1bWUga2VybmVsIGFuZCB1c2Vyc3BhY2UgKHdoaWNoIGlzIDMyLWJpdCkgbWF0Y2guLi4KLSAgICBpZiAocCA9PSAtMSkgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gVGhpcyB3aWxsIGVmZmVjdGl2ZWx5IG1hc2sgb3V0IHRoZSBib3R0b20gOCBiaXRzLCBhbmQgc3dpdGNoIHRvICduYXRpdmUnCi0gICAgLy8gcGVyc29uYWxpdHksIGFuZCB0aGVuIHJldHVybiB0aGUgcHJldmlvdXMgcGVyc29uYWxpdHkgb2YgdGhpcyB0aHJlYWQKLSAgICAvLyAobGlrZWx5IFBFUl9MSU5VWCBvciBQRVJfTElOVVgzMikgd2l0aCBhbnkgZXh0cmEgb3B0aW9ucyB1bm1vZGlmaWVkLgotICAgIGludCBxID0gcGVyc29uYWxpdHkoKHAgJiB+UEVSX01BU0spIHwgUEVSX0xJTlVYKTsKLSAgICAvLyBQZXIgbWFuIHBhZ2UgdGhpcyB0aGVvcmV0aWNhbGx5IGNvdWxkIGVycm9yIG91dCB3aXRoIEVJTlZBTCwKLSAgICAvLyBidXQga2VybmVsIGNvZGUgYW5hbHlzaXMgc3VnZ2VzdHMgc2V0dGluZyBQRVJfTElOVVggY2Fubm90IGZhaWwuCi0gICAgLy8gRWl0aGVyIHdheSwgYXNzdW1lIGtlcm5lbCBhbmQgdXNlcnNwYWNlICh3aGljaCBpcyAzMi1iaXQpIG1hdGNoLi4uCi0gICAgaWYgKHEgIT0gcCkgcmV0dXJuIGZhbHNlOwotCi0gICAgc3RydWN0IHV0c25hbWUgdTsKLSAgICAodm9pZCl1bmFtZSgmdSk7ICAvLyBvbmx5IHBvc3NpYmxlIGZhaWx1cmUgaXMgRUZBVUxULCBidXQgdSBpcyBvbiBzdGFjay4KLQotICAgIC8vIFN3aXRjaCBiYWNrIHRvIHByZXZpb3VzIHBlcnNvbmFsaXR5LgotICAgIC8vIFRoZW9yZXRpY2FsbHkgY291bGQgZmFpbCB3aXRoIEVJTlZBTCBvbiBhcm02NCB3aXRoIG5vIDMyLWJpdCBzdXBwb3J0LAotICAgIC8vIGJ1dCB0aGVuIHdlIHdvdWxkbid0IGhhdmUgZmV0Y2hlZCAncCcgZnJvbSB0aGUga2VybmVsIGluIHRoZSBmaXJzdCBwbGFjZS4KLSAgICAvLyBFaXRoZXIgd2F5IHRoZXJlJ3Mgbm90aGluZyBtZWFuaW5ndWwgd2UgY2FuIGRvIGluIGNhc2Ugb2YgZXJyb3IuCi0gICAgLy8gU2luY2UgUEVSX0xJTlVYMzIgdnMgUEVSX0xJTlVYIG9ubHkgYWZmZWN0cyB1bmFtZS5tYWNoaW5lIGl0IGRvZXNuJ3QKLSAgICAvLyByZWFsbHkgaHVydCB1cyBlaXRoZXIuICBXZSdyZSByZWFsbHkganVzdCBzd2l0Y2hpbmcgYmFjayB0byBiZSAnY2xlYW4nLgotICAgICh2b2lkKXBlcnNvbmFsaXR5KHApOwotCi0gICAgLy8gUG9zc2libGUgdmFsdWVzIG9mIHV0c25hbWUubWFjaGluZSBvYnNlcnZlZCBvbiB4ODZfNjQgZGVza3RvcCAoYXJtIHZpYSBxZW11KToKLSAgICAvLyAgIHg4Nl82NCBpNjg2IGFhcmNoNjQgYXJtdjdsCi0gICAgLy8gYWRkaXRpb25hbGx5IG9ic2VydmVkIG9uIGFybSBkZXZpY2U6Ci0gICAgLy8gICBhcm12OGwKLSAgICAvLyBwcmVzdW1hYmx5IGFsc28gbWlnaHQganVzdCBiZSBwb3NzaWJsZToKLSAgICAvLyAgIGkzODYgaTQ4NiBpNTg2Ci0gICAgLy8gYW5kIHRoZXJlIG1pZ2h0IGJlIG90aGVyIHdlaXJkIGFybTMyIGNhc2VzLgotICAgIC8vIFdlIG5vdGUgdGhhdCB0aGUgNjQgaXMgcHJlc2VudCBpbiBib3RoIDY0LWJpdCBhcmNocywKLSAgICAvLyBhbmQgaW4gZ2VuZXJhbCBpcyBsaWtlbHkgdG8gYmUgcHJlc2VudCBpbiBvbmx5IDY0LWJpdCBhcmNocy4KLSAgICBjYWNoZSA9ICEhc3Ryc3RyKHUubWFjaGluZSwgIjY0Iik7Ci0gICAgaW5pdCA9IHRydWU7Ci0gICAgcmV0dXJuIGNhY2hlOwotfQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBOZXRsaW5rRXZlbnQ6Ok5ldGxpbmtFdmVudCgpIHsKQEAgLTIwMiwxNSArMTUwLDEwIEBACiB9CiAKIE5ldGxpbmtFdmVudDo6fk5ldGxpbmtFdmVudCgpIHsKLSAgICBpbnQgaTsKLSAgICBpZiAobVBhdGgpCi0gICAgICAgIGZyZWUobVBhdGgpOwotICAgIGlmIChtU3Vic3lzdGVtKQotICAgICAgICBmcmVlKG1TdWJzeXN0ZW0pOwotICAgIGZvciAoaSA9IDA7IGkgPCBOTF9QQVJBTVNfTUFYOyBpKyspIHsKLSAgICAgICAgaWYgKCFtUGFyYW1zW2ldKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGZyZWUobVBhcmFtc1tpXSk7CisgICAgZnJlZShtUGF0aCk7CisgICAgZnJlZShtU3Vic3lzdGVtKTsKKyAgICBmb3IgKGF1dG8gcGFyYW0gOiBtUGFyYW1zKSB7CisgICAgICAgIGZyZWUocGFyYW0pOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbGlidXNiaG9zdC9BbmRyb2lkLmJwIGIvbGlidXNiaG9zdC9BbmRyb2lkLmJwCmluZGV4IDlhZTczZDAuLmY4YTczYWQgMTAwNjQ0Ci0tLSBhL2xpYnVzYmhvc3QvQW5kcm9pZC5icAorKysgYi9saWJ1c2Job3N0L0FuZHJvaWQuYnAKQEAgLTIxLDkgKzIxLDYgQEAKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJ1c2Job3N0IiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICB9LAogICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogICAgIHNyY3M6IFsidXNiaG9zdC5jIl0sCiAgICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKZGlmZiAtLWdpdCBhL2xpYnV0aWxzL0FuZHJvaWQuYnAgYi9saWJ1dGlscy9BbmRyb2lkLmJwCmluZGV4IDE2MmYwZjQuLjMwNWNiZjAgMTAwNjQ0Ci0tLSBhL2xpYnV0aWxzL0FuZHJvaWQuYnAKKysrIGIvbGlidXRpbHMvQW5kcm9pZC5icApAQCAtMzMsMTQgKzMzLDEyIEBACiAgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAogICAgICAgICAibGliY3V0aWxzX2hlYWRlcnMiLAogICAgICAgICAibGlibG9nX2hlYWRlcnMiLAotICAgICAgICAibGlicHJvY2Vzc2dyb3VwX2hlYWRlcnMiLAogICAgICAgICAibGlic3lzdGVtX2hlYWRlcnMiLAogICAgIF0sCiAgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWwogICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKICAgICAgICAgImxpYmN1dGlsc19oZWFkZXJzIiwKICAgICAgICAgImxpYmxvZ19oZWFkZXJzIiwKLSAgICAgICAgImxpYnByb2Nlc3Nncm91cF9oZWFkZXJzIiwKICAgICAgICAgImxpYnN5c3RlbV9oZWFkZXJzIiwKICAgICBdLAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLApAQCAtNTYsNyArNTQsNyBAQAogfQogCiBjY19kZWZhdWx0cyB7Ci0gICAgbmFtZTogImxpYnV0aWxzX2RlZmF1bHRzIiwKKyAgICBuYW1lOiAibGlidXRpbHNfZGVmYXVsdHNfbm9kZXBzIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIHByb2R1Y3RfYXZhaWxhYmxlOiB0cnVlLAogICAgIHJlY292ZXJ5X2F2YWlsYWJsZTogdHJ1ZSwKQEAgLTY4LDE4ICs2Niw3IEBACiAgICAgICAgICItV25vLWV4aXQtdGltZS1kZXN0cnVjdG9ycyIsCiAgICAgICAgICItREFORFJPSURfVVRJTFNfUkVGX0JBU0VfRElTQUJMRV9JTVBMSUNJVF9DT05TVFJVQ1RJT04iLAogICAgIF0sCi0gICAgaGVhZGVyX2xpYnM6IFsKLSAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCi0gICAgICAgICJsaWJ1dGlsc19oZWFkZXJzIiwKLSAgICBdLAotICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKLSAgICAgICAgImxpYnV0aWxzX2hlYWRlcnMiLAotICAgIF0sCiAKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKICAgICBzYW5pdGl6ZTogewogICAgICAgICBtaXNjX3VuZGVmaW5lZDogWyJpbnRlZ2VyIl0sCiAgICAgfSwKQEAgLTEyMCwxMSArMTA3LDIzIEBACiAgICAgICAgIH0sCiAgICAgfSwKICAgICBmdXp6X2NvbmZpZzogewotICAgICAgIGNjOiBbInNtb3JlbGFuZEBnb29nbGUuY29tIl0sCisgICAgICAgIGNjOiBbInNtb3JlbGFuZEBnb29nbGUuY29tIl0sCiAgICAgfSwKIH0KIAogY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJ1dGlsc19kZWZhdWx0cyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYnV0aWxzX2RlZmF1bHRzX25vZGVwcyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorfQorCitjY19kZWZhdWx0cyB7CiAgICAgbmFtZTogImxpYnV0aWxzX2ltcGxfZGVmYXVsdHMiLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJsaWJ1dGlsc19kZWZhdWx0cyIsCkBAIC0xMzIsMjUgKzEzMSwyNyBAQAogICAgIF0sCiAgICAgbmF0aXZlX2JyaWRnZV9zdXBwb3J0ZWQ6IHRydWUsCiAKKyAgICB3aG9sZV9zdGF0aWNfbGliczogWyJsaWJ1dGlsc19iaW5kZXIiXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAorICAgICAgICAibGlidXRpbHNfaGVhZGVycyIsCisgICAgXSwKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJ1dGlsc19oZWFkZXJzIiwKKyAgICBdLAorCiAgICAgc3JjczogWwotICAgICAgICAiRXJyb3JzLmNwcCIsCiAgICAgICAgICJGaWxlTWFwLmNwcCIsCiAgICAgICAgICJKZW5raW5zSGFzaC5jcHAiLAogICAgICAgICAiTGlnaHRSZWZCYXNlLmNwcCIsCiAgICAgICAgICJOYXRpdmVIYW5kbGUuY3BwIiwKICAgICAgICAgIlByaW50ZXIuY3BwIiwKLSAgICAgICAgIlJlZkJhc2UuY3BwIiwKLSAgICAgICAgIlNoYXJlZEJ1ZmZlci5jcHAiLAogICAgICAgICAiU3RvcFdhdGNoLmNwcCIsCi0gICAgICAgICJTdHJpbmc4LmNwcCIsCi0gICAgICAgICJTdHJpbmcxNi5jcHAiLAotICAgICAgICAiU3Ryb25nUG9pbnRlci5jcHAiLAogICAgICAgICAiU3lzdGVtQ2xvY2suY3BwIiwKICAgICAgICAgIlRocmVhZHMuY3BwIiwKICAgICAgICAgIlRpbWVycy5jcHAiLAogICAgICAgICAiVG9rZW5pemVyLmNwcCIsCi0gICAgICAgICJVbmljb2RlLmNwcCIsCi0gICAgICAgICJWZWN0b3JJbXBsLmNwcCIsCiAgICAgICAgICJtaXNjLmNwcCIsCiAgICAgXSwKIApAQCAtMTgwLDE1ICsxODEsMjUgQEAKICAgICBuYW1lOiAibGlidXRpbHMiLAogICAgIGRlZmF1bHRzOiBbImxpYnV0aWxzX2ltcGxfZGVmYXVsdHMiXSwKIAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICAgICAgc3VwcG9ydF9zeXN0ZW1fcHJvY2VzczogdHJ1ZSwKLSAgICB9LAorICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKIAotICAgIGhlYWRlcl9hYmlfY2hlY2tlcjogewotICAgICAgICAvLyBBRkRPIGFmZmVjdHMgd2VhayBzeW1ib2xzLgotICAgICAgICBkaWZmX2ZsYWdzOiBbIi1hbGxvdy1hZGRpbmctcmVtb3Zpbmctd2Vhay1zeW1ib2xzIl0sCi0gICAgICAgIHJlZl9kdW1wX2RpcnM6IFsiYWJpLWR1bXBzIl0sCisgICAgdGFyZ2V0OiB7CisgICAgICAgIHByb2R1Y3Q6IHsKKyAgICAgICAgICAgIGhlYWRlcl9hYmlfY2hlY2tlcjogeworICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgICAgICAgICAgICAgLy8gQUZETyBhZmZlY3RzIHdlYWsgc3ltYm9scy4KKyAgICAgICAgICAgICAgICBkaWZmX2ZsYWdzOiBbIi1hbGxvdy1hZGRpbmctcmVtb3Zpbmctd2Vhay1zeW1ib2xzIl0sCisgICAgICAgICAgICAgICAgcmVmX2R1bXBfZGlyczogWyJhYmktZHVtcHMiXSwKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgICAgIHZlbmRvcjogeworICAgICAgICAgICAgaGVhZGVyX2FiaV9jaGVja2VyOiB7CisgICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICAgICAgICAgICAgICAvLyBBRkRPIGFmZmVjdHMgd2VhayBzeW1ib2xzLgorICAgICAgICAgICAgICAgIGRpZmZfZmxhZ3M6IFsiLWFsbG93LWFkZGluZy1yZW1vdmluZy13ZWFrLXN5bWJvbHMiXSwKKyAgICAgICAgICAgICAgICByZWZfZHVtcF9kaXJzOiBbImFiaS1kdW1wcyJdLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKICAgICB9LAogfQogCkBAIC0xOTcsNyArMjA4LDcgQEAKICAgICBkZWZhdWx0czogWyJsaWJ1dGlsc19pbXBsX2RlZmF1bHRzIl0sCiAKICAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1EQ0FMTFNUQUNLUz0xIiwKKyAgICAgICAgIi1EREVCVUdfQ0FMTEJBQ0tTPTEiLAogICAgICAgICAiLURERUJVR19QT0xMX0FORF9XQUtFPTEiLAogICAgICAgICAiLURERUJVR19SRUZTPTEiLAogICAgICAgICAiLURERUJVR19UT0tFTklaRVI9MSIsCkBAIC0yMTIsMTAgKzIyMywxNSBAQAogICAgIC8vIFRPRE8oYi8xNTM2MDk1MzEpOiByZW1vdmUgd2hlbiBubyBsb25nZXIgbmVlZGVkLgogICAgIG5hdGl2ZV9icmlkZ2Vfc3VwcG9ydGVkOiB0cnVlLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKLSAgICB2bmRrOiB7Ci0gICAgICAgIGVuYWJsZWQ6IHRydWUsCi0gICAgICAgIHN1cHBvcnRfc3lzdGVtX3Byb2Nlc3M6IHRydWUsCi0gICAgfSwKKyAgICBkb3VibGVfbG9hZGFibGU6IHRydWUsCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYnV0aWxzX2hlYWRlcnMiLAorICAgIF0sCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibGlidXRpbHNfaGVhZGVycyIsCisgICAgXSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIkNhbGxTdGFjay5jcHAiLApAQCAtMjQ5LDYgKzI2NSwxNyBAQAogICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJsb2ciLAogICAgIF0sCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICAgY2M6IFsKKyAgICAgICAgICAgICJzbW9yZWxhbmRAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxMjg1NzcsCisgICAgICAgIGRlc2NyaXB0aW9uOiAiVGhlIGZ1enplciB0YXJnZXRzIHRoZSBBUElzIG9mIGxpYnV0aWxzIiwKKyAgICAgICAgdmVjdG9yOiAibG9jYWxfbm9fcHJpdmlsZWdlc19yZXF1aXJlZCIsCisgICAgICAgIHNlcnZpY2VfcHJpdmlsZWdlOiAicHJpdmlsZWdlZCIsCisgICAgICAgIHVzZXJzOiAibXVsdGlfdXNlciIsCisgICAgICAgIGZ1enplZF9jb2RlX3VzYWdlOiAic2hpcHBlZCIsCisgICAgfSwKIH0KIAogY2NfZnV6eiB7CkBAIC0yNjQsMjQgKzI5MSw2IEBACiB9CiAKIGNjX2Z1enogewotICAgIG5hbWU6ICJsaWJ1dGlsc19mdXp6X3N0cmluZzgiLAotICAgIGRlZmF1bHRzOiBbImxpYnV0aWxzX2Z1enpfZGVmYXVsdHMiXSwKLSAgICBzcmNzOiBbIlN0cmluZzhfZnV6ei5jcHAiXSwKLX0KLQotY2NfZnV6eiB7Ci0gICAgbmFtZTogImxpYnV0aWxzX2Z1enpfc3RyaW5nMTYiLAotICAgIGRlZmF1bHRzOiBbImxpYnV0aWxzX2Z1enpfZGVmYXVsdHMiXSwKLSAgICBzcmNzOiBbIlN0cmluZzE2X2Z1enouY3BwIl0sCi19Ci0KLWNjX2Z1enogewotICAgIG5hbWU6ICJsaWJ1dGlsc19mdXp6X3ZlY3RvciIsCi0gICAgZGVmYXVsdHM6IFsibGlidXRpbHNfZnV6el9kZWZhdWx0cyJdLAotICAgIHNyY3M6IFsiVmVjdG9yX2Z1enouY3BwIl0sCi19Ci0KLWNjX2Z1enogewogICAgIG5hbWU6ICJsaWJ1dGlsc19mdXp6X3ByaW50ZXIiLAogICAgIGRlZmF1bHRzOiBbImxpYnV0aWxzX2Z1enpfZGVmYXVsdHMiXSwKICAgICBzcmNzOiBbIlByaW50ZXJfZnV6ei5jcHAiXSwKQEAgLTMwNiwxMiArMzE1LDYgQEAKIH0KIAogY2NfZnV6eiB7Ci0gICAgbmFtZTogImxpYnV0aWxzX2Z1enpfcmVmYmFzZSIsCi0gICAgZGVmYXVsdHM6IFsibGlidXRpbHNfZnV6el9kZWZhdWx0cyJdLAotICAgIHNyY3M6IFsiUmVmQmFzZV9mdXp6LmNwcCJdLAotfQotCi1jY19mdXp6IHsKICAgICBuYW1lOiAibGlidXRpbHNfZnV6el9scnVjYWNoZSIsCiAgICAgZGVmYXVsdHM6IFsibGlidXRpbHNfZnV6el9kZWZhdWx0cyJdLAogICAgIHNyY3M6IFsiTHJ1Q2FjaGVfZnV6ei5jcHAiXSwKQEAgLTMzMCwxOCArMzMzLDExIEBACiAgICAgc3JjczogWwogICAgICAgICAiQml0U2V0X3Rlc3QuY3BwIiwKICAgICAgICAgIkNhbGxTdGFja190ZXN0LmNwcCIsCi0gICAgICAgICJFcnJvcnNfdGVzdC5jcHAiLAogICAgICAgICAiRmlsZU1hcF90ZXN0LmNwcCIsCiAgICAgICAgICJMcnVDYWNoZV90ZXN0LmNwcCIsCiAgICAgICAgICJNdXRleF90ZXN0LmNwcCIsCi0gICAgICAgICJTaGFyZWRCdWZmZXJfdGVzdC5jcHAiLAogICAgICAgICAiU2luZ2xldG9uX3Rlc3QuY3BwIiwKLSAgICAgICAgIlN0cmluZzE2X3Rlc3QuY3BwIiwKLSAgICAgICAgIlN0cmluZzhfdGVzdC5jcHAiLAotICAgICAgICAiU3Ryb25nUG9pbnRlcl90ZXN0LmNwcCIsCiAgICAgICAgICJUaW1lcnNfdGVzdC5jcHAiLAotICAgICAgICAiVW5pY29kZV90ZXN0LmNwcCIsCi0gICAgICAgICJWZWN0b3JfdGVzdC5jcHAiLAogICAgIF0sCiAKICAgICB0YXJnZXQ6IHsKQEAgLTM2Myw3ICszNTksNiBAQAogICAgICAgICBsaW51eDogewogICAgICAgICAgICAgc3JjczogWwogICAgICAgICAgICAgICAgICJMb29wZXJfdGVzdC5jcHAiLAotICAgICAgICAgICAgICAgICJSZWZCYXNlX3Rlc3QuY3BwIiwKICAgICAgICAgICAgIF0sCiAgICAgICAgIH0sCiAgICAgICAgIGhvc3Q6IHsKQEAgLTM3NCw2ICszNjksNyBAQAogICAgICAgICAgICAgICAgICJsaWJ1bndpbmRzdGFja19ub19kZXgiLAogICAgICAgICAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICAgICAgICAgImxpYnV0aWxzY2FsbHN0YWNrIiwKKyAgICAgICAgICAgICAgICAibGlieiIsCiAgICAgICAgICAgICBdLAogICAgICAgICB9LAogICAgIH0sCkBAIC00MTcsOSArNDEzLDMgQEAKICAgICBzaGFyZWRfbGliczogWyJsaWJ1dGlsc190ZXN0X3NpbmdsZXRvbjEiXSwKICAgICBoZWFkZXJfbGliczogWyJsaWJ1dGlsc19oZWFkZXJzIl0sCiB9Ci0KLWNjX2JlbmNobWFyayB7Ci0gICAgbmFtZTogImxpYnV0aWxzX2JlbmNobWFyayIsCi0gICAgc3JjczogWyJWZWN0b3JfYmVuY2htYXJrLmNwcCJdLAotICAgIHNoYXJlZF9saWJzOiBbImxpYnV0aWxzIl0sCi19CmRpZmYgLS1naXQgYS9saWJ1dGlscy9DYWxsU3RhY2suY3BwIGIvbGlidXRpbHMvQ2FsbFN0YWNrLmNwcAppbmRleCA0ZGNiMzViLi4wMjlmNGE3IDEwMDY0NAotLS0gYS9saWJ1dGlscy9DYWxsU3RhY2suY3BwCisrKyBiL2xpYnV0aWxzL0NhbGxTdGFjay5jcHAKQEAgLTE4LDcgKzE4LDcgQEAKIAogI2luY2x1ZGUgPHV0aWxzL1ByaW50ZXIuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKICNpbmNsdWRlIDx1bndpbmRzdGFjay9BbmRyb2lkVW53aW5kZXIuaD4KIApAQCAtODIsMTQgKzgyLDE1IEBACiAKIHZvaWQgQ2FsbFN0YWNrOjpwcmludChQcmludGVyJiBwcmludGVyKSBjb25zdCB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRnJhbWVMaW5lcy5zaXplKCk7IGkrKykgewotICAgICAgICBwcmludGVyLnByaW50TGluZShtRnJhbWVMaW5lc1tpXSk7CisgICAgICAgIHByaW50ZXIucHJpbnRMaW5lKG1GcmFtZUxpbmVzW2ldLmNfc3RyKCkpOwogICAgIH0KIH0KIAogLy8gVGhlIGZvbGxvd2luZyBmb3VyIGZ1bmN0aW9ucyBtYXkgYmUgdXNlZCB2aWEgd2VhayBzeW1ib2wgcmVmZXJlbmNlcyBmcm9tIGxpYnV0aWxzLgogLy8gQ2xpZW50cyBhc3N1bWUgdGhhdCBpZiBhbnkgb2YgdGhlc2Ugc3ltYm9scyBhcmUgYXZhaWxhYmxlLCB0aGVuIGRlbGV0ZVN0YWNrKCkgaXMuCiAKLSNpZmRlZiBXRUFLU19BVkFJTEFCTEUKKy8vIEFwcGxlIGFuZCBXaW5kb3dzIGRvZXMgbm90IHN1cHBvcnQgdGhpcywgc28gb25seSBjb21waWxlIG9uIG90aGVyIHBsYXRmb3Jtcy4KKyNpZiAhZGVmaW5lZChfX0FQUExFX18pICYmICFkZWZpbmVkKF9XSU4zMikKIAogQ2FsbFN0YWNrOjpDYWxsU3RhY2tVUHRyIENhbGxTdGFjazo6Z2V0Q3VycmVudEludGVybmFsKGludCBpZ25vcmVEZXB0aCkgewogICAgIENhbGxTdGFjazo6Q2FsbFN0YWNrVVB0ciBzdGFjayhuZXcgQ2FsbFN0YWNrKCkpOwpAQCAtMTEwLDYgKzExMSw2IEBACiAgICAgZGVsZXRlIHN0YWNrOwogfQogCi0jZW5kaWYgLy8gV0VBS1NfQVZBSUxBQkxFCisjZW5kaWYgIC8vICFkZWZpbmVkKF9fQVBQTEVfXykgJiYgIWRlZmluZWQoX1dJTjMyKQogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidXRpbHMvQ2FsbFN0YWNrX3Rlc3QuY3BwIGIvbGlidXRpbHMvQ2FsbFN0YWNrX3Rlc3QuY3BwCmluZGV4IDJjZmFmNjEuLjVlZDNjMjcgMTAwNjQ0Ci0tLSBhL2xpYnV0aWxzL0NhbGxTdGFja190ZXN0LmNwcAorKysgYi9saWJ1dGlscy9DYWxsU3RhY2tfdGVzdC5jcHAKQEAgLTE4LDEwICsxOCwxNiBAQAogCiAjaW5jbHVkZSA8dGhyZWFkPgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Rlc3RfdXRpbHMuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdGhyZWFkcy5oPgogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvQ2FsbFN0YWNrLmg+CiAKKyNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKQorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDxsb2cvbG9nX3JlYWQuaD4KKyNlbmRpZgorCiBfX2F0dHJpYnV0ZV9fKChfX25vaW5saW5lX18pKSBleHRlcm4gIkMiIHZvaWQgQ3VycmVudENhbGxlcihhbmRyb2lkOjpTdHJpbmc4JiBiYWNrdHJhY2UpIHsKICAgICBhbmRyb2lkOjpDYWxsU3RhY2sgY3M7CiAgICAgY3MudXBkYXRlKCk7CkBAIC02MSwzICs2NywzOSBAQAogCiAgICAgQVNTRVJUX05FKC0xLCBjcy50b1N0cmluZygpLmZpbmQoIihUaHJlYWRCdXN5V2FpdCIpKSA8PCAiRnVsbCBiYWNrdHJhY2U6XG4iIDw8IGNzLnRvU3RyaW5nKCk7CiB9CisKKyNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKQorVEVTVChDYWxsU3RhY2tUZXN0LCBsb2dfc3RhY2spIHsKKyAgICBhbmRyb2lkOjpDYWxsU3RhY2s6OmxvZ1N0YWNrKCJjYWxsc3RhY2tfdGVzdCIpOworICAgIGF1dG8gbG9nZ2VyX2xpc3QgPSBhbmRyb2lkX2xvZ2dlcl9saXN0X29wZW4oYW5kcm9pZF9uYW1lX3RvX2xvZ19pZCgibWFpbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9MT0dfTk9OQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfTUFYIC8qIHRhaWwgKi8sIGdldHBpZCgpKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgbG9nZ2VyX2xpc3QpOworICAgIHN0ZDo6c3RyaW5nIGxvZzsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBsb2dfbXNnIGxvZ19tc2c7CisgICAgICAgIGF1dG8gcmV0ID0gYW5kcm9pZF9sb2dnZXJfbGlzdF9yZWFkKGxvZ2dlcl9saXN0LCAmbG9nX21zZyk7CisgICAgICAgIGlmIChyZXQgPT0gLUVBR0FJTikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgQVNTRVJUX0dUKHJldCwgMCk7CisgICAgICAgIGlmIChsb2dfbXNnLm1zZygpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIEZpcnN0IGdldCB0aGUgdGFnLgorICAgICAgICBjaGFyKiBtc2cgPSAmbG9nX21zZy5tc2coKVsxXTsKKyAgICAgICAgaWYgKHN0ZDo6c3RyaW5nKG1zZykgIT0gImNhbGxzdGFja190ZXN0IikgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gTm93IG1vdmUgcGFzdCB0aGUgdGFnLgorICAgICAgICBtc2cgPSAmbXNnW3N0cmxlbihtc2cpICsgMV07CisgICAgICAgIGxvZyArPSBtc2c7CisgICAgICAgIGxvZyArPSAnXG4nOworICAgIH0KKyAgICBBU1NFUlRfTkUoIiIsIGxvZykgPDwgIk5vIG1lc3NhZ2VzIGZvdW5kIGluIHRoZSBsb2cgZnJvbSB0aGUgdGVzdC4iOworICAgIC8vIExvb2sgZm9yIGEgYmFja3RyYWNlIGxpbmUgc3VjaCBhczoKKyAgICAvLyAgICMwMCBwYyAwMDAwMDAwMDAwMDUzNmU0ICBsaWJ1dGlsc190ZXN0ICh0ZXN0aW5nOjpUZXN0OjpSdW4oKSs0MzYpCisgICAgQVNTRVJUX01BVENIKGxvZywgIiNcXGQrIHBjIFxcZCsiKTsKKyAgICBhbmRyb2lkX2xvZ2dlcl9saXN0X2Nsb3NlKGxvZ2dlcl9saXN0KTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlidXRpbHMvRmlsZU1hcC5jcHAgYi9saWJ1dGlscy9GaWxlTWFwLmNwcAppbmRleCAwYWJiODYxLi4zYWNiY2U5IDEwMDY0NAotLS0gYS9saWJ1dGlscy9GaWxlTWFwLmNwcAorKysgYi9saWJ1dGlscy9GaWxlTWFwLmNwcApAQCAtMjEsNyArMjEsNyBAQAogI2RlZmluZSBMT0dfVEFHICJmaWxlbWFwIgogCiAjaW5jbHVkZSA8dXRpbHMvRmlsZU1hcC5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KIAogI2lmIGRlZmluZWQoX19NSU5HVzMyX18pICYmICFkZWZpbmVkKF9fVVNFX01JTkdXX0FOU0lfU1RESU8pCiAjIGRlZmluZSBQUklkMzIgIkkzMmQiCmRpZmYgLS1naXQgYS9saWJ1dGlscy9Mb29wZXIuY3BwIGIvbGlidXRpbHMvTG9vcGVyLmNwcAppbmRleCA0MDJlNDNjLi4yNTQxYWE4IDEwMDY0NAotLS0gYS9saWJ1dGlscy9Mb29wZXIuY3BwCisrKyBiL2xpYnV0aWxzL0xvb3Blci5jcHAKQEAgLTcwLDggKzcwLDcgQEAKIC8vIE1heGltdW0gbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgZm9yIHdoaWNoIHRvIHJldHJpZXZlIHBvbGwgZXZlbnRzIGVhY2ggaXRlcmF0aW9uLgogc3RhdGljIGNvbnN0IGludCBFUE9MTF9NQVhfRVZFTlRTID0gMTY7CiAKLXN0YXRpYyBwdGhyZWFkX29uY2VfdCBnVExTT25jZSA9IFBUSFJFQURfT05DRV9JTklUOwotc3RhdGljIHB0aHJlYWRfa2V5X3QgZ1RMU0tleSA9IDA7Cit0aHJlYWRfbG9jYWwgc3RhdGljIHNwPExvb3Blcj4gZ1RocmVhZExvY2FsTG9vcGVyOwogCiBMb29wZXI6Okxvb3Blcihib29sIGFsbG93Tm9uQ2FsbGJhY2tzKQogICAgIDogbUFsbG93Tm9uQ2FsbGJhY2tzKGFsbG93Tm9uQ2FsbGJhY2tzKSwKQEAgLTkxLDM4ICs5MCwxMiBAQAogTG9vcGVyOjp+TG9vcGVyKCkgewogfQogCi12b2lkIExvb3Blcjo6aW5pdFRMU0tleSgpIHsKLSAgICBpbnQgZXJyb3IgPSBwdGhyZWFkX2tleV9jcmVhdGUoJmdUTFNLZXksIHRocmVhZERlc3RydWN0b3IpOwotICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZXJyb3IgIT0gMCwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBUTFMga2V5OiAlcyIsIHN0cmVycm9yKGVycm9yKSk7Ci19Ci0KLXZvaWQgTG9vcGVyOjp0aHJlYWREZXN0cnVjdG9yKHZvaWQgKnN0KSB7Ci0gICAgTG9vcGVyKiBjb25zdCBzZWxmID0gc3RhdGljX2Nhc3Q8TG9vcGVyKj4oc3QpOwotICAgIGlmIChzZWxmICE9IG51bGxwdHIpIHsKLSAgICAgICAgc2VsZi0+ZGVjU3Ryb25nKCh2b2lkKil0aHJlYWREZXN0cnVjdG9yKTsKLSAgICB9Ci19Ci0KIHZvaWQgTG9vcGVyOjpzZXRGb3JUaHJlYWQoY29uc3Qgc3A8TG9vcGVyPiYgbG9vcGVyKSB7Ci0gICAgc3A8TG9vcGVyPiBvbGQgPSBnZXRGb3JUaHJlYWQoKTsgLy8gYWxzbyBoYXMgc2lkZS1lZmZlY3Qgb2YgaW5pdGlhbGl6aW5nIFRMUwotCi0gICAgaWYgKGxvb3BlciAhPSBudWxscHRyKSB7Ci0gICAgICAgIGxvb3Blci0+aW5jU3Ryb25nKCh2b2lkKil0aHJlYWREZXN0cnVjdG9yKTsKLSAgICB9Ci0KLSAgICBwdGhyZWFkX3NldHNwZWNpZmljKGdUTFNLZXksIGxvb3Blci5nZXQoKSk7Ci0KLSAgICBpZiAob2xkICE9IG51bGxwdHIpIHsKLSAgICAgICAgb2xkLT5kZWNTdHJvbmcoKHZvaWQqKXRocmVhZERlc3RydWN0b3IpOwotICAgIH0KKyAgICBnVGhyZWFkTG9jYWxMb29wZXIgPSBsb29wZXI7CiB9CiAKIHNwPExvb3Blcj4gTG9vcGVyOjpnZXRGb3JUaHJlYWQoKSB7Ci0gICAgaW50IHJlc3VsdCA9IHB0aHJlYWRfb25jZSgmIGdUTFNPbmNlLCBpbml0VExTS2V5KTsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHJlc3VsdCAhPSAwLCAicHRocmVhZF9vbmNlIGZhaWxlZCIpOwotCi0gICAgTG9vcGVyKiBsb29wZXIgPSAoTG9vcGVyKilwdGhyZWFkX2dldHNwZWNpZmljKGdUTFNLZXkpOwotICAgIHJldHVybiBzcDxMb29wZXI+Ojpmcm9tRXhpc3RpbmcobG9vcGVyKTsKKyAgICByZXR1cm4gZ1RocmVhZExvY2FsTG9vcGVyOwogfQogCiBzcDxMb29wZXI+IExvb3Blcjo6cHJlcGFyZShpbnQgb3B0cykgewpAQCAtNTIzLDYgKzQ5NiwyMSBAQAogICAgIHJldHVybiAxOwogfQogCitib29sIExvb3Blcjo6Z2V0RmRTdGF0ZURlYnVnKGludCBmZCwgaW50KiBpZGVudCwgaW50KiBldmVudHMsIHNwPExvb3BlckNhbGxiYWNrPiogY2IsIHZvaWQqKiBkYXRhKSB7CisgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKKyAgICBpZiAoYXV0byBzZXFOdW1JdCA9IG1TZXF1ZW5jZU51bWJlckJ5RmQuZmluZChmZCk7IHNlcU51bUl0ICE9IG1TZXF1ZW5jZU51bWJlckJ5RmQuY2VuZCgpKSB7CisgICAgICAgIGlmIChhdXRvIHJlcUl0ID0gbVJlcXVlc3RzLmZpbmQoc2VxTnVtSXQtPnNlY29uZCk7IHJlcUl0ICE9IG1SZXF1ZXN0cy5jZW5kKCkpIHsKKyAgICAgICAgICAgIGNvbnN0IFJlcXVlc3QmIHJlcXVlc3QgPSByZXFJdC0+c2Vjb25kOworICAgICAgICAgICAgaWYgKGlkZW50KSAqaWRlbnQgPSByZXF1ZXN0LmlkZW50OworICAgICAgICAgICAgaWYgKGV2ZW50cykgKmV2ZW50cyA9IHJlcXVlc3QuZXZlbnRzOworICAgICAgICAgICAgaWYgKGNiKSAqY2IgPSByZXF1ZXN0LmNhbGxiYWNrOworICAgICAgICAgICAgaWYgKGRhdGEpICpkYXRhID0gcmVxdWVzdC5kYXRhOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCiBpbnQgTG9vcGVyOjpyZW1vdmVGZChpbnQgZmQpIHsKICAgICBBdXRvTXV0ZXggX2wobUxvY2spOwogICAgIGNvbnN0IGF1dG8mIGl0ID0gbVNlcXVlbmNlTnVtYmVyQnlGZC5maW5kKGZkKTsKQEAgLTUzMiw5ICs1MjAsMzMgQEAKICAgICByZXR1cm4gcmVtb3ZlU2VxdWVuY2VOdW1iZXJMb2NrZWQoaXQtPnNlY29uZCk7CiB9CiAKK2ludCBMb29wZXI6OnJlcG9sbChpbnQgZmQpIHsKKyAgICBBdXRvTXV0ZXggX2wobUxvY2spOworICAgIGNvbnN0IGF1dG8mIGl0ID0gbVNlcXVlbmNlTnVtYmVyQnlGZC5maW5kKGZkKTsKKyAgICBpZiAoaXQgPT0gbVNlcXVlbmNlTnVtYmVyQnlGZC5lbmQoKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBjb25zdCBhdXRvJiByZXF1ZXN0X2l0ID0gbVJlcXVlc3RzLmZpbmQoaXQtPnNlY29uZCk7CisgICAgaWYgKHJlcXVlc3RfaXQgPT0gbVJlcXVlc3RzLmVuZCgpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBjb25zdCBhdXRvJiBbc2VxLCByZXF1ZXN0XSA9ICpyZXF1ZXN0X2l0OworCisgICAgTE9HX0FMV0FZU19GQVRBTF9JRigKKyAgICAgICAgICAgIGZkICE9IHJlcXVlc3QuZmQsCisgICAgICAgICAgICAiTG9vcGVyIGhhcyBpbmNvbnNpc3RlbnQgZGF0YSBzdHJ1Y3R1cmUuIFdoZW4gbG9va2luZyB1cCBGRCAlZCBmb3VuZCBGRCAlZC4iLCBmZCwKKyAgICAgICAgICAgIHJlcXVlc3RfaXQtPnNlY29uZC5mZCk7CisKKyAgICBlcG9sbF9ldmVudCBldmVudEl0ZW0gPSBjcmVhdGVFcG9sbEV2ZW50KHJlcXVlc3QuZ2V0RXBvbGxFdmVudHMoKSwgc2VxKTsKKyAgICBpZiAoZXBvbGxfY3RsKG1FcG9sbEZkLmdldCgpLCBFUE9MTF9DVExfTU9ELCBmZCwgJmV2ZW50SXRlbSkgPT0gLTEpIHJldHVybiAwOworCisgICAgcmV0dXJuIDE7ICAvLyBzdWNjZXNzCit9CisKIGludCBMb29wZXI6OnJlbW92ZVNlcXVlbmNlTnVtYmVyTG9ja2VkKFNlcXVlbmNlTnVtYmVyIHNlcSkgewogI2lmIERFQlVHX0NBTExCQUNLUwotICAgIEFMT0dEKCIlcCB+IHJlbW92ZUZkIC0gZmQ9JWQsIHNlcT0ldSIsIHRoaXMsIGZkLCBzZXEpOworICAgIEFMT0dEKCIlcCB+IHJlbW92ZUZkIC0gc2VxPSUiIFBSSXU2NCwgdGhpcywgc2VxKTsKICNlbmRpZgogCiAgICAgY29uc3QgYXV0byYgcmVxdWVzdF9pdCA9IG1SZXF1ZXN0cy5maW5kKHNlcSk7CmRpZmYgLS1naXQgYS9saWJ1dGlscy9Mb29wZXJfdGVzdC5jcHAgYi9saWJ1dGlscy9Mb29wZXJfdGVzdC5jcHAKaW5kZXggYzg1OWY5Yy4uYTdhOTk4NyAxMDA2NDQKLS0tIGEvbGlidXRpbHMvTG9vcGVyX3Rlc3QuY3BwCisrKyBiL2xpYnV0aWxzL0xvb3Blcl90ZXN0LmNwcApAQCAtNDEwLDYgKzQxMCw1MiBAQAogICAgICAgICAgICAgPDwgImFkZEZkIHNob3VsZCByZXR1cm4gLTEgYmVjYXVzZSBhcmd1bWVudHMgd2VyZSBpbnZhbGlkIjsKIH0KIAorY2xhc3MgTG9vcGVyQ2FsbGJhY2tTdHViIGZpbmFsIDogcHVibGljIExvb3BlckNhbGxiYWNrIHsKKyAgcHVibGljOgorICAgIExvb3BlckNhbGxiYWNrU3R1YihzdGQ6OmZ1bmN0aW9uPGludCgpPiBjYWxsYmFjaykgOiBtQ2FsbGJhY2t7Y2FsbGJhY2t9IHt9CisKKyAgICBpbnQgaGFuZGxlRXZlbnQoaW50IC8qZmQqLywgaW50IC8qZXZlbnRzKi8sIHZvaWQqIC8qZGF0YSovKSBvdmVycmlkZSB7IHJldHVybiBtQ2FsbGJhY2soKTsgfQorCisgIHByaXZhdGU6CisgICAgc3RkOjpmdW5jdGlvbjxpbnQoKT4gbUNhbGxiYWNrOworfTsKKworVEVTVF9GKExvb3BlclRlc3QsIGdldEZkU3RhdGVEZWJ1Z19XaGVuRmRJc0luUmVxdWVzdHNfUmV0dXJuc1RydWUpIHsKKyAgICBQaXBlIHBpcGU7CisgICAgY29uc3QgaW50IGZkID0gcGlwZS5yZWNlaXZlRmQ7CisgICAgY29uc3RleHByIGludCBleHBlY3RlZElkZW50e0xvb3Blcjo6UE9MTF9DQUxMQkFDS307CisgICAgc3A8TG9vcGVyQ2FsbGJhY2s+IGV4cGVjdGVkQ2FsbGJhY2sgPQorICAgICAgICAgICAgc3A8TG9vcGVyQ2FsbGJhY2tTdHViPjo6bWFrZShbXSgpIGNvbnN0ZXhwciAtPiBpbnQgeyByZXR1cm4gMDsgfSk7CisgICAgdm9pZCogZXhwZWN0ZWREYXRhID0gdGhpczsKKworICAgIEVYUEVDVF9FUSgxLCBtTG9vcGVyLT5hZGRGZChmZCwgZXhwZWN0ZWRJZGVudCwgTG9vcGVyOjpFVkVOVF9JTlBVVCwgZXhwZWN0ZWRDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWREYXRhKSk7CisKKyAgICBpbnQgaWRlbnQ7CisgICAgaW50IGV2ZW50czsKKyAgICBzcDxMb29wZXJDYWxsYmFjaz4gY2FsbGJhY2s7CisgICAgdm9pZCogZGF0YTsKKworICAgIEVYUEVDVF9UUlVFKG1Mb29wZXItPmdldEZkU3RhdGVEZWJ1ZyhmZCwgJmlkZW50LCAmZXZlbnRzLCAmY2FsbGJhY2ssICZkYXRhKSk7CisKKyAgICBFWFBFQ1RfRVEoaWRlbnQsIGV4cGVjdGVkSWRlbnQpOworICAgIEVYUEVDVF9FUShldmVudHMsIExvb3Blcjo6RVZFTlRfSU5QVVQpOworICAgIEVYUEVDVF9FUShjYWxsYmFjaywgZXhwZWN0ZWRDYWxsYmFjayk7CisgICAgRVhQRUNUX0VRKGRhdGEsIGV4cGVjdGVkRGF0YSk7Cit9CisKK1RFU1RfRihMb29wZXJUZXN0LCBnZXRGZFN0YXRlRGVidWdfV2hlbkZkSXNOb3RJblJlcXVlc3RzX1JldHVybnNGYWxzZSkgeworICAgIFBpcGUgcGlwZTsKKyAgICBjb25zdCBpbnQgbm90QWRkZWRGZCA9IHBpcGUucmVjZWl2ZUZkOworCisgICAgaW50IGlkZW50OworICAgIGludCBldmVudHM7CisgICAgc3A8TG9vcGVyQ2FsbGJhY2s+IGNhbGxiYWNrOworICAgIHZvaWQqIGRhdGE7CisKKyAgICBFWFBFQ1RfRkFMU0UobUxvb3Blci0+Z2V0RmRTdGF0ZURlYnVnKG5vdEFkZGVkRmQsICZpZGVudCwgJmV2ZW50cywgJmNhbGxiYWNrLCAmZGF0YSkpOworfQorCiBURVNUX0YoTG9vcGVyVGVzdCwgUmVtb3ZlRmRfV2hlbkNhbGxiYWNrTm90QWRkZWRfUmV0dXJuc1plcm8pIHsKICAgICBpbnQgcmVzdWx0ID0gbUxvb3Blci0+cmVtb3ZlRmQoMSk7CiAKZGlmZiAtLWdpdCBhL2xpYnV0aWxzL0xydUNhY2hlX3Rlc3QuY3BwIGIvbGlidXRpbHMvTHJ1Q2FjaGVfdGVzdC5jcHAKaW5kZXggOGIxNjk0Ny4uNWNkM2NiYiAxMDA2NDQKLS0tIGEvbGlidXRpbHMvTHJ1Q2FjaGVfdGVzdC5jcHAKKysrIGIvbGlidXRpbHMvTHJ1Q2FjaGVfdGVzdC5jcHAKQEAgLTI5LDYgKzI5LDggQEAKIHN0cnVjdCBDb21wbGV4S2V5IHsKICAgICBpbnQgazsKIAorICAgIGV4cGxpY2l0IENvbXBsZXhLZXkoKSA6IGsoMCkgeyBpbnN0YW5jZUNvdW50ICs9IDE7IH0KKwogICAgIGV4cGxpY2l0IENvbXBsZXhLZXkoaW50IGspIDogayhrKSB7CiAgICAgICAgIGluc3RhbmNlQ291bnQgKz0gMTsKICAgICB9CkBAIC01Nyw2ICs1OSw4IEBACiBzdHJ1Y3QgQ29tcGxleFZhbHVlIHsKICAgICBpbnQgdjsKIAorICAgIGV4cGxpY2l0IENvbXBsZXhWYWx1ZSgpIDogdigwKSB7IGluc3RhbmNlQ291bnQgKz0gMTsgfQorCiAgICAgZXhwbGljaXQgQ29tcGxleFZhbHVlKGludCB2KSA6IHYodikgewogICAgICAgICBpbnN0YW5jZUNvdW50ICs9IDE7CiAgICAgfQpAQCAtODMsMTAgKzg3LDkgQEAKIAogc3RydWN0IEtleUZhaWxzT25Db3B5IDogcHVibGljIENvbXBsZXhLZXkgewogICAgIHB1YmxpYzoKLSAgICBLZXlGYWlsc09uQ29weShjb25zdCBLZXlGYWlsc09uQ29weSYga2V5KSA6IENvbXBsZXhLZXkoa2V5KSB7Ci0gICAgICAgIEFERF9GQUlMVVJFKCk7Ci0gICAgfQotICAgIEtleUZhaWxzT25Db3B5KGludCBrZXkpIDogQ29tcGxleEtleShrZXkpIHsgfQorICAgICAgS2V5RmFpbHNPbkNvcHkoKSA6IENvbXBsZXhLZXkoKSB7fQorICAgICAgS2V5RmFpbHNPbkNvcHkoY29uc3QgS2V5RmFpbHNPbkNvcHkmIGtleSkgOiBDb21wbGV4S2V5KGtleSkgeyBBRERfRkFJTFVSRSgpOyB9CisgICAgICBLZXlGYWlsc09uQ29weShpbnQga2V5KSA6IENvbXBsZXhLZXkoa2V5KSB7fQogfTsKIAogfSAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL2xpYnV0aWxzL1ByaW50ZXIuY3BwIGIvbGlidXRpbHMvUHJpbnRlci5jcHAKaW5kZXggYzlhZTIxMC4uNGJkNDlmMSAxMDA2NDQKLS0tIGEvbGlidXRpbHMvUHJpbnRlci5jcHAKKysrIGIvbGlidXRpbHMvUHJpbnRlci5jcHAKQEAgLTE5LDcgKzE5LDcgQEAKIAogI2luY2x1ZGUgPHV0aWxzL1ByaW50ZXIuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgogCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAKZGlmZiAtLWdpdCBhL2xpYnV0aWxzL1Byb2Nlc3NDYWxsU3RhY2suY3BwIGIvbGlidXRpbHMvUHJvY2Vzc0NhbGxTdGFjay5jcHAKaW5kZXggZjA1NGRlOS4uNGIyN2JkZCAxMDA2NDQKLS0tIGEvbGlidXRpbHMvUHJvY2Vzc0NhbGxTdGFjay5jcHAKKysrIGIvbGlidXRpbHMvUHJvY2Vzc0NhbGxTdGFjay5jcHAKQEAgLTIwNSw4ICsyMDUsNyBAQAogfQogCiB2b2lkIFByb2Nlc3NDYWxsU3RhY2s6OnByaW50SW50ZXJuYWwoUHJpbnRlciYgcHJpbnRlciwgUHJpbnRlciYgY3NQcmludGVyKSBjb25zdCB7Ci0gICAgZHVtcFByb2Nlc3NIZWFkZXIocHJpbnRlciwgZ2V0cGlkKCksCi0gICAgICAgICAgICAgICAgICAgICAgZ2V0VGltZVN0cmluZyhtVGltZVVwZGF0ZWQpLnN0cmluZygpKTsKKyAgICBkdW1wUHJvY2Vzc0hlYWRlcihwcmludGVyLCBnZXRwaWQoKSwgZ2V0VGltZVN0cmluZyhtVGltZVVwZGF0ZWQpLmNfc3RyKCkpOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVGhyZWFkTWFwLnNpemUoKTsgKytpKSB7CiAgICAgICAgIHBpZF90IHRpZCA9IG1UaHJlYWRNYXAua2V5QXQoaSk7CkBAIC0yMTQsNyArMjEzLDcgQEAKICAgICAgICAgY29uc3QgU3RyaW5nOCYgdGhyZWFkTmFtZSA9IHRocmVhZEluZm8udGhyZWFkTmFtZTsKIAogICAgICAgICBwcmludGVyLnByaW50TGluZSgiIik7Ci0gICAgICAgIHByaW50ZXIucHJpbnRGb3JtYXRMaW5lKCJcIiVzXCIgc3lzVGlkPSVkIiwgdGhyZWFkTmFtZS5zdHJpbmcoKSwgdGlkKTsKKyAgICAgICAgcHJpbnRlci5wcmludEZvcm1hdExpbmUoIlwiJXNcIiBzeXNUaWQ9JWQiLCB0aHJlYWROYW1lLmNfc3RyKCksIHRpZCk7CiAKICAgICAgICAgdGhyZWFkSW5mby5jYWxsU3RhY2sucHJpbnQoY3NQcmludGVyKTsKICAgICB9CmRpZmYgLS1naXQgYS9saWJ1dGlscy9TdG9wV2F0Y2guY3BwIGIvbGlidXRpbHMvU3RvcFdhdGNoLmNwcAppbmRleCAyOGUyZDc2Li5jOTFjZDVjIDEwMDY0NAotLS0gYS9saWJ1dGlscy9TdG9wV2F0Y2guY3BwCisrKyBiL2xpYnV0aWxzL1N0b3BXYXRjaC5jcHAKQEAgLTE4LDEzICsxOCw5IEBACiAKICNpbmNsdWRlIDx1dGlscy9TdG9wV2F0Y2guaD4KIAotLyogZm9yIFBSSWQ2NCAqLwotI2lmbmRlZiBfX1NURENfRk9STUFUX01BQ1JPUwotI2RlZmluZSBfX1NURENfRk9STUFUX01BQ1JPUyAxCi0jZW5kaWYKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL2xpYnV0aWxzL1N0cmluZzhfdGVzdC5jcHAgYi9saWJ1dGlscy9TdHJpbmc4X3Rlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzU2Y2QwLi4wMDAwMDAwCi0tLSBhL2xpYnV0aWxzL1N0cmluZzhfdGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiU3RyaW5nOF90ZXN0IgotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+Ci0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotY2xhc3MgU3RyaW5nOFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICB9Ci19OwotCi1URVNUX0YoU3RyaW5nOFRlc3QsIENzdHIpIHsKLSAgICBTdHJpbmc4IHRtcCgiSGVsbG8sIHdvcmxkISIpOwotCi0gICAgRVhQRUNUX1NUUkVRKHRtcC5zdHJpbmcoKSwgIkhlbGxvLCB3b3JsZCEiKTsKLX0KLQotVEVTVF9GKFN0cmluZzhUZXN0LCBPcGVyYXRvclBsdXMpIHsKLSAgICBTdHJpbmc4IHNyYzEoIkhlbGxvLCAiKTsKLQotICAgIC8vIFRlc3QgYWRkaW5nIFN0cmluZzggKyBjb25zdCBjaGFyKgotICAgIGNvbnN0IGNoYXIqIGNjc3JjMiA9ICJ3b3JsZCEiOwotICAgIFN0cmluZzggZHN0MSA9IHNyYzEgKyBjY3NyYzI7Ci0gICAgRVhQRUNUX1NUUkVRKGRzdDEuc3RyaW5nKCksICJIZWxsbywgd29ybGQhIik7Ci0gICAgRVhQRUNUX1NUUkVRKHNyYzEuc3RyaW5nKCksICJIZWxsbywgIik7Ci0gICAgRVhQRUNUX1NUUkVRKGNjc3JjMiwgIndvcmxkISIpOwotCi0gICAgLy8gVGVzdCBhZGRpbmcgU3RyaW5nOCArIFN0cmluZzgKLSAgICBTdHJpbmc4IHNzcmMyKCJ3b3JsZCEiKTsKLSAgICBTdHJpbmc4IGRzdDIgPSBzcmMxICsgc3NyYzI7Ci0gICAgRVhQRUNUX1NUUkVRKGRzdDIuc3RyaW5nKCksICJIZWxsbywgd29ybGQhIik7Ci0gICAgRVhQRUNUX1NUUkVRKHNyYzEuc3RyaW5nKCksICJIZWxsbywgIik7Ci0gICAgRVhQRUNUX1NUUkVRKHNzcmMyLnN0cmluZygpLCAid29ybGQhIik7Ci19Ci0KLVRFU1RfRihTdHJpbmc4VGVzdCwgT3BlcmF0b3JQbHVzRXF1YWxzKSB7Ci0gICAgU3RyaW5nOCBzcmMxKCJNeSB2b2ljZSIpOwotCi0gICAgLy8gVGVzdGluZyBTdHJpbmc4ICs9IFN0cmluZzgKLSAgICBTdHJpbmc4IHNyYzIoIiBpcyBteSBwYXNzcG9ydC4iKTsKLSAgICBzcmMxICs9IHNyYzI7Ci0gICAgRVhQRUNUX1NUUkVRKHNyYzEuc3RyaW5nKCksICJNeSB2b2ljZSBpcyBteSBwYXNzcG9ydC4iKTsKLSAgICBFWFBFQ1RfU1RSRVEoc3JjMi5zdHJpbmcoKSwgIiBpcyBteSBwYXNzcG9ydC4iKTsKLQotICAgIC8vIEFkZGluZyBjb25zdCBjaGFyKiB0byB0aGUgcHJldmlvdXMgc3RyaW5nLgotICAgIGNvbnN0IGNoYXIqIHNyYzMgPSAiIFZlcmlmeSBtZS4iOwotICAgIHNyYzEgKz0gc3JjMzsKLSAgICBFWFBFQ1RfU1RSRVEoc3JjMS5zdHJpbmcoKSwgIk15IHZvaWNlIGlzIG15IHBhc3Nwb3J0LiBWZXJpZnkgbWUuIik7Ci0gICAgRVhQRUNUX1NUUkVRKHNyYzIuc3RyaW5nKCksICIgaXMgbXkgcGFzc3BvcnQuIik7Ci0gICAgRVhQRUNUX1NUUkVRKHNyYzMsICIgVmVyaWZ5IG1lLiIpOwotfQotCi1URVNUX0YoU3RyaW5nOFRlc3QsIFNldFRvU2l6ZU1heFJldHVybnNOb01lbW9yeSkgewotICAgIGNvbnN0IGNoYXIgKmluID0gInNvbWUgc3RyaW5nIjsKLSAgICBFWFBFQ1RfRVEoTk9fTUVNT1JZLCBTdHJpbmc4KCIiKS5zZXRUbyhpbiwgU0laRV9NQVgpKTsKLX0KLQotLy8gaHR0cDovL2IvMjkyNTA1NDMKLVRFU1RfRihTdHJpbmc4VGVzdCwgQ29ycmVjdEludmFsaWRTdXJyb2dhdGUpIHsKLSAgICAvLyBkODQxZDggaXMgYW4gaW52YWxpZCBzdGFydCBmb3IgYSBzdXJyb2dhdGUgcGFpci4gTWFrZSBzdXJlIHRoaXMgaXMgaGFuZGxlZCBieSBpZ25vcmluZyB0aGUKLSAgICAvLyBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHBhaXIgYW5kIGhhbmRsaW5nIHRoZSByZXN0IGNvcnJlY3RseS4KLSAgICBTdHJpbmcxNiBzdHJpbmcxNih1Ilx4ZDg0MVx4ZDg0MVx4ZGM0MVx4MDAwMCIpOwotICAgIFN0cmluZzggc3RyaW5nOChzdHJpbmcxNik7Ci0KLSAgICBFWFBFQ1RfRVEoNFUsIHN0cmluZzgubGVuZ3RoKCkpOwotfQotCi1URVNUX0YoU3RyaW5nOFRlc3QsIENoZWNrVXRmMzJDb252ZXJzaW9uKSB7Ci0gICAgLy8gU2luY2UgYm91bmQgY2hlY2tzIHdlcmUgYWRkZWQsIGNoZWNrIHRoZSBjb252ZXJzaW9uIGNhbiBiZSBkb25lIHdpdGhvdXQgZmF0YWwgZXJyb3JzLgotICAgIC8vIFRoZSB1dGY4IGxlbmd0aHMgb2YgdGhlc2UgYXJlIGNoYXJzIGFyZSAxICsgMiArIDMgKyA0ID0gMTAuCi0gICAgY29uc3QgY2hhcjMyX3Qgc3RyaW5nMzJbXSA9IFUiXHgwMDAwMDA3Zlx4MDAwMDA3ZmZceDAwMDA5MTFceDAwMTBmZmZlIjsKLSAgICBTdHJpbmc4IHN0cmluZzgoc3RyaW5nMzIpOwotICAgIEVYUEVDVF9FUSgxMFUsIHN0cmluZzgubGVuZ3RoKCkpOwotfQotCi1URVNUX0YoU3RyaW5nOFRlc3QsIFZhbGlkVXRmMTZDb252ZXJzaW9uKSB7Ci0gICAgY2hhcjE2X3QgdG1wW10gPSB1ImFiY2RlZiI7Ci0gICAgU3RyaW5nOCB2YWxpZCA9IFN0cmluZzgoU3RyaW5nMTYodG1wKSk7Ci0gICAgRVhQRUNUX1NUUkVRKHZhbGlkLCAiYWJjZGVmIik7Ci19Ci0KLVRFU1RfRihTdHJpbmc4VGVzdCwgYXBwZW5kKSB7Ci0gICAgU3RyaW5nOCBzOwotICAgIEVYUEVDVF9FUShPSywgcy5hcHBlbmQoImZvbyIpKTsKLSAgICBFWFBFQ1RfU1RSRVEoImZvbyIsIHMpOwotICAgIEVYUEVDVF9FUShPSywgcy5hcHBlbmQoImJhciIpKTsKLSAgICBFWFBFQ1RfU1RSRVEoImZvb2JhciIsIHMpOwotICAgIEVYUEVDVF9FUShPSywgcy5hcHBlbmQoImJheiIsIDApKTsKLSAgICBFWFBFQ1RfU1RSRVEoImZvb2JhciIsIHMpOwotICAgIEVYUEVDVF9FUShOT19NRU1PUlksIHMuYXBwZW5kKCJiYXoiLCBTSVpFX01BWCkpOwotICAgIEVYUEVDVF9TVFJFUSgiZm9vYmFyIiwgcyk7Ci19CmRpZmYgLS1naXQgYS9saWJ1dGlscy9TeXN0ZW1DbG9jay5jcHAgYi9saWJ1dGlscy9TeXN0ZW1DbG9jay5jcHAKaW5kZXggOWM3MTE0MS4uZGYzYTg5OCAxMDA2NDQKLS0tIGEvbGlidXRpbHMvU3lzdGVtQ2xvY2suY3BwCisrKyBiL2xpYnV0aWxzL1N5c3RlbUNsb2NrLmNwcApAQCAtMzAsNyArMzAsNyBAQAogI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgogCiAjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL2xpYnV0aWxzL1RFU1RfTUFQUElORyBiL2xpYnV0aWxzL1RFU1RfTUFQUElORwppbmRleCBjOGVmNDVjLi40NzIxNDZmIDEwMDY0NAotLS0gYS9saWJ1dGlscy9URVNUX01BUFBJTkcKKysrIGIvbGlidXRpbHMvVEVTVF9NQVBQSU5HCkBAIC0yLDYgKzIsOSBAQAogICAicHJlc3VibWl0IjogWwogICAgIHsKICAgICAgICJuYW1lIjogImxpYnV0aWxzX3Rlc3QiCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJsaWJ1dGlsc19iaW5kZXJfdGVzdCIKICAgICB9CiAgIF0KIH0KZGlmZiAtLWdpdCBhL2xpYnV0aWxzL1RocmVhZHMuY3BwIGIvbGlidXRpbHMvVGhyZWFkcy5jcHAKaW5kZXggZTc1NmZlYy4uMTExZDQ2YSAxMDA2NDQKLS0tIGEvbGlidXRpbHMvVGhyZWFkcy5jcHAKKysrIGIvbGlidXRpbHMvVGhyZWFkcy5jcHAKQEAgLTM0LDEyICszNCw3IEBACiAjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CiAjZW5kaWYKIAotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaWYgZGVmaW5lZChfX0FORFJPSURfXykKLSNpbmNsdWRlIDxwcm9jZXNzZ3JvdXAvcHJvY2Vzc2dyb3VwLmg+Ci0jaW5jbHVkZSA8cHJvY2Vzc2dyb3VwL3NjaGVkX3BvbGljeS5oPgotI2VuZGlmCisjaW5jbHVkZSA8bG9nL2xvZy5oPgogCiAjaWYgZGVmaW5lZChfX0FORFJPSURfXykKICMgZGVmaW5lIF9fYW5kcm9pZF91bnVzZWQKQEAgLTY1LDcgKzYwLDcgQEAKICAqIFdlIGNyZWF0ZSBpdCAiZGV0YWNoZWQiLCBzbyBpdCBjbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmLgogICovCiAKLXR5cGVkZWYgdm9pZCogKCphbmRyb2lkX3B0aHJlYWRfZW50cnkpKHZvaWQqKTsKK3R5cGVkZWYgaW50ICgqYW5kcm9pZF9wdGhyZWFkX2VudHJ5KSh2b2lkKik7CiAKICNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKQogc3RydWN0IHRocmVhZF9kYXRhX3QgewpAQCAtOTMsNiArODgsMjAgQEAKIH07CiAjZW5kaWYKIAorLy8gQWRhcHRlZCBmcm9tIGJpb25pYydzIGltcGxtZW5ldGF0aW9uIG9mIHRyYW1wb2xpbmUgdG8gbWFrZSBDMTEgdGhyZF9jcmVhdGUKKy8vIHdvcmsgd2l0aCBwdGhyZWFkX2NyZWF0ZS4KK3N0cnVjdCBsaWJ1dGlsX3RocmVhZF9kYXRhIHsKKyAgYW5kcm9pZF9wdGhyZWFkX2VudHJ5IF9Ob25udWxsIGVudHJ5X2Z1bmM7CisgIHZvaWQqIF9OdWxsYWJsZSBlbnRyeV9mdW5jX2FyZzsKK307CisKK3N0YXRpYyB2b2lkKiBfTm9ubnVsbCBsaWJ1dGlsX3RocmVhZF90cmFtcG9saW5lKHZvaWQqIF9Ob25udWxsIGFyZykgeworICBsaWJ1dGlsX3RocmVhZF9kYXRhICpkYXRhX3B0ciA9IHN0YXRpY19jYXN0PGxpYnV0aWxfdGhyZWFkX2RhdGEqPihhcmcpOworICBpbnQgcmVzdWx0ID0gZGF0YV9wdHItPmVudHJ5X2Z1bmMoZGF0YV9wdHItPmVudHJ5X2Z1bmNfYXJnKTsKKyAgZGVsZXRlIGRhdGFfcHRyOworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oc3RhdGljX2Nhc3Q8dWludHB0cl90PihyZXN1bHQpKTsKK30KKwogdm9pZCBhbmRyb2lkU2V0VGhyZWFkTmFtZShjb25zdCBjaGFyKiBuYW1lKSB7CiAjaWYgZGVmaW5lZChfX2xpbnV4X18pCiAgICAgLy8gTWFjIE9TIGRvZXNuJ3QgaGF2ZSB0aGlzLCBhbmQgd2UgYnVpbGQgbGlidXRpbCBmb3IgdGhlIGhvc3QgdG9vCkBAIC0xNTAsOCArMTU5LDEzIEBACiAKICAgICBlcnJubyA9IDA7CiAgICAgcHRocmVhZF90IHRocmVhZDsKKworICAgIGxpYnV0aWxfdGhyZWFkX2RhdGEqIHB0aHJlYWRfYXJnID0gbmV3IGxpYnV0aWxfdGhyZWFkX2RhdGE7CisgICAgcHRocmVhZF9hcmctPmVudHJ5X2Z1bmMgPSBlbnRyeUZ1bmN0aW9uOworICAgIHB0aHJlYWRfYXJnLT5lbnRyeV9mdW5jX2FyZyA9IHVzZXJEYXRhOworCiAgICAgaW50IHJlc3VsdCA9IHB0aHJlYWRfY3JlYXRlKCZ0aHJlYWQsICZhdHRyLAotICAgICAgICAgICAgICAgICAgICAoYW5kcm9pZF9wdGhyZWFkX2VudHJ5KWVudHJ5RnVuY3Rpb24sIHVzZXJEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgbGlidXRpbF90aHJlYWRfdHJhbXBvbGluZSwgcHRocmVhZF9hcmcpOwogICAgIHB0aHJlYWRfYXR0cl9kZXN0cm95KCZhdHRyKTsKICAgICBpZiAocmVzdWx0ICE9IDApIHsKICAgICAgICAgQUxPR0UoImFuZHJvaWRDcmVhdGVSYXdUaHJlYWRFdGMgZmFpbGVkIChlbnRyeT0lcCwgcmVzPSVkLCAlcylcbiIKQEAgLTI5OSwxMSArMzEzLDYgQEAKIGludCBhbmRyb2lkU2V0VGhyZWFkUHJpb3JpdHkocGlkX3QgdGlkLCBpbnQgcHJpKQogewogICAgIGludCByYyA9IDA7Ci0gICAgaW50IGN1cnJfcHJpID0gZ2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCB0aWQpOwotCi0gICAgaWYgKGN1cnJfcHJpID09IHByaSkgewotICAgICAgICByZXR1cm4gcmM7Ci0gICAgfQogCiAgICAgaWYgKHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgdGlkLCBwcmkpIDwgMCkgewogICAgICAgICByYyA9IElOVkFMSURfT1BFUkFUSU9OOwpkaWZmIC0tZ2l0IGEvbGlidXRpbHMvVGltZXJzLmNwcCBiL2xpYnV0aWxzL1RpbWVycy5jcHAKaW5kZXggNGNmYWM1Ny4uOTgwODJjOSAxMDA2NDQKLS0tIGEvbGlidXRpbHMvVGltZXJzLmNwcAorKysgYi9saWJ1dGlscy9UaW1lcnMuY3BwCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSA8dGltZS5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KIAogc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgY2xvY2tfaWRfbWF4ID0gNTsKIApkaWZmIC0tZ2l0IGEvbGlidXRpbHMvVG9rZW5pemVyLmNwcCBiL2xpYnV0aWxzL1Rva2VuaXplci5jcHAKaW5kZXggYzNlYzE2NS4uYWEwOTdhZSAxMDA2NDQKLS0tIGEvbGlidXRpbHMvVG9rZW5pemVyLmNwcAorKysgYi9saWJ1dGlscy9Ub2tlbml6ZXIuY3BwCkBAIC0xOSw3ICsxOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvVG9rZW5pemVyLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KIAogI2lmbmRlZiBERUJVR19UT0tFTklaRVIKIC8vIEVuYWJsZXMgZGVidWcgb3V0cHV0IGZvciB0aGUgdG9rZW5pemVyLgpAQCAtNTAsMTUgKzUwLDE1IEBACiAgICAgKm91dFRva2VuaXplciA9IG51bGxwdHI7CiAKICAgICBpbnQgcmVzdWx0ID0gT0s7Ci0gICAgaW50IGZkID0gOjpvcGVuKGZpbGVuYW1lLnN0cmluZygpLCBPX1JET05MWSk7CisgICAgaW50IGZkID0gOjpvcGVuKGZpbGVuYW1lLmNfc3RyKCksIE9fUkRPTkxZKTsKICAgICBpZiAoZmQgPCAwKSB7CiAgICAgICAgIHJlc3VsdCA9IC1lcnJubzsKLSAgICAgICAgQUxPR0UoIkVycm9yIG9wZW5pbmcgZmlsZSAnJXMnOiAlcyIsIGZpbGVuYW1lLnN0cmluZygpLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBBTE9HRSgiRXJyb3Igb3BlbmluZyBmaWxlICclcyc6ICVzIiwgZmlsZW5hbWUuY19zdHIoKSwgc3RyZXJyb3IoZXJybm8pKTsKICAgICB9IGVsc2UgewogICAgICAgICBzdHJ1Y3Qgc3RhdCBzdGF0OwogICAgICAgICBpZiAoZnN0YXQoZmQsICZzdGF0KSkgewogICAgICAgICAgICAgcmVzdWx0ID0gLWVycm5vOwotICAgICAgICAgICAgQUxPR0UoIkVycm9yIGdldHRpbmcgc2l6ZSBvZiBmaWxlICclcyc6ICVzIiwgZmlsZW5hbWUuc3RyaW5nKCksIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICBBTE9HRSgiRXJyb3IgZ2V0dGluZyBzaXplIG9mIGZpbGUgJyVzJzogJXMiLCBmaWxlbmFtZS5jX3N0cigpLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCA9IHNpemVfdChzdGF0LnN0X3NpemUpOwogCkBAIC04MCw3ICs4MCw3IEBACiAgICAgICAgICAgICAgICAgc3NpemVfdCBucmQgPSByZWFkKGZkLCBidWZmZXIsIGxlbmd0aCk7CiAgICAgICAgICAgICAgICAgaWYgKG5yZCA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gLWVycm5vOwotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRXJyb3IgcmVhZGluZyBmaWxlICclcyc6ICVzIiwgZmlsZW5hbWUuc3RyaW5nKCksIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJFcnJvciByZWFkaW5nIGZpbGUgJyVzJzogJXMiLCBmaWxlbmFtZS5jX3N0cigpLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICAgICAgICAgICAgICBkZWxldGVbXSBidWZmZXI7CiAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG51bGxwdHI7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTEwNiw3ICsxMDYsNyBAQAogCiBTdHJpbmc4IFRva2VuaXplcjo6Z2V0TG9jYXRpb24oKSBjb25zdCB7CiAgICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJXM6JWQiLCBtRmlsZW5hbWUuc3RyaW5nKCksIG1MaW5lTnVtYmVyKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlczolZCIsIG1GaWxlbmFtZS5jX3N0cigpLCBtTGluZU51bWJlcik7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApkaWZmIC0tZ2l0IGEvbGlidXRpbHMvVW5pY29kZS5jcHAgYi9saWJ1dGlscy9Vbmljb2RlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZmY2Y3ZS4uMDAwMDAwMAotLS0gYS9saWJ1dGlscy9Vbmljb2RlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ4MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJ1bmljb2RlIgotCi0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPHV0aWxzL1VuaWNvZGUuaD4KLQotI2luY2x1ZGUgPGxvZy9sb2cuaD4KLQotZXh0ZXJuICJDIiB7Ci0KLXN0YXRpYyBjb25zdCBjaGFyMzJfdCBrQnl0ZU1hc2sgPSAweDAwMDAwMEJGOwotc3RhdGljIGNvbnN0IGNoYXIzMl90IGtCeXRlTWFyayA9IDB4MDAwMDAwODA7Ci0KLS8vIFN1cnJvZ2F0ZXMgYXJlbid0IHZhbGlkIGZvciBVVEYtMzIgY2hhcmFjdGVycywgc28gZGVmaW5lIHNvbWUKLS8vIGNvbnN0YW50cyB0aGF0IHdpbGwgbGV0IHVzIHNjcmVlbiB0aGVtIG91dC4KLXN0YXRpYyBjb25zdCBjaGFyMzJfdCBrVW5pY29kZVN1cnJvZ2F0ZUhpZ2hTdGFydCAgPSAweDAwMDBEODAwOwotLy8gVW51c2VkLCBoZXJlIGZvciBjb21wbGV0ZW5lc3M6Ci0vLyBzdGF0aWMgY29uc3QgY2hhcjMyX3Qga1VuaWNvZGVTdXJyb2dhdGVIaWdoRW5kID0gMHgwMDAwREJGRjsKLS8vIHN0YXRpYyBjb25zdCBjaGFyMzJfdCBrVW5pY29kZVN1cnJvZ2F0ZUxvd1N0YXJ0ID0gMHgwMDAwREMwMDsKLXN0YXRpYyBjb25zdCBjaGFyMzJfdCBrVW5pY29kZVN1cnJvZ2F0ZUxvd0VuZCAgICAgPSAweDAwMDBERkZGOwotc3RhdGljIGNvbnN0IGNoYXIzMl90IGtVbmljb2RlU3Vycm9nYXRlU3RhcnQgICAgICA9IGtVbmljb2RlU3Vycm9nYXRlSGlnaFN0YXJ0Owotc3RhdGljIGNvbnN0IGNoYXIzMl90IGtVbmljb2RlU3Vycm9nYXRlRW5kICAgICAgICA9IGtVbmljb2RlU3Vycm9nYXRlTG93RW5kOwotc3RhdGljIGNvbnN0IGNoYXIzMl90IGtVbmljb2RlTWF4Q29kZXBvaW50ICAgICAgICA9IDB4MDAxMEZGRkY7Ci0KLS8vIE1hc2sgdXNlZCB0byBzZXQgYXBwcm9wcmlhdGUgYml0cyBpbiBmaXJzdCBieXRlIG9mIFVURi04IHNlcXVlbmNlLAotLy8gaW5kZXhlZCBieSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHNlcXVlbmNlLgotLy8gMHh4eHh4eHgKLS8vIC0+ICgwMC03ZikgN2JpdC4gQml0IG1hc2sgZm9yIHRoZSBmaXJzdCBieXRlIGlzIDB4MDAwMDAwMDAKLS8vIDExMHl5eXl4IDEweHh4eHh4Ci0vLyAtPiAoYzAtZGYpKDgwLWJmKSAxMWJpdC4gQml0IG1hc2sgaXMgMHgwMDAwMDBDMAotLy8gMTExMHl5eXkgMTB5eHh4eHggMTB4eHh4eHgKLS8vIC0+IChlMC1lZikoODAtYmYpKDgwLWJmKSAxNmJpdC4gQml0IG1hc2sgaXMgMHgwMDAwMDBFMAotLy8gMTExMTB5eXkgMTB5eXh4eHggMTB4eHh4eHggMTB4eHh4eHgKLS8vIC0+IChmMC1mNykoODAtYmYpKDgwLWJmKSg4MC1iZikgMjFiaXQuIEJpdCBtYXNrIGlzIDB4MDAwMDAwRjAKLXN0YXRpYyBjb25zdCBjaGFyMzJfdCBrRmlyc3RCeXRlTWFya1tdID0gewotICAgIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwQzAsIDB4MDAwMDAwRTAsIDB4MDAwMDAwRjAKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBVVEYtMzIKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8qKgotICogUmV0dXJuIG51bWJlciBvZiBVVEYtOCBieXRlcyByZXF1aXJlZCBmb3IgdGhlIGNoYXJhY3Rlci4gSWYgdGhlIGNoYXJhY3RlcgotICogaXMgaW52YWxpZCwgcmV0dXJuIHNpemUgb2YgMC4KLSAqLwotc3RhdGljIGlubGluZSBzaXplX3QgdXRmMzJfY29kZXBvaW50X3V0ZjhfbGVuZ3RoKGNoYXIzMl90IHNyY0NoYXIpCi17Ci0gICAgLy8gRmlndXJlIG91dCBob3cgbWFueSBieXRlcyB0aGUgcmVzdWx0IHdpbGwgcmVxdWlyZS4KLSAgICBpZiAoc3JjQ2hhciA8IDB4MDAwMDAwODApIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfSBlbHNlIGlmIChzcmNDaGFyIDwgMHgwMDAwMDgwMCkgewotICAgICAgICByZXR1cm4gMjsKLSAgICB9IGVsc2UgaWYgKHNyY0NoYXIgPCAweDAwMDEwMDAwKSB7Ci0gICAgICAgIGlmICgoc3JjQ2hhciA8IGtVbmljb2RlU3Vycm9nYXRlU3RhcnQpIHx8IChzcmNDaGFyID4ga1VuaWNvZGVTdXJyb2dhdGVFbmQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFN1cnJvZ2F0ZXMgYXJlIGludmFsaWQgVVRGLTMyIGNoYXJhY3RlcnMuCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICAvLyBNYXggY29kZSBwb2ludCBmb3IgVW5pY29kZSBpcyAweDAwMTBGRkZGLgotICAgIGVsc2UgaWYgKHNyY0NoYXIgPD0ga1VuaWNvZGVNYXhDb2RlcG9pbnQpIHsKLSAgICAgICAgcmV0dXJuIDQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gSW52YWxpZCBVVEYtMzIgY2hhcmFjdGVyLgotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLS8vIFdyaXRlIG91dCB0aGUgc291cmNlIGNoYXJhY3RlciB0byA8ZHN0UD4uCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCB1dGYzMl9jb2RlcG9pbnRfdG9fdXRmOCh1aW50OF90KiBkc3RQLCBjaGFyMzJfdCBzcmNDaGFyLCBzaXplX3QgYnl0ZXMpCi17Ci0gICAgZHN0UCArPSBieXRlczsKLSAgICBzd2l0Y2ggKGJ5dGVzKQotICAgIHsgICAvKiBub3RlOiBldmVyeXRoaW5nIGZhbGxzIHRocm91Z2guICovCi0gICAgICAgIGNhc2UgNDogKi0tZHN0UCA9ICh1aW50OF90KSgoc3JjQ2hhciB8IGtCeXRlTWFyaykgJiBrQnl0ZU1hc2spOyBzcmNDaGFyID4+PSA2OwotICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7Ci0gICAgICAgIGNhc2UgMzogKi0tZHN0UCA9ICh1aW50OF90KSgoc3JjQ2hhciB8IGtCeXRlTWFyaykgJiBrQnl0ZU1hc2spOyBzcmNDaGFyID4+PSA2OwotICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7Ci0gICAgICAgIGNhc2UgMjogKi0tZHN0UCA9ICh1aW50OF90KSgoc3JjQ2hhciB8IGtCeXRlTWFyaykgJiBrQnl0ZU1hc2spOyBzcmNDaGFyID4+PSA2OwotICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7Ci0gICAgICAgIGNhc2UgMTogKi0tZHN0UCA9ICh1aW50OF90KShzcmNDaGFyIHwga0ZpcnN0Qnl0ZU1hcmtbYnl0ZXNdKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50MzJfdCB1dGYzMl9hdF9pbnRlcm5hbChjb25zdCBjaGFyKiBjdXIsIHNpemVfdCAqbnVtX3JlYWQpCi17Ci0gICAgY29uc3QgY2hhciBmaXJzdF9jaGFyID0gKmN1cjsKLSAgICBpZiAoKGZpcnN0X2NoYXIgJiAweDgwKSA9PSAwKSB7IC8vIEFTQ0lJCi0gICAgICAgICpudW1fcmVhZCA9IDE7Ci0gICAgICAgIHJldHVybiAqY3VyOwotICAgIH0KLSAgICBjdXIrKzsKLSAgICBjaGFyMzJfdCBtYXNrLCB0b19pZ25vcmVfbWFzazsKLSAgICBzaXplX3QgbnVtX3RvX3JlYWQgPSAwOwotICAgIGNoYXIzMl90IHV0ZjMyID0gZmlyc3RfY2hhcjsKLSAgICBmb3IgKG51bV90b19yZWFkID0gMSwgbWFzayA9IDB4NDAsIHRvX2lnbm9yZV9tYXNrID0gMHhGRkZGRkY4MDsKLSAgICAgICAgIChmaXJzdF9jaGFyICYgbWFzayk7Ci0gICAgICAgICBudW1fdG9fcmVhZCsrLCB0b19pZ25vcmVfbWFzayB8PSBtYXNrLCBtYXNrID4+PSAxKSB7Ci0gICAgICAgIC8vIDB4M0YgPT0gMDAxMTExMTEKLSAgICAgICAgdXRmMzIgPSAodXRmMzIgPDwgNikgKyAoKmN1cisrICYgMHgzRik7Ci0gICAgfQotICAgIHRvX2lnbm9yZV9tYXNrIHw9IG1hc2s7Ci0gICAgdXRmMzIgJj0gfih0b19pZ25vcmVfbWFzayA8PCAoNiAqIChudW1fdG9fcmVhZCAtIDEpKSk7Ci0KLSAgICAqbnVtX3JlYWQgPSBudW1fdG9fcmVhZDsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4odXRmMzIpOwotfQotCi1pbnQzMl90IHV0ZjMyX2Zyb21fdXRmOF9hdChjb25zdCBjaGFyICpzcmMsIHNpemVfdCBzcmNfbGVuLCBzaXplX3QgaW5kZXgsIHNpemVfdCAqbmV4dF9pbmRleCkKLXsKLSAgICBpZiAoaW5kZXggPj0gc3JjX2xlbikgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHNpemVfdCB1bnVzZWRfaW5kZXg7Ci0gICAgaWYgKG5leHRfaW5kZXggPT0gbnVsbHB0cikgewotICAgICAgICBuZXh0X2luZGV4ID0gJnVudXNlZF9pbmRleDsKLSAgICB9Ci0gICAgc2l6ZV90IG51bV9yZWFkOwotICAgIGludDMyX3QgcmV0ID0gdXRmMzJfYXRfaW50ZXJuYWwoc3JjICsgaW5kZXgsICZudW1fcmVhZCk7Ci0gICAgaWYgKHJldCA+PSAwKSB7Ci0gICAgICAgICpuZXh0X2luZGV4ID0gaW5kZXggKyBudW1fcmVhZDsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zc2l6ZV90IHV0ZjMyX3RvX3V0ZjhfbGVuZ3RoKGNvbnN0IGNoYXIzMl90ICpzcmMsIHNpemVfdCBzcmNfbGVuKQotewotICAgIGlmIChzcmMgPT0gbnVsbHB0ciB8fCBzcmNfbGVuID09IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHNpemVfdCByZXQgPSAwOwotICAgIGNvbnN0IGNoYXIzMl90ICplbmQgPSBzcmMgKyBzcmNfbGVuOwotICAgIHdoaWxlIChzcmMgPCBlbmQpIHsKLSAgICAgICAgc2l6ZV90IGNoYXJfbGVuID0gdXRmMzJfY29kZXBvaW50X3V0ZjhfbGVuZ3RoKCpzcmMrKyk7Ci0gICAgICAgIGlmIChTU0laRV9NQVggLSBjaGFyX2xlbiA8IHJldCkgewotICAgICAgICAgICAgLy8gSWYgdGhpcyBoYXBwZW5zLCB3ZSB3b3VsZCBvdmVyZmxvdyB0aGUgc3NpemVfdCB0eXBlIHdoZW4KLSAgICAgICAgICAgIC8vIHJldHVybmluZyBmcm9tIHRoaXMgZnVuY3Rpb24sIHNvIHdlIGNhbm5vdCBleHByZXNzIGhvdwotICAgICAgICAgICAgLy8gbG9uZyB0aGlzIHN0cmluZyBpcyBpbiBhbiBzc2l6ZV90LgotICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzNzcyMzAyNiIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIHJldCArPSBjaGFyX2xlbjsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotdm9pZCB1dGYzMl90b191dGY4KGNvbnN0IGNoYXIzMl90KiBzcmMsIHNpemVfdCBzcmNfbGVuLCBjaGFyKiBkc3QsIHNpemVfdCBkc3RfbGVuKQotewotICAgIGlmIChzcmMgPT0gbnVsbHB0ciB8fCBzcmNfbGVuID09IDAgfHwgZHN0ID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGNvbnN0IGNoYXIzMl90ICpjdXJfdXRmMzIgPSBzcmM7Ci0gICAgY29uc3QgY2hhcjMyX3QgKmVuZF91dGYzMiA9IHNyYyArIHNyY19sZW47Ci0gICAgY2hhciAqY3VyID0gZHN0OwotICAgIHdoaWxlIChjdXJfdXRmMzIgPCBlbmRfdXRmMzIpIHsKLSAgICAgICAgc2l6ZV90IGxlbiA9IHV0ZjMyX2NvZGVwb2ludF91dGY4X2xlbmd0aCgqY3VyX3V0ZjMyKTsKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihkc3RfbGVuIDwgbGVuLCAiJXp1IDwgJXp1IiwgZHN0X2xlbiwgbGVuKTsKLSAgICAgICAgdXRmMzJfY29kZXBvaW50X3RvX3V0ZjgoKHVpbnQ4X3QgKiljdXIsICpjdXJfdXRmMzIrKywgbGVuKTsKLSAgICAgICAgY3VyICs9IGxlbjsKLSAgICAgICAgZHN0X2xlbiAtPSBsZW47Ci0gICAgfQotICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZHN0X2xlbiA8IDEsICJkc3RfbGVuIDwgMTogJXp1IDwgMSIsIGRzdF9sZW4pOwotICAgICpjdXIgPSAnXDAnOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVVRGLTE2Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pbnQgc3RyY21wMTYoY29uc3QgY2hhcjE2X3QgKnMxLCBjb25zdCBjaGFyMTZfdCAqczIpCi17Ci0gIGNoYXIxNl90IGNoOwotICBpbnQgZCA9IDA7Ci0KLSAgd2hpbGUgKCAxICkgewotICAgIGQgPSAoaW50KShjaCA9ICpzMSsrKSAtIChpbnQpKnMyKys7Ci0gICAgaWYgKCBkIHx8ICFjaCApCi0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiBkOwotfQotCi1pbnQgc3RybmNtcDE2KGNvbnN0IGNoYXIxNl90ICpzMSwgY29uc3QgY2hhcjE2X3QgKnMyLCBzaXplX3QgbikKLXsKLSAgY2hhcjE2X3QgY2g7Ci0gIGludCBkID0gMDsKLQotICBpZiAobiA9PSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBkbyB7Ci0gICAgZCA9IChpbnQpKGNoID0gKnMxKyspIC0gKGludCkqczIrKzsKLSAgICBpZiAoIGQgfHwgIWNoICkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICB9IHdoaWxlICgtLW4pOwotCi0gIHJldHVybiBkOwotfQotCi1zaXplX3Qgc3RybGVuMTYoY29uc3QgY2hhcjE2X3QgKnMpCi17Ci0gIGNvbnN0IGNoYXIxNl90ICpzcyA9IHM7Ci0gIHdoaWxlICggKnNzICkKLSAgICBzcysrOwotICByZXR1cm4gc3MtczsKLX0KLQotc2l6ZV90IHN0cm5sZW4xNihjb25zdCBjaGFyMTZfdCAqcywgc2l6ZV90IG1heGxlbikKLXsKLSAgY29uc3QgY2hhcjE2X3QgKnNzID0gczsKLQotICAvKiBJbXBvcnRhbnQ6IHRoZSBtYXhsZW4gdGVzdCBtdXN0IHByZWNlZGUgdGhlIHJlZmVyZW5jZSB0aHJvdWdoIHNzOwotICAgICBzaW5jZSB0aGUgYnl0ZSBiZXlvbmQgdGhlIG1heGltdW0gbWF5IHNlZ2ZhdWx0ICovCi0gIHdoaWxlICgobWF4bGVuID4gMCkgJiYgKnNzKSB7Ci0gICAgc3MrKzsKLSAgICBtYXhsZW4tLTsKLSAgfQotICByZXR1cm4gc3MtczsKLX0KLQotY2hhcjE2X3QqIHN0cnN0cjE2KGNvbnN0IGNoYXIxNl90KiBzcmMsIGNvbnN0IGNoYXIxNl90KiB0YXJnZXQpCi17Ci0gICAgY29uc3QgY2hhcjE2X3QgbmVlZGxlID0gKnRhcmdldDsKLSAgICBpZiAobmVlZGxlID09ICdcMCcpIHJldHVybiAoY2hhcjE2X3QqKXNyYzsKLQotICAgIGNvbnN0IHNpemVfdCB0YXJnZXRfbGVuID0gc3RybGVuMTYoKyt0YXJnZXQpOwotICAgIGRvIHsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgaWYgKCpzcmMgPT0gJ1wwJykgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlICgqc3JjKysgIT0gbmVlZGxlKTsKLSAgICB9IHdoaWxlIChzdHJuY21wMTYoc3JjLCB0YXJnZXQsIHRhcmdldF9sZW4pICE9IDApOwotICAgIHNyYy0tOwotCi0gICAgcmV0dXJuIChjaGFyMTZfdCopc3JjOwotfQotCi1pbnQgc3RyemNtcDE2KGNvbnN0IGNoYXIxNl90ICpzMSwgc2l6ZV90IG4xLCBjb25zdCBjaGFyMTZfdCAqczIsIHNpemVfdCBuMikKLXsKLSAgICBjb25zdCBjaGFyMTZfdCogZTEgPSBzMStuMTsKLSAgICBjb25zdCBjaGFyMTZfdCogZTIgPSBzMituMjsKLQotICAgIHdoaWxlIChzMSA8IGUxICYmIHMyIDwgZTIpIHsKLSAgICAgICAgY29uc3QgaW50IGQgPSAoaW50KSpzMSsrIC0gKGludCkqczIrKzsKLSAgICAgICAgaWYgKGQpIHsKLSAgICAgICAgICAgIHJldHVybiBkOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG4xIDwgbjIKLSAgICAgICAgPyAoMCAtIChpbnQpKnMyKQotICAgICAgICA6IChuMSA+IG4yCi0gICAgICAgICAgID8gKChpbnQpKnMxIC0gMCkKLSAgICAgICAgICAgOiAwKTsKLX0KLQotdm9pZCB1dGYxNl90b191dGY4KGNvbnN0IGNoYXIxNl90KiBzcmMsIHNpemVfdCBzcmNfbGVuLCBjaGFyKiBkc3QsIHNpemVfdCBkc3RfbGVuKQotewotICAgIGlmIChzcmMgPT0gbnVsbHB0ciB8fCBzcmNfbGVuID09IDAgfHwgZHN0ID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGNvbnN0IGNoYXIxNl90KiBjdXJfdXRmMTYgPSBzcmM7Ci0gICAgY29uc3QgY2hhcjE2X3QqIGNvbnN0IGVuZF91dGYxNiA9IHNyYyArIHNyY19sZW47Ci0gICAgY2hhciAqY3VyID0gZHN0OwotICAgIHdoaWxlIChjdXJfdXRmMTYgPCBlbmRfdXRmMTYpIHsKLSAgICAgICAgY2hhcjMyX3QgdXRmMzI7Ci0gICAgICAgIC8vIHN1cnJvZ2F0ZSBwYWlycwotICAgICAgICBpZigoKmN1cl91dGYxNiAmIDB4RkMwMCkgPT0gMHhEODAwICYmIChjdXJfdXRmMTYgKyAxKSA8IGVuZF91dGYxNgotICAgICAgICAgICAgICAgICYmICgqKGN1cl91dGYxNiArIDEpICYgMHhGQzAwKSA9PSAweERDMDApIHsKLSAgICAgICAgICAgIHV0ZjMyID0gKCpjdXJfdXRmMTYrKyAtIDB4RDgwMCkgPDwgMTA7Ci0gICAgICAgICAgICB1dGYzMiB8PSAqY3VyX3V0ZjE2KysgLSAweERDMDA7Ci0gICAgICAgICAgICB1dGYzMiArPSAweDEwMDAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdXRmMzIgPSAoY2hhcjMyX3QpICpjdXJfdXRmMTYrKzsKLSAgICAgICAgfQotICAgICAgICBjb25zdCBzaXplX3QgbGVuID0gdXRmMzJfY29kZXBvaW50X3V0ZjhfbGVuZ3RoKHV0ZjMyKTsKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihkc3RfbGVuIDwgbGVuLCAiJXp1IDwgJXp1IiwgZHN0X2xlbiwgbGVuKTsKLSAgICAgICAgdXRmMzJfY29kZXBvaW50X3RvX3V0ZjgoKHVpbnQ4X3QqKWN1ciwgdXRmMzIsIGxlbik7Ci0gICAgICAgIGN1ciArPSBsZW47Ci0gICAgICAgIGRzdF9sZW4gLT0gbGVuOwotICAgIH0KLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGRzdF9sZW4gPCAxLCAiJXp1IDwgMSIsIGRzdF9sZW4pOwotICAgICpjdXIgPSAnXDAnOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVVRGLTgKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXNzaXplX3QgdXRmMTZfdG9fdXRmOF9sZW5ndGgoY29uc3QgY2hhcjE2X3QgKnNyYywgc2l6ZV90IHNyY19sZW4pCi17Ci0gICAgaWYgKHNyYyA9PSBudWxscHRyIHx8IHNyY19sZW4gPT0gMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgc2l6ZV90IHJldCA9IDA7Ci0gICAgY29uc3QgY2hhcjE2X3QqIGNvbnN0IGVuZCA9IHNyYyArIHNyY19sZW47Ci0gICAgd2hpbGUgKHNyYyA8IGVuZCkgewotICAgICAgICBzaXplX3QgY2hhcl9sZW47Ci0gICAgICAgIGlmICgoKnNyYyAmIDB4RkMwMCkgPT0gMHhEODAwICYmIChzcmMgKyAxKSA8IGVuZAotICAgICAgICAgICAgICAgICYmICgqKHNyYyArIDEpICYgMHhGQzAwKSA9PSAweERDMDApIHsKLSAgICAgICAgICAgIC8vIHN1cnJvZ2F0ZSBwYWlycyBhcmUgYWx3YXlzIDQgYnl0ZXMuCi0gICAgICAgICAgICBjaGFyX2xlbiA9IDQ7Ci0gICAgICAgICAgICBzcmMgKz0gMjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNoYXJfbGVuID0gdXRmMzJfY29kZXBvaW50X3V0ZjhfbGVuZ3RoKChjaGFyMzJfdCkqc3JjKyspOwotICAgICAgICB9Ci0gICAgICAgIGlmIChTU0laRV9NQVggLSBjaGFyX2xlbiA8IHJldCkgewotICAgICAgICAgICAgLy8gSWYgdGhpcyBoYXBwZW5zLCB3ZSB3b3VsZCBvdmVyZmxvdyB0aGUgc3NpemVfdCB0eXBlIHdoZW4KLSAgICAgICAgICAgIC8vIHJldHVybmluZyBmcm9tIHRoaXMgZnVuY3Rpb24sIHNvIHdlIGNhbm5vdCBleHByZXNzIGhvdwotICAgICAgICAgICAgLy8gbG9uZyB0aGlzIHN0cmluZyBpcyBpbiBhbiBzc2l6ZV90LgotICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzNzcyMzAyNiIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIHJldCArPSBjaGFyX2xlbjsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIDEtNCBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGxlYWRpbmcgYml0cy4KLSAqCi0gKiAxMTExIC0+IDQKLSAqIDExMTAgLT4gMwotICogMTEweCAtPiAyCi0gKiAxMHh4IC0+IDEKLSAqIDB4eHggLT4gMQotICovCi1zdGF0aWMgaW5saW5lIHNpemVfdCB1dGY4X2NvZGVwb2ludF9sZW4odWludDhfdCBjaCkKLXsKLSAgICByZXR1cm4gKCgweGU1MDAwMDAwID4+ICgoY2ggPj4gMykgJiAweDFlKSkgJiAzKSArIDE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB1dGY4X3NoaWZ0X2FuZF9tYXNrKHVpbnQzMl90KiBjb2RlUG9pbnQsIGNvbnN0IHVpbnQ4X3QgYnl0ZSkKLXsKLSAgICAqY29kZVBvaW50IDw8PSA2OwotICAgICpjb2RlUG9pbnQgfD0gMHgzRiAmIGJ5dGU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdWludDMyX3QgdXRmOF90b191dGYzMl9jb2RlcG9pbnQoY29uc3QgdWludDhfdCAqc3JjLCBzaXplX3QgbGVuZ3RoKQotewotICAgIHVpbnQzMl90IHVuaWNvZGU7Ci0KLSAgICBzd2l0Y2ggKGxlbmd0aCkKLSAgICB7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIHJldHVybiBzcmNbMF07Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIHVuaWNvZGUgPSBzcmNbMF0gJiAweDFmOwotICAgICAgICAgICAgdXRmOF9zaGlmdF9hbmRfbWFzaygmdW5pY29kZSwgc3JjWzFdKTsKLSAgICAgICAgICAgIHJldHVybiB1bmljb2RlOwotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICB1bmljb2RlID0gc3JjWzBdICYgMHgwZjsKLSAgICAgICAgICAgIHV0Zjhfc2hpZnRfYW5kX21hc2soJnVuaWNvZGUsIHNyY1sxXSk7Ci0gICAgICAgICAgICB1dGY4X3NoaWZ0X2FuZF9tYXNrKCZ1bmljb2RlLCBzcmNbMl0pOwotICAgICAgICAgICAgcmV0dXJuIHVuaWNvZGU7Ci0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIHVuaWNvZGUgPSBzcmNbMF0gJiAweDA3OwotICAgICAgICAgICAgdXRmOF9zaGlmdF9hbmRfbWFzaygmdW5pY29kZSwgc3JjWzFdKTsKLSAgICAgICAgICAgIHV0Zjhfc2hpZnRfYW5kX21hc2soJnVuaWNvZGUsIHNyY1syXSk7Ci0gICAgICAgICAgICB1dGY4X3NoaWZ0X2FuZF9tYXNrKCZ1bmljb2RlLCBzcmNbM10pOwotICAgICAgICAgICAgcmV0dXJuIHVuaWNvZGU7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gMHhmZmZmOwotICAgIH0KLQotICAgIC8vcHJpbnRmKCJDaGFyIGF0ICVwOiBsZW49JWQsIHV0Zi0xNj0lcFxuIiwgc3JjLCBsZW5ndGgsICh2b2lkKilyZXN1bHQpOwotfQotCi1zc2l6ZV90IHV0ZjhfdG9fdXRmMTZfbGVuZ3RoKGNvbnN0IHVpbnQ4X3QqIHU4c3RyLCBzaXplX3QgdThsZW4sIGJvb2wgb3ZlcnJlYWRJc0ZhdGFsKQotewotICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHU4ZW5kID0gdThzdHIgKyB1OGxlbjsKLSAgICBjb25zdCB1aW50OF90KiB1OGN1ciA9IHU4c3RyOwotCi0gICAgLyogVmFsaWRhdGUgdGhhdCB0aGUgVVRGLTggaXMgdGhlIGNvcnJlY3QgbGVuICovCi0gICAgc2l6ZV90IHUxNm1lYXN1cmVkTGVuID0gMDsKLSAgICB3aGlsZSAodThjdXIgPCB1OGVuZCkgewotICAgICAgICB1MTZtZWFzdXJlZExlbisrOwotICAgICAgICBpbnQgdThjaGFyTGVuID0gdXRmOF9jb2RlcG9pbnRfbGVuKCp1OGN1cik7Ci0gICAgICAgIC8vIE1hbGZvcm1lZCB1dGY4LCBzb21lIGNoYXJhY3RlcnMgYXJlIGJleW9uZCB0aGUgZW5kLgotICAgICAgICAvLyBDYXNlczoKLSAgICAgICAgLy8gSWYgdThjaGFyTGVuID09IDEsIHRoaXMgYmVjb21lcyB1OGN1ciA+PSB1OGVuZCwgd2hpY2ggY2Fubm90IGhhcHBlbiBhcyB1OGN1ciA8IHU4ZW5kLAotICAgICAgICAvLyB0aGVuIHRoaXMgY29uZGl0aW9uIGZhaWwgYW5kIHdlIGNvbnRpbnVlLCBhcyBleHBlY3RlZC4KLSAgICAgICAgLy8gSWYgdThjaGFyTGVuID09IDIsIHRoaXMgYmVjb21lcyB1OGN1ciArIDEgPj0gdThlbmQsIHdoaWNoIGZhaWxzIG9ubHkgaWYKLSAgICAgICAgLy8gdThjdXIgPT0gdThlbmQgLSAxLCB0aGF0IGlzLCB0aGVyZSB3YXMgb25seSBvbmUgcmVtYWluaW5nIGNoYXJhY3RlciB0byByZWFkIGJ1dCB3ZSBuZWVkCi0gICAgICAgIC8vIDIgb2YgdGhlbS4gVGhpcyBjb25kaXRpb24gaG9sZHMgYW5kIHdlIHJldHVybiAtMSwgYXMgZXhwZWN0ZWQuCi0gICAgICAgIGlmICh1OGN1ciArIHU4Y2hhckxlbiAtIDEgPj0gdThlbmQpIHsKLSAgICAgICAgICAgIGlmIChvdmVycmVhZElzRmF0YWwpIHsKLSAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJBdHRlbXB0IHRvIG92ZXJyZWFkIGNvbXB1dGluZyBsZW5ndGggb2YgdXRmOCBzdHJpbmciKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHVpbnQzMl90IGNvZGVwb2ludCA9IHV0ZjhfdG9fdXRmMzJfY29kZXBvaW50KHU4Y3VyLCB1OGNoYXJMZW4pOwotICAgICAgICBpZiAoY29kZXBvaW50ID4gMHhGRkZGKSB1MTZtZWFzdXJlZExlbisrOyAvLyB0aGlzIHdpbGwgYmUgYSBzdXJyb2dhdGUgcGFpciBpbiB1dGYxNgotICAgICAgICB1OGN1ciArPSB1OGNoYXJMZW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFrZSBzdXJlIHRoYXQgd2UgZW5kZWQgd2hlcmUgd2UgdGhvdWdodCB3ZSB3b3VsZCBhbmQgdGhlIG91dHB1dCBVVEYtMTYKLSAgICAgKiB3aWxsIGJlIGV4YWN0bHkgaG93IGxvbmcgd2Ugd2VyZSB0b2xkIGl0IHdvdWxkIGJlLgotICAgICAqLwotICAgIGlmICh1OGN1ciAhPSB1OGVuZCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcmV0dXJuIHUxNm1lYXN1cmVkTGVuOwotfQotCi1jaGFyMTZfdCogdXRmOF90b191dGYxNihjb25zdCB1aW50OF90KiB1OHN0ciwgc2l6ZV90IHU4bGVuLCBjaGFyMTZfdCogdTE2c3RyLCBzaXplX3QgdTE2bGVuKSB7Ci0gICAgLy8gQSB2YWx1ZSA+IFNTSVpFX01BWCBpcyBwcm9iYWJseSBhIG5lZ2F0aXZlIHZhbHVlIHJldHVybmVkIGFzIGFuIGVycm9yIGFuZCBjYXN0ZWQuCi0gICAgTE9HX0FMV0FZU19GQVRBTF9JRih1MTZsZW4gPT0gMCB8fCB1MTZsZW4gPiBTU0laRV9NQVgsICJ1MTZsZW4gaXMgJXp1IiwgdTE2bGVuKTsKLSAgICBjaGFyMTZfdCogZW5kID0gdXRmOF90b191dGYxNl9ub19udWxsX3Rlcm1pbmF0b3IodThzdHIsIHU4bGVuLCB1MTZzdHIsIHUxNmxlbiAtIDEpOwotICAgICplbmQgPSAwOwotICAgIHJldHVybiBlbmQ7Ci19Ci0KLWNoYXIxNl90KiB1dGY4X3RvX3V0ZjE2X25vX251bGxfdGVybWluYXRvcigKLSAgICAgICAgY29uc3QgdWludDhfdCogc3JjLCBzaXplX3Qgc3JjTGVuLCBjaGFyMTZfdCogZHN0LCBzaXplX3QgZHN0TGVuKSB7Ci0gICAgaWYgKGRzdExlbiA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBkc3Q7Ci0gICAgfQotICAgIC8vIEEgdmFsdWUgPiBTU0laRV9NQVggaXMgcHJvYmFibHkgYSBuZWdhdGl2ZSB2YWx1ZSByZXR1cm5lZCBhcyBhbiBlcnJvciBhbmQgY2FzdGVkLgotICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZHN0TGVuID4gU1NJWkVfTUFYLCAiZHN0TGVuIGlzICV6dSIsIGRzdExlbik7Ci0gICAgY29uc3QgdWludDhfdCogY29uc3QgdThlbmQgPSBzcmMgKyBzcmNMZW47Ci0gICAgY29uc3QgdWludDhfdCogdThjdXIgPSBzcmM7Ci0gICAgY29uc3QgY2hhcjE2X3QqIGNvbnN0IHUxNmVuZCA9IGRzdCArIGRzdExlbjsKLSAgICBjaGFyMTZfdCogdTE2Y3VyID0gZHN0OwotCi0gICAgd2hpbGUgKHU4Y3VyIDwgdThlbmQgJiYgdTE2Y3VyIDwgdTE2ZW5kKSB7Ci0gICAgICAgIHNpemVfdCB1OGxlbiA9IHV0ZjhfY29kZXBvaW50X2xlbigqdThjdXIpOwotICAgICAgICB1aW50MzJfdCBjb2RlcG9pbnQgPSB1dGY4X3RvX3V0ZjMyX2NvZGVwb2ludCh1OGN1ciwgdThsZW4pOwotCi0gICAgICAgIC8vIENvbnZlcnQgdGhlIFVURjMyIGNvZGVwb2ludCB0byBvbmUgb3IgbW9yZSBVVEYxNiBjb2RlcG9pbnRzCi0gICAgICAgIGlmIChjb2RlcG9pbnQgPD0gMHhGRkZGKSB7Ci0gICAgICAgICAgICAvLyBTaW5nbGUgVVRGMTYgY2hhcmFjdGVyCi0gICAgICAgICAgICAqdTE2Y3VyKysgPSAoY2hhcjE2X3QpIGNvZGVwb2ludDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIE11bHRpcGxlIFVURjE2IGNoYXJhY3RlcnMgd2l0aCBzdXJyb2dhdGVzCi0gICAgICAgICAgICBjb2RlcG9pbnQgPSBjb2RlcG9pbnQgLSAweDEwMDAwOwotICAgICAgICAgICAgKnUxNmN1cisrID0gKGNoYXIxNl90KSAoKGNvZGVwb2ludCA+PiAxMCkgKyAweEQ4MDApOwotICAgICAgICAgICAgaWYgKHUxNmN1ciA+PSB1MTZlbmQpIHsKLSAgICAgICAgICAgICAgICAvLyBPb29wcy4uLiAgbm90IGVub3VnaCByb29tIGZvciB0aGlzIHN1cnJvZ2F0ZSBwYWlyLgotICAgICAgICAgICAgICAgIHJldHVybiB1MTZjdXItMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICp1MTZjdXIrKyA9IChjaGFyMTZfdCkgKChjb2RlcG9pbnQgJiAweDNGRikgKyAweERDMDApOwotICAgICAgICB9Ci0KLSAgICAgICAgdThjdXIgKz0gdThsZW47Ci0gICAgfQotICAgIHJldHVybiB1MTZjdXI7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2xpYnV0aWxzL1ZlY3Rvcl9mdXp6LmNwcCBiL2xpYnV0aWxzL1ZlY3Rvcl9mdXp6LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZkZjA1MS4uMDAwMDAwMAotLS0gYS9saWJ1dGlscy9WZWN0b3JfZnV6ei5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2luY2x1ZGUgImZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaCIKLSNpbmNsdWRlICJ1dGlscy9WZWN0b3IuaCIKLXN0YXRpYyBjb25zdGV4cHIgdWludDE2X3QgTUFYX1ZFQ19TSVpFID0gNTAwMDsKLQotdm9pZCBydW5WZWN0b3JGdXp6KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgRnV6emVkRGF0YVByb3ZpZGVyIGRhdGFQcm92aWRlcihkYXRhLCBzaXplKTsKLSAgICBhbmRyb2lkOjpWZWN0b3I8dWludDhfdD4gdmVjID0gYW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+KCk7Ci0gICAgLy8gV2Ugd2FudCB0byB0ZXN0IGhhbmRsaW5nIG9mIHNpemVvZiBhcyB3ZWxsLgotICAgIGFuZHJvaWQ6OlZlY3Rvcjx1aW50MzJfdD4gdmVjMzIgPSBhbmRyb2lkOjpWZWN0b3I8dWludDMyX3Q+KCk7Ci0KLSAgICAvLyBXZSdyZSBnb2luZyB0byBnZW5lcmF0ZSB0d28gdmVjdG9ycyBvZiB0aGlzIHNpemUKLSAgICBzaXplX3QgdmVjdG9yU2l6ZSA9IGRhdGFQcm92aWRlci5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwgTUFYX1ZFQ19TSVpFKTsKLSAgICB2ZWMuc2V0Q2FwYWNpdHkodmVjdG9yU2l6ZSk7Ci0gICAgdmVjMzIuc2V0Q2FwYWNpdHkodmVjdG9yU2l6ZSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2ZWN0b3JTaXplOyBpKyspIHsKLSAgICAgICAgdWludDhfdCBjb3VudCA9IGRhdGFQcm92aWRlci5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQ4X3Q+KDEsIDUpOwotICAgICAgICB2ZWMuaW5zZXJ0QXQoKHVpbnQ4X3QpaSwgaSwgY291bnQpOwotICAgICAgICB2ZWMzMi5pbnNlcnRBdCgodWludDMyX3QpaSwgaSwgY291bnQpOwotICAgICAgICB2ZWMucHVzaF9mcm9udChpKTsKLSAgICAgICAgdmVjMzIucHVzaChpKTsKLSAgICB9Ci0KLSAgICAvLyBOb3cgd2UnbGwgcGVyZm9ybSBzb21lIHRlc3Qgb3BlcmF0aW9ucyB3aXRoIGFueSByZW1haW5pbmcgZGF0YQotICAgIC8vIEluZGV4IHRvIHBlcmZvcm0gb3BlcmF0aW9ucyBhdAotICAgIHNpemVfdCBpbmRleCA9IGRhdGFQcm92aWRlci5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwgdmVjLnNpemUoKSk7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVtYWluaW5nVmVjID0gZGF0YVByb3ZpZGVyLkNvbnN1bWVSZW1haW5pbmdCeXRlczx1aW50OF90PigpOwotICAgIC8vIEluc2VydCBhbiBhcnJheSBhbmQgdmVjdG9yCi0gICAgdmVjLmluc2VydEFycmF5QXQocmVtYWluaW5nVmVjLmRhdGEoKSwgaW5kZXgsIHJlbWFpbmluZ1ZlYy5zaXplKCkpOwotICAgIGFuZHJvaWQ6OlZlY3Rvcjx1aW50OF90PiB2ZWNDb3B5ID0gYW5kcm9pZDo6VmVjdG9yPHVpbnQ4X3Q+KHZlYyk7Ci0gICAgdmVjLmluc2VydFZlY3RvckF0KHZlY0NvcHksIGluZGV4KTsKLSAgICAvLyBTYW1lIHRoaW5nIGZvciAzMiBiaXQgdmVjdG9yCi0gICAgYW5kcm9pZDo6VmVjdG9yPHVpbnQzMl90PiB2ZWMzMkNvcHkgPSBhbmRyb2lkOjpWZWN0b3I8dWludDMyX3Q+KHZlYzMyKTsKLSAgICB2ZWMzMi5pbnNlcnRBcnJheUF0KHZlYzMyQ29weS5hcnJheSgpLCBpbmRleCwgdmVjMzIuc2l6ZSgpKTsKLSAgICB2ZWMzMi5pbnNlcnRWZWN0b3JBdCh2ZWMzMkNvcHksIGluZGV4KTsKLSAgICAvLyBSZXBsYWNlIHNpbmdsZSBjaGFyYWN0ZXIKLSAgICBpZiAocmVtYWluaW5nVmVjLnNpemUoKSA+IDApIHsKLSAgICAgICAgdmVjLnJlcGxhY2VBdChyZW1haW5pbmdWZWNbMF0sIGluZGV4KTsKLSAgICAgICAgdmVjMzIucmVwbGFjZUF0KHN0YXRpY19jYXN0PHVpbnQzMl90PihyZW1haW5pbmdWZWNbMF0pLCBpbmRleCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdmVjLnJlcGxhY2VBdCgwLCBpbmRleCk7Ci0gICAgICAgIHZlYzMyLnJlcGxhY2VBdCgwLCBpbmRleCk7Ci0gICAgfQotICAgIC8vIEFkZCBhbnkgcmVtYWluaW5nIGJ5dGVzCi0gICAgZm9yICh1aW50OF90IGkgOiByZW1haW5pbmdWZWMpIHsKLSAgICAgICAgdmVjLmFkZChpKTsKLSAgICAgICAgdmVjMzIuYWRkKHN0YXRpY19jYXN0PHVpbnQzMl90PihpKSk7Ci0gICAgfQotICAgIC8vIFNocmluayBjYXBhY3RpeQotICAgIHZlYy5zZXRDYXBhY2l0eShyZW1haW5pbmdWZWMuc2l6ZSgpKTsKLSAgICB2ZWMzMi5zZXRDYXBhY2l0eShyZW1haW5pbmdWZWMuc2l6ZSgpKTsKLSAgICAvLyBJdGVyYXRlIHRocm91Z2ggZWFjaCBwb2ludGVyCi0gICAgc2l6ZV90IHN1bSA9IDA7Ci0gICAgZm9yIChhdXRvJiBpdCA6IHZlYykgewotICAgICAgICBzdW0gKz0gaXQ7Ci0gICAgfQotICAgIGZvciAoYXV0byYgaXQgOiB2ZWMzMikgewotICAgICAgICBzdW0gKz0gaXQ7Ci0gICAgfQotICAgIC8vIENsZWFudXAKLSAgICB2ZWMuY2xlYXIoKTsKLSAgICB2ZWNDb3B5LmNsZWFyKCk7Ci0gICAgdmVjMzIuY2xlYXIoKTsKLSAgICB2ZWMzMkNvcHkuY2xlYXIoKTsKLX0KLWV4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBydW5WZWN0b3JGdXp6KGRhdGEsIHNpemUpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGlidXRpbHMvYWJpLWR1bXBzL2FybTY0L3NvdXJjZS1iYXNlZC9saWJ1dGlscy5zby5sc2R1bXAgYi9saWJ1dGlscy9hYmktZHVtcHMvYXJtNjQvc291cmNlLWJhc2VkL2xpYnV0aWxzLnNvLmxzZHVtcAppbmRleCBjODlhZjllLi4wMDYwOWE5IDEwMDY0NAotLS0gYS9saWJ1dGlscy9hYmktZHVtcHMvYXJtNjQvc291cmNlLWJhc2VkL2xpYnV0aWxzLnNvLmxzZHVtcAorKysgYi9saWJ1dGlscy9hYmktZHVtcHMvYXJtNjQvc291cmNlLWJhc2VkL2xpYnV0aWxzLnNvLmxzZHVtcApAQCAtNiw3ICs2LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUEwX2kiLAogICAgIm5hbWUiIDogImludFswXSIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJQTBfaSIsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlX291dHNpZGVfc3lzdGVtL2N1dGlscy9uYXRpdmVfaGFuZGxlLmgiCiAgIH0sCiAgIHsKQEAgLTE0LDE2ICsxMywxNCBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJQTFfRHMiLAogICAgIm5hbWUiIDogImNoYXIxNl90WzFdIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElEcyIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJQTFfRHMiLAogICAgInNpemUiIDogMiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElBMjBfYyIsCiAgICAibmFtZSIgOiAiY2hhclsyMF0iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWMiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUEyMF9jIiwKICAgICJzaXplIiA6IDIwLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ByaW50ZXIuaCIKICAgfSwKQEAgLTMyLDcgKzI5LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUE1MTIxX2giLAogICAgIm5hbWUiIDogInVuc2lnbmVkIGNoYXJbNTEyMV0iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWgiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUE1MTIxX2giLAogICAgInNpemUiIDogNTEyMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2xvZ2dpbmcvbGlibG9nL2luY2x1ZGVfdm5kay9sb2cvbG9nX3JlYWQuaCIKICAgfSwKQEAgLTQxLDE1ICszNywxNCBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJQThfaiIsCiAgICAibmFtZSIgOiAidW5zaWduZWQgaW50WzhdIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElBOF9qIiwKICAgICJzaXplIiA6IDMyLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJzeXN0ZW0vaW5jbHVkZS9zeXN0ZW0vZ3JhcGhpY3MuaCIKICAgfSwKICAgeworICAgImlzX29mX3Vua25vd25fYm91bmQiIDogdHJ1ZSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUFfZiIsCiAgICAibmFtZSIgOiAiZmxvYXRbXSIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJZiIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJQV9mIiwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlic3lzdGVtL2luY2x1ZGUvc3lzdGVtL2dyYXBoaWNzLmgiCiAgIH0KICBdLApAQCAtNjEsMTYgKzU2LDEyIEBACiAgICAiaXNfdW5zaWduZWQiIDogdHJ1ZSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSURpIiwKICAgICJuYW1lIiA6ICJjaGFyMzJfdCIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJRGkiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSURpIiwKICAgICJzaXplIiA6IDQKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA4LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJRG4iLAogICAgIm5hbWUiIDogInN0ZDo6bnVsbHB0cl90IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElEbiIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJRG4iLAogICAgInNpemUiIDogOAogICB9LAogICB7CkBAIC03OSw4ICs3MCw2IEBACiAgICAiaXNfdW5zaWduZWQiIDogdHJ1ZSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSURzIiwKICAgICJuYW1lIiA6ICJjaGFyMTZfdCIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJRHMiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSURzIiwKICAgICJzaXplIiA6IDIKICAgfSwKICAgewpAQCAtODgsOCArNzcsNiBAQAogICAgImlzX2ludGVncmFsIiA6IHRydWUsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElhIiwKICAgICJuYW1lIiA6ICJzaWduZWQgY2hhciIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJYSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJYSIsCiAgICAic2l6ZSIgOiAxCiAgIH0sCiAgIHsKQEAgLTk4LDggKzg1LDYgQEAKICAgICJpc191bnNpZ25lZCIgOiB0cnVlLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJYiIsCiAgICAibmFtZSIgOiAiYm9vbCIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJYiIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJYiIsCiAgICAic2l6ZSIgOiAxCiAgIH0sCiAgIHsKQEAgLTEwOCwyNCArOTMsMTggQEAKICAgICJpc191bnNpZ25lZCIgOiB0cnVlLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJYyIsCiAgICAibmFtZSIgOiAiY2hhciIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJYyIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJYyIsCiAgICAic2l6ZSIgOiAxCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSWQiLAogICAgIm5hbWUiIDogImRvdWJsZSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJZCIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJZCIsCiAgICAic2l6ZSIgOiA4CiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSWYiLAogICAgIm5hbWUiIDogImZsb2F0IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElmIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElmIiwKICAgICJzaXplIiA6IDQKICAgfSwKICAgewpAQCAtMTM0LDggKzExMyw2IEBACiAgICAiaXNfdW5zaWduZWQiIDogdHJ1ZSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSWgiLAogICAgIm5hbWUiIDogInVuc2lnbmVkIGNoYXIiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWgiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSWgiLAogICAgInNpemUiIDogMQogICB9LAogICB7CkBAIC0xNDMsOCArMTIwLDYgQEAKICAgICJpc19pbnRlZ3JhbCIgOiB0cnVlLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJaSIsCiAgICAibmFtZSIgOiAiaW50IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElpIiwKICAgICJzaXplIiA6IDQKICAgfSwKICAgewpAQCAtMTUzLDggKzEyOCw2IEBACiAgICAiaXNfdW5zaWduZWQiIDogdHJ1ZSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSWoiLAogICAgIm5hbWUiIDogInVuc2lnbmVkIGludCIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJaiIsCiAgICAic2l6ZSIgOiA0CiAgIH0sCiAgIHsKQEAgLTE2Miw4ICsxMzUsNiBAQAogICAgImlzX2ludGVncmFsIiA6IHRydWUsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElsIiwKICAgICJuYW1lIiA6ICJsb25nIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElsIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElsIiwKICAgICJzaXplIiA6IDgKICAgfSwKICAgewpAQCAtMTcyLDggKzE0Myw2IEBACiAgICAiaXNfdW5zaWduZWQiIDogdHJ1ZSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSW0iLAogICAgIm5hbWUiIDogInVuc2lnbmVkIGxvbmciLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSW0iLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSW0iLAogICAgInNpemUiIDogOAogICB9LAogICB7CkBAIC0xODEsOCArMTUwLDYgQEAKICAgICJpc19pbnRlZ3JhbCIgOiB0cnVlLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJcyIsCiAgICAibmFtZSIgOiAic2hvcnQiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSXMiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSXMiLAogICAgInNpemUiIDogMgogICB9LAogICB7CkBAIC0xOTEsMjMgKzE1OCwxNyBAQAogICAgImlzX3Vuc2lnbmVkIiA6IHRydWUsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEl0IiwKICAgICJuYW1lIiA6ICJ1bnNpZ25lZCBzaG9ydCIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJdCIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJdCIsCiAgICAic2l6ZSIgOiAyCiAgIH0sCiAgIHsKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSXYiLAotICAgIm5hbWUiIDogInZvaWQiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSXYiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSXYiCisgICAibmFtZSIgOiAidm9pZCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA4LAogICAgImlzX2ludGVncmFsIiA6IHRydWUsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEl4IiwKICAgICJuYW1lIiA6ICJsb25nIGxvbmciLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSXgiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSXgiLAogICAgInNpemUiIDogOAogICB9LAogICB7CkBAIC0yMTYsOCArMTc3LDYgQEAKICAgICJpc191bnNpZ25lZCIgOiB0cnVlLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJeSIsCiAgICAibmFtZSIgOiAidW5zaWduZWQgbG9uZyBsb25nIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEl5IiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVEl5IiwKICAgICJzaXplIiA6IDgKICAgfQogIF0sCkBAIC00OTcsOSArNDU2LDYgQEAKICAgICJuYW1lIiA6ICJfWk43YW5kcm9pZDQ3TGlnaHRSZWZCYXNlX3JlcG9ydEluY1N0cm9uZ1JlcXVpcmVTdHJvbmdGYWlsZWRFUEt2IgogICB9LAogICB7Ci0gICAibmFtZSIgOiAiX1pON2FuZHJvaWQ2TG9vcGVyMTBpbml0VExTS2V5RXYiCi0gIH0sCi0gIHsKICAgICJuYW1lIiA6ICJfWk43YW5kcm9pZDZMb29wZXIxMXNlbmRNZXNzYWdlRVJLTlNfMnNwSU5TXzE0TWVzc2FnZUhhbmRsZXJFRUVSS05TXzdNZXNzYWdlRSIKICAgfSwKICAgewpAQCAtNTE1LDcgKzQ3MSw3IEBACiAgICAibmFtZSIgOiAiX1pON2FuZHJvaWQ2TG9vcGVyMTRyZW1vdmVNZXNzYWdlc0VSS05TXzJzcElOU18xNE1lc3NhZ2VIYW5kbGVyRUVFaSIKICAgfSwKICAgewotICAgIm5hbWUiIDogIl9aTjdhbmRyb2lkNkxvb3BlcjE2dGhyZWFkRGVzdHJ1Y3RvckVQdiIKKyAgICJuYW1lIiA6ICJfWk43YW5kcm9pZDZMb29wZXIxNWdldEZkU3RhdGVEZWJ1Z0VpUGlTMV9QTlNfMnNwSU5TXzE0TG9vcGVyQ2FsbGJhY2tFRUVQUHYiCiAgIH0sCiAgIHsKICAgICJuYW1lIiA6ICJfWk43YW5kcm9pZDZMb29wZXIxN3NlbmRNZXNzYWdlQXRUaW1lRWxSS05TXzJzcElOU18xNE1lc3NhZ2VIYW5kbGVyRUVFUktOU183TWVzc2FnZUUiCkBAIC01NDUsNiArNTAxLDkgQEAKICAgICJuYW1lIiA6ICJfWk43YW5kcm9pZDZMb29wZXI2YXdva2VuRXYiCiAgIH0sCiAgIHsKKyAgICJuYW1lIiA6ICJfWk43YW5kcm9pZDZMb29wZXI2cmVwb2xsRWkiCisgIH0sCisgIHsKICAgICJuYW1lIiA6ICJfWk43YW5kcm9pZDZMb29wZXI3cG9sbEFsbEVpUGlTMV9QUHYiCiAgIH0sCiAgIHsKQEAgLTcwNCw5ICs2NjMsNiBAQAogICAgIm5hbWUiIDogIl9aTjdhbmRyb2lkN1JlZkJhc2VEMkV2IgogICB9LAogICB7Ci0gICAibmFtZSIgOiAiX1pON2FuZHJvaWQ3U3RyaW5nODEwYXBwZW5kUGF0aEVQS2MiCi0gIH0sCi0gIHsKICAgICJuYW1lIiA6ICJfWk43YW5kcm9pZDdTdHJpbmc4MTBsb2NrQnVmZmVyRW0iCiAgIH0sCiAgIHsKQEAgLTcyNSw5ICs2ODEsNiBAQAogICAgIm5hbWUiIDogIl9aTjdhbmRyb2lkN1N0cmluZzgxM2FwcGVuZEZvcm1hdFZFUEtjU3Q5X192YV9saXN0IgogICB9LAogICB7Ci0gICAibmFtZSIgOiAiX1pON2FuZHJvaWQ3U3RyaW5nODE2Y29udmVydFRvUmVzUGF0aEV2IgotICB9LAotICB7CiAgICAibmFtZSIgOiAiX1pON2FuZHJvaWQ3U3RyaW5nODVjbGVhckV2IgogICB9LAogICB7CkBAIC0xMDQzLDc4ICs5OTYsNiBAQAogICAgIm5hbWUiIDogIl9aTks3YW5kcm9pZDZUaHJlYWQ5aXNSdW5uaW5nRXYiCiAgIH0sCiAgIHsKLSAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKLSAgICJuYW1lIiA6ICJfWk5LN2FuZHJvaWQ2VmVjdG9ySU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFMTBkb19kZXN0cm95RVB2bSIKLSAgfSwKLSAgewotICAgImJpbmRpbmciIDogIndlYWsiLAotICAgIm5hbWUiIDogIl9aTks3YW5kcm9pZDZWZWN0b3JJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUUxMmRvX2NvbnN0cnVjdEVQdm0iCi0gIH0sCi0gIHsKLSAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKLSAgICJuYW1lIiA6ICJfWk5LN2FuZHJvaWQ2VmVjdG9ySU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFMTVkb19tb3ZlX2ZvcndhcmRFUHZQS3ZtIgotICB9LAotICB7Ci0gICAiYmluZGluZyIgOiAid2VhayIsCi0gICAibmFtZSIgOiAiX1pOSzdhbmRyb2lkNlZlY3RvcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRTE2ZG9fbW92ZV9iYWNrd2FyZEVQdlBLdm0iCi0gIH0sCi0gIHsKLSAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKLSAgICJuYW1lIiA6ICJfWk5LN2FuZHJvaWQ2VmVjdG9ySU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFN2RvX2NvcHlFUHZQS3ZtIgotICB9LAotICB7Ci0gICAiYmluZGluZyIgOiAid2VhayIsCi0gICAibmFtZSIgOiAiX1pOSzdhbmRyb2lkNlZlY3RvcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRThkb19zcGxhdEVQdlBLdm0iCi0gIH0sCi0gIHsKLSAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKLSAgICJuYW1lIiA6ICJfWk5LN2FuZHJvaWQ2VmVjdG9ySU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFMTBkb19kZXN0cm95RVB2bSIKLSAgfSwKLSAgewotICAgImJpbmRpbmciIDogIndlYWsiLAotICAgIm5hbWUiIDogIl9aTks3YW5kcm9pZDZWZWN0b3JJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUUxMmRvX2NvbnN0cnVjdEVQdm0iCi0gIH0sCi0gIHsKLSAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKLSAgICJuYW1lIiA6ICJfWk5LN2FuZHJvaWQ2VmVjdG9ySU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFMTVkb19tb3ZlX2ZvcndhcmRFUHZQS3ZtIgotICB9LAotICB7Ci0gICAiYmluZGluZyIgOiAid2VhayIsCi0gICAibmFtZSIgOiAiX1pOSzdhbmRyb2lkNlZlY3RvcklOU182TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFRTE2ZG9fbW92ZV9iYWNrd2FyZEVQdlBLdm0iCi0gIH0sCi0gIHsKLSAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKLSAgICJuYW1lIiA6ICJfWk5LN2FuZHJvaWQ2VmVjdG9ySU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFN2RvX2NvcHlFUHZQS3ZtIgotICB9LAotICB7Ci0gICAiYmluZGluZyIgOiAid2VhayIsCi0gICAibmFtZSIgOiAiX1pOSzdhbmRyb2lkNlZlY3RvcklOU182TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFRThkb19zcGxhdEVQdlBLdm0iCi0gIH0sCi0gIHsKLSAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKLSAgICJuYW1lIiA6ICJfWk5LN2FuZHJvaWQ2VmVjdG9ySU5TXzZMb29wZXI4UmVzcG9uc2VFRTEwZG9fZGVzdHJveUVQdm0iCi0gIH0sCi0gIHsKLSAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKLSAgICJuYW1lIiA6ICJfWk5LN2FuZHJvaWQ2VmVjdG9ySU5TXzZMb29wZXI4UmVzcG9uc2VFRTEyZG9fY29uc3RydWN0RVB2bSIKLSAgfSwKLSAgewotICAgImJpbmRpbmciIDogIndlYWsiLAotICAgIm5hbWUiIDogIl9aTks3YW5kcm9pZDZWZWN0b3JJTlNfNkxvb3BlcjhSZXNwb25zZUVFMTVkb19tb3ZlX2ZvcndhcmRFUHZQS3ZtIgotICB9LAotICB7Ci0gICAiYmluZGluZyIgOiAid2VhayIsCi0gICAibmFtZSIgOiAiX1pOSzdhbmRyb2lkNlZlY3RvcklOU182TG9vcGVyOFJlc3BvbnNlRUUxNmRvX21vdmVfYmFja3dhcmRFUHZQS3ZtIgotICB9LAotICB7Ci0gICAiYmluZGluZyIgOiAid2VhayIsCi0gICAibmFtZSIgOiAiX1pOSzdhbmRyb2lkNlZlY3RvcklOU182TG9vcGVyOFJlc3BvbnNlRUU3ZG9fY29weUVQdlBLdm0iCi0gIH0sCi0gIHsKLSAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKLSAgICJuYW1lIiA6ICJfWk5LN2FuZHJvaWQ2VmVjdG9ySU5TXzZMb29wZXI4UmVzcG9uc2VFRThkb19zcGxhdEVQdlBLdm0iCi0gIH0sCi0gIHsKICAgICJuYW1lIiA6ICJfWk5LN2FuZHJvaWQ3UmVmQmFzZTEwY3JlYXRlV2Vha0VQS3YiCiAgIH0sCiAgIHsKQEAgLTExNDgsMTUgKzEwMjksNiBAQAogICAgIm5hbWUiIDogIl9aTks3YW5kcm9pZDdTdHJpbmc4MTBnZXRQYXRoRGlyRXYiCiAgIH0sCiAgIHsKLSAgICJuYW1lIiA6ICJfWk5LN2FuZHJvaWQ3U3RyaW5nODExZ2V0QmFzZVBhdGhFdiIKLSAgfSwKLSAgewotICAgIm5hbWUiIDogIl9aTks3YW5kcm9pZDdTdHJpbmc4MTFnZXRQYXRoTGVhZkV2IgotICB9LAotICB7Ci0gICAibmFtZSIgOiAiX1pOSzdhbmRyb2lkN1N0cmluZzgxNGZpbmRfZXh0ZW5zaW9uRXYiCi0gIH0sCi0gIHsKICAgICJuYW1lIiA6ICJfWk5LN2FuZHJvaWQ3U3RyaW5nODE2Z2V0UGF0aEV4dGVuc2lvbkV2IgogICB9LAogICB7CkBAIC0xMTY2LDkgKzEwMzgsNiBAQAogICAgIm5hbWUiIDogIl9aTks3YW5kcm9pZDdTdHJpbmc4Nmxlbmd0aEV2IgogICB9LAogICB7Ci0gICAibmFtZSIgOiAiX1pOSzdhbmRyb2lkN1N0cmluZzg4d2Fsa1BhdGhFUFMwXyIKLSAgfSwKLSAgewogICAgIm5hbWUiIDogIl9aTks3YW5kcm9pZDhTdHJpbmcxNjEwc3RhcnRzV2l0aEVQS0RzIgogICB9LAogICB7CkBAIC0xMjA1LDQ2ICsxMDc0LDYgQEAKICAgICJuYW1lIiA6ICJfWk5LN2FuZHJvaWQ5VG9rZW5pemVyMTlwZWVrUmVtYWluZGVyT2ZMaW5lRXYiCiAgIH0sCiAgIHsKLSAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKLSAgICJuYW1lIiA6ICJfWk5TdDNfXzExMl9faGFzaF90YWJsZUlOU18xN19faGFzaF92YWx1ZV90eXBlSWltRUVOU18yMl9fdW5vcmRlcmVkX21hcF9oYXNoZXJJaVMyX05TXzRoYXNoSWlFRUxiMUVFRU5TXzIxX191bm9yZGVyZWRfbWFwX2VxdWFsSWlTMl9OU184ZXF1YWxfdG9JaUVFTGIxRUVFTlNfOWFsbG9jYXRvcklTMl9FRUUxNF9fZXJhc2VfdW5pcXVlSWlFRW1SS1RfIgotICB9LAotICB7Ci0gICAiYmluZGluZyIgOiAid2VhayIsCi0gICAibmFtZSIgOiAiX1pOU3QzX18xMTJfX2hhc2hfdGFibGVJTlNfMTdfX2hhc2hfdmFsdWVfdHlwZUlpbUVFTlNfMjJfX3Vub3JkZXJlZF9tYXBfaGFzaGVySWlTMl9OU180aGFzaElpRUVMYjFFRUVOU18yMV9fdW5vcmRlcmVkX21hcF9lcXVhbElpUzJfTlNfOGVxdWFsX3RvSWlFRUxiMUVFRU5TXzlhbGxvY2F0b3JJUzJfRUVFMjVfX2VtcGxhY2VfdW5pcXVlX2tleV9hcmdzSWlKUmlSS21FRUVOU180cGFpcklOU18xNV9faGFzaF9pdGVyYXRvcklQTlNfMTFfX2hhc2hfbm9kZUlTMl9QdkVFRUViRUVSS1RfRHBPVDBfIgotICB9LAotICB7Ci0gICAiYmluZGluZyIgOiAid2VhayIsCi0gICAibmFtZSIgOiAiX1pOU3QzX18xMTJfX2hhc2hfdGFibGVJTlNfMTdfX2hhc2hfdmFsdWVfdHlwZUlpbUVFTlNfMjJfX3Vub3JkZXJlZF9tYXBfaGFzaGVySWlTMl9OU180aGFzaElpRUVMYjFFRUVOU18yMV9fdW5vcmRlcmVkX21hcF9lcXVhbElpUzJfTlNfOGVxdWFsX3RvSWlFRUxiMUVFRU5TXzlhbGxvY2F0b3JJUzJfRUVFNnJlaGFzaEVtIgotICB9LAotICB7Ci0gICAiYmluZGluZyIgOiAid2VhayIsCi0gICAibmFtZSIgOiAiX1pOU3QzX18xMTJfX2hhc2hfdGFibGVJTlNfMTdfX2hhc2hfdmFsdWVfdHlwZUlpbUVFTlNfMjJfX3Vub3JkZXJlZF9tYXBfaGFzaGVySWlTMl9OU180aGFzaElpRUVMYjFFRUVOU18yMV9fdW5vcmRlcmVkX21hcF9lcXVhbElpUzJfTlNfOGVxdWFsX3RvSWlFRUxiMUVFRU5TXzlhbGxvY2F0b3JJUzJfRUVFNnJlbW92ZUVOU18yMV9faGFzaF9jb25zdF9pdGVyYXRvcklQTlNfMTFfX2hhc2hfbm9kZUlTMl9QdkVFRUUiCi0gIH0sCi0gIHsKLSAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKLSAgICJuYW1lIiA6ICJfWk5TdDNfXzExMl9faGFzaF90YWJsZUlOU18xN19faGFzaF92YWx1ZV90eXBlSWltRUVOU18yMl9fdW5vcmRlcmVkX21hcF9oYXNoZXJJaVMyX05TXzRoYXNoSWlFRUxiMUVFRU5TXzIxX191bm9yZGVyZWRfbWFwX2VxdWFsSWlTMl9OU184ZXF1YWxfdG9JaUVFTGIxRUVFTlNfOWFsbG9jYXRvcklTMl9FRUU4X19yZWhhc2hFbSIKLSAgfSwKLSAgewotICAgImJpbmRpbmciIDogIndlYWsiLAotICAgIm5hbWUiIDogIl9aTlN0M19fMTEyX19oYXNoX3RhYmxlSU5TXzE3X19oYXNoX3ZhbHVlX3R5cGVJbU43YW5kcm9pZDZMb29wZXI3UmVxdWVzdEVFRU5TXzIyX191bm9yZGVyZWRfbWFwX2hhc2hlckltUzVfTlNfNGhhc2hJbUVFTGIxRUVFTlNfMjFfX3Vub3JkZXJlZF9tYXBfZXF1YWxJbVM1X05TXzhlcXVhbF90b0ltRUVMYjFFRUVOU185YWxsb2NhdG9ySVM1X0VFRTE0X19lcmFzZV91bmlxdWVJbUVFbVJLVF8iCi0gIH0sCi0gIHsKLSAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKLSAgICJuYW1lIiA6ICJfWk5TdDNfXzExMl9faGFzaF90YWJsZUlOU18xN19faGFzaF92YWx1ZV90eXBlSW1ON2FuZHJvaWQ2TG9vcGVyN1JlcXVlc3RFRUVOU18yMl9fdW5vcmRlcmVkX21hcF9oYXNoZXJJbVM1X05TXzRoYXNoSW1FRUxiMUVFRU5TXzIxX191bm9yZGVyZWRfbWFwX2VxdWFsSW1TNV9OU184ZXF1YWxfdG9JbUVFTGIxRUVFTlNfOWFsbG9jYXRvcklTNV9FRUUyNV9fZW1wbGFjZV91bmlxdWVfa2V5X2FyZ3NJbUpSS21SUzRfRUVFTlNfNHBhaXJJTlNfMTVfX2hhc2hfaXRlcmF0b3JJUE5TXzExX19oYXNoX25vZGVJUzVfUHZFRUVFYkVFUktUX0RwT1QwXyIKLSAgfSwKLSAgewotICAgImJpbmRpbmciIDogIndlYWsiLAotICAgIm5hbWUiIDogIl9aTlN0M19fMTEyX19oYXNoX3RhYmxlSU5TXzE3X19oYXNoX3ZhbHVlX3R5cGVJbU43YW5kcm9pZDZMb29wZXI3UmVxdWVzdEVFRU5TXzIyX191bm9yZGVyZWRfbWFwX2hhc2hlckltUzVfTlNfNGhhc2hJbUVFTGIxRUVFTlNfMjFfX3Vub3JkZXJlZF9tYXBfZXF1YWxJbVM1X05TXzhlcXVhbF90b0ltRUVMYjFFRUVOU185YWxsb2NhdG9ySVM1X0VFRTZyZWhhc2hFbSIKLSAgfSwKLSAgewotICAgImJpbmRpbmciIDogIndlYWsiLAotICAgIm5hbWUiIDogIl9aTlN0M19fMTEyX19oYXNoX3RhYmxlSU5TXzE3X19oYXNoX3ZhbHVlX3R5cGVJbU43YW5kcm9pZDZMb29wZXI3UmVxdWVzdEVFRU5TXzIyX191bm9yZGVyZWRfbWFwX2hhc2hlckltUzVfTlNfNGhhc2hJbUVFTGIxRUVFTlNfMjFfX3Vub3JkZXJlZF9tYXBfZXF1YWxJbVM1X05TXzhlcXVhbF90b0ltRUVMYjFFRUVOU185YWxsb2NhdG9ySVM1X0VFRTZyZW1vdmVFTlNfMjFfX2hhc2hfY29uc3RfaXRlcmF0b3JJUE5TXzExX19oYXNoX25vZGVJUzVfUHZFRUVFIgotICB9LAotICB7Ci0gICAiYmluZGluZyIgOiAid2VhayIsCi0gICAibmFtZSIgOiAiX1pOU3QzX18xMTJfX2hhc2hfdGFibGVJTlNfMTdfX2hhc2hfdmFsdWVfdHlwZUltTjdhbmRyb2lkNkxvb3BlcjdSZXF1ZXN0RUVFTlNfMjJfX3Vub3JkZXJlZF9tYXBfaGFzaGVySW1TNV9OU180aGFzaEltRUVMYjFFRUVOU18yMV9fdW5vcmRlcmVkX21hcF9lcXVhbEltUzVfTlNfOGVxdWFsX3RvSW1FRUxiMUVFRU5TXzlhbGxvY2F0b3JJUzVfRUVFOF9fcmVoYXNoRW0iCi0gIH0sCi0gIHsKICAgICJuYW1lIiA6ICJfWlR2MF9uMjRfTjdhbmRyb2lkMTRMb29wZXJDYWxsYmFja0QwRXYiCiAgIH0sCiAgIHsKQEAgLTE0MjksNiArMTI1OCwxMCBAQAogICB9LAogICB7CiAgICAibmFtZSIgOiAiX1pUVk43YW5kcm9pZDlGZFByaW50ZXJFIgorICB9LAorICB7CisgICAiYmluZGluZyIgOiAid2VhayIsCisgICAibmFtZSIgOiAiX19sbHZtX2ZzX2Rpc2NyaW1pbmF0b3JfXyIKICAgfQogIF0sCiAgImVudW1fdHlwZXMiIDoKQEAgLTE0MzgsNjcgKzEyNzEsNiBAQAogICAgImVudW1fZmllbGRzIiA6CiAgICBbCiAgICAgewotICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAtMSwKLSAgICAgIm5hbWUiIDogIlNQX0RFRkFVTFQiCi0gICAgfSwKLSAgICB7Ci0gICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDAsCi0gICAgICJuYW1lIiA6ICJTUF9CQUNLR1JPVU5EIgotICAgIH0sCi0gICAgewotICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAotICAgICAibmFtZSIgOiAiU1BfRk9SRUdST1VORCIKLSAgICB9LAotICAgIHsKLSAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMiwKLSAgICAgIm5hbWUiIDogIlNQX1NZU1RFTSIKLSAgICB9LAotICAgIHsKLSAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMywKLSAgICAgIm5hbWUiIDogIlNQX0FVRElPX0FQUCIKLSAgICB9LAotICAgIHsKLSAgICAgImVudW1fZmllbGRfdmFsdWUiIDogNCwKLSAgICAgIm5hbWUiIDogIlNQX0FVRElPX1NZUyIKLSAgICB9LAotICAgIHsKLSAgICAgImVudW1fZmllbGRfdmFsdWUiIDogNSwKLSAgICAgIm5hbWUiIDogIlNQX1RPUF9BUFAiCi0gICAgfSwKLSAgICB7Ci0gICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDYsCi0gICAgICJuYW1lIiA6ICJTUF9SVF9BUFAiCi0gICAgfSwKLSAgICB7Ci0gICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDcsCi0gICAgICJuYW1lIiA6ICJTUF9SRVNUUklDVEVEIgotICAgIH0sCi0gICAgewotICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiA4LAotICAgICAibmFtZSIgOiAiU1BfQ05UIgotICAgIH0sCi0gICAgewotICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiA3LAotICAgICAibmFtZSIgOiAiU1BfTUFYIgotICAgIH0sCi0gICAgewotICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAotICAgICAibmFtZSIgOiAiU1BfU1lTVEVNX0RFRkFVTFQiCi0gICAgfQotICAgXSwKLSAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSTExU2NoZWRQb2xpY3kiLAotICAgIm5hbWUiIDogIlNjaGVkUG9saWN5IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkxMVNjaGVkUG9saWN5IiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVEkxMVNjaGVkUG9saWN5IiwKLSAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnByb2Nlc3Nncm91cC9pbmNsdWRlL3Byb2Nlc3Nncm91cC9zY2hlZF9wb2xpY3kuaCIsCi0gICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaSIKLSAgfSwKLSAgewotICAgImFsaWdubWVudCIgOiA0LAotICAgImVudW1fZmllbGRzIiA6Ci0gICBbCi0gICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAogICAgICAibmFtZSIgOiAiSEFMX0hEUl9ET0xCWV9WSVNJT04iCiAgICAgfSwKQEAgLTE1MTMsOCArMTI4NSw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJMTNhbmRyb2lkX2hkcl90IiwKICAgICJuYW1lIiA6ICJhbmRyb2lkX2hkcl90IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkxM2FuZHJvaWRfaGRyX3QiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSTEzYW5kcm9pZF9oZHJfdCIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJzeXN0ZW0vaW5jbHVkZS9zeXN0ZW0vZ3JhcGhpY3MtYmFzZS12MS4wLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0xNTMwLDggKzEzMDAsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSTE4YW5kcm9pZF9oZHJfdjFfMl90IiwKICAgICJuYW1lIiA6ICJhbmRyb2lkX2hkcl92MV8yX3QiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTE4YW5kcm9pZF9oZHJfdjFfMl90IiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVEkxOGFuZHJvaWRfaGRyX3YxXzJfdCIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJzeXN0ZW0vaW5jbHVkZS9zeXN0ZW0vZ3JhcGhpY3MtYmFzZS12MS4yLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0xNTc5LDggKzEzNDcsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSTE5YW5kcm9pZF9Mb2dQcmlvcml0eSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZF9Mb2dQcmlvcml0eSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJMTlhbmRyb2lkX0xvZ1ByaW9yaXR5IiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVEkxOWFuZHJvaWRfTG9nUHJpb3JpdHkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2xvZ2dpbmcvbGlibG9nL2luY2x1ZGVfdm5kay9hbmRyb2lkL2xvZy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMTgyMCw4ICsxNTg2LDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEkxOWFuZHJvaWRfZGF0YXNwYWNlX3QiLAogICAgIm5hbWUiIDogImFuZHJvaWRfZGF0YXNwYWNlX3QiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTE5YW5kcm9pZF9kYXRhc3BhY2VfdCIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJMTlhbmRyb2lkX2RhdGFzcGFjZV90IiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnN5c3RlbS9pbmNsdWRlL3N5c3RlbS9ncmFwaGljcy1iYXNlLXYxLjAuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTE4NTcsOCArMTYyMSw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJMTlhbmRyb2lkX2ZsZXhfZm9ybWF0IiwKICAgICJuYW1lIiA6ICJhbmRyb2lkX2ZsZXhfZm9ybWF0IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkxOWFuZHJvaWRfZmxleF9mb3JtYXQiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSTE5YW5kcm9pZF9mbGV4X2Zvcm1hdCIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJzeXN0ZW0vaW5jbHVkZS9zeXN0ZW0vZ3JhcGhpY3MuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTE4OTAsOCArMTY1Miw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJMTlhbmRyb2lkX3RyYW5zZm9ybV90IiwKICAgICJuYW1lIiA6ICJhbmRyb2lkX3RyYW5zZm9ybV90IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkxOWFuZHJvaWRfdHJhbnNmb3JtX3QiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSTE5YW5kcm9pZF90cmFuc2Zvcm1fdCIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJzeXN0ZW0vaW5jbHVkZS9zeXN0ZW0vZ3JhcGhpY3MtYmFzZS12MS4wLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0xOTQzLDggKzE3MDMsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSTIwYW5kcm9pZF9jb2xvcl9tb2RlX3QiLAogICAgIm5hbWUiIDogImFuZHJvaWRfY29sb3JfbW9kZV90IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkyMGFuZHJvaWRfY29sb3JfbW9kZV90IiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVEkyMGFuZHJvaWRfY29sb3JfbW9kZV90IiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnN5c3RlbS9pbmNsdWRlL3N5c3RlbS9ncmFwaGljcy1iYXNlLXYxLjAuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTE5NzYsOCArMTczNCw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJMjEkU1lTVEVNX1RJTUVfQk9PVFRJTUUiLAogICAgIm5hbWUiIDogIih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJMjEkU1lTVEVNX1RJTUVfQk9PVFRJTUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSTIxJFNZU1RFTV9USU1FX0JPT1RUSU1FIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVGltZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0yMDE3LDggKzE3NzMsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSTIyYW5kcm9pZF9mbGV4X2NvbXBvbmVudCIsCiAgICAibmFtZSIgOiAiYW5kcm9pZF9mbGV4X2NvbXBvbmVudCIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJMjJhbmRyb2lkX2ZsZXhfY29tcG9uZW50IiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVEkyMmFuZHJvaWRfZmxleF9jb21wb25lbnQiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlic3lzdGVtL2luY2x1ZGUvc3lzdGVtL2dyYXBoaWNzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0yMTEwLDggKzE4NjQsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSTIyYW5kcm9pZF9waXhlbF9mb3JtYXRfdCIsCiAgICAibmFtZSIgOiAiYW5kcm9pZF9waXhlbF9mb3JtYXRfdCIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJMjJhbmRyb2lkX3BpeGVsX2Zvcm1hdF90IiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVEkyMmFuZHJvaWRfcGl4ZWxfZm9ybWF0X3QiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlic3lzdGVtL2luY2x1ZGUvc3lzdGVtL2dyYXBoaWNzLWJhc2UtdjEuMC5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMjE3NSw4ICsxOTI3LDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEkyMyRBTkRST0lEX1BSSU9SSVRZX0FVRElPIiwKICAgICJuYW1lIiA6ICIodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTIzJEFORFJPSURfUFJJT1JJVFlfQVVESU8iLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSTIzJEFORFJPSURfUFJJT1JJVFlfQVVESU8iLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlic3lzdGVtL2luY2x1ZGUvc3lzdGVtL3RocmVhZF9kZWZzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWkiCkBAIC0yMjA0LDggKzE5NTQsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSTI0YW5kcm9pZF9kYXRhc3BhY2VfdjFfMV90IiwKICAgICJuYW1lIiA6ICJhbmRyb2lkX2RhdGFzcGFjZV92MV8xX3QiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTI0YW5kcm9pZF9kYXRhc3BhY2VfdjFfMV90IiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVEkyNGFuZHJvaWRfZGF0YXNwYWNlX3YxXzFfdCIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJzeXN0ZW0vaW5jbHVkZS9zeXN0ZW0vZ3JhcGhpY3MtYmFzZS12MS4xLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0yMjMzLDggKzE5ODEsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSTI0YW5kcm9pZF9kYXRhc3BhY2VfdjFfMl90IiwKICAgICJuYW1lIiA6ICJhbmRyb2lkX2RhdGFzcGFjZV92MV8yX3QiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTI0YW5kcm9pZF9kYXRhc3BhY2VfdjFfMl90IiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVEkyNGFuZHJvaWRfZGF0YXNwYWNlX3YxXzJfdCIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJzeXN0ZW0vaW5jbHVkZS9zeXN0ZW0vZ3JhcGhpY3MtYmFzZS12MS4yLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0yMjU4LDggKzIwMDQsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSTI1YW5kcm9pZF9jb2xvcl9tb2RlX3YxXzFfdCIsCiAgICAibmFtZSIgOiAiYW5kcm9pZF9jb2xvcl9tb2RlX3YxXzFfdCIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJMjVhbmRyb2lkX2NvbG9yX21vZGVfdjFfMV90IiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVEkyNWFuZHJvaWRfY29sb3JfbW9kZV92MV8xX3QiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlic3lzdGVtL2luY2x1ZGUvc3lzdGVtL2dyYXBoaWNzLWJhc2UtdjEuMS5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMjI2OSw2ICsyMDEzLDIxIEBACiAgICAiZW51bV9maWVsZHMiIDoKICAgIFsKICAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEzLAorICAgICAibmFtZSIgOiAiSEFMX0NPTE9SX01PREVfRElTUExBWV9CVDIwMjAiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSTI1YW5kcm9pZF9jb2xvcl9tb2RlX3YxXzJfdCIsCisgICAibmFtZSIgOiAiYW5kcm9pZF9jb2xvcl9tb2RlX3YxXzJfdCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJzeXN0ZW0vaW5jbHVkZS9zeXN0ZW0vZ3JhcGhpY3MtYmFzZS12MS4yLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMCwKICAgICAgIm5hbWUiIDogIkhBTF9DT0xPUl9UUkFOU0ZPUk1fSURFTlRJVFkiCiAgICAgfSwKQEAgLTIyOTksOCArMjA1OCw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJMjVhbmRyb2lkX2NvbG9yX3RyYW5zZm9ybV90IiwKICAgICJuYW1lIiA6ICJhbmRyb2lkX2NvbG9yX3RyYW5zZm9ybV90IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkyNWFuZHJvaWRfY29sb3JfdHJhbnNmb3JtX3QiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSTI1YW5kcm9pZF9jb2xvcl90cmFuc2Zvcm1fdCIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJzeXN0ZW0vaW5jbHVkZS9zeXN0ZW0vZ3JhcGhpY3MtYmFzZS12MS4wLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0yMzI4LDggKzIwODUsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSTI1YW5kcm9pZF9waXhlbF9mb3JtYXRfc3dfdCIsCiAgICAibmFtZSIgOiAiYW5kcm9pZF9waXhlbF9mb3JtYXRfc3dfdCIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJMjVhbmRyb2lkX3BpeGVsX2Zvcm1hdF9zd190IiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVEkyNWFuZHJvaWRfcGl4ZWxfZm9ybWF0X3N3X3QiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlic3lzdGVtL2luY2x1ZGUvc3lzdGVtL2dyYXBoaWNzLXN3LmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0yMzY5LDggKzIxMjQsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSTI3YW5kcm9pZF9waXhlbF9mb3JtYXRfdjFfMV90IiwKICAgICJuYW1lIiA6ICJhbmRyb2lkX3BpeGVsX2Zvcm1hdF92MV8xX3QiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTI3YW5kcm9pZF9waXhlbF9mb3JtYXRfdjFfMV90IiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVEkyN2FuZHJvaWRfcGl4ZWxfZm9ybWF0X3YxXzFfdCIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJzeXN0ZW0vaW5jbHVkZS9zeXN0ZW0vZ3JhcGhpY3MtYmFzZS12MS4xLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0yMzg2LDggKzIxMzksNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSTI3YW5kcm9pZF9waXhlbF9mb3JtYXRfdjFfMl90IiwKICAgICJuYW1lIiA6ICJhbmRyb2lkX3BpeGVsX2Zvcm1hdF92MV8yX3QiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTI3YW5kcm9pZF9waXhlbF9mb3JtYXRfdjFfMl90IiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVEkyN2FuZHJvaWRfcGl4ZWxfZm9ybWF0X3YxXzJfdCIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJzeXN0ZW0vaW5jbHVkZS9zeXN0ZW0vZ3JhcGhpY3MtYmFzZS12MS4yLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0yNDE1LDggKzIxNjYsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSTI4YW5kcm9pZF9yZW5kZXJfaW50ZW50X3YxXzFfdCIsCiAgICAibmFtZSIgOiAiYW5kcm9pZF9yZW5kZXJfaW50ZW50X3YxXzFfdCIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJMjhhbmRyb2lkX3JlbmRlcl9pbnRlbnRfdjFfMV90IiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVEkyOGFuZHJvaWRfcmVuZGVyX2ludGVudF92MV8xX3QiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlic3lzdGVtL2luY2x1ZGUvc3lzdGVtL2dyYXBoaWNzLWJhc2UtdjEuMS5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMjQ3Miw4ICsyMjIxLDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEk2bG9nX2lkIiwKICAgICJuYW1lIiA6ICJsb2dfaWQiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTZsb2dfaWQiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSTZsb2dfaWQiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2xvZ2dpbmcvbGlibG9nL2luY2x1ZGVfdm5kay9hbmRyb2lkL2xvZy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMjQ5Nyw4ICsyMjQ0LDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxMFZlY3RvckltcGwxNyRIQVNfVFJJVklBTF9DT1BZRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxMFZlY3RvckltcGwxNyRIQVNfVFJJVklBTF9DT1BZRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTBWZWN0b3JJbXBsMTckSEFTX1RSSVZJQUxfQ09QWUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0yNTA4LDE0ICsyMjUzLDM2IEBACiAgICAiZW51bV9maWVsZHMiIDoKICAgIFsKICAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjpIQVNfVFJJVklBTF9DVE9SIgorICAgIH0sCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAyLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6SEFTX1RSSVZJQUxfRFRPUiIKKyAgICB9LAorICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogNCwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6OkhBU19UUklWSUFMX0NPUFkiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDEwVmVjdG9ySW1wbDE3JEhBU19UUklWSUFMX0NPUFlFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjoodW5uYW1lZCkiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEwVmVjdG9ySW1wbDE3JEhBU19UUklWSUFMX0NPUFlFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAwLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfcG9pbnRlcjxhbmRyb2lkOjpzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvPjo6dmFsdWUiCiAgICAgfQogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDEzdHJhaXRfcG9pbnRlcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF9wb2ludGVyPGFuZHJvaWQ6OnN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm8+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEzdHJhaXRfcG9pbnRlcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxM3RyYWl0X3BvaW50ZXJJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUU2JHZhbHVlRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0yNTMxLDggKzIyOTgsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDEzdHJhaXRfcG9pbnRlcklOU182TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF9wb2ludGVyPGFuZHJvaWQ6Okxvb3Blcjo6TWVzc2FnZUVudmVsb3BlPjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxM3RyYWl0X3BvaW50ZXJJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUU2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTN0cmFpdF9wb2ludGVySU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFNiR2YWx1ZUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMjU0OCw4ICsyMzEzLDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxM3RyYWl0X3BvaW50ZXJJTlNfNkxvb3BlcjhSZXNwb25zZUVFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3BvaW50ZXI8YW5kcm9pZDo6TG9vcGVyOjpSZXNwb25zZT46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTN0cmFpdF9wb2ludGVySU5TXzZMb29wZXI4UmVzcG9uc2VFRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxM3RyYWl0X3BvaW50ZXJJTlNfNkxvb3BlcjhSZXNwb25zZUVFNiR2YWx1ZUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMjY0MSw4ICsyNDA0LDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxNSRBTFJFQURZX0VYSVNUU0UiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTUkQUxSRUFEWV9FWElTVFNFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNSRBTFJFQURZX0VYSVNUU0UiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9FcnJvcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaSIKQEAgLTI2NTIsNiArMjQxMyw5OCBAQAogICAgImVudW1fZmllbGRzIiA6CiAgICBbCiAgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAwLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6T0siCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDAsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpOT19FUlJPUiIKKyAgICB9LAorICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogLTIxNDc0ODM2NDgsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpVTktOT1dOX0VSUk9SIgorICAgIH0sCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAtMTIsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpOT19NRU1PUlkiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IC0zOCwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OklOVkFMSURfT1BFUkFUSU9OIgorICAgIH0sCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAtMjIsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpCQURfVkFMVUUiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IC0yMTQ3NDgzNjQ3LAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6QkFEX1RZUEUiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IC0yLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6TkFNRV9OT1RfRk9VTkQiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IC0xLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6UEVSTUlTU0lPTl9ERU5JRUQiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IC0xOSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6Ok5PX0lOSVQiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IC0xNywKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OkFMUkVBRFlfRVhJU1RTIgorICAgIH0sCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAtMzIsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpERUFEX09CSkVDVCIKKyAgICB9LAorICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogLTIxNDc0ODM2NDYsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpGQUlMRURfVFJBTlNBQ1RJT04iCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IC03NSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OkJBRF9JTkRFWCIKKyAgICB9LAorICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogLTYxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6Tk9UX0VOT1VHSF9EQVRBIgorICAgIH0sCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAtMTEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpXT1VMRF9CTE9DSyIKKyAgICB9LAorICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogLTExMCwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OlRJTUVEX09VVCIKKyAgICB9LAorICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogLTc0LAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTiIKKyAgICB9LAorICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogLTIxNDc0ODM2NDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpGRFNfTk9UX0FMTE9XRUQiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IC0yMTQ3NDgzNjQwLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6VU5FWFBFQ1RFRF9OVUxMIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxNSRBTFJFQURZX0VYSVNUU0UiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6Oih1bm5hbWVkKSIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTUkQUxSRUFEWV9FWElTVFNFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9FcnJvcnMuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvRXJyb3JzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWkiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMTksCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpQUklPUklUWV9MT1dFU1QiCiAgICAgfSwKQEAgLTI3MDIsOCArMjU1NSw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTUkUFJJT1JJVFlfQVVESU9FIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE1JFBSSU9SSVRZX0FVRElPRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTUkUFJJT1JJVFlfQVVESU9FIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVGhyZWFkRGVmcy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElpIgpAQCAtMjcxOSw4ICsyNTcwLDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8YW5kcm9pZDo6c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mbz46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUU2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUU2JHZhbHVlRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0yNzM2LDggKzI1ODUsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxhbmRyb2lkOjpMb29wZXI6Ok1lc3NhZ2VFbnZlbG9wZT46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUU2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUU2JHZhbHVlRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0yNzUzLDggKzI2MDAsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SU5TXzZMb29wZXI4UmVzcG9uc2VFRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8YW5kcm9pZDo6TG9vcGVyOjpSZXNwb25zZT46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJTlNfNkxvb3BlcjhSZXNwb25zZUVFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SU5TXzZMb29wZXI4UmVzcG9uc2VFRTYkdmFsdWVFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTI3NzAsOCArMjYxNSwzNyBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWJFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxib29sPjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUliRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUliRTYkdmFsdWVFIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGJvb2w+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJYkU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGJvb2w+OjoodW5uYW1lZCkiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWJFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGNoYXI+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJY0U2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGNoYXI+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMjc4Nyw4ICsyNjYxLDIyIEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJY0U2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGNoYXI+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWNFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWNFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWNFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGRvdWJsZT46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlkRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8ZG91YmxlPjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTI4MDQsOCArMjY5MiwyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWRFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxkb3VibGU+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWRFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWRFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWRFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGZsb2F0Pjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWZFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxmbG9hdD46Oih1bm5hbWVkKSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0yODIxLDggKzI3MjMsMjIgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlmRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8ZmxvYXQ+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWZFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWZFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWZFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGNoYXI+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJaEU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGNoYXI+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMjgzOCw4ICsyNzU0LDIyIEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJaEU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGNoYXI+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWhFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWhFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWhFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGludD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlpRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8aW50Pjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTI4NTUsOCArMjc4NSwyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWlFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxpbnQ+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWlFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWlFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWlFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGludD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlqRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dW5zaWduZWQgaW50Pjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTI4NzIsOCArMjgxNiwyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWpFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTx1bnNpZ25lZCBpbnQ+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWpFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWpFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWpFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGxvbmc+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJbEU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGxvbmc+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMjg4OSw4ICsyODQ3LDIyIEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJbEU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGxvbmc+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWxFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWxFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWxFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGxvbmc+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJbUU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGxvbmc+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMjkwNiw4ICsyODc4LDIyIEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJbUU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGxvbmc+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SW1FNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SW1FNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SW1FNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHNob3J0Pjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXNFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxzaG9ydD46Oih1bm5hbWVkKSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0yOTIzLDggKzI5MDksMjIgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlzRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8c2hvcnQ+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXNFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXNFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXNFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIHNob3J0Pjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXRFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTx1bnNpZ25lZCBzaG9ydD46Oih1bm5hbWVkKSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0yOTQwLDggKzI5NDAsMjIgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl0RTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dW5zaWduZWQgc2hvcnQ+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXRFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXRFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXRFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHZvaWQ+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJdkU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHZvaWQ+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMjk1Nyw4ICsyOTcxLDIyIEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJdkU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHZvaWQ+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXZFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXZFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXZFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGxvbmcgbG9uZz46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl4RTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8bG9uZyBsb25nPjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTI5NzQsOCArMzAwMiwyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXhFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxsb25nIGxvbmc+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXhFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXhFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXhFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGxvbmcgbG9uZz46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl5RTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dW5zaWduZWQgbG9uZyBsb25nPjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTI5OTEsMTAgKzMwMzMsOSBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXlFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTx1bnNpZ25lZCBsb25nIGxvbmc+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXlFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXlFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXlFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAogICAgInNpemUiIDogNCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKICAgfSwKICAgewpAQCAtMzAwOCw4ICszMDQ5LDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8YW5kcm9pZDo6c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mbz46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUU2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUU2JHZhbHVlRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zMDI1LDggKzMwNjQsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxhbmRyb2lkOjpMb29wZXI6Ok1lc3NhZ2VFbnZlbG9wZT46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUU2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUU2JHZhbHVlRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zMDQyLDggKzMwNzksNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySU5TXzZMb29wZXI4UmVzcG9uc2VFRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8YW5kcm9pZDo6TG9vcGVyOjpSZXNwb25zZT46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJTlNfNkxvb3BlcjhSZXNwb25zZUVFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySU5TXzZMb29wZXI4UmVzcG9uc2VFRTYkdmFsdWVFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTMwNTksOCArMzA5NCwzNyBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWJFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjxib29sPjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckliRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckliRTYkdmFsdWVFIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGJvb2w+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJYkU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGJvb2w+OjoodW5uYW1lZCkiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWJFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGNoYXI+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJY0U2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGNoYXI+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMzA3Niw4ICszMTQwLDIyIEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJY0U2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGNoYXI+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWNFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWNFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWNFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGRvdWJsZT46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklkRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8ZG91YmxlPjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTMwOTMsOCArMzE3MSwyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWRFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjxkb3VibGU+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWRFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWRFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWRFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGZsb2F0Pjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWZFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxmbG9hdD46Oih1bm5hbWVkKSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zMTEwLDggKzMyMDIsMjIgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklmRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8ZmxvYXQ+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWZFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWZFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWZFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHVuc2lnbmVkIGNoYXI+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJaEU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHVuc2lnbmVkIGNoYXI+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMzEyNyw4ICszMjMzLDIyIEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJaEU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHVuc2lnbmVkIGNoYXI+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWhFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWhFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWhFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGludD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklpRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8aW50Pjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTMxNDQsOCArMzI2NCwyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWlFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxpbnQ+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWlFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWlFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWlFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHVuc2lnbmVkIGludD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklqRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgaW50Pjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTMxNjEsOCArMzI5NSwyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWpFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBpbnQ+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWpFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWpFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWpFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGxvbmc+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJbEU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGxvbmc+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMzE3OCw4ICszMzI2LDIyIEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJbEU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGxvbmc+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWxFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWxFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWxFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHVuc2lnbmVkIGxvbmc+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJbUU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHVuc2lnbmVkIGxvbmc+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMzE5NSw4ICszMzU3LDIyIEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJbUU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHVuc2lnbmVkIGxvbmc+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySW1FNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySW1FNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySW1FNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHNob3J0Pjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXNFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxzaG9ydD46Oih1bm5hbWVkKSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zMjEyLDggKzMzODgsMjIgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklzRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8c2hvcnQ+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXNFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXNFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXNFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHVuc2lnbmVkIHNob3J0Pjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXRFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBzaG9ydD46Oih1bm5hbWVkKSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zMjI5LDggKzM0MTksMjIgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl0RTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgc2hvcnQ+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXRFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXRFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXRFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHZvaWQ+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJdkU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHZvaWQ+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMzI0Niw4ICszNDUwLDIyIEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJdkU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHZvaWQ+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXZFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXZFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXZFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGxvbmcgbG9uZz46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl4RTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8bG9uZyBsb25nPjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTMyNjMsOCArMzQ4MSwyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXhFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjxsb25nIGxvbmc+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXhFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXhFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXhFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHVuc2lnbmVkIGxvbmcgbG9uZz46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl5RTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgbG9uZyBsb25nPjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTMyODAsMTAgKzM1MTIsOSBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXlFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBsb25nIGxvbmc+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXlFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXlFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXlFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAogICAgInNpemUiIDogNCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKICAgfSwKICAgewpAQCAtMzI5Nyw4ICszNTI4LDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8YW5kcm9pZDo6c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mbz46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUU2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUU2JHZhbHVlRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zMzE0LDggKzM1NDMsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxhbmRyb2lkOjpMb29wZXI6Ok1lc3NhZ2VFbnZlbG9wZT46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUU2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUU2JHZhbHVlRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zMzMxLDggKzM1NTgsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySU5TXzZMb29wZXI4UmVzcG9uc2VFRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8YW5kcm9pZDo6TG9vcGVyOjpSZXNwb25zZT46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJTlNfNkxvb3BlcjhSZXNwb25zZUVFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySU5TXzZMb29wZXI4UmVzcG9uc2VFRTYkdmFsdWVFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTMzNDgsOCArMzU3MywzNyBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWJFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxib29sPjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckliRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckliRTYkdmFsdWVFIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGJvb2w+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJYkU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGJvb2w+OjoodW5uYW1lZCkiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWJFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGNoYXI+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJY0U2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGNoYXI+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMzM2NSw4ICszNjE5LDIyIEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJY0U2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGNoYXI+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWNFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWNFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWNFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGRvdWJsZT46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklkRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8ZG91YmxlPjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTMzODIsOCArMzY1MCwyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWRFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxkb3VibGU+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWRFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWRFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWRFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGZsb2F0Pjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWZFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxmbG9hdD46Oih1bm5hbWVkKSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zMzk5LDggKzM2ODEsMjIgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklmRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8ZmxvYXQ+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWZFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWZFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWZFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHVuc2lnbmVkIGNoYXI+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJaEU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHVuc2lnbmVkIGNoYXI+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMzQxNiw4ICszNzEyLDIyIEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJaEU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHVuc2lnbmVkIGNoYXI+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWhFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWhFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWhFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGludD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklpRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8aW50Pjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTM0MzMsOCArMzc0MywyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWlFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxpbnQ+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWlFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWlFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWlFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHVuc2lnbmVkIGludD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklqRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgaW50Pjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTM0NTAsOCArMzc3NCwyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWpFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBpbnQ+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWpFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWpFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWpFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGxvbmc+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJbEU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGxvbmc+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMzQ2Nyw4ICszODA1LDIyIEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJbEU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGxvbmc+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWxFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWxFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWxFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHVuc2lnbmVkIGxvbmc+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJbUU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHVuc2lnbmVkIGxvbmc+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMzQ4NCw4ICszODM2LDIyIEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJbUU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHVuc2lnbmVkIGxvbmc+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySW1FNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySW1FNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySW1FNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHNob3J0Pjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXNFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxzaG9ydD46Oih1bm5hbWVkKSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zNTAxLDggKzM4NjcsMjIgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklzRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8c2hvcnQ+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXNFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXNFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXNFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHVuc2lnbmVkIHNob3J0Pjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXRFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBzaG9ydD46Oih1bm5hbWVkKSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zNTE4LDggKzM4OTgsMjIgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl0RTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgc2hvcnQ+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXRFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXRFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXRFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHZvaWQ+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJdkU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHZvaWQ+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMzUzNSw4ICszOTI5LDIyIEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJdkU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHZvaWQ+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXZFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXZFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXZFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGxvbmcgbG9uZz46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl4RTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8bG9uZyBsb25nPjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTM1NTIsOCArMzk2MCwyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXhFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxsb25nIGxvbmc+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXhFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXhFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXhFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHVuc2lnbmVkIGxvbmcgbG9uZz46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl5RTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgbG9uZyBsb25nPjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTM1NjksMTAgKzM5OTEsOSBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXlFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBsb25nIGxvbmc+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXlFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXlFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXlFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAogICAgInNpemUiIDogNCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKICAgfSwKICAgewpAQCAtMzU4Niw4ICs0MDA3LDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8YW5kcm9pZDo6c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mbz46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUU2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUU2JHZhbHVlRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zNjAzLDggKzQwMjIsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxhbmRyb2lkOjpMb29wZXI6Ok1lc3NhZ2VFbnZlbG9wZT46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUU2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUU2JHZhbHVlRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zNjIwLDggKzQwMzcsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSU5TXzZMb29wZXI4UmVzcG9uc2VFRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8YW5kcm9pZDo6TG9vcGVyOjpSZXNwb25zZT46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfNkxvb3BlcjhSZXNwb25zZUVFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSU5TXzZMb29wZXI4UmVzcG9uc2VFRTYkdmFsdWVFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTM2MzcsOCArNDA1Miw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfN1N0cmluZzhFRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8YW5kcm9pZDo6U3RyaW5nOD46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfN1N0cmluZzhFRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlOU183U3RyaW5nOEVFNiR2YWx1ZUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zNjQ5LDE1ICs0MDYyLDI5IEBACiAgICBbCiAgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGFuZHJvaWQ6OlN0cmluZzg+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfN1N0cmluZzhFRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8YW5kcm9pZDo6U3RyaW5nOD46Oih1bm5hbWVkKSIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfN1N0cmluZzhFRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGFuZHJvaWQ6OlN0cmluZzE2Pjo6dmFsdWUiCiAgICAgfQogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSU5TXzhTdHJpbmcxNkVFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxhbmRyb2lkOjpTdHJpbmcxNj46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfOFN0cmluZzE2RUU2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfOFN0cmluZzE2RUU2JHZhbHVlRSIsCiAgICAic2l6ZSIgOiA0LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgogICB9LAogICB7CkBAIC0zNjcxLDggKzQwOTgsMzcgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUliRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8Ym9vbD46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJYkU2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJYkU2JHZhbHVlRSIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxib29sPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWJFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxib29sPjo6KHVubmFtZWQpIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUliRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxjaGFyPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWNFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxjaGFyPjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTM2ODgsOCArNDE0NCwyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWNFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxjaGFyPjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUljRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUljRTYkdmFsdWVFIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUljRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxkb3VibGU+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJZEU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGRvdWJsZT46Oih1bm5hbWVkKSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zNzA1LDggKzQxNzUsMjIgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlkRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8ZG91YmxlPjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlkRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlkRTYkdmFsdWVFIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlkRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxmbG9hdD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlmRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8ZmxvYXQ+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMzcyMiw4ICs0MjA2LDIyIEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJZkU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGZsb2F0Pjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlmRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlmRTYkdmFsdWVFIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlmRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBjaGFyPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWhFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBjaGFyPjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTM3MzksOCArNDIzNywyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWhFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBjaGFyPjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUloRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUloRTYkdmFsdWVFIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUloRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxpbnQ+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJaUU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGludD46Oih1bm5hbWVkKSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zNzU2LDggKzQyNjgsMjIgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlpRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8aW50Pjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlpRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlpRTYkdmFsdWVFIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlpRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBpbnQ+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJakU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHVuc2lnbmVkIGludD46Oih1bm5hbWVkKSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zNzczLDggKzQyOTksMjIgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlqRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8dW5zaWduZWQgaW50Pjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlqRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlqRTYkdmFsdWVFIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlqRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxsb25nPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWxFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxsb25nPjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTM3OTAsOCArNDMzMCwyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWxFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxsb25nPjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlsRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlsRTYkdmFsdWVFIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlsRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBsb25nPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSW1FNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBsb25nPjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTM4MDcsOCArNDM2MSwyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSW1FNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBsb25nPjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUltRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUltRTYkdmFsdWVFIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUltRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxzaG9ydD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlzRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8c2hvcnQ+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMzgyNCw4ICs0MzkyLDIyIEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJc0U2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHNob3J0Pjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlzRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlzRTYkdmFsdWVFIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlzRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBzaG9ydD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl0RTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8dW5zaWduZWQgc2hvcnQ+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMzg0MSw4ICs0NDIzLDIyIEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJdEU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHVuc2lnbmVkIHNob3J0Pjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl0RTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl0RTYkdmFsdWVFIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl0RTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx2b2lkPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXZFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx2b2lkPjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTM4NTgsOCArNDQ1NCwyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXZFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx2b2lkPjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl2RTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl2RTYkdmFsdWVFIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl2RTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxsb25nIGxvbmc+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJeEU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGxvbmcgbG9uZz46Oih1bm5hbWVkKSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zODc1LDggKzQ0ODUsMjIgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl4RTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8bG9uZyBsb25nPjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl4RTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl4RTYkdmFsdWVFIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl4RTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBsb25nIGxvbmc+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJeUU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHVuc2lnbmVkIGxvbmcgbG9uZz46Oih1bm5hbWVkKSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zODkyLDEwICs0NTE2LDkgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl5RTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8dW5zaWduZWQgbG9uZyBsb25nPjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl5RTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl5RTYkdmFsdWVFIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl5RTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKICAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCiAgIH0sCiAgIHsKQEAgLTM5MTMsOCArNDUzNiw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkNU11dGV4OCRQUklWQVRFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6TXV0ZXg6Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNU11dGV4OCRQUklWQVRFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNU11dGV4OCRQUklWQVRFRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL011dGV4LmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zOTQ2LDggKzQ1NjcsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDZMb29wZXIxMiRFVkVOVF9FUlJPUkUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6Okxvb3Blcjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2TG9vcGVyMTIkRVZFTlRfRVJST1JFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2TG9vcGVyMTIkRVZFTlRfRVJST1JFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTG9vcGVyLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zOTc1LDggKzQ1OTQsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDZMb29wZXIxNCRQT0xMX0NBTExCQUNLRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6TG9vcGVyOjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZMb29wZXIxNCRQT0xMX0NBTExCQUNLRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNkxvb3BlcjE0JFBPTExfQ0FMTEJBQ0tFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTG9vcGVyLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWkiCkBAIC0zOTkyLDggKzQ2MDksNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDZMb29wZXIyOCRQUkVQQVJFX0FMTE9XX05PTl9DQUxMQkFDS1NFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpMb29wZXI6Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNkxvb3BlcjI4JFBSRVBBUkVfQUxMT1dfTk9OX0NBTExCQUNLU0UiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZMb29wZXIyOCRQUkVQQVJFX0FMTE9XX05PTl9DQUxMQkFDS1NFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTG9vcGVyLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC00MDEzLDggKzQ2MjgsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDZSV0xvY2s4JFBSSVZBVEVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpSV0xvY2s6Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNlJXTG9jazgkUFJJVkFURUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZSV0xvY2s4JFBSSVZBVEVFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUldMb2NrLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC00MDQ2LDggKzQ2NTksNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDZ0cmFpdHNJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUUxNyRoYXNfdHJpdmlhbF9jb3B5RSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRzPGFuZHJvaWQ6OnN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm8+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZ0cmFpdHNJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUUxNyRoYXNfdHJpdmlhbF9jb3B5RSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNnRyYWl0c0lOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRTE3JGhhc190cml2aWFsX2NvcHlFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTQwNzksOCArNDY5MCw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkNnRyYWl0c0lOU182TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFRTE3JGhhc190cml2aWFsX2NvcHlFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdHM8YW5kcm9pZDo6TG9vcGVyOjpNZXNzYWdlRW52ZWxvcGU+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZ0cmFpdHNJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUUxNyRoYXNfdHJpdmlhbF9jb3B5RSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNnRyYWl0c0lOU182TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFRTE3JGhhc190cml2aWFsX2NvcHlFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTQxMTIsOCArNDcyMSw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkNnRyYWl0c0lOU182TG9vcGVyOFJlc3BvbnNlRUUxNyRoYXNfdHJpdmlhbF9jb3B5RSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRzPGFuZHJvaWQ6Okxvb3Blcjo6UmVzcG9uc2U+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZ0cmFpdHNJTlNfNkxvb3BlcjhSZXNwb25zZUVFMTckaGFzX3RyaXZpYWxfY29weUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZ0cmFpdHNJTlNfNkxvb3BlcjhSZXNwb25zZUVFMTckaGFzX3RyaXZpYWxfY29weUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtNDE0NSw4ICs0NzUyLDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ3RmlsZU1hcDlNYXBBZHZpY2VFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpGaWxlTWFwOjpNYXBBZHZpY2UiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdGaWxlTWFwOU1hcEFkdmljZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdGaWxlTWFwOU1hcEFkdmljZUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9GaWxlTWFwLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC00MTYzLDggKzQ3NjgsNDcgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZTE3JEZJUlNUX0lOQ19TVFJPTkdFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlOjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdSZWZCYXNlMTckRklSU1RfSU5DX1NUUk9OR0UiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdSZWZCYXNlMTckRklSU1RfSU5DX1NUUk9OR0UiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhY2Nlc3MiIDogInByb3RlY3RlZCIsCisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlOjpGSVJTVF9JTkNfU1RST05HIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZTE3JEZJUlNUX0lOQ19TVFJPTkdFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlOjoodW5uYW1lZCkiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdSZWZCYXNlMTckRklSU1RfSU5DX1NUUk9OR0UjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWNjZXNzIiA6ICJwcm90ZWN0ZWQiLAorICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAwLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6T0JKRUNUX0xJRkVUSU1FX1NUUk9ORyIKKyAgICB9LAorICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6Ok9CSkVDVF9MSUZFVElNRV9XRUFLIgorICAgIH0sCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6T0JKRUNUX0xJRkVUSU1FX01BU0siCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDdSZWZCYXNlMjEkT0JKRUNUX0xJRkVUSU1FX01BU0tFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlOjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC00MTg5LDEwICs0ODMzLDkgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZTIxJE9CSkVDVF9MSUZFVElNRV9NQVNLRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZTIxJE9CSkVDVF9MSUZFVElNRV9NQVNLRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2UyMSRPQkpFQ1RfTElGRVRJTUVfTUFTS0UiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdSZWZCYXNlMjEkT0JKRUNUX0xJRkVUSU1FX01BU0tFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKICAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgogICB9LAogICB7CkBAIC00MjEwLDggKzQ4NTMsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDlDb25kaXRpb24xMFdha2VVcFR5cGVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpDb25kaXRpb246Oldha2VVcFR5cGUiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDlDb25kaXRpb24xMFdha2VVcFR5cGVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ5Q29uZGl0aW9uMTBXYWtlVXBUeXBlRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0NvbmRpdGlvbi5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtNDIzMSw4ICs0ODcyLDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ5Q29uZGl0aW9uOCRQUklWQVRFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6Q29uZGl0aW9uOjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDlDb25kaXRpb244JFBSSVZBVEVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ5Q29uZGl0aW9uOCRQUklWQVRFRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0NvbmRpdGlvbi5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtNDI0OSw4ICs0ODg4LDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ5RmRQcmludGVyMTgkTUFYX0ZPUk1BVF9TVFJJTkdFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpGZFByaW50ZXI6Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkOUZkUHJpbnRlcjE4JE1BWF9GT1JNQVRfU1RSSU5HRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkOUZkUHJpbnRlcjE4JE1BWF9GT1JNQVRfU1RSSU5HRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ByaW50ZXIuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTQyODMsOSArNDkyMCw3IEBACiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQUHYiCiAgICAgfQogICAgXSwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElGaVBGaVB2RVNfUEtjaW1QU19FIiwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUZpUEZpUHZFU19QS2NpbVBTX0UiLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0FuZHJvaWRUaHJlYWRzLmgiCiAgIH0sCiAgIHsKQEAgLTQzMDEsMTAgKzQ5MzYsOCBAQAogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEt2IgogICAgIH0KICAgIF0sCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJRmlQS3ZTMF9FIiwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUZpUEt2UzBfRSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKQEAgLTQzMjIsMTAgKzQ5NTUsOCBAQAogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCiAgICAgfQogICAgXSwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElGaVBLdlMwX1B2RSIsCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElGaVBLdlMwX1B2RSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKQEAgLTQzMzcsOSArNDk2OCw3IEBACiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIKICAgICB9CiAgICBdLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUZpUHZFIiwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUZpUHZFIiwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9BbmRyb2lkVGhyZWFkcy5oIgogICB9LAogICB7CkBAIC00MzU4LDE4ICs0OTg3LDE0IEBACiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIKICAgICB9CiAgICBdLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUZpaWlQdkUiLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJRmlpaVB2RSIsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElGdnZFIiwKICAgICJuYW1lIiA6ICJ2b2lkICgpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElGdnZFIiwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUZ2dkUiLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL21pc2MuaCIKICAgfQogIF0sCkBAIC00NDgxLDcgKzUxMDYsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElsIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6OnNldENhcGFjaXR5IiwKQEAgLTQ0OTcsNyArNTEyMiw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWwiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6YXBwZW5kVmVjdG9yIiwKQEAgLTQ1MTMsNyArNTEzOCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWwiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6ZWRpdEFycmF5SW1wbCIsCkBAIC00NTI2LDcgKzUxNTEsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElQdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjpmaW5pc2hfdmVjdG9yIiwKQEAgLTQ1MzksNyArNTE2NCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6aW5zZXJ0QXJyYXlBdCIsCkBAIC00NTYxLDcgKzUxODYsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElsIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6OnJlbW92ZUl0ZW1zQXQiLApAQCAtNDU4MSw3ICs1MjA2LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJbCIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjppbnNlcnRWZWN0b3JBdCIsCkBAIC00NjAwLDcgKzUyMjUsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElsIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJvdGVjdGVkIiwKQEAgLTQ2MTQsNyArNTIzOSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6ZWRpdEl0ZW1Mb2NhdGlvbiIsCkBAIC00NjMwLDcgKzUyNTUsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElQdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjphZGQiLApAQCAtNDY0Niw3ICs1MjcxLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJbCIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjphZGQiLApAQCAtNDY1OSw3ICs1Mjg0LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJbCIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjpwb3AiLApAQCAtNDY3Miw3ICs1Mjk3LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjpwdXNoIiwKQEAgLTQ2ODgsNyArNTMxMyw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6cHVzaCIsCkBAIC00NzAxLDcgKzUzMjYsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6OnNvcnQiLApAQCAtNDcxNyw3ICs1MzQyLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjpzb3J0IiwKQEAgLTQ3MzYsNyArNTM2MSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKQEAgLTQ3NTYsNyArNTM4MSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVB2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6OmNsZWFyIiwKQEAgLTQ3NjksNyArNTM5NCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6cmVzaXplIiwKQEAgLTQ3ODUsNyArNTQxMCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWwiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKQEAgLTQ4MDUsNyArNTQzMCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6aW5zZXJ0QXQiLApAQCAtNDgyOCw3ICs1NDUzLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJbCIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjppbnNlcnRBdCIsCkBAIC00ODQ4LDcgKzU0NzMsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElsIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6OnJlcGxhY2VBdCIsCkBAIC00ODY3LDcgKzU0OTIsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElsIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6OnJlcGxhY2VBdCIsCkBAIC00ODgzLDcgKzU1MDgsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElsIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6OlZlY3RvckltcGwiLApAQCAtNDg5OSw3ICs1NTI0LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjpWZWN0b3JJbXBsIiwKQEAgLTQ5MTgsNyArNTU0Myw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6flZlY3RvckltcGwiLApAQCAtNDkzMSw3ICs1NTU2LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjp+VmVjdG9ySW1wbCIsCkBAIC00OTQ0LDcgKzU1NjksNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6On5WZWN0b3JJbXBsIiwKQEAgLTQ5NTcsNyArNTU4Miw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6b3BlcmF0b3I9IiwKQEAgLTQ5NzMsNyArNTU5OCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVJON2FuZHJvaWQxMFZlY3RvckltcGxFIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OnVwdGltZU5hbm9zIiwKQEAgLTUyNzQsNyArNTg5OSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSU5TdDNfXzExMmJhc2ljX3N0cmluZ0ljTlNfMTFjaGFyX3RyYWl0c0ljRUVOU185YWxsb2NhdG9ySWNFRUVFIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9FcnJvcnMuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvRXJyb3JzLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjplbGFwc2VkUmVhbHRpbWUiLApAQCAtNTI5Niw3ICs1OTIxLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJbCIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTb3J0ZWRWZWN0b3JJbXBsOjptZXJnZSIsCkBAIC01MzEyLDcgKzU5MzcsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElsIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlNvcnRlZFZlY3RvckltcGw6Om1lcmdlIiwKQEAgLTUzMjgsNyArNTk1Myw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWwiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U29ydGVkVmVjdG9ySW1wbDo6cmVtb3ZlIiwKQEAgLTUzNDQsNyArNTk2OSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWwiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U29ydGVkVmVjdG9ySW1wbDo6U29ydGVkVmVjdG9ySW1wbCIsCkBAIC01MzYwLDcgKzU5ODUsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlNvcnRlZFZlY3RvckltcGw6OlNvcnRlZFZlY3RvckltcGwiLApAQCAtNTM3OSw3ICs2MDA0LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTb3J0ZWRWZWN0b3JJbXBsOjp+U29ydGVkVmVjdG9ySW1wbCIsCkBAIC01MzkyLDcgKzYwMTcsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlNvcnRlZFZlY3RvckltcGw6On5Tb3J0ZWRWZWN0b3JJbXBsIiwKQEAgLTU0MDUsNyArNjAzMCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U29ydGVkVmVjdG9ySW1wbDo6flNvcnRlZFZlY3RvckltcGwiLApAQCAtNTQxOCw3ICs2MDQzLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTb3J0ZWRWZWN0b3JJbXBsOjpvcGVyYXRvcj0iLApAQCAtNTQzNCw3ICs2MDU5LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJUk43YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6SmVua2luc0hhc2hXaGl0ZW4iLApAQCAtNTcxMCwxMyArNjMzNSw2IEBACiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTGlnaHRSZWZCYXNlLmgiCiAgIH0sCiAgIHsKLSAgICJhY2Nlc3MiIDogInByaXZhdGUiLAotICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6Okxvb3Blcjo6aW5pdFRMU0tleSIsCi0gICAibGlua2VyX3NldF9rZXkiIDogIl9aTjdhbmRyb2lkNkxvb3BlcjEwaW5pdFRMU0tleUV2IiwKLSAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0xvb3Blci5oIgotICB9LAotICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6TG9vcGVyOjpzZW5kTWVzc2FnZSIsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aTjdhbmRyb2lkNkxvb3BlcjExc2VuZE1lc3NhZ2VFUktOU18yc3BJTlNfMTRNZXNzYWdlSGFuZGxlckVFRVJLTlNfN01lc3NhZ2VFIiwKICAgICJwYXJhbWV0ZXJzIiA6CkBAIC01Nzg5LDE2ICs2NDA3LDMxIEBACiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTG9vcGVyLmgiCiAgIH0sCiAgIHsKLSAgICJhY2Nlc3MiIDogInByaXZhdGUiLAotICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6Okxvb3Blcjo6dGhyZWFkRGVzdHJ1Y3RvciIsCi0gICAibGlua2VyX3NldF9rZXkiIDogIl9aTjdhbmRyb2lkNkxvb3BlcjE2dGhyZWFkRGVzdHJ1Y3RvckVQdiIsCisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6TG9vcGVyOjpnZXRGZFN0YXRlRGVidWciLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWk43YW5kcm9pZDZMb29wZXIxNWdldEZkU3RhdGVEZWJ1Z0VpUGlTMV9QTlNfMnNwSU5TXzE0TG9vcGVyQ2FsbGJhY2tFRUVQUHYiLAogICAgInBhcmFtZXRlcnMiIDoKICAgIFsKICAgICB7Ci0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIKKyAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkNkxvb3BlckUiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUGkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQaSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQyc3BJTlNfMTRMb29wZXJDYWxsYmFja0VFRSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBQdiIKICAgICB9CiAgICBdLAotICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAicmV0dXJuX3R5cGUiIDogIl9aVEliIiwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Mb29wZXIuaCIKICAgfSwKICAgewpAQCAtNTk3NCw2ICs2NjA3LDIyIEBACiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTG9vcGVyLmgiCiAgIH0sCiAgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpMb29wZXI6OnJlcG9sbCIsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aTjdhbmRyb2lkNkxvb3BlcjZyZXBvbGxFaSIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkNkxvb3BlckUiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgorICAgIH0KKyAgIF0sCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Mb29wZXIuaCIKKyAgfSwKKyAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6Okxvb3Blcjo6cG9sbEFsbCIsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aTjdhbmRyb2lkNkxvb3Blcjdwb2xsQWxsRWlQaVMxX1BQdiIsCiAgICAicGFyYW1ldGVycyIgOgpAQCAtNjUxMSwxMSArNzE2MCwxMSBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJhY2Nlc3MiIDogInByaXZhdGUiLApAQCAtNjUzMSw3ICs3MTgwLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJhY2Nlc3MiIDogInByaXZhdGUiLApAQCAtNjU0MCw3ICs3MTg5LDcgQEAKICAgICJwYXJhbWV0ZXJzIiA6CiAgICBbCiAgICAgewotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEt2IgpAQCAtNjU1MCw3ICs3MTk5LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJhY2Nlc3MiIDogInByaXZhdGUiLApAQCAtNjU1OSw3ICs3MjA4LDcgQEAKICAgICJwYXJhbWV0ZXJzIiA6CiAgICBbCiAgICAgewotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS3YiCkBAIC02NTY5LDcgKzcyMTgsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6OndlYWtyZWZfdHlwZTo6YXR0ZW1wdEluY1dlYWsiLApAQCAtNjU3OCwxNCArNzIyNywxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS3YiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWIiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6d2Vha3JlZl90eXBlOjphdHRlbXB0SW5jU3Ryb25nIiwKQEAgLTY1OTQsMTQgKzcyNDMsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEt2IgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEliIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6OndlYWtyZWZfdHlwZTo6aW5jV2Vha1JlcXVpcmVXZWFrIiwKQEAgLTY2MTAsMTQgKzcyNTksMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEt2IgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6OndlYWtyZWZfdHlwZTo6ZGVjV2VhayIsCkBAIC02NjI2LDE0ICs3Mjc1LDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLdiIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlOjp3ZWFrcmVmX3R5cGU6OmluY1dlYWsiLApAQCAtNjY0MiwxNCArNzI5MSwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS3YiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6d2Vha3JlZl90eXBlOjp0cmFja01lIiwKQEAgLTY2NTgsNyArNzMwNyw3IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWIiCkBAIC02NjY4LDcgKzczMTcsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJvdGVjdGVkIiwKQEAgLTY2NzgsMTQgKzczMjcsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS3YiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcm90ZWN0ZWQiLApAQCAtNjY5NSwxNCArNzM0NCwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLdiIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJhY2Nlc3MiIDogInByb3RlY3RlZCIsCkBAIC02NzEyLDE0ICs3MzYxLDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJhY2Nlc3MiIDogInByb3RlY3RlZCIsCkBAIC02NzI5LDcgKzczNzgsNyBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCkBAIC02NzM5LDcgKzczODgsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEliIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJvdGVjdGVkIiwKQEAgLTY3NDksMTEgKzczOTgsMTEgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcm90ZWN0ZWQiLApAQCAtNjc2MywxMSArNzQxMiwxMSBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJhY2Nlc3MiIDogInByb3RlY3RlZCIsCkBAIC02Nzc3LDExICs3NDI2LDExIEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJvdGVjdGVkIiwKQEAgLTY3OTEsMTEgKzc0NDAsMTEgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcm90ZWN0ZWQiLApAQCAtNjgwNSwyNyArNzQ1NCwxMSBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgotICB9LAotICB7Ci0gICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6YXBwZW5kUGF0aCIsCi0gICAibGlua2VyX3NldF9rZXkiIDogIl9aTjdhbmRyb2lkN1N0cmluZzgxMGFwcGVuZFBhdGhFUEtjIiwKLSAgICJwYXJhbWV0ZXJzIiA6Ci0gICBbCi0gICAgewotICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCi0gICAgfSwKLSAgICB7Ci0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCi0gICAgfQotICAgXSwKLSAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVJON2FuZHJvaWQ3U3RyaW5nOEUiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6bG9ja0J1ZmZlciIsCkBAIC02ODM0LDE0ICs3NDY3LDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJbSIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJUGMiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKQEAgLTY4NTEsNyArNzQ4NCw3IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgpAQCAtNjg2MSw3ICs3NDk0LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjphcHBlbmRGb3JtYXQiLApAQCAtNjg3MCwxNCArNzUwMywxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4Ojp1bmxvY2tCdWZmZXIiLApAQCAtNjg4NiwxNCArNzUxOSwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSW0iCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6dW5sb2NrQnVmZmVyIiwKQEAgLTY5MDIsMTEgKzc1MzUsMTEgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6YXBwZW5kRm9ybWF0ViIsCkBAIC02OTE1LDcgKzc1NDgsNyBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKQEAgLTY5MjUsMjAgKzc1NTgsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCi0gIH0sCi0gIHsKLSAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4Ojpjb252ZXJ0VG9SZXNQYXRoIiwKLSAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pON2FuZHJvaWQ3U3RyaW5nODE2Y29udmVydFRvUmVzUGF0aEV2IiwKLSAgICJwYXJhbWV0ZXJzIiA6Ci0gICBbCi0gICAgewotICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCi0gICAgfQotICAgXSwKLSAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVJON2FuZHJvaWQ3U3RyaW5nOEUiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6Y2xlYXIiLApAQCAtNjk0NywxMSArNzU2NywxMSBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpzZXRUbyIsCkBAIC02OTYwLDcgKzc1ODAsNyBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLRGkiCkBAIC02OTcwLDcgKzc1OTAsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OnNldFRvIiwKQEAgLTY5NzksNyArNzU5OSw3IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtEcyIKQEAgLTY5ODksNyArNzYwOSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6c2V0VG8iLApAQCAtNjk5OCwxNCArNzYxOCwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpzZXRUbyIsCkBAIC03MDE0LDcgKzc2MzQsNyBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKQEAgLTcwMjQsNyArNzY0NCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6c2V0VG8iLApAQCAtNzAzMywxNCArNzY1MywxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6YXBwZW5kIiwKQEAgLTcwNDksMTQgKzc2NjksMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6YXBwZW5kIiwKQEAgLTcwNjUsNyArNzY4NSw3IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgpAQCAtNzA3NSw3ICs3Njk1LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjphcHBlbmQiLApAQCAtNzA4NCwxNCArNzcwNCwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6Zm9ybWF0IiwKQEAgLTcxMDIsOCArNzcyMiw4IEBACiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCiAgICAgfQogICAgXSwKLSAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInJldHVybl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6Zm9ybWF0ViIsCkBAIC03MTE3LDggKzc3MzcsOCBAQAogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJU3Q5X192YV9saXN0IgogICAgIH0KICAgIF0sCi0gICAicmV0dXJuX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3U3RyaW5nOEUiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OnRvTG93ZXIiLApAQCAtNzEyNywxMSArNzc0NywxMSBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpyZW1vdmVBbGwiLApAQCAtNzE0MCwxNCArNzc2MCwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJYiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpTdHJpbmc4IiwKQEAgLTcxNTYsMTQgKzc3NzYsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS0RpIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OlN0cmluZzgiLApAQCAtNzE3Miw3ICs3NzkyLDcgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS0RpIgpAQCAtNzE4Miw3ICs3ODAyLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpTdHJpbmc4IiwKQEAgLTcxOTEsMTQgKzc4MTEsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS0RzIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OlN0cmluZzgiLApAQCAtNzIwNyw3ICs3ODI3LDcgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS0RzIgpAQCAtNzIxNyw3ICs3ODM3LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpTdHJpbmc4IiwKQEAgLTcyMjYsMTQgKzc4NDYsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6U3RyaW5nOCIsCkBAIC03MjQyLDcgKzc4NjIsNyBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKQEAgLTcyNTIsNyArNzg3Miw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6U3RyaW5nOCIsCkBAIC03MjYxLDE0ICs3ODgxLDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQ4U3RyaW5nMTZFIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OlN0cmluZzgiLApAQCAtNzI3NywxNCArNzg5NywxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6U3RyaW5nOCIsCkBAIC03MjkzLDExICs3OTEzLDExIEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OlN0cmluZzgiLApAQCAtNzMwNiwxNCArNzkyNiwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLRGkiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6U3RyaW5nOCIsCkBAIC03MzIyLDcgKzc5NDIsNyBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLRGkiCkBAIC03MzMyLDcgKzc5NTIsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OlN0cmluZzgiLApAQCAtNzM0MSwxNCArNzk2MSwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLRHMiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6U3RyaW5nOCIsCkBAIC03MzU3LDcgKzc5NzcsNyBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLRHMiCkBAIC03MzY3LDcgKzc5ODcsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OlN0cmluZzgiLApAQCAtNzM3NiwxNCArNzk5NiwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpTdHJpbmc4IiwKQEAgLTczOTIsNyArODAxMiw3IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgpAQCAtNzQwMiw3ICs4MDIyLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpTdHJpbmc4IiwKQEAgLTc0MTEsMTQgKzgwMzEsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDhTdHJpbmcxNkUiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6U3RyaW5nOCIsCkBAIC03NDI3LDE0ICs4MDQ3LDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpTdHJpbmc4IiwKQEAgLTc0NDMsMTEgKzgwNjMsMTEgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6flN0cmluZzgiLApAQCAtNzQ1NiwxMSArODA3NiwxMSBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4Ojp+U3RyaW5nOCIsCkBAIC03NDY5LDExICs4MDg5LDExIEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCkBAIC03NDkwLDcgKzgxMTAsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElQdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpyZXBsYWNlQWxsIiwKQEAgLTc1MDksNyArODEyOSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhY2Nlc3MiIDogInByaXZhdGUiLApAQCAtNzUyNSw3ICs4MTQ1LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJUERzIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKQEAgLTc1NDEsNyArODE2MSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVBEcyIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCkBAIC03NTU1LDcgKzgxNzUsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElQdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCkBAIC03NTY4LDcgKzgxODgsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElQdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpzZXRUbyIsCkBAIC03NTg0LDcgKzgyMDQsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OnNldFRvIiwKQEAgLTc2MDMsNyArODIyMyw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6c2V0VG8iLApAQCAtNzYxOSw3ICs4MjM5LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpzZXRUbyIsCkBAIC03NjQyLDcgKzgyNjIsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OmFwcGVuZCIsCkBAIC03NjYxLDcgKzgyODEsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OmFwcGVuZCIsCkBAIC03Njc3LDcgKzgyOTcsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6Omluc2VydCIsCkBAIC03Njk2LDcgKzgzMTYsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6Omluc2VydCIsCkBAIC03NzE4LDcgKzgzMzgsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKQEAgLTc3MzIsNyArODM1Miw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhY2Nlc3MiIDogInByaXZhdGUiLApAQCAtNzc0Niw3ICs4MzY2LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpTdHJpbmcxNiIsCkBAIC03NzYyLDcgKzgzODIsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OlN0cmluZzE2IiwKQEAgLTc3NzgsNyArODM5OCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6U3RyaW5nMTYiLApAQCAtNzc5Nyw3ICs4NDE3LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpTdHJpbmcxNiIsCkBAIC03ODEzLDcgKzg0MzMsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OlN0cmluZzE2IiwKQEAgLTc4MzIsNyArODQ1Miw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6U3RyaW5nMTYiLApAQCAtNzg0NCwxMSArODQ2NCwxMSBAQAogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDhTdHJpbmcxNkUiCiAgICAgfSwKICAgICB7Ci0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OlN0cmluZzE2IiwKQEAgLTc4NjQsNyArODQ4NCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6U3RyaW5nMTYiLApAQCAtNzg4Nyw3ICs4NTA3LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpTdHJpbmcxNiIsCkBAIC03OTAwLDcgKzg1MjAsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OlN0cmluZzE2IiwKQEAgLTc5MTYsNyArODUzNiw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6U3RyaW5nMTYiLApAQCAtNzkzMiw3ICs4NTUyLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpTdHJpbmcxNiIsCkBAIC03OTUxLDcgKzg1NzEsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OlN0cmluZzE2IiwKQEAgLTc5NjcsNyArODU4Nyw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6U3RyaW5nMTYiLApAQCAtNzk4Niw3ICs4NjA2LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpTdHJpbmcxNiIsCkBAIC03OTk4LDExICs4NjE4LDExIEBACiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkOFN0cmluZzE2RSIKICAgICB9LAogICAgIHsKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6U3RyaW5nMTYiLApAQCAtODAxOCw3ICs4NjM4LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpTdHJpbmcxNiIsCkBAIC04MDQxLDcgKzg2NjEsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OlN0cmluZzE2IiwKQEAgLTgwNTQsNyArODY3NCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6flN0cmluZzE2IiwKQEAgLTgwNjcsNyArODY4Nyw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6flN0cmluZzE2IiwKQEAgLTgwODAsNyArODcwMCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6b3BlcmF0b3I9IiwKQEAgLTgwOTYsNyArODcxNiw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVJON2FuZHJvaWQ4U3RyaW5nMTZFIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6RmRQcmludGVyOjpwcmludExpbmUiLApAQCAtODQxMCwxNCArOTAzMCwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDEwVmVjdG9ySW1wbEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDEwVmVjdG9ySW1wbEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEltIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElQS3YiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6Y2FwYWNpdHkiLApAQCAtODQyNiwxMSArOTA0NiwxMSBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDEwVmVjdG9ySW1wbEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDEwVmVjdG9ySW1wbEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSW0iLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcm90ZWN0ZWQiLApAQCAtODQ0MCwxMSArOTA2MCwxMSBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDEwVmVjdG9ySW1wbEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDEwVmVjdG9ySW1wbEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSW0iLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKQEAgLTg0NjUsNyArOTA4NSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWwiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U29ydGVkVmVjdG9ySW1wbDo6aW5kZXhPZiIsCkBAIC04NDgxLDcgKzkxMDEsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElsIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlNvcnRlZFZlY3RvckltcGw6Om9yZGVyT2YiLApAQCAtODQ5Nyw3ICs5MTE3LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJbSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpMb29wZXI6OmdldEFsbG93Tm9uQ2FsbGJhY2tzIiwKQEAgLTg1NzksNDE2ICs5MTk5LDIwIEBACiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVGhyZWFkLmgiCiAgIH0sCiAgIHsKLSAgICJhY2Nlc3MiIDogInByb3RlY3RlZCIsCi0gICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9yPGFuZHJvaWQ6OnN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm8+Ojpkb19kZXN0cm95IiwKLSAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pOSzdhbmRyb2lkNlZlY3RvcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRTEwZG9fZGVzdHJveUVQdm0iLAotICAgInBhcmFtZXRlcnMiIDoKLSAgIFsKLSAgICB7Ci0gICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ2VmVjdG9ySU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFRSIKLSAgICB9LAotICAgIHsKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB2IgotICAgIH0sCi0gICAgewotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJbSIKLSAgICB9Ci0gICBdLAotICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgiCi0gIH0sCi0gIHsKLSAgICJhY2Nlc3MiIDogInByb3RlY3RlZCIsCi0gICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9yPGFuZHJvaWQ6OnN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm8+Ojpkb19jb25zdHJ1Y3QiLAotICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWk5LN2FuZHJvaWQ2VmVjdG9ySU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFMTJkb19jb25zdHJ1Y3RFUHZtIiwKLSAgICJwYXJhbWV0ZXJzIiA6Ci0gICBbCi0gICAgewotICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkNlZlY3RvcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRUUiCi0gICAgfSwKLSAgICB7Ci0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIKLSAgICB9LAotICAgIHsKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSW0iCi0gICAgfQotICAgXSwKLSAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIgotICB9LAotICB7Ci0gICAiYWNjZXNzIiA6ICJwcm90ZWN0ZWQiLAotICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvcjxhbmRyb2lkOjpzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvPjo6ZG9fbW92ZV9mb3J3YXJkIiwKLSAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pOSzdhbmRyb2lkNlZlY3RvcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRTE1ZG9fbW92ZV9mb3J3YXJkRVB2UEt2bSIsCi0gICAicGFyYW1ldGVycyIgOgotICAgWwotICAgIHsKLSAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDZWZWN0b3JJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIgotICAgIH0sCi0gICAgewotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCi0gICAgfSwKLSAgICB7Ci0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS3YiCi0gICAgfSwKLSAgICB7Ci0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEltIgotICAgIH0KLSAgIF0sCi0gICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3IuaCIKLSAgfSwKLSAgewotICAgImFjY2VzcyIgOiAicHJvdGVjdGVkIiwKLSAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3I8YW5kcm9pZDo6c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mbz46OmRvX21vdmVfYmFja3dhcmQiLAotICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWk5LN2FuZHJvaWQ2VmVjdG9ySU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFMTZkb19tb3ZlX2JhY2t3YXJkRVB2UEt2bSIsCi0gICAicGFyYW1ldGVycyIgOgotICAgWwotICAgIHsKLSAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDZWZWN0b3JJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIgotICAgIH0sCi0gICAgewotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCi0gICAgfSwKLSAgICB7Ci0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS3YiCi0gICAgfSwKLSAgICB7Ci0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEltIgotICAgIH0KLSAgIF0sCi0gICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3IuaCIKLSAgfSwKLSAgewotICAgImFjY2VzcyIgOiAicHJvdGVjdGVkIiwKLSAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3I8YW5kcm9pZDo6c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mbz46OmRvX2NvcHkiLAotICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWk5LN2FuZHJvaWQ2VmVjdG9ySU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFN2RvX2NvcHlFUHZQS3ZtIiwKLSAgICJwYXJhbWV0ZXJzIiA6Ci0gICBbCi0gICAgewotICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkNlZlY3RvcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRUUiCi0gICAgfSwKLSAgICB7Ci0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIKLSAgICB9LAotICAgIHsKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLdiIKLSAgICB9LAotICAgIHsKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSW0iCi0gICAgfQotICAgXSwKLSAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIgotICB9LAotICB7Ci0gICAiYWNjZXNzIiA6ICJwcm90ZWN0ZWQiLAotICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvcjxhbmRyb2lkOjpzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvPjo6ZG9fc3BsYXQiLAotICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWk5LN2FuZHJvaWQ2VmVjdG9ySU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFOGRvX3NwbGF0RVB2UEt2bSIsCi0gICAicGFyYW1ldGVycyIgOgotICAgWwotICAgIHsKLSAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDZWZWN0b3JJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIgotICAgIH0sCi0gICAgewotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCi0gICAgfSwKLSAgICB7Ci0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS3YiCi0gICAgfSwKLSAgICB7Ci0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEltIgotICAgIH0KLSAgIF0sCi0gICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3IuaCIKLSAgfSwKLSAgewotICAgImFjY2VzcyIgOiAicHJvdGVjdGVkIiwKLSAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3I8YW5kcm9pZDo6TG9vcGVyOjpNZXNzYWdlRW52ZWxvcGU+Ojpkb19kZXN0cm95IiwKLSAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pOSzdhbmRyb2lkNlZlY3RvcklOU182TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFRTEwZG9fZGVzdHJveUVQdm0iLAotICAgInBhcmFtZXRlcnMiIDoKLSAgIFsKLSAgICB7Ci0gICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ2VmVjdG9ySU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFRSIKLSAgICB9LAotICAgIHsKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB2IgotICAgIH0sCi0gICAgewotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJbSIKLSAgICB9Ci0gICBdLAotICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgiCi0gIH0sCi0gIHsKLSAgICJhY2Nlc3MiIDogInByb3RlY3RlZCIsCi0gICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9yPGFuZHJvaWQ6Okxvb3Blcjo6TWVzc2FnZUVudmVsb3BlPjo6ZG9fY29uc3RydWN0IiwKLSAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pOSzdhbmRyb2lkNlZlY3RvcklOU182TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFRTEyZG9fY29uc3RydWN0RVB2bSIsCi0gICAicGFyYW1ldGVycyIgOgotICAgWwotICAgIHsKLSAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDZWZWN0b3JJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUVFIgotICAgIH0sCi0gICAgewotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCi0gICAgfSwKLSAgICB7Ci0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEltIgotICAgIH0KLSAgIF0sCi0gICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3IuaCIKLSAgfSwKLSAgewotICAgImFjY2VzcyIgOiAicHJvdGVjdGVkIiwKLSAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3I8YW5kcm9pZDo6TG9vcGVyOjpNZXNzYWdlRW52ZWxvcGU+Ojpkb19tb3ZlX2ZvcndhcmQiLAotICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWk5LN2FuZHJvaWQ2VmVjdG9ySU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFMTVkb19tb3ZlX2ZvcndhcmRFUHZQS3ZtIiwKLSAgICJwYXJhbWV0ZXJzIiA6Ci0gICBbCi0gICAgewotICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkNlZlY3RvcklOU182TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFRUUiCi0gICAgfSwKLSAgICB7Ci0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIKLSAgICB9LAotICAgIHsKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLdiIKLSAgICB9LAotICAgIHsKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSW0iCi0gICAgfQotICAgXSwKLSAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIgotICB9LAotICB7Ci0gICAiYWNjZXNzIiA6ICJwcm90ZWN0ZWQiLAotICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvcjxhbmRyb2lkOjpMb29wZXI6Ok1lc3NhZ2VFbnZlbG9wZT46OmRvX21vdmVfYmFja3dhcmQiLAotICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWk5LN2FuZHJvaWQ2VmVjdG9ySU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFMTZkb19tb3ZlX2JhY2t3YXJkRVB2UEt2bSIsCi0gICAicGFyYW1ldGVycyIgOgotICAgWwotICAgIHsKLSAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDZWZWN0b3JJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUVFIgotICAgIH0sCi0gICAgewotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCi0gICAgfSwKLSAgICB7Ci0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS3YiCi0gICAgfSwKLSAgICB7Ci0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEltIgotICAgIH0KLSAgIF0sCi0gICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3IuaCIKLSAgfSwKLSAgewotICAgImFjY2VzcyIgOiAicHJvdGVjdGVkIiwKLSAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3I8YW5kcm9pZDo6TG9vcGVyOjpNZXNzYWdlRW52ZWxvcGU+Ojpkb19jb3B5IiwKLSAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pOSzdhbmRyb2lkNlZlY3RvcklOU182TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFRTdkb19jb3B5RVB2UEt2bSIsCi0gICAicGFyYW1ldGVycyIgOgotICAgWwotICAgIHsKLSAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDZWZWN0b3JJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUVFIgotICAgIH0sCi0gICAgewotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCi0gICAgfSwKLSAgICB7Ci0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS3YiCi0gICAgfSwKLSAgICB7Ci0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEltIgotICAgIH0KLSAgIF0sCi0gICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3IuaCIKLSAgfSwKLSAgewotICAgImFjY2VzcyIgOiAicHJvdGVjdGVkIiwKLSAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3I8YW5kcm9pZDo6TG9vcGVyOjpNZXNzYWdlRW52ZWxvcGU+Ojpkb19zcGxhdCIsCi0gICAibGlua2VyX3NldF9rZXkiIDogIl9aTks3YW5kcm9pZDZWZWN0b3JJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUU4ZG9fc3BsYXRFUHZQS3ZtIiwKLSAgICJwYXJhbWV0ZXJzIiA6Ci0gICBbCi0gICAgewotICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkNlZlY3RvcklOU182TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFRUUiCi0gICAgfSwKLSAgICB7Ci0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIKLSAgICB9LAotICAgIHsKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLdiIKLSAgICB9LAotICAgIHsKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSW0iCi0gICAgfQotICAgXSwKLSAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIgotICB9LAotICB7Ci0gICAiYWNjZXNzIiA6ICJwcm90ZWN0ZWQiLAotICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvcjxhbmRyb2lkOjpMb29wZXI6OlJlc3BvbnNlPjo6ZG9fZGVzdHJveSIsCi0gICAibGlua2VyX3NldF9rZXkiIDogIl9aTks3YW5kcm9pZDZWZWN0b3JJTlNfNkxvb3BlcjhSZXNwb25zZUVFMTBkb19kZXN0cm95RVB2bSIsCi0gICAicGFyYW1ldGVycyIgOgotICAgWwotICAgIHsKLSAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDZWZWN0b3JJTlNfNkxvb3BlcjhSZXNwb25zZUVFRSIKLSAgICB9LAotICAgIHsKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB2IgotICAgIH0sCi0gICAgewotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJbSIKLSAgICB9Ci0gICBdLAotICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgiCi0gIH0sCi0gIHsKLSAgICJhY2Nlc3MiIDogInByb3RlY3RlZCIsCi0gICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9yPGFuZHJvaWQ6Okxvb3Blcjo6UmVzcG9uc2U+Ojpkb19jb25zdHJ1Y3QiLAotICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWk5LN2FuZHJvaWQ2VmVjdG9ySU5TXzZMb29wZXI4UmVzcG9uc2VFRTEyZG9fY29uc3RydWN0RVB2bSIsCi0gICAicGFyYW1ldGVycyIgOgotICAgWwotICAgIHsKLSAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDZWZWN0b3JJTlNfNkxvb3BlcjhSZXNwb25zZUVFRSIKLSAgICB9LAotICAgIHsKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB2IgotICAgIH0sCi0gICAgewotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJbSIKLSAgICB9Ci0gICBdLAotICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgiCi0gIH0sCi0gIHsKLSAgICJhY2Nlc3MiIDogInByb3RlY3RlZCIsCi0gICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9yPGFuZHJvaWQ6Okxvb3Blcjo6UmVzcG9uc2U+Ojpkb19tb3ZlX2ZvcndhcmQiLAotICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWk5LN2FuZHJvaWQ2VmVjdG9ySU5TXzZMb29wZXI4UmVzcG9uc2VFRTE1ZG9fbW92ZV9mb3J3YXJkRVB2UEt2bSIsCi0gICAicGFyYW1ldGVycyIgOgotICAgWwotICAgIHsKLSAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDZWZWN0b3JJTlNfNkxvb3BlcjhSZXNwb25zZUVFRSIKLSAgICB9LAotICAgIHsKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB2IgotICAgIH0sCi0gICAgewotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEt2IgotICAgIH0sCi0gICAgewotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJbSIKLSAgICB9Ci0gICBdLAotICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgiCi0gIH0sCi0gIHsKLSAgICJhY2Nlc3MiIDogInByb3RlY3RlZCIsCi0gICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9yPGFuZHJvaWQ6Okxvb3Blcjo6UmVzcG9uc2U+Ojpkb19tb3ZlX2JhY2t3YXJkIiwKLSAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pOSzdhbmRyb2lkNlZlY3RvcklOU182TG9vcGVyOFJlc3BvbnNlRUUxNmRvX21vdmVfYmFja3dhcmRFUHZQS3ZtIiwKLSAgICJwYXJhbWV0ZXJzIiA6Ci0gICBbCi0gICAgewotICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkNlZlY3RvcklOU182TG9vcGVyOFJlc3BvbnNlRUVFIgotICAgIH0sCi0gICAgewotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCi0gICAgfSwKLSAgICB7Ci0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS3YiCi0gICAgfSwKLSAgICB7Ci0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEltIgotICAgIH0KLSAgIF0sCi0gICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3IuaCIKLSAgfSwKLSAgewotICAgImFjY2VzcyIgOiAicHJvdGVjdGVkIiwKLSAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3I8YW5kcm9pZDo6TG9vcGVyOjpSZXNwb25zZT46OmRvX2NvcHkiLAotICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWk5LN2FuZHJvaWQ2VmVjdG9ySU5TXzZMb29wZXI4UmVzcG9uc2VFRTdkb19jb3B5RVB2UEt2bSIsCi0gICAicGFyYW1ldGVycyIgOgotICAgWwotICAgIHsKLSAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDZWZWN0b3JJTlNfNkxvb3BlcjhSZXNwb25zZUVFRSIKLSAgICB9LAotICAgIHsKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB2IgotICAgIH0sCi0gICAgewotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEt2IgotICAgIH0sCi0gICAgewotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJbSIKLSAgICB9Ci0gICBdLAotICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgiCi0gIH0sCi0gIHsKLSAgICJhY2Nlc3MiIDogInByb3RlY3RlZCIsCi0gICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9yPGFuZHJvaWQ6Okxvb3Blcjo6UmVzcG9uc2U+Ojpkb19zcGxhdCIsCi0gICAibGlua2VyX3NldF9rZXkiIDogIl9aTks3YW5kcm9pZDZWZWN0b3JJTlNfNkxvb3BlcjhSZXNwb25zZUVFOGRvX3NwbGF0RVB2UEt2bSIsCi0gICAicGFyYW1ldGVycyIgOgotICAgWwotICAgIHsKLSAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDZWZWN0b3JJTlNfNkxvb3BlcjhSZXNwb25zZUVFRSIKLSAgICB9LAotICAgIHsKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB2IgotICAgIH0sCi0gICAgewotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEt2IgotICAgIH0sCi0gICAgewotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJbSIKLSAgICB9Ci0gICBdLAotICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgiCi0gIH0sCi0gIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlOjpjcmVhdGVXZWFrIiwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pOSzdhbmRyb2lkN1JlZkJhc2UxMGNyZWF0ZVdlYWtFUEt2IiwKICAgICJwYXJhbWV0ZXJzIiA6CiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1JlZkJhc2VFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS3YiCiAgICAgfQogICAgXSwKLSAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInJldHVybl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6Z2V0V2Vha1JlZnMiLApAQCAtODk5NywxMSArOTIyMSwxMSBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdSZWZCYXNlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1JlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCi0gICAicmV0dXJuX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6OndlYWtyZWZfdHlwZTo6Z2V0V2Vha0NvdW50IiwKQEAgLTkwMTQsNyArOTIzOCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6d2Vha3JlZl90eXBlOjpyZWZCYXNlIiwKQEAgLTkwMjYsOCArOTI1MCw4IEBACiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFIgogICAgIH0KICAgIF0sCi0gICAicmV0dXJuX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6d2Vha3JlZl90eXBlOjpwcmludFJlZnMiLApAQCAtOTA0MCw3ICs5MjY0LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlOjpmb3JjZUluY1N0cm9uZyIsCkBAIC05MDQ5LDE0ICs5MjczLDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1JlZkJhc2VFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS3YiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6Z2V0U3Ryb25nQ291bnQiLApAQCAtOTA2NSwxMSArOTI4OSwxMSBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdSZWZCYXNlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1JlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6OmluY1N0cm9uZ1JlcXVpcmVTdHJvbmciLApAQCAtOTA3OCwxNCArOTMwMiwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdSZWZCYXNlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1JlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEt2IgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6OmRlY1N0cm9uZyIsCkBAIC05MDk0LDE0ICs5MzE4LDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1JlZkJhc2VFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS3YiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6aW5jU3Ryb25nIiwKQEAgLTkxMTAsODAgKzkzMzQsNDIgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3UmVmQmFzZUUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLdiIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKKyAgICJhY2Nlc3MiIDogInByaXZhdGUiLAogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OmdldFBhdGhEaXIiLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWk5LN2FuZHJvaWQ3U3RyaW5nODEwZ2V0UGF0aERpckV2IiwKICAgICJwYXJhbWV0ZXJzIiA6CiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKLSAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgotICB9LAotICB7Ci0gICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6Z2V0QmFzZVBhdGgiLAotICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWk5LN2FuZHJvaWQ3U3RyaW5nODExZ2V0QmFzZVBhdGhFdiIsCi0gICAicGFyYW1ldGVycyIgOgotICAgWwotICAgIHsKLSAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdTdHJpbmc4RSIKLSAgICB9Ci0gICBdLAotICAgInJldHVybl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1N0cmluZzhFIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCi0gIH0sCi0gIHsKLSAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpnZXRQYXRoTGVhZiIsCi0gICAibGlua2VyX3NldF9rZXkiIDogIl9aTks3YW5kcm9pZDdTdHJpbmc4MTFnZXRQYXRoTGVhZkV2IiwKLSAgICJwYXJhbWV0ZXJzIiA6Ci0gICBbCi0gICAgewotICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1N0cmluZzhFIgotICAgIH0KLSAgIF0sCi0gICAicmV0dXJuX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3U3RyaW5nOEUiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCi0gICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6ZmluZF9leHRlbnNpb24iLAotICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWk5LN2FuZHJvaWQ3U3RyaW5nODE0ZmluZF9leHRlbnNpb25FdiIsCi0gICAicGFyYW1ldGVycyIgOgotICAgWwotICAgIHsKLSAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdTdHJpbmc4RSIKLSAgICB9Ci0gICBdLAotICAgInJldHVybl90eXBlIiA6ICJfWlRJUGMiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKLSAgfSwKLSAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OmdldFBhdGhFeHRlbnNpb24iLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWk5LN2FuZHJvaWQ3U3RyaW5nODE2Z2V0UGF0aEV4dGVuc2lvbkV2IiwKICAgICJwYXJhbWV0ZXJzIiA6CiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKLSAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInJldHVybl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6ZmluZCIsCkBAIC05MTkyLDcgKzkzNzgsNyBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgpAQCAtOTIwMyw3ICs5Mzg5LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJbCIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpsZW5ndGgiLApAQCAtOTIxMiwyOCArOTM5OCwxMSBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEltIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCi0gIH0sCi0gIHsKLSAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4Ojp3YWxrUGF0aCIsCi0gICAibGlua2VyX3NldF9rZXkiIDogIl9aTks3YW5kcm9pZDdTdHJpbmc4OHdhbGtQYXRoRVBTMF8iLAotICAgInBhcmFtZXRlcnMiIDoKLSAgIFsKLSAgICB7Ci0gICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3U3RyaW5nOEUiCi0gICAgfSwKLSAgICB7Ci0gICAgICJkZWZhdWx0X2FyZyIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKLSAgICB9Ci0gICBdLAotICAgInJldHVybl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1N0cmluZzhFIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpzdGFydHNXaXRoIiwKQEAgLTkyNDksNyArOTQxOCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWIiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6c3RhcnRzV2l0aCIsCkBAIC05MjY1LDcgKzk0MzQsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEliIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OmlzU3RhdGljU3RyaW5nIiwKQEAgLTkyNzgsNyArOTQ0Nyw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWIiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhY2Nlc3MiIDogInByaXZhdGUiLApAQCAtOTI5Miw3ICs5NDYxLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJbSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpzaXplIiwKQEAgLTkzMDUsNyArOTQ3NCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSW0iLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6Y29udGFpbnMiLApAQCAtOTMyMSw3ICs5NDkwLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJYiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpmaW5kTGFzdCIsCkBAIC05MzM3LDcgKzk1MDYsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElsIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OmZpbmRGaXJzdCIsCkBAIC05MzUzLDcgKzk1MjIsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElsIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RvcFdhdGNoOjplbGFwc2VkVGltZSIsCkBAIC05NTQ2LDcgKzk3MTUsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogInN0cmxlbjE2IiwKQEAgLTk1NTgsNyArOTcyNyw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSW0iLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAic3RybmNtcDE2IiwKQEAgLTk1NzYsNyArOTc0NSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAic3RybmxlbjE2IiwKQEAgLTk1OTEsNyArOTc2MCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSW0iLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAic3Ryc3RyMTYiLApAQCAtOTYwNiw3ICs5Nzc1LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJUERzIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogInN0cnpjbXAxNiIsCkBAIC05NjI3LDcgKzk3OTYsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogInN5c3RlbVRpbWUiLApAQCAtOTY3Niw3ICs5ODQ1LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJ1dGYxNl90b191dGY4X2xlbmd0aCIsCkBAIC05NjkxLDcgKzk4NjAsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElsIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogInV0ZjMyX2Zyb21fdXRmOF9hdCIsCkBAIC05NzEyLDcgKzk4ODEsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogInV0ZjMyX3RvX3V0ZjgiLApAQCAtOTczMyw3ICs5OTAyLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJ1dGYzMl90b191dGY4X2xlbmd0aCIsCkBAIC05NzQ4LDcgKzk5MTcsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElsIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogInV0ZjhfdG9fdXRmMTYiLApAQCAtOTc2OSw3ICs5OTM4LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJUERzIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogInV0ZjhfdG9fdXRmMTZfbGVuZ3RoIiwKQEAgLTk3ODgsNyArOTk1Nyw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWwiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAidXRmOF90b191dGYxNl9ub19udWxsX3Rlcm1pbmF0b3IiLApAQCAtOTgwOSw3ICs5OTc4LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJUERzIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKICAgfQogIF0sCiAgImdsb2JhbF92YXJzIiA6CkBAIC05ODI5LDQzICs5OTk4LDM4IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSQTFfS0RzIiwKICAgICJuYW1lIiA6ICJjb25zdCBjaGFyMTZfdCAoJilbMV0iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUExX0tEcyIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUkExX0tEcyIsCiAgICAic2l6ZSIgOiA4LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJLTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6VmVjdG9ySW1wbCAmIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQxMFZlY3RvckltcGxFIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCiAgICAic2l6ZSIgOiA4LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDgsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSS043YW5kcm9pZDE2UmVmZXJlbmNlUmVuYW1lckUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlJlZmVyZW5jZVJlbmFtZXIgJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDE2UmVmZXJlbmNlUmVuYW1lckUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkMTZSZWZlcmVuY2VSZW5hbWVyRSIsCiAgICAic2l6ZSIgOiA4LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDgsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSS043YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlNvcnRlZFZlY3RvckltcGwgJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsRSIsCiAgICAic2l6ZSIgOiA4LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDgsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSS043YW5kcm9pZDI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0UiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OnN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm8gJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0UiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIgogICB9LApAQCAtOTg3NCw3ICsxMDAzOCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSS043YW5kcm9pZDJzcElOU18xNExvb3BlckNhbGxiYWNrRUVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpMb29wZXJDYWxsYmFjaz4gJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDJzcElOU18xNExvb3BlckNhbGxiYWNrRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDJzcElOU18xNExvb3BlckNhbGxiYWNrRUVFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgogICB9LApAQCAtOTg4Myw3ICsxMDA0Niw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSS043YW5kcm9pZDJzcElOU18xNE1lc3NhZ2VIYW5kbGVyRUVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpNZXNzYWdlSGFuZGxlcj4gJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDJzcElOU18xNE1lc3NhZ2VIYW5kbGVyRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDJzcElOU18xNE1lc3NhZ2VIYW5kbGVyRUVFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgogICB9LApAQCAtOTg5Miw3ICsxMDA1NCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSS043YW5kcm9pZDJzcElOU18yMFNpbXBsZUxvb3BlckNhbGxiYWNrRUVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpTaW1wbGVMb29wZXJDYWxsYmFjaz4gJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDJzcElOU18yMFNpbXBsZUxvb3BlckNhbGxiYWNrRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDJzcElOU18yMFNpbXBsZUxvb3BlckNhbGxiYWNrRUVFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgogICB9LApAQCAtOTkwMSwxNiArMTAwNjIsMTQgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJLTjdhbmRyb2lkMnNwSU5TXzZMb29wZXJFRUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Okxvb3Blcj4gJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDJzcElOU182TG9vcGVyRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDJzcElOU182TG9vcGVyRUVFIiwKICAgICJzaXplIiA6IDgsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTG9vcGVyLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDgsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSS043YW5kcm9pZDJzcElOU182VGhyZWFkRUVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpUaHJlYWQ+ICYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQyc3BJTlNfNlRocmVhZEVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQyc3BJTlNfNlRocmVhZEVFRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKQEAgLTk5MTksNyArMTAwNzgsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUktON2FuZHJvaWQyd3BJTlNfMTRNZXNzYWdlSGFuZGxlckVFRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6d3A8YW5kcm9pZDo6TWVzc2FnZUhhbmRsZXI+ICYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQyd3BJTlNfMTRNZXNzYWdlSGFuZGxlckVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQyd3BJTlNfMTRNZXNzYWdlSGFuZGxlckVFRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKQEAgLTk5MjgsNyArMTAwODYsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUktON2FuZHJvaWQ2TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpMb29wZXI6Ok1lc3NhZ2VFbnZlbG9wZSAmIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQ2TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgiCiAgIH0sCkBAIC05OTM3LDcgKzEwMDk0LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJLTjdhbmRyb2lkNkxvb3BlcjhSZXNwb25zZUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6Okxvb3Blcjo6UmVzcG9uc2UgJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDZMb29wZXI4UmVzcG9uc2VFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDZMb29wZXI4UmVzcG9uc2VFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgiCiAgIH0sCkBAIC05OTQ2LDcgKzEwMTAyLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJLTjdhbmRyb2lkNlZlY3RvcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlZlY3RvcjxhbmRyb2lkOjpzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvPiAmIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkNlZlY3RvcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkNlZlY3RvcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRUUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3IuaCIKICAgfSwKQEAgLTk5NTUsNyArMTAxMTAsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUktON2FuZHJvaWQ3TWVzc2FnZUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6Ok1lc3NhZ2UgJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDdNZXNzYWdlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQ3TWVzc2FnZUUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Mb29wZXIuaCIKICAgfSwKQEAgLTk5NjQsMzQgKzEwMTE4LDM5IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSS043YW5kcm9pZDdTdHJpbmc4RSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6U3RyaW5nOCAmIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkN1N0cmluZzhFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDdTdHJpbmc4RSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA4LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUktON2FuZHJvaWQ3U3RyaW5nOEUiLAorICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlN0cmluZzggJiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogOCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDgsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSS043YW5kcm9pZDhTdHJpbmcxNjEwU3RhdGljRGF0YUlMbTFFRUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlN0cmluZzE2OjpTdGF0aWNEYXRhPDE+ICYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ4U3RyaW5nMTYxMFN0YXRpY0RhdGFJTG0xRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDhTdHJpbmcxNjEwU3RhdGljRGF0YUlMbTFFRUUiLAogICAgInNpemUiIDogOCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDgsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSS043YW5kcm9pZDhTdHJpbmcxNkUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlN0cmluZzE2ICYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ4U3RyaW5nMTZFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDhTdHJpbmcxNkUiLAogICAgInNpemUiIDogOCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJLYSIsCiAgICAibmFtZSIgOiAiY29uc3Qgc2lnbmVkIGNoYXIgJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS2EiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVJLYSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiCiAgIH0sCkBAIC0xMDAwMCw3ICsxMDE1OSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSS2IiLAogICAgIm5hbWUiIDogImNvbnN0IGJvb2wgJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS2IiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVJLYiIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiCiAgIH0sCkBAIC0xMDAwOSw3ICsxMDE2Nyw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSS2QiLAogICAgIm5hbWUiIDogImNvbnN0IGRvdWJsZSAmIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLZCIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUktkIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIKICAgfSwKQEAgLTEwMDE4LDcgKzEwMTc1LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJLZiIsCiAgICAibmFtZSIgOiAiY29uc3QgZmxvYXQgJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS2YiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVJLZiIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiCiAgIH0sCkBAIC0xMDAyNyw3ICsxMDE4Myw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSS2giLAogICAgIm5hbWUiIDogImNvbnN0IHVuc2lnbmVkIGNoYXIgJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS2giLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVJLaCIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiCiAgIH0sCkBAIC0xMDAzNiw3ICsxMDE5MSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSS2kiLAogICAgIm5hbWUiIDogImNvbnN0IGludCAmIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLaSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUktpIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIKICAgfSwKQEAgLTEwMDQ1LDcgKzEwMTk5LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJLaiIsCiAgICAibmFtZSIgOiAiY29uc3QgdW5zaWduZWQgaW50ICYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtqIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSS2oiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIgogICB9LApAQCAtMTAwNTQsNyArMTAyMDcsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUktsIiwKICAgICJuYW1lIiA6ICJjb25zdCBsb25nICYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtsIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSS2wiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIgogICB9LApAQCAtMTAwNjMsNyArMTAyMTUsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUkttIiwKICAgICJuYW1lIiA6ICJjb25zdCB1bnNpZ25lZCBsb25nICYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUttIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSS20iLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIgogICB9LApAQCAtMTAwNzIsNyArMTAyMjMsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUktzIiwKICAgICJuYW1lIiA6ICJjb25zdCBzaG9ydCAmIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLcyIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUktzIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIKICAgfSwKQEAgLTEwMDgxLDcgKzEwMjMxLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJLdCIsCiAgICAibmFtZSIgOiAiY29uc3QgdW5zaWduZWQgc2hvcnQgJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS3QiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVJLdCIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiCiAgIH0sCkBAIC0xMDA4OSwyNiArMTAyMzgsMjMgQEAKICAgICJhbGlnbm1lbnQiIDogOCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJON2FuZHJvaWQxMFZlY3RvckltcGxFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsICYiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEwVmVjdG9ySW1wbEUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVJON2FuZHJvaWQxMFZlY3RvckltcGxFIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxMFZlY3RvckltcGxFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKICAgICJzaXplIiA6IDgsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJON2FuZHJvaWQxNlNvcnRlZFZlY3RvckltcGxFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpTb3J0ZWRWZWN0b3JJbXBsICYiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVJON2FuZHJvaWQxNlNvcnRlZFZlY3RvckltcGxFIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNlNvcnRlZFZlY3RvckltcGxFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKICAgICJzaXplIiA6IDgsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJON2FuZHJvaWQyc3BJTlNfMTRMb29wZXJDYWxsYmFja0VFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6c3A8YW5kcm9pZDo6TG9vcGVyQ2FsbGJhY2s+ICYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDJzcElOU18xNExvb3BlckNhbGxiYWNrRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSTjdhbmRyb2lkMnNwSU5TXzE0TG9vcGVyQ2FsbGJhY2tFRUUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiCiAgIH0sCkBAIC0xMDExNyw3ICsxMDI2Myw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSTjdhbmRyb2lkMnNwSU5TXzE0TWVzc2FnZUhhbmRsZXJFRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnNwPGFuZHJvaWQ6Ok1lc3NhZ2VIYW5kbGVyPiAmIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQyc3BJTlNfMTRNZXNzYWdlSGFuZGxlckVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUk43YW5kcm9pZDJzcElOU18xNE1lc3NhZ2VIYW5kbGVyRUVFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgogICB9LApAQCAtMTAxMjYsNyArMTAyNzEsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUk43YW5kcm9pZDJzcElOU18yMFNpbXBsZUxvb3BlckNhbGxiYWNrRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpzcDxhbmRyb2lkOjpTaW1wbGVMb29wZXJDYWxsYmFjaz4gJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMnNwSU5TXzIwU2ltcGxlTG9vcGVyQ2FsbGJhY2tFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVJON2FuZHJvaWQyc3BJTlNfMjBTaW1wbGVMb29wZXJDYWxsYmFja0VFRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaCIKICAgfSwKQEAgLTEwMTM1LDcgKzEwMjc5LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJON2FuZHJvaWQyc3BJTlNfNkxvb3BlckVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6c3A8YW5kcm9pZDo6TG9vcGVyPiAmIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQyc3BJTlNfNkxvb3BlckVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUk43YW5kcm9pZDJzcElOU182TG9vcGVyRUVFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgogICB9LApAQCAtMTAxNDQsNyArMTAyODcsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUk43YW5kcm9pZDJzcElOU182VGhyZWFkRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpzcDxhbmRyb2lkOjpUaHJlYWQ+ICYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDJzcElOU182VGhyZWFkRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSTjdhbmRyb2lkMnNwSU5TXzZUaHJlYWRFRUUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiCiAgIH0sCkBAIC0xMDE1Myw3ICsxMDI5NSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSTjdhbmRyb2lkNU11dGV4RSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6TXV0ZXggJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNU11dGV4RSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUk43YW5kcm9pZDVNdXRleEUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9NdXRleC5oIgogICB9LApAQCAtMTAxNjIsNyArMTAzMDMsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUk43YW5kcm9pZDZMb29wZXI4UmVzcG9uc2VFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpMb29wZXI6OlJlc3BvbnNlICYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZMb29wZXI4UmVzcG9uc2VFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSTjdhbmRyb2lkNkxvb3BlcjhSZXNwb25zZUUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3IuaCIKICAgfSwKQEAgLTEwMTcxLDcgKzEwMzExLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJON2FuZHJvaWQ2UldMb2NrRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6UldMb2NrICYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZSV0xvY2tFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSTjdhbmRyb2lkNlJXTG9ja0UiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SV0xvY2suaCIKICAgfSwKQEAgLTEwMTgwLDcgKzEwMzE5LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJON2FuZHJvaWQ2VmVjdG9ySU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9yPGFuZHJvaWQ6OnN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm8+ICYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZWZWN0b3JJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSTjdhbmRyb2lkNlZlY3RvcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRUUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3IuaCIKICAgfSwKQEAgLTEwMTg5LDcgKzEwMzI3LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJON2FuZHJvaWQ3RmlsZU1hcEUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OkZpbGVNYXAgJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN0ZpbGVNYXBFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSTjdhbmRyb2lkN0ZpbGVNYXBFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvRmlsZU1hcC5oIgogICB9LApAQCAtMTAxOTgsNyArMTAzMzUsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUk43YW5kcm9pZDdQcmludGVyRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6UHJpbnRlciAmIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3UHJpbnRlckUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVJON2FuZHJvaWQ3UHJpbnRlckUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9QcmludGVyLmgiCiAgIH0sCkBAIC0xMDIwNywyNSArMTAzNDMsMzEgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJON2FuZHJvaWQ3U3RyaW5nOEUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlN0cmluZzggJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1N0cmluZzhFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSTjdhbmRyb2lkN1N0cmluZzhFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDgsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSTjdhbmRyb2lkN1N0cmluZzhFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4ICYiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJUk43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA4LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogOCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJON2FuZHJvaWQ4U3RyaW5nMTZFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNiAmIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ4U3RyaW5nMTZFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSTjdhbmRyb2lkOFN0cmluZzE2RSIsCiAgICAic2l6ZSIgOiA4LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJQMTNuYXRpdmVfaGFuZGxlIiwKICAgICJuYW1lIiA6ICJuYXRpdmVfaGFuZGxlIComIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQMTNuYXRpdmVfaGFuZGxlIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSUDEzbmF0aXZlX2hhbmRsZSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaCIKICAgfSwKQEAgLTEwMjM0LDcgKzEwMzc2LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJQRmlpaVB2RSIsCiAgICAibmFtZSIgOiAiaW50ICgqJikoaW50LCBpbnQsIHZvaWQgKikiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBGaWlpUHZFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSUEZpaWlQdkUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiCiAgIH0sCkBAIC0xMDI0Myw3ICsxMDM4NCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSYiIsCiAgICAibmFtZSIgOiAiYm9vbCAmIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEliIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSYiIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaCIKICAgfQpAQCAtMTAyNTUsNyArMTAzOTUsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUDEzbmF0aXZlX2hhbmRsZSIsCiAgICAibmFtZSIgOiAibmF0aXZlX2hhbmRsZSAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkxM25hdGl2ZV9oYW5kbGUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVAxM25hdGl2ZV9oYW5kbGUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiCiAgIH0sCkBAIC0xMDI2NCw3ICsxMDQwMyw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQMThhbmRyb2lkX2ZsZXhfcGxhbmUiLAogICAgIm5hbWUiIDogImFuZHJvaWRfZmxleF9wbGFuZSAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkxOGFuZHJvaWRfZmxleF9wbGFuZSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUDE4YW5kcm9pZF9mbGV4X3BsYW5lIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnN5c3RlbS9pbmNsdWRlL3N5c3RlbS9ncmFwaGljcy5oIgogICB9LApAQCAtMTAyNzMsNyArMTA0MTEsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUDNESVIiLAogICAgIm5hbWUiIDogIkRJUiAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkzRElSIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQM0RJUiIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vbGliYmFzZS9pbmNsdWRlL2FuZHJvaWQtYmFzZS91bmlxdWVfZmQuaCIKICAgfSwKQEAgLTEwMjgyLDcgKzEwNDE5LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVA3X19zRklMRSIsCiAgICAibmFtZSIgOiAiX19zRklMRSAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEk3X19zRklMRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUDdfX3NGSUxFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9saWJiYXNlL2luY2x1ZGUvYW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oIgogICB9LApAQCAtMTAyOTEsNyArMTA0MjcsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUDdsb2dfbXNnIiwKICAgICJuYW1lIiA6ICJsb2dfbXNnICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTdsb2dfbXNnIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQN2xvZ19tc2ciLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2xvZ2dpbmcvbGlibG9nL2luY2x1ZGVfdm5kay9sb2cvbG9nX3JlYWQuaCIKICAgfSwKQEAgLTEwMzAwLDE2ICsxMDQzNSwxNCBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUERzIiwKICAgICJuYW1lIiA6ICJjaGFyMTZfdCAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElEcyIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUERzIiwKICAgICJzaXplIiA6IDgsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA4LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEZpUEZpUHZFU19QS2NpbVBTX0UiLAogICAgIm5hbWUiIDogImludCAoKikoaW50ICgqKSh2b2lkICopLCB2b2lkICosIGNvbnN0IGNoYXIgKiwgaW50LCB1bnNpZ25lZCBsb25nLCB2b2lkICoqKSIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJRmlQRmlQdkVTX1BLY2ltUFNfRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEZpUEZpUHZFU19QS2NpbVBTX0UiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9BbmRyb2lkVGhyZWFkcy5oIgogICB9LApAQCAtMTAzMTgsMjUgKzEwNDUxLDIyIEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQRmlQS3ZTMF9FIiwKICAgICJuYW1lIiA6ICJpbnQgKCopKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJRmlQS3ZTMF9FIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQRmlQS3ZTMF9FIiwKICAgICJzaXplIiA6IDgsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBGaVBLdlMwX1B2RSIsCiAgICAibmFtZSIgOiAiaW50ICgqKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKiwgdm9pZCAqKSIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJRmlQS3ZTMF9QdkUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBGaVBLdlMwX1B2RSIsCiAgICAic2l6ZSIgOiA4LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDgsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQRmlQdkUiLAogICAgIm5hbWUiIDogImludCAoKikodm9pZCAqKSIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJRmlQdkUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBGaVB2RSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0FuZHJvaWRUaHJlYWRzLmgiCiAgIH0sCkBAIC0xMDM0NSw3ICsxMDQ3NSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQRmlpaVB2RSIsCiAgICAibmFtZSIgOiAiaW50ICgqKShpbnQsIGludCwgdm9pZCAqKSIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJRmlpaVB2RSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEZpaWlQdkUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiCiAgIH0sCkBAIC0xMDM1NCw3ICsxMDQ4Myw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQRnZ2RSIsCiAgICAibmFtZSIgOiAidm9pZCAoKikoKSIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJRnZ2RSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEZ2dkUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9taXNjLmgiCiAgIH0sCkBAIC0xMDM2Myw3ICsxMDQ5MSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQSzEzbmF0aXZlX2hhbmRsZSIsCiAgICAibmFtZSIgOiAiY29uc3QgbmF0aXZlX2hhbmRsZSAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLMTNuYXRpdmVfaGFuZGxlIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQSzEzbmF0aXZlX2hhbmRsZSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL05hdGl2ZUhhbmRsZS5oIgogICB9LApAQCAtMTAzNzIsNyArMTA0OTksNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEs3bG9nX21zZyIsCiAgICAibmFtZSIgOiAiY29uc3QgbG9nX21zZyAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLN2xvZ19tc2ciLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBLN2xvZ19tc2ciLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2xvZ2dpbmcvbGlibG9nL2luY2x1ZGVfdm5kay9sb2cvbG9nX3JlYWQuaCIKICAgfSwKQEAgLTEwMzgxLDM0ICsxMDUwNywzOSBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEtEaSIsCiAgICAibmFtZSIgOiAiY29uc3QgY2hhcjMyX3QgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS0RpIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQS0RpIiwKICAgICJzaXplIiA6IDgsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLRHMiLAogICAgIm5hbWUiIDogImNvbnN0IGNoYXIxNl90ICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtEcyIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEtEcyIsCiAgICAic2l6ZSIgOiA4LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA4LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEtON2FuZHJvaWQxMFZlY3RvckltcGxFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpWZWN0b3JJbXBsICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQxMFZlY3RvckltcGxFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDEwVmVjdG9ySW1wbEUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSIsCisgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6VmVjdG9ySW1wbCAqIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQxMFZlY3RvckltcGxFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDgsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEtON2FuZHJvaWQxMkxpZ2h0UmVmQmFzZUlOU18xMk5hdGl2ZUhhbmRsZUVFRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6TGlnaHRSZWZCYXNlPGFuZHJvaWQ6Ok5hdGl2ZUhhbmRsZT4gKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDEyTGlnaHRSZWZCYXNlSU5TXzEyTmF0aXZlSGFuZGxlRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDEyTGlnaHRSZWZCYXNlSU5TXzEyTmF0aXZlSGFuZGxlRUVFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTGlnaHRSZWZCYXNlLmgiCiAgIH0sCkBAIC0xMDQxNyw3ICsxMDU0OCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS043YW5kcm9pZDEyTmF0aXZlSGFuZGxlRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6TmF0aXZlSGFuZGxlICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQxMk5hdGl2ZUhhbmRsZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkMTJOYXRpdmVIYW5kbGVFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTmF0aXZlSGFuZGxlLmgiCiAgIH0sCkBAIC0xMDQyNiwxNiArMTA1NTYsMTQgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLTjdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6U29ydGVkVmVjdG9ySW1wbCAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQxNlNvcnRlZFZlY3RvckltcGxFIiwKICAgICJzaXplIiA6IDgsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLTjdhbmRyb2lkMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mbyAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQyOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIKICAgfSwKQEAgLTEwNDQ0LDcgKzEwNTcyLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLTjdhbmRyb2lkMnNwSU5TXzE0TG9vcGVyQ2FsbGJhY2tFRUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Okxvb3BlckNhbGxiYWNrPiAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMnNwSU5TXzE0TG9vcGVyQ2FsbGJhY2tFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkMnNwSU5TXzE0TG9vcGVyQ2FsbGJhY2tFRUUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiCiAgIH0sCkBAIC0xMDQ1Myw3ICsxMDU4MCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS043YW5kcm9pZDJzcElOU18xNE1lc3NhZ2VIYW5kbGVyRUVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpNZXNzYWdlSGFuZGxlcj4gKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDJzcElOU18xNE1lc3NhZ2VIYW5kbGVyRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDJzcElOU18xNE1lc3NhZ2VIYW5kbGVyRUVFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgogICB9LApAQCAtMTA0NjIsNyArMTA1ODgsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEtON2FuZHJvaWQyc3BJTlNfNkxvb3BlckVFRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6TG9vcGVyPiAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMnNwSU5TXzZMb29wZXJFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkMnNwSU5TXzZMb29wZXJFRUUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiCiAgIH0sCkBAIC0xMDQ3MSw3ICsxMDU5Niw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS043YW5kcm9pZDJzcElOU182VGhyZWFkRUVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpUaHJlYWQ+ICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQyc3BJTlNfNlRocmVhZEVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQyc3BJTlNfNlRocmVhZEVFRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaCIKICAgfSwKQEAgLTEwNDgwLDcgKzEwNjA0LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLTjdhbmRyb2lkMndwSU5TXzE0TWVzc2FnZUhhbmRsZXJFRUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OndwPGFuZHJvaWQ6Ok1lc3NhZ2VIYW5kbGVyPiAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMndwSU5TXzE0TWVzc2FnZUhhbmRsZXJFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkMndwSU5TXzE0TWVzc2FnZUhhbmRsZXJFRUUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCkBAIC0xMDQ4OSw3ICsxMDYxMiw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS043YW5kcm9pZDJ3cElOU182VGhyZWFkRUVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjp3cDxhbmRyb2lkOjpUaHJlYWQ+ICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQyd3BJTlNfNlRocmVhZEVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQyd3BJTlNfNlRocmVhZEVFRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKQEAgLTEwNDk4LDcgKzEwNjIwLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLTjdhbmRyb2lkNGJhc2UxMWJvcnJvd2VkX2ZkRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDRiYXNlMTFib3Jyb3dlZF9mZEUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkNGJhc2UxMWJvcnJvd2VkX2ZkRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vbGliYmFzZS9pbmNsdWRlL2FuZHJvaWQtYmFzZS91bmlxdWVfZmQuaCIKICAgfSwKQEAgLTEwNTA3LDcgKzEwNjI4LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLTjdhbmRyb2lkNGJhc2UxNHVuaXF1ZV9mZF9pbXBsSU5TMF8xM0RlZmF1bHRDbG9zZXJFRUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZF9pbXBsPGFuZHJvaWQ6OmJhc2U6OkRlZmF1bHRDbG9zZXI+ICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ0YmFzZTE0dW5pcXVlX2ZkX2ltcGxJTlMwXzEzRGVmYXVsdENsb3NlckVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ0YmFzZTE0dW5pcXVlX2ZkX2ltcGxJTlMwXzEzRGVmYXVsdENsb3NlckVFRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vbGliYmFzZS9pbmNsdWRlL2FuZHJvaWQtYmFzZS91bmlxdWVfZmQuaCIKICAgfSwKQEAgLTEwNTE2LDcgKzEwNjM2LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLTjdhbmRyb2lkNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6TG9vcGVyOjpNZXNzYWdlRW52ZWxvcGUgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiCiAgIH0sCkBAIC0xMDUyNSw3ICsxMDY0NCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS043YW5kcm9pZDZMb29wZXI3UmVxdWVzdEUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6Okxvb3Blcjo6UmVxdWVzdCAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkNkxvb3BlcjdSZXF1ZXN0RSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ2TG9vcGVyN1JlcXVlc3RFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTG9vcGVyLmgiCiAgIH0sCkBAIC0xMDUzNCw3ICsxMDY1Miw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS043YW5kcm9pZDZMb29wZXI4UmVzcG9uc2VFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpMb29wZXI6OlJlc3BvbnNlICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ2TG9vcGVyOFJlc3BvbnNlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ2TG9vcGVyOFJlc3BvbnNlRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiCiAgIH0sCkBAIC0xMDU0Myw3ICsxMDY2MCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS043YW5kcm9pZDZMb29wZXJFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpMb29wZXIgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDZMb29wZXJFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDZMb29wZXJFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTG9vcGVyLmgiCiAgIH0sCkBAIC0xMDU1Miw3ICsxMDY2OCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS043YW5kcm9pZDZUaHJlYWRFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpUaHJlYWQgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDZUaHJlYWRFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDZUaHJlYWRFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVGhyZWFkLmgiCiAgIH0sCkBAIC0xMDU2MSw3ICsxMDY3Niw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS043YW5kcm9pZDZWZWN0b3JJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpWZWN0b3I8YW5kcm9pZDo6c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mbz4gKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDZWZWN0b3JJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDZWZWN0b3JJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgiCiAgIH0sCkBAIC0xMDU3MCw3ICsxMDY4NCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS043YW5kcm9pZDZWZWN0b3JJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpWZWN0b3I8YW5kcm9pZDo6TG9vcGVyOjpNZXNzYWdlRW52ZWxvcGU+ICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ2VmVjdG9ySU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ2VmVjdG9ySU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIgogICB9LApAQCAtMTA1NzksNyArMTA2OTIsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEtON2FuZHJvaWQ2VmVjdG9ySU5TXzZMb29wZXI4UmVzcG9uc2VFRUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlZlY3RvcjxhbmRyb2lkOjpMb29wZXI6OlJlc3BvbnNlPiAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkNlZlY3RvcklOU182TG9vcGVyOFJlc3BvbnNlRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDZWZWN0b3JJTlNfNkxvb3BlcjhSZXNwb25zZUVFRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIgogICB9LApAQCAtMTA1ODgsMTYgKzEwNzAwLDE0IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS043YW5kcm9pZDZWZWN0b3JJTlNfN1N0cmluZzhFRUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlZlY3RvcjxhbmRyb2lkOjpTdHJpbmc4PiAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkNlZlY3RvcklOU183U3RyaW5nOEVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ2VmVjdG9ySU5TXzdTdHJpbmc4RUVFIiwKICAgICJzaXplIiA6IDgsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDgsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS043YW5kcm9pZDdGaWxlTWFwRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6RmlsZU1hcCAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkN0ZpbGVNYXBFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdGaWxlTWFwRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0ZpbGVNYXAuaCIKICAgfSwKQEAgLTEwNjA2LDcgKzEwNzE2LDE0IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS043YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpSZWZCYXNlOjp3ZWFrcmVmX3R5cGUgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFIiwKKyAgICJzaXplIiA6IDgsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEtON2FuZHJvaWQ3UmVmQmFzZUUiLAorICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlJlZkJhc2UgKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDdSZWZCYXNlRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKQEAgLTEwNjE0LDQ0ICsxMDczMSw0MSBAQAogICAgImFsaWdubWVudCIgOiA4LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEtON2FuZHJvaWQ3UmVmQmFzZUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlJlZkJhc2UgKiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDdSZWZCYXNlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3UmVmQmFzZUUiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1JlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKICAgICJzaXplIiA6IDgsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLTjdhbmRyb2lkN1N0cmluZzhFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpTdHJpbmc4ICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ3U3RyaW5nOEUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1N0cmluZzhFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDgsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS043YW5kcm9pZDdTdHJpbmc4RSIsCisgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6U3RyaW5nOCAqIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA4LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogOCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLTjdhbmRyb2lkOFN0cmluZzE2RSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6U3RyaW5nMTYgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDhTdHJpbmcxNkUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkOFN0cmluZzE2RSIsCiAgICAic2l6ZSIgOiA4LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCi0gIH0sCi0gIHsKLSAgICJhbGlnbm1lbnQiIDogOCwKLSAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLTjdhbmRyb2lkOUNhbGxTdGFja0UiLAotICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OkNhbGxTdGFjayAqIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkOUNhbGxTdGFja0UiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkOUNhbGxTdGFja0UiLAotICAgInNpemUiIDogOCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9DYWxsU3RhY2suaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA4LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEtON2FuZHJvaWQ5U3RvcFdhdGNoRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6U3RvcFdhdGNoICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ5U3RvcFdhdGNoRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ5U3RvcFdhdGNoRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0b3BXYXRjaC5oIgogICB9LApAQCAtMTA2NjAsNyArMTA3NzQsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEtON2FuZHJvaWQ5VG9rZW5pemVyRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6VG9rZW5pemVyICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ5VG9rZW5pemVyRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ5VG9rZW5pemVyRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1Rva2VuaXplci5oIgogICB9LApAQCAtMTA2NjksNyArMTA3ODIsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEtjIiwKICAgICJuYW1lIiA6ICJjb25zdCBjaGFyICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtjIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQS2MiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9GaWxlTWFwLmgiCiAgIH0sCkBAIC0xMDY3OCw3ICsxMDc5MCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS2giLAogICAgIm5hbWUiIDogImNvbnN0IHVuc2lnbmVkIGNoYXIgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS2giLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBLaCIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0plbmtpbnNIYXNoLmgiCiAgIH0sCkBAIC0xMDY4Nyw3ICsxMDc5OCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS3QiLAogICAgIm5hbWUiIDogImNvbnN0IHVuc2lnbmVkIHNob3J0ICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUt0IiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQS3QiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9KZW5raW5zSGFzaC5oIgogICB9LApAQCAtMTA2OTYsNyArMTA4MDYsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEt2IiwKICAgICJuYW1lIiA6ICJjb25zdCB2b2lkICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUt2IiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQS3YiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9MaWdodFJlZkJhc2UuaCIKICAgfSwKQEAgLTEwNzA1LDcgKzEwODE0LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQxMExvZ1ByaW50ZXJFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpMb2dQcmludGVyICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEwTG9nUHJpbnRlckUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQxMExvZ1ByaW50ZXJFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUHJpbnRlci5oIgogICB9LApAQCAtMTA3MTMsMTcgKzEwODIxLDE1IEBACiAgICAiYWxpZ25tZW50IiA6IDgsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbCAqIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxMFZlY3RvckltcGxFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCiAgICAic2l6ZSIgOiA4LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDgsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkMTFTY29wZWRUcmFjZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlNjb3BlZFRyYWNlICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDExU2NvcGVkVHJhY2VFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkMTFTY29wZWRUcmFjZUUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UcmFjZS5oIgogICB9LApAQCAtMTA3MzIsNyArMTA4MzgsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDEyTGlnaHRSZWZCYXNlSU5TXzEyTmF0aXZlSGFuZGxlRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpMaWdodFJlZkJhc2U8YW5kcm9pZDo6TmF0aXZlSGFuZGxlPiAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxMkxpZ2h0UmVmQmFzZUlOU18xMk5hdGl2ZUhhbmRsZUVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDEyTGlnaHRSZWZCYXNlSU5TXzEyTmF0aXZlSGFuZGxlRUVFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTGlnaHRSZWZCYXNlLmgiCiAgIH0sCkBAIC0xMDc0MSw3ICsxMDg0Niw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkMTJOYXRpdmVIYW5kbGVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpOYXRpdmVIYW5kbGUgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTJOYXRpdmVIYW5kbGVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkMTJOYXRpdmVIYW5kbGVFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgogICB9LApAQCAtMTA3NTAsNyArMTA4NTQsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDEzUHJlZml4UHJpbnRlckUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlByZWZpeFByaW50ZXIgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTNQcmVmaXhQcmludGVyRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDEzUHJlZml4UHJpbnRlckUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9QcmludGVyLmgiCiAgIH0sCkBAIC0xMDc1OSw3ICsxMDg2Miw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkMTRMb29wZXJDYWxsYmFja0UiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6Okxvb3BlckNhbGxiYWNrICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE0TG9vcGVyQ2FsbGJhY2tFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkMTRMb29wZXJDYWxsYmFja0UiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiCiAgIH0sCkBAIC0xMDc2OCw3ICsxMDg3MCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkMTRNZXNzYWdlSGFuZGxlckUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6Ok1lc3NhZ2VIYW5kbGVyICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE0TWVzc2FnZUhhbmRsZXJFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkMTRNZXNzYWdlSGFuZGxlckUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCkBAIC0xMDc3NywxNiArMTA4NzgsMTQgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQxNFN0YXRpY1N0cmluZzE2SUxtMUVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6U3RhdGljU3RyaW5nMTY8MT4gKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTRTdGF0aWNTdHJpbmcxNklMbTFFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQxNFN0YXRpY1N0cmluZzE2SUxtMUVFRSIsCiAgICAic2l6ZSIgOiA4LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQxNFN0cmluZzhQcmludGVyRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nOFByaW50ZXIgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTRTdHJpbmc4UHJpbnRlckUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQxNFN0cmluZzhQcmludGVyRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ByaW50ZXIuaCIKICAgfSwKQEAgLTEwNzk1LDI1ICsxMDg5NCwzMSBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDE2UmVmZXJlbmNlUmVuYW1lckUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlJlZmVyZW5jZVJlbmFtZXIgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTZSZWZlcmVuY2VSZW5hbWVyRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDE2UmVmZXJlbmNlUmVuYW1lckUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQxNlJlZmVyZW5jZVJlbmFtZXJFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjpSZWZlcmVuY2VSZW5hbWVyICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE2UmVmZXJlbmNlUmVuYW1lckUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQxNlJlZmVyZW5jZVJlbmFtZXJFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDgsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlNvcnRlZFZlY3RvckltcGwgKiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAogICAgInNpemUiIDogOCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA4LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDE4V2Vha01lc3NhZ2VIYW5kbGVyRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6V2Vha01lc3NhZ2VIYW5kbGVyICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4V2Vha01lc3NhZ2VIYW5kbGVyRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDE4V2Vha01lc3NhZ2VIYW5kbGVyRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0xvb3Blci5oIgogICB9LApAQCAtMTA4MjIsMTYgKzEwOTI3LDIzIEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkMTlWaXJ0dWFsTGlnaHRSZWZCYXNlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6VmlydHVhbExpZ2h0UmVmQmFzZSAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOVZpcnR1YWxMaWdodFJlZkJhc2VFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkMTlWaXJ0dWFsTGlnaHRSZWZCYXNlRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0xpZ2h0UmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDgsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkMTlWaXJ0dWFsTGlnaHRSZWZCYXNlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6VmlydHVhbExpZ2h0UmVmQmFzZSAqIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOVZpcnR1YWxMaWdodFJlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkMTlWaXJ0dWFsTGlnaHRSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA4LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9MaWdodFJlZkJhc2UuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDIwU2ltcGxlTG9vcGVyQ2FsbGJhY2tFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpTaW1wbGVMb29wZXJDYWxsYmFjayAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQyMFNpbXBsZUxvb3BlckNhbGxiYWNrRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDIwU2ltcGxlTG9vcGVyQ2FsbGJhY2tFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgogICB9LApAQCAtMTA4NDAsNyArMTA5NTIsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0UiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm8gKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0UiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIgogICB9LApAQCAtMTA4NDksNyArMTA5NjAsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDJzcElOU18xMk5hdGl2ZUhhbmRsZUVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6c3A8YW5kcm9pZDo6TmF0aXZlSGFuZGxlPiAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQyc3BJTlNfMTJOYXRpdmVIYW5kbGVFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQyc3BJTlNfMTJOYXRpdmVIYW5kbGVFRUUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiCiAgIH0sCkBAIC0xMDg1OCw3ICsxMDk2OCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkMnNwSU5TXzE0TG9vcGVyQ2FsbGJhY2tFRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnNwPGFuZHJvaWQ6Okxvb3BlckNhbGxiYWNrPiAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQyc3BJTlNfMTRMb29wZXJDYWxsYmFja0VFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDJzcElOU18xNExvb3BlckNhbGxiYWNrRUVFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgogICB9LApAQCAtMTA4NjcsNyArMTA5NzYsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDJzcElOU18xNE1lc3NhZ2VIYW5kbGVyRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpzcDxhbmRyb2lkOjpNZXNzYWdlSGFuZGxlcj4gKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMnNwSU5TXzE0TWVzc2FnZUhhbmRsZXJFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQyc3BJTlNfMTRNZXNzYWdlSGFuZGxlckVFRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaCIKICAgfSwKQEAgLTEwODc2LDcgKzEwOTg0LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQyc3BJTlNfMjBTaW1wbGVMb29wZXJDYWxsYmFja0VFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6c3A8YW5kcm9pZDo6U2ltcGxlTG9vcGVyQ2FsbGJhY2s+ICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDJzcElOU18yMFNpbXBsZUxvb3BlckNhbGxiYWNrRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkMnNwSU5TXzIwU2ltcGxlTG9vcGVyQ2FsbGJhY2tFRUUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiCiAgIH0sCkBAIC0xMDg4NSw3ICsxMDk5Miw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkMnNwSU5TXzZMb29wZXJFRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnNwPGFuZHJvaWQ6Okxvb3Blcj4gKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMnNwSU5TXzZMb29wZXJFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQyc3BJTlNfNkxvb3BlckVFRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaCIKICAgfSwKQEAgLTEwODk0LDcgKzExMDAwLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQyc3BJTlNfNlRocmVhZEVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6c3A8YW5kcm9pZDo6VGhyZWFkPiAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQyc3BJTlNfNlRocmVhZEVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDJzcElOU182VGhyZWFkRUVFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgogICB9LApAQCAtMTA5MDMsNyArMTEwMDgsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDJ3cElOU18xNE1lc3NhZ2VIYW5kbGVyRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp3cDxhbmRyb2lkOjpNZXNzYWdlSGFuZGxlcj4gKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMndwSU5TXzE0TWVzc2FnZUhhbmRsZXJFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQyd3BJTlNfMTRNZXNzYWdlSGFuZGxlckVFRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKQEAgLTEwOTEyLDcgKzExMDE2LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQyd3BJTlNfNlRocmVhZEVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6d3A8YW5kcm9pZDo6VGhyZWFkPiAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQyd3BJTlNfNlRocmVhZEVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDJ3cElOU182VGhyZWFkRUVFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LApAQCAtMTA5MjEsNyArMTEwMjQsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDRiYXNlMTFib3Jyb3dlZF9mZEUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDRiYXNlMTFib3Jyb3dlZF9mZEUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ0YmFzZTExYm9ycm93ZWRfZmRFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9saWJiYXNlL2luY2x1ZGUvYW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oIgogICB9LApAQCAtMTA5MzAsNyArMTEwMzIsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDRiYXNlMTR1bmlxdWVfZmRfaW1wbElOUzBfMTNEZWZhdWx0Q2xvc2VyRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmRfaW1wbDxhbmRyb2lkOjpiYXNlOjpEZWZhdWx0Q2xvc2VyPiAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ0YmFzZTE0dW5pcXVlX2ZkX2ltcGxJTlMwXzEzRGVmYXVsdENsb3NlckVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDRiYXNlMTR1bmlxdWVfZmRfaW1wbElOUzBfMTNEZWZhdWx0Q2xvc2VyRUVFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9saWJiYXNlL2luY2x1ZGUvYW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oIgogICB9LApAQCAtMTA5MzksNyArMTEwNDAsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDVNdXRleDhBdXRvbG9ja0UiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6Ok11dGV4OjpBdXRvbG9jayAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ1TXV0ZXg4QXV0b2xvY2tFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkNU11dGV4OEF1dG9sb2NrRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL011dGV4LmgiCiAgIH0sCkBAIC0xMDk0OCw3ICsxMTA0OCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkNU11dGV4RSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6TXV0ZXggKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNU11dGV4RSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDVNdXRleEUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9NdXRleC5oIgogICB9LApAQCAtMTA5NTcsNyArMTEwNTYsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6Okxvb3Blcjo6TWVzc2FnZUVudmVsb3BlICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ2TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIKICAgfSwKQEAgLTEwOTY2LDcgKzExMDY0LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQ2TG9vcGVyOFJlc3BvbnNlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6TG9vcGVyOjpSZXNwb25zZSAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2TG9vcGVyOFJlc3BvbnNlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDZMb29wZXI4UmVzcG9uc2VFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIKICAgfSwKQEAgLTEwOTc1LDcgKzExMDcyLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQ2TG9vcGVyRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6TG9vcGVyICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZMb29wZXJFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkNkxvb3BlckUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiCiAgIH0sCkBAIC0xMDk4NCw3ICsxMTA4MCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkNlJXTG9jazlBdXRvUkxvY2tFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpSV0xvY2s6OkF1dG9STG9jayAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2UldMb2NrOUF1dG9STG9ja0UiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ2UldMb2NrOUF1dG9STG9ja0UiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SV0xvY2suaCIKICAgfSwKQEAgLTEwOTkzLDcgKzExMDg4LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQ2UldMb2NrOUF1dG9XTG9ja0UiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlJXTG9jazo6QXV0b1dMb2NrICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZSV0xvY2s5QXV0b1dMb2NrRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDZSV0xvY2s5QXV0b1dMb2NrRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JXTG9jay5oIgogICB9LApAQCAtMTEwMDIsNyArMTEwOTYsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDZSV0xvY2tFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpSV0xvY2sgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNlJXTG9ja0UiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ2UldMb2NrRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JXTG9jay5oIgogICB9LApAQCAtMTEwMTEsNyArMTExMDQsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDZUaHJlYWRFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpUaHJlYWQgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNlRocmVhZEUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ2VGhyZWFkRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKQEAgLTExMDIwLDcgKzExMTEyLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQ2VmVjdG9ySU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9yPGFuZHJvaWQ6OnN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm8+ICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZWZWN0b3JJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkNlZlY3RvcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRUUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3IuaCIKICAgfSwKQEAgLTExMDI5LDcgKzExMTIwLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQ2VmVjdG9ySU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9yPGFuZHJvaWQ6Okxvb3Blcjo6TWVzc2FnZUVudmVsb3BlPiAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2VmVjdG9ySU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDZWZWN0b3JJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUVFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgiCiAgIH0sCkBAIC0xMTAzOCw3ICsxMTEyOCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkNlZlY3RvcklOU182TG9vcGVyOFJlc3BvbnNlRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3I8YW5kcm9pZDo6TG9vcGVyOjpSZXNwb25zZT4gKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNlZlY3RvcklOU182TG9vcGVyOFJlc3BvbnNlRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkNlZlY3RvcklOU182TG9vcGVyOFJlc3BvbnNlRUVFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgiCiAgIH0sCkBAIC0xMTA0NywxNiArMTExMzYsMTQgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQ2VmVjdG9ySU5TXzdTdHJpbmc4RUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3I8YW5kcm9pZDo6U3RyaW5nOD4gKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNlZlY3RvcklOU183U3RyaW5nOEVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDZWZWN0b3JJTlNfN1N0cmluZzhFRUUiLAogICAgInNpemUiIDogOCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3IuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQ3RmlsZU1hcEUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OkZpbGVNYXAgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN0ZpbGVNYXBFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN0ZpbGVNYXBFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvRmlsZU1hcC5oIgogICB9LApAQCAtMTEwNjUsNyArMTExNTIsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDdNZXNzYWdlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6TWVzc2FnZSAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3TWVzc2FnZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3TWVzc2FnZUUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Mb29wZXIuaCIKICAgfSwKQEAgLTExMDc0LDcgKzExMTYwLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQ3UHJpbnRlckUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlByaW50ZXIgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1ByaW50ZXJFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1ByaW50ZXJFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUHJpbnRlci5oIgogICB9LApAQCAtMTEwODMsNyArMTExNjgsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX2ltcGxFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlOjp3ZWFrcmVmX2ltcGwgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfaW1wbEUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl9pbXBsRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKQEAgLTExMDkyLDcgKzExMTc2LDIzIEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6OndlYWtyZWZfdHlwZSAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFIiwKKyAgICJzaXplIiA6IDgsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDgsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6OndlYWtyZWZfdHlwZSAqIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDgsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZSAqIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZUUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCkBAIC0xMTEwMCw2MiArMTEyMDAsNDkgQEAKICAgICJhbGlnbm1lbnQiIDogOCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2UgKiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2VFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAogICAgInNpemUiIDogOCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA4LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nOCAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3U3RyaW5nOEUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9QcmludGVyLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OlN0cmluZzggKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDgsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDhTdHJpbmcxNjEwU3RhdGljRGF0YUlMbTFFRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpTdGF0aWNEYXRhPDE+ICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDhTdHJpbmcxNjEwU3RhdGljRGF0YUlMbTFFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ4U3RyaW5nMTYxMFN0YXRpY0RhdGFJTG0xRUVFIiwKICAgICJzaXplIiA6IDgsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA4LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDhTdHJpbmcxNkUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2ICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDhTdHJpbmcxNkUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ4U3RyaW5nMTZFIiwKICAgICJzaXplIiA6IDgsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKLSAgfSwKLSAgewotICAgImFsaWdubWVudCIgOiA4LAotICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDlDYWxsU3RhY2sxMlN0YWNrRGVsZXRlckUiLAotICAgIm5hbWUiIDogImFuZHJvaWQ6OkNhbGxTdGFjazo6U3RhY2tEZWxldGVyICoiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDlDYWxsU3RhY2sxMlN0YWNrRGVsZXRlckUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ5Q2FsbFN0YWNrMTJTdGFja0RlbGV0ZXJFIiwKLSAgICJzaXplIiA6IDgsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvQ2FsbFN0YWNrLmgiCi0gIH0sCi0gIHsKLSAgICJhbGlnbm1lbnQiIDogOCwKLSAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQ5Q2FsbFN0YWNrRSIsCi0gICAibmFtZSIgOiAiYW5kcm9pZDo6Q2FsbFN0YWNrICoiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDlDYWxsU3RhY2tFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkOUNhbGxTdGFja0UiLAotICAgInNpemUiIDogOCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9DYWxsU3RhY2suaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA4LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDlDb25kaXRpb25FIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpDb25kaXRpb24gKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkOUNvbmRpdGlvbkUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ5Q29uZGl0aW9uRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0NvbmRpdGlvbi5oIgogICB9LApAQCAtMTExNjQsNyArMTEyNTEsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDlGZFByaW50ZXJFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpGZFByaW50ZXIgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkOUZkUHJpbnRlckUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ5RmRQcmludGVyRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ByaW50ZXIuaCIKICAgfSwKQEAgLTExMTczLDcgKzExMjU5LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQ5U3RvcFdhdGNoRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6U3RvcFdhdGNoICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDlTdG9wV2F0Y2hFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkOVN0b3BXYXRjaEUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdG9wV2F0Y2guaCIKICAgfSwKQEAgLTExMTgyLDcgKzExMjY3LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQ5VG9rZW5pemVyRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6VG9rZW5pemVyICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDlUb2tlbml6ZXJFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkOVRva2VuaXplckUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Ub2tlbml6ZXIuaCIKICAgfSwKQEAgLTExMTkxLDcgKzExMjc1LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBQTjdhbmRyb2lkOVRva2VuaXplckUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlRva2VuaXplciAqKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDlUb2tlbml6ZXJFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQUE43YW5kcm9pZDlUb2tlbml6ZXJFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVG9rZW5pemVyLmgiCiAgIH0sCkBAIC0xMTIwMCw3ICsxMTI4Myw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQUHYiLAogICAgIm5hbWUiIDogInZvaWQgKioiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB2IiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQUHYiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9BbmRyb2lkVGhyZWFkcy5oIgogICB9LApAQCAtMTEyMDksNyArMTEyOTEsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUGMiLAogICAgIm5hbWUiIDogImNoYXIgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJYyIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUGMiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9GaWxlTWFwLmgiCiAgIH0sCkBAIC0xMTIxOCw3ICsxMTI5OSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQaCIsCiAgICAibmFtZSIgOiAidW5zaWduZWQgY2hhciAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEloIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQaCIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJzeXN0ZW0vaW5jbHVkZS9zeXN0ZW0vZ3JhcGhpY3MuaCIKICAgfSwKQEAgLTExMjI3LDcgKzExMzA3LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBpIiwKICAgICJuYW1lIiA6ICJpbnQgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUGkiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Mb29wZXIuaCIKICAgfSwKQEAgLTExMjM2LDE2ICsxMTMxNSwxNCBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUG0iLAogICAgIm5hbWUiIDogInVuc2lnbmVkIGxvbmcgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJbSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUG0iLAogICAgInNpemUiIDogOCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA4LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUHYiLAogICAgIm5hbWUiIDogInZvaWQgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJdiIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUHYiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9GaWxlTWFwLmgiCiAgIH0KQEAgLTExMjU4LDkgKzExMzM1LDggQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUExX0tEcyIsCiAgICAibmFtZSIgOiAiY29uc3QgY2hhcjE2X3RbMV0iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUExX0RzIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElBMV9LRHMiLAogICAgInNpemUiIDogMiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCkBAIC0xMTI2OCw3ICsxMTM0NCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLMTNuYXRpdmVfaGFuZGxlIiwKICAgICJuYW1lIiA6ICJjb25zdCBuYXRpdmVfaGFuZGxlIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkxM25hdGl2ZV9oYW5kbGUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUsxM25hdGl2ZV9oYW5kbGUiLAogICAgInNpemUiIDogMTIsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTmF0aXZlSGFuZGxlLmgiCiAgIH0sCkBAIC0xMTI3OCw3ICsxMTM1Myw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLN2xvZ19tc2ciLAogICAgIm5hbWUiIDogImNvbnN0IGxvZ19tc2ciLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTdsb2dfbXNnIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLN2xvZ19tc2ciLAogICAgInNpemUiIDogNTEyNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2xvZ2dpbmcvbGlibG9nL2luY2x1ZGVfdm5kay9sb2cvbG9nX3JlYWQuaCIKICAgfSwKQEAgLTExMjg4LDkgKzExMzYyLDggQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtEaSIsCiAgICAibmFtZSIgOiAiY29uc3QgY2hhcjMyX3QiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSURpIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLRGkiLAogICAgInNpemUiIDogNCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAyLApAQCAtMTEyOTgsOSArMTEzNzEsMTggQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtEcyIsCiAgICAibmFtZSIgOiAiY29uc3QgY2hhcjE2X3QiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSURzIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLRHMiLAogICAgInNpemUiIDogMiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogOCwKKyAgICJpc19jb25zdCIgOiB0cnVlLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS043YW5kcm9pZDEwVmVjdG9ySW1wbEUiLAorICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlZlY3RvckltcGwiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEwVmVjdG9ySW1wbEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQxMFZlY3RvckltcGxFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQwLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKQEAgLTExMzA4LDcgKzExMzkwLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtON2FuZHJvaWQxMFZlY3RvckltcGxFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpWZWN0b3JJbXBsIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxMFZlY3RvckltcGxFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSIsCiAgICAic2l6ZSIgOiA0MCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCkBAIC0xMTMxOCw3ICsxMTM5OSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLTjdhbmRyb2lkMTJMaWdodFJlZkJhc2VJTlNfMTJOYXRpdmVIYW5kbGVFRUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OkxpZ2h0UmVmQmFzZTxhbmRyb2lkOjpOYXRpdmVIYW5kbGU+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxMkxpZ2h0UmVmQmFzZUlOU18xMk5hdGl2ZUhhbmRsZUVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDEyTGlnaHRSZWZCYXNlSU5TXzEyTmF0aXZlSGFuZGxlRUVFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTGlnaHRSZWZCYXNlLmgiCiAgIH0sCkBAIC0xMTMyOCw3ICsxMTQwOCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLTjdhbmRyb2lkMTJOYXRpdmVIYW5kbGVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpOYXRpdmVIYW5kbGUiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEyTmF0aXZlSGFuZGxlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDEyTmF0aXZlSGFuZGxlRSIsCiAgICAic2l6ZSIgOiAyNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9OYXRpdmVIYW5kbGUuaCIKICAgfSwKQEAgLTExMzM3LDIwICsxMTQxNiwxOCBAQAogICAgImlzX2NvbnN0IiA6IHRydWUsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLTjdhbmRyb2lkMTZSZWZlcmVuY2VSZW5hbWVyRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6UmVmZXJlbmNlUmVuYW1lciIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTZSZWZlcmVuY2VSZW5hbWVyRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDE2UmVmZXJlbmNlUmVuYW1lckUiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE2UmVmZXJlbmNlUmVuYW1lckUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAogICAgInNpemUiIDogOCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA4LAogICAgImlzX2NvbnN0IiA6IHRydWUsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLTjdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6U29ydGVkVmVjdG9ySW1wbCIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAogICAgInNpemUiIDogNDAsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKQEAgLTExMzU4LDcgKzExNDM1LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtON2FuZHJvaWQyOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQyOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRSIsCiAgICAic2l6ZSIgOiAxNiwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIgogICB9LApAQCAtMTEzNjgsNyArMTE0NDQsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS043YW5kcm9pZDJzcElOU18xNExvb3BlckNhbGxiYWNrRUVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpMb29wZXJDYWxsYmFjaz4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDJzcElOU18xNExvb3BlckNhbGxiYWNrRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMnNwSU5TXzE0TG9vcGVyQ2FsbGJhY2tFRUUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiCiAgIH0sCkBAIC0xMTM3OCw3ICsxMTQ1Myw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLTjdhbmRyb2lkMnNwSU5TXzE0TWVzc2FnZUhhbmRsZXJFRUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Ok1lc3NhZ2VIYW5kbGVyPiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMnNwSU5TXzE0TWVzc2FnZUhhbmRsZXJFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQyc3BJTlNfMTRNZXNzYWdlSGFuZGxlckVFRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaCIKICAgfSwKQEAgLTExMzg4LDcgKzExNDYyLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtON2FuZHJvaWQyc3BJTlNfMjBTaW1wbGVMb29wZXJDYWxsYmFja0VFRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6U2ltcGxlTG9vcGVyQ2FsbGJhY2s+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQyc3BJTlNfMjBTaW1wbGVMb29wZXJDYWxsYmFja0VFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDJzcElOU18yMFNpbXBsZUxvb3BlckNhbGxiYWNrRUVFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgogICB9LApAQCAtMTEzOTgsNyArMTE0NzEsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS043YW5kcm9pZDJzcElOU182TG9vcGVyRUVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpMb29wZXI+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQyc3BJTlNfNkxvb3BlckVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDJzcElOU182TG9vcGVyRUVFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgogICB9LApAQCAtMTE0MDgsNyArMTE0ODAsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS043YW5kcm9pZDJzcElOU182VGhyZWFkRUVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpUaHJlYWQ+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQyc3BJTlNfNlRocmVhZEVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDJzcElOU182VGhyZWFkRUVFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LApAQCAtMTE0MTgsNyArMTE0ODksNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS043YW5kcm9pZDJ3cElOU18xNE1lc3NhZ2VIYW5kbGVyRUVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjp3cDxhbmRyb2lkOjpNZXNzYWdlSGFuZGxlcj4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDJ3cElOU18xNE1lc3NhZ2VIYW5kbGVyRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMndwSU5TXzE0TWVzc2FnZUhhbmRsZXJFRUUiLAogICAgInNpemUiIDogMTYsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LApAQCAtMTE0MjgsNyArMTE0OTgsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS043YW5kcm9pZDJ3cElOU182VGhyZWFkRUVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjp3cDxhbmRyb2lkOjpUaHJlYWQ+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQyd3BJTlNfNlRocmVhZEVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDJ3cElOU182VGhyZWFkRUVFIiwKICAgICJzaXplIiA6IDE2LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKQEAgLTExNDM4LDcgKzExNTA3LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtON2FuZHJvaWQ0YmFzZTExYm9ycm93ZWRfZmRFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNGJhc2UxMWJvcnJvd2VkX2ZkRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDRiYXNlMTFib3Jyb3dlZF9mZEUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2xpYmJhc2UvaW5jbHVkZS9hbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmgiCiAgIH0sCkBAIC0xMTQ0OCw3ICsxMTUxNiw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLTjdhbmRyb2lkNGJhc2UxNHVuaXF1ZV9mZF9pbXBsSU5TMF8xM0RlZmF1bHRDbG9zZXJFRUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZF9pbXBsPGFuZHJvaWQ6OmJhc2U6OkRlZmF1bHRDbG9zZXI+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ0YmFzZTE0dW5pcXVlX2ZkX2ltcGxJTlMwXzEzRGVmYXVsdENsb3NlckVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDRiYXNlMTR1bmlxdWVfZmRfaW1wbElOUzBfMTNEZWZhdWx0Q2xvc2VyRUVFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9saWJiYXNlL2luY2x1ZGUvYW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oIgogICB9LApAQCAtMTE0NTgsNyArMTE1MjUsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS043YW5kcm9pZDZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6Okxvb3Blcjo6TWVzc2FnZUVudmVsb3BlIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRSIsCiAgICAic2l6ZSIgOiAyNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIgogICB9LApAQCAtMTE0NjgsNyArMTE1MzQsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS043YW5kcm9pZDZMb29wZXI3UmVxdWVzdEUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6Okxvb3Blcjo6UmVxdWVzdCIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNkxvb3BlcjdSZXF1ZXN0RSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDZMb29wZXI3UmVxdWVzdEUiLAogICAgInNpemUiIDogMzIsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTG9vcGVyLmgiCiAgIH0sCkBAIC0xMTQ3OCw3ICsxMTU0Myw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLTjdhbmRyb2lkNkxvb3BlcjhSZXNwb25zZUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6Okxvb3Blcjo6UmVzcG9uc2UiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZMb29wZXI4UmVzcG9uc2VFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkNkxvb3BlcjhSZXNwb25zZUUiLAogICAgInNpemUiIDogNDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIKICAgfSwKQEAgLTExNDg4LDcgKzExNTUyLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtON2FuZHJvaWQ2TG9vcGVyRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6TG9vcGVyIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2TG9vcGVyRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDZMb29wZXJFIiwKICAgICJzaXplIiA6IDI2NCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Mb29wZXIuaCIKICAgfSwKQEAgLTExNDk4LDcgKzExNTYxLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtON2FuZHJvaWQ2VGhyZWFkRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6VGhyZWFkIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2VGhyZWFkRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDZUaHJlYWRFIiwKICAgICJzaXplIiA6IDE1MiwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UaHJlYWQuaCIKICAgfSwKQEAgLTExNTA4LDcgKzExNTcwLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtON2FuZHJvaWQ2VmVjdG9ySU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6VmVjdG9yPGFuZHJvaWQ6OnN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm8+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2VmVjdG9ySU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDZWZWN0b3JJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKICAgICJzaXplIiA6IDQwLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIgogICB9LApAQCAtMTE1MTgsNyArMTE1NzksNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS043YW5kcm9pZDZWZWN0b3JJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpWZWN0b3I8YW5kcm9pZDo6TG9vcGVyOjpNZXNzYWdlRW52ZWxvcGU+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2VmVjdG9ySU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDZWZWN0b3JJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUVFIiwKICAgICJzaXplIiA6IDQwLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIgogICB9LApAQCAtMTE1MjgsNyArMTE1ODgsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS043YW5kcm9pZDZWZWN0b3JJTlNfNkxvb3BlcjhSZXNwb25zZUVFRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6VmVjdG9yPGFuZHJvaWQ6Okxvb3Blcjo6UmVzcG9uc2U+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2VmVjdG9ySU5TXzZMb29wZXI4UmVzcG9uc2VFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ2VmVjdG9ySU5TXzZMb29wZXI4UmVzcG9uc2VFRUUiLAogICAgInNpemUiIDogNDAsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgiCiAgIH0sCkBAIC0xMTUzOCw5ICsxMTU5Nyw4IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLTjdhbmRyb2lkNlZlY3RvcklOU183U3RyaW5nOEVFRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6VmVjdG9yPGFuZHJvaWQ6OlN0cmluZzg+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2VmVjdG9ySU5TXzdTdHJpbmc4RUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkNlZlY3RvcklOU183U3RyaW5nOEVFRSIsCiAgICAic2l6ZSIgOiA0MCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3IuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKQEAgLTExNTQ4LDcgKzExNjA2LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtON2FuZHJvaWQ3RmlsZU1hcEUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OkZpbGVNYXAiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdGaWxlTWFwRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDdGaWxlTWFwRSIsCiAgICAic2l6ZSIgOiA0OCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9GaWxlTWFwLmgiCiAgIH0sCkBAIC0xMTU1OCw3ICsxMTYxNSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLTjdhbmRyb2lkN01lc3NhZ2VFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpNZXNzYWdlIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3TWVzc2FnZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ3TWVzc2FnZUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Mb29wZXIuaCIKICAgfSwKQEAgLTExNTY3LDEwICsxMTYyMywxOSBAQAogICAgImlzX2NvbnN0IiA6IHRydWUsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlJlZkJhc2U6OndlYWtyZWZfdHlwZSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAogICAgInNpemUiIDogMSwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAorICAgImlzX2NvbnN0IiA6IHRydWUsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLTjdhbmRyb2lkN1JlZkJhc2VFIiwKKyAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpSZWZCYXNlIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMTYsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA4LApAQCAtMTE1NzgsNyArMTE2NDMsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS043YW5kcm9pZDdSZWZCYXNlRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6UmVmQmFzZSIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2VFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkN1JlZkJhc2VFIiwKICAgICJzaXplIiA6IDE2LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKQEAgLTExNTg3LDggKzExNjUxLDE3IEBACiAgICAiaXNfY29uc3QiIDogdHJ1ZSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtON2FuZHJvaWQ3U3RyaW5nOEUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlN0cmluZzgiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA4LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogOCwKKyAgICJpc19jb25zdCIgOiB0cnVlLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS043YW5kcm9pZDdTdHJpbmc4RSIsCisgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6U3RyaW5nOCIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1N0cmluZzhFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkN1N0cmluZzhFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LApAQCAtMTE1OTgsOSArMTE2NzEsOCBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS043YW5kcm9pZDhTdHJpbmcxNjEwU3RhdGljRGF0YUlMbTFFRUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlN0cmluZzE2OjpTdGF0aWNEYXRhPDE+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ4U3RyaW5nMTYxMFN0YXRpY0RhdGFJTG0xRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkOFN0cmluZzE2MTBTdGF0aWNEYXRhSUxtMUVFRSIsCiAgICAic2l6ZSIgOiA4LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKQEAgLTExNjA4LDE5ICsxMTY4MCw4IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLTjdhbmRyb2lkOFN0cmluZzE2RSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6U3RyaW5nMTYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDhTdHJpbmcxNkUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ4U3RyaW5nMTZFIiwKICAgICJzaXplIiA6IDgsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgotICB9LAotICB7Ci0gICAiYWxpZ25tZW50IiA6IDgsCi0gICAiaXNfY29uc3QiIDogdHJ1ZSwKLSAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtON2FuZHJvaWQ5Q2FsbFN0YWNrRSIsCi0gICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6Q2FsbFN0YWNrIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ5Q2FsbFN0YWNrRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDlDYWxsU3RhY2tFIiwKLSAgICJzaXplIiA6IDQwLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0NhbGxTdGFjay5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDgsCkBAIC0xMTYyOCw3ICsxMTY4OSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLTjdhbmRyb2lkOVN0b3BXYXRjaEUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlN0b3BXYXRjaCIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkOVN0b3BXYXRjaEUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ5U3RvcFdhdGNoRSIsCiAgICAic2l6ZSIgOiAyNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdG9wV2F0Y2guaCIKICAgfSwKQEAgLTExNjM4LDI3ICsxMTY5OCwxNSBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS043YW5kcm9pZDlUb2tlbml6ZXJFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpUb2tlbml6ZXIiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDlUb2tlbml6ZXJFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkOVRva2VuaXplckUiLAogICAgInNpemUiIDogNTYsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVG9rZW5pemVyLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKICAgICJpc19jb25zdCIgOiB0cnVlLAotICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS1BLYyIsCi0gICAibmFtZSIgOiAiY29uc3QgY2hhciAqY29uc3QiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS1BLYyIsCi0gICAic2l6ZSIgOiA4LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJwcm9jZXNzZ3JvdXAvaW5jbHVkZS9wcm9jZXNzZ3JvdXAvcHJvY2Vzc2dyb3VwLmgiCi0gIH0sCi0gIHsKLSAgICJhbGlnbm1lbnQiIDogOCwKLSAgICJpc19jb25zdCIgOiB0cnVlLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS1BON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl9pbXBsRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6d2Vha3JlZl9pbXBsICpjb25zdCIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX2ltcGxFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX2ltcGxFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LApAQCAtMTE2NjgsNyArMTE3MTYsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS2EiLAogICAgIm5hbWUiIDogImNvbnN0IHNpZ25lZCBjaGFyIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElhIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLYSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiCiAgIH0sCkBAIC0xMTY3OCw3ICsxMTcyNSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLYiIsCiAgICAibmFtZSIgOiAiY29uc3QgYm9vbCIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJYiIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS2IiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIgogICB9LApAQCAtMTE2ODgsNyArMTE3MzQsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS2MiLAogICAgIm5hbWUiIDogImNvbnN0IGNoYXIiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWMiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUtjIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvRmlsZU1hcC5oIgogICB9LApAQCAtMTE2OTgsNyArMTE3NDMsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS2QiLAogICAgIm5hbWUiIDogImNvbnN0IGRvdWJsZSIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJZCIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS2QiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIgogICB9LApAQCAtMTE3MDgsNyArMTE3NTIsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS2YiLAogICAgIm5hbWUiIDogImNvbnN0IGZsb2F0IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElmIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLZiIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiCiAgIH0sCkBAIC0xMTcxOCw3ICsxMTc2MSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLaCIsCiAgICAibmFtZSIgOiAiY29uc3QgdW5zaWduZWQgY2hhciIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaCIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS2giLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIgogICB9LApAQCAtMTE3MjgsNyArMTE3NzAsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS2kiLAogICAgIm5hbWUiIDogImNvbnN0IGludCIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS2kiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIgogICB9LApAQCAtMTE3MzgsNyArMTE3NzksNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS2oiLAogICAgIm5hbWUiIDogImNvbnN0IHVuc2lnbmVkIGludCIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS2oiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIgogICB9LApAQCAtMTE3NDgsNyArMTE3ODgsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS2wiLAogICAgIm5hbWUiIDogImNvbnN0IGxvbmciLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWwiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUtsIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIKICAgfSwKQEAgLTExNzU4LDcgKzExNzk3LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUttIiwKICAgICJuYW1lIiA6ICJjb25zdCB1bnNpZ25lZCBsb25nIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEltIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLbSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiCiAgIH0sCkBAIC0xMTc2OCw3ICsxMTgwNiw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLcyIsCiAgICAibmFtZSIgOiAiY29uc3Qgc2hvcnQiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSXMiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUtzIiwKICAgICJzaXplIiA6IDIsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIKICAgfSwKQEAgLTExNzc4LDcgKzExODE1LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUt0IiwKICAgICJuYW1lIiA6ICJjb25zdCB1bnNpZ25lZCBzaG9ydCIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJdCIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS3QiLAogICAgInNpemUiIDogMiwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIgogICB9LApAQCAtMTE3ODcsNyArMTE4MjMsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS3YiLAogICAgIm5hbWUiIDogImNvbnN0IHZvaWQiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSXYiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUt2IiwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9MaWdodFJlZkJhc2UuaCIKICAgfSwKICAgewpAQCAtMTE3OTYsNyArMTE4MzEsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJVmIiLAogICAgIm5hbWUiIDogInZvbGF0aWxlIGJvb2wiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWIiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVZiIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVGhyZWFkLmgiCiAgIH0KQEAgLTExODQ5LDggKzExODgzLDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEkxMmxvZ2dlcl9lbnRyeSIsCiAgICAibmFtZSIgOiAibG9nZ2VyX2VudHJ5IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkxMmxvZ2dlcl9lbnRyeSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJMTJsb2dnZXJfZW50cnkiLAogICAgInNpemUiIDogMjgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9sb2dnaW5nL2xpYmxvZy9pbmNsdWRlX3ZuZGsvbG9nL2xvZ19yZWFkLmgiCiAgIH0sCkBAIC0xMTg5NSw4ICsxMTkyNyw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJMTNhbmRyb2lkX3ljYmNyIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkX3ljYmNyIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkxM2FuZHJvaWRfeWNiY3IiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSTEzYW5kcm9pZF95Y2JjciIsCiAgICAic2l6ZSIgOiA4MCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlic3lzdGVtL2luY2x1ZGUvc3lzdGVtL2dyYXBoaWNzLmgiCiAgIH0sCkBAIC0xMTkyNiw4ICsxMTk1Niw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJMTNuYXRpdmVfaGFuZGxlIiwKICAgICJuYW1lIiA6ICJuYXRpdmVfaGFuZGxlIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkxM25hdGl2ZV9oYW5kbGUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSTEzbmF0aXZlX2hhbmRsZSIsCiAgICAic2l6ZSIgOiAxMiwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGVfb3V0c2lkZV9zeXN0ZW0vY3V0aWxzL25hdGl2ZV9oYW5kbGUuaCIKICAgfSwKQEAgLTExOTQ3LDggKzExOTc1LDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEkxNmFuZHJvaWRfeHlfY29sb3IiLAogICAgIm5hbWUiIDogImFuZHJvaWRfeHlfY29sb3IiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTE2YW5kcm9pZF94eV9jb2xvciIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJMTZhbmRyb2lkX3h5X2NvbG9yIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnN5c3RlbS9pbmNsdWRlL3N5c3RlbS9ncmFwaGljcy5oIgogICB9LApAQCAtMTE5OTgsOCArMTIwMjQsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSTE4YW5kcm9pZF9mbGV4X3BsYW5lIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkX2ZsZXhfcGxhbmUiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTE4YW5kcm9pZF9mbGV4X3BsYW5lIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVEkxOGFuZHJvaWRfZmxleF9wbGFuZSIsCiAgICAic2l6ZSIgOiA0MCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlic3lzdGVtL2luY2x1ZGUvc3lzdGVtL2dyYXBoaWNzLmgiCiAgIH0sCkBAIC0xMjAyNCw4ICsxMjA0OCw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJMTlhbmRyb2lkX2ZsZXhfbGF5b3V0IiwKICAgICJuYW1lIiA6ICJhbmRyb2lkX2ZsZXhfbGF5b3V0IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkxOWFuZHJvaWRfZmxleF9sYXlvdXQiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSTE5YW5kcm9pZF9mbGV4X2xheW91dCIsCiAgICAic2l6ZSIgOiAxNiwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlic3lzdGVtL2luY2x1ZGUvc3lzdGVtL2dyYXBoaWNzLmgiCiAgIH0sCkBAIC0xMjA1MCw4ICsxMjA3Miw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJMjBhbmRyb2lkX2RlcHRoX3BvaW50cyIsCiAgICAibmFtZSIgOiAiYW5kcm9pZF9kZXB0aF9wb2ludHMiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTIwYW5kcm9pZF9kZXB0aF9wb2ludHMiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSTIwYW5kcm9pZF9kZXB0aF9wb2ludHMiLAogICAgInNpemUiIDogMzYsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnN5c3RlbS9pbmNsdWRlL3N5c3RlbS9ncmFwaGljcy5oIgogICB9LApAQCAtMTIwOTYsOCArMTIxMTYsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSTIxX19hbmRyb2lkX2xvZ19tZXNzYWdlIiwKICAgICJuYW1lIiA6ICJfX2FuZHJvaWRfbG9nX21lc3NhZ2UiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTIxX19hbmRyb2lkX2xvZ19tZXNzYWdlIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVEkyMV9fYW5kcm9pZF9sb2dfbWVzc2FnZSIsCiAgICAic2l6ZSIgOiA0OCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2xvZ2dpbmcvbGlibG9nL2luY2x1ZGVfdm5kay9hbmRyb2lkL2xvZy5oIgogICB9LApAQCAtMTIxMTcsOCArMTIxMzUsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSTI1YW5kcm9pZF9jdGE4NjFfM19tZXRhZGF0YSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZF9jdGE4NjFfM19tZXRhZGF0YSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJMjVhbmRyb2lkX2N0YTg2MV8zX21ldGFkYXRhIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVEkyNWFuZHJvaWRfY3RhODYxXzNfbWV0YWRhdGEiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlic3lzdGVtL2luY2x1ZGUvc3lzdGVtL2dyYXBoaWNzLmgiCiAgIH0sCkBAIC0xMjE1OCw4ICsxMjE3NCw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJMjZhbmRyb2lkX3NtcHRlMjA4Nl9tZXRhZGF0YSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZF9zbXB0ZTIwODZfbWV0YWRhdGEiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTI2YW5kcm9pZF9zbXB0ZTIwODZfbWV0YWRhdGEiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSTI2YW5kcm9pZF9zbXB0ZTIwODZfbWV0YWRhdGEiLAogICAgInNpemUiIDogNDAsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnN5c3RlbS9pbmNsdWRlL3N5c3RlbS9ncmFwaGljcy5oIgogICB9LApAQCAtMTIxNzMsOCArMTIxODcsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSTdsb2dfbXNnIiwKICAgICJuYW1lIiA6ICJsb2dfbXNnIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEk3bG9nX21zZyIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJN2xvZ19tc2ciLAogICAgInNpemUiIDogNTEyNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2xvZ2dpbmcvbGlibG9nL2luY2x1ZGVfdm5kay9sb2cvbG9nX3JlYWQuaCIKICAgfSwKQEAgLTEyMTk0LDggKzEyMjA2LDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEk4bG9nX3RpbWUiLAogICAgIm5hbWUiIDogImxvZ190aW1lIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEk4bG9nX3RpbWUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSThsb2dfdGltZSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vbG9nZ2luZy9saWJsb2cvaW5jbHVkZV92bmRrL2xvZy9sb2dfdGltZS5oIgogICB9LApAQCAtMTIyMzcsOCArMTIyNDcsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTBMb2dQcmludGVyRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6TG9nUHJpbnRlciIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxMExvZ1ByaW50ZXJFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxMExvZ1ByaW50ZXJFIiwKICAgICJzaXplIiA6IDQwLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ByaW50ZXIuaCIsCiAgICAidnRhYmxlX2NvbXBvbmVudHMiIDoKQEAgLTEyMjk4LDggKzEyMzA2LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDEwVmVjdG9ySW1wbEUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGwiLAogICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSIsCiAgICAic2l6ZSIgOiA0MCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiLAogICAgInZ0YWJsZV9jb21wb25lbnRzIiA6CkBAIC0xMjM1MSw2ICsxMjM1Nyw4NCBAQAogICAgWwogICAgIHsKICAgICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCisgICAgICJmaWVsZF9uYW1lIiA6ICJtU3RvcmFnZSIsCisgICAgICJmaWVsZF9vZmZzZXQiIDogNjQsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIKKyAgICB9LAorICAgIHsKKyAgICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCisgICAgICJmaWVsZF9uYW1lIiA6ICJtQ291bnQiLAorICAgICAiZmllbGRfb2Zmc2V0IiA6IDEyOCwKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSW0iCisgICAgfSwKKyAgICB7CisgICAgICJhY2Nlc3MiIDogInByaXZhdGUiLAorICAgICAiZmllbGRfbmFtZSIgOiAibUZsYWdzIiwKKyAgICAgImZpZWxkX29mZnNldCIgOiAxOTIsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLaiIKKyAgICB9LAorICAgIHsKKyAgICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCisgICAgICJmaWVsZF9uYW1lIiA6ICJtSXRlbVNpemUiLAorICAgICAiZmllbGRfb2Zmc2V0IiA6IDI1NiwKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUttIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxMFZlY3RvckltcGxFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsIiwKKyAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEwVmVjdG9ySW1wbEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNDAsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIsCisgICAidnRhYmxlX2NvbXBvbmVudHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJraW5kIiA6ICJvZmZzZXRfdG9fdG9wIgorICAgIH0sCisgICAgeworICAgICAia2luZCIgOiAicnR0aSIsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWlRJTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSIKKyAgICB9LAorICAgIHsKKyAgICAgImtpbmQiIDogImNvbXBsZXRlX2R0b3JfcG9pbnRlciIsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk43YW5kcm9pZDEwVmVjdG9ySW1wbEQxRXYiCisgICAgfSwKKyAgICB7CisgICAgICJraW5kIiA6ICJkZWxldGluZ19kdG9yX3BvaW50ZXIiLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pON2FuZHJvaWQxMFZlY3RvckltcGxEMEV2IgorICAgIH0sCisgICAgeworICAgICAiaXNfcHVyZSIgOiB0cnVlLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pOSzdhbmRyb2lkMTBWZWN0b3JJbXBsMTJkb19jb25zdHJ1Y3RFUHZtIgorICAgIH0sCisgICAgeworICAgICAiaXNfcHVyZSIgOiB0cnVlLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pOSzdhbmRyb2lkMTBWZWN0b3JJbXBsMTBkb19kZXN0cm95RVB2bSIKKyAgICB9LAorICAgIHsKKyAgICAgImlzX3B1cmUiIDogdHJ1ZSwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aTks3YW5kcm9pZDEwVmVjdG9ySW1wbDdkb19jb3B5RVB2UEt2bSIKKyAgICB9LAorICAgIHsKKyAgICAgImlzX3B1cmUiIDogdHJ1ZSwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aTks3YW5kcm9pZDEwVmVjdG9ySW1wbDhkb19zcGxhdEVQdlBLdm0iCisgICAgfSwKKyAgICB7CisgICAgICJpc19wdXJlIiA6IHRydWUsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk5LN2FuZHJvaWQxMFZlY3RvckltcGwxNWRvX21vdmVfZm9yd2FyZEVQdlBLdm0iCisgICAgfSwKKyAgICB7CisgICAgICJpc19wdXJlIiA6IHRydWUsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk5LN2FuZHJvaWQxMFZlY3RvckltcGwxNmRvX21vdmVfYmFja3dhcmRFUHZQS3ZtIgorICAgIH0KKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAorICAgImZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCiAgICAgICJmaWVsZF9uYW1lIiA6ICJtVGFnIiwKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSW0iCiAgICAgfQpAQCAtMTIzNTgsOCArMTI0NDIsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTFTY29wZWRUcmFjZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlNjb3BlZFRyYWNlIiwKICAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDExU2NvcGVkVHJhY2VFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxMVNjb3BlZFRyYWNlRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1RyYWNlLmgiCiAgIH0sCkBAIC0xMjM3Niw4ICsxMjQ1OCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxMkxpZ2h0UmVmQmFzZUlOU18xMk5hdGl2ZUhhbmRsZUVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6TGlnaHRSZWZCYXNlPGFuZHJvaWQ6Ok5hdGl2ZUhhbmRsZT4iLAogICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTJMaWdodFJlZkJhc2VJTlNfMTJOYXRpdmVIYW5kbGVFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEyTGlnaHRSZWZCYXNlSU5TXzEyTmF0aXZlSGFuZGxlRUVFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTGlnaHRSZWZCYXNlLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEyMzk4LDggKzEyNDc4LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDEyTGlnaHRSZWZCYXNlSU5TXzE5VmlydHVhbExpZ2h0UmVmQmFzZUVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6TGlnaHRSZWZCYXNlPGFuZHJvaWQ6OlZpcnR1YWxMaWdodFJlZkJhc2U+IiwKICAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEyTGlnaHRSZWZCYXNlSU5TXzE5VmlydHVhbExpZ2h0UmVmQmFzZUVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTJMaWdodFJlZkJhc2VJTlNfMTlWaXJ0dWFsTGlnaHRSZWZCYXNlRUVFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTGlnaHRSZWZCYXNlLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEyNDA4LDYgKzEyNDg2LDI3IEBACiAgICBdCiAgIH0sCiAgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJmaWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJhY2Nlc3MiIDogInByaXZhdGUiLAorICAgICAiZmllbGRfbmFtZSIgOiAibUNvdW50IiwKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU5TdDNfXzE2YXRvbWljSWlFRSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTJMaWdodFJlZkJhc2VJTlNfMTlWaXJ0dWFsTGlnaHRSZWZCYXNlRUVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjpMaWdodFJlZkJhc2U8YW5kcm9pZDo6VmlydHVhbExpZ2h0UmVmQmFzZT4iLAorICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTJMaWdodFJlZkJhc2VJTlNfMTlWaXJ0dWFsTGlnaHRSZWZCYXNlRUVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL0xpZ2h0UmVmQmFzZS5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVElON2FuZHJvaWQxOVZpcnR1YWxMaWdodFJlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgorICAgXQorICB9LAorICB7CiAgICAiYWxpZ25tZW50IiA6IDgsCiAgICAiYmFzZV9zcGVjaWZpZXJzIiA6CiAgICBbCkBAIC0xMjQzMyw4ICsxMjUzMiw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxMk5hdGl2ZUhhbmRsZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6Ok5hdGl2ZUhhbmRsZSIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxMk5hdGl2ZUhhbmRsZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEyTmF0aXZlSGFuZGxlRSIsCiAgICAic2l6ZSIgOiAyNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9OYXRpdmVIYW5kbGUuaCIKICAgfSwKQEAgLTEyNDY0LDggKzEyNTYxLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDEzUHJlZml4UHJpbnRlckUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlByZWZpeFByaW50ZXIiLAogICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTNQcmVmaXhQcmludGVyRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTNQcmVmaXhQcmludGVyRSIsCiAgICAic2l6ZSIgOiAyNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9QcmludGVyLmgiLAogICAgInZ0YWJsZV9jb21wb25lbnRzIiA6CkBAIC0xMjQ5Nyw4ICsxMjU5Miw2IEBACiAgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxM3RyYWl0X3BvaW50ZXJJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF9wb2ludGVyPGFuZHJvaWQ6OnN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm8+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxM3RyYWl0X3BvaW50ZXJJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxM3RyYWl0X3BvaW50ZXJJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTI1MTAsOCArMTI2MDMsNiBAQAogICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTN0cmFpdF9wb2ludGVySU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfcG9pbnRlcjxhbmRyb2lkOjpMb29wZXI6Ok1lc3NhZ2VFbnZlbG9wZT4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEzdHJhaXRfcG9pbnRlcklOU182TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEzdHJhaXRfcG9pbnRlcklOU182TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMjUyMyw4ICsxMjYxNCw2IEBACiAgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxM3RyYWl0X3BvaW50ZXJJTlNfNkxvb3BlcjhSZXNwb25zZUVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfcG9pbnRlcjxhbmRyb2lkOjpMb29wZXI6OlJlc3BvbnNlPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTN0cmFpdF9wb2ludGVySU5TXzZMb29wZXI4UmVzcG9uc2VFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEzdHJhaXRfcG9pbnRlcklOU182TG9vcGVyOFJlc3BvbnNlRUVFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTI1NDQsOCArMTI2MzMsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTRMb29wZXJDYWxsYmFja0UiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6Okxvb3BlckNhbGxiYWNrIiwKICAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE0TG9vcGVyQ2FsbGJhY2tFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNExvb3BlckNhbGxiYWNrRSIsCiAgICAic2l6ZSIgOiAyNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Mb29wZXIuaCIsCiAgICAidnRhYmxlX2NvbXBvbmVudHMiIDoKQEAgLTEyNjMxLDggKzEyNzE4LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE0TWVzc2FnZUhhbmRsZXJFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpNZXNzYWdlSGFuZGxlciIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNE1lc3NhZ2VIYW5kbGVyRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTRNZXNzYWdlSGFuZGxlckUiLAogICAgInNpemUiIDogMjQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTG9vcGVyLmgiLAogICAgInZ0YWJsZV9jb21wb25lbnRzIiA6CkBAIC0xMjcxMSwxMiArMTI3OTYsMTkgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE0UmVmZXJlbmNlTW92ZXJFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpSZWZlcmVuY2VNb3ZlciIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNFJlZmVyZW5jZU1vdmVyRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTRSZWZlcmVuY2VNb3ZlckUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE0UmVmZXJlbmNlTW92ZXJFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjpSZWZlcmVuY2VNb3ZlciIsCisgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNFJlZmVyZW5jZU1vdmVyRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgIH0sCisgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKICAgICJiYXNlX3NwZWNpZmllcnMiIDoKICAgIFsKQEAgLTEyNzM2LDEwICsxMjgyOCw4IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxNFN0YXRpY1N0cmluZzE2SUxtMUVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6U3RhdGljU3RyaW5nMTY8MT4iLAogICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTRTdGF0aWNTdHJpbmcxNklMbTFFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE0U3RhdGljU3RyaW5nMTZJTG0xRUVFIiwKICAgICJzaXplIiA6IDE2LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKQEAgLTEyNzY3LDggKzEyODU3LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE0U3RyaW5nOFByaW50ZXJFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4UHJpbnRlciIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNFN0cmluZzhQcmludGVyRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTRTdHJpbmc4UHJpbnRlckUiLAogICAgInNpemUiIDogMjQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUHJpbnRlci5oIiwKICAgICJ2dGFibGVfY29tcG9uZW50cyIgOgpAQCAtMTI4MDEsOCArMTI4ODksNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTZSZWZlcmVuY2VSZW5hbWVyRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6UmVmZXJlbmNlUmVuYW1lciIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNlJlZmVyZW5jZVJlbmFtZXJFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNlJlZmVyZW5jZVJlbmFtZXJFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIiwKICAgICJ2dGFibGVfY29tcG9uZW50cyIgOgpAQCAtMTI4MjIsNiArMTI5MDgsMjkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA4LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTZSZWZlcmVuY2VSZW5hbWVyRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6UmVmZXJlbmNlUmVuYW1lciIsCisgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNlJlZmVyZW5jZVJlbmFtZXJFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDgsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIsCisgICAidnRhYmxlX2NvbXBvbmVudHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJraW5kIiA6ICJvZmZzZXRfdG9fdG9wIgorICAgIH0sCisgICAgeworICAgICAia2luZCIgOiAicnR0aSIsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWlRJTjdhbmRyb2lkMTZSZWZlcmVuY2VSZW5hbWVyRSIKKyAgICB9LAorICAgIHsKKyAgICAgImlzX3B1cmUiIDogdHJ1ZSwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aTks3YW5kcm9pZDE2UmVmZXJlbmNlUmVuYW1lcmNsRW0iCisgICAgfQorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDgsCiAgICAiYmFzZV9zcGVjaWZpZXJzIiA6CiAgICBbCiAgICAgewpAQCAtMTI4MzEsOCArMTI5NDAsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6U29ydGVkVmVjdG9ySW1wbCIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNlNvcnRlZFZlY3RvckltcGxFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNlNvcnRlZFZlY3RvckltcGxFIiwKICAgICJzaXplIiA6IDQwLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIsCiAgICAidnRhYmxlX2NvbXBvbmVudHMiIDoKQEAgLTEyODgzLDYgKzEyOTkwLDY3IEBACiAgICBdCiAgIH0sCiAgIHsKKyAgICJhbGlnbm1lbnQiIDogOCwKKyAgICJiYXNlX3NwZWNpZmllcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxMFZlY3RvckltcGxFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxNlNvcnRlZFZlY3RvckltcGxFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjpTb3J0ZWRWZWN0b3JJbXBsIiwKKyAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNDAsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIsCisgICAidnRhYmxlX2NvbXBvbmVudHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJraW5kIiA6ICJvZmZzZXRfdG9fdG9wIgorICAgIH0sCisgICAgeworICAgICAia2luZCIgOiAicnR0aSIsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWlRJTjdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsRSIKKyAgICB9LAorICAgIHsKKyAgICAgImtpbmQiIDogImNvbXBsZXRlX2R0b3JfcG9pbnRlciIsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk43YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEQxRXYiCisgICAgfSwKKyAgICB7CisgICAgICJraW5kIiA6ICJkZWxldGluZ19kdG9yX3BvaW50ZXIiLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pON2FuZHJvaWQxNlNvcnRlZFZlY3RvckltcGxEMEV2IgorICAgIH0sCisgICAgeworICAgICAiaXNfcHVyZSIgOiB0cnVlLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pOSzdhbmRyb2lkMTBWZWN0b3JJbXBsMTJkb19jb25zdHJ1Y3RFUHZtIgorICAgIH0sCisgICAgeworICAgICAiaXNfcHVyZSIgOiB0cnVlLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pOSzdhbmRyb2lkMTBWZWN0b3JJbXBsMTBkb19kZXN0cm95RVB2bSIKKyAgICB9LAorICAgIHsKKyAgICAgImlzX3B1cmUiIDogdHJ1ZSwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aTks3YW5kcm9pZDEwVmVjdG9ySW1wbDdkb19jb3B5RVB2UEt2bSIKKyAgICB9LAorICAgIHsKKyAgICAgImlzX3B1cmUiIDogdHJ1ZSwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aTks3YW5kcm9pZDEwVmVjdG9ySW1wbDhkb19zcGxhdEVQdlBLdm0iCisgICAgfSwKKyAgICB7CisgICAgICJpc19wdXJlIiA6IHRydWUsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk5LN2FuZHJvaWQxMFZlY3RvckltcGwxNWRvX21vdmVfZm9yd2FyZEVQdlBLdm0iCisgICAgfSwKKyAgICB7CisgICAgICJpc19wdXJlIiA6IHRydWUsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk5LN2FuZHJvaWQxMFZlY3RvckltcGwxNmRvX21vdmVfYmFja3dhcmRFUHZQS3ZtIgorICAgIH0sCisgICAgeworICAgICAiaXNfcHVyZSIgOiB0cnVlLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pOSzdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsMTBkb19jb21wYXJlRVBLdlMyXyIKKyAgICB9CisgICBdCisgIH0sCisgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKICAgICJiYXNlX3NwZWNpZmllcnMiIDoKICAgIFsKQEAgLTEyODkyLDggKzEzMDYwLDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxNnVzZV90cml2aWFsX21vdmVJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp1c2VfdHJpdmlhbF9tb3ZlPGFuZHJvaWQ6OnN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm8+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNnVzZV90cml2aWFsX21vdmVJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNnVzZV90cml2aWFsX21vdmVJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTI5MTEsOCArMTMwNzcsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE2dXNlX3RyaXZpYWxfbW92ZUlOU182TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnVzZV90cml2aWFsX21vdmU8YW5kcm9pZDo6TG9vcGVyOjpNZXNzYWdlRW52ZWxvcGU+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNnVzZV90cml2aWFsX21vdmVJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNnVzZV90cml2aWFsX21vdmVJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUVFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTI5MzAsOCArMTMwOTQsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE2dXNlX3RyaXZpYWxfbW92ZUlOU182TG9vcGVyOFJlc3BvbnNlRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp1c2VfdHJpdmlhbF9tb3ZlPGFuZHJvaWQ6Okxvb3Blcjo6UmVzcG9uc2U+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNnVzZV90cml2aWFsX21vdmVJTlNfNkxvb3BlcjhSZXNwb25zZUVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTZ1c2VfdHJpdmlhbF9tb3ZlSU5TXzZMb29wZXI4UmVzcG9uc2VFRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMjk1OSw4ICsxMzEyMSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOFdlYWtNZXNzYWdlSGFuZGxlckUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OldlYWtNZXNzYWdlSGFuZGxlciIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOFdlYWtNZXNzYWdlSGFuZGxlckUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4V2Vha01lc3NhZ2VIYW5kbGVyRSIsCiAgICAic2l6ZSIgOiA0MCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Mb29wZXIuaCIsCiAgICAidnRhYmxlX2NvbXBvbmVudHMiIDoKQEAgLTEzMDM3LDggKzEzMTk3LDYgQEAKICAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGFuZHJvaWQ6OnN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm8+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzMDUwLDggKzEzMjA4LDYgQEAKICAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGFuZHJvaWQ6Okxvb3Blcjo6TWVzc2FnZUVudmVsb3BlPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlOU182TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzA2Myw4ICsxMzIxOSw2IEBACiAgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlOU182TG9vcGVyOFJlc3BvbnNlRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8YW5kcm9pZDo6TG9vcGVyOjpSZXNwb25zZT4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SU5TXzZMb29wZXI4UmVzcG9uc2VFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SU5TXzZMb29wZXI4UmVzcG9uc2VFRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzA3Niw4ICsxMzIzMCw2IEBACiAgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUliRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxib29sPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJYkVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUliRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzA4NywxMCArMTMyMzksMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJYkVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8Ym9vbD4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWJFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEliIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUljRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxjaGFyPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJY0VFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUljRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzEwMCwxMCArMTMyNjIsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJY0VFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8Y2hhcj4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWNFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEljIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlkRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxkb3VibGU+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlkRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWRFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzMTEzLDEwICsxMzI4NSwyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlkRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxkb3VibGU+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlkRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJZCIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJZkVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8ZmxvYXQ+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlmRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWZFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzMTI2LDEwICsxMzMwOCwyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlmRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxmbG9hdD4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWZFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVElmIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUloRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTx1bnNpZ25lZCBjaGFyPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJaEVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUloRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzEzOSwxMCArMTMzMzEsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJaEVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dW5zaWduZWQgY2hhcj4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWhFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEloIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlpRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxpbnQ+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlpRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWlFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzMTUyLDEwICsxMzM1NCwyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlpRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxpbnQ+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlpRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJaSIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJakVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dW5zaWduZWQgaW50PiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJakVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlqRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzE2NSwxMCArMTMzNzcsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJakVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dW5zaWduZWQgaW50PiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJakVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWoiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWxFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGxvbmc+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlsRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWxFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzMTc4LDEwICsxMzQwMCwyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlsRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxsb25nPiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJbEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWwiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SW1FRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGxvbmc+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUltRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SW1FRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzMTkxLDEwICsxMzQyMywyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUltRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTx1bnNpZ25lZCBsb25nPiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJbUVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSW0iCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXNFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHNob3J0PiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJc0VFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlzRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzIwNCwxMCArMTM0NDYsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJc0VFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8c2hvcnQ+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlzRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJcyIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJdEVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dW5zaWduZWQgc2hvcnQ+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl0RUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXRFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzMjE3LDEwICsxMzQ2OSwyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl0RUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTx1bnNpZ25lZCBzaG9ydD4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXRFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEl0IgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl2RUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTx2b2lkPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJdkVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl2RUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzIzMCwxMCArMTM0OTIsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJdkVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dm9pZD4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXZFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEl2IgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl4RUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxsb25nIGxvbmc+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl4RUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXhFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzMjQzLDEwICsxMzUxNSwyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl4RUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxsb25nIGxvbmc+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl4RUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJeCIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJeUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dW5zaWduZWQgbG9uZyBsb25nPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJeUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl5RUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzI1NiwxMCArMTM1MzgsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJeUVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dW5zaWduZWQgbG9uZyBsb25nPiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJeUVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSXkiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGFuZHJvaWQ6OnN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm8+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzMjcxLDggKzEzNTYzLDYgQEAKICAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGFuZHJvaWQ6Okxvb3Blcjo6TWVzc2FnZUVudmVsb3BlPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklOU182TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzI4NCw4ICsxMzU3NCw2IEBACiAgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklOU182TG9vcGVyOFJlc3BvbnNlRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8YW5kcm9pZDo6TG9vcGVyOjpSZXNwb25zZT4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySU5TXzZMb29wZXI4UmVzcG9uc2VFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySU5TXzZMb29wZXI4UmVzcG9uc2VFRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzI5Nyw4ICsxMzU4NSw2IEBACiAgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckliRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjxib29sPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJYkVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckliRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzMwOCwxMCArMTM1OTQsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJYkVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8Ym9vbD4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWJFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEliIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckljRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxjaGFyPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJY0VFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckljRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzMyMSwxMCArMTM2MTcsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJY0VFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8Y2hhcj4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWNFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEljIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklkRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjxkb3VibGU+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklkRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWRFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzMzM0LDEwICsxMzY0MCwyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklkRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjxkb3VibGU+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklkRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJZCIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJZkVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8ZmxvYXQ+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklmRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWZFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzMzQ3LDEwICsxMzY2MywyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklmRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxmbG9hdD4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWZFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVElmIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckloRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBjaGFyPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJaEVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckloRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzM2MCwxMCArMTM2ODYsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJaEVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgY2hhcj4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWhFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEloIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklpRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxpbnQ+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklpRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWlFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzMzczLDEwICsxMzcwOSwyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklpRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxpbnQ+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklpRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJaSIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJakVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgaW50PiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJakVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklqRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzM4NiwxMCArMTM3MzIsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJakVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgaW50PiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJakVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWoiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWxFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGxvbmc+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklsRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWxFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzMzk5LDEwICsxMzc1NSwyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklsRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjxsb25nPiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJbEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWwiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySW1FRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHVuc2lnbmVkIGxvbmc+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckltRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySW1FRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzNDEyLDEwICsxMzc3OCwyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckltRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBsb25nPiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJbUVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSW0iCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXNFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHNob3J0PiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJc0VFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklzRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzQyNSwxMCArMTM4MDEsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJc0VFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8c2hvcnQ+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklzRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJcyIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJdEVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgc2hvcnQ+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl0RUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXRFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzNDM4LDEwICsxMzgyNCwyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl0RUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBzaG9ydD4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXRFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEl0IgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl2RUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx2b2lkPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJdkVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl2RUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzQ1MSwxMCArMTM4NDcsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJdkVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dm9pZD4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXZFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEl2IgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl4RUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjxsb25nIGxvbmc+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl4RUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXhFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzNDY0LDEwICsxMzg3MCwyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl4RUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjxsb25nIGxvbmc+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl4RUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJeCIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJeUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgbG9uZyBsb25nPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJeUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl5RUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzQ3NywxMCArMTM4OTMsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJeUVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgbG9uZyBsb25nPiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJeUVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSXkiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGFuZHJvaWQ6OnN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm8+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzNDkyLDggKzEzOTE4LDYgQEAKICAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGFuZHJvaWQ6Okxvb3Blcjo6TWVzc2FnZUVudmVsb3BlPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklOU182TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzUwNSw4ICsxMzkyOSw2IEBACiAgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklOU182TG9vcGVyOFJlc3BvbnNlRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8YW5kcm9pZDo6TG9vcGVyOjpSZXNwb25zZT4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySU5TXzZMb29wZXI4UmVzcG9uc2VFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySU5TXzZMb29wZXI4UmVzcG9uc2VFRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzUxOCw4ICsxMzk0MCw2IEBACiAgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckliRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxib29sPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJYkVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckliRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzUyOSwxMCArMTM5NDksMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJYkVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8Ym9vbD4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWJFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEliIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckljRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxjaGFyPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJY0VFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckljRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzU0MiwxMCArMTM5NzIsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJY0VFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8Y2hhcj4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWNFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEljIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklkRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxkb3VibGU+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklkRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWRFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzNTU1LDEwICsxMzk5NSwyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklkRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxkb3VibGU+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklkRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJZCIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJZkVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8ZmxvYXQ+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklmRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWZFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzNTY4LDEwICsxNDAxOCwyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklmRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxmbG9hdD4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWZFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVElmIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckloRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBjaGFyPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJaEVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckloRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzU4MSwxMCArMTQwNDEsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJaEVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgY2hhcj4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWhFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEloIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklpRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxpbnQ+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklpRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWlFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzNTk0LDEwICsxNDA2NCwyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklpRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxpbnQ+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklpRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJaSIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJakVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgaW50PiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJakVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklqRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzYwNywxMCArMTQwODcsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJakVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgaW50PiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJakVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWoiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWxFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGxvbmc+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklsRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWxFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzNjIwLDEwICsxNDExMCwyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklsRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxsb25nPiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJbEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWwiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySW1FRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHVuc2lnbmVkIGxvbmc+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckltRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySW1FRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzNjMzLDEwICsxNDEzMywyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckltRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBsb25nPiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJbUVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSW0iCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXNFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHNob3J0PiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJc0VFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklzRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzY0NiwxMCArMTQxNTYsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJc0VFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8c2hvcnQ+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklzRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJcyIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJdEVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgc2hvcnQ+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl0RUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXRFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzNjU5LDEwICsxNDE3OSwyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl0RUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBzaG9ydD4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXRFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEl0IgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl2RUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx2b2lkPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJdkVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl2RUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzY3MiwxMCArMTQyMDIsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJdkVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dm9pZD4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXZFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEl2IgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl4RUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxsb25nIGxvbmc+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl4RUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXhFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzNjg1LDEwICsxNDIyNSwyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl4RUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxsb25nIGxvbmc+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl4RUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJeCIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJeUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgbG9uZyBsb25nPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJeUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl5RUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzY5OCwxMCArMTQyNDgsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJeUVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgbG9uZyBsb25nPiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJeUVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSXkiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGFuZHJvaWQ6OnN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm8+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzNzEzLDggKzE0MjczLDYgQEAKICAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGFuZHJvaWQ6Okxvb3Blcjo6TWVzc2FnZUVudmVsb3BlPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlOU182TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzcyNiw4ICsxNDI4NCw2IEBACiAgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlOU182TG9vcGVyOFJlc3BvbnNlRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8YW5kcm9pZDo6TG9vcGVyOjpSZXNwb25zZT4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSU5TXzZMb29wZXI4UmVzcG9uc2VFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSU5TXzZMb29wZXI4UmVzcG9uc2VFRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzczOSw4ICsxNDI5NSw2IEBACiAgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlOU183U3RyaW5nOEVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGFuZHJvaWQ6OlN0cmluZzg+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlOU183U3RyaW5nOEVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfN1N0cmluZzhFRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzNzUwLDEyICsxNDMwNCwyMiBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlOU183U3RyaW5nOEVFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGFuZHJvaWQ6OlN0cmluZzg+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlOU183U3RyaW5nOEVFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfOFN0cmluZzE2RUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8YW5kcm9pZDo6U3RyaW5nMTY+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlOU184U3RyaW5nMTZFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSU5TXzhTdHJpbmcxNkVFRSIsCiAgICAic2l6ZSIgOiAxLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CiAgICBbCiAgICAgIl9aVElON2FuZHJvaWQ4U3RyaW5nMTZFIgpAQCAtMTM3NjUsOCArMTQzMjksNiBAQAogICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJYkVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8Ym9vbD4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWJFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJYkVFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTM3NzYsMTAgKzE0MzM4LDIwIEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWJFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGJvb2w+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUliRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJYiIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJY0VFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8Y2hhcj4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWNFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJY0VFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTM3ODksMTAgKzE0MzYxLDIwIEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWNFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGNoYXI+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUljRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJYyIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJZEVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8ZG91YmxlPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJZEVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlkRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzgwMiwxMCArMTQzODQsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJZEVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8ZG91YmxlPiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJZEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWQiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWZFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGZsb2F0PiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJZkVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlmRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzgxNSwxMCArMTQ0MDcsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJZkVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8ZmxvYXQ+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlmRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJZiIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJaEVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8dW5zaWduZWQgY2hhcj4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWhFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJaEVFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTM4MjgsMTAgKzE0NDMwLDIwIEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWhFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHVuc2lnbmVkIGNoYXI+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUloRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJaCIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJaUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8aW50PiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJaUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlpRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzg0MSwxMCArMTQ0NTMsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJaUVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8aW50PiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJaUVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWkiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWpFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHVuc2lnbmVkIGludD4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWpFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJakVFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTM4NTQsMTAgKzE0NDc2LDIwIEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWpFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHVuc2lnbmVkIGludD4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWpFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVElqIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlsRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxsb25nPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJbEVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlsRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzg2NywxMCArMTQ0OTksMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJbEVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8bG9uZz4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWxFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVElsIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUltRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBsb25nPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJbUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUltRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzg4MCwxMCArMTQ1MjIsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJbUVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8dW5zaWduZWQgbG9uZz4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSW1FRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEltIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlzRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxzaG9ydD4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXNFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJc0VFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTM4OTMsMTAgKzE0NTQ1LDIwIEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXNFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHNob3J0PiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJc0VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSXMiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXRFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHVuc2lnbmVkIHNob3J0PiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJdEVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl0RUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzkwNiwxMCArMTQ1NjgsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJdEVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8dW5zaWduZWQgc2hvcnQ+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl0RUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJdCIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJdkVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8dm9pZD4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXZFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJdkVFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTM5MTksMTAgKzE0NTkxLDIwIEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXZFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHZvaWQ+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl2RUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJdiIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJeEVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8bG9uZyBsb25nPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJeEVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl4RUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzkzMiwxMCArMTQ2MTQsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJeEVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8bG9uZyBsb25nPiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJeEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSXgiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXlFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHVuc2lnbmVkIGxvbmcgbG9uZz4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXlFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJeUVFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTM5NDQsNiArMTQ2MzYsMTggQEAKICAgIF0KICAgfSwKICAgeworICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJeUVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8dW5zaWduZWQgbG9uZyBsb25nPiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJeUVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSXkiCisgICBdCisgIH0sCisgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKICAgICJiYXNlX3NwZWNpZmllcnMiIDoKICAgIFsKQEAgLTEzOTU0LDggKzE0NjU4LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE5VmlydHVhbExpZ2h0UmVmQmFzZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlZpcnR1YWxMaWdodFJlZkJhc2UiLAogICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTlWaXJ0dWFsTGlnaHRSZWZCYXNlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTlWaXJ0dWFsTGlnaHRSZWZCYXNlRSIsCiAgICAic2l6ZSIgOiAxNiwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9MaWdodFJlZkJhc2UuaCIsCiAgICAidnRhYmxlX2NvbXBvbmVudHMiIDoKQEAgLTEzOTgyLDYgKzE0Njg0LDM5IEBACiAgICAiYmFzZV9zcGVjaWZpZXJzIiA6CiAgICBbCiAgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTJMaWdodFJlZkJhc2VJTlNfMTlWaXJ0dWFsTGlnaHRSZWZCYXNlRUVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm02NF9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOVZpcnR1YWxMaWdodFJlZkJhc2VFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjpWaXJ0dWFsTGlnaHRSZWZCYXNlIiwKKyAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE5VmlydHVhbExpZ2h0UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMTYsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL0xpZ2h0UmVmQmFzZS5oIiwKKyAgICJ2dGFibGVfY29tcG9uZW50cyIgOgorICAgWworICAgIHsKKyAgICAgImtpbmQiIDogIm9mZnNldF90b190b3AiCisgICAgfSwKKyAgICB7CisgICAgICJraW5kIiA6ICJydHRpIiwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aVElON2FuZHJvaWQxOVZpcnR1YWxMaWdodFJlZkJhc2VFIgorICAgIH0sCisgICAgeworICAgICAia2luZCIgOiAiY29tcGxldGVfZHRvcl9wb2ludGVyIiwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aTjdhbmRyb2lkMTlWaXJ0dWFsTGlnaHRSZWZCYXNlRDFFdiIKKyAgICB9LAorICAgIHsKKyAgICAgImtpbmQiIDogImRlbGV0aW5nX2R0b3JfcG9pbnRlciIsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk43YW5kcm9pZDE5VmlydHVhbExpZ2h0UmVmQmFzZUQwRXYiCisgICAgfQorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDgsCisgICAiYmFzZV9zcGVjaWZpZXJzIiA6CisgICBbCisgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTRMb29wZXJDYWxsYmFja0UiCiAgICAgfQogICAgXSwKQEAgLTEzOTk3LDggKzE0NzMyLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDIwU2ltcGxlTG9vcGVyQ2FsbGJhY2tFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpTaW1wbGVMb29wZXJDYWxsYmFjayIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQyMFNpbXBsZUxvb3BlckNhbGxiYWNrRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMjBTaW1wbGVMb29wZXJDYWxsYmFja0UiLAogICAgInNpemUiIDogMzIsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTG9vcGVyLmgiLAogICAgInZ0YWJsZV9jb21wb25lbnRzIiA6CkBAIC0xNDA4NCw4ICsxNDgxNyw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQyc3BJTlNfMTJOYXRpdmVIYW5kbGVFRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnNwPGFuZHJvaWQ6Ok5hdGl2ZUhhbmRsZT4iLAogICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMnNwSU5TXzEyTmF0aXZlSGFuZGxlRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQyc3BJTlNfMTJOYXRpdmVIYW5kbGVFRUUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTE0MTA2LDggKzE0ODM3LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDJzcElOU18xNExvb3BlckNhbGxiYWNrRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpzcDxhbmRyb2lkOjpMb29wZXJDYWxsYmFjaz4iLAogICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMnNwSU5TXzE0TG9vcGVyQ2FsbGJhY2tFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDJzcElOU18xNExvb3BlckNhbGxiYWNrRUVFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xNDEyOCw4ICsxNDg1Nyw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQyc3BJTlNfMTRNZXNzYWdlSGFuZGxlckVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6c3A8YW5kcm9pZDo6TWVzc2FnZUhhbmRsZXI+IiwKICAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDJzcElOU18xNE1lc3NhZ2VIYW5kbGVyRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQyc3BJTlNfMTRNZXNzYWdlSGFuZGxlckVFRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTQxNTAsOCArMTQ4NzcsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMnNwSU5TXzIwU2ltcGxlTG9vcGVyQ2FsbGJhY2tFRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnNwPGFuZHJvaWQ6OlNpbXBsZUxvb3BlckNhbGxiYWNrPiIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQyc3BJTlNfMjBTaW1wbGVMb29wZXJDYWxsYmFja0VFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMnNwSU5TXzIwU2ltcGxlTG9vcGVyQ2FsbGJhY2tFRUUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTE0MTcyLDggKzE0ODk3LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDJzcElOU182TG9vcGVyRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpzcDxhbmRyb2lkOjpMb29wZXI+IiwKICAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDJzcElOU182TG9vcGVyRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQyc3BJTlNfNkxvb3BlckVFRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTQxOTQsOCArMTQ5MTcsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMnNwSU5TXzZUaHJlYWRFRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnNwPGFuZHJvaWQ6OlRocmVhZD4iLAogICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMnNwSU5TXzZUaHJlYWRFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDJzcElOU182VGhyZWFkRUVFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xNDIyMiw4ICsxNDk0Myw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQyd3BJTlNfMTRNZXNzYWdlSGFuZGxlckVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6d3A8YW5kcm9pZDo6TWVzc2FnZUhhbmRsZXI+IiwKICAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDJ3cElOU18xNE1lc3NhZ2VIYW5kbGVyRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQyd3BJTlNfMTRNZXNzYWdlSGFuZGxlckVFRSIsCiAgICAic2l6ZSIgOiAxNiwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTE0MjUwLDggKzE0OTY5LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDJ3cElOU182VGhyZWFkRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp3cDxhbmRyb2lkOjpUaHJlYWQ+IiwKICAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDJ3cElOU182VGhyZWFkRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQyd3BJTlNfNlRocmVhZEVFRSIsCiAgICAic2l6ZSIgOiAxNiwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTE0MjcxLDggKzE0OTg4LDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ0YmFzZTExYm9ycm93ZWRfZmRFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNGJhc2UxMWJvcnJvd2VkX2ZkRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNGJhc2UxMWJvcnJvd2VkX2ZkRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vbGliYmFzZS9pbmNsdWRlL2FuZHJvaWQtYmFzZS91bmlxdWVfZmQuaCIKICAgfSwKQEAgLTE0MjgwLDggKzE0OTk1LDYgQEAKICAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDRiYXNlMTNEZWZhdWx0Q2xvc2VyRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6YmFzZTo6RGVmYXVsdENsb3NlciIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNGJhc2UxM0RlZmF1bHRDbG9zZXJFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ0YmFzZTEzRGVmYXVsdENsb3NlckUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2xpYmJhc2UvaW5jbHVkZS9hbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmgiCiAgIH0sCkBAIC0xNDI5OCw4ICsxNTAxMSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ0YmFzZTE0dW5pcXVlX2ZkX2ltcGxJTlMwXzEzRGVmYXVsdENsb3NlckVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkX2ltcGw8YW5kcm9pZDo6YmFzZTo6RGVmYXVsdENsb3Nlcj4iLAogICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNGJhc2UxNHVuaXF1ZV9mZF9pbXBsSU5TMF8xM0RlZmF1bHRDbG9zZXJFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDRiYXNlMTR1bmlxdWVfZmRfaW1wbElOUzBfMTNEZWZhdWx0Q2xvc2VyRUVFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9saWJiYXNlL2luY2x1ZGUvYW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xNDMyMCw4ICsxNTAzMSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ1TXV0ZXg4QXV0b2xvY2tFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpNdXRleDo6QXV0b2xvY2siLAogICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNU11dGV4OEF1dG9sb2NrRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNU11dGV4OEF1dG9sb2NrRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL011dGV4LmgiCiAgIH0sCkBAIC0xNDMzOCw4ICsxNTA0Nyw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ1TXV0ZXhFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpNdXRleCIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ1TXV0ZXhFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ1TXV0ZXhFIiwKICAgICJzaXplIiA6IDQwLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL011dGV4LmgiCiAgIH0sCkBAIC0xNDM2NSw4ICsxNTA3Miw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6TG9vcGVyOjpNZXNzYWdlRW52ZWxvcGUiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUUiLAogICAgInNpemUiIDogMjQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTG9vcGVyLmgiCiAgIH0sCkBAIC0xNDQwMiw4ICsxNTEwNyw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkNkxvb3BlcjdSZXF1ZXN0RSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6TG9vcGVyOjpSZXF1ZXN0IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2TG9vcGVyN1JlcXVlc3RFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2TG9vcGVyN1JlcXVlc3RFIiwKICAgICJzaXplIiA6IDMyLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0xvb3Blci5oIgogICB9LApAQCAtMTQ0MjksOCArMTUxMzIsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDZMb29wZXI4UmVzcG9uc2VFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpMb29wZXI6OlJlc3BvbnNlIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2TG9vcGVyOFJlc3BvbnNlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNkxvb3BlcjhSZXNwb25zZUUiLAogICAgInNpemUiIDogNDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTG9vcGVyLmgiCiAgIH0sCkBAIC0xNDUzMiw4ICsxNTIzMyw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ2TG9vcGVyRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6TG9vcGVyIiwKICAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZMb29wZXJFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2TG9vcGVyRSIsCiAgICAic2l6ZSIgOiAyNjQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTG9vcGVyLmgiLAogICAgInZ0YWJsZV9jb21wb25lbnRzIiA6CkBAIC0xNDU4MCw4ICsxNTI3OSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ2UldMb2NrOUF1dG9STG9ja0UiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlJXTG9jazo6QXV0b1JMb2NrIiwKICAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZSV0xvY2s5QXV0b1JMb2NrRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNlJXTG9jazlBdXRvUkxvY2tFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUldMb2NrLmgiCiAgIH0sCkBAIC0xNDU5OCw4ICsxNTI5NSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ2UldMb2NrOUF1dG9XTG9ja0UiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlJXTG9jazo6QXV0b1dMb2NrIiwKICAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZSV0xvY2s5QXV0b1dMb2NrRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNlJXTG9jazlBdXRvV0xvY2tFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUldMb2NrLmgiCiAgIH0sCkBAIC0xNDYxNiw4ICsxNTMxMSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ2UldMb2NrRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6UldMb2NrIiwKICAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZSV0xvY2tFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2UldMb2NrRSIsCiAgICAic2l6ZSIgOiA1NiwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SV0xvY2suaCIKICAgfSwKQEAgLTE0NjkwLDggKzE1MzgzLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDZUaHJlYWRFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpUaHJlYWQiLAogICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNlRocmVhZEUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZUaHJlYWRFIiwKICAgICJzaXplIiA6IDE1MiwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UaHJlYWQuaCIsCiAgICAidnRhYmxlX2NvbXBvbmVudHMiIDoKQEAgLTE0Nzg2LDggKzE1NDc3LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDZWZWN0b3JJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3I8YW5kcm9pZDo6c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mbz4iLAogICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNlZlY3RvcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZWZWN0b3JJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKICAgICJzaXplIiA6IDQwLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xNDg0Myw4ICsxNTUzMiw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ2VmVjdG9ySU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9yPGFuZHJvaWQ6Okxvb3Blcjo6TWVzc2FnZUVudmVsb3BlPiIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2VmVjdG9ySU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNlZlY3RvcklOU182TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFRUUiLAogICAgInNpemUiIDogNDAsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTE0OTAwLDggKzE1NTg3LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDZWZWN0b3JJTlNfNkxvb3BlcjhSZXNwb25zZUVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9yPGFuZHJvaWQ6Okxvb3Blcjo6UmVzcG9uc2U+IiwKICAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZWZWN0b3JJTlNfNkxvb3BlcjhSZXNwb25zZUVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNlZlY3RvcklOU182TG9vcGVyOFJlc3BvbnNlRUVFIiwKICAgICJzaXplIiA6IDQwLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xNDk1MSwxOSArMTU2MzYsMTcgQEAKICAgIFsKICAgICB7CiAgICAgICJhY2Nlc3MiIDogInByaXZhdGUiLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEwVmVjdG9ySW1wbEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDZWZWN0b3JJTlNfN1N0cmluZzhFRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlZlY3RvcjxhbmRyb2lkOjpTdHJpbmc4PiIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2VmVjdG9ySU5TXzdTdHJpbmc4RUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2VmVjdG9ySU5TXzdTdHJpbmc4RUVFIiwKICAgICJzaXplIiA6IDQwLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKICAgIFsKLSAgICAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgIF0sCiAgICAidnRhYmxlX2NvbXBvbmVudHMiIDoKICAgIFsKQEAgLTE1MDA2LDggKzE1Njg5LDYgQEAKICAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDZ0cmFpdHNJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdHM8YW5kcm9pZDo6c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mbz4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZ0cmFpdHNJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2dHJhaXRzSU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTE1MDE5LDggKzE1NzAwLDYgQEAKICAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDZ0cmFpdHNJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdHM8YW5kcm9pZDo6TG9vcGVyOjpNZXNzYWdlRW52ZWxvcGU+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2dHJhaXRzSU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNnRyYWl0c0lOU182TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xNTAzMiw4ICsxNTcxMSw2IEBACiAgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ2dHJhaXRzSU5TXzZMb29wZXI4UmVzcG9uc2VFRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0czxhbmRyb2lkOjpMb29wZXI6OlJlc3BvbnNlPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNnRyYWl0c0lOU182TG9vcGVyOFJlc3BvbnNlRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2dHJhaXRzSU5TXzZMb29wZXI4UmVzcG9uc2VFRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xNTA4NCw4ICsxNTc2MSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ3RmlsZU1hcEUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OkZpbGVNYXAiLAogICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN0ZpbGVNYXBFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3RmlsZU1hcEUiLAogICAgInNpemUiIDogNDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvRmlsZU1hcC5oIgogICB9LApAQCAtMTUxMDAsOCArMTU3NzUsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDdNZXNzYWdlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6TWVzc2FnZSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN01lc3NhZ2VFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3TWVzc2FnZUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Mb29wZXIuaCIKICAgfSwKQEAgLTE1MTEwLDggKzE1NzgzLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDdQcmludGVyRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6UHJpbnRlciIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3UHJpbnRlckUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdQcmludGVyRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ByaW50ZXIuaCIsCiAgICAidnRhYmxlX2NvbXBvbmVudHMiIDoKQEAgLTE1MTQ1LDEyICsxNTgxNiwxOSBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6OndlYWtyZWZfdHlwZSIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlOjp3ZWFrcmVmX3R5cGUiLAorICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybTY0X2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICB9LAorICB7CiAgICAiYWxpZ25tZW50IiA6IDgsCiAgICAiZmllbGRzIiA6CiAgICBbCkBAIC0xNTE2NCw4ICsxNTg0Miw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2UiLAogICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2VFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZUUiLAogICAgInNpemUiIDogMTYsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIiwKICAgICJ2dGFibGVfY29tcG9uZW50cyIgOgpAQCAtMTUyMDUsNiArMTU4ODEsNTQgQEAKICAgIFsKICAgICB7CiAgICAgICJhY2Nlc3MiIDogInByaXZhdGUiLAorICAgICAiZmllbGRfbmFtZSIgOiAibVJlZnMiLAorICAgICAiZmllbGRfb2Zmc2V0IiA6IDY0LAorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS1BON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl9pbXBsRSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2VFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlIiwKKyAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxNiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIiwKKyAgICJ2dGFibGVfY29tcG9uZW50cyIgOgorICAgWworICAgIHsKKyAgICAgImtpbmQiIDogIm9mZnNldF90b190b3AiCisgICAgfSwKKyAgICB7CisgICAgICJraW5kIiA6ICJydHRpIiwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZUUiCisgICAgfSwKKyAgICB7CisgICAgICJraW5kIiA6ICJjb21wbGV0ZV9kdG9yX3BvaW50ZXIiLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pON2FuZHJvaWQ3UmVmQmFzZUQxRXYiCisgICAgfSwKKyAgICB7CisgICAgICJraW5kIiA6ICJkZWxldGluZ19kdG9yX3BvaW50ZXIiLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pON2FuZHJvaWQ3UmVmQmFzZUQwRXYiCisgICAgfSwKKyAgICB7CisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk43YW5kcm9pZDdSZWZCYXNlMTBvbkZpcnN0UmVmRXYiCisgICAgfSwKKyAgICB7CisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk43YW5kcm9pZDdSZWZCYXNlMTVvbkxhc3RTdHJvbmdSZWZFUEt2IgorICAgIH0sCisgICAgeworICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pON2FuZHJvaWQ3UmVmQmFzZTIwb25JbmNTdHJvbmdBdHRlbXB0ZWRFalBLdiIKKyAgICB9LAorICAgIHsKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aTjdhbmRyb2lkN1JlZkJhc2UxM29uTGFzdFdlYWtSZWZFUEt2IgorICAgIH0KKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA4LAorICAgImZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCiAgICAgICJmaWVsZF9uYW1lIiA6ICJtU3RyaW5nIiwKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKICAgICB9CkBAIC0xNTIxMiwxMiArMTU5MzYsMjcgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nOCIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3U3RyaW5nOEUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgeworICAgImFsaWdubWVudCIgOiA4LAorICAgImZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCisgICAgICJmaWVsZF9uYW1lIiA6ICJtU3RyaW5nIiwKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkN1N0cmluZzhFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4IiwKKyAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtNjRfYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA4LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgIH0sCisgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKICAgICJmaWVsZHMiIDoKICAgIFsKQEAgLTE1MjMzLDEwICsxNTk3Miw4IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkOFN0cmluZzE2MTBTdGF0aWNEYXRhSUxtMUVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OlN0YXRpY0RhdGE8MT4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDhTdHJpbmcxNjEwU3RhdGljRGF0YUlMbTFFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDhTdHJpbmcxNjEwU3RhdGljRGF0YUlMbTFFRUUiLAogICAgInNpemUiIDogOCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDgsCkBAIC0xNTI1MSwzNyArMTU5ODgsOCBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkOFN0cmluZzE2RSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTYiLAogICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkOFN0cmluZzE2RSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkOFN0cmluZzE2RSIsCiAgICAic2l6ZSIgOiA4LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCi0gIH0sCi0gIHsKLSAgICJhbGlnbm1lbnQiIDogMSwKLSAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDlDYWxsU3RhY2sxMlN0YWNrRGVsZXRlckUiLAotICAgIm5hbWUiIDogImFuZHJvaWQ6OkNhbGxTdGFjazo6U3RhY2tEZWxldGVyIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ5Q2FsbFN0YWNrMTJTdGFja0RlbGV0ZXJFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ5Q2FsbFN0YWNrMTJTdGFja0RlbGV0ZXJFIiwKLSAgICJzaXplIiA6IDEsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvQ2FsbFN0YWNrLmgiCi0gIH0sCi0gIHsKLSAgICJhbGlnbm1lbnQiIDogOCwKLSAgICJmaWVsZHMiIDoKLSAgIFsKLSAgICB7Ci0gICAgICJhY2Nlc3MiIDogInByaXZhdGUiLAotICAgICAiZmllbGRfbmFtZSIgOiAibUZyYW1lTGluZXMiLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNlZlY3RvcklOU183U3RyaW5nOEVFRSIKLSAgICB9Ci0gICBdLAotICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkOUNhbGxTdGFja0UiLAotICAgIm5hbWUiIDogImFuZHJvaWQ6OkNhbGxTdGFjayIsCi0gICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ5Q2FsbFN0YWNrRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkOUNhbGxTdGFja0UiLAotICAgInNpemUiIDogNDAsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvQ2FsbFN0YWNrLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKQEAgLTE1Mjk2LDggKzE2MDA0LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDlDb25kaXRpb25FIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpDb25kaXRpb24iLAogICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkOUNvbmRpdGlvbkUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDlDb25kaXRpb25FIiwKICAgICJzaXplIiA6IDQ4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0NvbmRpdGlvbi5oIgogICB9LApAQCAtMTUzMzksOCArMTYwNDUsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkOUZkUHJpbnRlckUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OkZkUHJpbnRlciIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ5RmRQcmludGVyRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkOUZkUHJpbnRlckUiLAogICAgInNpemUiIDogNDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUHJpbnRlci5oIiwKICAgICJ2dGFibGVfY29tcG9uZW50cyIgOgpAQCAtMTUzOTMsOCArMTYwOTcsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkOVN0b3BXYXRjaEUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlN0b3BXYXRjaCIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ5U3RvcFdhdGNoRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkOVN0b3BXYXRjaEUiLAogICAgInNpemUiIDogMjQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RvcFdhdGNoLmgiCiAgIH0sCkBAIC0xNTQ0Nyw4ICsxNjE0OSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ5VG9rZW5pemVyRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6VG9rZW5pemVyIiwKICAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDlUb2tlbml6ZXJFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ5VG9rZW5pemVyRSIsCiAgICAic2l6ZSIgOiA1NiwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Ub2tlbml6ZXIuaCIKICAgfSwKQEAgLTE1NDY5LDggKzE2MTY5LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43bG9nX21zZ1V0X0UiLAogICAgIm5hbWUiIDogImxvZ19tc2c6Oihhbm9ueW1vdXMpIiwKICAgICJyZWNvcmRfa2luZCIgOiAidW5pb24iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43bG9nX21zZ1V0X0UiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43bG9nX21zZ1V0X0UiLAogICAgInNpemUiIDogNTEyNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2xvZ2dpbmcvbGlibG9nL2luY2x1ZGVfdm5kay9sb2cvbG9nX3JlYWQuaCIKICAgfQpAQCAtMTU0ODIsNyArMTYxODAsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJT043YW5kcm9pZDJzcElOU18xMk5hdGl2ZUhhbmRsZUVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6c3A8YW5kcm9pZDo6TmF0aXZlSGFuZGxlPiAmJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMnNwSU5TXzEyTmF0aXZlSGFuZGxlRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElPTjdhbmRyb2lkMnNwSU5TXzEyTmF0aXZlSGFuZGxlRUVFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgogICB9LApAQCAtMTU0OTEsNyArMTYxODgsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJT043YW5kcm9pZDJzcElOU18xNE1lc3NhZ2VIYW5kbGVyRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpzcDxhbmRyb2lkOjpNZXNzYWdlSGFuZGxlcj4gJiYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDJzcElOU18xNE1lc3NhZ2VIYW5kbGVyRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElPTjdhbmRyb2lkMnNwSU5TXzE0TWVzc2FnZUhhbmRsZXJFRUUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiCiAgIH0sCkBAIC0xNTUwMCw3ICsxNjE5Niw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElPTjdhbmRyb2lkMnNwSU5TXzIwU2ltcGxlTG9vcGVyQ2FsbGJhY2tFRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnNwPGFuZHJvaWQ6OlNpbXBsZUxvb3BlckNhbGxiYWNrPiAmJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMnNwSU5TXzIwU2ltcGxlTG9vcGVyQ2FsbGJhY2tFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU9ON2FuZHJvaWQyc3BJTlNfMjBTaW1wbGVMb29wZXJDYWxsYmFja0VFRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaCIKICAgfSwKQEAgLTE1NTA5LDcgKzE2MjA0LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU9ON2FuZHJvaWQyc3BJTlNfNkxvb3BlckVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6c3A8YW5kcm9pZDo6TG9vcGVyPiAmJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMnNwSU5TXzZMb29wZXJFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU9ON2FuZHJvaWQyc3BJTlNfNkxvb3BlckVFRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaCIKICAgfSwKQEAgLTE1NTE4LDcgKzE2MjEyLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU9ON2FuZHJvaWQyc3BJTlNfNlRocmVhZEVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6c3A8YW5kcm9pZDo6VGhyZWFkPiAmJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMnNwSU5TXzZUaHJlYWRFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU9ON2FuZHJvaWQyc3BJTlNfNlRocmVhZEVFRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaCIKICAgfSwKQEAgLTE1NTI3LDcgKzE2MjIwLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU9ON2FuZHJvaWQ0YmFzZTE0dW5pcXVlX2ZkX2ltcGxJTlMwXzEzRGVmYXVsdENsb3NlckVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkX2ltcGw8YW5kcm9pZDo6YmFzZTo6RGVmYXVsdENsb3Nlcj4gJiYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDRiYXNlMTR1bmlxdWVfZmRfaW1wbElOUzBfMTNEZWZhdWx0Q2xvc2VyRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElPTjdhbmRyb2lkNGJhc2UxNHVuaXF1ZV9mZF9pbXBsSU5TMF8xM0RlZmF1bHRDbG9zZXJFRUUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2xpYmJhc2UvaW5jbHVkZS9hbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmgiCiAgIH0sCkBAIC0xNTUzNiw3ICsxNjIyOCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElPTjdhbmRyb2lkN0ZpbGVNYXBFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpGaWxlTWFwICYmIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3RmlsZU1hcEUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU9ON2FuZHJvaWQ3RmlsZU1hcEUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9GaWxlTWFwLmgiCiAgIH0sCkBAIC0xNTU0NSw5ICsxNjIzNiw4IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElPTjdhbmRyb2lkOFN0cmluZzE2RSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTYgJiYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDhTdHJpbmcxNkUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU9ON2FuZHJvaWQ4U3RyaW5nMTZFIiwKICAgICJzaXplIiA6IDgsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfQogIF0KIH0KZGlmZiAtLWdpdCBhL2xpYnV0aWxzL2FiaS1kdW1wcy9hcm1fYXJtNjQvc291cmNlLWJhc2VkL2xpYnV0aWxzLnNvLmxzZHVtcCBiL2xpYnV0aWxzL2FiaS1kdW1wcy9hcm1fYXJtNjQvc291cmNlLWJhc2VkL2xpYnV0aWxzLnNvLmxzZHVtcAppbmRleCBmODhkYTE1Li41ZTQ5ODU2IDEwMDY0NAotLS0gYS9saWJ1dGlscy9hYmktZHVtcHMvYXJtX2FybTY0L3NvdXJjZS1iYXNlZC9saWJ1dGlscy5zby5sc2R1bXAKKysrIGIvbGlidXRpbHMvYWJpLWR1bXBzL2FybV9hcm02NC9zb3VyY2UtYmFzZWQvbGlidXRpbHMuc28ubHNkdW1wCkBAIC02LDcgKzYsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJQTBfaSIsCiAgICAibmFtZSIgOiAiaW50WzBdIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElBMF9pIiwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGVfb3V0c2lkZV9zeXN0ZW0vY3V0aWxzL25hdGl2ZV9oYW5kbGUuaCIKICAgfSwKICAgewpAQCAtMTQsMTYgKzEzLDE0IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElBMV9EcyIsCiAgICAibmFtZSIgOiAiY2hhcjE2X3RbMV0iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSURzIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElBMV9EcyIsCiAgICAic2l6ZSIgOiAyLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUEyMF9jIiwKICAgICJuYW1lIiA6ICJjaGFyWzIwXSIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJYyIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJQTIwX2MiLAogICAgInNpemUiIDogMjAsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUHJpbnRlci5oIgogICB9LApAQCAtMzIsNyArMjksNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJQTUxMjFfaCIsCiAgICAibmFtZSIgOiAidW5zaWduZWQgY2hhcls1MTIxXSIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaCIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJQTUxMjFfaCIsCiAgICAic2l6ZSIgOiA1MTIxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vbG9nZ2luZy9saWJsb2cvaW5jbHVkZV92bmRrL2xvZy9sb2dfcmVhZC5oIgogICB9LApAQCAtNDEsMTUgKzM3LDE0IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElBOF9qIiwKICAgICJuYW1lIiA6ICJ1bnNpZ25lZCBpbnRbOF0iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUE4X2oiLAogICAgInNpemUiIDogMzIsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnN5c3RlbS9pbmNsdWRlL3N5c3RlbS9ncmFwaGljcy5oIgogICB9LAogICB7CisgICAiaXNfb2ZfdW5rbm93bl9ib3VuZCIgOiB0cnVlLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJQV9mIiwKICAgICJuYW1lIiA6ICJmbG9hdFtdIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElmIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElBX2YiLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJzeXN0ZW0vaW5jbHVkZS9zeXN0ZW0vZ3JhcGhpY3MuaCIKICAgfQogIF0sCkBAIC02MSwxNiArNTYsMTIgQEAKICAgICJpc191bnNpZ25lZCIgOiB0cnVlLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJRGkiLAogICAgIm5hbWUiIDogImNoYXIzMl90IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElEaSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJRGkiLAogICAgInNpemUiIDogNAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElEbiIsCiAgICAibmFtZSIgOiAic3RkOjpudWxscHRyX3QiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSURuIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElEbiIsCiAgICAic2l6ZSIgOiA0CiAgIH0sCiAgIHsKQEAgLTc5LDggKzcwLDYgQEAKICAgICJpc191bnNpZ25lZCIgOiB0cnVlLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJRHMiLAogICAgIm5hbWUiIDogImNoYXIxNl90IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElEcyIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJRHMiLAogICAgInNpemUiIDogMgogICB9LAogICB7CkBAIC04OCw4ICs3Nyw2IEBACiAgICAiaXNfaW50ZWdyYWwiIDogdHJ1ZSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSWEiLAogICAgIm5hbWUiIDogInNpZ25lZCBjaGFyIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElhIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElhIiwKICAgICJzaXplIiA6IDEKICAgfSwKICAgewpAQCAtOTgsOCArODUsNiBAQAogICAgImlzX3Vuc2lnbmVkIiA6IHRydWUsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEliIiwKICAgICJuYW1lIiA6ICJib29sIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEliIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVEliIiwKICAgICJzaXplIiA6IDEKICAgfSwKICAgewpAQCAtMTA4LDI0ICs5MywxOCBAQAogICAgImlzX3Vuc2lnbmVkIiA6IHRydWUsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEljIiwKICAgICJuYW1lIiA6ICJjaGFyIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEljIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVEljIiwKICAgICJzaXplIiA6IDEKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA4LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJZCIsCiAgICAibmFtZSIgOiAiZG91YmxlIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElkIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElkIiwKICAgICJzaXplIiA6IDgKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJZiIsCiAgICAibmFtZSIgOiAiZmxvYXQiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWYiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSWYiLAogICAgInNpemUiIDogNAogICB9LAogICB7CkBAIC0xMzQsOCArMTEzLDYgQEAKICAgICJpc191bnNpZ25lZCIgOiB0cnVlLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJaCIsCiAgICAibmFtZSIgOiAidW5zaWduZWQgY2hhciIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaCIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJaCIsCiAgICAic2l6ZSIgOiAxCiAgIH0sCiAgIHsKQEAgLTE0Myw4ICsxMjAsNiBAQAogICAgImlzX2ludGVncmFsIiA6IHRydWUsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElpIiwKICAgICJuYW1lIiA6ICJpbnQiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSWkiLAogICAgInNpemUiIDogNAogICB9LAogICB7CkBAIC0xNTMsOCArMTI4LDYgQEAKICAgICJpc191bnNpZ25lZCIgOiB0cnVlLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJaiIsCiAgICAibmFtZSIgOiAidW5zaWduZWQgaW50IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElqIiwKICAgICJzaXplIiA6IDQKICAgfSwKICAgewpAQCAtMTYyLDggKzEzNSw2IEBACiAgICAiaXNfaW50ZWdyYWwiIDogdHJ1ZSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSWwiLAogICAgIm5hbWUiIDogImxvbmciLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWwiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSWwiLAogICAgInNpemUiIDogNAogICB9LAogICB7CkBAIC0xNzIsOCArMTQzLDYgQEAKICAgICJpc191bnNpZ25lZCIgOiB0cnVlLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJbSIsCiAgICAibmFtZSIgOiAidW5zaWduZWQgbG9uZyIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJbSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJbSIsCiAgICAic2l6ZSIgOiA0CiAgIH0sCiAgIHsKQEAgLTE4MSw4ICsxNTAsNiBAQAogICAgImlzX2ludGVncmFsIiA6IHRydWUsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElzIiwKICAgICJuYW1lIiA6ICJzaG9ydCIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJcyIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJcyIsCiAgICAic2l6ZSIgOiAyCiAgIH0sCiAgIHsKQEAgLTE5MSwyMyArMTU4LDE3IEBACiAgICAiaXNfdW5zaWduZWQiIDogdHJ1ZSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSXQiLAogICAgIm5hbWUiIDogInVuc2lnbmVkIHNob3J0IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEl0IiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVEl0IiwKICAgICJzaXplIiA6IDIKICAgfSwKICAgewogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJdiIsCi0gICAibmFtZSIgOiAidm9pZCIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJdiIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJdiIKKyAgICJuYW1lIiA6ICJ2b2lkIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDgsCiAgICAiaXNfaW50ZWdyYWwiIDogdHJ1ZSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSXgiLAogICAgIm5hbWUiIDogImxvbmcgbG9uZyIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJeCIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJeCIsCiAgICAic2l6ZSIgOiA4CiAgIH0sCiAgIHsKQEAgLTIxNiw4ICsxNzcsNiBAQAogICAgImlzX3Vuc2lnbmVkIiA6IHRydWUsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEl5IiwKICAgICJuYW1lIiA6ICJ1bnNpZ25lZCBsb25nIGxvbmciLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSXkiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSXkiLAogICAgInNpemUiIDogOAogICB9CiAgXSwKQEAgLTQ5MSwxNSArNDUwLDQwIEBACiAgICAibmFtZSIgOiAiX1pON2FuZHJvaWQyN2FkZF9zeXNwcm9wX2NoYW5nZV9jYWxsYmFja0VQRnZ2RWkiCiAgIH0sCiAgIHsKKyAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKKyAgICJuYW1lIiA6ICJfWk43YW5kcm9pZDJzcElOU18xNExvb3BlckNhbGxiYWNrRUU1Y2xlYXJFdiIKKyAgfSwKKyAgeworICAgImJpbmRpbmciIDogIndlYWsiLAorICAgIm5hbWUiIDogIl9aTjdhbmRyb2lkMnNwSU5TXzE0TG9vcGVyQ2FsbGJhY2tFRWFTRVJLUzJfIgorICB9LAorICB7CisgICAiYmluZGluZyIgOiAid2VhayIsCisgICAibmFtZSIgOiAiX1pON2FuZHJvaWQyc3BJTlNfNkxvb3BlckVFRDJFdiIKKyAgfSwKKyAgeworICAgImJpbmRpbmciIDogIndlYWsiLAorICAgIm5hbWUiIDogIl9aTjdhbmRyb2lkMnNwSU5TXzZMb29wZXJFRWFTRU9TMl8iCisgIH0sCisgIHsKKyAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKKyAgICJuYW1lIiA6ICJfWk43YW5kcm9pZDJzcElOU182TG9vcGVyRUVhU0VSS1MyXyIKKyAgfSwKKyAgeworICAgImJpbmRpbmciIDogIndlYWsiLAorICAgIm5hbWUiIDogIl9aTjdhbmRyb2lkMnNwSU5TXzZUaHJlYWRFRTVjbGVhckV2IgorICB9LAorICB7CisgICAiYmluZGluZyIgOiAid2VhayIsCisgICAibmFtZSIgOiAiX1pON2FuZHJvaWQyc3BJTlNfNlRocmVhZEVFYVNFT1MyXyIKKyAgfSwKKyAgewogICAgIm5hbWUiIDogIl9aTjdhbmRyb2lkMzBnZXRfcmVwb3J0X3N5c3Byb3BfY2hhbmdlX2Z1bmNFdiIKICAgfSwKICAgewogICAgIm5hbWUiIDogIl9aTjdhbmRyb2lkNDdMaWdodFJlZkJhc2VfcmVwb3J0SW5jU3Ryb25nUmVxdWlyZVN0cm9uZ0ZhaWxlZEVQS3YiCiAgIH0sCiAgIHsKLSAgICJuYW1lIiA6ICJfWk43YW5kcm9pZDZMb29wZXIxMGluaXRUTFNLZXlFdiIKLSAgfSwKLSAgewogICAgIm5hbWUiIDogIl9aTjdhbmRyb2lkNkxvb3BlcjExc2VuZE1lc3NhZ2VFUktOU18yc3BJTlNfMTRNZXNzYWdlSGFuZGxlckVFRVJLTlNfN01lc3NhZ2VFIgogICB9LAogICB7CkBAIC01MTUsNyArNDk5LDcgQEAKICAgICJuYW1lIiA6ICJfWk43YW5kcm9pZDZMb29wZXIxNHJlbW92ZU1lc3NhZ2VzRVJLTlNfMnNwSU5TXzE0TWVzc2FnZUhhbmRsZXJFRUVpIgogICB9LAogICB7Ci0gICAibmFtZSIgOiAiX1pON2FuZHJvaWQ2TG9vcGVyMTZ0aHJlYWREZXN0cnVjdG9yRVB2IgorICAgIm5hbWUiIDogIl9aTjdhbmRyb2lkNkxvb3BlcjE1Z2V0RmRTdGF0ZURlYnVnRWlQaVMxX1BOU18yc3BJTlNfMTRMb29wZXJDYWxsYmFja0VFRVBQdiIKICAgfSwKICAgewogICAgIm5hbWUiIDogIl9aTjdhbmRyb2lkNkxvb3BlcjE3c2VuZE1lc3NhZ2VBdFRpbWVFeFJLTlNfMnNwSU5TXzE0TWVzc2FnZUhhbmRsZXJFRUVSS05TXzdNZXNzYWdlRSIKQEAgLTU0NSw2ICs1MjksOSBAQAogICAgIm5hbWUiIDogIl9aTjdhbmRyb2lkNkxvb3BlcjZhd29rZW5FdiIKICAgfSwKICAgeworICAgIm5hbWUiIDogIl9aTjdhbmRyb2lkNkxvb3BlcjZyZXBvbGxFaSIKKyAgfSwKKyAgewogICAgIm5hbWUiIDogIl9aTjdhbmRyb2lkNkxvb3Blcjdwb2xsQWxsRWlQaVMxX1BQdiIKICAgfSwKICAgewpAQCAtNzA0LDkgKzY5MSw2IEBACiAgICAibmFtZSIgOiAiX1pON2FuZHJvaWQ3UmVmQmFzZUQyRXYiCiAgIH0sCiAgIHsKLSAgICJuYW1lIiA6ICJfWk43YW5kcm9pZDdTdHJpbmc4MTBhcHBlbmRQYXRoRVBLYyIKLSAgfSwKLSAgewogICAgIm5hbWUiIDogIl9aTjdhbmRyb2lkN1N0cmluZzgxMGxvY2tCdWZmZXJFaiIKICAgfSwKICAgewpAQCAtNzI1LDkgKzcwOSw2IEBACiAgICAibmFtZSIgOiAiX1pON2FuZHJvaWQ3U3RyaW5nODEzYXBwZW5kRm9ybWF0VkVQS2NTdDlfX3ZhX2xpc3QiCiAgIH0sCiAgIHsKLSAgICJuYW1lIiA6ICJfWk43YW5kcm9pZDdTdHJpbmc4MTZjb252ZXJ0VG9SZXNQYXRoRXYiCi0gIH0sCi0gIHsKICAgICJuYW1lIiA6ICJfWk43YW5kcm9pZDdTdHJpbmc4NWNsZWFyRXYiCiAgIH0sCiAgIHsKQEAgLTExNDgsMTUgKzExMjksNiBAQAogICAgIm5hbWUiIDogIl9aTks3YW5kcm9pZDdTdHJpbmc4MTBnZXRQYXRoRGlyRXYiCiAgIH0sCiAgIHsKLSAgICJuYW1lIiA6ICJfWk5LN2FuZHJvaWQ3U3RyaW5nODExZ2V0QmFzZVBhdGhFdiIKLSAgfSwKLSAgewotICAgIm5hbWUiIDogIl9aTks3YW5kcm9pZDdTdHJpbmc4MTFnZXRQYXRoTGVhZkV2IgotICB9LAotICB7Ci0gICAibmFtZSIgOiAiX1pOSzdhbmRyb2lkN1N0cmluZzgxNGZpbmRfZXh0ZW5zaW9uRXYiCi0gIH0sCi0gIHsKICAgICJuYW1lIiA6ICJfWk5LN2FuZHJvaWQ3U3RyaW5nODE2Z2V0UGF0aEV4dGVuc2lvbkV2IgogICB9LAogICB7CkBAIC0xMTY2LDkgKzExMzgsNiBAQAogICAgIm5hbWUiIDogIl9aTks3YW5kcm9pZDdTdHJpbmc4Nmxlbmd0aEV2IgogICB9LAogICB7Ci0gICAibmFtZSIgOiAiX1pOSzdhbmRyb2lkN1N0cmluZzg4d2Fsa1BhdGhFUFMwXyIKLSAgfSwKLSAgewogICAgIm5hbWUiIDogIl9aTks3YW5kcm9pZDhTdHJpbmcxNjEwc3RhcnRzV2l0aEVQS0RzIgogICB9LAogICB7CkBAIC0xMjA2LDM5ICsxMTc1LDQzIEBACiAgIH0sCiAgIHsKICAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKLSAgICJuYW1lIiA6ICJfWk5TdDNfXzExMl9faGFzaF90YWJsZUlOU18xN19faGFzaF92YWx1ZV90eXBlSWl5RUVOU18yMl9fdW5vcmRlcmVkX21hcF9oYXNoZXJJaVMyX05TXzRoYXNoSWlFRUxiMUVFRU5TXzIxX191bm9yZGVyZWRfbWFwX2VxdWFsSWlTMl9OU184ZXF1YWxfdG9JaUVFTGIxRUVFTlNfOWFsbG9jYXRvcklTMl9FRUUxNF9fZXJhc2VfdW5pcXVlSWlFRWpSS1RfIgorICAgIm5hbWUiIDogIl9aTlN0M19fMTEyX19oYXNoX3RhYmxlSU5TXzE3X19oYXNoX3ZhbHVlX3R5cGVJaXlFRU5TXzIyX191bm9yZGVyZWRfbWFwX2hhc2hlcklpUzJfTlNfNGhhc2hJaUVFTlNfOGVxdWFsX3RvSWlFRUxiMUVFRU5TXzIxX191bm9yZGVyZWRfbWFwX2VxdWFsSWlTMl9TN19TNV9MYjFFRUVOU185YWxsb2NhdG9ySVMyX0VFRTExX19kb19yZWhhc2hJTGIxRUVFdmoiCiAgIH0sCiAgIHsKICAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKLSAgICJuYW1lIiA6ICJfWk5TdDNfXzExMl9faGFzaF90YWJsZUlOU18xN19faGFzaF92YWx1ZV90eXBlSWl5RUVOU18yMl9fdW5vcmRlcmVkX21hcF9oYXNoZXJJaVMyX05TXzRoYXNoSWlFRUxiMUVFRU5TXzIxX191bm9yZGVyZWRfbWFwX2VxdWFsSWlTMl9OU184ZXF1YWxfdG9JaUVFTGIxRUVFTlNfOWFsbG9jYXRvcklTMl9FRUUyNV9fZW1wbGFjZV91bmlxdWVfa2V5X2FyZ3NJaUpSaVJLeUVFRU5TXzRwYWlySU5TXzE1X19oYXNoX2l0ZXJhdG9ySVBOU18xMV9faGFzaF9ub2RlSVMyX1B2RUVFRWJFRVJLVF9EcE9UMF8iCisgICAibmFtZSIgOiAiX1pOU3QzX18xMTJfX2hhc2hfdGFibGVJTlNfMTdfX2hhc2hfdmFsdWVfdHlwZUlpeUVFTlNfMjJfX3Vub3JkZXJlZF9tYXBfaGFzaGVySWlTMl9OU180aGFzaElpRUVOU184ZXF1YWxfdG9JaUVFTGIxRUVFTlNfMjFfX3Vub3JkZXJlZF9tYXBfZXF1YWxJaVMyX1M3X1M1X0xiMUVFRU5TXzlhbGxvY2F0b3JJUzJfRUVFMTRfX2VyYXNlX3VuaXF1ZUlpRUVqUktUXyIKICAgfSwKICAgewogICAgImJpbmRpbmciIDogIndlYWsiLAotICAgIm5hbWUiIDogIl9aTlN0M19fMTEyX19oYXNoX3RhYmxlSU5TXzE3X19oYXNoX3ZhbHVlX3R5cGVJaXlFRU5TXzIyX191bm9yZGVyZWRfbWFwX2hhc2hlcklpUzJfTlNfNGhhc2hJaUVFTGIxRUVFTlNfMjFfX3Vub3JkZXJlZF9tYXBfZXF1YWxJaVMyX05TXzhlcXVhbF90b0lpRUVMYjFFRUVOU185YWxsb2NhdG9ySVMyX0VFRTZyZWhhc2hFaiIKKyAgICJuYW1lIiA6ICJfWk5TdDNfXzExMl9faGFzaF90YWJsZUlOU18xN19faGFzaF92YWx1ZV90eXBlSWl5RUVOU18yMl9fdW5vcmRlcmVkX21hcF9oYXNoZXJJaVMyX05TXzRoYXNoSWlFRU5TXzhlcXVhbF90b0lpRUVMYjFFRUVOU18yMV9fdW5vcmRlcmVkX21hcF9lcXVhbElpUzJfUzdfUzVfTGIxRUVFTlNfOWFsbG9jYXRvcklTMl9FRUUyNV9fZW1wbGFjZV91bmlxdWVfa2V5X2FyZ3NJaUpSaVJLeUVFRU5TXzRwYWlySU5TXzE1X19oYXNoX2l0ZXJhdG9ySVBOU18xMV9faGFzaF9ub2RlSVMyX1B2RUVFRWJFRVJLVF9EcE9UMF8iCiAgIH0sCiAgIHsKICAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKLSAgICJuYW1lIiA6ICJfWk5TdDNfXzExMl9faGFzaF90YWJsZUlOU18xN19faGFzaF92YWx1ZV90eXBlSWl5RUVOU18yMl9fdW5vcmRlcmVkX21hcF9oYXNoZXJJaVMyX05TXzRoYXNoSWlFRUxiMUVFRU5TXzIxX191bm9yZGVyZWRfbWFwX2VxdWFsSWlTMl9OU184ZXF1YWxfdG9JaUVFTGIxRUVFTlNfOWFsbG9jYXRvcklTMl9FRUU2cmVtb3ZlRU5TXzIxX19oYXNoX2NvbnN0X2l0ZXJhdG9ySVBOU18xMV9faGFzaF9ub2RlSVMyX1B2RUVFRSIKKyAgICJuYW1lIiA6ICJfWk5TdDNfXzExMl9faGFzaF90YWJsZUlOU18xN19faGFzaF92YWx1ZV90eXBlSWl5RUVOU18yMl9fdW5vcmRlcmVkX21hcF9oYXNoZXJJaVMyX05TXzRoYXNoSWlFRU5TXzhlcXVhbF90b0lpRUVMYjFFRUVOU18yMV9fdW5vcmRlcmVkX21hcF9lcXVhbElpUzJfUzdfUzVfTGIxRUVFTlNfOWFsbG9jYXRvcklTMl9FRUU0ZmluZElpRUVOU18xNV9faGFzaF9pdGVyYXRvcklQTlNfMTFfX2hhc2hfbm9kZUlTMl9QdkVFRUVSS1RfIgogICB9LAogICB7CiAgICAiYmluZGluZyIgOiAid2VhayIsCi0gICAibmFtZSIgOiAiX1pOU3QzX18xMTJfX2hhc2hfdGFibGVJTlNfMTdfX2hhc2hfdmFsdWVfdHlwZUlpeUVFTlNfMjJfX3Vub3JkZXJlZF9tYXBfaGFzaGVySWlTMl9OU180aGFzaElpRUVMYjFFRUVOU18yMV9fdW5vcmRlcmVkX21hcF9lcXVhbElpUzJfTlNfOGVxdWFsX3RvSWlFRUxiMUVFRU5TXzlhbGxvY2F0b3JJUzJfRUVFOF9fcmVoYXNoRWoiCisgICAibmFtZSIgOiAiX1pOU3QzX18xMTJfX2hhc2hfdGFibGVJTlNfMTdfX2hhc2hfdmFsdWVfdHlwZUlpeUVFTlNfMjJfX3Vub3JkZXJlZF9tYXBfaGFzaGVySWlTMl9OU180aGFzaElpRUVOU184ZXF1YWxfdG9JaUVFTGIxRUVFTlNfMjFfX3Vub3JkZXJlZF9tYXBfZXF1YWxJaVMyX1M3X1M1X0xiMUVFRU5TXzlhbGxvY2F0b3JJUzJfRUVFOF9fcmVoYXNoSUxiMUVFRXZqIgogICB9LAogICB7CiAgICAiYmluZGluZyIgOiAid2VhayIsCi0gICAibmFtZSIgOiAiX1pOU3QzX18xMTJfX2hhc2hfdGFibGVJTlNfMTdfX2hhc2hfdmFsdWVfdHlwZUl5TjdhbmRyb2lkNkxvb3BlcjdSZXF1ZXN0RUVFTlNfMjJfX3Vub3JkZXJlZF9tYXBfaGFzaGVySXlTNV9OU180aGFzaEl5RUVMYjFFRUVOU18yMV9fdW5vcmRlcmVkX21hcF9lcXVhbEl5UzVfTlNfOGVxdWFsX3RvSXlFRUxiMUVFRU5TXzlhbGxvY2F0b3JJUzVfRUVFMjVfX2VtcGxhY2VfdW5pcXVlX2tleV9hcmdzSXlKUkt5UlM0X0VFRU5TXzRwYWlySU5TXzE1X19oYXNoX2l0ZXJhdG9ySVBOU18xMV9faGFzaF9ub2RlSVM1X1B2RUVFRWJFRVJLVF9EcE9UMF8iCisgICAibmFtZSIgOiAiX1pOU3QzX18xMTJfX2hhc2hfdGFibGVJTlNfMTdfX2hhc2hfdmFsdWVfdHlwZUl5TjdhbmRyb2lkNkxvb3BlcjdSZXF1ZXN0RUVFTlNfMjJfX3Vub3JkZXJlZF9tYXBfaGFzaGVySXlTNV9OU180aGFzaEl5RUVOU184ZXF1YWxfdG9JeUVFTGIxRUVFTlNfMjFfX3Vub3JkZXJlZF9tYXBfZXF1YWxJeVM1X1NBX1M4X0xiMUVFRU5TXzlhbGxvY2F0b3JJUzVfRUVFMTFfX2RvX3JlaGFzaElMYjFFRUV2aiIKICAgfSwKICAgewogICAgImJpbmRpbmciIDogIndlYWsiLAotICAgIm5hbWUiIDogIl9aTlN0M19fMTEyX19oYXNoX3RhYmxlSU5TXzE3X19oYXNoX3ZhbHVlX3R5cGVJeU43YW5kcm9pZDZMb29wZXI3UmVxdWVzdEVFRU5TXzIyX191bm9yZGVyZWRfbWFwX2hhc2hlckl5UzVfTlNfNGhhc2hJeUVFTGIxRUVFTlNfMjFfX3Vub3JkZXJlZF9tYXBfZXF1YWxJeVM1X05TXzhlcXVhbF90b0l5RUVMYjFFRUVOU185YWxsb2NhdG9ySVM1X0VFRTZyZWhhc2hFaiIKKyAgICJuYW1lIiA6ICJfWk5TdDNfXzExMl9faGFzaF90YWJsZUlOU18xN19faGFzaF92YWx1ZV90eXBlSXlON2FuZHJvaWQ2TG9vcGVyN1JlcXVlc3RFRUVOU18yMl9fdW5vcmRlcmVkX21hcF9oYXNoZXJJeVM1X05TXzRoYXNoSXlFRU5TXzhlcXVhbF90b0l5RUVMYjFFRUVOU18yMV9fdW5vcmRlcmVkX21hcF9lcXVhbEl5UzVfU0FfUzhfTGIxRUVFTlNfOWFsbG9jYXRvcklTNV9FRUUxNF9fZXJhc2VfdW5pcXVlSXlFRWpSS1RfIgogICB9LAogICB7CiAgICAiYmluZGluZyIgOiAid2VhayIsCi0gICAibmFtZSIgOiAiX1pOU3QzX18xMTJfX2hhc2hfdGFibGVJTlNfMTdfX2hhc2hfdmFsdWVfdHlwZUl5TjdhbmRyb2lkNkxvb3BlcjdSZXF1ZXN0RUVFTlNfMjJfX3Vub3JkZXJlZF9tYXBfaGFzaGVySXlTNV9OU180aGFzaEl5RUVMYjFFRUVOU18yMV9fdW5vcmRlcmVkX21hcF9lcXVhbEl5UzVfTlNfOGVxdWFsX3RvSXlFRUxiMUVFRU5TXzlhbGxvY2F0b3JJUzVfRUVFNnJlbW92ZUVOU18yMV9faGFzaF9jb25zdF9pdGVyYXRvcklQTlNfMTFfX2hhc2hfbm9kZUlTNV9QdkVFRUUiCisgICAibmFtZSIgOiAiX1pOU3QzX18xMTJfX2hhc2hfdGFibGVJTlNfMTdfX2hhc2hfdmFsdWVfdHlwZUl5TjdhbmRyb2lkNkxvb3BlcjdSZXF1ZXN0RUVFTlNfMjJfX3Vub3JkZXJlZF9tYXBfaGFzaGVySXlTNV9OU180aGFzaEl5RUVOU184ZXF1YWxfdG9JeUVFTGIxRUVFTlNfMjFfX3Vub3JkZXJlZF9tYXBfZXF1YWxJeVM1X1NBX1M4X0xiMUVFRU5TXzlhbGxvY2F0b3JJUzVfRUVFMjVfX2VtcGxhY2VfdW5pcXVlX2tleV9hcmdzSXlKUkt5UlM0X0VFRU5TXzRwYWlySU5TXzE1X19oYXNoX2l0ZXJhdG9ySVBOU18xMV9faGFzaF9ub2RlSVM1X1B2RUVFRWJFRVJLVF9EcE9UMF8iCiAgIH0sCiAgIHsKICAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKLSAgICJuYW1lIiA6ICJfWk5TdDNfXzExMl9faGFzaF90YWJsZUlOU18xN19faGFzaF92YWx1ZV90eXBlSXlON2FuZHJvaWQ2TG9vcGVyN1JlcXVlc3RFRUVOU18yMl9fdW5vcmRlcmVkX21hcF9oYXNoZXJJeVM1X05TXzRoYXNoSXlFRUxiMUVFRU5TXzIxX191bm9yZGVyZWRfbWFwX2VxdWFsSXlTNV9OU184ZXF1YWxfdG9JeUVFTGIxRUVFTlNfOWFsbG9jYXRvcklTNV9FRUU4X19yZWhhc2hFaiIKKyAgICJuYW1lIiA6ICJfWk5TdDNfXzExMl9faGFzaF90YWJsZUlOU18xN19faGFzaF92YWx1ZV90eXBlSXlON2FuZHJvaWQ2TG9vcGVyN1JlcXVlc3RFRUVOU18yMl9fdW5vcmRlcmVkX21hcF9oYXNoZXJJeVM1X05TXzRoYXNoSXlFRU5TXzhlcXVhbF90b0l5RUVMYjFFRUVOU18yMV9fdW5vcmRlcmVkX21hcF9lcXVhbEl5UzVfU0FfUzhfTGIxRUVFTlNfOWFsbG9jYXRvcklTNV9FRUU0ZmluZEl5RUVOU18xNV9faGFzaF9pdGVyYXRvcklQTlNfMTFfX2hhc2hfbm9kZUlTNV9QdkVFRUVSS1RfIgorICB9LAorICB7CisgICAiYmluZGluZyIgOiAid2VhayIsCisgICAibmFtZSIgOiAiX1pOU3QzX18xMTJfX2hhc2hfdGFibGVJTlNfMTdfX2hhc2hfdmFsdWVfdHlwZUl5TjdhbmRyb2lkNkxvb3BlcjdSZXF1ZXN0RUVFTlNfMjJfX3Vub3JkZXJlZF9tYXBfaGFzaGVySXlTNV9OU180aGFzaEl5RUVOU184ZXF1YWxfdG9JeUVFTGIxRUVFTlNfMjFfX3Vub3JkZXJlZF9tYXBfZXF1YWxJeVM1X1NBX1M4X0xiMUVFRU5TXzlhbGxvY2F0b3JJUzVfRUVFOF9fcmVoYXNoSUxiMUVFRXZqIgogICB9LAogICB7CiAgICAibmFtZSIgOiAiX1pUdjBfbjEyX043YW5kcm9pZDE0TG9vcGVyQ2FsbGJhY2tEMEV2IgpAQCAtMTQyNSw2ICsxMzk4LDEwIEBACiAgIH0sCiAgIHsKICAgICJuYW1lIiA6ICJfWlRWTjdhbmRyb2lkOUZkUHJpbnRlckUiCisgIH0sCisgIHsKKyAgICJiaW5kaW5nIiA6ICJ3ZWFrIiwKKyAgICJuYW1lIiA6ICJfX2xsdm1fZnNfZGlzY3JpbWluYXRvcl9fIgogICB9CiAgXSwKICAiZW51bV90eXBlcyIgOgpAQCAtMTQzNCw2NyArMTQxMSw2IEBACiAgICAiZW51bV9maWVsZHMiIDoKICAgIFsKICAgICB7Ci0gICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IC0xLAotICAgICAibmFtZSIgOiAiU1BfREVGQVVMVCIKLSAgICB9LAotICAgIHsKLSAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMCwKLSAgICAgIm5hbWUiIDogIlNQX0JBQ0tHUk9VTkQiCi0gICAgfSwKLSAgICB7Ci0gICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCi0gICAgICJuYW1lIiA6ICJTUF9GT1JFR1JPVU5EIgotICAgIH0sCi0gICAgewotICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAyLAotICAgICAibmFtZSIgOiAiU1BfU1lTVEVNIgotICAgIH0sCi0gICAgewotICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAzLAotICAgICAibmFtZSIgOiAiU1BfQVVESU9fQVBQIgotICAgIH0sCi0gICAgewotICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiA0LAotICAgICAibmFtZSIgOiAiU1BfQVVESU9fU1lTIgotICAgIH0sCi0gICAgewotICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiA1LAotICAgICAibmFtZSIgOiAiU1BfVE9QX0FQUCIKLSAgICB9LAotICAgIHsKLSAgICAgImVudW1fZmllbGRfdmFsdWUiIDogNiwKLSAgICAgIm5hbWUiIDogIlNQX1JUX0FQUCIKLSAgICB9LAotICAgIHsKLSAgICAgImVudW1fZmllbGRfdmFsdWUiIDogNywKLSAgICAgIm5hbWUiIDogIlNQX1JFU1RSSUNURUQiCi0gICAgfSwKLSAgICB7Ci0gICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDgsCi0gICAgICJuYW1lIiA6ICJTUF9DTlQiCi0gICAgfSwKLSAgICB7Ci0gICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDcsCi0gICAgICJuYW1lIiA6ICJTUF9NQVgiCi0gICAgfSwKLSAgICB7Ci0gICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCi0gICAgICJuYW1lIiA6ICJTUF9TWVNURU1fREVGQVVMVCIKLSAgICB9Ci0gICBdLAotICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJMTFTY2hlZFBvbGljeSIsCi0gICAibmFtZSIgOiAiU2NoZWRQb2xpY3kiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTExU2NoZWRQb2xpY3kiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSTExU2NoZWRQb2xpY3kiLAotICAgInNpemUiIDogNCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlicHJvY2Vzc2dyb3VwL2luY2x1ZGUvcHJvY2Vzc2dyb3VwL3NjaGVkX3BvbGljeS5oIiwKLSAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElpIgotICB9LAotICB7Ci0gICAiYWxpZ25tZW50IiA6IDQsCi0gICAiZW51bV9maWVsZHMiIDoKLSAgIFsKLSAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCiAgICAgICJuYW1lIiA6ICJIQUxfSERSX0RPTEJZX1ZJU0lPTiIKICAgICB9LApAQCAtMTUwOSw4ICsxNDI1LDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEkxM2FuZHJvaWRfaGRyX3QiLAogICAgIm5hbWUiIDogImFuZHJvaWRfaGRyX3QiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTEzYW5kcm9pZF9oZHJfdCIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJMTNhbmRyb2lkX2hkcl90IiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnN5c3RlbS9pbmNsdWRlL3N5c3RlbS9ncmFwaGljcy1iYXNlLXYxLjAuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTE1MjYsOCArMTQ0MCw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJMThhbmRyb2lkX2hkcl92MV8yX3QiLAogICAgIm5hbWUiIDogImFuZHJvaWRfaGRyX3YxXzJfdCIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJMThhbmRyb2lkX2hkcl92MV8yX3QiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSTE4YW5kcm9pZF9oZHJfdjFfMl90IiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnN5c3RlbS9pbmNsdWRlL3N5c3RlbS9ncmFwaGljcy1iYXNlLXYxLjIuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTE1NzUsOCArMTQ4Nyw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJMTlhbmRyb2lkX0xvZ1ByaW9yaXR5IiwKICAgICJuYW1lIiA6ICJhbmRyb2lkX0xvZ1ByaW9yaXR5IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkxOWFuZHJvaWRfTG9nUHJpb3JpdHkiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSTE5YW5kcm9pZF9Mb2dQcmlvcml0eSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vbG9nZ2luZy9saWJsb2cvaW5jbHVkZV92bmRrL2FuZHJvaWQvbG9nLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0xODE2LDggKzE3MjYsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSTE5YW5kcm9pZF9kYXRhc3BhY2VfdCIsCiAgICAibmFtZSIgOiAiYW5kcm9pZF9kYXRhc3BhY2VfdCIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJMTlhbmRyb2lkX2RhdGFzcGFjZV90IiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVEkxOWFuZHJvaWRfZGF0YXNwYWNlX3QiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlic3lzdGVtL2luY2x1ZGUvc3lzdGVtL2dyYXBoaWNzLWJhc2UtdjEuMC5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMTg1Myw4ICsxNzYxLDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEkxOWFuZHJvaWRfZmxleF9mb3JtYXQiLAogICAgIm5hbWUiIDogImFuZHJvaWRfZmxleF9mb3JtYXQiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTE5YW5kcm9pZF9mbGV4X2Zvcm1hdCIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJMTlhbmRyb2lkX2ZsZXhfZm9ybWF0IiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnN5c3RlbS9pbmNsdWRlL3N5c3RlbS9ncmFwaGljcy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMTg4Niw4ICsxNzkyLDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEkxOWFuZHJvaWRfdHJhbnNmb3JtX3QiLAogICAgIm5hbWUiIDogImFuZHJvaWRfdHJhbnNmb3JtX3QiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTE5YW5kcm9pZF90cmFuc2Zvcm1fdCIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJMTlhbmRyb2lkX3RyYW5zZm9ybV90IiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnN5c3RlbS9pbmNsdWRlL3N5c3RlbS9ncmFwaGljcy1iYXNlLXYxLjAuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTE5MzksOCArMTg0Myw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJMjBhbmRyb2lkX2NvbG9yX21vZGVfdCIsCiAgICAibmFtZSIgOiAiYW5kcm9pZF9jb2xvcl9tb2RlX3QiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTIwYW5kcm9pZF9jb2xvcl9tb2RlX3QiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSTIwYW5kcm9pZF9jb2xvcl9tb2RlX3QiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlic3lzdGVtL2luY2x1ZGUvc3lzdGVtL2dyYXBoaWNzLWJhc2UtdjEuMC5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMTk3Miw4ICsxODc0LDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEkyMSRTWVNURU1fVElNRV9CT09UVElNRSIsCiAgICAibmFtZSIgOiAiKHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkyMSRTWVNURU1fVElNRV9CT09UVElNRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJMjEkU1lTVEVNX1RJTUVfQk9PVFRJTUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UaW1lcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTIwMTMsOCArMTkxMyw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJMjJhbmRyb2lkX2ZsZXhfY29tcG9uZW50IiwKICAgICJuYW1lIiA6ICJhbmRyb2lkX2ZsZXhfY29tcG9uZW50IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkyMmFuZHJvaWRfZmxleF9jb21wb25lbnQiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSTIyYW5kcm9pZF9mbGV4X2NvbXBvbmVudCIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJzeXN0ZW0vaW5jbHVkZS9zeXN0ZW0vZ3JhcGhpY3MuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTIxMDYsOCArMjAwNCw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJMjJhbmRyb2lkX3BpeGVsX2Zvcm1hdF90IiwKICAgICJuYW1lIiA6ICJhbmRyb2lkX3BpeGVsX2Zvcm1hdF90IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkyMmFuZHJvaWRfcGl4ZWxfZm9ybWF0X3QiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSTIyYW5kcm9pZF9waXhlbF9mb3JtYXRfdCIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJzeXN0ZW0vaW5jbHVkZS9zeXN0ZW0vZ3JhcGhpY3MtYmFzZS12MS4wLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0yMTcxLDggKzIwNjcsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSTIzJEFORFJPSURfUFJJT1JJVFlfQVVESU8iLAogICAgIm5hbWUiIDogIih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJMjMkQU5EUk9JRF9QUklPUklUWV9BVURJTyIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJMjMkQU5EUk9JRF9QUklPUklUWV9BVURJTyIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJzeXN0ZW0vaW5jbHVkZS9zeXN0ZW0vdGhyZWFkX2RlZnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaSIKQEAgLTIyMDAsOCArMjA5NCw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJMjRhbmRyb2lkX2RhdGFzcGFjZV92MV8xX3QiLAogICAgIm5hbWUiIDogImFuZHJvaWRfZGF0YXNwYWNlX3YxXzFfdCIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJMjRhbmRyb2lkX2RhdGFzcGFjZV92MV8xX3QiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSTI0YW5kcm9pZF9kYXRhc3BhY2VfdjFfMV90IiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnN5c3RlbS9pbmNsdWRlL3N5c3RlbS9ncmFwaGljcy1iYXNlLXYxLjEuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTIyMjksOCArMjEyMSw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJMjRhbmRyb2lkX2RhdGFzcGFjZV92MV8yX3QiLAogICAgIm5hbWUiIDogImFuZHJvaWRfZGF0YXNwYWNlX3YxXzJfdCIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJMjRhbmRyb2lkX2RhdGFzcGFjZV92MV8yX3QiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSTI0YW5kcm9pZF9kYXRhc3BhY2VfdjFfMl90IiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnN5c3RlbS9pbmNsdWRlL3N5c3RlbS9ncmFwaGljcy1iYXNlLXYxLjIuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTIyNTQsOCArMjE0NCw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJMjVhbmRyb2lkX2NvbG9yX21vZGVfdjFfMV90IiwKICAgICJuYW1lIiA6ICJhbmRyb2lkX2NvbG9yX21vZGVfdjFfMV90IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkyNWFuZHJvaWRfY29sb3JfbW9kZV92MV8xX3QiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSTI1YW5kcm9pZF9jb2xvcl9tb2RlX3YxXzFfdCIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJzeXN0ZW0vaW5jbHVkZS9zeXN0ZW0vZ3JhcGhpY3MtYmFzZS12MS4xLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0yMjY1LDYgKzIxNTMsMjEgQEAKICAgICJlbnVtX2ZpZWxkcyIgOgogICAgWwogICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMTMsCisgICAgICJuYW1lIiA6ICJIQUxfQ09MT1JfTU9ERV9ESVNQTEFZX0JUMjAyMCIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJMjVhbmRyb2lkX2NvbG9yX21vZGVfdjFfMl90IiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkX2NvbG9yX21vZGVfdjFfMl90IiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnN5c3RlbS9pbmNsdWRlL3N5c3RlbS9ncmFwaGljcy1iYXNlLXYxLjIuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAwLAogICAgICAibmFtZSIgOiAiSEFMX0NPTE9SX1RSQU5TRk9STV9JREVOVElUWSIKICAgICB9LApAQCAtMjI5NSw4ICsyMTk4LDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEkyNWFuZHJvaWRfY29sb3JfdHJhbnNmb3JtX3QiLAogICAgIm5hbWUiIDogImFuZHJvaWRfY29sb3JfdHJhbnNmb3JtX3QiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTI1YW5kcm9pZF9jb2xvcl90cmFuc2Zvcm1fdCIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJMjVhbmRyb2lkX2NvbG9yX3RyYW5zZm9ybV90IiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnN5c3RlbS9pbmNsdWRlL3N5c3RlbS9ncmFwaGljcy1iYXNlLXYxLjAuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTIzMjQsOCArMjIyNSw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJMjVhbmRyb2lkX3BpeGVsX2Zvcm1hdF9zd190IiwKICAgICJuYW1lIiA6ICJhbmRyb2lkX3BpeGVsX2Zvcm1hdF9zd190IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkyNWFuZHJvaWRfcGl4ZWxfZm9ybWF0X3N3X3QiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSTI1YW5kcm9pZF9waXhlbF9mb3JtYXRfc3dfdCIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJzeXN0ZW0vaW5jbHVkZS9zeXN0ZW0vZ3JhcGhpY3Mtc3cuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTIzNjUsOCArMjI2NCw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJMjdhbmRyb2lkX3BpeGVsX2Zvcm1hdF92MV8xX3QiLAogICAgIm5hbWUiIDogImFuZHJvaWRfcGl4ZWxfZm9ybWF0X3YxXzFfdCIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJMjdhbmRyb2lkX3BpeGVsX2Zvcm1hdF92MV8xX3QiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSTI3YW5kcm9pZF9waXhlbF9mb3JtYXRfdjFfMV90IiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnN5c3RlbS9pbmNsdWRlL3N5c3RlbS9ncmFwaGljcy1iYXNlLXYxLjEuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTIzODIsOCArMjI3OSw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJMjdhbmRyb2lkX3BpeGVsX2Zvcm1hdF92MV8yX3QiLAogICAgIm5hbWUiIDogImFuZHJvaWRfcGl4ZWxfZm9ybWF0X3YxXzJfdCIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJMjdhbmRyb2lkX3BpeGVsX2Zvcm1hdF92MV8yX3QiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSTI3YW5kcm9pZF9waXhlbF9mb3JtYXRfdjFfMl90IiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnN5c3RlbS9pbmNsdWRlL3N5c3RlbS9ncmFwaGljcy1iYXNlLXYxLjIuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTI0MTEsOCArMjMwNiw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJMjhhbmRyb2lkX3JlbmRlcl9pbnRlbnRfdjFfMV90IiwKICAgICJuYW1lIiA6ICJhbmRyb2lkX3JlbmRlcl9pbnRlbnRfdjFfMV90IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkyOGFuZHJvaWRfcmVuZGVyX2ludGVudF92MV8xX3QiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSTI4YW5kcm9pZF9yZW5kZXJfaW50ZW50X3YxXzFfdCIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJzeXN0ZW0vaW5jbHVkZS9zeXN0ZW0vZ3JhcGhpY3MtYmFzZS12MS4xLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0yNDY4LDggKzIzNjEsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSTZsb2dfaWQiLAogICAgIm5hbWUiIDogImxvZ19pZCIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJNmxvZ19pZCIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJNmxvZ19pZCIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vbG9nZ2luZy9saWJsb2cvaW5jbHVkZV92bmRrL2FuZHJvaWQvbG9nLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0yNDkzLDggKzIzODQsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDEwVmVjdG9ySW1wbDE3JEhBU19UUklWSUFMX0NPUFlFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEwVmVjdG9ySW1wbDE3JEhBU19UUklWSUFMX0NPUFlFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxMFZlY3RvckltcGwxNyRIQVNfVFJJVklBTF9DT1BZRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTI1MDQsMTQgKzIzOTMsMzYgQEAKICAgICJlbnVtX2ZpZWxkcyIgOgogICAgWwogICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6OkhBU19UUklWSUFMX0NUT1IiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDIsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjpIQVNfVFJJVklBTF9EVE9SIgorICAgIH0sCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiA0LAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6SEFTX1RSSVZJQUxfQ09QWSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTBWZWN0b3JJbXBsMTckSEFTX1RSSVZJQUxfQ09QWUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6Oih1bm5hbWVkKSIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTBWZWN0b3JJbXBsMTckSEFTX1RSSVZJQUxfQ09QWUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgewogICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAwLAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfcG9pbnRlcjxhbmRyb2lkOjpzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvPjo6dmFsdWUiCiAgICAgfQogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDEzdHJhaXRfcG9pbnRlcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF9wb2ludGVyPGFuZHJvaWQ6OnN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm8+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEzdHJhaXRfcG9pbnRlcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxM3RyYWl0X3BvaW50ZXJJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUU2JHZhbHVlRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0yNTI3LDggKzI0MzgsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDEzdHJhaXRfcG9pbnRlcklOU182TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF9wb2ludGVyPGFuZHJvaWQ6Okxvb3Blcjo6TWVzc2FnZUVudmVsb3BlPjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxM3RyYWl0X3BvaW50ZXJJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUU2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTN0cmFpdF9wb2ludGVySU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFNiR2YWx1ZUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMjU0NCw4ICsyNDUzLDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxM3RyYWl0X3BvaW50ZXJJTlNfNkxvb3BlcjhSZXNwb25zZUVFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3BvaW50ZXI8YW5kcm9pZDo6TG9vcGVyOjpSZXNwb25zZT46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTN0cmFpdF9wb2ludGVySU5TXzZMb29wZXI4UmVzcG9uc2VFRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxM3RyYWl0X3BvaW50ZXJJTlNfNkxvb3BlcjhSZXNwb25zZUVFNiR2YWx1ZUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMjYzNyw4ICsyNTQ0LDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxNSRBTFJFQURZX0VYSVNUU0UiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTUkQUxSRUFEWV9FWElTVFNFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNSRBTFJFQURZX0VYSVNUU0UiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9FcnJvcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaSIKQEAgLTI2NDgsNiArMjU1Myw5OCBAQAogICAgImVudW1fZmllbGRzIiA6CiAgICBbCiAgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAwLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6T0siCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDAsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpOT19FUlJPUiIKKyAgICB9LAorICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogLTIxNDc0ODM2NDgsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpVTktOT1dOX0VSUk9SIgorICAgIH0sCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAtMTIsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpOT19NRU1PUlkiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IC0zOCwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OklOVkFMSURfT1BFUkFUSU9OIgorICAgIH0sCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAtMjIsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpCQURfVkFMVUUiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IC0yMTQ3NDgzNjQ3LAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6QkFEX1RZUEUiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IC0yLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6TkFNRV9OT1RfRk9VTkQiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IC0xLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6UEVSTUlTU0lPTl9ERU5JRUQiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IC0xOSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6Ok5PX0lOSVQiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IC0xNywKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OkFMUkVBRFlfRVhJU1RTIgorICAgIH0sCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAtMzIsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpERUFEX09CSkVDVCIKKyAgICB9LAorICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogLTIxNDc0ODM2NDYsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpGQUlMRURfVFJBTlNBQ1RJT04iCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IC03NSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OkJBRF9JTkRFWCIKKyAgICB9LAorICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogLTYxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6Tk9UX0VOT1VHSF9EQVRBIgorICAgIH0sCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAtMTEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpXT1VMRF9CTE9DSyIKKyAgICB9LAorICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogLTExMCwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OlRJTUVEX09VVCIKKyAgICB9LAorICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogLTc0LAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6VU5LTk9XTl9UUkFOU0FDVElPTiIKKyAgICB9LAorICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogLTIxNDc0ODM2NDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpGRFNfTk9UX0FMTE9XRUQiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IC0yMTQ3NDgzNjQwLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6VU5FWFBFQ1RFRF9OVUxMIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxNSRBTFJFQURZX0VYSVNUU0UiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6Oih1bm5hbWVkKSIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTUkQUxSRUFEWV9FWElTVFNFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvRXJyb3JzLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL0Vycm9ycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElpIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CiAgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDE5LAogICAgICAibmFtZSIgOiAiYW5kcm9pZDo6UFJJT1JJVFlfTE9XRVNUIgogICAgIH0sCkBAIC0yNjk4LDggKzI2OTUsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE1JFBSSU9SSVRZX0FVRElPRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNSRQUklPUklUWV9BVURJT0UiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE1JFBSSU9SSVRZX0FVRElPRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1RocmVhZERlZnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaSIKQEAgLTI3MTUsOCArMjcxMCw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGFuZHJvaWQ6OnN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm8+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFNiR2YWx1ZUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMjczMiw4ICsyNzI1LDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlOU182TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8YW5kcm9pZDo6TG9vcGVyOjpNZXNzYWdlRW52ZWxvcGU+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFNiR2YWx1ZUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMjc0OSw4ICsyNzQwLDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlOU182TG9vcGVyOFJlc3BvbnNlRUU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGFuZHJvaWQ6Okxvb3Blcjo6UmVzcG9uc2U+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SU5TXzZMb29wZXI4UmVzcG9uc2VFRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlOU182TG9vcGVyOFJlc3BvbnNlRUU2JHZhbHVlRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0yNzY2LDggKzI3NTUsMzcgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUliRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8Ym9vbD46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJYkU2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJYkU2JHZhbHVlRSIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxib29sPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWJFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxib29sPjo6KHVubmFtZWQpIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUliRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8Y2hhcj46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUljRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8Y2hhcj46Oih1bm5hbWVkKSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0yNzgzLDggKzI4MDEsMjIgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUljRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8Y2hhcj46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJY0U2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJY0U2JHZhbHVlRSIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJY0U2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGRvdWJsZT46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlkRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8ZG91YmxlPjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTI4MDAsOCArMjgzMiwyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWRFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxkb3VibGU+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWRFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWRFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWRFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxmbG9hdD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlmRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8ZmxvYXQ+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMjgxNyw4ICsyODYzLDIyIEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJZkU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGZsb2F0Pjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlmRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlmRTYkdmFsdWVFIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlmRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dW5zaWduZWQgY2hhcj46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUloRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dW5zaWduZWQgY2hhcj46Oih1bm5hbWVkKSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0yODM0LDggKzI4OTQsMjIgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUloRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dW5zaWduZWQgY2hhcj46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJaEU2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJaEU2JHZhbHVlRSIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJaEU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGludD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlpRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8aW50Pjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTI4NTEsOCArMjkyNSwyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWlFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxpbnQ+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWlFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWlFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWlFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTx1bnNpZ25lZCBpbnQ+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJakU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGludD46Oih1bm5hbWVkKSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0yODY4LDggKzI5NTYsMjIgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlqRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dW5zaWduZWQgaW50Pjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlqRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlqRTYkdmFsdWVFIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlqRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8bG9uZz46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlsRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8bG9uZz46Oih1bm5hbWVkKSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0yODg1LDggKzI5ODcsMjIgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlsRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8bG9uZz46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJbEU2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJbEU2JHZhbHVlRSIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJbEU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGxvbmc+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJbUU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGxvbmc+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMjkwMiw4ICszMDE4LDIyIEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJbUU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGxvbmc+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SW1FNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SW1FNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SW1FNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxzaG9ydD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlzRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8c2hvcnQ+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMjkxOSw4ICszMDQ5LDIyIEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJc0U2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHNob3J0Pjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlzRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlzRTYkdmFsdWVFIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlzRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dW5zaWduZWQgc2hvcnQ+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJdEU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIHNob3J0Pjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTI5MzYsOCArMzA4MCwyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXRFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTx1bnNpZ25lZCBzaG9ydD46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJdEU2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJdEU2JHZhbHVlRSIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJdEU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHZvaWQ+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJdkU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHZvaWQ+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMjk1Myw4ICszMTExLDIyIEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJdkU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHZvaWQ+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXZFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXZFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXZFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxsb25nIGxvbmc+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJeEU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGxvbmcgbG9uZz46Oih1bm5hbWVkKSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0yOTcwLDggKzMxNDIsMjIgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl4RTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8bG9uZyBsb25nPjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl4RTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl4RTYkdmFsdWVFIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl4RTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dW5zaWduZWQgbG9uZyBsb25nPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXlFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTx1bnNpZ25lZCBsb25nIGxvbmc+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMjk4NywxMCArMzE3Myw5IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJeUU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGxvbmcgbG9uZz46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJeUU2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJeUU2JHZhbHVlRSIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJeUU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAogICAgInNpemUiIDogNCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKICAgfSwKICAgewpAQCAtMzAwNCw4ICszMTg5LDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8YW5kcm9pZDo6c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mbz46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUU2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUU2JHZhbHVlRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zMDIxLDggKzMyMDQsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxhbmRyb2lkOjpMb29wZXI6Ok1lc3NhZ2VFbnZlbG9wZT46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUU2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUU2JHZhbHVlRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zMDM4LDggKzMyMTksNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySU5TXzZMb29wZXI4UmVzcG9uc2VFRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8YW5kcm9pZDo6TG9vcGVyOjpSZXNwb25zZT46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJTlNfNkxvb3BlcjhSZXNwb25zZUVFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySU5TXzZMb29wZXI4UmVzcG9uc2VFRTYkdmFsdWVFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTMwNTUsOCArMzIzNCwzNyBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWJFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjxib29sPjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckliRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckliRTYkdmFsdWVFIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGJvb2w+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJYkU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGJvb2w+OjoodW5uYW1lZCkiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWJFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxjaGFyPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWNFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxjaGFyPjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTMwNzIsOCArMzI4MCwyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWNFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxjaGFyPjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckljRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckljRTYkdmFsdWVFIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckljRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8ZG91YmxlPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWRFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjxkb3VibGU+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMzA4OSw4ICszMzExLDIyIEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJZEU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGRvdWJsZT46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJZEU2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJZEU2JHZhbHVlRSIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJZEU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGZsb2F0Pjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWZFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxmbG9hdD46Oih1bm5hbWVkKSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zMTA2LDggKzMzNDIsMjIgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklmRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8ZmxvYXQ+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWZFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWZFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWZFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBjaGFyPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWhFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBjaGFyPjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTMxMjMsOCArMzM3MywyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWhFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBjaGFyPjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckloRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckloRTYkdmFsdWVFIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckloRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8aW50Pjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWlFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxpbnQ+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMzE0MCw4ICszNDA0LDIyIEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJaUU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGludD46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJaUU2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJaUU2JHZhbHVlRSIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJaUU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHVuc2lnbmVkIGludD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklqRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgaW50Pjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTMxNTcsOCArMzQzNSwyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWpFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBpbnQ+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWpFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWpFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWpFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjxsb25nPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWxFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjxsb25nPjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTMxNzQsOCArMzQ2NiwyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWxFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjxsb25nPjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklsRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklsRTYkdmFsdWVFIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklsRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgbG9uZz46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckltRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgbG9uZz46Oih1bm5hbWVkKSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zMTkxLDggKzM0OTcsMjIgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckltRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgbG9uZz46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJbUU2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJbUU2JHZhbHVlRSIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJbUU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHNob3J0Pjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXNFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxzaG9ydD46Oih1bm5hbWVkKSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zMjA4LDggKzM1MjgsMjIgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklzRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8c2hvcnQ+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXNFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXNFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXNFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBzaG9ydD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl0RTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgc2hvcnQ+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMzIyNSw4ICszNTU5LDIyIEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJdEU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHVuc2lnbmVkIHNob3J0Pjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl0RTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl0RTYkdmFsdWVFIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl0RTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dm9pZD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl2RTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dm9pZD46Oih1bm5hbWVkKSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zMjQyLDggKzM1OTAsMjIgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl2RTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dm9pZD46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJdkU2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJdkU2JHZhbHVlRSIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJdkU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGxvbmcgbG9uZz46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl4RTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8bG9uZyBsb25nPjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTMyNTksOCArMzYyMSwyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXhFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjxsb25nIGxvbmc+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXhFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXhFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXhFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBsb25nIGxvbmc+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJeUU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHVuc2lnbmVkIGxvbmcgbG9uZz46Oih1bm5hbWVkKSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zMjc2LDEwICszNjUyLDkgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl5RTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgbG9uZyBsb25nPjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl5RTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl5RTYkdmFsdWVFIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl5RTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCiAgICAic2l6ZSIgOiA0LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgogICB9LAogICB7CkBAIC0zMjkzLDggKzM2NjgsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxhbmRyb2lkOjpzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvPjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRTYkdmFsdWVFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTMzMTAsOCArMzY4Myw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGFuZHJvaWQ6Okxvb3Blcjo6TWVzc2FnZUVudmVsb3BlPjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklOU182TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklOU182TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFRTYkdmFsdWVFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTMzMjcsOCArMzY5OCw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJTlNfNkxvb3BlcjhSZXNwb25zZUVFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxhbmRyb2lkOjpMb29wZXI6OlJlc3BvbnNlPjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklOU182TG9vcGVyOFJlc3BvbnNlRUU2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJTlNfNkxvb3BlcjhSZXNwb25zZUVFNiR2YWx1ZUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMzM0NCw4ICszNzEzLDM3IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJYkU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGJvb2w+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWJFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWJFNiR2YWx1ZUUiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8Ym9vbD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckliRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8Ym9vbD46Oih1bm5hbWVkKSIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJYkU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGNoYXI+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJY0U2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGNoYXI+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMzM2MSw4ICszNzU5LDIyIEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJY0U2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGNoYXI+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWNFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWNFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWNFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxkb3VibGU+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJZEU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGRvdWJsZT46Oih1bm5hbWVkKSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zMzc4LDggKzM3OTAsMjIgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklkRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8ZG91YmxlPjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklkRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklkRTYkdmFsdWVFIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklkRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8ZmxvYXQ+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJZkU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGZsb2F0Pjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTMzOTUsOCArMzgyMSwyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWZFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxmbG9hdD46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJZkU2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJZkU2JHZhbHVlRSIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJZkU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHVuc2lnbmVkIGNoYXI+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJaEU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHVuc2lnbmVkIGNoYXI+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMzQxMiw4ICszODUyLDIyIEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJaEU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHVuc2lnbmVkIGNoYXI+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWhFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWhFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWhFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxpbnQ+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJaUU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGludD46Oih1bm5hbWVkKSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zNDI5LDggKzM4ODMsMjIgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklpRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8aW50Pjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklpRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklpRTYkdmFsdWVFIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklpRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgaW50Pjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWpFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBpbnQ+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMzQ0Niw4ICszOTE0LDIyIEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJakU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHVuc2lnbmVkIGludD46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJakU2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJakU2JHZhbHVlRSIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJakU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGxvbmc+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJbEU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGxvbmc+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMzQ2Myw4ICszOTQ1LDIyIEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJbEU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGxvbmc+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWxFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWxFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWxFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBsb25nPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySW1FNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBsb25nPjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTM0ODAsOCArMzk3NiwyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySW1FNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBsb25nPjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckltRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckltRTYkdmFsdWVFIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckltRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8c2hvcnQ+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJc0U2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHNob3J0Pjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTM0OTcsOCArNDAwNywyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXNFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxzaG9ydD46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJc0U2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJc0U2JHZhbHVlRSIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJc0U2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHVuc2lnbmVkIHNob3J0Pjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXRFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBzaG9ydD46Oih1bm5hbWVkKSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zNTE0LDggKzQwMzgsMjIgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl0RTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgc2hvcnQ+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXRFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXRFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXRFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx2b2lkPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXZFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx2b2lkPjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTM1MzEsOCArNDA2OSwyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXZFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx2b2lkPjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl2RTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl2RTYkdmFsdWVFIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl2RTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8bG9uZyBsb25nPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXhFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxsb25nIGxvbmc+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMzU0OCw4ICs0MTAwLDIyIEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJeEU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGxvbmcgbG9uZz46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJeEU2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJeEU2JHZhbHVlRSIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJeEU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHVuc2lnbmVkIGxvbmcgbG9uZz46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl5RTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dW5zaWduZWQgbG9uZyBsb25nPjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTM1NjUsMTAgKzQxMzEsOSBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXlFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBsb25nIGxvbmc+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXlFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXlFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXlFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKICAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCiAgIH0sCiAgIHsKQEAgLTM1ODIsOCArNDE0Nyw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGFuZHJvaWQ6OnN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm8+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFNiR2YWx1ZUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMzU5OSw4ICs0MTYyLDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlOU182TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8YW5kcm9pZDo6TG9vcGVyOjpNZXNzYWdlRW52ZWxvcGU+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFNiR2YWx1ZUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMzYxNiw4ICs0MTc3LDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlOU182TG9vcGVyOFJlc3BvbnNlRUU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGFuZHJvaWQ6Okxvb3Blcjo6UmVzcG9uc2U+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSU5TXzZMb29wZXI4UmVzcG9uc2VFRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlOU182TG9vcGVyOFJlc3BvbnNlRUU2JHZhbHVlRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zNjMzLDggKzQxOTIsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSU5TXzdTdHJpbmc4RUU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGFuZHJvaWQ6OlN0cmluZzg+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSU5TXzdTdHJpbmc4RUU2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfN1N0cmluZzhFRTYkdmFsdWVFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMzY0NSwxNSArNDIwMiwyOSBAQAogICAgWwogICAgIHsKICAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxhbmRyb2lkOjpTdHJpbmc4Pjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSU5TXzdTdHJpbmc4RUU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGFuZHJvaWQ6OlN0cmluZzg+OjoodW5uYW1lZCkiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSU5TXzdTdHJpbmc4RUU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCiAgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8YW5kcm9pZDo6U3RyaW5nMTY+Ojp2YWx1ZSIKICAgICB9CiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfOFN0cmluZzE2RUU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGFuZHJvaWQ6OlN0cmluZzE2Pjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlOU184U3RyaW5nMTZFRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlOU184U3RyaW5nMTZFRTYkdmFsdWVFIiwKICAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCiAgIH0sCiAgIHsKQEAgLTM2NjcsOCArNDIzOCwzNyBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWJFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxib29sPjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUliRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUliRTYkdmFsdWVFIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGJvb2w+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJYkU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGJvb2w+OjoodW5uYW1lZCkiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWJFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxjaGFyPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWNFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxjaGFyPjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTM2ODQsOCArNDI4NCwyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWNFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxjaGFyPjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUljRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUljRTYkdmFsdWVFIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUljRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8ZG91YmxlPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWRFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxkb3VibGU+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMzcwMSw4ICs0MzE1LDIyIEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJZEU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGRvdWJsZT46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJZEU2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJZEU2JHZhbHVlRSIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJZEU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGZsb2F0Pjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWZFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxmbG9hdD46Oih1bm5hbWVkKSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zNzE4LDggKzQzNDYsMjIgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlmRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8ZmxvYXQ+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWZFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWZFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWZFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBjaGFyPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWhFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBjaGFyPjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTM3MzUsOCArNDM3NywyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWhFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBjaGFyPjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUloRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUloRTYkdmFsdWVFIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUloRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8aW50Pjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWlFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxpbnQ+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMzc1Miw4ICs0NDA4LDIyIEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJaUU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGludD46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJaUU2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJaUU2JHZhbHVlRSIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJaUU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHVuc2lnbmVkIGludD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlqRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8dW5zaWduZWQgaW50Pjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTM3NjksOCArNDQzOSwyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWpFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBpbnQ+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWpFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWpFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWpFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxsb25nPjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWxFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxsb25nPjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTM3ODYsOCArNDQ3MCwyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWxFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxsb25nPjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlsRTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlsRTYkdmFsdWVFIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlsRTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8dW5zaWduZWQgbG9uZz46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUltRTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8dW5zaWduZWQgbG9uZz46Oih1bm5hbWVkKSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zODAzLDggKzQ1MDEsMjIgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUltRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8dW5zaWduZWQgbG9uZz46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJbUU2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJbUU2JHZhbHVlRSIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJbUU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHNob3J0Pjo6dmFsdWUiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXNFNiR2YWx1ZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxzaG9ydD46Oih1bm5hbWVkKSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zODIwLDggKzQ1MzIsMjIgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlzRTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8c2hvcnQ+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXNFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXNFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXNFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBzaG9ydD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl0RTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8dW5zaWduZWQgc2hvcnQ+OjoodW5uYW1lZCkiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMzgzNyw4ICs0NTYzLDIyIEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJdEU2JHZhbHVlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHVuc2lnbmVkIHNob3J0Pjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl0RTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl0RTYkdmFsdWVFIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl0RTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8dm9pZD46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl2RTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8dm9pZD46Oih1bm5hbWVkKSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zODU0LDggKzQ1OTQsMjIgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl2RTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8dm9pZD46Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJdkU2JHZhbHVlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJdkU2JHZhbHVlRSIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJdkU2JHZhbHVlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGxvbmcgbG9uZz46OnZhbHVlIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl4RTYkdmFsdWVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8bG9uZyBsb25nPjo6KHVubmFtZWQpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTM4NzEsOCArNDYyNSwyMiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXhFNiR2YWx1ZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxsb25nIGxvbmc+OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXhFNiR2YWx1ZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXhFNiR2YWx1ZUUiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXhFNiR2YWx1ZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJlbnVtX2ZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImVudW1fZmllbGRfdmFsdWUiIDogMSwKKyAgICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx1bnNpZ25lZCBsb25nIGxvbmc+Ojp2YWx1ZSIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJeUU2JHZhbHVlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHVuc2lnbmVkIGxvbmcgbG9uZz46Oih1bm5hbWVkKSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC0zODg4LDEwICs0NjU2LDkgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl5RTYkdmFsdWVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8dW5zaWduZWQgbG9uZyBsb25nPjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl5RTYkdmFsdWVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl5RTYkdmFsdWVFIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl5RTYkdmFsdWVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCiAgICAic2l6ZSIgOiA0LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgogICB9LAogICB7CkBAIC0zOTA5LDggKzQ2NzYsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDVNdXRleDgkUFJJVkFURUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6Ok11dGV4OjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDVNdXRleDgkUFJJVkFURUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDVNdXRleDgkUFJJVkFURUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9NdXRleC5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMzk0Miw4ICs0NzA3LDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ2TG9vcGVyMTIkRVZFTlRfRVJST1JFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpMb29wZXI6Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNkxvb3BlcjEyJEVWRU5UX0VSUk9SRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNkxvb3BlcjEyJEVWRU5UX0VSUk9SRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0xvb3Blci5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtMzk3MSw4ICs0NzM0LDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ2TG9vcGVyMTQkUE9MTF9DQUxMQkFDS0UiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6Okxvb3Blcjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2TG9vcGVyMTQkUE9MTF9DQUxMQkFDS0UiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZMb29wZXIxNCRQT0xMX0NBTExCQUNLRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0xvb3Blci5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElpIgpAQCAtMzk4OCw4ICs0NzQ5LDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ2TG9vcGVyMjgkUFJFUEFSRV9BTExPV19OT05fQ0FMTEJBQ0tTRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6TG9vcGVyOjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZMb29wZXIyOCRQUkVQQVJFX0FMTE9XX05PTl9DQUxMQkFDS1NFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2TG9vcGVyMjgkUFJFUEFSRV9BTExPV19OT05fQ0FMTEJBQ0tTRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0xvb3Blci5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtNDAwOSw4ICs0NzY4LDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ2UldMb2NrOCRQUklWQVRFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6UldMb2NrOjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZSV0xvY2s4JFBSSVZBVEVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2UldMb2NrOCRQUklWQVRFRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JXTG9jay5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtNDA0Miw4ICs0Nzk5LDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ2dHJhaXRzSU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFMTckaGFzX3RyaXZpYWxfY29weUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0czxhbmRyb2lkOjpzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvPjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2dHJhaXRzSU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFMTckaGFzX3RyaXZpYWxfY29weUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZ0cmFpdHNJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUUxNyRoYXNfdHJpdmlhbF9jb3B5RSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC00MDc1LDggKzQ4MzAsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDZ0cmFpdHNJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUUxNyRoYXNfdHJpdmlhbF9jb3B5RSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRzPGFuZHJvaWQ6Okxvb3Blcjo6TWVzc2FnZUVudmVsb3BlPjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2dHJhaXRzSU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFMTckaGFzX3RyaXZpYWxfY29weUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZ0cmFpdHNJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUUxNyRoYXNfdHJpdmlhbF9jb3B5RSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCkBAIC00MTA4LDggKzQ4NjEsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDZ0cmFpdHNJTlNfNkxvb3BlcjhSZXNwb25zZUVFMTckaGFzX3RyaXZpYWxfY29weUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0czxhbmRyb2lkOjpMb29wZXI6OlJlc3BvbnNlPjo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2dHJhaXRzSU5TXzZMb29wZXI4UmVzcG9uc2VFRTE3JGhhc190cml2aWFsX2NvcHlFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2dHJhaXRzSU5TXzZMb29wZXI4UmVzcG9uc2VFRTE3JGhhc190cml2aWFsX2NvcHlFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTQxNDEsOCArNDg5Miw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkN0ZpbGVNYXA5TWFwQWR2aWNlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6RmlsZU1hcDo6TWFwQWR2aWNlIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3RmlsZU1hcDlNYXBBZHZpY2VFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3RmlsZU1hcDlNYXBBZHZpY2VFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvRmlsZU1hcC5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtNDE1OSw4ICs0OTA4LDQ3IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2UxNyRGSVJTVF9JTkNfU1RST05HRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6KHVubmFtZWQpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZTE3JEZJUlNUX0lOQ19TVFJPTkdFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZTE3JEZJUlNUX0lOQ19TVFJPTkdFIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIiwKKyAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgorICB9LAorICB7CisgICAiYWNjZXNzIiA6ICJwcm90ZWN0ZWQiLAorICAgImFsaWdubWVudCIgOiA0LAorICAgImVudW1fZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6RklSU1RfSU5DX1NUUk9ORyIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2UxNyRGSVJTVF9JTkNfU1RST05HRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6KHVubmFtZWQpIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZTE3JEZJUlNUX0lOQ19TVFJPTkdFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiLAorICAgInVuZGVybHlpbmdfdHlwZSIgOiAiX1pUSWoiCisgIH0sCisgIHsKKyAgICJhY2Nlc3MiIDogInByb3RlY3RlZCIsCisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZW51bV9maWVsZHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDAsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlOjpPQkpFQ1RfTElGRVRJTUVfU1RST05HIgorICAgIH0sCisgICAgeworICAgICAiZW51bV9maWVsZF92YWx1ZSIgOiAxLAorICAgICAibmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6T0JKRUNUX0xJRkVUSU1FX1dFQUsiCisgICAgfSwKKyAgICB7CisgICAgICJlbnVtX2ZpZWxkX3ZhbHVlIiA6IDEsCisgICAgICJuYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlOjpPQkpFQ1RfTElGRVRJTUVfTUFTSyIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2UyMSRPQkpFQ1RfTElGRVRJTUVfTUFTS0UiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6Oih1bm5hbWVkKSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTQxODUsMTAgKzQ5NzMsOSBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDdSZWZCYXNlMjEkT0JKRUNUX0xJRkVUSU1FX01BU0tFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlOjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdSZWZCYXNlMjEkT0JKRUNUX0xJRkVUSU1FX01BU0tFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZTIxJE9CSkVDVF9MSUZFVElNRV9NQVNLRSIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2UyMSRPQkpFQ1RfTElGRVRJTUVfTUFTS0UjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKICAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgogICB9LAogICB7CkBAIC00MjA2LDggKzQ5OTMsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDlDb25kaXRpb24xMFdha2VVcFR5cGVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpDb25kaXRpb246Oldha2VVcFR5cGUiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDlDb25kaXRpb24xMFdha2VVcFR5cGVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ5Q29uZGl0aW9uMTBXYWtlVXBUeXBlRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0NvbmRpdGlvbi5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtNDIyNyw4ICs1MDEyLDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ5Q29uZGl0aW9uOCRQUklWQVRFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6Q29uZGl0aW9uOjoodW5uYW1lZCkiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDlDb25kaXRpb244JFBSSVZBVEVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ5Q29uZGl0aW9uOCRQUklWQVRFRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0NvbmRpdGlvbi5oIiwKICAgICJ1bmRlcmx5aW5nX3R5cGUiIDogIl9aVElqIgpAQCAtNDI0NSw4ICs1MDI4LDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ5RmRQcmludGVyMTgkTUFYX0ZPUk1BVF9TVFJJTkdFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpGZFByaW50ZXI6Oih1bm5hbWVkKSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkOUZkUHJpbnRlcjE4JE1BWF9GT1JNQVRfU1RSSU5HRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkOUZkUHJpbnRlcjE4JE1BWF9GT1JNQVRfU1RSSU5HRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ByaW50ZXIuaCIsCiAgICAidW5kZXJseWluZ190eXBlIiA6ICJfWlRJaiIKQEAgLTQyNzksOSArNTA2MCw3IEBACiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQUHYiCiAgICAgfQogICAgXSwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElGaVBGaVB2RVNfUEtjaWpQU19FIiwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUZpUEZpUHZFU19QS2NpalBTX0UiLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0FuZHJvaWRUaHJlYWRzLmgiCiAgIH0sCiAgIHsKQEAgLTQyOTcsMTAgKzUwNzYsOCBAQAogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEt2IgogICAgIH0KICAgIF0sCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJRmlQS3ZTMF9FIiwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUZpUEt2UzBfRSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKQEAgLTQzMTgsMTAgKzUwOTUsOCBAQAogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUHYiCiAgICAgfQogICAgXSwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElGaVBLdlMwX1B2RSIsCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElGaVBLdlMwX1B2RSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKQEAgLTQzMzMsOSArNTEwOCw3IEBACiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIKICAgICB9CiAgICBdLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUZpUHZFIiwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUZpUHZFIiwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9BbmRyb2lkVGhyZWFkcy5oIgogICB9LAogICB7CkBAIC00MzU0LDE4ICs1MTI3LDE0IEBACiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIKICAgICB9CiAgICBdLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUZpaWlQdkUiLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJRmlpaVB2RSIsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElGdnZFIiwKICAgICJuYW1lIiA6ICJ2b2lkICgpIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElGdnZFIiwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUZ2dkUiLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL21pc2MuaCIKICAgfQogIF0sCkBAIC00NDc3LDcgKzUyNDYsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6OnNldENhcGFjaXR5IiwKQEAgLTQ0OTMsNyArNTI2Miw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6YXBwZW5kVmVjdG9yIiwKQEAgLTQ1MDksNyArNTI3OCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6ZWRpdEFycmF5SW1wbCIsCkBAIC00NTIyLDcgKzUyOTEsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElQdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjpmaW5pc2hfdmVjdG9yIiwKQEAgLTQ1MzUsNyArNTMwNCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6aW5zZXJ0QXJyYXlBdCIsCkBAIC00NTU3LDcgKzUzMjYsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6OnJlbW92ZUl0ZW1zQXQiLApAQCAtNDU3Nyw3ICs1MzQ2LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjppbnNlcnRWZWN0b3JBdCIsCkBAIC00NTk2LDcgKzUzNjUsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJvdGVjdGVkIiwKQEAgLTQ2MTAsNyArNTM3OSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6ZWRpdEl0ZW1Mb2NhdGlvbiIsCkBAIC00NjI2LDcgKzUzOTUsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElQdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjphZGQiLApAQCAtNDY0Miw3ICs1NDExLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjphZGQiLApAQCAtNDY1NSw3ICs1NDI0LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjpwb3AiLApAQCAtNDY2OCw3ICs1NDM3LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjpwdXNoIiwKQEAgLTQ2ODQsNyArNTQ1Myw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6cHVzaCIsCkBAIC00Njk3LDcgKzU0NjYsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6OnNvcnQiLApAQCAtNDcxMyw3ICs1NDgyLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjpzb3J0IiwKQEAgLTQ3MzIsNyArNTUwMSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKQEAgLTQ3NTIsNyArNTUyMSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVB2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6OmNsZWFyIiwKQEAgLTQ3NjUsNyArNTUzNCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6cmVzaXplIiwKQEAgLTQ3ODEsNyArNTU1MCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKQEAgLTQ4MDEsNyArNTU3MCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6aW5zZXJ0QXQiLApAQCAtNDgyNCw3ICs1NTkzLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjppbnNlcnRBdCIsCkBAIC00ODQ0LDcgKzU2MTMsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6OnJlcGxhY2VBdCIsCkBAIC00ODYzLDcgKzU2MzIsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6OnJlcGxhY2VBdCIsCkBAIC00ODc5LDcgKzU2NDgsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6OlZlY3RvckltcGwiLApAQCAtNDg5NSw3ICs1NjY0LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjpWZWN0b3JJbXBsIiwKQEAgLTQ5MTQsNyArNTY4Myw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6flZlY3RvckltcGwiLApAQCAtNDkyNyw3ICs1Njk2LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsOjp+VmVjdG9ySW1wbCIsCkBAIC00OTQwLDcgKzU3MDksNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGw6On5WZWN0b3JJbXBsIiwKQEAgLTQ5NTMsNyArNTcyMiw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6b3BlcmF0b3I9IiwKQEAgLTQ5NjksNyArNTczOCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVJON2FuZHJvaWQxMFZlY3RvckltcGxFIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OnVwdGltZU5hbm9zIiwKQEAgLTUyNzAsNyArNjAzOSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSU5TdDNfXzExMmJhc2ljX3N0cmluZ0ljTlNfMTFjaGFyX3RyYWl0c0ljRUVOU185YWxsb2NhdG9ySWNFRUVFIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9FcnJvcnMuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvRXJyb3JzLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjplbGFwc2VkUmVhbHRpbWUiLApAQCAtNTI5Miw3ICs2MDYxLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTb3J0ZWRWZWN0b3JJbXBsOjptZXJnZSIsCkBAIC01MzA4LDcgKzYwNzcsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlNvcnRlZFZlY3RvckltcGw6Om1lcmdlIiwKQEAgLTUzMjQsNyArNjA5Myw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U29ydGVkVmVjdG9ySW1wbDo6cmVtb3ZlIiwKQEAgLTUzNDAsNyArNjEwOSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U29ydGVkVmVjdG9ySW1wbDo6U29ydGVkVmVjdG9ySW1wbCIsCkBAIC01MzU2LDcgKzYxMjUsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlNvcnRlZFZlY3RvckltcGw6OlNvcnRlZFZlY3RvckltcGwiLApAQCAtNTM3NSw3ICs2MTQ0LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTb3J0ZWRWZWN0b3JJbXBsOjp+U29ydGVkVmVjdG9ySW1wbCIsCkBAIC01Mzg4LDcgKzYxNTcsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlNvcnRlZFZlY3RvckltcGw6On5Tb3J0ZWRWZWN0b3JJbXBsIiwKQEAgLTU0MDEsNyArNjE3MCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U29ydGVkVmVjdG9ySW1wbDo6flNvcnRlZFZlY3RvckltcGwiLApAQCAtNTQxNCw3ICs2MTgzLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTb3J0ZWRWZWN0b3JJbXBsOjpvcGVyYXRvcj0iLApAQCAtNTQzMCw3ICs2MTk5LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJUk43YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6SmVua2luc0hhc2hXaGl0ZW4iLApAQCAtNTY5NCw2ICs2NDYzLDEwOSBAQAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL21pc2MuaCIKICAgfSwKICAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OnNwPGFuZHJvaWQ6Okxvb3BlckNhbGxiYWNrPjo6Y2xlYXIiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWk43YW5kcm9pZDJzcElOU18xNExvb3BlckNhbGxiYWNrRUU1Y2xlYXJFdiIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkMnNwSU5TXzE0TG9vcGVyQ2FsbGJhY2tFRUUiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaCIKKyAgfSwKKyAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OnNwPGFuZHJvaWQ6Okxvb3BlckNhbGxiYWNrPjo6b3BlcmF0b3I9IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pON2FuZHJvaWQyc3BJTlNfMTRMb29wZXJDYWxsYmFja0VFYVNFUktTMl8iLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDJzcElOU18xNExvb3BlckNhbGxiYWNrRUVFIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQyc3BJTlNfMTRMb29wZXJDYWxsYmFja0VFRSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJUk43YW5kcm9pZDJzcElOU18xNExvb3BlckNhbGxiYWNrRUVFIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpzcDxhbmRyb2lkOjpMb29wZXI+Ojp+c3AiLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWk43YW5kcm9pZDJzcElOU182TG9vcGVyRUVEMkV2IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQyc3BJTlNfNkxvb3BlckVFRSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6c3A8YW5kcm9pZDo6TG9vcGVyPjo6b3BlcmF0b3I9IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pON2FuZHJvaWQyc3BJTlNfNkxvb3BlckVFYVNFT1MyXyIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkMnNwSU5TXzZMb29wZXJFRUUiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElPTjdhbmRyb2lkMnNwSU5TXzZMb29wZXJFRUUiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVJON2FuZHJvaWQyc3BJTlNfNkxvb3BlckVFRSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6c3A8YW5kcm9pZDo6TG9vcGVyPjo6b3BlcmF0b3I9IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pON2FuZHJvaWQyc3BJTlNfNkxvb3BlckVFYVNFUktTMl8iLAorICAgInBhcmFtZXRlcnMiIDoKKyAgIFsKKyAgICB7CisgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDJzcElOU182TG9vcGVyRUVFIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQyc3BJTlNfNkxvb3BlckVFRSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJUk43YW5kcm9pZDJzcElOU182TG9vcGVyRUVFIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiCisgIH0sCisgIHsKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpzcDxhbmRyb2lkOjpUaHJlYWQ+OjpjbGVhciIsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aTjdhbmRyb2lkMnNwSU5TXzZUaHJlYWRFRTVjbGVhckV2IiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQyc3BJTlNfNlRocmVhZEVFRSIKKyAgICB9CisgICBdLAorICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgorICB9LAorICB7CisgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6c3A8YW5kcm9pZDo6VGhyZWFkPjo6b3BlcmF0b3I9IiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pON2FuZHJvaWQyc3BJTlNfNlRocmVhZEVFYVNFT1MyXyIsCisgICAicGFyYW1ldGVycyIgOgorICAgWworICAgIHsKKyAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkMnNwSU5TXzZUaHJlYWRFRUUiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElPTjdhbmRyb2lkMnNwSU5TXzZUaHJlYWRFRUUiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVJON2FuZHJvaWQyc3BJTlNfNlRocmVhZEVFRSIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgorICB9LAorICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6TGlnaHRSZWZCYXNlX3JlcG9ydEluY1N0cm9uZ1JlcXVpcmVTdHJvbmdGYWlsZWQiLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWk43YW5kcm9pZDQ3TGlnaHRSZWZCYXNlX3JlcG9ydEluY1N0cm9uZ1JlcXVpcmVTdHJvbmdGYWlsZWRFUEt2IiwKICAgICJwYXJhbWV0ZXJzIiA6CkBAIC01NzA2LDEzICs2NTc4LDYgQEAKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9MaWdodFJlZkJhc2UuaCIKICAgfSwKICAgewotICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCi0gICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6TG9vcGVyOjppbml0VExTS2V5IiwKLSAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pON2FuZHJvaWQ2TG9vcGVyMTBpbml0VExTS2V5RXYiLAotICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTG9vcGVyLmgiCi0gIH0sCi0gIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpMb29wZXI6OnNlbmRNZXNzYWdlIiwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pON2FuZHJvaWQ2TG9vcGVyMTFzZW5kTWVzc2FnZUVSS05TXzJzcElOU18xNE1lc3NhZ2VIYW5kbGVyRUVFUktOU183TWVzc2FnZUUiLAogICAgInBhcmFtZXRlcnMiIDoKQEAgLTU3ODUsMTYgKzY2NTAsMzEgQEAKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Mb29wZXIuaCIKICAgfSwKICAgewotICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCi0gICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6TG9vcGVyOjp0aHJlYWREZXN0cnVjdG9yIiwKLSAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pON2FuZHJvaWQ2TG9vcGVyMTZ0aHJlYWREZXN0cnVjdG9yRVB2IiwKKyAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpMb29wZXI6OmdldEZkU3RhdGVEZWJ1ZyIsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aTjdhbmRyb2lkNkxvb3BlcjE1Z2V0RmRTdGF0ZURlYnVnRWlQaVMxX1BOU18yc3BJTlNfMTRMb29wZXJDYWxsYmFja0VFRVBQdiIsCiAgICAicGFyYW1ldGVycyIgOgogICAgWwogICAgIHsKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVB2IgorICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ2TG9vcGVyRSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfSwKKyAgICB7CisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQaSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBpIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDJzcElOU18xNExvb3BlckNhbGxiYWNrRUVFIgorICAgIH0sCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUFB2IgogICAgIH0KICAgIF0sCi0gICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWIiLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0xvb3Blci5oIgogICB9LAogICB7CkBAIC01OTcwLDYgKzY4NTAsMjIgQEAKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Mb29wZXIuaCIKICAgfSwKICAgeworICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6Okxvb3Blcjo6cmVwb2xsIiwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pON2FuZHJvaWQ2TG9vcGVyNnJlcG9sbEVpIiwKKyAgICJwYXJhbWV0ZXJzIiA6CisgICBbCisgICAgeworICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ2TG9vcGVyRSIKKyAgICB9LAorICAgIHsKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiCisgICAgfQorICAgXSwKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0xvb3Blci5oIgorICB9LAorICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6TG9vcGVyOjpwb2xsQWxsIiwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pON2FuZHJvaWQ2TG9vcGVyN3BvbGxBbGxFaVBpUzFfUFB2IiwKICAgICJwYXJhbWV0ZXJzIiA6CkBAIC02NTA3LDExICs3NDAzLDExIEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJhY2Nlc3MiIDogInByaXZhdGUiLApAQCAtNjUyNyw3ICs3NDIzLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJhY2Nlc3MiIDogInByaXZhdGUiLApAQCAtNjUzNiw3ICs3NDMyLDcgQEAKICAgICJwYXJhbWV0ZXJzIiA6CiAgICBbCiAgICAgewotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLdiIKQEAgLTY1NDYsNyArNzQ0Miw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKQEAgLTY1NTUsNyArNzQ1MSw3IEBACiAgICAicGFyYW1ldGVycyIgOgogICAgWwogICAgIHsKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLdiIKQEAgLTY1NjUsNyArNzQ2MSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6d2Vha3JlZl90eXBlOjphdHRlbXB0SW5jV2VhayIsCkBAIC02NTc0LDE0ICs3NDcwLDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS3YiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWIiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6d2Vha3JlZl90eXBlOjphdHRlbXB0SW5jU3Ryb25nIiwKQEAgLTY1OTAsMTQgKzc0ODYsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLdiIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJYiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlOjp3ZWFrcmVmX3R5cGU6OmluY1dlYWtSZXF1aXJlV2VhayIsCkBAIC02NjA2LDE0ICs3NTAyLDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS3YiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6d2Vha3JlZl90eXBlOjpkZWNXZWFrIiwKQEAgLTY2MjIsMTQgKzc1MTgsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLdiIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlOjp3ZWFrcmVmX3R5cGU6OmluY1dlYWsiLApAQCAtNjYzOCwxNCArNzUzNCwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEt2IgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6OndlYWtyZWZfdHlwZTo6dHJhY2tNZSIsCkBAIC02NjU0LDcgKzc1NTAsNyBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJYiIKQEAgLTY2NjQsNyArNzU2MCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcm90ZWN0ZWQiLApAQCAtNjY3NCwxNCArNzU3MCwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS3YiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcm90ZWN0ZWQiLApAQCAtNjY5MSwxNCArNzU4NywxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS3YiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcm90ZWN0ZWQiLApAQCAtNjcwOCwxNCArNzYwNCwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElpIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJvdGVjdGVkIiwKQEAgLTY3MjUsNyArNzYyMSw3IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCkBAIC02NzM1LDcgKzc2MzEsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEliIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJvdGVjdGVkIiwKQEAgLTY3NDUsMTEgKzc2NDEsMTEgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJvdGVjdGVkIiwKQEAgLTY3NTksMTEgKzc2NTUsMTEgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJvdGVjdGVkIiwKQEAgLTY3NzMsMTEgKzc2NjksMTEgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJvdGVjdGVkIiwKQEAgLTY3ODcsMTEgKzc2ODMsMTEgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJvdGVjdGVkIiwKQEAgLTY4MDEsMjcgKzc2OTcsMTEgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCi0gIH0sCi0gIHsKLSAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjphcHBlbmRQYXRoIiwKLSAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pON2FuZHJvaWQ3U3RyaW5nODEwYXBwZW5kUGF0aEVQS2MiLAotICAgInBhcmFtZXRlcnMiIDoKLSAgIFsKLSAgICB7Ci0gICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKLSAgICB9LAotICAgIHsKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKLSAgICB9Ci0gICBdLAotICAgInJldHVybl90eXBlIiA6ICJfWlRJUk43YW5kcm9pZDdTdHJpbmc4RSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4Ojpsb2NrQnVmZmVyIiwKQEAgLTY4MzAsMTQgKzc3MTAsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJUGMiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKQEAgLTY4NDcsNyArNzcyNyw3IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKQEAgLTY4NTcsNyArNzczNyw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6YXBwZW5kRm9ybWF0IiwKQEAgLTY4NjYsMTQgKzc3NDYsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OnVubG9ja0J1ZmZlciIsCkBAIC02ODgyLDE0ICs3NzYyLDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWoiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6dW5sb2NrQnVmZmVyIiwKQEAgLTY4OTgsMTEgKzc3NzgsMTEgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OmFwcGVuZEZvcm1hdFYiLApAQCAtNjkxMSw3ICs3NzkxLDcgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgpAQCAtNjkyMSwyMCArNzgwMSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKLSAgfSwKLSAgewotICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OmNvbnZlcnRUb1Jlc1BhdGgiLAotICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWk43YW5kcm9pZDdTdHJpbmc4MTZjb252ZXJ0VG9SZXNQYXRoRXYiLAotICAgInBhcmFtZXRlcnMiIDoKLSAgIFsKLSAgICB7Ci0gICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKLSAgICB9Ci0gICBdLAotICAgInJldHVybl90eXBlIiA6ICJfWlRJUk43YW5kcm9pZDdTdHJpbmc4RSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpjbGVhciIsCkBAIC02OTQzLDExICs3ODEwLDExIEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpzZXRUbyIsCkBAIC02OTU2LDcgKzc4MjMsNyBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS0RpIgpAQCAtNjk2Niw3ICs3ODMzLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpzZXRUbyIsCkBAIC02OTc1LDcgKzc4NDIsNyBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS0RzIgpAQCAtNjk4NSw3ICs3ODUyLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpzZXRUbyIsCkBAIC02OTk0LDE0ICs3ODYxLDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpzZXRUbyIsCkBAIC03MDEwLDcgKzc4NzcsNyBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCkBAIC03MDIwLDcgKzc4ODcsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OnNldFRvIiwKQEAgLTcwMjksMTQgKzc4OTYsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6YXBwZW5kIiwKQEAgLTcwNDUsMTQgKzc5MTIsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OmFwcGVuZCIsCkBAIC03MDYxLDcgKzc5MjgsNyBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCkBAIC03MDcxLDcgKzc5MzgsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OmFwcGVuZCIsCkBAIC03MDgwLDE0ICs3OTQ3LDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OmZvcm1hdCIsCkBAIC03MDk4LDggKzc5NjUsOCBAQAogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgogICAgIH0KICAgIF0sCi0gICAicmV0dXJuX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3U3RyaW5nOEUiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4Ojpmb3JtYXRWIiwKQEAgLTcxMTMsOCArNzk4MCw4IEBACiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElTdDlfX3ZhX2xpc3QiCiAgICAgfQogICAgXSwKLSAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInJldHVybl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OnRvTG93ZXIiLApAQCAtNzEyMywxMSArNzk5MCwxMSBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6cmVtb3ZlQWxsIiwKQEAgLTcxMzYsMTQgKzgwMDMsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEliIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OlN0cmluZzgiLApAQCAtNzE1MiwxNCArODAxOSwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS0RpIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OlN0cmluZzgiLApAQCAtNzE2OCw3ICs4MDM1LDcgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtEaSIKQEAgLTcxNzgsNyArODA0NSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6U3RyaW5nOCIsCkBAIC03MTg3LDE0ICs4MDU0LDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLRHMiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6U3RyaW5nOCIsCkBAIC03MjAzLDcgKzgwNzAsNyBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS0RzIgpAQCAtNzIxMyw3ICs4MDgwLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpTdHJpbmc4IiwKQEAgLTcyMjIsMTQgKzgwODksMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OlN0cmluZzgiLApAQCAtNzIzOCw3ICs4MTA1LDcgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgpAQCAtNzI0OCw3ICs4MTE1LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpTdHJpbmc4IiwKQEAgLTcyNTcsMTQgKzgxMjQsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQ4U3RyaW5nMTZFIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OlN0cmluZzgiLApAQCAtNzI3MywxNCArODE0MCwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7Ci0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpTdHJpbmc4IiwKQEAgLTcyODksMTEgKzgxNTYsMTEgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OlN0cmluZzgiLApAQCAtNzMwMiwxNCArODE2OSwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS0RpIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OlN0cmluZzgiLApAQCAtNzMxOCw3ICs4MTg1LDcgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtEaSIKQEAgLTczMjgsNyArODE5NSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6U3RyaW5nOCIsCkBAIC03MzM3LDE0ICs4MjA0LDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLRHMiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6U3RyaW5nOCIsCkBAIC03MzUzLDcgKzgyMjAsNyBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS0RzIgpAQCAtNzM2Myw3ICs4MjMwLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpTdHJpbmc4IiwKQEAgLTczNzIsMTQgKzgyMzksMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OlN0cmluZzgiLApAQCAtNzM4OCw3ICs4MjU1LDcgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgpAQCAtNzM5OCw3ICs4MjY1LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpTdHJpbmc4IiwKQEAgLTc0MDcsMTQgKzgyNzQsMTQgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQ4U3RyaW5nMTZFIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OlN0cmluZzgiLApAQCAtNzQyMywxNCArODI5MCwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7Ci0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpTdHJpbmc4IiwKQEAgLTc0MzksMTEgKzgzMDYsMTEgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6On5TdHJpbmc4IiwKQEAgLTc0NTIsMTEgKzgzMTksMTEgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6On5TdHJpbmc4IiwKQEAgLTc0NjUsMTEgKzgzMzIsMTEgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCkBAIC03NDg2LDcgKzgzNTMsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElQdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpyZXBsYWNlQWxsIiwKQEAgLTc1MDUsNyArODM3Miw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhY2Nlc3MiIDogInByaXZhdGUiLApAQCAtNzUyMSw3ICs4Mzg4LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJUERzIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKQEAgLTc1MzcsNyArODQwNCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVBEcyIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCkBAIC03NTUxLDcgKzg0MTgsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElQdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCkBAIC03NTY0LDcgKzg0MzEsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElQdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpzZXRUbyIsCkBAIC03NTgwLDcgKzg0NDcsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OnNldFRvIiwKQEAgLTc1OTksNyArODQ2Niw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6c2V0VG8iLApAQCAtNzYxNSw3ICs4NDgyLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpzZXRUbyIsCkBAIC03NjM4LDcgKzg1MDUsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OmFwcGVuZCIsCkBAIC03NjU3LDcgKzg1MjQsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OmFwcGVuZCIsCkBAIC03NjczLDcgKzg1NDAsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6Omluc2VydCIsCkBAIC03NjkyLDcgKzg1NTksNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6Omluc2VydCIsCkBAIC03NzE0LDcgKzg1ODEsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKQEAgLTc3MjgsNyArODU5NSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhY2Nlc3MiIDogInByaXZhdGUiLApAQCAtNzc0Miw3ICs4NjA5LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpTdHJpbmcxNiIsCkBAIC03NzU4LDcgKzg2MjUsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OlN0cmluZzE2IiwKQEAgLTc3NzQsNyArODY0MSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6U3RyaW5nMTYiLApAQCAtNzc5Myw3ICs4NjYwLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpTdHJpbmcxNiIsCkBAIC03ODA5LDcgKzg2NzYsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OlN0cmluZzE2IiwKQEAgLTc4MjgsNyArODY5NSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6U3RyaW5nMTYiLApAQCAtNzg0MCwxMSArODcwNywxMSBAQAogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDhTdHJpbmcxNkUiCiAgICAgfSwKICAgICB7Ci0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpTdHJpbmcxNiIsCkBAIC03ODYwLDcgKzg3MjcsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OlN0cmluZzE2IiwKQEAgLTc4ODMsNyArODc1MCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6U3RyaW5nMTYiLApAQCAtNzg5Niw3ICs4NzYzLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpTdHJpbmcxNiIsCkBAIC03OTEyLDcgKzg3NzksNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OlN0cmluZzE2IiwKQEAgLTc5MjgsNyArODc5NSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6U3RyaW5nMTYiLApAQCAtNzk0Nyw3ICs4ODE0LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpTdHJpbmcxNiIsCkBAIC03OTYzLDcgKzg4MzAsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OlN0cmluZzE2IiwKQEAgLTc5ODIsNyArODg0OSw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6U3RyaW5nMTYiLApAQCAtNzk5NCwxMSArODg2MSwxMSBAQAogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDhTdHJpbmcxNkUiCiAgICAgfSwKICAgICB7Ci0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpTdHJpbmcxNiIsCkBAIC04MDE0LDcgKzg4ODEsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OlN0cmluZzE2IiwKQEAgLTgwMzcsNyArODkwNCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSXYiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6U3RyaW5nMTYiLApAQCAtODA1MCw3ICs4OTE3LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2Ojp+U3RyaW5nMTYiLApAQCAtODA2Myw3ICs4OTMwLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2Ojp+U3RyaW5nMTYiLApAQCAtODA3Niw3ICs4OTQzLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpvcGVyYXRvcj0iLApAQCAtODA5Miw3ICs4OTU5LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJUk43YW5kcm9pZDhTdHJpbmcxNkUiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpGZFByaW50ZXI6OnByaW50TGluZSIsCkBAIC04NDA2LDE0ICs5MjczLDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElqIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElQS3YiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbDo6Y2FwYWNpdHkiLApAQCAtODQyMiwxMSArOTI4OSwxMSBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDEwVmVjdG9ySW1wbEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDEwVmVjdG9ySW1wbEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElqIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJvdGVjdGVkIiwKQEAgLTg0MzYsMTEgKzkzMDMsMTEgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQxMFZlY3RvckltcGxFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQxMFZlY3RvckltcGxFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJhY2Nlc3MiIDogInByaXZhdGUiLApAQCAtODQ2MSw3ICs5MzI4LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTb3J0ZWRWZWN0b3JJbXBsOjppbmRleE9mIiwKQEAgLTg0NzcsNyArOTM0NCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U29ydGVkVmVjdG9ySW1wbDo6b3JkZXJPZiIsCkBAIC04NDkzLDcgKzkzNjAsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElqIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6Okxvb3Blcjo6Z2V0QWxsb3dOb25DYWxsYmFja3MiLApAQCAtODk3NywxNCArOTg0NCwxNCBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdSZWZCYXNlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1JlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9LAogICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLdiIKICAgICB9CiAgICBdLAotICAgInJldHVybl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6Z2V0V2Vha1JlZnMiLApAQCAtODk5MywxMSArOTg2MCwxMSBAQAogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdSZWZCYXNlRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1JlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9CiAgICBdLAotICAgInJldHVybl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6d2Vha3JlZl90eXBlOjpnZXRXZWFrQ291bnQiLApAQCAtOTAxMCw3ICs5ODc3LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlOjp3ZWFrcmVmX3R5cGU6OnJlZkJhc2UiLApAQCAtOTAyMiw4ICs5ODg5LDggQEAKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUiCiAgICAgfQogICAgXSwKLSAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6d2Vha3JlZl90eXBlOjpwcmludFJlZnMiLApAQCAtOTAzNiw3ICs5OTAzLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJdiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlOjpmb3JjZUluY1N0cm9uZyIsCkBAIC05MDQ1LDE0ICs5OTEyLDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1JlZkJhc2VFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEt2IgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6OmdldFN0cm9uZ0NvdW50IiwKQEAgLTkwNjEsMTEgKzk5MjgsMTEgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3UmVmQmFzZUUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6aW5jU3Ryb25nUmVxdWlyZVN0cm9uZyIsCkBAIC05MDc0LDE0ICs5OTQxLDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1JlZkJhc2VFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEt2IgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6OmRlY1N0cm9uZyIsCkBAIC05MDkwLDE0ICs5OTU3LDE0IEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1JlZkJhc2VFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEt2IgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6OmluY1N0cm9uZyIsCkBAIC05MTA2LDgwICs5OTczLDQyIEBACiAgICBbCiAgICAgewogICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1JlZkJhc2VFIgorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0sCiAgICAgewogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEt2IgogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgeworICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6Z2V0UGF0aERpciIsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aTks3YW5kcm9pZDdTdHJpbmc4MTBnZXRQYXRoRGlyRXYiLAogICAgInBhcmFtZXRlcnMiIDoKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKLSAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgotICB9LAotICB7Ci0gICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6Z2V0QmFzZVBhdGgiLAotICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWk5LN2FuZHJvaWQ3U3RyaW5nODExZ2V0QmFzZVBhdGhFdiIsCi0gICAicGFyYW1ldGVycyIgOgotICAgWwotICAgIHsKLSAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdTdHJpbmc4RSIKLSAgICB9Ci0gICBdLAotICAgInJldHVybl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1N0cmluZzhFIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCi0gIH0sCi0gIHsKLSAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpnZXRQYXRoTGVhZiIsCi0gICAibGlua2VyX3NldF9rZXkiIDogIl9aTks3YW5kcm9pZDdTdHJpbmc4MTFnZXRQYXRoTGVhZkV2IiwKLSAgICJwYXJhbWV0ZXJzIiA6Ci0gICBbCi0gICAgewotICAgICAiaXNfdGhpc19wdHIiIDogdHJ1ZSwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1N0cmluZzhFIgotICAgIH0KLSAgIF0sCi0gICAicmV0dXJuX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3U3RyaW5nOEUiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJhY2Nlc3MiIDogInByaXZhdGUiLAotICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OmZpbmRfZXh0ZW5zaW9uIiwKLSAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pOSzdhbmRyb2lkN1N0cmluZzgxNGZpbmRfZXh0ZW5zaW9uRXYiLAotICAgInBhcmFtZXRlcnMiIDoKLSAgIFsKLSAgICB7Ci0gICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3U3RyaW5nOEUiCi0gICAgfQotICAgXSwKLSAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVBjIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCi0gIH0sCi0gIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpnZXRQYXRoRXh0ZW5zaW9uIiwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pOSzdhbmRyb2lkN1N0cmluZzgxNmdldFBhdGhFeHRlbnNpb25FdiIsCiAgICAicGFyYW1ldGVycyIgOgogICAgWwogICAgIHsKICAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdTdHJpbmc4RSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKICAgICB9CiAgICBdLAotICAgInJldHVybl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1N0cmluZzhFIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAicmV0dXJuX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nODo6ZmluZCIsCkBAIC05MTg4LDcgKzEwMDE3LDcgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfSwKICAgICB7CiAgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS2MiCkBAIC05MTk5LDcgKzEwMDI4LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4OjpsZW5ndGgiLApAQCAtOTIwOCwyOCArMTAwMzcsMTEgQEAKICAgIFsKICAgICB7CiAgICAgICJpc190aGlzX3B0ciIgOiB0cnVlLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWoiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKLSAgfSwKLSAgewotICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzg6OndhbGtQYXRoIiwKLSAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pOSzdhbmRyb2lkN1N0cmluZzg4d2Fsa1BhdGhFUFMwXyIsCi0gICAicGFyYW1ldGVycyIgOgotICAgWwotICAgIHsKLSAgICAgImlzX3RoaXNfcHRyIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdTdHJpbmc4RSIKLSAgICB9LAotICAgIHsKLSAgICAgImRlZmF1bHRfYXJnIiA6IHRydWUsCi0gICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIgotICAgIH0KLSAgIF0sCi0gICAicmV0dXJuX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3U3RyaW5nOEUiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OnN0YXJ0c1dpdGgiLApAQCAtOTI0NSw3ICsxMDA1Nyw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWIiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6c3RhcnRzV2l0aCIsCkBAIC05MjYxLDcgKzEwMDczLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJYiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2Ojppc1N0YXRpY1N0cmluZyIsCkBAIC05Mjc0LDcgKzEwMDg2LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJYiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCkBAIC05Mjg4LDcgKzEwMTAwLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpzaXplIiwKQEAgLTkzMDEsNyArMTAxMTMsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElqIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OmNvbnRhaW5zIiwKQEAgLTkzMTcsNyArMTAxMjksNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEliIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OmZpbmRMYXN0IiwKQEAgLTkzMzMsNyArMTAxNDUsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTY6OmZpbmRGaXJzdCIsCkBAIC05MzQ5LDcgKzEwMTYxLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogImFuZHJvaWQ6OlN0b3BXYXRjaDo6ZWxhcHNlZFRpbWUiLApAQCAtOTU0Miw3ICsxMDM1NCw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWkiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAic3RybGVuMTYiLApAQCAtOTU1NCw3ICsxMDM2Niw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSWoiLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIgogICB9LAogICB7CiAgICAiZnVuY3Rpb25fbmFtZSIgOiAic3RybmNtcDE2IiwKQEAgLTk1NzIsNyArMTAzODQsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogInN0cm5sZW4xNiIsCkBAIC05NTg3LDcgKzEwMzk5LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaiIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJzdHJzdHIxNiIsCkBAIC05NjAyLDcgKzEwNDE0LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJUERzIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogInN0cnpjbXAxNiIsCkBAIC05NjIzLDcgKzEwNDM1LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJzeXN0ZW1UaW1lIiwKQEAgLTk2NzIsNyArMTA0ODQsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogInV0ZjE2X3RvX3V0ZjhfbGVuZ3RoIiwKQEAgLTk2ODcsNyArMTA0OTksNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogInV0ZjMyX2Zyb21fdXRmOF9hdCIsCkBAIC05NzA4LDcgKzEwNTIwLDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJ1dGYzMl90b191dGY4IiwKQEAgLTk3MjksNyArMTA1NDEsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogInV0ZjMyX3RvX3V0ZjhfbGVuZ3RoIiwKQEAgLTk3NDQsNyArMTA1NTYsNyBAQAogICAgIH0KICAgIF0sCiAgICAicmV0dXJuX3R5cGUiIDogIl9aVElpIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKICAgfSwKICAgewogICAgImZ1bmN0aW9uX25hbWUiIDogInV0ZjhfdG9fdXRmMTYiLApAQCAtOTc2NSw3ICsxMDU3Nyw3IEBACiAgICAgfQogICAgXSwKICAgICJyZXR1cm5fdHlwZSIgOiAiX1pUSVBEcyIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJ1dGY4X3RvX3V0ZjE2X2xlbmd0aCIsCkBAIC05Nzg0LDcgKzEwNTk2LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJaSIsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCiAgIH0sCiAgIHsKICAgICJmdW5jdGlvbl9uYW1lIiA6ICJ1dGY4X3RvX3V0ZjE2X25vX251bGxfdGVybWluYXRvciIsCkBAIC05ODA1LDcgKzEwNjE3LDcgQEAKICAgICB9CiAgICBdLAogICAgInJldHVybl90eXBlIiA6ICJfWlRJUERzIiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKICAgfQogIF0sCiAgImdsb2JhbF92YXJzIiA6CkBAIC05ODI1LDQzICsxMDYzNywzOCBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUkExX0tEcyIsCiAgICAibmFtZSIgOiAiY29uc3QgY2hhcjE2X3QgKCYpWzFdIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElBMV9LRHMiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVJBMV9LRHMiLAogICAgInNpemUiIDogNCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSS043YW5kcm9pZDEwVmVjdG9ySW1wbEUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlZlY3RvckltcGwgJiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDEwVmVjdG9ySW1wbEUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDEwVmVjdG9ySW1wbEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKICAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJLTjdhbmRyb2lkMTZSZWZlcmVuY2VSZW5hbWVyRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6UmVmZXJlbmNlUmVuYW1lciAmIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMTZSZWZlcmVuY2VSZW5hbWVyRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQxNlJlZmVyZW5jZVJlbmFtZXJFIiwKICAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJLTjdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6U29ydGVkVmVjdG9ySW1wbCAmIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQxNlNvcnRlZFZlY3RvckltcGxFIiwKICAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJLTjdhbmRyb2lkMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mbyAmIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQyOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgiCiAgIH0sCkBAIC05ODcwLDcgKzEwNjc3LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJLTjdhbmRyb2lkMnNwSU5TXzE0TG9vcGVyQ2FsbGJhY2tFRUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Okxvb3BlckNhbGxiYWNrPiAmIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMnNwSU5TXzE0TG9vcGVyQ2FsbGJhY2tFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkMnNwSU5TXzE0TG9vcGVyQ2FsbGJhY2tFRUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiCiAgIH0sCkBAIC05ODc5LDcgKzEwNjg1LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJLTjdhbmRyb2lkMnNwSU5TXzE0TWVzc2FnZUhhbmRsZXJFRUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Ok1lc3NhZ2VIYW5kbGVyPiAmIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMnNwSU5TXzE0TWVzc2FnZUhhbmRsZXJFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkMnNwSU5TXzE0TWVzc2FnZUhhbmRsZXJFRUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiCiAgIH0sCkBAIC05ODg4LDcgKzEwNjkzLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJLTjdhbmRyb2lkMnNwSU5TXzIwU2ltcGxlTG9vcGVyQ2FsbGJhY2tFRUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OlNpbXBsZUxvb3BlckNhbGxiYWNrPiAmIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMnNwSU5TXzIwU2ltcGxlTG9vcGVyQ2FsbGJhY2tFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkMnNwSU5TXzIwU2ltcGxlTG9vcGVyQ2FsbGJhY2tFRUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiCiAgIH0sCkBAIC05ODk3LDE2ICsxMDcwMSwxNCBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUktON2FuZHJvaWQyc3BJTlNfNkxvb3BlckVFRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6TG9vcGVyPiAmIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMnNwSU5TXzZMb29wZXJFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkMnNwSU5TXzZMb29wZXJFRUUiLAogICAgInNpemUiIDogNCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Mb29wZXIuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJLTjdhbmRyb2lkMnNwSU5TXzZUaHJlYWRFRUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OlRocmVhZD4gJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDJzcElOU182VGhyZWFkRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDJzcElOU182VGhyZWFkRUVFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LApAQCAtOTkxNSw3ICsxMDcxNyw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSS043YW5kcm9pZDJ3cElOU18xNE1lc3NhZ2VIYW5kbGVyRUVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjp3cDxhbmRyb2lkOjpNZXNzYWdlSGFuZGxlcj4gJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDJ3cElOU18xNE1lc3NhZ2VIYW5kbGVyRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDJ3cElOU18xNE1lc3NhZ2VIYW5kbGVyRUVFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LApAQCAtOTkyNCw3ICsxMDcyNSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSS043YW5kcm9pZDZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6Okxvb3Blcjo6TWVzc2FnZUVudmVsb3BlICYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ2TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3IuaCIKICAgfSwKQEAgLTk5MzMsNyArMTA3MzMsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUktON2FuZHJvaWQ2TG9vcGVyOFJlc3BvbnNlRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6TG9vcGVyOjpSZXNwb25zZSAmIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkNkxvb3BlcjhSZXNwb25zZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkNkxvb3BlcjhSZXNwb25zZUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3IuaCIKICAgfSwKQEAgLTk5NDIsNyArMTA3NDEsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUktON2FuZHJvaWQ2VmVjdG9ySU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6VmVjdG9yPGFuZHJvaWQ6OnN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm8+ICYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ2VmVjdG9ySU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQ2VmVjdG9ySU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIgogICB9LApAQCAtOTk1MSw3ICsxMDc0OSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSS043YW5kcm9pZDdNZXNzYWdlRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6TWVzc2FnZSAmIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkN01lc3NhZ2VFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSS043YW5kcm9pZDdNZXNzYWdlRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0xvb3Blci5oIgogICB9LApAQCAtOTk2MCwzNCArMTA3NTcsMzkgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJLTjdhbmRyb2lkN1N0cmluZzhFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpTdHJpbmc4ICYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ3U3RyaW5nOEUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVJLTjdhbmRyb2lkN1N0cmluZzhFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSS043YW5kcm9pZDdTdHJpbmc4RSIsCisgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6U3RyaW5nOCAmIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUktON2FuZHJvaWQ4U3RyaW5nMTYxMFN0YXRpY0RhdGFJTGoxRUVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpTdHJpbmcxNjo6U3RhdGljRGF0YTwxPiAmIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkOFN0cmluZzE2MTBTdGF0aWNEYXRhSUxqMUVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQ4U3RyaW5nMTYxMFN0YXRpY0RhdGFJTGoxRUVFIiwKICAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUktON2FuZHJvaWQ4U3RyaW5nMTZFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpTdHJpbmcxNiAmIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkOFN0cmluZzE2RSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUktON2FuZHJvaWQ4U3RyaW5nMTZFIiwKICAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSS2EiLAogICAgIm5hbWUiIDogImNvbnN0IHNpZ25lZCBjaGFyICYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUthIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSS2EiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIgogICB9LApAQCAtOTk5Niw3ICsxMDc5OCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSS2IiLAogICAgIm5hbWUiIDogImNvbnN0IGJvb2wgJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS2IiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVJLYiIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiCiAgIH0sCkBAIC0xMDAwNSw3ICsxMDgwNiw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSS2QiLAogICAgIm5hbWUiIDogImNvbnN0IGRvdWJsZSAmIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLZCIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUktkIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIKICAgfSwKQEAgLTEwMDE0LDcgKzEwODE0LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJLZiIsCiAgICAibmFtZSIgOiAiY29uc3QgZmxvYXQgJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS2YiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVJLZiIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiCiAgIH0sCkBAIC0xMDAyMyw3ICsxMDgyMiw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSS2giLAogICAgIm5hbWUiIDogImNvbnN0IHVuc2lnbmVkIGNoYXIgJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS2giLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVJLaCIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiCiAgIH0sCkBAIC0xMDAzMiw3ICsxMDgzMCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSS2kiLAogICAgIm5hbWUiIDogImNvbnN0IGludCAmIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLaSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUktpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIKICAgfSwKQEAgLTEwMDQxLDcgKzEwODM4LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJLaiIsCiAgICAibmFtZSIgOiAiY29uc3QgdW5zaWduZWQgaW50ICYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtqIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSS2oiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIgogICB9LApAQCAtMTAwNTAsNyArMTA4NDYsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUktzIiwKICAgICJuYW1lIiA6ICJjb25zdCBzaG9ydCAmIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLcyIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUktzIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIKICAgfSwKQEAgLTEwMDU5LDcgKzEwODU0LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJLdCIsCiAgICAibmFtZSIgOiAiY29uc3QgdW5zaWduZWQgc2hvcnQgJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS3QiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVJLdCIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiCiAgIH0sCkBAIC0xMDA2OCw3ICsxMDg2Miw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSS3giLAogICAgIm5hbWUiIDogImNvbnN0IGxvbmcgbG9uZyAmIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLeCIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUkt4IiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIKICAgfSwKQEAgLTEwMDc3LDcgKzEwODcwLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJLeSIsCiAgICAibmFtZSIgOiAiY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUt5IiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSS3kiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIgogICB9LApAQCAtMTAwODUsMjYgKzEwODc3LDIzIEBACiAgICAiYWxpZ25tZW50IiA6IDQsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbCAmIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxMFZlY3RvckltcGxFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAogICAgInNpemUiIDogNCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUk43YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlNvcnRlZFZlY3RvckltcGwgJiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUk43YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKICAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJON2FuZHJvaWQyc3BJTlNfMTRMb29wZXJDYWxsYmFja0VFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6c3A8YW5kcm9pZDo6TG9vcGVyQ2FsbGJhY2s+ICYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDJzcElOU18xNExvb3BlckNhbGxiYWNrRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSTjdhbmRyb2lkMnNwSU5TXzE0TG9vcGVyQ2FsbGJhY2tFRUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiCiAgIH0sCkBAIC0xMDExMyw3ICsxMDkwMiw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSTjdhbmRyb2lkMnNwSU5TXzE0TWVzc2FnZUhhbmRsZXJFRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnNwPGFuZHJvaWQ6Ok1lc3NhZ2VIYW5kbGVyPiAmIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQyc3BJTlNfMTRNZXNzYWdlSGFuZGxlckVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUk43YW5kcm9pZDJzcElOU18xNE1lc3NhZ2VIYW5kbGVyRUVFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgogICB9LApAQCAtMTAxMjIsNyArMTA5MTAsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUk43YW5kcm9pZDJzcElOU18yMFNpbXBsZUxvb3BlckNhbGxiYWNrRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpzcDxhbmRyb2lkOjpTaW1wbGVMb29wZXJDYWxsYmFjaz4gJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMnNwSU5TXzIwU2ltcGxlTG9vcGVyQ2FsbGJhY2tFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVJON2FuZHJvaWQyc3BJTlNfMjBTaW1wbGVMb29wZXJDYWxsYmFja0VFRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaCIKICAgfSwKQEAgLTEwMTMxLDcgKzEwOTE4LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJON2FuZHJvaWQyc3BJTlNfNkxvb3BlckVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6c3A8YW5kcm9pZDo6TG9vcGVyPiAmIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQyc3BJTlNfNkxvb3BlckVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUk43YW5kcm9pZDJzcElOU182TG9vcGVyRUVFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgogICB9LApAQCAtMTAxNDAsNyArMTA5MjYsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUk43YW5kcm9pZDJzcElOU182VGhyZWFkRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpzcDxhbmRyb2lkOjpUaHJlYWQ+ICYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDJzcElOU182VGhyZWFkRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSTjdhbmRyb2lkMnNwSU5TXzZUaHJlYWRFRUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiCiAgIH0sCkBAIC0xMDE0OSw3ICsxMDkzNCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSTjdhbmRyb2lkNU11dGV4RSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6TXV0ZXggJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNU11dGV4RSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUk43YW5kcm9pZDVNdXRleEUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9NdXRleC5oIgogICB9LApAQCAtMTAxNTgsNyArMTA5NDIsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUk43YW5kcm9pZDZMb29wZXI4UmVzcG9uc2VFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpMb29wZXI6OlJlc3BvbnNlICYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZMb29wZXI4UmVzcG9uc2VFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSTjdhbmRyb2lkNkxvb3BlcjhSZXNwb25zZUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3IuaCIKICAgfSwKQEAgLTEwMTY3LDcgKzEwOTUwLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJON2FuZHJvaWQ2UldMb2NrRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6UldMb2NrICYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZSV0xvY2tFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSTjdhbmRyb2lkNlJXTG9ja0UiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SV0xvY2suaCIKICAgfSwKQEAgLTEwMTc2LDcgKzEwOTU4LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJON2FuZHJvaWQ2VmVjdG9ySU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9yPGFuZHJvaWQ6OnN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm8+ICYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZWZWN0b3JJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSTjdhbmRyb2lkNlZlY3RvcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3IuaCIKICAgfSwKQEAgLTEwMTg1LDcgKzEwOTY2LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJON2FuZHJvaWQ3RmlsZU1hcEUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OkZpbGVNYXAgJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN0ZpbGVNYXBFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSTjdhbmRyb2lkN0ZpbGVNYXBFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvRmlsZU1hcC5oIgogICB9LApAQCAtMTAxOTQsNyArMTA5NzQsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUk43YW5kcm9pZDdQcmludGVyRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6UHJpbnRlciAmIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3UHJpbnRlckUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVJON2FuZHJvaWQ3UHJpbnRlckUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9QcmludGVyLmgiCiAgIH0sCkBAIC0xMDIwMywyNSArMTA5ODIsMzEgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJON2FuZHJvaWQ3U3RyaW5nOEUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlN0cmluZzggJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1N0cmluZzhFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElSTjdhbmRyb2lkN1N0cmluZzhFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElSTjdhbmRyb2lkN1N0cmluZzhFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4ICYiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSVJON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUk43YW5kcm9pZDhTdHJpbmcxNkUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2ICYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDhTdHJpbmcxNkUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVJON2FuZHJvaWQ4U3RyaW5nMTZFIiwKICAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUlAxM25hdGl2ZV9oYW5kbGUiLAogICAgIm5hbWUiIDogIm5hdGl2ZV9oYW5kbGUgKiYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVAxM25hdGl2ZV9oYW5kbGUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVJQMTNuYXRpdmVfaGFuZGxlIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgogICB9LApAQCAtMTAyMzAsNyArMTEwMTUsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUlBGaWlpUHZFIiwKICAgICJuYW1lIiA6ICJpbnQgKComKShpbnQsIGludCwgdm9pZCAqKSIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEZpaWlQdkUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVJQRmlpaVB2RSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaCIKICAgfSwKQEAgLTEwMjM5LDcgKzExMDIzLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVJiIiwKICAgICJuYW1lIiA6ICJib29sICYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWIiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVJiIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgogICB9CkBAIC0xMDI1MSw3ICsxMTAzNCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQMTNuYXRpdmVfaGFuZGxlIiwKICAgICJuYW1lIiA6ICJuYXRpdmVfaGFuZGxlICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTEzbmF0aXZlX2hhbmRsZSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUDEzbmF0aXZlX2hhbmRsZSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaCIKICAgfSwKQEAgLTEwMjYwLDcgKzExMDQyLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVAxOGFuZHJvaWRfZmxleF9wbGFuZSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZF9mbGV4X3BsYW5lICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTE4YW5kcm9pZF9mbGV4X3BsYW5lIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQMThhbmRyb2lkX2ZsZXhfcGxhbmUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlic3lzdGVtL2luY2x1ZGUvc3lzdGVtL2dyYXBoaWNzLmgiCiAgIH0sCkBAIC0xMDI2OSw3ICsxMTA1MCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQM0RJUiIsCiAgICAibmFtZSIgOiAiRElSICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTNESVIiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVAzRElSIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9saWJiYXNlL2luY2x1ZGUvYW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oIgogICB9LApAQCAtMTAyNzgsNyArMTEwNTgsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUDdfX3NGSUxFIiwKICAgICJuYW1lIiA6ICJfX3NGSUxFICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTdfX3NGSUxFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQN19fc0ZJTEUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2xpYmJhc2UvaW5jbHVkZS9hbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmgiCiAgIH0sCkBAIC0xMDI4Nyw3ICsxMTA2Niw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQN2xvZ19tc2ciLAogICAgIm5hbWUiIDogImxvZ19tc2cgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJN2xvZ19tc2ciLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVA3bG9nX21zZyIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vbG9nZ2luZy9saWJsb2cvaW5jbHVkZV92bmRrL2xvZy9sb2dfcmVhZC5oIgogICB9LApAQCAtMTAyOTYsMTYgKzExMDc0LDE0IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQRHMiLAogICAgIm5hbWUiIDogImNoYXIxNl90ICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSURzIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQRHMiLAogICAgInNpemUiIDogNCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQRmlQRmlQdkVTX1BLY2lqUFNfRSIsCiAgICAibmFtZSIgOiAiaW50ICgqKShpbnQgKCopKHZvaWQgKiksIHZvaWQgKiwgY29uc3QgY2hhciAqLCBpbnQsIHVuc2lnbmVkIGludCwgdm9pZCAqKikiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUZpUEZpUHZFU19QS2NpalBTX0UiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBGaVBGaVB2RVNfUEtjaWpQU19FIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvQW5kcm9pZFRocmVhZHMuaCIKICAgfSwKQEAgLTEwMzE0LDI1ICsxMTA5MCwyMiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEZpUEt2UzBfRSIsCiAgICAibmFtZSIgOiAiaW50ICgqKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUZpUEt2UzBfRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEZpUEt2UzBfRSIsCiAgICAic2l6ZSIgOiA0LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQRmlQS3ZTMF9QdkUiLAogICAgIm5hbWUiIDogImludCAoKikoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICosIHZvaWQgKikiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUZpUEt2UzBfUHZFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQRmlQS3ZTMF9QdkUiLAogICAgInNpemUiIDogNCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEZpUHZFIiwKICAgICJuYW1lIiA6ICJpbnQgKCopKHZvaWQgKikiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUZpUHZFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQRmlQdkUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9BbmRyb2lkVGhyZWFkcy5oIgogICB9LApAQCAtMTAzNDEsNyArMTExMTQsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEZpaWlQdkUiLAogICAgIm5hbWUiIDogImludCAoKikoaW50LCBpbnQsIHZvaWQgKikiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUZpaWlQdkUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBGaWlpUHZFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgogICB9LApAQCAtMTAzNTAsNyArMTExMjIsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEZ2dkUiLAogICAgIm5hbWUiIDogInZvaWQgKCopKCkiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUZ2dkUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBGdnZFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvbWlzYy5oIgogICB9LApAQCAtMTAzNTksNyArMTExMzAsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEsxM25hdGl2ZV9oYW5kbGUiLAogICAgIm5hbWUiIDogImNvbnN0IG5hdGl2ZV9oYW5kbGUgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJSzEzbmF0aXZlX2hhbmRsZSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEsxM25hdGl2ZV9oYW5kbGUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9OYXRpdmVIYW5kbGUuaCIKICAgfSwKQEAgLTEwMzY4LDcgKzExMTM4LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLN2xvZ19tc2ciLAogICAgIm5hbWUiIDogImNvbnN0IGxvZ19tc2cgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJSzdsb2dfbXNnIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQSzdsb2dfbXNnIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9sb2dnaW5nL2xpYmxvZy9pbmNsdWRlX3ZuZGsvbG9nL2xvZ19yZWFkLmgiCiAgIH0sCkBAIC0xMDM3NywzNCArMTExNDYsMzkgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLRGkiLAogICAgIm5hbWUiIDogImNvbnN0IGNoYXIzMl90ICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtEaSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEtEaSIsCiAgICAic2l6ZSIgOiA0LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS0RzIiwKICAgICJuYW1lIiA6ICJjb25zdCBjaGFyMTZfdCAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLRHMiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBLRHMiLAogICAgInNpemUiIDogNCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6VmVjdG9ySW1wbCAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQxMFZlY3RvckltcGxFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS043YW5kcm9pZDEwVmVjdG9ySW1wbEUiLAorICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlZlY3RvckltcGwgKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDEwVmVjdG9ySW1wbEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDEwVmVjdG9ySW1wbEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEtON2FuZHJvaWQxMkxpZ2h0UmVmQmFzZUlOU18xMk5hdGl2ZUhhbmRsZUVFRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6TGlnaHRSZWZCYXNlPGFuZHJvaWQ6Ok5hdGl2ZUhhbmRsZT4gKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDEyTGlnaHRSZWZCYXNlSU5TXzEyTmF0aXZlSGFuZGxlRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDEyTGlnaHRSZWZCYXNlSU5TXzEyTmF0aXZlSGFuZGxlRUVFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTGlnaHRSZWZCYXNlLmgiCiAgIH0sCkBAIC0xMDQxMyw3ICsxMTE4Nyw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS043YW5kcm9pZDEyTmF0aXZlSGFuZGxlRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6TmF0aXZlSGFuZGxlICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQxMk5hdGl2ZUhhbmRsZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkMTJOYXRpdmVIYW5kbGVFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTmF0aXZlSGFuZGxlLmgiCiAgIH0sCkBAIC0xMDQyMiwxNiArMTExOTUsMTQgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLTjdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6U29ydGVkVmVjdG9ySW1wbCAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQxNlNvcnRlZFZlY3RvckltcGxFIiwKICAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLTjdhbmRyb2lkMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mbyAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQyOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIKICAgfSwKQEAgLTEwNDQwLDcgKzExMjExLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLTjdhbmRyb2lkMnNwSU5TXzE0TG9vcGVyQ2FsbGJhY2tFRUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Okxvb3BlckNhbGxiYWNrPiAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMnNwSU5TXzE0TG9vcGVyQ2FsbGJhY2tFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkMnNwSU5TXzE0TG9vcGVyQ2FsbGJhY2tFRUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiCiAgIH0sCkBAIC0xMDQ0OSw3ICsxMTIxOSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS043YW5kcm9pZDJzcElOU18xNE1lc3NhZ2VIYW5kbGVyRUVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpNZXNzYWdlSGFuZGxlcj4gKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDJzcElOU18xNE1lc3NhZ2VIYW5kbGVyRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDJzcElOU18xNE1lc3NhZ2VIYW5kbGVyRUVFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgogICB9LApAQCAtMTA0NTgsNyArMTEyMjcsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEtON2FuZHJvaWQyc3BJTlNfNkxvb3BlckVFRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6TG9vcGVyPiAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMnNwSU5TXzZMb29wZXJFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkMnNwSU5TXzZMb29wZXJFRUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiCiAgIH0sCkBAIC0xMDQ2Nyw3ICsxMTIzNSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS043YW5kcm9pZDJzcElOU182VGhyZWFkRUVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpUaHJlYWQ+ICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQyc3BJTlNfNlRocmVhZEVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQyc3BJTlNfNlRocmVhZEVFRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaCIKICAgfSwKQEAgLTEwNDc2LDcgKzExMjQzLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLTjdhbmRyb2lkMndwSU5TXzE0TWVzc2FnZUhhbmRsZXJFRUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OndwPGFuZHJvaWQ6Ok1lc3NhZ2VIYW5kbGVyPiAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMndwSU5TXzE0TWVzc2FnZUhhbmRsZXJFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkMndwSU5TXzE0TWVzc2FnZUhhbmRsZXJFRUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCkBAIC0xMDQ4NSw3ICsxMTI1MSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS043YW5kcm9pZDJ3cElOU182VGhyZWFkRUVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjp3cDxhbmRyb2lkOjpUaHJlYWQ+ICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQyd3BJTlNfNlRocmVhZEVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQyd3BJTlNfNlRocmVhZEVFRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKQEAgLTEwNDk0LDcgKzExMjU5LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLTjdhbmRyb2lkNGJhc2UxMWJvcnJvd2VkX2ZkRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDRiYXNlMTFib3Jyb3dlZF9mZEUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkNGJhc2UxMWJvcnJvd2VkX2ZkRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vbGliYmFzZS9pbmNsdWRlL2FuZHJvaWQtYmFzZS91bmlxdWVfZmQuaCIKICAgfSwKQEAgLTEwNTAzLDcgKzExMjY3LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLTjdhbmRyb2lkNGJhc2UxNHVuaXF1ZV9mZF9pbXBsSU5TMF8xM0RlZmF1bHRDbG9zZXJFRUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZF9pbXBsPGFuZHJvaWQ6OmJhc2U6OkRlZmF1bHRDbG9zZXI+ICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ0YmFzZTE0dW5pcXVlX2ZkX2ltcGxJTlMwXzEzRGVmYXVsdENsb3NlckVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ0YmFzZTE0dW5pcXVlX2ZkX2ltcGxJTlMwXzEzRGVmYXVsdENsb3NlckVFRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vbGliYmFzZS9pbmNsdWRlL2FuZHJvaWQtYmFzZS91bmlxdWVfZmQuaCIKICAgfSwKQEAgLTEwNTEyLDcgKzExMjc1LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLTjdhbmRyb2lkNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6TG9vcGVyOjpNZXNzYWdlRW52ZWxvcGUgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiCiAgIH0sCkBAIC0xMDUyMSw3ICsxMTI4Myw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS043YW5kcm9pZDZMb29wZXI3UmVxdWVzdEUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6Okxvb3Blcjo6UmVxdWVzdCAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkNkxvb3BlcjdSZXF1ZXN0RSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ2TG9vcGVyN1JlcXVlc3RFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTG9vcGVyLmgiCiAgIH0sCkBAIC0xMDUzMCw3ICsxMTI5MSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS043YW5kcm9pZDZMb29wZXI4UmVzcG9uc2VFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpMb29wZXI6OlJlc3BvbnNlICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ2TG9vcGVyOFJlc3BvbnNlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ2TG9vcGVyOFJlc3BvbnNlRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiCiAgIH0sCkBAIC0xMDUzOSw3ICsxMTI5OSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS043YW5kcm9pZDZMb29wZXJFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpMb29wZXIgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDZMb29wZXJFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDZMb29wZXJFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTG9vcGVyLmgiCiAgIH0sCkBAIC0xMDU0OCw3ICsxMTMwNyw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS043YW5kcm9pZDZUaHJlYWRFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpUaHJlYWQgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDZUaHJlYWRFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDZUaHJlYWRFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVGhyZWFkLmgiCiAgIH0sCkBAIC0xMDU1Nyw3ICsxMTMxNSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS043YW5kcm9pZDZWZWN0b3JJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpWZWN0b3I8YW5kcm9pZDo6c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mbz4gKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDZWZWN0b3JJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDZWZWN0b3JJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgiCiAgIH0sCkBAIC0xMDU2Niw3ICsxMTMyMyw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS043YW5kcm9pZDZWZWN0b3JJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpWZWN0b3I8YW5kcm9pZDo6TG9vcGVyOjpNZXNzYWdlRW52ZWxvcGU+ICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ2VmVjdG9ySU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ2VmVjdG9ySU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIgogICB9LApAQCAtMTA1NzUsNyArMTEzMzEsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEtON2FuZHJvaWQ2VmVjdG9ySU5TXzZMb29wZXI4UmVzcG9uc2VFRUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlZlY3RvcjxhbmRyb2lkOjpMb29wZXI6OlJlc3BvbnNlPiAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkNlZlY3RvcklOU182TG9vcGVyOFJlc3BvbnNlRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDZWZWN0b3JJTlNfNkxvb3BlcjhSZXNwb25zZUVFRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIgogICB9LApAQCAtMTA1ODQsMTYgKzExMzM5LDE0IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS043YW5kcm9pZDZWZWN0b3JJTlNfN1N0cmluZzhFRUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlZlY3RvcjxhbmRyb2lkOjpTdHJpbmc4PiAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkNlZlY3RvcklOU183U3RyaW5nOEVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ2VmVjdG9ySU5TXzdTdHJpbmc4RUVFIiwKICAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS043YW5kcm9pZDdGaWxlTWFwRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6RmlsZU1hcCAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkN0ZpbGVNYXBFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdGaWxlTWFwRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0ZpbGVNYXAuaCIKICAgfSwKQEAgLTEwNjAyLDcgKzExMzU1LDE0IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS043YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpSZWZCYXNlOjp3ZWFrcmVmX3R5cGUgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEtON2FuZHJvaWQ3UmVmQmFzZUUiLAorICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlJlZkJhc2UgKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDdSZWZCYXNlRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKQEAgLTEwNjEwLDQ0ICsxMTM3MCw0MSBAQAogICAgImFsaWdubWVudCIgOiA0LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEtON2FuZHJvaWQ3UmVmQmFzZUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlJlZkJhc2UgKiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDdSZWZCYXNlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3UmVmQmFzZUUiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAogICAgInNpemUiIDogNCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEtON2FuZHJvaWQ3U3RyaW5nOEUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlN0cmluZzggKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDdTdHJpbmc4RSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEtON2FuZHJvaWQ3U3RyaW5nOEUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLTjdhbmRyb2lkN1N0cmluZzhFIiwKKyAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpTdHJpbmc4ICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDdTdHJpbmc4RSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS043YW5kcm9pZDhTdHJpbmcxNkUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlN0cmluZzE2ICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ4U3RyaW5nMTZFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDhTdHJpbmcxNkUiLAogICAgInNpemUiIDogNCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgotICB9LAotICB7Ci0gICAiYWxpZ25tZW50IiA6IDQsCi0gICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQS043YW5kcm9pZDlDYWxsU3RhY2tFIiwKLSAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpDYWxsU3RhY2sgKiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS043YW5kcm9pZDlDYWxsU3RhY2tFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQS043YW5kcm9pZDlDYWxsU3RhY2tFIiwKLSAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvQ2FsbFN0YWNrLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLTjdhbmRyb2lkOVN0b3BXYXRjaEUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlN0b3BXYXRjaCAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkOVN0b3BXYXRjaEUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkOVN0b3BXYXRjaEUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdG9wV2F0Y2guaCIKICAgfSwKQEAgLTEwNjU2LDcgKzExNDEzLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLTjdhbmRyb2lkOVRva2VuaXplckUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlRva2VuaXplciAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkOVRva2VuaXplckUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBLTjdhbmRyb2lkOVRva2VuaXplckUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Ub2tlbml6ZXIuaCIKICAgfSwKQEAgLTEwNjY1LDcgKzExNDIxLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLYyIsCiAgICAibmFtZSIgOiAiY29uc3QgY2hhciAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLYyIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEtjIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvRmlsZU1hcC5oIgogICB9LApAQCAtMTA2NzQsNyArMTE0MjksNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEtoIiwKICAgICJuYW1lIiA6ICJjb25zdCB1bnNpZ25lZCBjaGFyICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtoIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQS2giLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9KZW5raW5zSGFzaC5oIgogICB9LApAQCAtMTA2ODMsNyArMTE0MzcsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUEt0IiwKICAgICJuYW1lIiA6ICJjb25zdCB1bnNpZ25lZCBzaG9ydCAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLdCIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEt0IiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvSmVua2luc0hhc2guaCIKICAgfSwKQEAgLTEwNjkyLDcgKzExNDQ1LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBLdiIsCiAgICAibmFtZSIgOiAiY29uc3Qgdm9pZCAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLdiIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUEt2IiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTGlnaHRSZWZCYXNlLmgiCiAgIH0sCkBAIC0xMDcwMSw3ICsxMTQ1Myw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkMTBMb2dQcmludGVyRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6TG9nUHJpbnRlciAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxMExvZ1ByaW50ZXJFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkMTBMb2dQcmludGVyRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ByaW50ZXIuaCIKICAgfSwKQEAgLTEwNzA5LDE3ICsxMTQ2MCwxNSBAQAogICAgImFsaWdubWVudCIgOiA0LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDEwVmVjdG9ySW1wbEUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlZlY3RvckltcGwgKiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDEwVmVjdG9ySW1wbEUiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEwVmVjdG9ySW1wbEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKICAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQxMVNjb3BlZFRyYWNlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6U2NvcGVkVHJhY2UgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTFTY29wZWRUcmFjZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQxMVNjb3BlZFRyYWNlRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1RyYWNlLmgiCiAgIH0sCkBAIC0xMDcyOCw3ICsxMTQ3Nyw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkMTJMaWdodFJlZkJhc2VJTlNfMTJOYXRpdmVIYW5kbGVFRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OkxpZ2h0UmVmQmFzZTxhbmRyb2lkOjpOYXRpdmVIYW5kbGU+ICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEyTGlnaHRSZWZCYXNlSU5TXzEyTmF0aXZlSGFuZGxlRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkMTJMaWdodFJlZkJhc2VJTlNfMTJOYXRpdmVIYW5kbGVFRUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9MaWdodFJlZkJhc2UuaCIKICAgfSwKQEAgLTEwNzM3LDcgKzExNDg1LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQxMk5hdGl2ZUhhbmRsZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6Ok5hdGl2ZUhhbmRsZSAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxMk5hdGl2ZUhhbmRsZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQxMk5hdGl2ZUhhbmRsZUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiCiAgIH0sCkBAIC0xMDc0Niw3ICsxMTQ5Myw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkMTNQcmVmaXhQcmludGVyRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6UHJlZml4UHJpbnRlciAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxM1ByZWZpeFByaW50ZXJFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkMTNQcmVmaXhQcmludGVyRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ByaW50ZXIuaCIKICAgfSwKQEAgLTEwNzU1LDcgKzExNTAxLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQxNExvb3BlckNhbGxiYWNrRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6TG9vcGVyQ2FsbGJhY2sgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTRMb29wZXJDYWxsYmFja0UiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQxNExvb3BlckNhbGxiYWNrRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaCIKICAgfSwKQEAgLTEwNzY0LDcgKzExNTA5LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQxNE1lc3NhZ2VIYW5kbGVyRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6TWVzc2FnZUhhbmRsZXIgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTRNZXNzYWdlSGFuZGxlckUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQxNE1lc3NhZ2VIYW5kbGVyRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKQEAgLTEwNzczLDE2ICsxMTUxNywxNCBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDE0U3RhdGljU3RyaW5nMTZJTGoxRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpTdGF0aWNTdHJpbmcxNjwxPiAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNFN0YXRpY1N0cmluZzE2SUxqMUVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDE0U3RhdGljU3RyaW5nMTZJTGoxRUVFIiwKICAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDE0U3RyaW5nOFByaW50ZXJFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4UHJpbnRlciAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNFN0cmluZzhQcmludGVyRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDE0U3RyaW5nOFByaW50ZXJFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUHJpbnRlci5oIgogICB9LApAQCAtMTA3OTEsMjUgKzExNTMzLDMxIEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkMTZSZWZlcmVuY2VSZW5hbWVyRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6UmVmZXJlbmNlUmVuYW1lciAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNlJlZmVyZW5jZVJlbmFtZXJFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkMTZSZWZlcmVuY2VSZW5hbWVyRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDE2UmVmZXJlbmNlUmVuYW1lckUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OlJlZmVyZW5jZVJlbmFtZXIgKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTZSZWZlcmVuY2VSZW5hbWVyRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQxNlJlZmVyZW5jZVJlbmFtZXJFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQxNlNvcnRlZFZlY3RvckltcGxFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpTb3J0ZWRWZWN0b3JJbXBsICoiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQxNlNvcnRlZFZlY3RvckltcGxFIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNlNvcnRlZFZlY3RvckltcGxFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCiAgICAic2l6ZSIgOiA0LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkMThXZWFrTWVzc2FnZUhhbmRsZXJFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpXZWFrTWVzc2FnZUhhbmRsZXIgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMThXZWFrTWVzc2FnZUhhbmRsZXJFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkMThXZWFrTWVzc2FnZUhhbmRsZXJFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTG9vcGVyLmgiCiAgIH0sCkBAIC0xMDgxOCwxNiArMTE1NjYsMjMgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQxOVZpcnR1YWxMaWdodFJlZkJhc2VFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpWaXJ0dWFsTGlnaHRSZWZCYXNlICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE5VmlydHVhbExpZ2h0UmVmQmFzZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQxOVZpcnR1YWxMaWdodFJlZkJhc2VFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTGlnaHRSZWZCYXNlLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQxOVZpcnR1YWxMaWdodFJlZkJhc2VFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjpWaXJ0dWFsTGlnaHRSZWZCYXNlICoiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE5VmlydHVhbExpZ2h0UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkMTlWaXJ0dWFsTGlnaHRSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogNCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvTGlnaHRSZWZCYXNlLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQyMFNpbXBsZUxvb3BlckNhbGxiYWNrRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6U2ltcGxlTG9vcGVyQ2FsbGJhY2sgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMjBTaW1wbGVMb29wZXJDYWxsYmFja0UiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQyMFNpbXBsZUxvb3BlckNhbGxiYWNrRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaCIKICAgfSwKQEAgLTEwODM2LDcgKzExNTkxLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQyOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0UiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQyOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIKICAgfSwKQEAgLTEwODQ1LDcgKzExNTk5LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQyc3BJTlNfMTJOYXRpdmVIYW5kbGVFRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnNwPGFuZHJvaWQ6Ok5hdGl2ZUhhbmRsZT4gKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMnNwSU5TXzEyTmF0aXZlSGFuZGxlRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkMnNwSU5TXzEyTmF0aXZlSGFuZGxlRUVFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgogICB9LApAQCAtMTA4NTQsNyArMTE2MDcsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDJzcElOU18xNExvb3BlckNhbGxiYWNrRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpzcDxhbmRyb2lkOjpMb29wZXJDYWxsYmFjaz4gKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMnNwSU5TXzE0TG9vcGVyQ2FsbGJhY2tFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQyc3BJTlNfMTRMb29wZXJDYWxsYmFja0VFRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaCIKICAgfSwKQEAgLTEwODYzLDcgKzExNjE1LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQyc3BJTlNfMTRNZXNzYWdlSGFuZGxlckVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6c3A8YW5kcm9pZDo6TWVzc2FnZUhhbmRsZXI+ICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDJzcElOU18xNE1lc3NhZ2VIYW5kbGVyRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkMnNwSU5TXzE0TWVzc2FnZUhhbmRsZXJFRUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiCiAgIH0sCkBAIC0xMDg3Miw3ICsxMTYyMyw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkMnNwSU5TXzIwU2ltcGxlTG9vcGVyQ2FsbGJhY2tFRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnNwPGFuZHJvaWQ6OlNpbXBsZUxvb3BlckNhbGxiYWNrPiAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQyc3BJTlNfMjBTaW1wbGVMb29wZXJDYWxsYmFja0VFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDJzcElOU18yMFNpbXBsZUxvb3BlckNhbGxiYWNrRUVFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgogICB9LApAQCAtMTA4ODEsNyArMTE2MzEsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDJzcElOU182TG9vcGVyRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpzcDxhbmRyb2lkOjpMb29wZXI+ICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDJzcElOU182TG9vcGVyRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkMnNwSU5TXzZMb29wZXJFRUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiCiAgIH0sCkBAIC0xMDg5MCw3ICsxMTYzOSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkMnNwSU5TXzZUaHJlYWRFRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnNwPGFuZHJvaWQ6OlRocmVhZD4gKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMnNwSU5TXzZUaHJlYWRFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQyc3BJTlNfNlRocmVhZEVFRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaCIKICAgfSwKQEAgLTEwODk5LDcgKzExNjQ3LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQyd3BJTlNfMTRNZXNzYWdlSGFuZGxlckVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6d3A8YW5kcm9pZDo6TWVzc2FnZUhhbmRsZXI+ICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDJ3cElOU18xNE1lc3NhZ2VIYW5kbGVyRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkMndwSU5TXzE0TWVzc2FnZUhhbmRsZXJFRUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCkBAIC0xMDkwOCw3ICsxMTY1NSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkMndwSU5TXzZUaHJlYWRFRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OndwPGFuZHJvaWQ6OlRocmVhZD4gKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMndwSU5TXzZUaHJlYWRFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQyd3BJTlNfNlRocmVhZEVFRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKQEAgLTEwOTE3LDcgKzExNjYzLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQ0YmFzZTExYm9ycm93ZWRfZmRFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ0YmFzZTExYm9ycm93ZWRfZmRFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkNGJhc2UxMWJvcnJvd2VkX2ZkRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vbGliYmFzZS9pbmNsdWRlL2FuZHJvaWQtYmFzZS91bmlxdWVfZmQuaCIKICAgfSwKQEAgLTEwOTI2LDcgKzExNjcxLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQ0YmFzZTE0dW5pcXVlX2ZkX2ltcGxJTlMwXzEzRGVmYXVsdENsb3NlckVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkX2ltcGw8YW5kcm9pZDo6YmFzZTo6RGVmYXVsdENsb3Nlcj4gKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNGJhc2UxNHVuaXF1ZV9mZF9pbXBsSU5TMF8xM0RlZmF1bHRDbG9zZXJFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ0YmFzZTE0dW5pcXVlX2ZkX2ltcGxJTlMwXzEzRGVmYXVsdENsb3NlckVFRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vbGliYmFzZS9pbmNsdWRlL2FuZHJvaWQtYmFzZS91bmlxdWVfZmQuaCIKICAgfSwKQEAgLTEwOTM1LDcgKzExNjc5LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQ1TXV0ZXg4QXV0b2xvY2tFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpNdXRleDo6QXV0b2xvY2sgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNU11dGV4OEF1dG9sb2NrRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDVNdXRleDhBdXRvbG9ja0UiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9NdXRleC5oIgogICB9LApAQCAtMTA5NDQsNyArMTE2ODcsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDVNdXRleEUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6Ok11dGV4ICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDVNdXRleEUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ1TXV0ZXhFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTXV0ZXguaCIKICAgfSwKQEAgLTEwOTUzLDcgKzExNjk1LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQ2TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpMb29wZXI6Ok1lc3NhZ2VFbnZlbG9wZSAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiCiAgIH0sCkBAIC0xMDk2Miw3ICsxMTcwMyw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkNkxvb3BlcjhSZXNwb25zZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6Okxvb3Blcjo6UmVzcG9uc2UgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNkxvb3BlcjhSZXNwb25zZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ2TG9vcGVyOFJlc3BvbnNlRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiCiAgIH0sCkBAIC0xMDk3MSw3ICsxMTcxMSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkNkxvb3BlckUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6Okxvb3BlciAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2TG9vcGVyRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDZMb29wZXJFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgogICB9LApAQCAtMTA5ODAsNyArMTE3MTksNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDZSV0xvY2s5QXV0b1JMb2NrRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6UldMb2NrOjpBdXRvUkxvY2sgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNlJXTG9jazlBdXRvUkxvY2tFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkNlJXTG9jazlBdXRvUkxvY2tFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUldMb2NrLmgiCiAgIH0sCkBAIC0xMDk4OSw3ICsxMTcyNyw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkNlJXTG9jazlBdXRvV0xvY2tFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpSV0xvY2s6OkF1dG9XTG9jayAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2UldMb2NrOUF1dG9XTG9ja0UiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ2UldMb2NrOUF1dG9XTG9ja0UiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SV0xvY2suaCIKICAgfSwKQEAgLTEwOTk4LDcgKzExNzM1LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQ2UldMb2NrRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6UldMb2NrICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZSV0xvY2tFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkNlJXTG9ja0UiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SV0xvY2suaCIKICAgfSwKQEAgLTExMDA3LDcgKzExNzQzLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQ2VGhyZWFkRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6VGhyZWFkICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZUaHJlYWRFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkNlRocmVhZEUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCkBAIC0xMTAxNiw3ICsxMTc1MSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkNlZlY3RvcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlZlY3RvcjxhbmRyb2lkOjpzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvPiAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2VmVjdG9ySU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDZWZWN0b3JJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgiCiAgIH0sCkBAIC0xMTAyNSw3ICsxMTc1OSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkNlZlY3RvcklOU182TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlZlY3RvcjxhbmRyb2lkOjpMb29wZXI6Ok1lc3NhZ2VFbnZlbG9wZT4gKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNlZlY3RvcklOU182TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ2VmVjdG9ySU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIgogICB9LApAQCAtMTEwMzQsNyArMTE3NjcsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDZWZWN0b3JJTlNfNkxvb3BlcjhSZXNwb25zZUVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9yPGFuZHJvaWQ6Okxvb3Blcjo6UmVzcG9uc2U+ICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZWZWN0b3JJTlNfNkxvb3BlcjhSZXNwb25zZUVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDZWZWN0b3JJTlNfNkxvb3BlcjhSZXNwb25zZUVFRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIgogICB9LApAQCAtMTEwNDMsMTYgKzExNzc1LDE0IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkNlZlY3RvcklOU183U3RyaW5nOEVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9yPGFuZHJvaWQ6OlN0cmluZzg+ICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZWZWN0b3JJTlNfN1N0cmluZzhFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ2VmVjdG9ySU5TXzdTdHJpbmc4RUVFIiwKICAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkN0ZpbGVNYXBFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpGaWxlTWFwICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdGaWxlTWFwRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdGaWxlTWFwRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0ZpbGVNYXAuaCIKICAgfSwKQEAgLTExMDYxLDcgKzExNzkxLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQ3TWVzc2FnZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6Ok1lc3NhZ2UgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN01lc3NhZ2VFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN01lc3NhZ2VFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTG9vcGVyLmgiCiAgIH0sCkBAIC0xMTA3MCw3ICsxMTc5OSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkN1ByaW50ZXJFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpQcmludGVyICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdQcmludGVyRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdQcmludGVyRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ByaW50ZXIuaCIKICAgfSwKQEAgLTExMDc5LDcgKzExODA3LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl9pbXBsRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6d2Vha3JlZl9pbXBsICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX2ltcGxFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfaW1wbEUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCkBAIC0xMTA4OCw3ICsxMTgxNSwyMyBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlOjp3ZWFrcmVmX3R5cGUgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjpSZWZCYXNlOjp3ZWFrcmVmX3R5cGUgKiIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZSAqIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCkBAIC0xMTA5Niw2MiArMTE4MzksNDkgQEAKICAgICJhbGlnbm1lbnQiIDogNCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQ3UmVmQmFzZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2UgKiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2VFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1JlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCiAgICAic2l6ZSIgOiA0LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4ICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ByaW50ZXIuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUE43YW5kcm9pZDdTdHJpbmc4RSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nOCAqIiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQ4U3RyaW5nMTYxMFN0YXRpY0RhdGFJTGoxRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNjo6U3RhdGljRGF0YTwxPiAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ4U3RyaW5nMTYxMFN0YXRpY0RhdGFJTGoxRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkOFN0cmluZzE2MTBTdGF0aWNEYXRhSUxqMUVFRSIsCiAgICAic2l6ZSIgOiA0LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQ4U3RyaW5nMTZFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmcxNiAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ4U3RyaW5nMTZFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkOFN0cmluZzE2RSIsCiAgICAic2l6ZSIgOiA0LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCi0gIH0sCi0gIHsKLSAgICJhbGlnbm1lbnQiIDogNCwKLSAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQ5Q2FsbFN0YWNrMTJTdGFja0RlbGV0ZXJFIiwKLSAgICJuYW1lIiA6ICJhbmRyb2lkOjpDYWxsU3RhY2s6OlN0YWNrRGVsZXRlciAqIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ5Q2FsbFN0YWNrMTJTdGFja0RlbGV0ZXJFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkOUNhbGxTdGFjazEyU3RhY2tEZWxldGVyRSIsCi0gICAic2l6ZSIgOiA0LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0NhbGxTdGFjay5oIgotICB9LAotICB7Ci0gICAiYWxpZ25tZW50IiA6IDQsCi0gICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkOUNhbGxTdGFja0UiLAotICAgIm5hbWUiIDogImFuZHJvaWQ6OkNhbGxTdGFjayAqIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ5Q2FsbFN0YWNrRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDlDYWxsU3RhY2tFIiwKLSAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvQ2FsbFN0YWNrLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQ5Q29uZGl0aW9uRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6Q29uZGl0aW9uICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDlDb25kaXRpb25FIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkOUNvbmRpdGlvbkUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Db25kaXRpb24uaCIKICAgfSwKQEAgLTExMTYwLDcgKzExODkwLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBON2FuZHJvaWQ5RmRQcmludGVyRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6RmRQcmludGVyICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDlGZFByaW50ZXJFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElQTjdhbmRyb2lkOUZkUHJpbnRlckUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9QcmludGVyLmgiCiAgIH0sCkBAIC0xMTE2OSw3ICsxMTg5OCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkOVN0b3BXYXRjaEUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlN0b3BXYXRjaCAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ5U3RvcFdhdGNoRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDlTdG9wV2F0Y2hFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RvcFdhdGNoLmgiCiAgIH0sCkBAIC0xMTE3OCw3ICsxMTkwNiw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQTjdhbmRyb2lkOVRva2VuaXplckUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlRva2VuaXplciAqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ5VG9rZW5pemVyRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDlUb2tlbml6ZXJFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVG9rZW5pemVyLmgiCiAgIH0sCkBAIC0xMTE4Nyw3ICsxMTkxNCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQUE43YW5kcm9pZDlUb2tlbml6ZXJFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpUb2tlbml6ZXIgKioiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBON2FuZHJvaWQ5VG9rZW5pemVyRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUFBON2FuZHJvaWQ5VG9rZW5pemVyRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1Rva2VuaXplci5oIgogICB9LApAQCAtMTExOTYsNyArMTE5MjIsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUFB2IiwKICAgICJuYW1lIiA6ICJ2b2lkICoqIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUFB2IiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvQW5kcm9pZFRocmVhZHMuaCIKICAgfSwKQEAgLTExMjA1LDcgKzExOTMwLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBjIiwKICAgICJuYW1lIiA6ICJjaGFyICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWMiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBjIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvRmlsZU1hcC5oIgogICB9LApAQCAtMTEyMTQsNyArMTE5MzgsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUGgiLAogICAgIm5hbWUiIDogInVuc2lnbmVkIGNoYXIgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaCIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUGgiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlic3lzdGVtL2luY2x1ZGUvc3lzdGVtL2dyYXBoaWNzLmgiCiAgIH0sCkBAIC0xMTIyMyw3ICsxMTk0Niw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElQaSIsCiAgICAibmFtZSIgOiAiaW50ICoiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWkiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSVBpIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTG9vcGVyLmgiCiAgIH0sCkBAIC0xMTIzMiwxNiArMTE5NTQsMTQgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVBqIiwKICAgICJuYW1lIiA6ICJ1bnNpZ25lZCBpbnQgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUGoiLAogICAgInNpemUiIDogNCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJUHYiLAogICAgIm5hbWUiIDogInZvaWQgKiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJdiIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJUHYiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9GaWxlTWFwLmgiCiAgIH0KQEAgLTExMjU0LDkgKzExOTc0LDggQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUExX0tEcyIsCiAgICAibmFtZSIgOiAiY29uc3QgY2hhcjE2X3RbMV0iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUExX0RzIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElBMV9LRHMiLAogICAgInNpemUiIDogMiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCkBAIC0xMTI2NCw3ICsxMTk4Myw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLMTNuYXRpdmVfaGFuZGxlIiwKICAgICJuYW1lIiA6ICJjb25zdCBuYXRpdmVfaGFuZGxlIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkxM25hdGl2ZV9oYW5kbGUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUsxM25hdGl2ZV9oYW5kbGUiLAogICAgInNpemUiIDogMTIsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTmF0aXZlSGFuZGxlLmgiCiAgIH0sCkBAIC0xMTI3NCw3ICsxMTk5Miw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLN2xvZ19tc2ciLAogICAgIm5hbWUiIDogImNvbnN0IGxvZ19tc2ciLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTdsb2dfbXNnIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLN2xvZ19tc2ciLAogICAgInNpemUiIDogNTEyNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2xvZ2dpbmcvbGlibG9nL2luY2x1ZGVfdm5kay9sb2cvbG9nX3JlYWQuaCIKICAgfSwKQEAgLTExMjg0LDkgKzEyMDAxLDggQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtEaSIsCiAgICAibmFtZSIgOiAiY29uc3QgY2hhcjMyX3QiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSURpIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLRGkiLAogICAgInNpemUiIDogNCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAyLApAQCAtMTEyOTQsOSArMTIwMTAsMTggQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtEcyIsCiAgICAibmFtZSIgOiAiY29uc3QgY2hhcjE2X3QiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSURzIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLRHMiLAogICAgInNpemUiIDogMiwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJpc19jb25zdCIgOiB0cnVlLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS043YW5kcm9pZDEwVmVjdG9ySW1wbEUiLAorICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlZlY3RvckltcGwiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEwVmVjdG9ySW1wbEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMjAsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LApAQCAtMTEzMDQsNyArMTIwMjksNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS043YW5kcm9pZDEwVmVjdG9ySW1wbEUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlZlY3RvckltcGwiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEwVmVjdG9ySW1wbEUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQxMFZlY3RvckltcGxFIiwKICAgICJzaXplIiA6IDIwLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKICAgfSwKQEAgLTExMzE0LDcgKzEyMDM4LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtON2FuZHJvaWQxMkxpZ2h0UmVmQmFzZUlOU18xMk5hdGl2ZUhhbmRsZUVFRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6TGlnaHRSZWZCYXNlPGFuZHJvaWQ6Ok5hdGl2ZUhhbmRsZT4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEyTGlnaHRSZWZCYXNlSU5TXzEyTmF0aXZlSGFuZGxlRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMTJMaWdodFJlZkJhc2VJTlNfMTJOYXRpdmVIYW5kbGVFRUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9MaWdodFJlZkJhc2UuaCIKICAgfSwKQEAgLTExMzI0LDcgKzEyMDQ3LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtON2FuZHJvaWQxMk5hdGl2ZUhhbmRsZUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6Ok5hdGl2ZUhhbmRsZSIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTJOYXRpdmVIYW5kbGVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMTJOYXRpdmVIYW5kbGVFIiwKICAgICJzaXplIiA6IDEyLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL05hdGl2ZUhhbmRsZS5oIgogICB9LApAQCAtMTEzMzMsMjAgKzEyMDU1LDE4IEBACiAgICAiaXNfY29uc3QiIDogdHJ1ZSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtON2FuZHJvaWQxNlJlZmVyZW5jZVJlbmFtZXJFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpSZWZlcmVuY2VSZW5hbWVyIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNlJlZmVyZW5jZVJlbmFtZXJFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMTZSZWZlcmVuY2VSZW5hbWVyRSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTZSZWZlcmVuY2VSZW5hbWVyRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAogICAgInNpemUiIDogNCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LAogICAgImlzX2NvbnN0IiA6IHRydWUsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLTjdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6U29ydGVkVmVjdG9ySW1wbCIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUiLAorICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKICAgICJzaXplIiA6IDIwLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCkBAIC0xMTM1NCw3ICsxMjA3NCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLTjdhbmRyb2lkMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mbyIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0UiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIgogICB9LApAQCAtMTEzNjQsNyArMTIwODMsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS043YW5kcm9pZDJzcElOU18xNExvb3BlckNhbGxiYWNrRUVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpMb29wZXJDYWxsYmFjaz4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDJzcElOU18xNExvb3BlckNhbGxiYWNrRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMnNwSU5TXzE0TG9vcGVyQ2FsbGJhY2tFRUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiCiAgIH0sCkBAIC0xMTM3NCw3ICsxMjA5Miw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLTjdhbmRyb2lkMnNwSU5TXzE0TWVzc2FnZUhhbmRsZXJFRUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Ok1lc3NhZ2VIYW5kbGVyPiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMnNwSU5TXzE0TWVzc2FnZUhhbmRsZXJFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQyc3BJTlNfMTRNZXNzYWdlSGFuZGxlckVFRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaCIKICAgfSwKQEAgLTExMzg0LDcgKzEyMTAxLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtON2FuZHJvaWQyc3BJTlNfMjBTaW1wbGVMb29wZXJDYWxsYmFja0VFRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6U2ltcGxlTG9vcGVyQ2FsbGJhY2s+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQyc3BJTlNfMjBTaW1wbGVMb29wZXJDYWxsYmFja0VFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDJzcElOU18yMFNpbXBsZUxvb3BlckNhbGxiYWNrRUVFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgogICB9LApAQCAtMTEzOTQsNyArMTIxMTAsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS043YW5kcm9pZDJzcElOU182TG9vcGVyRUVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpMb29wZXI+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQyc3BJTlNfNkxvb3BlckVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDJzcElOU182TG9vcGVyRUVFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgogICB9LApAQCAtMTE0MDQsNyArMTIxMTksNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS043YW5kcm9pZDJzcElOU182VGhyZWFkRUVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpUaHJlYWQ+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQyc3BJTlNfNlRocmVhZEVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDJzcElOU182VGhyZWFkRUVFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LApAQCAtMTE0MTQsNyArMTIxMjgsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS043YW5kcm9pZDJ3cElOU18xNE1lc3NhZ2VIYW5kbGVyRUVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjp3cDxhbmRyb2lkOjpNZXNzYWdlSGFuZGxlcj4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDJ3cElOU18xNE1lc3NhZ2VIYW5kbGVyRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMndwSU5TXzE0TWVzc2FnZUhhbmRsZXJFRUUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCkBAIC0xMTQyNCw3ICsxMjEzNyw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLTjdhbmRyb2lkMndwSU5TXzZUaHJlYWRFRUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OndwPGFuZHJvaWQ6OlRocmVhZD4iLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDJ3cElOU182VGhyZWFkRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkMndwSU5TXzZUaHJlYWRFRUUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCkBAIC0xMTQzNCw3ICsxMjE0Niw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLTjdhbmRyb2lkNGJhc2UxMWJvcnJvd2VkX2ZkRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDRiYXNlMTFib3Jyb3dlZF9mZEUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ0YmFzZTExYm9ycm93ZWRfZmRFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9saWJiYXNlL2luY2x1ZGUvYW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oIgogICB9LApAQCAtMTE0NDQsNyArMTIxNTUsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS043YW5kcm9pZDRiYXNlMTR1bmlxdWVfZmRfaW1wbElOUzBfMTNEZWZhdWx0Q2xvc2VyRUVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmRfaW1wbDxhbmRyb2lkOjpiYXNlOjpEZWZhdWx0Q2xvc2VyPiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNGJhc2UxNHVuaXF1ZV9mZF9pbXBsSU5TMF8xM0RlZmF1bHRDbG9zZXJFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ0YmFzZTE0dW5pcXVlX2ZkX2ltcGxJTlMwXzEzRGVmYXVsdENsb3NlckVFRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vbGliYmFzZS9pbmNsdWRlL2FuZHJvaWQtYmFzZS91bmlxdWVfZmQuaCIKICAgfSwKQEAgLTExNDU0LDcgKzEyMTY0LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtON2FuZHJvaWQ2TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpMb29wZXI6Ok1lc3NhZ2VFbnZlbG9wZSIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUUiLAogICAgInNpemUiIDogMTYsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIKICAgfSwKQEAgLTExNDY0LDcgKzEyMTczLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtON2FuZHJvaWQ2TG9vcGVyN1JlcXVlc3RFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpMb29wZXI6OlJlcXVlc3QiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZMb29wZXI3UmVxdWVzdEUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ2TG9vcGVyN1JlcXVlc3RFIiwKICAgICJzaXplIiA6IDIwLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0xvb3Blci5oIgogICB9LApAQCAtMTE0NzQsNyArMTIxODIsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS043YW5kcm9pZDZMb29wZXI4UmVzcG9uc2VFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpMb29wZXI6OlJlc3BvbnNlIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2TG9vcGVyOFJlc3BvbnNlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDZMb29wZXI4UmVzcG9uc2VFIiwKICAgICJzaXplIiA6IDMyLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiCiAgIH0sCkBAIC0xMTQ4NCw3ICsxMjE5MSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLTjdhbmRyb2lkNkxvb3BlckUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6Okxvb3BlciIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNkxvb3BlckUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ2TG9vcGVyRSIsCiAgICAic2l6ZSIgOiAxMzYsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTG9vcGVyLmgiCiAgIH0sCkBAIC0xMTQ5NCw3ICsxMjIwMCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLTjdhbmRyb2lkNlRocmVhZEUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlRocmVhZCIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNlRocmVhZEUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ2VGhyZWFkRSIsCiAgICAic2l6ZSIgOiA0NCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UaHJlYWQuaCIKICAgfSwKQEAgLTExNTA0LDcgKzEyMjA5LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtON2FuZHJvaWQ2VmVjdG9ySU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6VmVjdG9yPGFuZHJvaWQ6OnN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm8+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2VmVjdG9ySU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDZWZWN0b3JJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKICAgICJzaXplIiA6IDIwLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIgogICB9LApAQCAtMTE1MTQsNyArMTIyMTgsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS043YW5kcm9pZDZWZWN0b3JJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUVFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpWZWN0b3I8YW5kcm9pZDo6TG9vcGVyOjpNZXNzYWdlRW52ZWxvcGU+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2VmVjdG9ySU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDZWZWN0b3JJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUVFIiwKICAgICJzaXplIiA6IDIwLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIgogICB9LApAQCAtMTE1MjQsNyArMTIyMjcsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS043YW5kcm9pZDZWZWN0b3JJTlNfNkxvb3BlcjhSZXNwb25zZUVFRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6VmVjdG9yPGFuZHJvaWQ6Okxvb3Blcjo6UmVzcG9uc2U+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2VmVjdG9ySU5TXzZMb29wZXI4UmVzcG9uc2VFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ2VmVjdG9ySU5TXzZMb29wZXI4UmVzcG9uc2VFRUUiLAogICAgInNpemUiIDogMjAsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgiCiAgIH0sCkBAIC0xMTUzNCw5ICsxMjIzNiw4IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLTjdhbmRyb2lkNlZlY3RvcklOU183U3RyaW5nOEVFRSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6VmVjdG9yPGFuZHJvaWQ6OlN0cmluZzg+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2VmVjdG9ySU5TXzdTdHJpbmc4RUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkNlZlY3RvcklOU183U3RyaW5nOEVFRSIsCiAgICAic2l6ZSIgOiAyMCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3IuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogOCwKQEAgLTExNTQ0LDcgKzEyMjQ1LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtON2FuZHJvaWQ3RmlsZU1hcEUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OkZpbGVNYXAiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdGaWxlTWFwRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDdGaWxlTWFwRSIsCiAgICAic2l6ZSIgOiAzMiwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9GaWxlTWFwLmgiCiAgIH0sCkBAIC0xMTU1NCw3ICsxMjI1NCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLTjdhbmRyb2lkN01lc3NhZ2VFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpNZXNzYWdlIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3TWVzc2FnZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ3TWVzc2FnZUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Mb29wZXIuaCIKICAgfSwKQEAgLTExNTYzLDEwICsxMjI2MiwxOSBAQAogICAgImlzX2NvbnN0IiA6IHRydWUsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlJlZkJhc2U6OndlYWtyZWZfdHlwZSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKICAgICJzaXplIiA6IDEsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJpc19jb25zdCIgOiB0cnVlLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS043YW5kcm9pZDdSZWZCYXNlRSIsCisgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6UmVmQmFzZSIsCisgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDdSZWZCYXNlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogOCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCkBAIC0xMTU3NCw3ICsxMjI4Miw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLTjdhbmRyb2lkN1JlZkJhc2VFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpSZWZCYXNlIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ3UmVmQmFzZUUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCiAgIH0sCkBAIC0xMTU4Myw4ICsxMjI5MCwxNyBAQAogICAgImlzX2NvbnN0IiA6IHRydWUsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLTjdhbmRyb2lkN1N0cmluZzhFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpTdHJpbmc4IiwKKyAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJpc19jb25zdCIgOiB0cnVlLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS043YW5kcm9pZDdTdHJpbmc4RSIsCisgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6U3RyaW5nOCIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1N0cmluZzhFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkN1N0cmluZzhFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgogICB9LApAQCAtMTE1OTQsOSArMTIzMTAsOCBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS043YW5kcm9pZDhTdHJpbmcxNjEwU3RhdGljRGF0YUlMajFFRUUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlN0cmluZzE2OjpTdGF0aWNEYXRhPDE+IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ4U3RyaW5nMTYxMFN0YXRpY0RhdGFJTGoxRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkOFN0cmluZzE2MTBTdGF0aWNEYXRhSUxqMUVFRSIsCiAgICAic2l6ZSIgOiA4LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKQEAgLTExNjA0LDE5ICsxMjMxOSw4IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLTjdhbmRyb2lkOFN0cmluZzE2RSIsCiAgICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6U3RyaW5nMTYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDhTdHJpbmcxNkUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ4U3RyaW5nMTZFIiwKICAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIgotICB9LAotICB7Ci0gICAiYWxpZ25tZW50IiA6IDQsCi0gICAiaXNfY29uc3QiIDogdHJ1ZSwKLSAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUtON2FuZHJvaWQ5Q2FsbFN0YWNrRSIsCi0gICAibmFtZSIgOiAiY29uc3QgYW5kcm9pZDo6Q2FsbFN0YWNrIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ5Q2FsbFN0YWNrRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS043YW5kcm9pZDlDYWxsU3RhY2tFIiwKLSAgICJzaXplIiA6IDIwLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0NhbGxTdGFjay5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDgsCkBAIC0xMTYyNCw3ICsxMjMyOCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLTjdhbmRyb2lkOVN0b3BXYXRjaEUiLAogICAgIm5hbWUiIDogImNvbnN0IGFuZHJvaWQ6OlN0b3BXYXRjaCIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkOVN0b3BXYXRjaEUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUtON2FuZHJvaWQ5U3RvcFdhdGNoRSIsCiAgICAic2l6ZSIgOiAxNiwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdG9wV2F0Y2guaCIKICAgfSwKQEAgLTExNjM0LDI3ICsxMjMzNywxNSBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS043YW5kcm9pZDlUb2tlbml6ZXJFIiwKICAgICJuYW1lIiA6ICJjb25zdCBhbmRyb2lkOjpUb2tlbml6ZXIiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDlUb2tlbml6ZXJFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLTjdhbmRyb2lkOVRva2VuaXplckUiLAogICAgInNpemUiIDogMjgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVG9rZW5pemVyLmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKICAgICJpc19jb25zdCIgOiB0cnVlLAotICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS1BLYyIsCi0gICAibmFtZSIgOiAiY29uc3QgY2hhciAqY29uc3QiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSVBLYyIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS1BLYyIsCi0gICAic2l6ZSIgOiA0LAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJwcm9jZXNzZ3JvdXAvaW5jbHVkZS9wcm9jZXNzZ3JvdXAvcHJvY2Vzc2dyb3VwLmgiCi0gIH0sCi0gIHsKLSAgICJhbGlnbm1lbnQiIDogNCwKLSAgICJpc19jb25zdCIgOiB0cnVlLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS1BON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl9pbXBsRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6d2Vha3JlZl9pbXBsICpjb25zdCIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX2ltcGxFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX2ltcGxFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgogICB9LApAQCAtMTE2NjQsNyArMTIzNTUsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS2EiLAogICAgIm5hbWUiIDogImNvbnN0IHNpZ25lZCBjaGFyIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElhIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLYSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiCiAgIH0sCkBAIC0xMTY3NCw3ICsxMjM2NCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLYiIsCiAgICAibmFtZSIgOiAiY29uc3QgYm9vbCIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJYiIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS2IiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIgogICB9LApAQCAtMTE2ODQsNyArMTIzNzMsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS2MiLAogICAgIm5hbWUiIDogImNvbnN0IGNoYXIiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSWMiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUtjIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvRmlsZU1hcC5oIgogICB9LApAQCAtMTE2OTQsNyArMTIzODIsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS2QiLAogICAgIm5hbWUiIDogImNvbnN0IGRvdWJsZSIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJZCIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS2QiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIgogICB9LApAQCAtMTE3MDQsNyArMTIzOTEsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS2YiLAogICAgIm5hbWUiIDogImNvbnN0IGZsb2F0IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElmIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLZiIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiCiAgIH0sCkBAIC0xMTcxNCw3ICsxMjQwMCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLaCIsCiAgICAibmFtZSIgOiAiY29uc3QgdW5zaWduZWQgY2hhciIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaCIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS2giLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIgogICB9LApAQCAtMTE3MjQsNyArMTI0MDksNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS2kiLAogICAgIm5hbWUiIDogImNvbnN0IGludCIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS2kiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIgogICB9LApAQCAtMTE3MzQsNyArMTI0MTgsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS2oiLAogICAgIm5hbWUiIDogImNvbnN0IHVuc2lnbmVkIGludCIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJS2oiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIgogICB9LApAQCAtMTE3NDQsNyArMTI0MjcsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJS3MiLAogICAgIm5hbWUiIDogImNvbnN0IHNob3J0IiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElzIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLcyIsCiAgICAic2l6ZSIgOiAyLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiCiAgIH0sCkBAIC0xMTc1NCw3ICsxMjQzNiw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElLdCIsCiAgICAibmFtZSIgOiAiY29uc3QgdW5zaWduZWQgc2hvcnQiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSXQiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUt0IiwKICAgICJzaXplIiA6IDIsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIKICAgfSwKQEAgLTExNzYzLDcgKzEyNDQ0LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUt2IiwKICAgICJuYW1lIiA6ICJjb25zdCB2b2lkIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEl2IiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElLdiIsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTGlnaHRSZWZCYXNlLmgiCiAgIH0sCiAgIHsKQEAgLTExNzcyLDcgKzEyNDUyLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUt4IiwKICAgICJuYW1lIiA6ICJjb25zdCBsb25nIGxvbmciLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSXgiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUt4IiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIKICAgfSwKQEAgLTExNzgyLDcgKzEyNDYxLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSUt5IiwKICAgICJuYW1lIiA6ICJjb25zdCB1bnNpZ25lZCBsb25nIGxvbmciLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSXkiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSUt5IiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIKICAgfSwKQEAgLTExNzkyLDcgKzEyNDcwLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSVZiIiwKICAgICJuYW1lIiA6ICJ2b2xhdGlsZSBib29sIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEliIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElWYiIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1RocmVhZC5oIgogICB9CkBAIC0xMTg0NSw4ICsxMjUyMiw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJMTJsb2dnZXJfZW50cnkiLAogICAgIm5hbWUiIDogImxvZ2dlcl9lbnRyeSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJMTJsb2dnZXJfZW50cnkiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSTEybG9nZ2VyX2VudHJ5IiwKICAgICJzaXplIiA6IDI4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vbG9nZ2luZy9saWJsb2cvaW5jbHVkZV92bmRrL2xvZy9sb2dfcmVhZC5oIgogICB9LApAQCAtMTE4OTEsOCArMTI1NjYsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSTEzYW5kcm9pZF95Y2JjciIsCiAgICAibmFtZSIgOiAiYW5kcm9pZF95Y2JjciIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJMTNhbmRyb2lkX3ljYmNyIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVEkxM2FuZHJvaWRfeWNiY3IiLAogICAgInNpemUiIDogNTYsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnN5c3RlbS9pbmNsdWRlL3N5c3RlbS9ncmFwaGljcy5oIgogICB9LApAQCAtMTE5MjIsOCArMTI1OTUsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSTEzbmF0aXZlX2hhbmRsZSIsCiAgICAibmFtZSIgOiAibmF0aXZlX2hhbmRsZSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJMTNuYXRpdmVfaGFuZGxlIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVEkxM25hdGl2ZV9oYW5kbGUiLAogICAgInNpemUiIDogMTIsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYmN1dGlscy9pbmNsdWRlX291dHNpZGVfc3lzdGVtL2N1dGlscy9uYXRpdmVfaGFuZGxlLmgiCiAgIH0sCkBAIC0xMTk0Myw4ICsxMjYxNCw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJMTZhbmRyb2lkX3h5X2NvbG9yIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkX3h5X2NvbG9yIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkxNmFuZHJvaWRfeHlfY29sb3IiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSTE2YW5kcm9pZF94eV9jb2xvciIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJzeXN0ZW0vaW5jbHVkZS9zeXN0ZW0vZ3JhcGhpY3MuaCIKICAgfSwKQEAgLTExOTk0LDggKzEyNjYzLDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEkxOGFuZHJvaWRfZmxleF9wbGFuZSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZF9mbGV4X3BsYW5lIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkxOGFuZHJvaWRfZmxleF9wbGFuZSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJMThhbmRyb2lkX2ZsZXhfcGxhbmUiLAogICAgInNpemUiIDogMzIsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnN5c3RlbS9pbmNsdWRlL3N5c3RlbS9ncmFwaGljcy5oIgogICB9LApAQCAtMTIwMjAsOCArMTI2ODcsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSTE5YW5kcm9pZF9mbGV4X2xheW91dCIsCiAgICAibmFtZSIgOiAiYW5kcm9pZF9mbGV4X2xheW91dCIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJMTlhbmRyb2lkX2ZsZXhfbGF5b3V0IiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVEkxOWFuZHJvaWRfZmxleF9sYXlvdXQiLAogICAgInNpemUiIDogMTIsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnN5c3RlbS9pbmNsdWRlL3N5c3RlbS9ncmFwaGljcy5oIgogICB9LApAQCAtMTIwNDYsOCArMTI3MTEsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSTIwYW5kcm9pZF9kZXB0aF9wb2ludHMiLAogICAgIm5hbWUiIDogImFuZHJvaWRfZGVwdGhfcG9pbnRzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkyMGFuZHJvaWRfZGVwdGhfcG9pbnRzIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVEkyMGFuZHJvaWRfZGVwdGhfcG9pbnRzIiwKICAgICJzaXplIiA6IDM2LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJzeXN0ZW0vaW5jbHVkZS9zeXN0ZW0vZ3JhcGhpY3MuaCIKICAgfSwKQEAgLTEyMDkyLDggKzEyNzU1LDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEkyMV9fYW5kcm9pZF9sb2dfbWVzc2FnZSIsCiAgICAibmFtZSIgOiAiX19hbmRyb2lkX2xvZ19tZXNzYWdlIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkyMV9fYW5kcm9pZF9sb2dfbWVzc2FnZSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJMjFfX2FuZHJvaWRfbG9nX21lc3NhZ2UiLAogICAgInNpemUiIDogMjgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9sb2dnaW5nL2xpYmxvZy9pbmNsdWRlX3ZuZGsvYW5kcm9pZC9sb2cuaCIKICAgfSwKQEAgLTEyMTEzLDggKzEyNzc0LDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEkyNWFuZHJvaWRfY3RhODYxXzNfbWV0YWRhdGEiLAogICAgIm5hbWUiIDogImFuZHJvaWRfY3RhODYxXzNfbWV0YWRhdGEiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSTI1YW5kcm9pZF9jdGE4NjFfM19tZXRhZGF0YSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJMjVhbmRyb2lkX2N0YTg2MV8zX21ldGFkYXRhIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnN5c3RlbS9pbmNsdWRlL3N5c3RlbS9ncmFwaGljcy5oIgogICB9LApAQCAtMTIxNTQsOCArMTI4MTMsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSTI2YW5kcm9pZF9zbXB0ZTIwODZfbWV0YWRhdGEiLAogICAgIm5hbWUiIDogImFuZHJvaWRfc21wdGUyMDg2X21ldGFkYXRhIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVEkyNmFuZHJvaWRfc21wdGUyMDg2X21ldGFkYXRhIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVEkyNmFuZHJvaWRfc21wdGUyMDg2X21ldGFkYXRhIiwKICAgICJzaXplIiA6IDQwLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJzeXN0ZW0vaW5jbHVkZS9zeXN0ZW0vZ3JhcGhpY3MuaCIKICAgfSwKQEAgLTEyMTY5LDggKzEyODI2LDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVEk3bG9nX21zZyIsCiAgICAibmFtZSIgOiAibG9nX21zZyIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJN2xvZ19tc2ciLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSTdsb2dfbXNnIiwKICAgICJzaXplIiA6IDUxMjQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9sb2dnaW5nL2xpYmxvZy9pbmNsdWRlX3ZuZGsvbG9nL2xvZ19yZWFkLmgiCiAgIH0sCkBAIC0xMjE5MCw4ICsxMjg0NSw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJOGxvZ190aW1lIiwKICAgICJuYW1lIiA6ICJsb2dfdGltZSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJOGxvZ190aW1lIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVEk4bG9nX3RpbWUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2xvZ2dpbmcvbGlibG9nL2luY2x1ZGVfdm5kay9sb2cvbG9nX3RpbWUuaCIKICAgfSwKQEAgLTEyMjMzLDggKzEyODg2LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDEwTG9nUHJpbnRlckUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OkxvZ1ByaW50ZXIiLAogICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTBMb2dQcmludGVyRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTBMb2dQcmludGVyRSIsCiAgICAic2l6ZSIgOiAyMCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9QcmludGVyLmgiLAogICAgInZ0YWJsZV9jb21wb25lbnRzIiA6CkBAIC0xMjI5NCw4ICsxMjk0NSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxMFZlY3RvckltcGxFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3JJbXBsIiwKICAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEwVmVjdG9ySW1wbEUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEwVmVjdG9ySW1wbEUiLAogICAgInNpemUiIDogMjAsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIiwKICAgICJ2dGFibGVfY29tcG9uZW50cyIgOgpAQCAtMTIzNDIsNiArMTI5OTEsODQgQEAKICAgIF0KICAgfSwKICAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCisgICAgICJmaWVsZF9uYW1lIiA6ICJtU3RvcmFnZSIsCisgICAgICJmaWVsZF9vZmZzZXQiIDogMzIsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElQdiIKKyAgICB9LAorICAgIHsKKyAgICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCisgICAgICJmaWVsZF9uYW1lIiA6ICJtQ291bnQiLAorICAgICAiZmllbGRfb2Zmc2V0IiA6IDY0LAorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJaiIKKyAgICB9LAorICAgIHsKKyAgICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCisgICAgICJmaWVsZF9uYW1lIiA6ICJtRmxhZ3MiLAorICAgICAiZmllbGRfb2Zmc2V0IiA6IDk2LAorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJS2oiCisgICAgfSwKKyAgICB7CisgICAgICJhY2Nlc3MiIDogInByaXZhdGUiLAorICAgICAiZmllbGRfbmFtZSIgOiAibUl0ZW1TaXplIiwKKyAgICAgImZpZWxkX29mZnNldCIgOiAxMjgsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLaiIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9ySW1wbCIsCisgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxMFZlY3RvckltcGxFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAyMCwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIiwKKyAgICJ2dGFibGVfY29tcG9uZW50cyIgOgorICAgWworICAgIHsKKyAgICAgImtpbmQiIDogIm9mZnNldF90b190b3AiCisgICAgfSwKKyAgICB7CisgICAgICJraW5kIiA6ICJydHRpIiwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aVElON2FuZHJvaWQxMFZlY3RvckltcGxFIgorICAgIH0sCisgICAgeworICAgICAia2luZCIgOiAiY29tcGxldGVfZHRvcl9wb2ludGVyIiwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aTjdhbmRyb2lkMTBWZWN0b3JJbXBsRDFFdiIKKyAgICB9LAorICAgIHsKKyAgICAgImtpbmQiIDogImRlbGV0aW5nX2R0b3JfcG9pbnRlciIsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk43YW5kcm9pZDEwVmVjdG9ySW1wbEQwRXYiCisgICAgfSwKKyAgICB7CisgICAgICJpc19wdXJlIiA6IHRydWUsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk5LN2FuZHJvaWQxMFZlY3RvckltcGwxMmRvX2NvbnN0cnVjdEVQdmoiCisgICAgfSwKKyAgICB7CisgICAgICJpc19wdXJlIiA6IHRydWUsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk5LN2FuZHJvaWQxMFZlY3RvckltcGwxMGRvX2Rlc3Ryb3lFUHZqIgorICAgIH0sCisgICAgeworICAgICAiaXNfcHVyZSIgOiB0cnVlLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pOSzdhbmRyb2lkMTBWZWN0b3JJbXBsN2RvX2NvcHlFUHZQS3ZqIgorICAgIH0sCisgICAgeworICAgICAiaXNfcHVyZSIgOiB0cnVlLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pOSzdhbmRyb2lkMTBWZWN0b3JJbXBsOGRvX3NwbGF0RVB2UEt2aiIKKyAgICB9LAorICAgIHsKKyAgICAgImlzX3B1cmUiIDogdHJ1ZSwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aTks3YW5kcm9pZDEwVmVjdG9ySW1wbDE1ZG9fbW92ZV9mb3J3YXJkRVB2UEt2aiIKKyAgICB9LAorICAgIHsKKyAgICAgImlzX3B1cmUiIDogdHJ1ZSwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aTks3YW5kcm9pZDEwVmVjdG9ySW1wbDE2ZG9fbW92ZV9iYWNrd2FyZEVQdlBLdmoiCisgICAgfQorICAgXQorICB9LAorICB7CiAgICAiYWxpZ25tZW50IiA6IDgsCiAgICAiZmllbGRzIiA6CiAgICBbCkBAIC0xMjM1NCw4ICsxMzA4MSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxMVNjb3BlZFRyYWNlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6U2NvcGVkVHJhY2UiLAogICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTFTY29wZWRUcmFjZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDExU2NvcGVkVHJhY2VFIiwKICAgICJzaXplIiA6IDgsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHJhY2UuaCIKICAgfSwKQEAgLTEyMzcyLDggKzEzMDk3LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDEyTGlnaHRSZWZCYXNlSU5TXzEyTmF0aXZlSGFuZGxlRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpMaWdodFJlZkJhc2U8YW5kcm9pZDo6TmF0aXZlSGFuZGxlPiIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxMkxpZ2h0UmVmQmFzZUlOU18xMk5hdGl2ZUhhbmRsZUVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTJMaWdodFJlZkJhc2VJTlNfMTJOYXRpdmVIYW5kbGVFRUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9MaWdodFJlZkJhc2UuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTIzOTQsOCArMTMxMTcsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTJMaWdodFJlZkJhc2VJTlNfMTlWaXJ0dWFsTGlnaHRSZWZCYXNlRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpMaWdodFJlZkJhc2U8YW5kcm9pZDo6VmlydHVhbExpZ2h0UmVmQmFzZT4iLAogICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTJMaWdodFJlZkJhc2VJTlNfMTlWaXJ0dWFsTGlnaHRSZWZCYXNlRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxMkxpZ2h0UmVmQmFzZUlOU18xOVZpcnR1YWxMaWdodFJlZkJhc2VFRUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9MaWdodFJlZkJhc2UuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTI0MDUsNiArMTMxMjYsMjcgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LAorICAgImZpZWxkcyIgOgorICAgWworICAgIHsKKyAgICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCisgICAgICJmaWVsZF9uYW1lIiA6ICJtQ291bnQiLAorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTlN0M19fMTZhdG9taWNJaUVFIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxMkxpZ2h0UmVmQmFzZUlOU18xOVZpcnR1YWxMaWdodFJlZkJhc2VFRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OkxpZ2h0UmVmQmFzZTxhbmRyb2lkOjpWaXJ0dWFsTGlnaHRSZWZCYXNlPiIsCisgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxMkxpZ2h0UmVmQmFzZUlOU18xOVZpcnR1YWxMaWdodFJlZkJhc2VFRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDQsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL0xpZ2h0UmVmQmFzZS5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVElON2FuZHJvaWQxOVZpcnR1YWxMaWdodFJlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAogICAgImJhc2Vfc3BlY2lmaWVycyIgOgogICAgWwogICAgIHsKQEAgLTEyNDI5LDggKzEzMTcxLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDEyTmF0aXZlSGFuZGxlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6TmF0aXZlSGFuZGxlIiwKICAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEyTmF0aXZlSGFuZGxlRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTJOYXRpdmVIYW5kbGVFIiwKICAgICJzaXplIiA6IDEyLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL05hdGl2ZUhhbmRsZS5oIgogICB9LApAQCAtMTI0NjAsOCArMTMyMDAsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTNQcmVmaXhQcmludGVyRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6UHJlZml4UHJpbnRlciIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxM1ByZWZpeFByaW50ZXJFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxM1ByZWZpeFByaW50ZXJFIiwKICAgICJzaXplIiA6IDEyLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ByaW50ZXIuaCIsCiAgICAidnRhYmxlX2NvbXBvbmVudHMiIDoKQEAgLTEyNDkzLDggKzEzMjMxLDYgQEAKICAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDEzdHJhaXRfcG9pbnRlcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3BvaW50ZXI8YW5kcm9pZDo6c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mbz4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEzdHJhaXRfcG9pbnRlcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEzdHJhaXRfcG9pbnRlcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMjUwNiw4ICsxMzI0Miw2IEBACiAgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxM3RyYWl0X3BvaW50ZXJJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF9wb2ludGVyPGFuZHJvaWQ6Okxvb3Blcjo6TWVzc2FnZUVudmVsb3BlPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTN0cmFpdF9wb2ludGVySU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTN0cmFpdF9wb2ludGVySU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEyNTE5LDggKzEzMjUzLDYgQEAKICAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDEzdHJhaXRfcG9pbnRlcklOU182TG9vcGVyOFJlc3BvbnNlRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF9wb2ludGVyPGFuZHJvaWQ6Okxvb3Blcjo6UmVzcG9uc2U+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxM3RyYWl0X3BvaW50ZXJJTlNfNkxvb3BlcjhSZXNwb25zZUVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTN0cmFpdF9wb2ludGVySU5TXzZMb29wZXI4UmVzcG9uc2VFRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMjU0MCw4ICsxMzI3Miw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxNExvb3BlckNhbGxiYWNrRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6TG9vcGVyQ2FsbGJhY2siLAogICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTRMb29wZXJDYWxsYmFja0UiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE0TG9vcGVyQ2FsbGJhY2tFIiwKICAgICJzaXplIiA6IDEyLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0xvb3Blci5oIiwKICAgICJ2dGFibGVfY29tcG9uZW50cyIgOgpAQCAtMTI2MjcsOCArMTMzNTcsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTRNZXNzYWdlSGFuZGxlckUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6Ok1lc3NhZ2VIYW5kbGVyIiwKICAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE0TWVzc2FnZUhhbmRsZXJFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNE1lc3NhZ2VIYW5kbGVyRSIsCiAgICAic2l6ZSIgOiAxMiwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Mb29wZXIuaCIsCiAgICAidnRhYmxlX2NvbXBvbmVudHMiIDoKQEAgLTEyNzA3LDEyICsxMzQzNSwxOSBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTRSZWZlcmVuY2VNb3ZlckUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlJlZmVyZW5jZU1vdmVyIiwKICAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE0UmVmZXJlbmNlTW92ZXJFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNFJlZmVyZW5jZU1vdmVyRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgeworICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTRSZWZlcmVuY2VNb3ZlckUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OlJlZmVyZW5jZU1vdmVyIiwKKyAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE0UmVmZXJlbmNlTW92ZXJFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiCisgIH0sCisgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKICAgICJiYXNlX3NwZWNpZmllcnMiIDoKICAgIFsKQEAgLTEyNzMyLDEwICsxMzQ2Nyw4IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxNFN0YXRpY1N0cmluZzE2SUxqMUVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6U3RhdGljU3RyaW5nMTY8MT4iLAogICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTRTdGF0aWNTdHJpbmcxNklMajFFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE0U3RhdGljU3RyaW5nMTZJTGoxRUVFIiwKICAgICJzaXplIiA6IDEyLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiCiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogNCwKQEAgLTEyNzYzLDggKzEzNDk2LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE0U3RyaW5nOFByaW50ZXJFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpTdHJpbmc4UHJpbnRlciIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNFN0cmluZzhQcmludGVyRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTRTdHJpbmc4UHJpbnRlckUiLAogICAgInNpemUiIDogMTIsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUHJpbnRlci5oIiwKICAgICJ2dGFibGVfY29tcG9uZW50cyIgOgpAQCAtMTI3OTcsOCArMTM1MjgsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTZSZWZlcmVuY2VSZW5hbWVyRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6UmVmZXJlbmNlUmVuYW1lciIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNlJlZmVyZW5jZVJlbmFtZXJFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNlJlZmVyZW5jZVJlbmFtZXJFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIiwKICAgICJ2dGFibGVfY29tcG9uZW50cyIgOgpAQCAtMTI4MTgsNiArMTM1NDcsMjkgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTZSZWZlcmVuY2VSZW5hbWVyRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6UmVmZXJlbmNlUmVuYW1lciIsCisgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNlJlZmVyZW5jZVJlbmFtZXJFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiLAorICAgInZ0YWJsZV9jb21wb25lbnRzIiA6CisgICBbCisgICAgeworICAgICAia2luZCIgOiAib2Zmc2V0X3RvX3RvcCIKKyAgICB9LAorICAgIHsKKyAgICAgImtpbmQiIDogInJ0dGkiLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pUSU43YW5kcm9pZDE2UmVmZXJlbmNlUmVuYW1lckUiCisgICAgfSwKKyAgICB7CisgICAgICJpc19wdXJlIiA6IHRydWUsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk5LN2FuZHJvaWQxNlJlZmVyZW5jZVJlbmFtZXJjbEVqIgorICAgIH0KKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAogICAgImJhc2Vfc3BlY2lmaWVycyIgOgogICAgWwogICAgIHsKQEAgLTEyODI3LDggKzEzNTc5LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlNvcnRlZFZlY3RvckltcGwiLAogICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsRSIsCiAgICAic2l6ZSIgOiAyMCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgiLAogICAgInZ0YWJsZV9jb21wb25lbnRzIiA6CkBAIC0xMjg3OSw2ICsxMzYyOSw2NyBAQAogICAgXQogICB9LAogICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiYmFzZV9zcGVjaWZpZXJzIiA6CisgICBbCisgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiCisgICAgfQorICAgXSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OlNvcnRlZFZlY3RvckltcGwiLAorICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMjAsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCIsCisgICAidnRhYmxlX2NvbXBvbmVudHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJraW5kIiA6ICJvZmZzZXRfdG9fdG9wIgorICAgIH0sCisgICAgeworICAgICAia2luZCIgOiAicnR0aSIsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWlRJTjdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsRSIKKyAgICB9LAorICAgIHsKKyAgICAgImtpbmQiIDogImNvbXBsZXRlX2R0b3JfcG9pbnRlciIsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk43YW5kcm9pZDE2U29ydGVkVmVjdG9ySW1wbEQxRXYiCisgICAgfSwKKyAgICB7CisgICAgICJraW5kIiA6ICJkZWxldGluZ19kdG9yX3BvaW50ZXIiLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pON2FuZHJvaWQxNlNvcnRlZFZlY3RvckltcGxEMEV2IgorICAgIH0sCisgICAgeworICAgICAiaXNfcHVyZSIgOiB0cnVlLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pOSzdhbmRyb2lkMTBWZWN0b3JJbXBsMTJkb19jb25zdHJ1Y3RFUHZqIgorICAgIH0sCisgICAgeworICAgICAiaXNfcHVyZSIgOiB0cnVlLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pOSzdhbmRyb2lkMTBWZWN0b3JJbXBsMTBkb19kZXN0cm95RVB2aiIKKyAgICB9LAorICAgIHsKKyAgICAgImlzX3B1cmUiIDogdHJ1ZSwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aTks3YW5kcm9pZDEwVmVjdG9ySW1wbDdkb19jb3B5RVB2UEt2aiIKKyAgICB9LAorICAgIHsKKyAgICAgImlzX3B1cmUiIDogdHJ1ZSwKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aTks3YW5kcm9pZDEwVmVjdG9ySW1wbDhkb19zcGxhdEVQdlBLdmoiCisgICAgfSwKKyAgICB7CisgICAgICJpc19wdXJlIiA6IHRydWUsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk5LN2FuZHJvaWQxMFZlY3RvckltcGwxNWRvX21vdmVfZm9yd2FyZEVQdlBLdmoiCisgICAgfSwKKyAgICB7CisgICAgICJpc19wdXJlIiA6IHRydWUsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk5LN2FuZHJvaWQxMFZlY3RvckltcGwxNmRvX21vdmVfYmFja3dhcmRFUHZQS3ZqIgorICAgIH0sCisgICAgeworICAgICAiaXNfcHVyZSIgOiB0cnVlLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pOSzdhbmRyb2lkMTZTb3J0ZWRWZWN0b3JJbXBsMTBkb19jb21wYXJlRVBLdlMyXyIKKyAgICB9CisgICBdCisgIH0sCisgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKICAgICJiYXNlX3NwZWNpZmllcnMiIDoKICAgIFsKQEAgLTEyODg4LDggKzEzNjk5LDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxNnVzZV90cml2aWFsX21vdmVJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp1c2VfdHJpdmlhbF9tb3ZlPGFuZHJvaWQ6OnN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm8+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNnVzZV90cml2aWFsX21vdmVJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNnVzZV90cml2aWFsX21vdmVJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTI5MDcsOCArMTM3MTYsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE2dXNlX3RyaXZpYWxfbW92ZUlOU182TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnVzZV90cml2aWFsX21vdmU8YW5kcm9pZDo6TG9vcGVyOjpNZXNzYWdlRW52ZWxvcGU+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNnVzZV90cml2aWFsX21vdmVJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNnVzZV90cml2aWFsX21vdmVJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUVFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTI5MjYsOCArMTM3MzMsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE2dXNlX3RyaXZpYWxfbW92ZUlOU182TG9vcGVyOFJlc3BvbnNlRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp1c2VfdHJpdmlhbF9tb3ZlPGFuZHJvaWQ6Okxvb3Blcjo6UmVzcG9uc2U+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxNnVzZV90cml2aWFsX21vdmVJTlNfNkxvb3BlcjhSZXNwb25zZUVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTZ1c2VfdHJpdmlhbF9tb3ZlSU5TXzZMb29wZXI4UmVzcG9uc2VFRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMjk1NSw4ICsxMzc2MCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOFdlYWtNZXNzYWdlSGFuZGxlckUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OldlYWtNZXNzYWdlSGFuZGxlciIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOFdlYWtNZXNzYWdlSGFuZGxlckUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4V2Vha01lc3NhZ2VIYW5kbGVyRSIsCiAgICAic2l6ZSIgOiAyMCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Mb29wZXIuaCIsCiAgICAidnRhYmxlX2NvbXBvbmVudHMiIDoKQEAgLTEzMDMzLDggKzEzODM2LDYgQEAKICAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGFuZHJvaWQ6OnN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm8+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzMDQ2LDggKzEzODQ3LDYgQEAKICAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGFuZHJvaWQ6Okxvb3Blcjo6TWVzc2FnZUVudmVsb3BlPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlOU182TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzA1OSw4ICsxMzg1OCw2IEBACiAgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlOU182TG9vcGVyOFJlc3BvbnNlRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8YW5kcm9pZDo6TG9vcGVyOjpSZXNwb25zZT4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SU5TXzZMb29wZXI4UmVzcG9uc2VFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SU5TXzZMb29wZXI4UmVzcG9uc2VFRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzA3Miw4ICsxMzg2OSw2IEBACiAgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUliRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxib29sPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJYkVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUliRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzA4MywxMCArMTM4NzgsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJYkVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8Ym9vbD4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWJFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJYiIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJY0VFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8Y2hhcj4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWNFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJY0VFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTMwOTYsMTAgKzEzOTAxLDIwIEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWNFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGNoYXI+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUljRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWMiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWRFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGRvdWJsZT4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWRFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJZEVFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTMxMDksMTAgKzEzOTI0LDIwIEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWRFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGRvdWJsZT4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWRFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJZCIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJZkVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8ZmxvYXQ+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlmRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWZFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzMTIyLDEwICsxMzk0NywyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlmRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxmbG9hdD4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWZFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJZiIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJaEVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dW5zaWduZWQgY2hhcj4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWhFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJaEVFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTMxMzUsMTAgKzEzOTcwLDIwIEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWhFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGNoYXI+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUloRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWgiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWlFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGludD4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWlFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJaUVFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTMxNDgsMTAgKzEzOTkzLDIwIEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWlFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PGludD4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWlFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJaSIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJakVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dW5zaWduZWQgaW50PiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJakVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlqRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzE2MSwxMCArMTQwMTYsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJakVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dW5zaWduZWQgaW50PiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJakVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVElqIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlsRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxsb25nPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJbEVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlsRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzE3NCwxMCArMTQwMzksMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJbEVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8bG9uZz4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SWxFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJbCIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJbUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dW5zaWduZWQgbG9uZz4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SW1FRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJbUVFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTMxODcsMTAgKzE0MDYyLDIwIEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SW1FRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGxvbmc+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUltRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSW0iCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXNFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHNob3J0PiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJc0VFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlzRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzIwMCwxMCArMTQwODUsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJc0VFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8c2hvcnQ+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUlzRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSXMiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXRFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIHNob3J0PiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJdEVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl0RUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzIxMywxMCArMTQxMDgsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJdEVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2NvcHk8dW5zaWduZWQgc2hvcnQ+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl0RUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSXQiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXZFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHZvaWQ+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl2RUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXZFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzMjI2LDEwICsxNDEzMSwyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl2RUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTx2b2lkPiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJdkVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEl2IgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl4RUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxsb25nIGxvbmc+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl4RUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXhFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzMjM5LDEwICsxNDE1NCwyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl4RUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY29weTxsb25nIGxvbmc+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY29weUl4RUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSXgiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXlFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGxvbmcgbG9uZz4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXlFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2NvcHlJeUVFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTMyNTIsMTAgKzE0MTc3LDIwIEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXlFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jb3B5PHVuc2lnbmVkIGxvbmcgbG9uZz4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jb3B5SXlFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJeSIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8YW5kcm9pZDo6c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mbz4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTMyNjcsOCArMTQyMDIsNiBAQAogICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8YW5kcm9pZDo6TG9vcGVyOjpNZXNzYWdlRW52ZWxvcGU+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklOU182TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzMjgwLDggKzE0MjEzLDYgQEAKICAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySU5TXzZMb29wZXI4UmVzcG9uc2VFRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxhbmRyb2lkOjpMb29wZXI6OlJlc3BvbnNlPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJTlNfNkxvb3BlcjhSZXNwb25zZUVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJTlNfNkxvb3BlcjhSZXNwb25zZUVFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzMjkzLDggKzE0MjI0LDYgQEAKICAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWJFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGJvb2w+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckliRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWJFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzMzA0LDEwICsxNDIzMywyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckliRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjxib29sPiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJYkVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEliIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckljRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxjaGFyPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJY0VFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckljRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzMxNywxMCArMTQyNTYsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJY0VFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8Y2hhcj4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWNFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJYyIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJZEVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8ZG91YmxlPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJZEVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklkRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzMzMCwxMCArMTQyNzksMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJZEVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8ZG91YmxlPiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJZEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVElkIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklmRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxmbG9hdD4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWZFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJZkVFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTMzNDMsMTAgKzE0MzAyLDIwIEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWZFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGZsb2F0PiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJZkVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVElmIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckloRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBjaGFyPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJaEVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckloRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzM1NiwxMCArMTQzMjUsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJaEVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgY2hhcj4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWhFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJaCIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJaUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8aW50PiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJaUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklpRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzM2OSwxMCArMTQzNDgsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJaUVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8aW50PiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJaUVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVElpIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklqRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBpbnQ+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklqRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWpFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzMzgyLDEwICsxNDM3MSwyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklqRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBpbnQ+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklqRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWoiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWxFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGxvbmc+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklsRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySWxFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzMzk1LDEwICsxNDM5NCwyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklsRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjxsb25nPiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJbEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVElsIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckltRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBsb25nPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJbUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvckltRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzQwOCwxMCArMTQ0MTcsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJbUVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgbG9uZz4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySW1FRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJbSIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJc0VFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8c2hvcnQ+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklzRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXNFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzNDIxLDEwICsxNDQ0MCwyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3RvcklzRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3RvcjxzaG9ydD4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXNFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJcyIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJdEVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgc2hvcnQ+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl0RUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXRFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzNDM0LDEwICsxNDQ2MywyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl0RUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfY3Rvcjx1bnNpZ25lZCBzaG9ydD4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXRFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJdCIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJdkVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dm9pZD4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXZFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJdkVFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTM0NDcsMTAgKzE0NDg2LDIwIEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXZFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPHZvaWQ+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl2RUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSXYiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXhFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGxvbmcgbG9uZz4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXhFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJeEVFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTM0NjAsMTAgKzE0NTA5LDIwIEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXhFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9jdG9yPGxvbmcgbG9uZz4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9jdG9ySXhFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJeCIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJeUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgbG9uZyBsb25nPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJeUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfY3Rvckl5RUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzQ3MywxMCArMTQ1MzIsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJeUVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2N0b3I8dW5zaWduZWQgbG9uZyBsb25nPiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2N0b3JJeUVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEl5IgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxhbmRyb2lkOjpzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzQ4OCw4ICsxNDU1Nyw2IEBACiAgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklOU182TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxhbmRyb2lkOjpMb29wZXI6Ok1lc3NhZ2VFbnZlbG9wZT4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUVFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTM1MDEsOCArMTQ1NjgsNiBAQAogICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJTlNfNkxvb3BlcjhSZXNwb25zZUVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGFuZHJvaWQ6Okxvb3Blcjo6UmVzcG9uc2U+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklOU182TG9vcGVyOFJlc3BvbnNlRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklOU182TG9vcGVyOFJlc3BvbnNlRUVFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTM1MTQsOCArMTQ1NzksNiBAQAogICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJYkVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8Ym9vbD4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWJFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJYkVFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTM1MjUsMTAgKzE0NTg4LDIwIEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWJFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGJvb2w+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckliRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWIiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWNFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGNoYXI+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckljRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWNFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzNTM4LDEwICsxNDYxMSwyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckljRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxjaGFyPiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJY0VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEljIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklkRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxkb3VibGU+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklkRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWRFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzNTUxLDEwICsxNDYzNCwyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklkRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxkb3VibGU+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklkRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWQiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWZFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGZsb2F0PiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJZkVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklmRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzU2NCwxMCArMTQ2NTcsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJZkVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8ZmxvYXQ+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklmRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWYiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWhFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHVuc2lnbmVkIGNoYXI+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckloRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWhFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzNTc3LDEwICsxNDY4MCwyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckloRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBjaGFyPiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJaEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEloIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklpRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxpbnQ+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklpRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWlFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzNTkwLDEwICsxNDcwMywyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklpRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxpbnQ+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklpRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWkiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWpFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHVuc2lnbmVkIGludD4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWpFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJakVFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTM2MDMsMTAgKzE0NzI2LDIwIEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWpFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHVuc2lnbmVkIGludD4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWpFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJaiIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJbEVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8bG9uZz4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWxFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJbEVFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTM2MTYsMTAgKzE0NzQ5LDIwIEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySWxFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPGxvbmc+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklsRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWwiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySW1FRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHVuc2lnbmVkIGxvbmc+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckltRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySW1FRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzNjI5LDEwICsxNDc3MiwyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckltRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBsb25nPiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJbUVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEltIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvcklzRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjxzaG9ydD4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXNFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJc0VFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTM2NDIsMTAgKzE0Nzk1LDIwIEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXNFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHNob3J0PiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJc0VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVElzIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl0RUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBzaG9ydD4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXRFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJdEVFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTM2NTUsMTAgKzE0ODE4LDIwIEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXRFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9kdG9yPHVuc2lnbmVkIHNob3J0PiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJdEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEl0IgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl2RUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx2b2lkPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJdkVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl2RUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzY2OCwxMCArMTQ4NDEsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJdkVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8dm9pZD4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXZFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJdiIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJeEVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8bG9uZyBsb25nPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJeEVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl4RUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzY4MSwxMCArMTQ4NjQsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJeEVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX2R0b3I8bG9uZyBsb25nPiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX2R0b3JJeEVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEl4IgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl5RUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBsb25nIGxvbmc+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl5RUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9kdG9ySXlFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzNjk0LDEwICsxNDg4NywyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl5RUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfZHRvcjx1bnNpZ25lZCBsb25nIGxvbmc+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfZHRvckl5RUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSXkiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGFuZHJvaWQ6OnN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm8+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSU5TXzI4c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mb0VFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzNzA5LDggKzE0OTEyLDYgQEAKICAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGFuZHJvaWQ6Okxvb3Blcjo6TWVzc2FnZUVudmVsb3BlPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlOU182TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzcyMiw4ICsxNDkyMyw2IEBACiAgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlOU182TG9vcGVyOFJlc3BvbnNlRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8YW5kcm9pZDo6TG9vcGVyOjpSZXNwb25zZT4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSU5TXzZMb29wZXI4UmVzcG9uc2VFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSU5TXzZMb29wZXI4UmVzcG9uc2VFRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzczNSw4ICsxNDkzNCw2IEBACiAgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlOU183U3RyaW5nOEVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGFuZHJvaWQ6OlN0cmluZzg+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlOU183U3RyaW5nOEVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfN1N0cmluZzhFRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzNzQ2LDEyICsxNDk0MywyMiBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlOU183U3RyaW5nOEVFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGFuZHJvaWQ6OlN0cmluZzg+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlOU183U3RyaW5nOEVFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVElON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlOU184U3RyaW5nMTZFRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxhbmRyb2lkOjpTdHJpbmcxNj4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSU5TXzhTdHJpbmcxNkVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJTlNfOFN0cmluZzE2RUVFIiwKICAgICJzaXplIiA6IDEsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKICAgIFsKICAgICAiX1pUSU43YW5kcm9pZDhTdHJpbmcxNkUiCkBAIC0xMzc2MSw4ICsxNDk2OCw2IEBACiAgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUliRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxib29sPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJYkVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUliRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzc3MiwxMCArMTQ5NzcsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJYkVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8Ym9vbD4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWJFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJYiIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJY0VFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8Y2hhcj4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWNFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJY0VFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTM3ODUsMTAgKzE1MDAwLDIwIEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWNFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGNoYXI+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUljRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWMiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWRFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGRvdWJsZT4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWRFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJZEVFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTM3OTgsMTAgKzE1MDIzLDIwIEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWRFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGRvdWJsZT4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWRFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJZCIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJZkVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8ZmxvYXQ+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlmRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWZFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzODExLDEwICsxNTA0NiwyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlmRUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxmbG9hdD4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWZFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJZiIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJaEVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8dW5zaWduZWQgY2hhcj4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWhFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJaEVFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTM4MjQsMTAgKzE1MDY5LDIwIEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWhFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHVuc2lnbmVkIGNoYXI+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUloRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSWgiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWlFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGludD4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWlFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJaUVFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTM4MzcsMTAgKzE1MDkyLDIwIEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWlFRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPGludD4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWlFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJaSIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJakVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8dW5zaWduZWQgaW50PiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJakVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlqRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzg1MCwxMCArMTUxMTUsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJakVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8dW5zaWduZWQgaW50PiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJakVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVElqIgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlsRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxsb25nPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJbEVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlsRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzg2MywxMCArMTUxMzgsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJbEVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8bG9uZz4iLAorICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSWxFRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCisgICAidGVtcGxhdGVfYXJncyIgOgorICAgWworICAgICJfWlRJbCIKKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJbUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8dW5zaWduZWQgbG9uZz4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSW1FRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJbUVFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTM4NzYsMTAgKzE1MTYxLDIwIEBACiAgIH0sCiAgIHsKICAgICJhbGlnbm1lbnQiIDogMSwKKyAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSW1FRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHVuc2lnbmVkIGxvbmc+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUltRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSW0iCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXNFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHNob3J0PiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJc0VFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlzRUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzg4OSwxMCArMTUxODQsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJc0VFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8c2hvcnQ+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUlzRUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSXMiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXRFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHVuc2lnbmVkIHNob3J0PiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJdEVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl0RUUiLAogICAgInNpemUiIDogMSwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xMzkwMiwxMCArMTUyMDcsMjAgQEAKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJdEVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8dW5zaWduZWQgc2hvcnQ+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl0RUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSXQiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXZFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHZvaWQ+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl2RUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXZFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzOTE1LDEwICsxNTIzMCwyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl2RUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTx2b2lkPiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJdkVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEl2IgorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDEsCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl4RUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxsb25nIGxvbmc+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl4RUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXhFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTEzOTI4LDEwICsxNTI1MywyMCBAQAogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDEsCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl4RUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0X3RyaXZpYWxfbW92ZTxsb25nIGxvbmc+IiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOHRyYWl0X3RyaXZpYWxfbW92ZUl4RUUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIiwKKyAgICJzaXplIiA6IDEsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAorICAgInRlbXBsYXRlX2FyZ3MiIDoKKyAgIFsKKyAgICAiX1pUSXgiCisgICBdCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXlFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRfdHJpdmlhbF9tb3ZlPHVuc2lnbmVkIGxvbmcgbG9uZz4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE4dHJhaXRfdHJpdmlhbF9tb3ZlSXlFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJeUVFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTM5NDAsNiArMTUyNzUsMTggQEAKICAgIF0KICAgfSwKICAgeworICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJeUVFIiwKKyAgICJuYW1lIiA6ICJhbmRyb2lkOjp0cmFpdF90cml2aWFsX21vdmU8dW5zaWduZWQgbG9uZyBsb25nPiIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTh0cmFpdF90cml2aWFsX21vdmVJeUVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiAxLAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oIiwKKyAgICJ0ZW1wbGF0ZV9hcmdzIiA6CisgICBbCisgICAgIl9aVEl5IgorICAgXQorICB9LAorICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCiAgICAiYmFzZV9zcGVjaWZpZXJzIiA6CiAgICBbCkBAIC0xMzk1MCw4ICsxNTI5Nyw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQxOVZpcnR1YWxMaWdodFJlZkJhc2VFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpWaXJ0dWFsTGlnaHRSZWZCYXNlIiwKICAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE5VmlydHVhbExpZ2h0UmVmQmFzZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE5VmlydHVhbExpZ2h0UmVmQmFzZUUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9MaWdodFJlZkJhc2UuaCIsCiAgICAidnRhYmxlX2NvbXBvbmVudHMiIDoKQEAgLTEzOTc4LDYgKzE1MzIzLDM5IEBACiAgICAiYmFzZV9zcGVjaWZpZXJzIiA6CiAgICBbCiAgICAgeworICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTJMaWdodFJlZkJhc2VJTlNfMTlWaXJ0dWFsTGlnaHRSZWZCYXNlRUVFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIKKyAgICB9CisgICBdLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMTlWaXJ0dWFsTGlnaHRSZWZCYXNlRSIsCisgICAibmFtZSIgOiAiYW5kcm9pZDo6VmlydHVhbExpZ2h0UmVmQmFzZSIsCisgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQxOVZpcnR1YWxMaWdodFJlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA4LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9MaWdodFJlZkJhc2UuaCIsCisgICAidnRhYmxlX2NvbXBvbmVudHMiIDoKKyAgIFsKKyAgICB7CisgICAgICJraW5kIiA6ICJvZmZzZXRfdG9fdG9wIgorICAgIH0sCisgICAgeworICAgICAia2luZCIgOiAicnR0aSIsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWlRJTjdhbmRyb2lkMTlWaXJ0dWFsTGlnaHRSZWZCYXNlRSIKKyAgICB9LAorICAgIHsKKyAgICAgImtpbmQiIDogImNvbXBsZXRlX2R0b3JfcG9pbnRlciIsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk43YW5kcm9pZDE5VmlydHVhbExpZ2h0UmVmQmFzZUQxRXYiCisgICAgfSwKKyAgICB7CisgICAgICJraW5kIiA6ICJkZWxldGluZ19kdG9yX3BvaW50ZXIiLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pON2FuZHJvaWQxOVZpcnR1YWxMaWdodFJlZkJhc2VEMEV2IgorICAgIH0KKyAgIF0KKyAgfSwKKyAgeworICAgImFsaWdubWVudCIgOiA0LAorICAgImJhc2Vfc3BlY2lmaWVycyIgOgorICAgWworICAgIHsKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDE0TG9vcGVyQ2FsbGJhY2tFIgogICAgIH0KICAgIF0sCkBAIC0xMzk5Myw4ICsxNTM3MSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQyMFNpbXBsZUxvb3BlckNhbGxiYWNrRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6U2ltcGxlTG9vcGVyQ2FsbGJhY2siLAogICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMjBTaW1wbGVMb29wZXJDYWxsYmFja0UiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDIwU2ltcGxlTG9vcGVyQ2FsbGJhY2tFIiwKICAgICJzaXplIiA6IDE2LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0xvb3Blci5oIiwKICAgICJ2dGFibGVfY29tcG9uZW50cyIgOgpAQCAtMTQwODAsOCArMTU0NTYsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMnNwSU5TXzEyTmF0aXZlSGFuZGxlRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpzcDxhbmRyb2lkOjpOYXRpdmVIYW5kbGU+IiwKICAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDJzcElOU18xMk5hdGl2ZUhhbmRsZUVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMnNwSU5TXzEyTmF0aXZlSGFuZGxlRUVFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xNDEwMiw4ICsxNTQ3Niw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQyc3BJTlNfMTRMb29wZXJDYWxsYmFja0VFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6c3A8YW5kcm9pZDo6TG9vcGVyQ2FsbGJhY2s+IiwKICAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDJzcElOU18xNExvb3BlckNhbGxiYWNrRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQyc3BJTlNfMTRMb29wZXJDYWxsYmFja0VFRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTQxMjQsOCArMTU0OTYsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMnNwSU5TXzE0TWVzc2FnZUhhbmRsZXJFRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnNwPGFuZHJvaWQ6Ok1lc3NhZ2VIYW5kbGVyPiIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQyc3BJTlNfMTRNZXNzYWdlSGFuZGxlckVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMnNwSU5TXzE0TWVzc2FnZUhhbmRsZXJFRUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTE0MTQ2LDggKzE1NTE2LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDJzcElOU18yMFNpbXBsZUxvb3BlckNhbGxiYWNrRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpzcDxhbmRyb2lkOjpTaW1wbGVMb29wZXJDYWxsYmFjaz4iLAogICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMnNwSU5TXzIwU2ltcGxlTG9vcGVyQ2FsbGJhY2tFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDJzcElOU18yMFNpbXBsZUxvb3BlckNhbGxiYWNrRUVFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xNDE2OCw4ICsxNTUzNiw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQyc3BJTlNfNkxvb3BlckVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6c3A8YW5kcm9pZDo6TG9vcGVyPiIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQyc3BJTlNfNkxvb3BlckVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMnNwSU5TXzZMb29wZXJFRUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTE0MTkwLDggKzE1NTU2LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDJzcElOU182VGhyZWFkRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpzcDxhbmRyb2lkOjpUaHJlYWQ+IiwKICAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDJzcElOU182VGhyZWFkRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQyc3BJTlNfNlRocmVhZEVFRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTQyMTgsOCArMTU1ODIsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkMndwSU5TXzE0TWVzc2FnZUhhbmRsZXJFRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OndwPGFuZHJvaWQ6Ok1lc3NhZ2VIYW5kbGVyPiIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQyd3BJTlNfMTRNZXNzYWdlSGFuZGxlckVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMndwSU5TXzE0TWVzc2FnZUhhbmRsZXJFRUUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTE0MjQ2LDggKzE1NjA4LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDJ3cElOU182VGhyZWFkRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjp3cDxhbmRyb2lkOjpUaHJlYWQ+IiwKICAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDJ3cElOU182VGhyZWFkRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQyd3BJTlNfNlRocmVhZEVFRSIsCiAgICAic2l6ZSIgOiA4LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTQyNjcsOCArMTU2MjcsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDRiYXNlMTFib3Jyb3dlZF9mZEUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ0YmFzZTExYm9ycm93ZWRfZmRFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ0YmFzZTExYm9ycm93ZWRfZmRFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9saWJiYXNlL2luY2x1ZGUvYW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oIgogICB9LApAQCAtMTQyNzYsOCArMTU2MzQsNiBAQAogICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkNGJhc2UxM0RlZmF1bHRDbG9zZXJFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpiYXNlOjpEZWZhdWx0Q2xvc2VyIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ0YmFzZTEzRGVmYXVsdENsb3NlckUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDRiYXNlMTNEZWZhdWx0Q2xvc2VyRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vbGliYmFzZS9pbmNsdWRlL2FuZHJvaWQtYmFzZS91bmlxdWVfZmQuaCIKICAgfSwKQEAgLTE0Mjk0LDggKzE1NjUwLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDRiYXNlMTR1bmlxdWVfZmRfaW1wbElOUzBfMTNEZWZhdWx0Q2xvc2VyRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmRfaW1wbDxhbmRyb2lkOjpiYXNlOjpEZWZhdWx0Q2xvc2VyPiIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ0YmFzZTE0dW5pcXVlX2ZkX2ltcGxJTlMwXzEzRGVmYXVsdENsb3NlckVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNGJhc2UxNHVuaXF1ZV9mZF9pbXBsSU5TMF8xM0RlZmF1bHRDbG9zZXJFRUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2xpYmJhc2UvaW5jbHVkZS9hbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTE0MzE2LDggKzE1NjcwLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDVNdXRleDhBdXRvbG9ja0UiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6Ok11dGV4OjpBdXRvbG9jayIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ1TXV0ZXg4QXV0b2xvY2tFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ1TXV0ZXg4QXV0b2xvY2tFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTXV0ZXguaCIKICAgfSwKQEAgLTE0MzM0LDggKzE1Njg2LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDVNdXRleEUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6Ok11dGV4IiwKICAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDVNdXRleEUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDVNdXRleEUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9NdXRleC5oIgogICB9LApAQCAtMTQzNjEsOCArMTU3MTEsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6Okxvb3Blcjo6TWVzc2FnZUVudmVsb3BlIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFIiwKICAgICJzaXplIiA6IDE2LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0xvb3Blci5oIgogICB9LApAQCAtMTQzOTgsOCArMTU3NDYsNiBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDZMb29wZXI3UmVxdWVzdEUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6Okxvb3Blcjo6UmVxdWVzdCIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNkxvb3BlcjdSZXF1ZXN0RSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNkxvb3BlcjdSZXF1ZXN0RSIsCiAgICAic2l6ZSIgOiAyMCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Mb29wZXIuaCIKICAgfSwKQEAgLTE0NDI1LDggKzE1NzcxLDYgQEAKICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ2TG9vcGVyOFJlc3BvbnNlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6TG9vcGVyOjpSZXNwb25zZSIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNkxvb3BlcjhSZXNwb25zZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZMb29wZXI4UmVzcG9uc2VFIiwKICAgICJzaXplIiA6IDMyLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0xvb3Blci5oIgogICB9LApAQCAtMTQ1MjgsOCArMTU4NzIsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkNkxvb3BlckUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6Okxvb3BlciIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2TG9vcGVyRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNkxvb3BlckUiLAogICAgInNpemUiIDogMTM2LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0xvb3Blci5oIiwKICAgICJ2dGFibGVfY29tcG9uZW50cyIgOgpAQCAtMTQ1NzYsOCArMTU5MTgsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkNlJXTG9jazlBdXRvUkxvY2tFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpSV0xvY2s6OkF1dG9STG9jayIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2UldMb2NrOUF1dG9STG9ja0UiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZSV0xvY2s5QXV0b1JMb2NrRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JXTG9jay5oIgogICB9LApAQCAtMTQ1OTQsOCArMTU5MzQsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkNlJXTG9jazlBdXRvV0xvY2tFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpSV0xvY2s6OkF1dG9XTG9jayIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2UldMb2NrOUF1dG9XTG9ja0UiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZSV0xvY2s5QXV0b1dMb2NrRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JXTG9jay5oIgogICB9LApAQCAtMTQ2MTIsOCArMTU5NTAsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkNlJXTG9ja0UiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlJXTG9jayIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2UldMb2NrRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNlJXTG9ja0UiLAogICAgInNpemUiIDogNDAsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUldMb2NrLmgiCiAgIH0sCkBAIC0xNDY4Niw4ICsxNjAyMiw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ2VGhyZWFkRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6VGhyZWFkIiwKICAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZUaHJlYWRFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2VGhyZWFkRSIsCiAgICAic2l6ZSIgOiA0NCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UaHJlYWQuaCIsCiAgICAidnRhYmxlX2NvbXBvbmVudHMiIDoKQEAgLTE0NzgyLDggKzE2MTE2LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDZWZWN0b3JJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3I8YW5kcm9pZDo6c3lzcHJvcF9jaGFuZ2VfY2FsbGJhY2tfaW5mbz4iLAogICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNlZlY3RvcklOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZWZWN0b3JJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKICAgICJzaXplIiA6IDIwLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xNDgzOSw4ICsxNjE3MSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ2VmVjdG9ySU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9yPGFuZHJvaWQ6Okxvb3Blcjo6TWVzc2FnZUVudmVsb3BlPiIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2VmVjdG9ySU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNlZlY3RvcklOU182TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFRUUiLAogICAgInNpemUiIDogMjAsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTE0ODk2LDggKzE2MjI2LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDZWZWN0b3JJTlNfNkxvb3BlcjhSZXNwb25zZUVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6VmVjdG9yPGFuZHJvaWQ6Okxvb3Blcjo6UmVzcG9uc2U+IiwKICAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZWZWN0b3JJTlNfNkxvb3BlcjhSZXNwb25zZUVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNlZlY3RvcklOU182TG9vcGVyOFJlc3BvbnNlRUVFIiwKICAgICJzaXplIiA6IDIwLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CkBAIC0xNDk0NywxOSArMTYyNzUsMTcgQEAKICAgIFsKICAgICB7CiAgICAgICJhY2Nlc3MiIDogInByaXZhdGUiLAotICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMTBWZWN0b3JJbXBsRSIKKyAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDEwVmVjdG9ySW1wbEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgIH0KICAgIF0sCiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ2VmVjdG9ySU5TXzdTdHJpbmc4RUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpWZWN0b3I8YW5kcm9pZDo6U3RyaW5nOD4iLAogICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNlZlY3RvcklOU183U3RyaW5nOEVFRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNlZlY3RvcklOU183U3RyaW5nOEVFRSIsCiAgICAic2l6ZSIgOiAyMCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3IuaCIsCisgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIiwKICAgICJ0ZW1wbGF0ZV9hcmdzIiA6CiAgICBbCi0gICAgIl9aVElON2FuZHJvaWQ3U3RyaW5nOEUiCisgICAgIl9aVElON2FuZHJvaWQ3U3RyaW5nOEUjT0RSOm91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvbGlidXRpbHNfYmluZGVyL2FuZHJvaWRfdmVuZG9yX2FybV9hcm12OC1hX2NvcnRleC1hNTNfc3RhdGljX2FmZG8tbGlidXRpbHMvb2JqL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLnNkdW1wIgogICAgXSwKICAgICJ2dGFibGVfY29tcG9uZW50cyIgOgogICAgWwpAQCAtMTUwMDIsOCArMTYzMjgsNiBAQAogICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkNnRyYWl0c0lOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0czxhbmRyb2lkOjpzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvPiIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkNnRyYWl0c0lOU18yOHN5c3Byb3BfY2hhbmdlX2NhbGxiYWNrX2luZm9FRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZ0cmFpdHNJTlNfMjhzeXNwcm9wX2NoYW5nZV9jYWxsYmFja19pbmZvRUVFIiwKICAgICJzaXplIiA6IDEsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCIsCiAgICAidGVtcGxhdGVfYXJncyIgOgpAQCAtMTUwMTUsOCArMTYzMzksNiBAQAogICAgImFsaWdubWVudCIgOiAxLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkNnRyYWl0c0lOU182TG9vcGVyMTVNZXNzYWdlRW52ZWxvcGVFRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnRyYWl0czxhbmRyb2lkOjpMb29wZXI6Ok1lc3NhZ2VFbnZlbG9wZT4iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZ0cmFpdHNJTlNfNkxvb3BlcjE1TWVzc2FnZUVudmVsb3BlRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2dHJhaXRzSU5TXzZMb29wZXIxNU1lc3NhZ2VFbnZlbG9wZUVFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTE1MDI4LDggKzE2MzUwLDYgQEAKICAgICJhbGlnbm1lbnQiIDogMSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDZ0cmFpdHNJTlNfNkxvb3BlcjhSZXNwb25zZUVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6dHJhaXRzPGFuZHJvaWQ6Okxvb3Blcjo6UmVzcG9uc2U+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ2dHJhaXRzSU5TXzZMb29wZXI4UmVzcG9uc2VFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZ0cmFpdHNJTlNfNkxvb3BlcjhSZXNwb25zZUVFRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgiLAogICAgInRlbXBsYXRlX2FyZ3MiIDoKQEAgLTE1MDgwLDggKzE2NDAwLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDdGaWxlTWFwRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6RmlsZU1hcCIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3RmlsZU1hcEUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdGaWxlTWFwRSIsCiAgICAic2l6ZSIgOiAzMiwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9GaWxlTWFwLmgiCiAgIH0sCkBAIC0xNTA5Niw4ICsxNjQxNCw2IEBACiAgICBdLAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkN01lc3NhZ2VFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpNZXNzYWdlIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3TWVzc2FnZUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdNZXNzYWdlRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0xvb3Blci5oIgogICB9LApAQCAtMTUxMDYsOCArMTY0MjIsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkN1ByaW50ZXJFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpQcmludGVyIiwKICAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdQcmludGVyRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1ByaW50ZXJFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUHJpbnRlci5oIiwKICAgICJ2dGFibGVfY29tcG9uZW50cyIgOgpAQCAtMTUxNDEsMTIgKzE2NDU1LDE5IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6UmVmQmFzZTo6d2Vha3JlZl90eXBlIiwKICAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX3R5cGVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSIsCiAgICAic2l6ZSIgOiAxLAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaCIKICAgfSwKICAgeworICAgImFsaWdubWVudCIgOiAxLAorICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2UxMndlYWtyZWZfdHlwZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2U6OndlYWtyZWZfdHlwZSIsCisgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKKyAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZTEyd2Vha3JlZl90eXBlRSNPRFI6b3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL3N5c3RlbS9jb3JlL2xpYnV0aWxzL2JpbmRlci9saWJ1dGlsc19iaW5kZXIvYW5kcm9pZF92ZW5kb3JfYXJtX2FybXY4LWFfY29ydGV4LWE1M19zdGF0aWNfYWZkby1saWJ1dGlscy9vYmovc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL1JlZkJhc2Uuc2R1bXAiLAorICAgInNpemUiIDogMSwKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIgorICB9LAorICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCiAgICAiZmllbGRzIiA6CiAgICBbCkBAIC0xNTE2MCw4ICsxNjQ4MSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2UiLAogICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2VFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZUUiLAogICAgInNpemUiIDogOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiLAogICAgInZ0YWJsZV9jb21wb25lbnRzIiA6CkBAIC0xNTIwMSw2ICsxNjUyMCw1NCBAQAogICAgWwogICAgIHsKICAgICAgImFjY2VzcyIgOiAicHJpdmF0ZSIsCisgICAgICJmaWVsZF9uYW1lIiA6ICJtUmVmcyIsCisgICAgICJmaWVsZF9vZmZzZXQiIDogMzIsCisgICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElLUE43YW5kcm9pZDdSZWZCYXNlMTJ3ZWFrcmVmX2ltcGxFIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ3UmVmQmFzZUUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OlJlZkJhc2UiLAorICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1JlZkJhc2VFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA4LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgiLAorICAgInZ0YWJsZV9jb21wb25lbnRzIiA6CisgICBbCisgICAgeworICAgICAia2luZCIgOiAib2Zmc2V0X3RvX3RvcCIKKyAgICB9LAorICAgIHsKKyAgICAgImtpbmQiIDogInJ0dGkiLAorICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pUSU43YW5kcm9pZDdSZWZCYXNlRSIKKyAgICB9LAorICAgIHsKKyAgICAgImtpbmQiIDogImNvbXBsZXRlX2R0b3JfcG9pbnRlciIsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk43YW5kcm9pZDdSZWZCYXNlRDFFdiIKKyAgICB9LAorICAgIHsKKyAgICAgImtpbmQiIDogImRlbGV0aW5nX2R0b3JfcG9pbnRlciIsCisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk43YW5kcm9pZDdSZWZCYXNlRDBFdiIKKyAgICB9LAorICAgIHsKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aTjdhbmRyb2lkN1JlZkJhc2UxMG9uRmlyc3RSZWZFdiIKKyAgICB9LAorICAgIHsKKyAgICAgIm1hbmdsZWRfY29tcG9uZW50X25hbWUiIDogIl9aTjdhbmRyb2lkN1JlZkJhc2UxNW9uTGFzdFN0cm9uZ1JlZkVQS3YiCisgICAgfSwKKyAgICB7CisgICAgICJtYW5nbGVkX2NvbXBvbmVudF9uYW1lIiA6ICJfWk43YW5kcm9pZDdSZWZCYXNlMjBvbkluY1N0cm9uZ0F0dGVtcHRlZEVqUEt2IgorICAgIH0sCisgICAgeworICAgICAibWFuZ2xlZF9jb21wb25lbnRfbmFtZSIgOiAiX1pON2FuZHJvaWQ3UmVmQmFzZTEzb25MYXN0V2Vha1JlZkVQS3YiCisgICAgfQorICAgXQorICB9LAorICB7CisgICAiYWxpZ25tZW50IiA6IDQsCisgICAiZmllbGRzIiA6CisgICBbCisgICAgeworICAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKICAgICAgImZpZWxkX25hbWUiIDogIm1TdHJpbmciLAogICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgogICAgIH0KQEAgLTE1MjA4LDggKzE2NTc1LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nOCIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3U3RyaW5nOEUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDdTdHJpbmc4RSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCIKICAgfSwKQEAgLTE1MjE4LDYgKzE2NTgzLDIzIEBACiAgICAiZmllbGRzIiA6CiAgICBbCiAgICAgeworICAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKKyAgICAgImZpZWxkX25hbWUiIDogIm1TdHJpbmciLAorICAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJUEtjIgorICAgIH0KKyAgIF0sCisgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ3U3RyaW5nOEUiLAorICAgIm5hbWUiIDogImFuZHJvaWQ6OlN0cmluZzgiLAorICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCisgICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkN1N0cmluZzhFI09EUjpvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvc3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2xpYnV0aWxzX2JpbmRlci9hbmRyb2lkX3ZlbmRvcl9hcm1fYXJtdjgtYV9jb3J0ZXgtYTUzX3N0YXRpY19hZmRvLWxpYnV0aWxzL29iai9zeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZS5zZHVtcCIsCisgICAic2l6ZSIgOiA0LAorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgiCisgIH0sCisgIHsKKyAgICJhbGlnbm1lbnQiIDogNCwKKyAgICJmaWVsZHMiIDoKKyAgIFsKKyAgICB7CiAgICAgICJmaWVsZF9uYW1lIiA6ICJzaXplIiwKICAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSUtqIgogICAgIH0sCkBAIC0xNTIyOSwxMCArMTY2MTEsOCBAQAogICAgXSwKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDhTdHJpbmcxNjEwU3RhdGljRGF0YUlMajFFRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2OjpTdGF0aWNEYXRhPDE+IiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ4U3RyaW5nMTYxMFN0YXRpY0RhdGFJTGoxRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ4U3RyaW5nMTYxMFN0YXRpY0RhdGFJTGoxRUVFIiwKICAgICJzaXplIiA6IDgsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfSwKICAgewogICAgImFsaWdubWVudCIgOiA0LApAQCAtMTUyNDcsMzcgKzE2NjI3LDggQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDhTdHJpbmcxNkUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlN0cmluZzE2IiwKICAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDhTdHJpbmcxNkUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDhTdHJpbmcxNkUiLAogICAgInNpemUiIDogNCwKLSAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgotICB9LAotICB7Ci0gICAiYWxpZ25tZW50IiA6IDEsCi0gICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ5Q2FsbFN0YWNrMTJTdGFja0RlbGV0ZXJFIiwKLSAgICJuYW1lIiA6ICJhbmRyb2lkOjpDYWxsU3RhY2s6OlN0YWNrRGVsZXRlciIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkOUNhbGxTdGFjazEyU3RhY2tEZWxldGVyRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkOUNhbGxTdGFjazEyU3RhY2tEZWxldGVyRSIsCi0gICAic2l6ZSIgOiAxLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0NhbGxTdGFjay5oIgotICB9LAotICB7Ci0gICAiYWxpZ25tZW50IiA6IDQsCi0gICAiZmllbGRzIiA6Ci0gICBbCi0gICAgewotICAgICAiYWNjZXNzIiA6ICJwcml2YXRlIiwKLSAgICAgImZpZWxkX25hbWUiIDogIm1GcmFtZUxpbmVzIiwKLSAgICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDZWZWN0b3JJTlNfN1N0cmluZzhFRUUiCi0gICAgfQotICAgXSwKLSAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43YW5kcm9pZDlDYWxsU3RhY2tFIiwKLSAgICJuYW1lIiA6ICJhbmRyb2lkOjpDYWxsU3RhY2siLAotICAgInJlY29yZF9raW5kIiA6ICJjbGFzcyIsCi0gICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkOUNhbGxTdGFja0UiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDlDYWxsU3RhY2tFIiwKLSAgICJzaXplIiA6IDIwLAotICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0NhbGxTdGFjay5oIgorICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIgogICB9LAogICB7CiAgICAiYWxpZ25tZW50IiA6IDQsCkBAIC0xNTI5Miw4ICsxNjY0Myw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ5Q29uZGl0aW9uRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6Q29uZGl0aW9uIiwKICAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDlDb25kaXRpb25FIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ5Q29uZGl0aW9uRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0NvbmRpdGlvbi5oIgogICB9LApAQCAtMTUzMzUsOCArMTY2ODQsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkOUZkUHJpbnRlckUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OkZkUHJpbnRlciIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ5RmRQcmludGVyRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkOUZkUHJpbnRlckUiLAogICAgInNpemUiIDogMzYsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUHJpbnRlci5oIiwKICAgICJ2dGFibGVfY29tcG9uZW50cyIgOgpAQCAtMTUzODksOCArMTY3MzYsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJTjdhbmRyb2lkOVN0b3BXYXRjaEUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OlN0b3BXYXRjaCIsCiAgICAicmVjb3JkX2tpbmQiIDogImNsYXNzIiwKLSAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ5U3RvcFdhdGNoRSIsCi0gICAic2VsZl90eXBlIiA6ICJfWlRJTjdhbmRyb2lkOVN0b3BXYXRjaEUiLAogICAgInNpemUiIDogMTYsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RvcFdhdGNoLmgiCiAgIH0sCkBAIC0xNTQ0Myw4ICsxNjc4OCw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElON2FuZHJvaWQ5VG9rZW5pemVyRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6VG9rZW5pemVyIiwKICAgICJyZWNvcmRfa2luZCIgOiAiY2xhc3MiLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDlUb2tlbml6ZXJFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElON2FuZHJvaWQ5VG9rZW5pemVyRSIsCiAgICAic2l6ZSIgOiAyOCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Ub2tlbml6ZXIuaCIKICAgfSwKQEAgLTE1NDY1LDggKzE2ODA4LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU43bG9nX21zZ1V0X0UiLAogICAgIm5hbWUiIDogImxvZ19tc2c6Oihhbm9ueW1vdXMpIiwKICAgICJyZWNvcmRfa2luZCIgOiAidW5pb24iLAotICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43bG9nX21zZ1V0X0UiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU43bG9nX21zZ1V0X0UiLAogICAgInNpemUiIDogNTEyNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2xvZ2dpbmcvbGlibG9nL2luY2x1ZGVfdm5kay9sb2cvbG9nX3JlYWQuaCIKICAgfQpAQCAtMTU0NzgsNyArMTY4MTksNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJT043YW5kcm9pZDJzcElOU18xMk5hdGl2ZUhhbmRsZUVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6c3A8YW5kcm9pZDo6TmF0aXZlSGFuZGxlPiAmJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMnNwSU5TXzEyTmF0aXZlSGFuZGxlRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElPTjdhbmRyb2lkMnNwSU5TXzEyTmF0aXZlSGFuZGxlRUVFIiwKICAgICJzaXplIiA6IDQsCiAgICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIgogICB9LApAQCAtMTU0ODcsNyArMTY4MjcsNiBAQAogICAgImxpbmtlcl9zZXRfa2V5IiA6ICJfWlRJT043YW5kcm9pZDJzcElOU18xNE1lc3NhZ2VIYW5kbGVyRUVFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpzcDxhbmRyb2lkOjpNZXNzYWdlSGFuZGxlcj4gJiYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDJzcElOU18xNE1lc3NhZ2VIYW5kbGVyRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElPTjdhbmRyb2lkMnNwSU5TXzE0TWVzc2FnZUhhbmRsZXJFRUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgiCiAgIH0sCkBAIC0xNTQ5Niw3ICsxNjgzNSw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElPTjdhbmRyb2lkMnNwSU5TXzIwU2ltcGxlTG9vcGVyQ2FsbGJhY2tFRUUiLAogICAgIm5hbWUiIDogImFuZHJvaWQ6OnNwPGFuZHJvaWQ6OlNpbXBsZUxvb3BlckNhbGxiYWNrPiAmJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMnNwSU5TXzIwU2ltcGxlTG9vcGVyQ2FsbGJhY2tFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU9ON2FuZHJvaWQyc3BJTlNfMjBTaW1wbGVMb29wZXJDYWxsYmFja0VFRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaCIKICAgfSwKQEAgLTE1NTA1LDcgKzE2ODQzLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU9ON2FuZHJvaWQyc3BJTlNfNkxvb3BlckVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6c3A8YW5kcm9pZDo6TG9vcGVyPiAmJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMnNwSU5TXzZMb29wZXJFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU9ON2FuZHJvaWQyc3BJTlNfNkxvb3BlckVFRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaCIKICAgfSwKQEAgLTE1NTE0LDcgKzE2ODUxLDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU9ON2FuZHJvaWQyc3BJTlNfNlRocmVhZEVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6c3A8YW5kcm9pZDo6VGhyZWFkPiAmJiIsCiAgICAicmVmZXJlbmNlZF90eXBlIiA6ICJfWlRJTjdhbmRyb2lkMnNwSU5TXzZUaHJlYWRFRUUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU9ON2FuZHJvaWQyc3BJTlNfNlRocmVhZEVFRSIsCiAgICAic2l6ZSIgOiA0LAogICAgInNvdXJjZV9maWxlIiA6ICJzeXN0ZW0vY29yZS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaCIKICAgfSwKQEAgLTE1NTIzLDcgKzE2ODU5LDYgQEAKICAgICJsaW5rZXJfc2V0X2tleSIgOiAiX1pUSU9ON2FuZHJvaWQ0YmFzZTE0dW5pcXVlX2ZkX2ltcGxJTlMwXzEzRGVmYXVsdENsb3NlckVFRSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkX2ltcGw8YW5kcm9pZDo6YmFzZTo6RGVmYXVsdENsb3Nlcj4gJiYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDRiYXNlMTR1bmlxdWVfZmRfaW1wbElOUzBfMTNEZWZhdWx0Q2xvc2VyRUVFIiwKLSAgICJzZWxmX3R5cGUiIDogIl9aVElPTjdhbmRyb2lkNGJhc2UxNHVuaXF1ZV9mZF9pbXBsSU5TMF8xM0RlZmF1bHRDbG9zZXJFRUUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2xpYmJhc2UvaW5jbHVkZS9hbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmgiCiAgIH0sCkBAIC0xNTUzMiw3ICsxNjg2Nyw2IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElPTjdhbmRyb2lkN0ZpbGVNYXBFIiwKICAgICJuYW1lIiA6ICJhbmRyb2lkOjpGaWxlTWFwICYmIiwKICAgICJyZWZlcmVuY2VkX3R5cGUiIDogIl9aVElON2FuZHJvaWQ3RmlsZU1hcEUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU9ON2FuZHJvaWQ3RmlsZU1hcEUiLAogICAgInNpemUiIDogNCwKICAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvaW5jbHVkZS91dGlscy9GaWxlTWFwLmgiCiAgIH0sCkBAIC0xNTU0MSw5ICsxNjg3NSw4IEBACiAgICAibGlua2VyX3NldF9rZXkiIDogIl9aVElPTjdhbmRyb2lkOFN0cmluZzE2RSIsCiAgICAibmFtZSIgOiAiYW5kcm9pZDo6U3RyaW5nMTYgJiYiLAogICAgInJlZmVyZW5jZWRfdHlwZSIgOiAiX1pUSU43YW5kcm9pZDhTdHJpbmcxNkUiLAotICAgInNlbGZfdHlwZSIgOiAiX1pUSU9ON2FuZHJvaWQ4U3RyaW5nMTZFIiwKICAgICJzaXplIiA6IDQsCi0gICAic291cmNlX2ZpbGUiIDogInN5c3RlbS9jb3JlL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKKyAgICJzb3VyY2VfZmlsZSIgOiAic3lzdGVtL2NvcmUvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCIKICAgfQogIF0KIH0KZGlmZiAtLWdpdCBhL2xpYnV0aWxzL2JpbmRlci9BbmRyb2lkLmJwIGIvbGlidXRpbHMvYmluZGVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM1ODM5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnV0aWxzL2JpbmRlci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTU3IEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsic3lzdGVtX2NvcmVfbGlidXRpbHNfbGljZW5zZSJdLAorfQorCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYnV0aWxzX2JpbmRlcl9pbXBsX2RlZmF1bHRzX25vZGVwcyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYnV0aWxzX2RlZmF1bHRzX25vZGVwcyIsCisgICAgICAgICJhcGV4LWxvd2VzdC1taW4tc2RrLXZlcnNpb24iLAorICAgIF0sCisgICAgbmF0aXZlX2JyaWRnZV9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJFcnJvcnMuY3BwIiwKKyAgICAgICAgIlJlZkJhc2UuY3BwIiwKKyAgICAgICAgIlNoYXJlZEJ1ZmZlci5jcHAiLAorICAgICAgICAiU3RyaW5nMTYuY3BwIiwKKyAgICAgICAgIlN0cmluZzguY3BwIiwKKyAgICAgICAgIlN0cm9uZ1BvaW50ZXIuY3BwIiwKKyAgICAgICAgIlVuaWNvZGUuY3BwIiwKKyAgICAgICAgIlZlY3RvckltcGwuY3BwIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2ludmFsaWQtb2Zmc2V0b2YiLAorICAgICAgICAiLVdzZXF1ZW5jZS1wb2ludCIsCisgICAgICAgICItV3plcm8tYXMtbnVsbC1wb2ludGVyLWNvbnN0YW50IiwKKyAgICBdLAorCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6YW55YXBleCIsCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICBdLAorCisgICAgYWZkbzogdHJ1ZSwKK30KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJ1dGlsc19iaW5kZXJfaW1wbF9kZWZhdWx0cyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYnV0aWxzX2RlZmF1bHRzIiwKKyAgICAgICAgImxpYnV0aWxzX2JpbmRlcl9pbXBsX2RlZmF1bHRzX25vZGVwcyIsCisgICAgXSwKK30KKworY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYnV0aWxzX2JpbmRlciIsCisgICAgZGVmYXVsdHM6IFsibGlidXRpbHNfYmluZGVyX2ltcGxfZGVmYXVsdHMiXSwKKyAgICBjbWFrZV9zbmFwc2hvdF9zdXBwb3J0ZWQ6IGZhbHNlLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYnV0aWxzX2JpbmRlcl9zZGsiLAorICAgIGRlZmF1bHRzOiBbImxpYnV0aWxzX2JpbmRlcl9pbXBsX2RlZmF1bHRzX25vZGVwcyJdLAorICAgIGNtYWtlX3NuYXBzaG90X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJsb2dfc3R1YiIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURBTkRST0lEX0xPR19TVFVCX1dFQUtfUFJJTlQiLAorICAgICAgICAiLURBTkRST0lEX1VUSUxTX0NBTExTVEFDS19FTkFCTEVEPTAiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJ1dGlsc19iaW5kZXJfdGVzdF9jb21waWxlIiwKKyAgICBkZWZhdWx0czogWyJsaWJ1dGlsc19iaW5kZXJfaW1wbF9kZWZhdWx0cyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRERFQlVHX1JFRlM9MSIsCisgICAgXSwKKworICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibGlidXRpbHNfZnV6el9zdHJpbmc4IiwKKyAgICBkZWZhdWx0czogWyJsaWJ1dGlsc19mdXp6X2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJTdHJpbmc4X2Z1enouY3BwIl0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJsaWJ1dGlsc19mdXp6X3N0cmluZzE2IiwKKyAgICBkZWZhdWx0czogWyJsaWJ1dGlsc19mdXp6X2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJTdHJpbmcxNl9mdXp6LmNwcCJdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibGlidXRpbHNfZnV6el92ZWN0b3IiLAorICAgIGRlZmF1bHRzOiBbImxpYnV0aWxzX2Z1enpfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbIlZlY3Rvcl9mdXp6LmNwcCJdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibGlidXRpbHNfZnV6el9yZWZiYXNlIiwKKyAgICBkZWZhdWx0czogWyJsaWJ1dGlsc19mdXp6X2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJSZWZCYXNlX2Z1enouY3BwIl0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJsaWJ1dGlsc19iaW5kZXJfdGVzdCIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJFcnJvcnNfdGVzdC5jcHAiLAorICAgICAgICAiU2hhcmVkQnVmZmVyX3Rlc3QuY3BwIiwKKyAgICAgICAgIlN0cmluZzE2X3Rlc3QuY3BwIiwKKyAgICAgICAgIlN0cmluZzhfdGVzdC5jcHAiLAorICAgICAgICAiU3Ryb25nUG9pbnRlcl90ZXN0LmNwcCIsCisgICAgICAgICJVbmljb2RlX3Rlc3QuY3BwIiwKKyAgICAgICAgIlZlY3Rvcl90ZXN0LmNwcCIsCisgICAgXSwKKworICAgIHRhcmdldDogeworICAgICAgICBhbmRyb2lkOiB7CisgICAgICAgICAgICBzaGFyZWRfbGliczogWworICAgICAgICAgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgICAgICAgICAibGlibG9nIiwKKyAgICAgICAgICAgICAgICAibGlibHptYSIsCisgICAgICAgICAgICAgICAgImxpYnV0aWxzIiwgLy8gd2hpY2ggaW5jbHVkZXMgbGlidXRpbHNfYmluZGVyCisgICAgICAgICAgICAgICAgImxpYnoiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgfSwKKyAgICAgICAgbGludXg6IHsKKyAgICAgICAgICAgIHNyY3M6IFsKKyAgICAgICAgICAgICAgICAiUmVmQmFzZV90ZXN0LmNwcCIsCisgICAgICAgICAgICBdLAorICAgICAgICB9LAorICAgICAgICBob3N0OiB7CisgICAgICAgICAgICBzdGF0aWNfbGliczogWworICAgICAgICAgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgICAgICAgICAibGlibG9nIiwKKyAgICAgICAgICAgICAgICAibGlibHptYSIsCisgICAgICAgICAgICAgICAgImxpYnV0aWxzIiwgLy8gd2hpY2ggaW5jbHVkZXMgbGlidXRpbHNfYmluZGVyCisgICAgICAgICAgICBdLAorICAgICAgICB9LAorICAgIH0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV3RocmVhZC1zYWZldHkiLAorICAgIF0sCisKKyAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKK30KKworY2NfYmVuY2htYXJrIHsKKyAgICBuYW1lOiAibGlidXRpbHNfYmluZGVyX2JlbmNobWFyayIsCisgICAgc3JjczogWyJWZWN0b3JfYmVuY2htYXJrLmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYnV0aWxzIl0sCit9CmRpZmYgLS1naXQgYS9saWJ1dGlscy9FcnJvcnMuY3BwIGIvbGlidXRpbHMvYmluZGVyL0Vycm9ycy5jcHAKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gbGlidXRpbHMvRXJyb3JzLmNwcApyZW5hbWUgdG8gbGlidXRpbHMvYmluZGVyL0Vycm9ycy5jcHAKaW5kZXggNzRmM2JlZi4uZGZiNGQ5YiAxMDA2NDQKLS0tIGEvbGlidXRpbHMvRXJyb3JzLmNwcAorKysgYi9saWJ1dGlscy9iaW5kZXIvRXJyb3JzLmNwcApAQCAtMTUsNiArMTUsOCBAQAogICovCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdGQ6OnN0cmluZyBzdGF0dXNUb1N0cmluZyhzdGF0dXNfdCBzKSB7CmRpZmYgLS1naXQgYS9saWJ1dGlscy9FcnJvcnNfdGVzdC5jcHAgYi9saWJ1dGlscy9iaW5kZXIvRXJyb3JzX3Rlc3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWJ1dGlscy9FcnJvcnNfdGVzdC5jcHAKcmVuYW1lIHRvIGxpYnV0aWxzL2JpbmRlci9FcnJvcnNfdGVzdC5jcHAKZGlmZiAtLWdpdCBhL2xpYnV0aWxzL0Z1enpGb3JtYXRUeXBlcy5oIGIvbGlidXRpbHMvYmluZGVyL0Z1enpGb3JtYXRUeXBlcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWJ1dGlscy9GdXp6Rm9ybWF0VHlwZXMuaApyZW5hbWUgdG8gbGlidXRpbHMvYmluZGVyL0Z1enpGb3JtYXRUeXBlcy5oCmRpZmYgLS1naXQgYS9saWJ1dGlscy9SZWZCYXNlLmNwcCBiL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLmNwcApzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBsaWJ1dGlscy9SZWZCYXNlLmNwcApyZW5hbWUgdG8gbGlidXRpbHMvYmluZGVyL1JlZkJhc2UuY3BwCmluZGV4IGFiMTIyYzcuLjQyOTFmMWUgMTAwNjQ0Ci0tLSBhL2xpYnV0aWxzL1JlZkJhc2UuY3BwCisrKyBiL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlLmNwcApAQCAtMTgsOCArMTgsNyBAQAogLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KKyNpbmNsdWRlIDxtdXRleD4KIAogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8bG9nL2xvZy5oPgpAQCAtMjcsOCArMjYsNiBAQAogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKLSNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgotCiAjaWZuZGVmIF9fdW51c2VkCiAjZGVmaW5lIF9fdW51c2VkIF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKQogI2VuZGlmCkBAIC01OCwxNSArNTUsMTcgQEAKIC8vIGxvZyBhbGwgcmVmZXJlbmNlIGNvdW50aW5nIG9wZXJhdGlvbnMKICNkZWZpbmUgUFJJTlRfUkVGUyAwCiAKKyNpZiAhZGVmaW5lZChBTkRST0lEX1VUSUxTX0NBTExTVEFDS19FTkFCTEVEKQogI2lmIGRlZmluZWQoX19saW51eF9fKQogLy8gQ2FsbFN0YWNrIGlzIG9ubHkgc3VwcG9ydGVkIG9uIGxpbnV4IHR5cGUgcGxhdGZvcm1zLgotI2RlZmluZSBDQUxMU1RBQ0tfRU5BQkxFRCAxCisjZGVmaW5lIEFORFJPSURfVVRJTFNfQ0FMTFNUQUNLX0VOQUJMRUQgMQogI2Vsc2UKLSNkZWZpbmUgQ0FMTFNUQUNLX0VOQUJMRUQgMAotI2VuZGlmCisjZGVmaW5lIEFORFJPSURfVVRJTFNfQ0FMTFNUQUNLX0VOQUJMRUQgMAorI2VuZGlmICAvLyBkZWZpbmVkKF9fbGludXhfXykKKyNlbmRpZiAgLy8gIWRlZmluZWQoQU5EUk9JRF9VVElMU19DQUxMU1RBQ0tfRU5BQkxFRCkKIAotI2lmIENBTExTVEFDS19FTkFCTEVECi0jaW5jbHVkZSA8dXRpbHMvQ2FsbFN0YWNrLmg+CisjaWYgQU5EUk9JRF9VVElMU19DQUxMU1RBQ0tfRU5BQkxFRAorI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvdXRpbHMvQ2FsbFN0YWNrLmgiCiAjZW5kaWYKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yMzMsNyArMjMyLDcgQEAKICAgICAgICAgICAgIHdoaWxlIChyZWZzKSB7CiAgICAgICAgICAgICAgICAgY2hhciBpbmMgPSByZWZzLT5yZWYgPj0gMCA/ICcrJyA6ICctJzsKICAgICAgICAgICAgICAgICBBTE9HRCgiXHQlYyBJRCAlcCAocmVmICVkKToiLCBpbmMsIHJlZnMtPmlkLCByZWZzLT5yZWYpOwotI2lmIERFQlVHX1JFRlNfQ0FMTFNUQUNLX0VOQUJMRUQgJiYgQ0FMTFNUQUNLX0VOQUJMRUQKKyNpZiBERUJVR19SRUZTX0NBTExTVEFDS19FTkFCTEVEICYmIEFORFJPSURfVVRJTFNfQ0FMTFNUQUNLX0VOQUJMRUQKICAgICAgICAgICAgICAgICBDYWxsU3RhY2s6OmxvZ1N0YWNrKExPR19UQUcsIHJlZnMtPnN0YWNrLmdldCgpKTsKICNlbmRpZgogICAgICAgICAgICAgICAgIHJlZnMgPSByZWZzLT5uZXh0OwpAQCAtMjQ3LDcgKzI0Niw3IEBACiAgICAgICAgICAgICB3aGlsZSAocmVmcykgewogICAgICAgICAgICAgICAgIGNoYXIgaW5jID0gcmVmcy0+cmVmID49IDAgPyAnKycgOiAnLSc7CiAgICAgICAgICAgICAgICAgQUxPR0QoIlx0JWMgSUQgJXAgKHJlZiAlZCk6IiwgaW5jLCByZWZzLT5pZCwgcmVmcy0+cmVmKTsKLSNpZiBERUJVR19SRUZTX0NBTExTVEFDS19FTkFCTEVEICYmIENBTExTVEFDS19FTkFCTEVECisjaWYgREVCVUdfUkVGU19DQUxMU1RBQ0tfRU5BQkxFRCAmJiBBTkRST0lEX1VUSUxTX0NBTExTVEFDS19FTkFCTEVECiAgICAgICAgICAgICAgICAgQ2FsbFN0YWNrOjpsb2dTdGFjayhMT0dfVEFHLCByZWZzLT5zdGFjay5nZXQoKSk7CiAjZW5kaWYKICAgICAgICAgICAgICAgICByZWZzID0gcmVmcy0+bmV4dDsKQEAgLTI1NSw3ICsyNTQsNyBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChkdW1wU3RhY2spIHsKICAgICAgICAgICAgIEFMT0dFKCJhYm92ZSBlcnJvcnMgYXQ6Iik7Ci0jaWYgQ0FMTFNUQUNLX0VOQUJMRUQKKyNpZiBBTkRST0lEX1VUSUxTX0NBTExTVEFDS19FTkFCTEVECiAgICAgICAgICAgICBDYWxsU3RhY2s6OmxvZ1N0YWNrKExPR19UQUcpOwogI2VuZGlmCiAgICAgICAgIH0KQEAgLTMxMCw3ICszMDksNyBAQAogICAgICAgICBTdHJpbmc4IHRleHQ7CiAKICAgICAgICAgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1NdXRleCk7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobU11dGV4KTsKICAgICAgICAgICAgIGNoYXIgYnVmWzEyOF07CiAgICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLAogICAgICAgICAgICAgICAgICAgICAgIlN0cm9uZyByZWZlcmVuY2VzIG9uIFJlZkJhc2UgJXAgKHdlYWtyZWZfdHlwZSAlcCk6XG4iLApAQCAtMzMwLDcgKzMyOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICB0aGlzKTsKICAgICAgICAgICAgIGludCByYyA9IG9wZW4obmFtZSwgT19SRFdSIHwgT19DUkVBVCB8IE9fQVBQRU5ELCAwNjQ0KTsKICAgICAgICAgICAgIGlmIChyYyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgKHZvaWQpd3JpdGUocmMsIHRleHQuc3RyaW5nKCksIHRleHQubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICh2b2lkKXdyaXRlKHJjLCB0ZXh0LmNfc3RyKCksIHRleHQubGVuZ3RoKCkpOwogICAgICAgICAgICAgICAgIGNsb3NlKHJjKTsKICAgICAgICAgICAgICAgICBBTE9HSSgiU1RBQ0sgVFJBQ0UgZm9yICVwIHNhdmVkIGluICVzIiwgdGhpcywgbmFtZSk7CiAgICAgICAgICAgICB9CkBAIC0zNDQsNyArMzQzLDcgQEAKICAgICB7CiAgICAgICAgIHJlZl9lbnRyeSogbmV4dDsKICAgICAgICAgY29uc3Qgdm9pZCogaWQ7Ci0jaWYgREVCVUdfUkVGU19DQUxMU1RBQ0tfRU5BQkxFRCAmJiBDQUxMU1RBQ0tfRU5BQkxFRAorI2lmIERFQlVHX1JFRlNfQ0FMTFNUQUNLX0VOQUJMRUQgJiYgQU5EUk9JRF9VVElMU19DQUxMU1RBQ0tfRU5BQkxFRAogICAgICAgICBDYWxsU3RhY2s6OkNhbGxTdGFja1VQdHIgc3RhY2s7CiAjZW5kaWYKICAgICAgICAgaW50MzJfdCByZWY7CkBAIC0zNTMsNyArMzUyLDcgQEAKICAgICB2b2lkIGFkZFJlZihyZWZfZW50cnkqKiByZWZzLCBjb25zdCB2b2lkKiBpZCwgaW50MzJfdCBtUmVmKQogICAgIHsKICAgICAgICAgaWYgKG1UcmFja0VuYWJsZWQpIHsKLSAgICAgICAgICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IF9sKG1NdXRleCk7CiAKICAgICAgICAgICAgIHJlZl9lbnRyeSogcmVmID0gbmV3IHJlZl9lbnRyeTsKICAgICAgICAgICAgIC8vIFJlZmVyZW5jZSBjb3VudCBhdCB0aGUgdGltZSBvZiB0aGUgc25hcHNob3QsIGJ1dCBiZWZvcmUgdGhlCkBAIC0zNjEsNyArMzYwLDcgQEAKICAgICAgICAgICAgIC8vIGRlY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50LgogICAgICAgICAgICAgcmVmLT5yZWYgPSBtUmVmOwogICAgICAgICAgICAgcmVmLT5pZCA9IGlkOwotI2lmIERFQlVHX1JFRlNfQ0FMTFNUQUNLX0VOQUJMRUQgJiYgQ0FMTFNUQUNLX0VOQUJMRUQKKyNpZiBERUJVR19SRUZTX0NBTExTVEFDS19FTkFCTEVEICYmIEFORFJPSURfVVRJTFNfQ0FMTFNUQUNLX0VOQUJMRUQKICAgICAgICAgICAgIHJlZi0+c3RhY2sgPSBDYWxsU3RhY2s6OmdldEN1cnJlbnQoMik7CiAjZW5kaWYKICAgICAgICAgICAgIHJlZi0+bmV4dCA9ICpyZWZzOwpAQCAtMzcyLDcgKzM3MSw3IEBACiAgICAgdm9pZCByZW1vdmVSZWYocmVmX2VudHJ5KiogcmVmcywgY29uc3Qgdm9pZCogaWQpCiAgICAgewogICAgICAgICBpZiAobVRyYWNrRW5hYmxlZCkgewotICAgICAgICAgICAgQXV0b011dGV4IF9sKG1NdXRleCk7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobU11dGV4KTsKIAogICAgICAgICAgICAgcmVmX2VudHJ5KiBjb25zdCBoZWFkID0gKnJlZnM7CiAgICAgICAgICAgICByZWZfZW50cnkqIHJlZiA9IGhlYWQ7CkBAIC0zOTcsNyArMzk2LDcgQEAKICAgICAgICAgICAgICAgICByZWYgPSByZWYtPm5leHQ7CiAgICAgICAgICAgICB9CiAKLSNpZiBDQUxMU1RBQ0tfRU5BQkxFRAorI2lmIEFORFJPSURfVVRJTFNfQ0FMTFNUQUNLX0VOQUJMRUQKICAgICAgICAgICAgIENhbGxTdGFjazo6bG9nU3RhY2soTE9HX1RBRyk7CiAjZW5kaWYKICAgICAgICAgfQpAQCAtNDA2LDcgKzQwNSw3IEBACiAgICAgdm9pZCByZW5hbWVSZWZzSWQocmVmX2VudHJ5KiByLCBjb25zdCB2b2lkKiBvbGRfaWQsIGNvbnN0IHZvaWQqIG5ld19pZCkKICAgICB7CiAgICAgICAgIGlmIChtVHJhY2tFbmFibGVkKSB7Ci0gICAgICAgICAgICBBdXRvTXV0ZXggX2wobU11dGV4KTsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBfbChtTXV0ZXgpOwogICAgICAgICAgICAgcmVmX2VudHJ5KiByZWYgPSByOwogICAgICAgICAgICAgd2hpbGUgKHJlZiAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgaWYgKHJlZi0+aWQgPT0gb2xkX2lkKSB7CkBAIC00MjUsNyArNDI0LDcgQEAKICAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJcdCVjIElEICVwIChyZWYgJWQpOlxuIiwKICAgICAgICAgICAgICAgICAgICAgIGluYywgcmVmcy0+aWQsIHJlZnMtPnJlZik7CiAgICAgICAgICAgICBvdXQtPmFwcGVuZChidWYpOwotI2lmIERFQlVHX1JFRlNfQ0FMTFNUQUNLX0VOQUJMRUQgJiYgQ0FMTFNUQUNLX0VOQUJMRUQKKyNpZiBERUJVR19SRUZTX0NBTExTVEFDS19FTkFCTEVEICYmIEFORFJPSURfVVRJTFNfQ0FMTFNUQUNLX0VOQUJMRUQKICAgICAgICAgICAgIG91dC0+YXBwZW5kKENhbGxTdGFjazo6c3RhY2tUb1N0cmluZygiXHRcdCIsIHJlZnMtPnN0YWNrLmdldCgpKSk7CiAjZWxzZQogICAgICAgICAgICAgb3V0LT5hcHBlbmQoIlx0XHQoY2FsbCBzdGFja3MgZGlzYWJsZWQpIik7CkBAIC00MzQsNyArNDMzLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIG11dGFibGUgTXV0ZXggbU11dGV4OworICAgIG11dGFibGUgc3RkOjptdXRleCBtTXV0ZXg7CiAgICAgcmVmX2VudHJ5KiBtU3Ryb25nUmVmczsKICAgICByZWZfZW50cnkqIG1XZWFrUmVmczsKIApAQCAtNTM3LDcgKzUzNiw3IEBACiAgICAgY2FzZSBJTklUSUFMX1NUUk9OR19WQUxVRToKICAgICAgICAgcmVmcy0+bVN0cm9uZy5mZXRjaF9zdWIoSU5JVElBTF9TVFJPTkdfVkFMVUUsCiAgICAgICAgICAgICAgICAgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7Ci0gICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOworICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CiAgICAgY2FzZSAwOgogICAgICAgICByZWZzLT5tQmFzZS0+b25GaXJzdFJlZigpOwogICAgIH0KQEAgLTc4OCwxMCArNzg3LDEwIEBACiAgICAgICAgICAgICAvLyBzcDxUPihUKikgY29uc3RydWN0b3IsIGFzc3VtaW5nIHRoYXQgaWYgdGhlIG9iamVjdCBpcyBhcm91bmQsIGl0IGlzIGFscmVhZHkKICAgICAgICAgICAgIC8vIG93bmVkIGJ5IGFuIHNwPD4uCiAgICAgICAgICAgICBBTE9HVygiUmVmQmFzZTogRXhwbGljaXQgZGVzdHJ1Y3Rpb24sIHdlYWsgY291bnQgPSAlZCAoaW4gJXApLiBVc2Ugc3A8PiB0byBtYW5hZ2UgdGhpcyAiCi0gICAgICAgICAgICAgICAgICAib2JqZWN0LiIsCisgICAgICAgICAgICAgICAgICAib2JqZWN0LiBOb3RlIC0gaWYgd2VhayBjb3VudCBpcyAwLCB0aGlzIGxlYWtzIG1SZWZzICh3ZWFrcmVmX2ltcGwpLiIsCiAgICAgICAgICAgICAgICAgICBtUmVmcy0+bVdlYWsubG9hZCgpLCB0aGlzKTsKIAotI2lmIENBTExTVEFDS19FTkFCTEVECisjaWYgQU5EUk9JRF9VVElMU19DQUxMU1RBQ0tfRU5BQkxFRAogICAgICAgICAgICAgQ2FsbFN0YWNrOjpsb2dTdGFjayhMT0dfVEFHKTsKICNlbmRpZgogICAgICAgICB9IGVsc2UgaWYgKHN0cm9uZ3MgIT0gMCkgewpkaWZmIC0tZ2l0IGEvbGlidXRpbHMvUmVmQmFzZV9mdXp6LmNwcCBiL2xpYnV0aWxzL2JpbmRlci9SZWZCYXNlX2Z1enouY3BwCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIGxpYnV0aWxzL1JlZkJhc2VfZnV6ei5jcHAKcmVuYW1lIHRvIGxpYnV0aWxzL2JpbmRlci9SZWZCYXNlX2Z1enouY3BwCmluZGV4IDgyOTFiZTkuLjA1ZjQ3YTAgMTAwNjQ0Ci0tLSBhL2xpYnV0aWxzL1JlZkJhc2VfZnV6ei5jcHAKKysrIGIvbGlidXRpbHMvYmluZGVyL1JlZkJhc2VfZnV6ei5jcHAKQEAgLTE5LDcgKzE5LDcgQEAKICNpbmNsdWRlIDx0aHJlYWQ+CiAKICNpbmNsdWRlICJmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmgiCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCisjaW5jbHVkZSAibG9nL2xvZy5oIgogI2luY2x1ZGUgInV0aWxzL1JXTG9jay5oIgogI2luY2x1ZGUgInV0aWxzL1JlZkJhc2UuaCIKICNpbmNsdWRlICJ1dGlscy9TdHJvbmdQb2ludGVyLmgiCmRpZmYgLS1naXQgYS9saWJ1dGlscy9SZWZCYXNlX3Rlc3QuY3BwIGIvbGlidXRpbHMvYmluZGVyL1JlZkJhc2VfdGVzdC5jcHAKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gbGlidXRpbHMvUmVmQmFzZV90ZXN0LmNwcApyZW5hbWUgdG8gbGlidXRpbHMvYmluZGVyL1JlZkJhc2VfdGVzdC5jcHAKaW5kZXggYWVkM2I5Yi4uNjVkNDBhMiAxMDA2NDQKLS0tIGEvbGlidXRpbHMvUmVmQmFzZV90ZXN0LmNwcAorKysgYi9saWJ1dGlscy9iaW5kZXIvUmVmQmFzZV90ZXN0LmNwcApAQCAtMjgsNyArMjgsNyBAQAogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAotc3RhdGljIGNvbnN0ZXhwciBpbnQgTklURVJTID0gMTAwMDAwMDsKK3N0YXRpYyBjb25zdGV4cHIgaW50IE5JVEVSUyA9IDUwMDAwMDsKIAogc3RhdGljIGNvbnN0ZXhwciBpbnQgSU5JVElBTF9TVFJPTkdfVkFMVUUgPSAxIDw8IDI4OyAgLy8gTWlycm9yaW5nIFJlZkJhc2UgZGVmaW5pdGlvbi4KIApAQCAtMzAwLDggKzMwMCw4IEBACiAgICAgc3RkOjphdG9taWM8aW50PiogbURlbGV0ZUNvdW50OwogfTsKIAotc3RhdGljIHNwPEJhcj4gYnVmZmVyOwotc3RhdGljIHN0ZDo6YXRvbWljPGJvb2w+IGJ1ZmZlckZ1bGwoZmFsc2UpOworW1tjbGFuZzo6bm9fZGVzdHJveV1dIHN0YXRpYyBjb25zdGluaXQgc3A8QmFyPiBidWZmZXI7CitzdGF0aWMgY29uc3Rpbml0IHN0ZDo6YXRvbWljPGJvb2w+IGJ1ZmZlckZ1bGwoZmFsc2UpOwogCiAvLyBXYWl0IHVudGlsIGJ1ZmZlckZ1bGwgaGFzIHZhbHVlIHZhbC4KIHN0YXRpYyBpbmxpbmUgdm9pZCB3YWl0Rm9yKGJvb2wgdmFsKSB7CkBAIC0zODAsOCArMzgwLDggQEAKICAgICB9ICAvLyBPdGhlcndpc2UgdGhpcyBpcyBzbG93IGFuZCBwcm9iYWJseSBwb2ludGxlc3Mgb24gYSB1bmlwcm9jZXNzb3IuCiB9CiAKLXN0YXRpYyB3cDxCYXI+IHdwQnVmZmVyOwotc3RhdGljIHN0ZDo6YXRvbWljPGJvb2w+IHdwQnVmZmVyRnVsbChmYWxzZSk7CitbW2NsYW5nOjpub19kZXN0cm95XV0gc3RhdGljIGNvbnN0aW5pdCB3cDxCYXI+IHdwQnVmZmVyOworc3RhdGljIGNvbnN0aW5pdCBzdGQ6OmF0b21pYzxib29sPiB3cEJ1ZmZlckZ1bGwoZmFsc2UpOwogCiAvLyBXYWl0IHVudGlsIHdwQnVmZmVyRnVsbCBoYXMgdmFsdWUgdmFsLgogc3RhdGljIGlubGluZSB2b2lkIHdwV2FpdEZvcihib29sIHZhbCkgewpkaWZmIC0tZ2l0IGEvbGlidXRpbHMvU2hhcmVkQnVmZmVyLmNwcCBiL2xpYnV0aWxzL2JpbmRlci9TaGFyZWRCdWZmZXIuY3BwCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIGxpYnV0aWxzL1NoYXJlZEJ1ZmZlci5jcHAKcmVuYW1lIHRvIGxpYnV0aWxzL2JpbmRlci9TaGFyZWRCdWZmZXIuY3BwCmluZGV4IDNlNzAzZGIuLmQxNmJkYjAgMTAwNjQ0Ci0tLSBhL2xpYnV0aWxzL1NoYXJlZEJ1ZmZlci5jcHAKKysrIGIvbGlidXRpbHMvYmluZGVyL1NoYXJlZEJ1ZmZlci5jcHAKQEAgLTc1LDcgKzc1LDcgQEAKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigobmV3U2l6ZSA+PSAoU0laRV9NQVggLSBzaXplb2YoU2hhcmVkQnVmZmVyKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGJ1ZmZlciBzaXplICV6dSIsIG5ld1NpemUpOwogCi0gICAgICAgIGJ1ZiA9IChTaGFyZWRCdWZmZXIqKXJlYWxsb2MoYnVmLCBzaXplb2YoU2hhcmVkQnVmZmVyKSArIG5ld1NpemUpOworICAgICAgICBidWYgPSAoU2hhcmVkQnVmZmVyKilyZWFsbG9jKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGJ1ZiksIHNpemVvZihTaGFyZWRCdWZmZXIpICsgbmV3U2l6ZSk7CiAgICAgICAgIGlmIChidWYgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgYnVmLT5tU2l6ZSA9IG5ld1NpemU7CiAgICAgICAgICAgICByZXR1cm4gYnVmOwpkaWZmIC0tZ2l0IGEvbGlidXRpbHMvU2hhcmVkQnVmZmVyLmggYi9saWJ1dGlscy9iaW5kZXIvU2hhcmVkQnVmZmVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYnV0aWxzL1NoYXJlZEJ1ZmZlci5oCnJlbmFtZSB0byBsaWJ1dGlscy9iaW5kZXIvU2hhcmVkQnVmZmVyLmgKZGlmZiAtLWdpdCBhL2xpYnV0aWxzL1NoYXJlZEJ1ZmZlcl90ZXN0LmNwcCBiL2xpYnV0aWxzL2JpbmRlci9TaGFyZWRCdWZmZXJfdGVzdC5jcHAKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gbGlidXRpbHMvU2hhcmVkQnVmZmVyX3Rlc3QuY3BwCnJlbmFtZSB0byBsaWJ1dGlscy9iaW5kZXIvU2hhcmVkQnVmZmVyX3Rlc3QuY3BwCmluZGV4IDFkNjMxN2YuLjI2NzAyYjAgMTAwNjQ0Ci0tLSBhL2xpYnV0aWxzL1NoYXJlZEJ1ZmZlcl90ZXN0LmNwcAorKysgYi9saWJ1dGlscy9iaW5kZXIvU2hhcmVkQnVmZmVyX3Rlc3QuY3BwCkBAIC0xNCw4ICsxNCw2IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKLQogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAKICNpbmNsdWRlIDxtZW1vcnk+CmRpZmYgLS1naXQgYS9saWJ1dGlscy9TdHJpbmcxNi5jcHAgYi9saWJ1dGlscy9iaW5kZXIvU3RyaW5nMTYuY3BwCnNpbWlsYXJpdHkgaW5kZXggOTAlCnJlbmFtZSBmcm9tIGxpYnV0aWxzL1N0cmluZzE2LmNwcApyZW5hbWUgdG8gbGlidXRpbHMvYmluZGVyL1N0cmluZzE2LmNwcAppbmRleCA2ODY0MmQ4Li45NmUxNDc3IDEwMDY0NAotLS0gYS9saWJ1dGlscy9TdHJpbmcxNi5jcHAKKysrIGIvbGlidXRpbHMvYmluZGVyL1N0cmluZzE2LmNwcApAQCAtMTYsMTcgKzE2LDMwIEBACiAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgogCiAjaW5jbHVkZSA8Y3R5cGUuaD4KIAogI2luY2x1ZGUgIlNoYXJlZEJ1ZmZlci5oIgogCisjZGVmaW5lIExJQlVUSUxTX1BSQUdNQShhcmcpIF9QcmFnbWEoI2FyZykKKyNpZiBkZWZpbmVkKF9fY2xhbmdfXykKKyNkZWZpbmUgTElCVVRJTFNfUFJBR01BX0ZPUl9DT01QSUxFUihhcmcpIExJQlVUSUxTX1BSQUdNQShjbGFuZyBhcmcpCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKQorI2RlZmluZSBMSUJVVElMU19QUkFHTUFfRk9SX0NPTVBJTEVSKGFyZykgTElCVVRJTFNfUFJBR01BKEdDQyBhcmcpCisjZWxzZQorI2RlZmluZSBMSUJVVElMU19QUkFHTUFfRk9SX0NPTVBJTEVSKGFyZykKKyNlbmRpZgorI2RlZmluZSBMSUJVVElMU19JR05PUkUod2FybmluZ19mbGFnKSAgICAgICAgICAgICBcCisgICAgTElCVVRJTFNfUFJBR01BX0ZPUl9DT01QSUxFUihkaWFnbm9zdGljIHB1c2gpIFwKKyAgICBMSUJVVElMU19QUkFHTUFfRk9SX0NPTVBJTEVSKGRpYWdub3N0aWMgaWdub3JlZCB3YXJuaW5nX2ZsYWcpCisjZGVmaW5lIExJQlVUSUxTX0lHTk9SRV9FTkQoKSBMSUJVVElMU19QUkFHTUFfRk9SX0NPTVBJTEVSKGRpYWdub3N0aWMgcG9wKQorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXRpYyBjb25zdCBTdGF0aWNTdHJpbmcxNiBlbXB0eVN0cmluZyh1IiIpOwogc3RhdGljIGlubGluZSBjaGFyMTZfdCogZ2V0RW1wdHlTdHJpbmcoKSB7Ci0gICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Y2hhcjE2X3QqPihlbXB0eVN0cmluZy5zdHJpbmcoKSk7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Y2hhcjE2X3QqPihlbXB0eVN0cmluZy5jX3N0cigpKTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMTIsMTAgKzEyNSw3IEBACiAKIFN0cmluZzE2OjpTdHJpbmcxNihjb25zdCBjaGFyMTZfdCogbywgc2l6ZV90IGxlbikgOiBtU3RyaW5nKGFsbG9jRnJvbVVURjE2KG8sIGxlbikpIHt9CiAKLVN0cmluZzE2OjpTdHJpbmcxNihjb25zdCBTdHJpbmc4JiBvKQotICAgIDogbVN0cmluZyhhbGxvY0Zyb21VVEY4KG8uc3RyaW5nKCksIG8uc2l6ZSgpKSkKLXsKLX0KK1N0cmluZzE2OjpTdHJpbmcxNihjb25zdCBTdHJpbmc4JiBvKSA6IG1TdHJpbmcoYWxsb2NGcm9tVVRGOChvLmNfc3RyKCksIG8uc2l6ZSgpKSkge30KIAogU3RyaW5nMTY6OlN0cmluZzE2KGNvbnN0IGNoYXIqIG8pCiAgICAgOiBtU3RyaW5nKGFsbG9jRnJvbVVURjgobywgc3RybGVuKG8pKSkKQEAgLTE3Myw3ICsxODMsNyBAQAogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJOb3QgaW1wbGVtZW50ZWQiKTsKICAgICB9CiAKLSAgICByZXR1cm4gc2V0VG8ob3RoZXIuc3RyaW5nKCkrYmVnaW4sIGxlbik7CisgICAgcmV0dXJuIHNldFRvKG90aGVyLmNfc3RyKCkgKyBiZWdpbiwgbGVuKTsKIH0KIAogc3RhdHVzX3QgU3RyaW5nMTY6OnNldFRvKGNvbnN0IGNoYXIxNl90KiBvdGhlcikKQEAgLTIwMCw3ICsyMTAsNyBAQAogfQogCiBzdGF0dXNfdCBTdHJpbmcxNjo6YXBwZW5kKGNvbnN0IFN0cmluZzE2JiBvdGhlcikgewotICAgIHJldHVybiBhcHBlbmQob3RoZXIuc3RyaW5nKCksIG90aGVyLnNpemUoKSk7CisgICAgcmV0dXJuIGFwcGVuZChvdGhlci5jX3N0cigpLCBvdGhlci5zaXplKCkpOwogfQogCiBzdGF0dXNfdCBTdHJpbmcxNjo6YXBwZW5kKGNvbnN0IGNoYXIxNl90KiBjaHJzLCBzaXplX3Qgb3RoZXJMZW4pIHsKQEAgLTI4Niw3ICsyOTYsNyBAQAogewogICAgIGNvbnN0IHNpemVfdCBwcyA9IHByZWZpeC5zaXplKCk7CiAgICAgaWYgKHBzID4gc2l6ZSgpKSByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHN0cnpjbXAxNihtU3RyaW5nLCBwcywgcHJlZml4LnN0cmluZygpLCBwcykgPT0gMDsKKyAgICByZXR1cm4gc3RyemNtcDE2KG1TdHJpbmcsIHBzLCBwcmVmaXguY19zdHIoKSwgcHMpID09IDA7CiB9CiAKIGJvb2wgU3RyaW5nMTY6OnN0YXJ0c1dpdGgoY29uc3QgY2hhcjE2X3QqIHByZWZpeCkgY29uc3QKQEAgLTM1MCw3ICszNjAsOSBAQAogYm9vbCBTdHJpbmcxNjo6aXNTdGF0aWNTdHJpbmcoKSBjb25zdCB7CiAgICAgLy8gU2VlIFN0cmluZzE2LmggZm9yIG5vdGVzIG9uIHRoZSBtZW1vcnkgbGF5b3V0IG9mIFN0cmluZzE2OjpTdGF0aWNEYXRhIGFuZAogICAgIC8vIFNoYXJlZEJ1ZmZlci4KKyAgICBMSUJVVElMU19JR05PUkUoIi1XaW52YWxpZC1vZmZzZXRvZiIpCiAgICAgc3RhdGljX2Fzc2VydChzaXplb2YoU2hhcmVkQnVmZmVyKSAtIG9mZnNldG9mKFNoYXJlZEJ1ZmZlciwgbUNsaWVudE1ldGFkYXRhKSA9PSA0KTsKKyAgICBMSUJVVElMU19JR05PUkVfRU5EKCkKICAgICBjb25zdCB1aW50MzJfdCogcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QqPihtU3RyaW5nKTsKICAgICByZXR1cm4gKCoocCAtIDEpICYga0lzU2hhcmVkQnVmZmVyQWxsb2NhdGVkKSA9PSAwOwogfQpAQCAtMzU4LDcgKzM3MCw5IEBACiBzaXplX3QgU3RyaW5nMTY6OnN0YXRpY1N0cmluZ1NpemUoKSBjb25zdCB7CiAgICAgLy8gU2VlIFN0cmluZzE2LmggZm9yIG5vdGVzIG9uIHRoZSBtZW1vcnkgbGF5b3V0IG9mIFN0cmluZzE2OjpTdGF0aWNEYXRhIGFuZAogICAgIC8vIFNoYXJlZEJ1ZmZlci4KKyAgICBMSUJVVElMU19JR05PUkUoIi1XaW52YWxpZC1vZmZzZXRvZiIpCiAgICAgc3RhdGljX2Fzc2VydChzaXplb2YoU2hhcmVkQnVmZmVyKSAtIG9mZnNldG9mKFNoYXJlZEJ1ZmZlciwgbUNsaWVudE1ldGFkYXRhKSA9PSA0KTsKKyAgICBMSUJVVElMU19JR05PUkVfRU5EKCkKICAgICBjb25zdCB1aW50MzJfdCogcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QqPihtU3RyaW5nKTsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90PigqKHAgLSAxKSk7CiB9CmRpZmYgLS1naXQgYS9saWJ1dGlscy9TdHJpbmcxNl9mdXp6LmNwcCBiL2xpYnV0aWxzL2JpbmRlci9TdHJpbmcxNl9mdXp6LmNwcApzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBsaWJ1dGlscy9TdHJpbmcxNl9mdXp6LmNwcApyZW5hbWUgdG8gbGlidXRpbHMvYmluZGVyL1N0cmluZzE2X2Z1enouY3BwCmluZGV4IGQ3ZTVlYzcuLjhmOTc4MWIgMTAwNjQ0Ci0tLSBhL2xpYnV0aWxzL1N0cmluZzE2X2Z1enouY3BwCisrKyBiL2xpYnV0aWxzL2JpbmRlci9TdHJpbmcxNl9mdXp6LmNwcApAQCAtMTMsNyArMTMsOSBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgogI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgImZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaCIKICNpbmNsdWRlICJ1dGlscy9TdHJpbmcxNi5oIgpAQCAtMjUsNyArMjcsNyBAQAogCiAgICAgICAgICAgICAgICAgLy8gQnl0ZXMgYW5kIHNpemUKICAgICAgICAgICAgICAgICAoW10oRnV6emVkRGF0YVByb3ZpZGVyJiwgYW5kcm9pZDo6U3RyaW5nMTYgc3RyMSwgYW5kcm9pZDo6U3RyaW5nMTYpIC0+IHZvaWQgewotICAgICAgICAgICAgICAgICAgICBzdHIxLnN0cmluZygpOworICAgICAgICAgICAgICAgICAgICBzdHIxLmNfc3RyKCk7CiAgICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAgKFtdKEZ1enplZERhdGFQcm92aWRlciYsIGFuZHJvaWQ6OlN0cmluZzE2IHN0cjEsIGFuZHJvaWQ6OlN0cmluZzE2KSAtPiB2b2lkIHsKICAgICAgICAgICAgICAgICAgICAgc3RyMS5pc1N0YXRpY1N0cmluZygpOwpAQCAtMzksNyArNDEsNyBAQAogICAgICAgICAgICAgICAgICAgICBzdHIxLnN0YXJ0c1dpdGgoc3RyMik7CiAgICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAgKFtdKEZ1enplZERhdGFQcm92aWRlciYsIGFuZHJvaWQ6OlN0cmluZzE2IHN0cjEsIGFuZHJvaWQ6OlN0cmluZzE2IHN0cjIpIC0+IHZvaWQgewotICAgICAgICAgICAgICAgICAgICBzdHIxLmNvbnRhaW5zKHN0cjIuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBzdHIxLmNvbnRhaW5zKHN0cjIuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAgKFtdKEZ1enplZERhdGFQcm92aWRlciYsIGFuZHJvaWQ6OlN0cmluZzE2IHN0cjEsIGFuZHJvaWQ6OlN0cmluZzE2IHN0cjIpIC0+IHZvaWQgewogICAgICAgICAgICAgICAgICAgICBzdHIxLmNvbXBhcmUoc3RyMik7CkBAIC01Miw3ICs1NCw3IEBACiAgICAgICAgICAgICAgICAgKFtdKEZ1enplZERhdGFQcm92aWRlciYgZGF0YVByb3ZpZGVyLCBhbmRyb2lkOjpTdHJpbmcxNiBzdHIxLAogICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpTdHJpbmcxNiBzdHIyKSAtPiB2b2lkIHsKICAgICAgICAgICAgICAgICAgICAgaW50IHBvcyA9IGRhdGFQcm92aWRlci5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludD4oMCwgc3RyMS5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgICBzdHIxLmluc2VydChwb3MsIHN0cjIuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBzdHIxLmluc2VydChwb3MsIHN0cjIuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgfSksCiAKICAgICAgICAgICAgICAgICAvLyBGaW5kIGFuZCByZXBsYWNlIG9wZXJhdGlvbnMKZGlmZiAtLWdpdCBhL2xpYnV0aWxzL1N0cmluZzE2X3Rlc3QuY3BwIGIvbGlidXRpbHMvYmluZGVyL1N0cmluZzE2X3Rlc3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggNjUlCnJlbmFtZSBmcm9tIGxpYnV0aWxzL1N0cmluZzE2X3Rlc3QuY3BwCnJlbmFtZSB0byBsaWJ1dGlscy9iaW5kZXIvU3RyaW5nMTZfdGVzdC5jcHAKaW5kZXggYzZlNmY3NC4uODNjYzU5OSAxMDA2NDQKLS0tIGEvbGlidXRpbHMvU3RyaW5nMTZfdGVzdC5jcHAKKysrIGIvbGlidXRpbHMvYmluZGVyL1N0cmluZzE2X3Rlc3QuY3BwCkBAIC0xNiw2ICsxNiw4IEBACiAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxjb21wYXJlPgorI2luY2x1ZGUgPHV0aWxpdHk+CiAKICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogCkBAIC0zMyw1MCArMzUsNTAgQEAKIAogVEVTVChTdHJpbmcxNlRlc3QsIEZyb21DaGFyMTZfdCkgewogICAgIFN0cmluZzE2IHRtcCh1IlZlcmlmeSBtZSIpOwotICAgIEVYUEVDVF9TVFIxNkVRKHUiVmVyaWZ5IG1lIiwgdG1wKTsKKyAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeSBtZSIsIHRtcC5jX3N0cigpKTsKIH0KIAogVEVTVChTdHJpbmcxNlRlc3QsIEZyb21DaGFyMTZfdFNpemVkKSB7CiAgICAgU3RyaW5nMTYgdG1wKHUiVmVyaWZ5IG1lIiwgNyk7Ci0gICAgRVhQRUNUX1NUUjE2RVEodSJWZXJpZnkgIiwgdG1wKTsKKyAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeSAiLCB0bXAuY19zdHIoKSk7CiB9CiAKIFRFU1QoU3RyaW5nMTZUZXN0LCBGcm9tQ2hhcikgewogICAgIFN0cmluZzE2IHRtcCgiVmVyaWZ5IG1lIik7Ci0gICAgRVhQRUNUX1NUUjE2RVEodSJWZXJpZnkgbWUiLCB0bXApOworICAgIEVYUEVDVF9TVFIxNkVRKHUiVmVyaWZ5IG1lIiwgdG1wLmNfc3RyKCkpOwogfQogCiBURVNUKFN0cmluZzE2VGVzdCwgRnJvbUNoYXJTaXplZCkgewogICAgIFN0cmluZzE2IHRtcCgiVmVyaWZ5IG1lIiwgNyk7Ci0gICAgRVhQRUNUX1NUUjE2RVEodSJWZXJpZnkgIiwgdG1wKTsKKyAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeSAiLCB0bXAuY19zdHIoKSk7CiB9CiAKIFRFU1QoU3RyaW5nMTZUZXN0LCBDb3B5KSB7CiAgICAgU3RyaW5nMTYgdG1wKCJWZXJpZnkgbWUiKTsKICAgICBTdHJpbmcxNiBhbm90aGVyID0gdG1wOwotICAgIEVYUEVDVF9TVFIxNkVRKHUiVmVyaWZ5IG1lIiwgdG1wKTsKLSAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeSBtZSIsIGFub3RoZXIpOworICAgIEVYUEVDVF9TVFIxNkVRKHUiVmVyaWZ5IG1lIiwgdG1wLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFIxNkVRKHUiVmVyaWZ5IG1lIiwgYW5vdGhlci5jX3N0cigpKTsKIH0KIAogVEVTVChTdHJpbmcxNlRlc3QsIENvcHlBc3NpZ24pIHsKICAgICBTdHJpbmcxNiB0bXAoIlZlcmlmeSBtZSIpOwogICAgIFN0cmluZzE2IGFub3RoZXI7CiAgICAgYW5vdGhlciA9IHRtcDsKLSAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeSBtZSIsIHRtcCk7Ci0gICAgRVhQRUNUX1NUUjE2RVEodSJWZXJpZnkgbWUiLCBhbm90aGVyKTsKKyAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeSBtZSIsIHRtcC5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeSBtZSIsIGFub3RoZXIuY19zdHIoKSk7CiB9CiAKIFRFU1QoU3RyaW5nMTZUZXN0LCBNb3ZlKSB7CiAgICAgU3RyaW5nMTYgdG1wKCJWZXJpZnkgbWUiKTsKICAgICBTdHJpbmcxNiBhbm90aGVyKHN0ZDo6bW92ZSh0bXApKTsKLSAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeSBtZSIsIGFub3RoZXIpOworICAgIEVYUEVDVF9TVFIxNkVRKHUiVmVyaWZ5IG1lIiwgYW5vdGhlci5jX3N0cigpKTsKIH0KIAogVEVTVChTdHJpbmcxNlRlc3QsIE1vdmVBc3NpZ24pIHsKICAgICBTdHJpbmcxNiB0bXAoIlZlcmlmeSBtZSIpOwogICAgIFN0cmluZzE2IGFub3RoZXI7CiAgICAgYW5vdGhlciA9IHN0ZDo6bW92ZSh0bXApOwotICAgIEVYUEVDVF9TVFIxNkVRKHUiVmVyaWZ5IG1lIiwgYW5vdGhlcik7CisgICAgRVhQRUNUX1NUUjE2RVEodSJWZXJpZnkgbWUiLCBhbm90aGVyLmNfc3RyKCkpOwogfQogCiBURVNUKFN0cmluZzE2VGVzdCwgU2l6ZSkgewpAQCAtODgsMjcgKzkwLDI3IEBACiAgICAgU3RyaW5nMTYgdG1wKCJWZXJpZnkgbWUiKTsKICAgICB0bXAuc2V0VG8odSJOZXcgY29udGVudCIpOwogICAgIEVYUEVDVF9FUSgxMVUsIHRtcC5zaXplKCkpOwotICAgIEVYUEVDVF9TVFIxNkVRKHUiTmV3IGNvbnRlbnQiLCB0bXApOworICAgIEVYUEVDVF9TVFIxNkVRKHUiTmV3IGNvbnRlbnQiLCB0bXAuY19zdHIoKSk7CiB9CiAKIFRFU1QoU3RyaW5nMTZUZXN0LCBBcHBlbmQpIHsKICAgICBTdHJpbmcxNiB0bXAoIlZlcmlmeSBtZSIpOwogICAgIHRtcC5hcHBlbmQoU3RyaW5nMTYoIkhlbGxvIikpOwogICAgIEVYUEVDVF9FUSgxNFUsIHRtcC5zaXplKCkpOwotICAgIEVYUEVDVF9TVFIxNkVRKHUiVmVyaWZ5IG1lSGVsbG8iLCB0bXApOworICAgIEVYUEVDVF9TVFIxNkVRKHUiVmVyaWZ5IG1lSGVsbG8iLCB0bXAuY19zdHIoKSk7CiB9CiAKIFRFU1QoU3RyaW5nMTZUZXN0LCBJbnNlcnQpIHsKICAgICBTdHJpbmcxNiB0bXAoIlZlcmlmeSBtZSIpOwogICAgIHRtcC5pbnNlcnQoNiwgdSJJbnNlcnQiKTsKICAgICBFWFBFQ1RfRVEoMTVVLCB0bXAuc2l6ZSgpKTsKLSAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeUluc2VydCBtZSIsIHRtcCk7CisgICAgRVhQRUNUX1NUUjE2RVEodSJWZXJpZnlJbnNlcnQgbWUiLCB0bXAuY19zdHIoKSk7CiB9CiAKIFRFU1QoU3RyaW5nMTZUZXN0LCBSZXBsYWNlQWxsKSB7CiAgICAgU3RyaW5nMTYgdG1wKCJWZXJpZnkgdmVyaWZ5IFZlcmlmeSIpOwogICAgIHRtcC5yZXBsYWNlQWxsKHUncicsIHUnIScpOwotICAgIEVYUEVDVF9TVFIxNkVRKHUiVmUhaWZ5IHZlIWlmeSBWZSFpZnkiLCB0bXApOworICAgIEVYUEVDVF9TVFIxNkVRKHUiVmUhaWZ5IHZlIWlmeSBWZSFpZnkiLCB0bXAuY19zdHIoKSk7CiB9CiAKIFRFU1QoU3RyaW5nMTZUZXN0LCBDb21wYXJlKSB7CkBAIC0xMjcsOCArMTI5LDggQEAKIFRFU1QoU3RyaW5nMTZUZXN0LCBTdGF0aWNTdHJpbmdDb3B5KSB7CiAgICAgU3RhdGljU3RyaW5nMTYgdG1wKHUiVmVyaWZ5IG1lIik7CiAgICAgU3RyaW5nMTYgYW5vdGhlciA9IHRtcDsKLSAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeSBtZSIsIHRtcCk7Ci0gICAgRVhQRUNUX1NUUjE2RVEodSJWZXJpZnkgbWUiLCBhbm90aGVyKTsKKyAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeSBtZSIsIHRtcC5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeSBtZSIsIGFub3RoZXIuY19zdHIoKSk7CiAgICAgRVhQRUNUX1RSVUUodG1wLmlzU3RhdGljU3RyaW5nKCkpOwogICAgIEVYUEVDVF9UUlVFKGFub3RoZXIuaXNTdGF0aWNTdHJpbmcoKSk7CiB9CkBAIC0xMzYsNyArMTM4LDcgQEAKIFRFU1QoU3RyaW5nMTZUZXN0LCBTdGF0aWNTdHJpbmdNb3ZlKSB7CiAgICAgU3RhdGljU3RyaW5nMTYgdG1wKHUiVmVyaWZ5IG1lIik7CiAgICAgU3RyaW5nMTYgYW5vdGhlcihzdGQ6Om1vdmUodG1wKSk7Ci0gICAgRVhQRUNUX1NUUjE2RVEodSJWZXJpZnkgbWUiLCBhbm90aGVyKTsKKyAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeSBtZSIsIGFub3RoZXIuY19zdHIoKSk7CiAgICAgRVhQRUNUX1RSVUUoYW5vdGhlci5pc1N0YXRpY1N0cmluZygpKTsKIH0KIApAQCAtMTU3LDcgKzE1OSw3IEBACiAgICAgU3RhdGljU3RyaW5nMTYgdG1wKHUiVmVyaWZ5IG1lIik7CiAgICAgdG1wLmFwcGVuZChTdHJpbmcxNigiSGVsbG8iKSk7CiAgICAgRVhQRUNUX0VRKDE0VSwgdG1wLnNpemUoKSk7Ci0gICAgRVhQRUNUX1NUUjE2RVEodSJWZXJpZnkgbWVIZWxsbyIsIHRtcCk7CisgICAgRVhQRUNUX1NUUjE2RVEodSJWZXJpZnkgbWVIZWxsbyIsIHRtcC5jX3N0cigpKTsKICAgICBFWFBFQ1RfRkFMU0UodG1wLmlzU3RhdGljU3RyaW5nKCkpOwogfQogCkBAIC0xNjUsMTQgKzE2NywxNCBAQAogICAgIFN0YXRpY1N0cmluZzE2IHRtcCh1IlZlcmlmeSBtZSIpOwogICAgIHRtcC5pbnNlcnQoNiwgdSJJbnNlcnQiKTsKICAgICBFWFBFQ1RfRVEoMTVVLCB0bXAuc2l6ZSgpKTsKLSAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeUluc2VydCBtZSIsIHRtcCk7CisgICAgRVhQRUNUX1NUUjE2RVEodSJWZXJpZnlJbnNlcnQgbWUiLCB0bXAuY19zdHIoKSk7CiAgICAgRVhQRUNUX0ZBTFNFKHRtcC5pc1N0YXRpY1N0cmluZygpKTsKIH0KIAogVEVTVChTdHJpbmcxNlRlc3QsIFN0YXRpY1N0cmluZ1JlcGxhY2VBbGwpIHsKICAgICBTdGF0aWNTdHJpbmcxNiB0bXAodSJWZXJpZnkgdmVyaWZ5IFZlcmlmeSIpOwogICAgIHRtcC5yZXBsYWNlQWxsKHUncicsIHUnIScpOwotICAgIEVYUEVDVF9TVFIxNkVRKHUiVmUhaWZ5IHZlIWlmeSBWZSFpZnkiLCB0bXApOworICAgIEVYUEVDVF9TVFIxNkVRKHUiVmUhaWZ5IHZlIWlmeSBWZSFpZnkiLCB0bXAuY19zdHIoKSk7CiAgICAgRVhQRUNUX0ZBTFNFKHRtcC5pc1N0YXRpY1N0cmluZygpKTsKIH0KIApAQCAtMTg1LDE3ICsxODcsMTcgQEAKICAgICBTdGF0aWNTdHJpbmcxNiB0bXAodSJWZXJpZnkgbWUiKTsKICAgICBTdHJpbmcxNiBhbm90aGVyKHUibm9uc3RhdGljIik7CiAgICAgYW5vdGhlciA9IHRtcDsKLSAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeSBtZSIsIHRtcCk7Ci0gICAgRVhQRUNUX1NUUjE2RVEodSJWZXJpZnkgbWUiLCBhbm90aGVyKTsKKyAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeSBtZSIsIHRtcC5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeSBtZSIsIGFub3RoZXIuY19zdHIoKSk7CiB9CiAKIFRFU1QoU3RyaW5nMTZUZXN0LCBTdHJpbmdDb3B5QXNzaWduRnJvbVN0YXRpY1N0cmluZykgewogICAgIFN0YXRpY1N0cmluZzE2IHRtcCh1IlZlcmlmeSBtZSIpOwogICAgIFN0cmluZzE2IGFub3RoZXIodSJub25zdGF0aWMiKTsKICAgICBhbm90aGVyID0gdG1wOwotICAgIEVYUEVDVF9TVFIxNkVRKHUiVmVyaWZ5IG1lIiwgYW5vdGhlcik7CisgICAgRVhQRUNUX1NUUjE2RVEodSJWZXJpZnkgbWUiLCBhbm90aGVyLmNfc3RyKCkpOwogICAgIEVYUEVDVF9UUlVFKGFub3RoZXIuaXNTdGF0aWNTdHJpbmcoKSk7Ci0gICAgRVhQRUNUX1NUUjE2RVEodSJWZXJpZnkgbWUiLCB0bXApOworICAgIEVYUEVDVF9TVFIxNkVRKHUiVmVyaWZ5IG1lIiwgdG1wLmNfc3RyKCkpOwogICAgIEVYUEVDVF9UUlVFKHRtcC5pc1N0YXRpY1N0cmluZygpKTsKIH0KIApAQCAtMjAzLDcgKzIwNSw3IEBACiAgICAgU3RhdGljU3RyaW5nMTYgdG1wKHUiVmVyaWZ5IG1lIik7CiAgICAgU3RyaW5nMTYgYW5vdGhlcih1Im5vbnN0YXRpYyIpOwogICAgIGFub3RoZXIgPSBzdGQ6Om1vdmUodG1wKTsKLSAgICBFWFBFQ1RfU1RSMTZFUSh1IlZlcmlmeSBtZSIsIGFub3RoZXIpOworICAgIEVYUEVDVF9TVFIxNkVRKHUiVmVyaWZ5IG1lIiwgYW5vdGhlci5jX3N0cigpKTsKICAgICBFWFBFQ1RfVFJVRShhbm90aGVyLmlzU3RhdGljU3RyaW5nKCkpOwogfQogCkBAIC0yMjEsMTkgKzIyMywxOSBAQAogVEVTVChTdHJpbmcxNlRlc3QsIFZhbGlkVXRmOENvbnZlcnNpb24pIHsKICAgICBTdHJpbmcxNiBhbm90aGVyKCJhYmNkZWYiKTsKICAgICBFWFBFQ1RfRVEoNlUsIGFub3RoZXIuc2l6ZSgpKTsKLSAgICBFWFBFQ1RfU1RSMTZFUShhbm90aGVyLCB1ImFiY2RlZiIpOworICAgIEVYUEVDVF9TVFIxNkVRKGFub3RoZXIuY19zdHIoKSwgdSJhYmNkZWYiKTsKIH0KIAogVEVTVChTdHJpbmcxNlRlc3QsIGFwcGVuZCkgewogICAgIFN0cmluZzE2IHM7CiAgICAgRVhQRUNUX0VRKE9LLCBzLmFwcGVuZChTdHJpbmcxNih1ImZvbyIpKSk7Ci0gICAgRVhQRUNUX1NUUjE2RVEodSJmb28iLCBzKTsKKyAgICBFWFBFQ1RfU1RSMTZFUSh1ImZvbyIsIHMuY19zdHIoKSk7CiAgICAgRVhQRUNUX0VRKE9LLCBzLmFwcGVuZChTdHJpbmcxNih1ImJhciIpKSk7Ci0gICAgRVhQRUNUX1NUUjE2RVEodSJmb29iYXIiLCBzKTsKKyAgICBFWFBFQ1RfU1RSMTZFUSh1ImZvb2JhciIsIHMuY19zdHIoKSk7CiAgICAgRVhQRUNUX0VRKE9LLCBzLmFwcGVuZCh1ImJheiIsIDApKTsKLSAgICBFWFBFQ1RfU1RSMTZFUSh1ImZvb2JhciIsIHMpOworICAgIEVYUEVDVF9TVFIxNkVRKHUiZm9vYmFyIiwgcy5jX3N0cigpKTsKICAgICBFWFBFQ1RfRVEoTk9fTUVNT1JZLCBzLmFwcGVuZCh1ImJheiIsIFNJWkVfTUFYKSk7Ci0gICAgRVhQRUNUX1NUUjE2RVEodSJmb29iYXIiLCBzKTsKKyAgICBFWFBFQ1RfU1RSMTZFUSh1ImZvb2JhciIsIHMuY19zdHIoKSk7CiB9CiAKIFRFU1QoU3RyaW5nMTZUZXN0LCBpbnNlcnQpIHsKQEAgLTI0MSwxOSArMjQzLDYxIEBACiAKICAgICAvLyBJbnNlcnRpbmcgaW50byB0aGUgZW1wdHkgc3RyaW5nIGluc2VydHMgYXQgdGhlIHN0YXJ0LgogICAgIEVYUEVDVF9FUShPSywgcy5pbnNlcnQoMTIzLCB1ImZvbyIpKTsKLSAgICBFWFBFQ1RfU1RSMTZFUSh1ImZvbyIsIHMpOworICAgIEVYUEVDVF9TVFIxNkVRKHUiZm9vIiwgcy5jX3N0cigpKTsKIAogICAgIC8vIEluc2VydGluZyB6ZXJvIGNoYXJhY3RlcnMgYXQgYW55IHBvc2l0aW9uIGlzIG9rYXksIGJ1dCB3b24ndCBleHBhbmQgdGhlIHN0cmluZy4KICAgICBFWFBFQ1RfRVEoT0ssIHMuaW5zZXJ0KDEyMywgdSJmb28iLCAwKSk7Ci0gICAgRVhQRUNUX1NUUjE2RVEodSJmb28iLCBzKTsKKyAgICBFWFBFQ1RfU1RSMTZFUSh1ImZvbyIsIHMuY19zdHIoKSk7CiAKICAgICAvLyBJbnNlcnRpbmcgcGFzdCB0aGUgZW5kIG9mIGEgbm9uLWVtcHR5IHN0cmluZyBhcHBlbmRzLgogICAgIEVYUEVDVF9FUShPSywgcy5pbnNlcnQoMTIzLCB1ImJhciIpKTsKLSAgICBFWFBFQ1RfU1RSMTZFUSh1ImZvb2JhciIsIHMpOworICAgIEVYUEVDVF9TVFIxNkVRKHUiZm9vYmFyIiwgcy5jX3N0cigpKTsKIAogICAgIEVYUEVDVF9FUShPSywgcy5pbnNlcnQoMywgdSIhIikpOwotICAgIEVYUEVDVF9TVFIxNkVRKHUiZm9vIWJhciIsIHMpOworICAgIEVYUEVDVF9TVFIxNkVRKHUiZm9vIWJhciIsIHMuY19zdHIoKSk7CiAKICAgICBFWFBFQ1RfRVEoTk9fTUVNT1JZLCBzLmluc2VydCgzLCB1IiIsIFNJWkVfTUFYKSk7Ci0gICAgRVhQRUNUX1NUUjE2RVEodSJmb28hYmFyIiwgcyk7CisgICAgRVhQRUNUX1NUUjE2RVEodSJmb28hYmFyIiwgcy5jX3N0cigpKTsKK30KKworVEVTVChTdHJpbmcxNlRlc3QsIGNvbXBhcmlzb25zKSB7CisgICAgY29uc3QgY2hhcjE2X3QqIGNzdHIxID0gdSJhYmMiOworICAgIGNvbnN0IGNoYXIxNl90KiBjc3RyMiA9IHUiZGVmIjsKKworICAgIC8vIHN0cjEgYW5kIHN0cjFiIHdpbGwgcG9pbnQgdG8gZGlmZmVyZW50IGJsb2NrcyBvZiBtZW1vcnkgYnV0IHdpdGggZXF1YWwgY29udGVudHMuCisgICAgU3RyaW5nMTYgc3RyMShjc3RyMSk7CisgICAgU3RyaW5nMTYgc3RyMWIoY3N0cjEpOworICAgIFN0cmluZzE2IHN0cjIoY3N0cjIpOworCisgICAgRVhQRUNUX1RSVUUoKHN0cjEgPD0+IHN0cjFiKSA9PSAwKTsKKyAgICBFWFBFQ1RfRkFMU0Uoc3RyMSAhPSBzdHIxYik7CisgICAgRVhQRUNUX0ZBTFNFKHN0cjEgPCBzdHIxYik7CisgICAgRVhQRUNUX1RSVUUoc3RyMSA8PSBzdHIxYik7CisgICAgRVhQRUNUX1RSVUUoc3RyMSA9PSBzdHIxYik7CisgICAgRVhQRUNUX1RSVUUoc3RyMSA+PSBzdHIxYik7CisgICAgRVhQRUNUX0ZBTFNFKHN0cjEgPiBzdHIxYik7CisKKyAgICBFWFBFQ1RfVFJVRSgoc3RyMSA8PT4gc3RyMikgPCAwKTsKKyAgICBFWFBFQ1RfVFJVRSgoc3RyMiA8PT4gc3RyMSkgPiAwKTsKKyAgICBFWFBFQ1RfVFJVRShzdHIxICE9IHN0cjIpOworICAgIEVYUEVDVF9UUlVFKHN0cjEgPCBzdHIyKTsKKyAgICBFWFBFQ1RfVFJVRShzdHIxIDw9IHN0cjIpOworICAgIEVYUEVDVF9GQUxTRShzdHIxID09IHN0cjIpOworICAgIEVYUEVDVF9GQUxTRShzdHIxID49IHN0cjIpOworICAgIEVYUEVDVF9GQUxTRShzdHIxID4gc3RyMik7CisKKyAgICAvLyBWZXJpZnkgdGhhdCBwcmUtQysrMjAgY29tcGFyaXNvbiBvcGVyYXRvcnMgd29yayB3aXRoIGEgc3RkOjpwYWlyIG9mIGEgU3RyaW5nOCwgd2hpY2ggb25seQorICAgIC8vIHByb3ZpZGVzIDw9PiBpbiBDKysyMCBhbmQgdXAuIFNlZSBiLzMzOTc3NTQwNS4KKworICAgIHN0ZDo6cGFpcjxTdHJpbmcxNiwgaW50PiBwYWlyMShzdHIxLCAxMyk7CisgICAgc3RkOjpwYWlyPFN0cmluZzE2LCBpbnQ+IHBhaXIxYihzdHIxYiwgMTMpOworICAgIHN0ZDo6cGFpcjxTdHJpbmcxNiwgaW50PiBwYWlyMihzdHIyLCAxMyk7CisKKyAgICBFWFBFQ1RfVFJVRShwYWlyMSA9PSBwYWlyMWIpOworICAgIEVYUEVDVF9GQUxTRShwYWlyMSA8IHBhaXIxYik7CisgICAgRVhQRUNUX0ZBTFNFKHBhaXIxID4gcGFpcjFiKTsKKworICAgIEVYUEVDVF9UUlVFKHBhaXIxICE9IHBhaXIyKTsKKyAgICBFWFBFQ1RfVFJVRShwYWlyMSA8IHBhaXIyKTsKKyAgICBFWFBFQ1RfRkFMU0UocGFpcjEgPiBwYWlyMik7CiB9CmRpZmYgLS1naXQgYS9saWJ1dGlscy9TdHJpbmc4LmNwcCBiL2xpYnV0aWxzL2JpbmRlci9TdHJpbmc4LmNwcApzaW1pbGFyaXR5IGluZGV4IDc3JQpyZW5hbWUgZnJvbSBsaWJ1dGlscy9TdHJpbmc4LmNwcApyZW5hbWUgdG8gbGlidXRpbHMvYmluZGVyL1N0cmluZzguY3BwCmluZGV4IDgyZjVjYjYuLjFkZTllOGIgMTAwNjQ0Ci0tLSBhL2xpYnV0aWxzL1N0cmluZzguY3BwCisrKyBiL2xpYnV0aWxzL2JpbmRlci9TdHJpbmc4LmNwcApAQCAtMTQsMTYgKzE0LDEzIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAotI2luY2x1ZGUgPHV0aWxzL0NvbXBhdC5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogCiAjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KIAogI2luY2x1ZGUgPGxpbWl0cz4KICNpbmNsdWRlIDxzdHJpbmc+CkBAIC0zOSwxMCArMzYsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLS8vIFNlcGFyYXRvciB1c2VkIGJ5IHJlc291cmNlIHBhdGhzLiBUaGlzIGlzIG5vdCBwbGF0Zm9ybSBkZXBlbmRlbnQgY29udHJhcnkKLS8vIHRvIE9TX1BBVEhfU0VQQVJBVE9SLgotI2RlZmluZSBSRVNfUEFUSF9TRVBBUkFUT1IgJy8nCi0KIHN0YXRpYyBpbmxpbmUgY2hhciogZ2V0RW1wdHlTdHJpbmcoKSB7CiAgICAgc3RhdGljIFNoYXJlZEJ1ZmZlciogZ0VtcHR5U3RyaW5nQnVmID0gW10gewogICAgICAgICBTaGFyZWRCdWZmZXIqIGJ1ZiA9IFNoYXJlZEJ1ZmZlcjo6YWxsb2MoMSk7CkBAIC0xNTAsMTAgKzE0Myw3IEBACiAgICAgfQogfQogCi1TdHJpbmc4OjpTdHJpbmc4KGNvbnN0IFN0cmluZzE2JiBvKQotICAgIDogbVN0cmluZyhhbGxvY0Zyb21VVEYxNihvLnN0cmluZygpLCBvLnNpemUoKSkpCi17Ci19CitTdHJpbmc4OjpTdHJpbmc4KGNvbnN0IFN0cmluZzE2JiBvKSA6IG1TdHJpbmcoYWxsb2NGcm9tVVRGMTYoby5jX3N0cigpLCBvLnNpemUoKSkpIHt9CiAKIFN0cmluZzg6OlN0cmluZzgoY29uc3QgY2hhcjE2X3QqIG8pCiAgICAgOiBtU3RyaW5nKGFsbG9jRnJvbVVURjE2KG8sIHN0cmxlbjE2KG8pKSkKQEAgLTI2Nyw3ICsyNTcsNyBAQAogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCi0gICAgcmV0dXJuIHJlYWxfYXBwZW5kKG90aGVyLnN0cmluZygpLCBvdGhlckxlbik7CisgICAgcmV0dXJuIHJlYWxfYXBwZW5kKG90aGVyLmNfc3RyKCksIG90aGVyTGVuKTsKIH0KIAogc3RhdHVzX3QgU3RyaW5nODo6YXBwZW5kKGNvbnN0IGNoYXIqIG90aGVyKQpAQCAtMzkzLDYgKzM4MywxMSBAQAogfQogCiBib29sIFN0cmluZzg6OnJlbW92ZUFsbChjb25zdCBjaGFyKiBvdGhlcikgeworICAgIEFMT0dfQVNTRVJUKG90aGVyLCAiU3RyaW5nODo6cmVtb3ZlQWxsKCkgcmVxdWlyZXMgYSBub24tTlVMTCBzdHJpbmciKTsKKworICAgIGlmICgqb3RoZXIgPT0gJ1wwJykKKyAgICAgICAgcmV0dXJuIHRydWU7CisKICAgICBzc2l6ZV90IGluZGV4ID0gZmluZChvdGhlcik7CiAgICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuIGZhbHNlOwogCkBAIC00MzIsMzAgKzQyNywxMiBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBQYXRoIGZ1bmN0aW9ucwogCi1zdGF0aWMgdm9pZCBzZXRQYXRoTmFtZShTdHJpbmc4JiBzLCBjb25zdCBjaGFyKiBuYW1lKSB7Ci0gICAgc2l6ZV90IGxlbiA9IHN0cmxlbihuYW1lKTsKLSAgICBjaGFyKiBidWYgPSBzLmxvY2tCdWZmZXIobGVuKTsKLQotICAgIG1lbWNweShidWYsIG5hbWUsIGxlbik7Ci0KLSAgICAvLyByZW1vdmUgdHJhaWxpbmcgcGF0aCBzZXBhcmF0b3IsIGlmIHByZXNlbnQKLSAgICBpZiAobGVuID4gMCAmJiBidWZbbGVuIC0gMV0gPT0gT1NfUEFUSF9TRVBBUkFUT1IpIGxlbi0tOwotICAgIGJ1ZltsZW5dID0gJ1wwJzsKLQotICAgIHMudW5sb2NrQnVmZmVyKGxlbik7Ci19Ci0KLVN0cmluZzggU3RyaW5nODo6Z2V0UGF0aExlYWYodm9pZCkgY29uc3QKLXsKLSAgICBjb25zdCBjaGFyKiBjcDsKLSAgICBjb25zdCBjaGFyKmNvbnN0IGJ1ZiA9IG1TdHJpbmc7Ci0KLSAgICBjcCA9IHN0cnJjaHIoYnVmLCBPU19QQVRIX1NFUEFSQVRPUik7Ci0gICAgaWYgKGNwID09IG51bGxwdHIpCi0gICAgICAgIHJldHVybiBTdHJpbmc4KCp0aGlzKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBTdHJpbmc4KGNwKzEpOwotfQorLy8gVE9ETzogd2Ugc2hvdWxkIHJlbW92ZSBhbGwgdGhlIHBhdGggZnVuY3Rpb25zIGZyb20gU3RyaW5nOAorI2lmIGRlZmluZWQoX1dJTjMyKQorI2RlZmluZSBPU19QQVRIX1NFUEFSQVRPUiAnXFwnCisjZWxzZQorI2RlZmluZSBPU19QQVRIX1NFUEFSQVRPUiAnLycKKyNlbmRpZgogCiBTdHJpbmc4IFN0cmluZzg6OmdldFBhdGhEaXIodm9pZCkgY29uc3QKIHsKQEAgLTQ2OSw0MCArNDQ2LDE0IEBACiAgICAgICAgIHJldHVybiBTdHJpbmc4KHN0ciwgY3AgLSBzdHIpOwogfQogCi1TdHJpbmc4IFN0cmluZzg6OndhbGtQYXRoKFN0cmluZzgqIG91dFJlbWFpbnMpIGNvbnN0Ci17Ci0gICAgY29uc3QgY2hhciogY3A7Ci0gICAgY29uc3QgY2hhcipjb25zdCBzdHIgPSBtU3RyaW5nOwotICAgIGNvbnN0IGNoYXIqIGJ1ZiA9IHN0cjsKLQotICAgIGNwID0gc3RyY2hyKGJ1ZiwgT1NfUEFUSF9TRVBBUkFUT1IpOwotICAgIGlmIChjcCA9PSBidWYpIHsKLSAgICAgICAgLy8gZG9uJ3QgaW5jbHVkZSBhIGxlYWRpbmcgJy8nLgotICAgICAgICBidWYgPSBidWYrMTsKLSAgICAgICAgY3AgPSBzdHJjaHIoYnVmLCBPU19QQVRIX1NFUEFSQVRPUik7Ci0gICAgfQotCi0gICAgaWYgKGNwID09IG51bGxwdHIpIHsKLSAgICAgICAgU3RyaW5nOCByZXMgPSBidWYgIT0gc3RyID8gU3RyaW5nOChidWYpIDogKnRoaXM7Ci0gICAgICAgIGlmIChvdXRSZW1haW5zKSAqb3V0UmVtYWlucyA9IFN0cmluZzgoIiIpOwotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIFN0cmluZzggcmVzKGJ1ZiwgY3AtYnVmKTsKLSAgICBpZiAob3V0UmVtYWlucykgKm91dFJlbWFpbnMgPSBTdHJpbmc4KGNwKzEpOwotICAgIHJldHVybiByZXM7Ci19Ci0KIC8qCiAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGZpbmRpbmcgdGhlIHN0YXJ0IG9mIGFuIGV4dGVuc2lvbiBpbiBhIHBhdGhuYW1lLgogICoKICAqIFJldHVybnMgYSBwb2ludGVyIGluc2lkZSBtU3RyaW5nLCBvciBOVUxMIGlmIG5vIGV4dGVuc2lvbiB3YXMgZm91bmQuCiAgKi8KLWNoYXIqIFN0cmluZzg6OmZpbmRfZXh0ZW5zaW9uKHZvaWQpIGNvbnN0Ci17CitzdGF0aWMgY29uc3QgY2hhciogZmluZF9leHRlbnNpb24oY29uc3QgY2hhciogc3RyKSB7CiAgICAgY29uc3QgY2hhciogbGFzdFNsYXNoOwogICAgIGNvbnN0IGNoYXIqIGxhc3REb3Q7Ci0gICAgY29uc3QgY2hhciogY29uc3Qgc3RyID0gbVN0cmluZzsKIAogICAgIC8vIG9ubHkgbG9vayBhdCB0aGUgZmlsZW5hbWUKICAgICBsYXN0U2xhc2ggPSBzdHJyY2hyKHN0ciwgT1NfUEFUSF9TRVBBUkFUT1IpOwpAQCAtNTE3LDgzICs0NjgsMTYgQEAKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAKICAgICAvLyBsb29rcyBnb29kLCBzaGlwIGl0Ci0gICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Y2hhcio+KGxhc3REb3QpOworICAgIHJldHVybiBsYXN0RG90OwogfQogCiBTdHJpbmc4IFN0cmluZzg6OmdldFBhdGhFeHRlbnNpb24odm9pZCkgY29uc3QKIHsKLSAgICBjaGFyKiBleHQ7Ci0KLSAgICBleHQgPSBmaW5kX2V4dGVuc2lvbigpOworICAgIGF1dG8gZXh0ID0gZmluZF9leHRlbnNpb24obVN0cmluZyk7CiAgICAgaWYgKGV4dCAhPSBudWxscHRyKQogICAgICAgICByZXR1cm4gU3RyaW5nOChleHQpOwogICAgIGVsc2UKICAgICAgICAgcmV0dXJuIFN0cmluZzgoIiIpOwogfQogCi1TdHJpbmc4IFN0cmluZzg6OmdldEJhc2VQYXRoKHZvaWQpIGNvbnN0Ci17Ci0gICAgY2hhciogZXh0OwotICAgIGNvbnN0IGNoYXIqIGNvbnN0IHN0ciA9IG1TdHJpbmc7Ci0KLSAgICBleHQgPSBmaW5kX2V4dGVuc2lvbigpOwotICAgIGlmIChleHQgPT0gbnVsbHB0cikKLSAgICAgICAgcmV0dXJuIFN0cmluZzgoKnRoaXMpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIFN0cmluZzgoc3RyLCBleHQgLSBzdHIpOwotfQotCi1TdHJpbmc4JiBTdHJpbmc4OjphcHBlbmRQYXRoKGNvbnN0IGNoYXIqIG5hbWUpCi17Ci0gICAgLy8gVE9ETzogVGhlIHRlc3QgYmVsb3cgd2lsbCBmYWlsIGZvciBXaW4zMiBwYXRocy4gRml4IGxhdGVyIG9yIGlnbm9yZS4KLSAgICBpZiAobmFtZVswXSAhPSBPU19QQVRIX1NFUEFSQVRPUikgewotICAgICAgICBpZiAoKm5hbWUgPT0gJ1wwJykgewotICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbwotICAgICAgICAgICAgcmV0dXJuICp0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgc2l6ZV90IGxlbiA9IGxlbmd0aCgpOwotICAgICAgICBpZiAobGVuID09IDApIHsKLSAgICAgICAgICAgIC8vIG5vIGV4aXN0aW5nIGZpbGVuYW1lLCBqdXN0IHVzZSB0aGUgbmV3IG9uZQotICAgICAgICAgICAgc2V0UGF0aE5hbWUoKnRoaXMsIG5hbWUpOwotICAgICAgICAgICAgcmV0dXJuICp0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWFrZSByb29tIGZvciBvbGRQYXRoICsgJy8nICsgbmV3UGF0aAotICAgICAgICBpbnQgbmV3bGVuID0gc3RybGVuKG5hbWUpOwotCi0gICAgICAgIGNoYXIqIGJ1ZiA9IGxvY2tCdWZmZXIobGVuKzErbmV3bGVuKTsKLQotICAgICAgICAvLyBpbnNlcnQgYSAnLycgaWYgbmVlZGVkCi0gICAgICAgIGlmIChidWZbbGVuLTFdICE9IE9TX1BBVEhfU0VQQVJBVE9SKQotICAgICAgICAgICAgYnVmW2xlbisrXSA9IE9TX1BBVEhfU0VQQVJBVE9SOwotCi0gICAgICAgIG1lbWNweShidWYrbGVuLCBuYW1lLCBuZXdsZW4rMSk7Ci0gICAgICAgIGxlbiArPSBuZXdsZW47Ci0KLSAgICAgICAgdW5sb2NrQnVmZmVyKGxlbik7Ci0KLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNldFBhdGhOYW1lKCp0aGlzLCBuYW1lKTsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLX0KLQotU3RyaW5nOCYgU3RyaW5nODo6Y29udmVydFRvUmVzUGF0aCgpCi17Ci0jaWYgT1NfUEFUSF9TRVBBUkFUT1IgIT0gUkVTX1BBVEhfU0VQQVJBVE9SCi0gICAgc2l6ZV90IGxlbiA9IGxlbmd0aCgpOwotICAgIGlmIChsZW4gPiAwKSB7Ci0gICAgICAgIGNoYXIgKiBidWYgPSBsb2NrQnVmZmVyKGxlbik7Ci0gICAgICAgIGZvciAoY2hhciAqIGVuZCA9IGJ1ZiArIGxlbjsgYnVmIDwgZW5kOyArK2J1ZikgewotICAgICAgICAgICAgaWYgKCpidWYgPT0gT1NfUEFUSF9TRVBBUkFUT1IpCi0gICAgICAgICAgICAgICAgKmJ1ZiA9IFJFU19QQVRIX1NFUEFSQVRPUjsKLSAgICAgICAgfQotICAgICAgICB1bmxvY2tCdWZmZXIobGVuKTsKLSAgICB9Ci0jZW5kaWYKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ1dGlscy9TdHJpbmc4X2Z1enouY3BwIGIvbGlidXRpbHMvYmluZGVyL1N0cmluZzhfZnV6ei5jcHAKc2ltaWxhcml0eSBpbmRleCA4NCUKcmVuYW1lIGZyb20gbGlidXRpbHMvU3RyaW5nOF9mdXp6LmNwcApyZW5hbWUgdG8gbGlidXRpbHMvYmluZGVyL1N0cmluZzhfZnV6ei5jcHAKaW5kZXggZmFmNDliNi4uY2JjZTA1MCAxMDA2NDQKLS0tIGEvbGlidXRpbHMvU3RyaW5nOF9mdXp6LmNwcAorKysgYi9saWJ1dGlscy9iaW5kZXIvU3RyaW5nOF9mdXp6LmNwcApAQCAtMzQsNyArMzQsNyBAQAogICAgICAgICAgICAgICAgICAgICBzdHIxLT5ieXRlcygpOwogICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiwgYW5kcm9pZDo6U3RyaW5nOCogc3RyMSwgYW5kcm9pZDo6U3RyaW5nOCopIC0+IHZvaWQgewotICAgICAgICAgICAgICAgICAgICBzdHIxLT5pc0VtcHR5KCk7CisgICAgICAgICAgICAgICAgICAgIHN0cjEtPmVtcHR5KCk7CiAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqLCBhbmRyb2lkOjpTdHJpbmc4KiBzdHIxLCBhbmRyb2lkOjpTdHJpbmc4KikgLT4gdm9pZCB7CiAgICAgICAgICAgICAgICAgICAgIHN0cjEtPmxlbmd0aCgpOwpAQCAtNDUsNiArNDUsOCBAQAogICAgICAgICAgICAgICAgICAgICBzdHIxLT50b0xvd2VyKCk7CiAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqLCBhbmRyb2lkOjpTdHJpbmc4KiBzdHIxLCBhbmRyb2lkOjpTdHJpbmc4KiBzdHIyKSAtPiB2b2lkIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cjItPnNpemUoKSA9PSAwKSByZXR1cm47CisKICAgICAgICAgICAgICAgICAgICAgc3RyMS0+cmVtb3ZlQWxsKHN0cjItPmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiwgYW5kcm9pZDo6U3RyaW5nOCogc3RyMSwgYW5kcm9pZDo6U3RyaW5nOCogc3RyMikgLT4gdm9pZCB7CkBAIC02NiwzMyArNjgsNiBAQAogICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfaW5kZXggPSBkYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50PigwLCBzdHIxLT5zaXplKCkpOwogICAgICAgICAgICAgICAgICAgICBzdHIxLT5maW5kKHN0cjItPmNfc3RyKCksIHN0YXJ0X2luZGV4KTsKICAgICAgICAgICAgICAgICB9LAotCi0gICAgICAgICAgICAgICAgLy8gUGF0aCBoYW5kbGluZwotICAgICAgICAgICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciosIGFuZHJvaWQ6OlN0cmluZzgqIHN0cjEsIGFuZHJvaWQ6OlN0cmluZzgqKSAtPiB2b2lkIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyMS0+Z2V0QmFzZVBhdGgoKTsKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciosIGFuZHJvaWQ6OlN0cmluZzgqIHN0cjEsIGFuZHJvaWQ6OlN0cmluZzgqKSAtPiB2b2lkIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyMS0+Z2V0UGF0aEV4dGVuc2lvbigpOwotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiwgYW5kcm9pZDo6U3RyaW5nOCogc3RyMSwgYW5kcm9pZDo6U3RyaW5nOCopIC0+IHZvaWQgewotICAgICAgICAgICAgICAgICAgICBzdHIxLT5nZXRQYXRoTGVhZigpOwotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiwgYW5kcm9pZDo6U3RyaW5nOCogc3RyMSwgYW5kcm9pZDo6U3RyaW5nOCopIC0+IHZvaWQgewotICAgICAgICAgICAgICAgICAgICBzdHIxLT5nZXRQYXRoRGlyKCk7Ci0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqLCBhbmRyb2lkOjpTdHJpbmc4KiBzdHIxLCBhbmRyb2lkOjpTdHJpbmc4KikgLT4gdm9pZCB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cjEtPmNvbnZlcnRUb1Jlc1BhdGgoKTsKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciosIGFuZHJvaWQ6OlN0cmluZzgqIHN0cjEsIGFuZHJvaWQ6OlN0cmluZzgqKSAtPiB2b2lkIHsKLSAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OlN0cmluZzg+IHBhdGhfb3V0X3N0ciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxhbmRyb2lkOjpTdHJpbmc4PigpOwotICAgICAgICAgICAgICAgICAgICBzdHIxLT53YWxrUGF0aChwYXRoX291dF9zdHIuZ2V0KCkpOwotICAgICAgICAgICAgICAgICAgICBwYXRoX291dF9zdHItPmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqIGRhdGFQcm92aWRlciwgYW5kcm9pZDo6U3RyaW5nOCogc3RyMSwKLSAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpTdHJpbmc4KikgLT4gdm9pZCB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cjEtPmFwcGVuZFBhdGgoZGF0YVByb3ZpZGVyLT5Db25zdW1lQnl0ZXNXaXRoVGVybWluYXRvcjxjaGFyPig1KS5kYXRhKCkpOwotICAgICAgICAgICAgICAgIH0sCiB9OwogCiB2b2lkIGZ1enpGb3JtYXQoRnV6emVkRGF0YVByb3ZpZGVyKiBkYXRhUHJvdmlkZXIsIGFuZHJvaWQ6OlN0cmluZzgqIHN0cjEsIGJvb2wgc2hvdWxkQXBwZW5kKSB7CmRpZmYgLS1naXQgYS9saWJ1dGlscy9iaW5kZXIvU3RyaW5nOF90ZXN0LmNwcCBiL2xpYnV0aWxzL2JpbmRlci9TdHJpbmc4X3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjM2MzMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ1dGlscy9iaW5kZXIvU3RyaW5nOF90ZXN0LmNwcApAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiU3RyaW5nOF90ZXN0IgorCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPGNvbXBhcmU+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjbGFzcyBTdHJpbmc4VGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgeworICAgIH0KK307CisKK1RFU1RfRihTdHJpbmc4VGVzdCwgQ3N0cikgeworICAgIFN0cmluZzggdG1wKCJIZWxsbywgd29ybGQhIik7CisKKyAgICBFWFBFQ1RfU1RSRVEodG1wLmNfc3RyKCksICJIZWxsbywgd29ybGQhIik7Cit9CisKK1RFU1RfRihTdHJpbmc4VGVzdCwgT3BlcmF0b3JQbHVzKSB7CisgICAgU3RyaW5nOCBzcmMxKCJIZWxsbywgIik7CisKKyAgICAvLyBUZXN0IGFkZGluZyBTdHJpbmc4ICsgY29uc3QgY2hhcioKKyAgICBjb25zdCBjaGFyKiBjY3NyYzIgPSAid29ybGQhIjsKKyAgICBTdHJpbmc4IGRzdDEgPSBzcmMxICsgY2NzcmMyOworICAgIEVYUEVDVF9TVFJFUShkc3QxLmNfc3RyKCksICJIZWxsbywgd29ybGQhIik7CisgICAgRVhQRUNUX1NUUkVRKHNyYzEuY19zdHIoKSwgIkhlbGxvLCAiKTsKKyAgICBFWFBFQ1RfU1RSRVEoY2NzcmMyLCAid29ybGQhIik7CisKKyAgICAvLyBUZXN0IGFkZGluZyBTdHJpbmc4ICsgU3RyaW5nOAorICAgIFN0cmluZzggc3NyYzIoIndvcmxkISIpOworICAgIFN0cmluZzggZHN0MiA9IHNyYzEgKyBzc3JjMjsKKyAgICBFWFBFQ1RfU1RSRVEoZHN0Mi5jX3N0cigpLCAiSGVsbG8sIHdvcmxkISIpOworICAgIEVYUEVDVF9TVFJFUShzcmMxLmNfc3RyKCksICJIZWxsbywgIik7CisgICAgRVhQRUNUX1NUUkVRKHNzcmMyLmNfc3RyKCksICJ3b3JsZCEiKTsKK30KKworVEVTVF9GKFN0cmluZzhUZXN0LCBPcGVyYXRvclBsdXNFcXVhbHMpIHsKKyAgICBTdHJpbmc4IHNyYzEoIk15IHZvaWNlIik7CisKKyAgICAvLyBUZXN0aW5nIFN0cmluZzggKz0gU3RyaW5nOAorICAgIFN0cmluZzggc3JjMigiIGlzIG15IHBhc3Nwb3J0LiIpOworICAgIHNyYzEgKz0gc3JjMjsKKyAgICBFWFBFQ1RfU1RSRVEoc3JjMS5jX3N0cigpLCAiTXkgdm9pY2UgaXMgbXkgcGFzc3BvcnQuIik7CisgICAgRVhQRUNUX1NUUkVRKHNyYzIuY19zdHIoKSwgIiBpcyBteSBwYXNzcG9ydC4iKTsKKworICAgIC8vIEFkZGluZyBjb25zdCBjaGFyKiB0byB0aGUgcHJldmlvdXMgc3RyaW5nLgorICAgIGNvbnN0IGNoYXIqIHNyYzMgPSAiIFZlcmlmeSBtZS4iOworICAgIHNyYzEgKz0gc3JjMzsKKyAgICBFWFBFQ1RfU1RSRVEoc3JjMS5jX3N0cigpLCAiTXkgdm9pY2UgaXMgbXkgcGFzc3BvcnQuIFZlcmlmeSBtZS4iKTsKKyAgICBFWFBFQ1RfU1RSRVEoc3JjMi5jX3N0cigpLCAiIGlzIG15IHBhc3Nwb3J0LiIpOworICAgIEVYUEVDVF9TVFJFUShzcmMzLCAiIFZlcmlmeSBtZS4iKTsKK30KKworVEVTVF9GKFN0cmluZzhUZXN0LCBTZXRUb1NpemVNYXhSZXR1cm5zTm9NZW1vcnkpIHsKKyAgICBjb25zdCBjaGFyICppbiA9ICJzb21lIHN0cmluZyI7CisgICAgRVhQRUNUX0VRKE5PX01FTU9SWSwgU3RyaW5nOCgiIikuc2V0VG8oaW4sIFNJWkVfTUFYKSk7Cit9CisKKy8vIGh0dHA6Ly9iLzI5MjUwNTQzCitURVNUX0YoU3RyaW5nOFRlc3QsIENvcnJlY3RJbnZhbGlkU3Vycm9nYXRlKSB7CisgICAgLy8gZDg0MWQ4IGlzIGFuIGludmFsaWQgc3RhcnQgZm9yIGEgc3Vycm9nYXRlIHBhaXIuIE1ha2Ugc3VyZSB0aGlzIGlzIGhhbmRsZWQgYnkgaWdub3JpbmcgdGhlCisgICAgLy8gZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBwYWlyIGFuZCBoYW5kbGluZyB0aGUgcmVzdCBjb3JyZWN0bHkuCisgICAgU3RyaW5nMTYgc3RyaW5nMTYodSJceGQ4NDFceGQ4NDFceGRjNDFceDAwMDAiKTsKKyAgICBTdHJpbmc4IHN0cmluZzgoc3RyaW5nMTYpOworCisgICAgRVhQRUNUX0VRKDRVLCBzdHJpbmc4Lmxlbmd0aCgpKTsKK30KKworVEVTVF9GKFN0cmluZzhUZXN0LCBDaGVja1V0ZjMyQ29udmVyc2lvbikgeworICAgIC8vIFNpbmNlIGJvdW5kIGNoZWNrcyB3ZXJlIGFkZGVkLCBjaGVjayB0aGUgY29udmVyc2lvbiBjYW4gYmUgZG9uZSB3aXRob3V0IGZhdGFsIGVycm9ycy4KKyAgICAvLyBUaGUgdXRmOCBsZW5ndGhzIG9mIHRoZXNlIGFyZSBjaGFycyBhcmUgMSArIDIgKyAzICsgNCA9IDEwLgorICAgIGNvbnN0IGNoYXIzMl90IHN0cmluZzMyW10gPSBVIlx4MDAwMDAwN2ZceDAwMDAwN2ZmXHgwMDAwOTExXHgwMDEwZmZmZSI7CisgICAgU3RyaW5nOCBzdHJpbmc4KHN0cmluZzMyKTsKKyAgICBFWFBFQ1RfRVEoMTBVLCBzdHJpbmc4Lmxlbmd0aCgpKTsKK30KKworVEVTVF9GKFN0cmluZzhUZXN0LCBWYWxpZFV0ZjE2Q29udmVyc2lvbikgeworICAgIGNoYXIxNl90IHRtcFtdID0gdSJhYmNkZWYiOworICAgIFN0cmluZzggdmFsaWQgPSBTdHJpbmc4KFN0cmluZzE2KHRtcCkpOworICAgIEVYUEVDVF9TVFJFUSh2YWxpZC5jX3N0cigpLCAiYWJjZGVmIik7Cit9CisKK1RFU1RfRihTdHJpbmc4VGVzdCwgYXBwZW5kKSB7CisgICAgU3RyaW5nOCBzOworICAgIEVYUEVDVF9FUShPSywgcy5hcHBlbmQoImZvbyIpKTsKKyAgICBFWFBFQ1RfU1RSRVEoImZvbyIsIHMuY19zdHIoKSk7CisgICAgRVhQRUNUX0VRKE9LLCBzLmFwcGVuZCgiYmFyIikpOworICAgIEVYUEVDVF9TVFJFUSgiZm9vYmFyIiwgcy5jX3N0cigpKTsKKyAgICBFWFBFQ1RfRVEoT0ssIHMuYXBwZW5kKCJiYXoiLCAwKSk7CisgICAgRVhQRUNUX1NUUkVRKCJmb29iYXIiLCBzLmNfc3RyKCkpOworICAgIEVYUEVDVF9FUShOT19NRU1PUlksIHMuYXBwZW5kKCJiYXoiLCBTSVpFX01BWCkpOworICAgIEVYUEVDVF9TVFJFUSgiZm9vYmFyIiwgcy5jX3N0cigpKTsKK30KKworVEVTVF9GKFN0cmluZzhUZXN0LCByZW1vdmVBbGwpIHsKKyAgICBTdHJpbmc4IHMoIkhlbGxvLCB3b3JsZCEiKTsKKworICAgIC8vIE5VTEwgaW5wdXQgc2hvdWxkIGNhdXNlIGFuIGFzc2VydGlvbiBmYWlsdXJlIGFuZCBlcnJvciBtZXNzYWdlIGluIGxvZ2NhdAorICAgIEVYUEVDVF9ERUFUSChzLnJlbW92ZUFsbChOVUxMKSwgIiIpOworCisgICAgLy8gZXhwZWN0IHRvIHJldHVybiB0cnVlIGFuZCBzdHJpbmcgY29udGVudCBzaG91bGQgcmVtYWluIHVuY2hhbmdlZAorICAgIEVYUEVDVF9UUlVFKHMucmVtb3ZlQWxsKCIiKSk7CisgICAgRVhQRUNUX1NUUkVRKCJIZWxsbywgd29ybGQhIiwgcy5jX3N0cigpKTsKKworICAgIC8vIGV4cGVjdCB0byByZXR1cm4gZmFsc2UKKyAgICBFWFBFQ1RfRkFMU0Uocy5yZW1vdmVBbGwoIngiKSk7CisgICAgRVhQRUNUX1NUUkVRKCJIZWxsbywgd29ybGQhIiwgcy5jX3N0cigpKTsKKworICAgIEVYUEVDVF9UUlVFKHMucmVtb3ZlQWxsKCJvIikpOworICAgIEVYUEVDVF9TVFJFUSgiSGVsbCwgd3JsZCEiLCBzLmNfc3RyKCkpOworfQorCitURVNUX0YoU3RyaW5nOFRlc3QsIGNvbXBhcmlzb25zKSB7CisgICAgY29uc3QgY2hhciogY3N0cjEgPSAiYWJjIjsKKyAgICBjb25zdCBjaGFyKiBjc3RyMiA9ICJkZWYiOworCisgICAgLy8gc3RyMSBhbmQgc3RyMWIgd2lsbCBwb2ludCB0byBkaWZmZXJlbnQgYmxvY2tzIG9mIG1lbW9yeSBidXQgd2l0aCBlcXVhbCBjb250ZW50cy4KKyAgICBTdHJpbmc4IHN0cjEoY3N0cjEpOworICAgIFN0cmluZzggc3RyMWIoY3N0cjEpOworICAgIFN0cmluZzggc3RyMihjc3RyMik7CisKKyAgICBFWFBFQ1RfVFJVRSgoc3RyMSA8PT4gc3RyMWIpID09IDApOworICAgIEVYUEVDVF9GQUxTRShzdHIxICE9IHN0cjFiKTsKKyAgICBFWFBFQ1RfRkFMU0Uoc3RyMSA8IHN0cjFiKTsKKyAgICBFWFBFQ1RfVFJVRShzdHIxIDw9IHN0cjFiKTsKKyAgICBFWFBFQ1RfVFJVRShzdHIxID09IHN0cjFiKTsKKyAgICBFWFBFQ1RfVFJVRShzdHIxID49IHN0cjFiKTsKKyAgICBFWFBFQ1RfRkFMU0Uoc3RyMSA+IHN0cjFiKTsKKworICAgIEVYUEVDVF9UUlVFKChzdHIxIDw9PiBzdHIyKSA8IDApOworICAgIEVYUEVDVF9UUlVFKChzdHIyIDw9PiBzdHIxKSA+IDApOworICAgIEVYUEVDVF9UUlVFKHN0cjEgIT0gc3RyMik7CisgICAgRVhQRUNUX1RSVUUoc3RyMSA8IHN0cjIpOworICAgIEVYUEVDVF9UUlVFKHN0cjEgPD0gc3RyMik7CisgICAgRVhQRUNUX0ZBTFNFKHN0cjEgPT0gc3RyMik7CisgICAgRVhQRUNUX0ZBTFNFKHN0cjEgPj0gc3RyMik7CisgICAgRVhQRUNUX0ZBTFNFKHN0cjEgPiBzdHIyKTsKKworICAgIC8vIFZlcmlmeSB0aGF0IHByZS1DKysyMCBjb21wYXJpc29uIG9wZXJhdG9ycyB3b3JrIHdpdGggYSBzdGQ6OnBhaXIgb2YgYSBTdHJpbmc4LCB3aGljaCBvbmx5CisgICAgLy8gcHJvdmlkZXMgPD0+IGluIEMrKzIwIGFuZCB1cC4gU2VlIGIvMzM5Nzc1NDA1LgorCisgICAgc3RkOjpwYWlyPFN0cmluZzgsIGludD4gcGFpcjEoc3RyMSwgMTMpOworICAgIHN0ZDo6cGFpcjxTdHJpbmc4LCBpbnQ+IHBhaXIxYihzdHIxYiwgMTMpOworICAgIHN0ZDo6cGFpcjxTdHJpbmc4LCBpbnQ+IHBhaXIyKHN0cjIsIDEzKTsKKworICAgIEVYUEVDVF9UUlVFKHBhaXIxID09IHBhaXIxYik7CisgICAgRVhQRUNUX0ZBTFNFKHBhaXIxIDwgcGFpcjFiKTsKKyAgICBFWFBFQ1RfRkFMU0UocGFpcjEgPiBwYWlyMWIpOworCisgICAgRVhQRUNUX1RSVUUocGFpcjEgIT0gcGFpcjIpOworICAgIEVYUEVDVF9UUlVFKHBhaXIxIDwgcGFpcjIpOworICAgIEVYUEVDVF9GQUxTRShwYWlyMSA+IHBhaXIyKTsKK30KZGlmZiAtLWdpdCBhL2xpYnV0aWxzL1N0cm9uZ1BvaW50ZXIuY3BwIGIvbGlidXRpbHMvYmluZGVyL1N0cm9uZ1BvaW50ZXIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWJ1dGlscy9TdHJvbmdQb2ludGVyLmNwcApyZW5hbWUgdG8gbGlidXRpbHMvYmluZGVyL1N0cm9uZ1BvaW50ZXIuY3BwCmRpZmYgLS1naXQgYS9saWJ1dGlscy9TdHJvbmdQb2ludGVyX3Rlc3QuY3BwIGIvbGlidXRpbHMvYmluZGVyL1N0cm9uZ1BvaW50ZXJfdGVzdC5jcHAKc2ltaWxhcml0eSBpbmRleCA4NiUKcmVuYW1lIGZyb20gbGlidXRpbHMvU3Ryb25nUG9pbnRlcl90ZXN0LmNwcApyZW5hbWUgdG8gbGlidXRpbHMvYmluZGVyL1N0cm9uZ1BvaW50ZXJfdGVzdC5jcHAKaW5kZXggZjI3YzFmMS4uYWE5OTNjMyAxMDA2NDQKLS0tIGEvbGlidXRpbHMvU3Ryb25nUG9pbnRlcl90ZXN0LmNwcAorKysgYi9saWJ1dGlscy9iaW5kZXIvU3Ryb25nUG9pbnRlcl90ZXN0LmNwcApAQCAtMTA2LDMgKzEwNiwxNyBAQAogICAgIEVYUEVDVF9ERUFUSChzcDxUeXBlUGFyYW0+Ojpmcm9tRXhpc3RpbmcoZm9vKSwgIiIpOwogICAgIGRlbGV0ZSBmb287CiB9CisKK1RZUEVEX1RFU1QoU3Ryb25nUG9pbnRlciwgcmVsZWFzZSkgeworICAgIGJvb2wgaXNEZWxldGVkID0gZmFsc2U7CisgICAgVHlwZVBhcmFtKiBmb28gPSBudWxscHRyOworICAgIHsKKyAgICAgICAgc3A8VHlwZVBhcmFtPiBzcDEgPSBzcDxUeXBlUGFyYW0+OjptYWtlKCZpc0RlbGV0ZWQpOworICAgICAgICBBU1NFUlRfRVEoMSwgc3AxLT5nZXRTdHJvbmdDb3VudCgpKTsKKyAgICAgICAgZm9vID0gc3AxLnJlbGVhc2UoKTsKKyAgICB9CisgICAgQVNTRVJUX0ZBTFNFKGlzRGVsZXRlZCkgPDwgInJlbGVhc2UgZmFpbGVkLCBkZWxldGVkIGFueXdheSB3aGVuIHNwIGxlZnQgc2NvcGUiOworICAgIEFTU0VSVF9FUSgxLCBmb28tPmdldFN0cm9uZ0NvdW50KCkpIDw8ICJyZWxlYXNlIG1pc21hbmFnZWQgcmVmY291bnQiOworICAgIGZvby0+ZGVjU3Ryb25nKG51bGxwdHIpOworICAgIEFTU0VSVF9UUlVFKGlzRGVsZXRlZCkgPDwgImZvbyB3YXMgbGVha2VkISI7Cit9CmRpZmYgLS1naXQgYS9saWJ1dGlscy9iaW5kZXIvVW5pY29kZS5jcHAgYi9saWJ1dGlscy9iaW5kZXIvVW5pY29kZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVkMmQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnV0aWxzL2JpbmRlci9Vbmljb2RlLmNwcApAQCAtMCwwICsxLDU0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAidW5pY29kZSIKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHV0aWxzL1VuaWNvZGUuaD4KKworI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworZXh0ZXJuICJDIiB7CisKK3N0YXRpYyBjb25zdCBjaGFyMzJfdCBrQnl0ZU1hc2sgPSAweDAwMDAwMEJGOworc3RhdGljIGNvbnN0IGNoYXIzMl90IGtCeXRlTWFyayA9IDB4MDAwMDAwODA7CisKKy8vIFN1cnJvZ2F0ZXMgYXJlbid0IHZhbGlkIGZvciBVVEYtMzIgY2hhcmFjdGVycywgc28gZGVmaW5lIHNvbWUKKy8vIGNvbnN0YW50cyB0aGF0IHdpbGwgbGV0IHVzIHNjcmVlbiB0aGVtIG91dC4KK3N0YXRpYyBjb25zdCBjaGFyMzJfdCBrVW5pY29kZVN1cnJvZ2F0ZUhpZ2hTdGFydCAgPSAweDAwMDBEODAwOworLy8gVW51c2VkLCBoZXJlIGZvciBjb21wbGV0ZW5lc3M6CisvLyBzdGF0aWMgY29uc3QgY2hhcjMyX3Qga1VuaWNvZGVTdXJyb2dhdGVIaWdoRW5kID0gMHgwMDAwREJGRjsKKy8vIHN0YXRpYyBjb25zdCBjaGFyMzJfdCBrVW5pY29kZVN1cnJvZ2F0ZUxvd1N0YXJ0ID0gMHgwMDAwREMwMDsKK3N0YXRpYyBjb25zdCBjaGFyMzJfdCBrVW5pY29kZVN1cnJvZ2F0ZUxvd0VuZCAgICAgPSAweDAwMDBERkZGOworc3RhdGljIGNvbnN0IGNoYXIzMl90IGtVbmljb2RlU3Vycm9nYXRlU3RhcnQgICAgICA9IGtVbmljb2RlU3Vycm9nYXRlSGlnaFN0YXJ0Oworc3RhdGljIGNvbnN0IGNoYXIzMl90IGtVbmljb2RlU3Vycm9nYXRlRW5kICAgICAgICA9IGtVbmljb2RlU3Vycm9nYXRlTG93RW5kOworc3RhdGljIGNvbnN0IGNoYXIzMl90IGtVbmljb2RlTWF4Q29kZXBvaW50ICAgICAgICA9IDB4MDAxMEZGRkY7CisKKy8vIE1hc2sgdXNlZCB0byBzZXQgYXBwcm9wcmlhdGUgYml0cyBpbiBmaXJzdCBieXRlIG9mIFVURi04IHNlcXVlbmNlLAorLy8gaW5kZXhlZCBieSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHNlcXVlbmNlLgorLy8gMHh4eHh4eHgKKy8vIC0+ICgwMC03ZikgN2JpdC4gQml0IG1hc2sgZm9yIHRoZSBmaXJzdCBieXRlIGlzIDB4MDAwMDAwMDAKKy8vIDExMHl5eXl4IDEweHh4eHh4CisvLyAtPiAoYzAtZGYpKDgwLWJmKSAxMWJpdC4gQml0IG1hc2sgaXMgMHgwMDAwMDBDMAorLy8gMTExMHl5eXkgMTB5eHh4eHggMTB4eHh4eHgKKy8vIC0+IChlMC1lZikoODAtYmYpKDgwLWJmKSAxNmJpdC4gQml0IG1hc2sgaXMgMHgwMDAwMDBFMAorLy8gMTExMTB5eXkgMTB5eXh4eHggMTB4eHh4eHggMTB4eHh4eHgKKy8vIC0+IChmMC1mNykoODAtYmYpKDgwLWJmKSg4MC1iZikgMjFiaXQuIEJpdCBtYXNrIGlzIDB4MDAwMDAwRjAKK3N0YXRpYyBjb25zdCBjaGFyMzJfdCBrRmlyc3RCeXRlTWFya1tdID0geworICAgIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwQzAsIDB4MDAwMDAwRTAsIDB4MDAwMDAwRjAKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBVVEYtMzIKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qKgorICogUmV0dXJuIG51bWJlciBvZiBVVEYtOCBieXRlcyByZXF1aXJlZCBmb3IgdGhlIGNoYXJhY3Rlci4gSWYgdGhlIGNoYXJhY3RlcgorICogaXMgaW52YWxpZCwgcmV0dXJuIHNpemUgb2YgMC4KKyAqLworc3RhdGljIGlubGluZSBzaXplX3QgdXRmMzJfY29kZXBvaW50X3V0ZjhfbGVuZ3RoKGNoYXIzMl90IHNyY0NoYXIpCit7CisgICAgLy8gRmlndXJlIG91dCBob3cgbWFueSBieXRlcyB0aGUgcmVzdWx0IHdpbGwgcmVxdWlyZS4KKyAgICBpZiAoc3JjQ2hhciA8IDB4MDAwMDAwODApIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIGlmIChzcmNDaGFyIDwgMHgwMDAwMDgwMCkgeworICAgICAgICByZXR1cm4gMjsKKyAgICB9IGVsc2UgaWYgKHNyY0NoYXIgPCAweDAwMDEwMDAwKSB7CisgICAgICAgIGlmICgoc3JjQ2hhciA8IGtVbmljb2RlU3Vycm9nYXRlU3RhcnQpIHx8IChzcmNDaGFyID4ga1VuaWNvZGVTdXJyb2dhdGVFbmQpKSB7CisgICAgICAgICAgICByZXR1cm4gMzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFN1cnJvZ2F0ZXMgYXJlIGludmFsaWQgVVRGLTMyIGNoYXJhY3RlcnMuCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBNYXggY29kZSBwb2ludCBmb3IgVW5pY29kZSBpcyAweDAwMTBGRkZGLgorICAgIGVsc2UgaWYgKHNyY0NoYXIgPD0ga1VuaWNvZGVNYXhDb2RlcG9pbnQpIHsKKyAgICAgICAgcmV0dXJuIDQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gSW52YWxpZCBVVEYtMzIgY2hhcmFjdGVyLgorICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKy8vIFdyaXRlIG91dCB0aGUgc291cmNlIGNoYXJhY3RlciB0byA8ZHN0UD4uCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1dGYzMl9jb2RlcG9pbnRfdG9fdXRmOCh1aW50OF90KiBkc3RQLCBjaGFyMzJfdCBzcmNDaGFyLCBzaXplX3QgYnl0ZXMpCit7CisgICAgZHN0UCArPSBieXRlczsKKyAgICBzd2l0Y2ggKGJ5dGVzKQorICAgIHsgICAvKiBub3RlOiBldmVyeXRoaW5nIGZhbGxzIHRocm91Z2guICovCisgICAgICAgIGNhc2UgNDogKi0tZHN0UCA9ICh1aW50OF90KSgoc3JjQ2hhciB8IGtCeXRlTWFyaykgJiBrQnl0ZU1hc2spOyBzcmNDaGFyID4+PSA2OworICAgICAgICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICBjYXNlIDM6ICotLWRzdFAgPSAodWludDhfdCkoKHNyY0NoYXIgfCBrQnl0ZU1hcmspICYga0J5dGVNYXNrKTsgc3JjQ2hhciA+Pj0gNjsKKyAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgY2FzZSAyOiAqLS1kc3RQID0gKHVpbnQ4X3QpKChzcmNDaGFyIHwga0J5dGVNYXJrKSAmIGtCeXRlTWFzayk7IHNyY0NoYXIgPj49IDY7CisgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgIGNhc2UgMTogKi0tZHN0UCA9ICh1aW50OF90KShzcmNDaGFyIHwga0ZpcnN0Qnl0ZU1hcmtbYnl0ZXNdKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50MzJfdCB1dGYzMl9hdF9pbnRlcm5hbChjb25zdCBjaGFyKiBjdXIsIHNpemVfdCAqbnVtX3JlYWQpCit7CisgICAgY29uc3QgY2hhciBmaXJzdF9jaGFyID0gKmN1cjsKKyAgICBpZiAoKGZpcnN0X2NoYXIgJiAweDgwKSA9PSAwKSB7IC8vIEFTQ0lJCisgICAgICAgICpudW1fcmVhZCA9IDE7CisgICAgICAgIHJldHVybiAqY3VyOworICAgIH0KKyAgICBjdXIrKzsKKyAgICBjaGFyMzJfdCBtYXNrLCB0b19pZ25vcmVfbWFzazsKKyAgICBzaXplX3QgbnVtX3RvX3JlYWQgPSAwOworICAgIGNoYXIzMl90IHV0ZjMyID0gZmlyc3RfY2hhcjsKKyAgICBmb3IgKG51bV90b19yZWFkID0gMSwgbWFzayA9IDB4NDAsIHRvX2lnbm9yZV9tYXNrID0gMHhGRkZGRkY4MDsKKyAgICAgICAgIChmaXJzdF9jaGFyICYgbWFzayk7CisgICAgICAgICBudW1fdG9fcmVhZCsrLCB0b19pZ25vcmVfbWFzayB8PSBtYXNrLCBtYXNrID4+PSAxKSB7CisgICAgICAgIC8vIDB4M0YgPT0gMDAxMTExMTEKKyAgICAgICAgdXRmMzIgPSAodXRmMzIgPDwgNikgKyAoKmN1cisrICYgMHgzRik7CisgICAgfQorICAgIHRvX2lnbm9yZV9tYXNrIHw9IG1hc2s7CisgICAgdXRmMzIgJj0gfih0b19pZ25vcmVfbWFzayA8PCAoNiAqIChudW1fdG9fcmVhZCAtIDEpKSk7CisKKyAgICAqbnVtX3JlYWQgPSBudW1fdG9fcmVhZDsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4odXRmMzIpOworfQorCitpbnQzMl90IHV0ZjMyX2Zyb21fdXRmOF9hdChjb25zdCBjaGFyICpzcmMsIHNpemVfdCBzcmNfbGVuLCBzaXplX3QgaW5kZXgsIHNpemVfdCAqbmV4dF9pbmRleCkKK3sKKyAgICBpZiAoaW5kZXggPj0gc3JjX2xlbikgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHNpemVfdCB1bnVzZWRfaW5kZXg7CisgICAgaWYgKG5leHRfaW5kZXggPT0gbnVsbHB0cikgeworICAgICAgICBuZXh0X2luZGV4ID0gJnVudXNlZF9pbmRleDsKKyAgICB9CisgICAgc2l6ZV90IG51bV9yZWFkOworICAgIGludDMyX3QgcmV0ID0gdXRmMzJfYXRfaW50ZXJuYWwoc3JjICsgaW5kZXgsICZudW1fcmVhZCk7CisgICAgaWYgKHJldCA+PSAwKSB7CisgICAgICAgICpuZXh0X2luZGV4ID0gaW5kZXggKyBudW1fcmVhZDsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzc2l6ZV90IHV0ZjMyX3RvX3V0ZjhfbGVuZ3RoKGNvbnN0IGNoYXIzMl90ICpzcmMsIHNpemVfdCBzcmNfbGVuKQoreworICAgIGlmIChzcmMgPT0gbnVsbHB0ciB8fCBzcmNfbGVuID09IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHNpemVfdCByZXQgPSAwOworICAgIGNvbnN0IGNoYXIzMl90ICplbmQgPSBzcmMgKyBzcmNfbGVuOworICAgIHdoaWxlIChzcmMgPCBlbmQpIHsKKyAgICAgICAgc2l6ZV90IGNoYXJfbGVuID0gdXRmMzJfY29kZXBvaW50X3V0ZjhfbGVuZ3RoKCpzcmMrKyk7CisgICAgICAgIGlmIChTU0laRV9NQVggLSBjaGFyX2xlbiA8IHJldCkgeworICAgICAgICAgICAgLy8gSWYgdGhpcyBoYXBwZW5zLCB3ZSB3b3VsZCBvdmVyZmxvdyB0aGUgc3NpemVfdCB0eXBlIHdoZW4KKyAgICAgICAgICAgIC8vIHJldHVybmluZyBmcm9tIHRoaXMgZnVuY3Rpb24sIHNvIHdlIGNhbm5vdCBleHByZXNzIGhvdworICAgICAgICAgICAgLy8gbG9uZyB0aGlzIHN0cmluZyBpcyBpbiBhbiBzc2l6ZV90LgorICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzNzcyMzAyNiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHJldCArPSBjaGFyX2xlbjsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCB1dGYzMl90b191dGY4KGNvbnN0IGNoYXIzMl90KiBzcmMsIHNpemVfdCBzcmNfbGVuLCBjaGFyKiBkc3QsIHNpemVfdCBkc3RfbGVuKQoreworICAgIGlmIChzcmMgPT0gbnVsbHB0ciB8fCBzcmNfbGVuID09IDAgfHwgZHN0ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGNoYXIzMl90ICpjdXJfdXRmMzIgPSBzcmM7CisgICAgY29uc3QgY2hhcjMyX3QgKmVuZF91dGYzMiA9IHNyYyArIHNyY19sZW47CisgICAgY2hhciAqY3VyID0gZHN0OworICAgIHdoaWxlIChjdXJfdXRmMzIgPCBlbmRfdXRmMzIpIHsKKyAgICAgICAgc2l6ZV90IGxlbiA9IHV0ZjMyX2NvZGVwb2ludF91dGY4X2xlbmd0aCgqY3VyX3V0ZjMyKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihkc3RfbGVuIDwgbGVuLCAiJXp1IDwgJXp1IiwgZHN0X2xlbiwgbGVuKTsKKyAgICAgICAgdXRmMzJfY29kZXBvaW50X3RvX3V0ZjgoKHVpbnQ4X3QgKiljdXIsICpjdXJfdXRmMzIrKywgbGVuKTsKKyAgICAgICAgY3VyICs9IGxlbjsKKyAgICAgICAgZHN0X2xlbiAtPSBsZW47CisgICAgfQorICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZHN0X2xlbiA8IDEsICJkc3RfbGVuIDwgMTogJXp1IDwgMSIsIGRzdF9sZW4pOworICAgICpjdXIgPSAnXDAnOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVVRGLTE2CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgc3RyY21wMTYoY29uc3QgY2hhcjE2X3QgKnMxLCBjb25zdCBjaGFyMTZfdCAqczIpCit7CisgIGNoYXIxNl90IGNoOworICBpbnQgZCA9IDA7CisKKyAgd2hpbGUgKCAxICkgeworICAgIGQgPSAoaW50KShjaCA9ICpzMSsrKSAtIChpbnQpKnMyKys7CisgICAgaWYgKCBkIHx8ICFjaCApCisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBkOworfQorCitpbnQgc3RybmNtcDE2KGNvbnN0IGNoYXIxNl90ICpzMSwgY29uc3QgY2hhcjE2X3QgKnMyLCBzaXplX3QgbikKK3sKKyAgY2hhcjE2X3QgY2g7CisgIGludCBkID0gMDsKKworICBpZiAobiA9PSAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBkbyB7CisgICAgZCA9IChpbnQpKGNoID0gKnMxKyspIC0gKGludCkqczIrKzsKKyAgICBpZiAoIGQgfHwgIWNoICkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9IHdoaWxlICgtLW4pOworCisgIHJldHVybiBkOworfQorCitzaXplX3Qgc3RybGVuMTYoY29uc3QgY2hhcjE2X3QgKnMpCit7CisgIGNvbnN0IGNoYXIxNl90ICpzcyA9IHM7CisgIHdoaWxlICggKnNzICkKKyAgICBzcysrOworICByZXR1cm4gc3MtczsKK30KKworc2l6ZV90IHN0cm5sZW4xNihjb25zdCBjaGFyMTZfdCAqcywgc2l6ZV90IG1heGxlbikKK3sKKyAgY29uc3QgY2hhcjE2X3QgKnNzID0gczsKKworICAvKiBJbXBvcnRhbnQ6IHRoZSBtYXhsZW4gdGVzdCBtdXN0IHByZWNlZGUgdGhlIHJlZmVyZW5jZSB0aHJvdWdoIHNzOworICAgICBzaW5jZSB0aGUgYnl0ZSBiZXlvbmQgdGhlIG1heGltdW0gbWF5IHNlZ2ZhdWx0ICovCisgIHdoaWxlICgobWF4bGVuID4gMCkgJiYgKnNzKSB7CisgICAgc3MrKzsKKyAgICBtYXhsZW4tLTsKKyAgfQorICByZXR1cm4gc3MtczsKK30KKworY2hhcjE2X3QqIHN0cnN0cjE2KGNvbnN0IGNoYXIxNl90KiBzcmMsIGNvbnN0IGNoYXIxNl90KiB0YXJnZXQpCit7CisgICAgY29uc3QgY2hhcjE2X3QgbmVlZGxlID0gKnRhcmdldDsKKyAgICBpZiAobmVlZGxlID09ICdcMCcpIHJldHVybiAoY2hhcjE2X3QqKXNyYzsKKworICAgIGNvbnN0IHNpemVfdCB0YXJnZXRfbGVuID0gc3RybGVuMTYoKyt0YXJnZXQpOworICAgIGRvIHsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKCpzcmMgPT0gJ1wwJykgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlICgqc3JjKysgIT0gbmVlZGxlKTsKKyAgICB9IHdoaWxlIChzdHJuY21wMTYoc3JjLCB0YXJnZXQsIHRhcmdldF9sZW4pICE9IDApOworICAgIHNyYy0tOworCisgICAgcmV0dXJuIChjaGFyMTZfdCopc3JjOworfQorCitpbnQgc3RyemNtcDE2KGNvbnN0IGNoYXIxNl90ICpzMSwgc2l6ZV90IG4xLCBjb25zdCBjaGFyMTZfdCAqczIsIHNpemVfdCBuMikKK3sKKyAgICBjb25zdCBjaGFyMTZfdCogZTEgPSBzMStuMTsKKyAgICBjb25zdCBjaGFyMTZfdCogZTIgPSBzMituMjsKKworICAgIHdoaWxlIChzMSA8IGUxICYmIHMyIDwgZTIpIHsKKyAgICAgICAgY29uc3QgaW50IGQgPSAoaW50KSpzMSsrIC0gKGludCkqczIrKzsKKyAgICAgICAgaWYgKGQpIHsKKyAgICAgICAgICAgIHJldHVybiBkOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG4xIDwgbjIKKyAgICAgICAgPyAoMCAtIChpbnQpKnMyKQorICAgICAgICA6IChuMSA+IG4yCisgICAgICAgICAgID8gKChpbnQpKnMxIC0gMCkKKyAgICAgICAgICAgOiAwKTsKK30KKworLy8gaXNfYW55X3N1cnJvZ2F0ZSgpIHJldHVybnMgdHJ1ZSBpZiB3IGlzIGVpdGhlciBhIGhpZ2ggb3IgbG93IHN1cnJvZ2F0ZQorc3RhdGljIGNvbnN0ZXhwciBib29sIGlzX2FueV9zdXJyb2dhdGUoY2hhcjE2X3QgdykgeworICAgIHJldHVybiAodyAmIDB4ZjgwMCkgPT0gMHhkODAwOworfQorCisvLyBpc19zdXJyb2dhdGVfcGFpcigpIHJldHVybnMgdHJ1ZSBpZiB3MSBhbmQgdzIgZm9ybSBhIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyCitzdGF0aWMgY29uc3RleHByIGJvb2wgaXNfc3Vycm9nYXRlX3BhaXIoY2hhcjE2X3QgdzEsIGNoYXIxNl90IHcyKSB7CisgICAgcmV0dXJuICgodzEgJiAweGZjMDApID09IDB4ZDgwMCkgJiYgKCh3MiAmIDB4ZmMwMCkgPT0gMHhkYzAwKTsKK30KKworLy8gVE9ETzogY3VycmVudGx5IHV0ZjE2X3RvX3V0ZjhfbGVuZ3RoKCkgcmV0dXJucyAtMSBpZiBzcmNfbGVuID09IDAsCisvLyB3aGljaCBpcyBpbmNvbnNpc3RlbnQgd2l0aCB1dGY4X3RvX3V0ZjE2X2xlbmd0aCgpLCBoZXJlIHdlIGtlZXAgdGhlCisvLyBjdXJyZW50IGJlaGF2aW9yIGFzIGludGVuZGVkIG5vdCB0byBicmVhayBjb21wYXRpYmlsaXR5Citzc2l6ZV90IHV0ZjE2X3RvX3V0ZjhfbGVuZ3RoKGNvbnN0IGNoYXIxNl90ICpzcmMsIHNpemVfdCBzcmNfbGVuKQoreworICAgIGlmIChzcmMgPT0gbnVsbHB0ciB8fCBzcmNfbGVuID09IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGNvbnN0IGNoYXIxNl90KiBjb25zdCBlbmQgPSBzcmMgKyBzcmNfbGVuOworICAgIGNvbnN0IGNoYXIxNl90KiBpbiA9IHNyYzsKKyAgICBzaXplX3QgdXRmOF9sZW4gPSAwOworCisgICAgd2hpbGUgKGluIDwgZW5kKSB7CisgICAgICAgIGNoYXIxNl90IHcgPSAqaW4rKzsKKyAgICAgICAgaWYgKHcgPCAweDAwODApIFtbbGlrZWx5XV0geworICAgICAgICAgICAgdXRmOF9sZW4gKz0gMTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICh3IDwgMHgwODAwKSBbW2xpa2VseV1dIHsKKyAgICAgICAgICAgIHV0ZjhfbGVuICs9IDI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWlzX2FueV9zdXJyb2dhdGUodykpIFtbbGlrZWx5XV0geworICAgICAgICAgICAgdXRmOF9sZW4gKz0gMzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChpbiA8IGVuZCAmJiBpc19zdXJyb2dhdGVfcGFpcih3LCAqaW4pKSB7CisgICAgICAgICAgICB1dGY4X2xlbiArPSA0OworICAgICAgICAgICAgaW4rKzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8qIHNraXAgaWYgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nIG9yIGludmFsaWQgc3Vycm9nYXRlIHBhaXIgKi8KKyAgICB9CisgICAgcmV0dXJuIChpbiA9PSBlbmQgJiYgdXRmOF9sZW4gPCBTU0laRV9NQVgpID8gdXRmOF9sZW4gOiAtMTsKK30KKwordm9pZCB1dGYxNl90b191dGY4KGNvbnN0IGNoYXIxNl90KiBzcmMsIHNpemVfdCBzcmNfbGVuLCBjaGFyKiBkc3QsIHNpemVfdCBkc3RfbGVuKQoreworICAgIGlmIChzcmMgPT0gbnVsbHB0ciB8fCBzcmNfbGVuID09IDAgfHwgZHN0ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGNoYXIxNl90KiBpbiA9IHNyYzsKKyAgICBjb25zdCBjaGFyMTZfdCogY29uc3QgaW5fZW5kID0gc3JjICsgc3JjX2xlbjsKKyAgICBjaGFyKiBvdXQgPSBkc3Q7CisgICAgY29uc3QgY2hhciogY29uc3Qgb3V0X2VuZCA9IGRzdCArIGRzdF9sZW47CisgICAgY2hhcjE2X3QgdzI7CisKKyAgICBhdXRvIGVycl9vdXQgPSBbJm91dCwgJm91dF9lbmQsICZkc3RfbGVuXSgpIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihvdXQgPj0gb3V0X2VuZCwKKyAgICAgICAgICAgICAgICAidGFyZ2V0IHV0Zjggc3RyaW5nIHNpemUgJXp1IHRvbyBzaG9ydCIsIGRzdF9sZW4pOworICAgIH07CisKKyAgICB3aGlsZSAoaW4gPCBpbl9lbmQpIHsKKyAgICAgICAgY2hhcjE2X3QgdyA9ICppbisrOworICAgICAgICBpZiAodyA8IDB4MDA4MCkgW1tsaWtlbHldXSB7CisgICAgICAgICAgICBpZiAob3V0ICsgMSA+IG91dF9lbmQpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycl9vdXQoKTsKKyAgICAgICAgICAgICpvdXQrKyA9IChjaGFyKSh3ICYgMHhmZik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodyA8IDB4MDgwMCkgW1tsaWtlbHldXSB7CisgICAgICAgICAgICBpZiAob3V0ICsgMiA+IG91dF9lbmQpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycl9vdXQoKTsKKyAgICAgICAgICAgICpvdXQrKyA9IChjaGFyKSgweGMwIHwgKCh3ID4+IDYpICYgMHgxZikpOworICAgICAgICAgICAgKm91dCsrID0gKGNoYXIpKDB4ODAgfCAoKHcgPj4gMCkgJiAweDNmKSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWlzX2FueV9zdXJyb2dhdGUodykpIFtbbGlrZWx5XV0geworICAgICAgICAgICAgaWYgKG91dCArIDMgPiBvdXRfZW5kKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnJfb3V0KCk7CisgICAgICAgICAgICAqb3V0KysgPSAoY2hhcikoMHhlMCB8ICgodyA+PiAxMikgJiAweGYpKTsKKyAgICAgICAgICAgICpvdXQrKyA9IChjaGFyKSgweDgwIHwgKCh3ID4+IDYpICYgMHgzZikpOworICAgICAgICAgICAgKm91dCsrID0gKGNoYXIpKDB4ODAgfCAoKHcgPj4gMCkgJiAweDNmKSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvKiBzdXJyb2dhdGUgcGFpciAqLworICAgICAgICBpZiAoaW4gPCBpbl9lbmQgJiYgKHcyID0gKmluLCBpc19zdXJyb2dhdGVfcGFpcih3LCB3MikpKSB7CisgICAgICAgICAgICBpZiAob3V0ICsgNCA+IG91dF9lbmQpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycl9vdXQoKTsKKyAgICAgICAgICAgIGNoYXIzMl90IGR3ID0gKGNoYXIzMl90KSgweDEwMDAwICsgKCh3IC0gMHhkODAwKSA8PCAxMCkgKyAodzIgLSAweGRjMDApKTsKKyAgICAgICAgICAgICpvdXQrKyA9IChjaGFyKSgweGYwIHwgKChkdyA+PiAxOCkgJiAweDA3KSk7CisgICAgICAgICAgICAqb3V0KysgPSAoY2hhcikoMHg4MCB8ICgoZHcgPj4gMTIpICYgMHgzZikpOworICAgICAgICAgICAgKm91dCsrID0gKGNoYXIpKDB4ODAgfCAoKGR3ID4+IDYpICAmIDB4M2YpKTsKKyAgICAgICAgICAgICpvdXQrKyA9IChjaGFyKSgweDgwIHwgKChkdyA+PiAwKSAgJiAweDNmKSk7CisgICAgICAgICAgICBpbisrOworICAgICAgICB9CisgICAgICAgIC8qIFdlIHJlYWNoIGhlcmUgaW4gdHdvIGNhc2VzOgorICAgICAgICAgKiAgMSkgKGluID09IGluX2VuZCksIHdoaWNoIG1lYW5zIGVuZCBvZiB0aGUgaW5wdXQgc3RyaW5nCisgICAgICAgICAqICAyKSAodzIgJiAweGZjMDApICE9IDB4ZGMwMCwgd2hpY2ggbWVhbnMgaW52YWxpZCBzdXJyb2dhdGUgcGFpcgorICAgICAgICAgKiBJbiBlaXRoZXIgY2FzZSwgd2UgaW50ZW50aW9uYWxseSBkbyBub3RoaW5nIGFuZCBza2lwCisgICAgICAgICAqLworICAgIH0KKyAgICAqb3V0ID0gJ1wwJzsKKyAgICByZXR1cm47Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBVVEYtOAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGNoYXIzMl90IHV0ZjhfNGJfdG9fdXRmMzIodWludDhfdCBjMSwgdWludDhfdCBjMiwgdWludDhfdCBjMywgdWludDhfdCBjNCkgeworICAgIHJldHVybiAoKGMxICYgMHgwNykgPDwgMTgpIHwgKChjMiAmIDB4M2YpIDw8IDEyKSB8ICgoYzMgJiAweDNmKSA8PCA2KSB8IChjNCAmIDB4M2YpOworfQorCisvLyBUT0RPOiBjdXJyZW50IGJlaGF2aW9yIG9mIGNvbnZlcnRpbmcgVVRGOCB0byBVVEYtMTYgaGFzIGEgZmV3IGlzc3VlcyBiZWxvdworLy8KKy8vIDEuIGludmFsaWQgdHJhaWxpbmcgYnl0ZXMgKGkuZS4gbm90IGInMTB4eHh4eHgpIGFyZSB0cmVhdGVkIGFzIHZhbGlkIHRyYWlsaW5nCisvLyAgICBieXRlcyBhbmQgZm9sbG93cyBub3JtYWwgY29udmVyc2lvbiBydWxlcworLy8gMi4gaW52YWxpZCBsZWFkaW5nIGJ5dGUgKGInMTB4eHh4eHgpIGlzIHRyZWF0ZWQgYXMgYSB2YWxpZCBzaW5nbGUgVVRGLTggYnl0ZQorLy8gMy4gaW52YWxpZCBsZWFkaW5nIGJ5dGUgKGInMTExMTF4eHgpIGlzIHRyZWF0ZWQgYXMgYSB2YWxpZCBsZWFkaW5nIGJ5dGUKKy8vICAgIChzYW1lIGFzIGInMTExMTB4eHgpIGZvciBhIDQtYnl0ZSBVVEYtOCBzZXF1ZW5jZQorLy8gNC4gYW4gaW52YWxpZCA0LWJ5dGUgVVRGLTggc2VxdWVuY2UgdGhhdCB0cmFuc2xhdGVzIHRvIGEgY29kZXBvaW50IDwgVSsxMDAwMAorLy8gICAgd2lsbCBiZSBjb252ZXJ0ZWQgYXMgYSB2YWxpZCBVVEYtMTYgY2hhcmFjdGVyCisvLworLy8gV2Uga2VlcCB0aGUgY3VycmVudCBiZWhhdmlvciBhcyBpcyBidXQgd2l0aCB3YXJuaW5ncyBsb2dnZWQsIHNvIGFzIG5vdCB0bworLy8gYnJlYWsgY29tcGF0aWJpbGl0eS4gIEhvd2V2ZXIsIHRoaXMgbmVlZHMgdG8gYmUgYWRkcmVzc2VkIGxhdGVyLgorCitzc2l6ZV90IHV0ZjhfdG9fdXRmMTZfbGVuZ3RoKGNvbnN0IHVpbnQ4X3QqIHU4c3RyLCBzaXplX3QgdThsZW4sIGJvb2wgb3ZlcnJlYWRJc0ZhdGFsKQoreworICAgIGlmICh1OHN0ciA9PSBudWxscHRyKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBpbl9lbmQgPSB1OHN0ciArIHU4bGVuOworICAgIGNvbnN0IHVpbnQ4X3QqIGluID0gdThzdHI7CisgICAgc2l6ZV90IHV0ZjE2X2xlbiA9IDA7CisKKyAgICB3aGlsZSAoaW4gPCBpbl9lbmQpIHsKKyAgICAgICAgdWludDhfdCBjID0gKmluOworICAgICAgICB1dGYxNl9sZW4rKzsKKyAgICAgICAgaWYgKChjICYgMHg4MCkgPT0gMCkgW1tsaWtlbHldXSB7CisgICAgICAgICAgICBpbisrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMgPCAweGMwKSBbW3VubGlrZWx5XV0geworICAgICAgICAgICAgQUxPR1coIkludmFsaWQgVVRGLTggbGVhZGluZyBieXRlOiAweCUwMngiLCBjKTsKKyAgICAgICAgICAgIGluKys7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYyA8IDB4ZTApIFtbbGlrZWx5XV0geworICAgICAgICAgICAgaW4gKz0gMjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChjIDwgMHhmMCkgW1tsaWtlbHldXSB7CisgICAgICAgICAgICBpbiArPSAzOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1aW50OF90IGMyLCBjMywgYzQ7CisgICAgICAgICAgICBpZiAoYyA+PSAweGY4KSBbW3VubGlrZWx5XV0geworICAgICAgICAgICAgICAgIEFMT0dXKCJJbnZhbGlkIFVURi04IGxlYWRpbmcgYnl0ZTogMHglMDJ4IiwgYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjMiA9IGluWzFdOyBjMyA9IGluWzJdOyBjNCA9IGluWzNdOworICAgICAgICAgICAgaWYgKHV0ZjhfNGJfdG9fdXRmMzIoYywgYzIsIGMzLCBjNCkgPj0gMHgxMDAwMCkgeworICAgICAgICAgICAgICAgIHV0ZjE2X2xlbisrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW4gKz0gNDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpbiA9PSBpbl9lbmQpIHsKKyAgICAgICAgcmV0dXJuIHV0ZjE2X2xlbiA8IFNTSVpFX01BWCA/IHV0ZjE2X2xlbiA6IC0xOworICAgIH0KKyAgICBpZiAob3ZlcnJlYWRJc0ZhdGFsKQorICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJBdHRlbXB0IHRvIG92ZXJyZWFkIGNvbXB1dGluZyBsZW5ndGggb2YgdXRmOCBzdHJpbmciKTsKKyAgICByZXR1cm4gLTE7Cit9CisKK2NoYXIxNl90KiB1dGY4X3RvX3V0ZjE2KGNvbnN0IHVpbnQ4X3QqIHU4c3RyLCBzaXplX3QgdThsZW4sIGNoYXIxNl90KiB1MTZzdHIsIHNpemVfdCB1MTZsZW4pIHsKKyAgICAvLyBBIHZhbHVlID4gU1NJWkVfTUFYIGlzIHByb2JhYmx5IGEgbmVnYXRpdmUgdmFsdWUgcmV0dXJuZWQgYXMgYW4gZXJyb3IgYW5kIGNhc3RlZC4KKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHUxNmxlbiA9PSAwIHx8IHUxNmxlbiA+IFNTSVpFX01BWCwgInUxNmxlbiBpcyAlenUiLCB1MTZsZW4pOworICAgIGNoYXIxNl90KiBlbmQgPSB1dGY4X3RvX3V0ZjE2X25vX251bGxfdGVybWluYXRvcih1OHN0ciwgdThsZW4sIHUxNnN0ciwgdTE2bGVuIC0gMSk7CisgICAgKmVuZCA9IDA7CisgICAgcmV0dXJuIGVuZDsKK30KKworY2hhcjE2X3QqIHV0ZjhfdG9fdXRmMTZfbm9fbnVsbF90ZXJtaW5hdG9yKAorICAgICAgICBjb25zdCB1aW50OF90KiBzcmMsIHNpemVfdCBzcmNMZW4sIGNoYXIxNl90KiBkc3QsIHNpemVfdCBkc3RMZW4pIHsKKyAgICBpZiAoc3JjID09IG51bGxwdHIgfHwgc3JjTGVuID09IDAgfHwgZHN0TGVuID09IDApIHsKKyAgICAgICAgcmV0dXJuIGRzdDsKKyAgICB9CisgICAgLy8gQSB2YWx1ZSA+IFNTSVpFX01BWCBpcyBwcm9iYWJseSBhIG5lZ2F0aXZlIHZhbHVlIHJldHVybmVkIGFzIGFuIGVycm9yIGFuZCBjYXN0ZWQuCisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihkc3RMZW4gPiBTU0laRV9NQVgsICJkc3RMZW4gaXMgJXp1IiwgZHN0TGVuKTsKKworICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGluX2VuZCA9IHNyYyArIHNyY0xlbjsKKyAgICBjb25zdCB1aW50OF90KiBpbiA9IHNyYzsKKyAgICBjb25zdCBjaGFyMTZfdCogY29uc3Qgb3V0X2VuZCA9IGRzdCArIGRzdExlbjsKKyAgICBjaGFyMTZfdCogb3V0ID0gZHN0OworICAgIHVpbnQ4X3QgYywgYzIsIGMzLCBjNDsKKyAgICBjaGFyMzJfdCB3OworCisgICAgYXV0byBlcnJfaW4gPSBbJmMsICZvdXRdKCkgeworICAgICAgICBBTE9HVygiVW5lbmRlZCBVVEYtOCBieXRlOiAweCUwMngiLCBjKTsKKyAgICAgICAgcmV0dXJuIG91dDsKKyAgICB9OworCisgICAgd2hpbGUgKGluIDwgaW5fZW5kICYmIG91dCA8IG91dF9lbmQpIHsKKyAgICAgICAgYyA9ICppbisrOworICAgICAgICBpZiAoKGMgJiAweDgwKSA9PSAwKSBbW2xpa2VseV1dIHsKKyAgICAgICAgICAgICpvdXQrKyA9IChjaGFyMTZfdCkoYyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYyA8IDB4YzApIFtbdW5saWtlbHldXSB7CisgICAgICAgICAgICBBTE9HVygiSW52YWxpZCBVVEYtOCBsZWFkaW5nIGJ5dGU6IDB4JTAyeCIsIGMpOworICAgICAgICAgICAgKm91dCsrID0gKGNoYXIxNl90KShjKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChjIDwgMHhlMCkgW1tsaWtlbHldXSB7CisgICAgICAgICAgICBpZiAoaW4gKyAxID4gaW5fZW5kKSBbW3VubGlrZWx5XV0geworICAgICAgICAgICAgICAgIHJldHVybiBlcnJfaW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGMyID0gKmluKys7CisgICAgICAgICAgICAqb3V0KysgPSAoY2hhcjE2X3QpKCgoYyAmIDB4MWYpIDw8IDYpIHwgKGMyICYgMHgzZikpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMgPCAweGYwKSBbW2xpa2VseV1dIHsKKyAgICAgICAgICAgIGlmIChpbiArIDIgPiBpbl9lbmQpIFtbdW5saWtlbHldXSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycl9pbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYzIgPSAqaW4rKzsgYzMgPSAqaW4rKzsKKyAgICAgICAgICAgICpvdXQrKyA9IChjaGFyMTZfdCkoKChjICYgMHgwZikgPDwgMTIpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjMiAmIDB4M2YpIDw8IDYpIHwgKGMzICYgMHgzZikpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaW4gKyAzID4gaW5fZW5kKSBbW3VubGlrZWx5XV0geworICAgICAgICAgICAgICAgIHJldHVybiBlcnJfaW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjID49IDB4ZjgpIFtbdW5saWtlbHldXSB7CisgICAgICAgICAgICAgICAgQUxPR1coIkludmFsaWQgVVRGLTggbGVhZGluZyBieXRlOiAweCUwMngiLCBjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE11bHRpcGxlIFVURjE2IGNoYXJhY3RlcnMgd2l0aCBzdXJyb2dhdGVzCisgICAgICAgICAgICBjMiA9ICppbisrOyBjMyA9ICppbisrOyBjNCA9ICppbisrOworICAgICAgICAgICAgdyA9IHV0ZjhfNGJfdG9fdXRmMzIoYywgYzIsIGMzLCBjNCk7CisgICAgICAgICAgICBpZiAodyA8IDB4MTAwMDApIFtbdW5saWtlbHldXSB7CisgICAgICAgICAgICAgICAgKm91dCsrID0gKGNoYXIxNl90KSh3KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG91dCArIDIgPiBvdXRfZW5kKSBbW3VubGlrZWx5XV0geworICAgICAgICAgICAgICAgICAgICAvLyBPb29wcy4uLi4gbm90IGVub3VnaCByb29tIGZvciB0aGlzIHN1cnJvZ2F0ZSBwYWlyLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqb3V0KysgPSAoY2hhcjE2X3QpKCgodyAtIDB4MTAwMDApID4+IDEwKSArIDB4ZDgwMCk7CisgICAgICAgICAgICAgICAgKm91dCsrID0gKGNoYXIxNl90KSgoKHcgLSAweDEwMDAwKSAmIDB4M2ZmKSArIDB4ZGMwMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gb3V0OworfQorCit9CmRpZmYgLS1naXQgYS9saWJ1dGlscy9Vbmljb2RlX3Rlc3QuY3BwIGIvbGlidXRpbHMvYmluZGVyL1VuaWNvZGVfdGVzdC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYnV0aWxzL1VuaWNvZGVfdGVzdC5jcHAKcmVuYW1lIHRvIGxpYnV0aWxzL2JpbmRlci9Vbmljb2RlX3Rlc3QuY3BwCmRpZmYgLS1naXQgYS9saWJ1dGlscy9WZWN0b3JJbXBsLmNwcCBiL2xpYnV0aWxzL2JpbmRlci9WZWN0b3JJbXBsLmNwcApzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBsaWJ1dGlscy9WZWN0b3JJbXBsLmNwcApyZW5hbWUgdG8gbGlidXRpbHMvYmluZGVyL1ZlY3RvckltcGwuY3BwCmluZGV4IGQ5NTFiOGIuLmE2MjY2NGYgMTAwNjQ0Ci0tLSBhL2xpYnV0aWxzL1ZlY3RvckltcGwuY3BwCisrKyBiL2xpYnV0aWxzL2JpbmRlci9WZWN0b3JJbXBsLmNwcApAQCAtNDYzLDcgKzQ2Myw4IEBACiAgICAgc2l6ZV90IG5ld19zaXplOwogICAgIExPR19BTFdBWVNfRkFUQUxfSUYoX19idWlsdGluX3N1Yl9vdmVyZmxvdyhtQ291bnQsIGFtb3VudCwgJm5ld19zaXplKSk7CiAKLSAgICBpZiAobmV3X3NpemUgPCAoY2FwYWNpdHkoKSAvIDIpKSB7CisgICAgY29uc3Qgc2l6ZV90IHByZXZfY2FwYWNpdHkgPSBjYXBhY2l0eSgpOworICAgIGlmIChuZXdfc2l6ZSA8IChwcmV2X2NhcGFjaXR5IC8gMikgJiYgcHJldl9jYXBhY2l0eSA+IGtNaW5WZWN0b3JDYXBhY2l0eSkgewogICAgICAgICAvLyBOT1RFOiAobmV3X3NpemUgKiAyKSBpcyBzYWZlIGJlY2F1c2UgY2FwYWNpdHkgZGlkbid0IG92ZXJmbG93IGFuZAogICAgICAgICAvLyBuZXdfc2l6ZSA8IChjYXBhY2l0eSAvIDIpKS4KICAgICAgICAgY29uc3Qgc2l6ZV90IG5ld19jYXBhY2l0eSA9IG1heChrTWluVmVjdG9yQ2FwYWNpdHksIG5ld19zaXplICogMik7CmRpZmYgLS1naXQgYS9saWJ1dGlscy9WZWN0b3JfYmVuY2htYXJrLmNwcCBiL2xpYnV0aWxzL2JpbmRlci9WZWN0b3JfYmVuY2htYXJrLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGlidXRpbHMvVmVjdG9yX2JlbmNobWFyay5jcHAKcmVuYW1lIHRvIGxpYnV0aWxzL2JpbmRlci9WZWN0b3JfYmVuY2htYXJrLmNwcApkaWZmIC0tZ2l0IGEvbGlidXRpbHMvYmluZGVyL1ZlY3Rvcl9mdXp6LmNwcCBiL2xpYnV0aWxzL2JpbmRlci9WZWN0b3JfZnV6ei5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NlZjQ4NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnV0aWxzL2JpbmRlci9WZWN0b3JfZnV6ei5jcHAKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKK3VzaW5nIGFuZHJvaWQ6OlZlY3RvcjsKKworc3RhdGljIGNvbnN0ZXhwciB1aW50MTZfdCBNQVhfVkVDX1NJWkUgPSAxMDA7CitzdGF0aWMgY29uc3RleHByIGJvb2wga0xvZyA9IGZhbHNlOworCitzdHJ1Y3QgTm9uVHJpdmlhbERlc3RydWN0b3IgeworICAgIE5vblRyaXZpYWxEZXN0cnVjdG9yKCkgOiBtSW5pdCgxKSB7fQorICAgIH5Ob25Ucml2aWFsRGVzdHJ1Y3RvcigpIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtSW5pdCAhPSAxLCAibUluaXQgc2hvdWxkIGJlIDEsIGJ1dCBpdCdzOiAlZCIsIG1Jbml0KTsKKyAgICAgICAgbUluaXQtLTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtSW5pdCAhPSAwLCAibUluaXQgc2hvdWxkIGJlIDAsIGJ1dCBpdCdzOiAlZCIsIG1Jbml0KTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB1aW50OF90IG1Jbml0OworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgVmVjdG9yRnV6emVyRGF0YSB7CisgICAgVmVjdG9yPFQ+IHZlY3RvcjsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OmZ1bmN0aW9uPHZvaWQoRnV6emVkRGF0YVByb3ZpZGVyJiwgVmVjdG9yPFQ+Jik+PiBmdW5jcyA9IHsKKyAgICAgICAgICAgIFsmXShGdXp6ZWREYXRhUHJvdmlkZXImIHByb3ZpZGVyLCBWZWN0b3I8VD4mIHZlY3RvcikgeworICAgICAgICAgICAgICAgICh2b2lkKXByb3ZpZGVyOworICAgICAgICAgICAgICAgIC8vIG9wZXJhdG9yPSBWZWN0b3I8VFlQRT4sIHN0aWxsIG5lZWRzIGZvciBTb3J0ZWRWZWN0b3IKKyAgICAgICAgICAgICAgICBpZiAoa0xvZykgQUxPR0koIm9wZXJhdG9yPSIpOworICAgICAgICAgICAgICAgIHZlY3RvciA9IHRlc3RWZWN0b3IocHJvdmlkZXIpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIFsmXShGdXp6ZWREYXRhUHJvdmlkZXImIHByb3ZpZGVyLCBWZWN0b3I8VD4mIHZlY3RvcikgeworICAgICAgICAgICAgICAgICh2b2lkKXByb3ZpZGVyOworICAgICAgICAgICAgICAgIGlmIChrTG9nKSBBTE9HSSgiY2xlYXIiKTsKKyAgICAgICAgICAgICAgICB2ZWN0b3IuY2xlYXIoKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBbJl0oRnV6emVkRGF0YVByb3ZpZGVyJiBwcm92aWRlciwgVmVjdG9yPFQ+JiB2ZWN0b3IpIHsKKyAgICAgICAgICAgICAgICAodm9pZClwcm92aWRlcjsKKyAgICAgICAgICAgICAgICBpZiAoa0xvZykgQUxPR0koInNpemUiKTsKKyAgICAgICAgICAgICAgICB2ZWN0b3Iuc2l6ZSgpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIFsmXShGdXp6ZWREYXRhUHJvdmlkZXImIHByb3ZpZGVyLCBWZWN0b3I8VD4mIHZlY3RvcikgeworICAgICAgICAgICAgICAgICh2b2lkKXByb3ZpZGVyOworICAgICAgICAgICAgICAgIGlmIChrTG9nKSBBTE9HSSgiaXNFbXB0eSIpOworICAgICAgICAgICAgICAgIHZlY3Rvci5pc0VtcHR5KCk7CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgWyZdKEZ1enplZERhdGFQcm92aWRlciYgcHJvdmlkZXIsIFZlY3RvcjxUPiYgdmVjdG9yKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpcHJvdmlkZXI7CisgICAgICAgICAgICAgICAgaWYgKGtMb2cpIEFMT0dJKCJjYXBhY2l0eSIpOworICAgICAgICAgICAgICAgIHZlY3Rvci5jYXBhY2l0eSgpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIFsmXShGdXp6ZWREYXRhUHJvdmlkZXImIHByb3ZpZGVyLCBWZWN0b3I8VD4mIHZlY3RvcikgeworICAgICAgICAgICAgICAgIHNpemVfdCB2ZWN0b3JTaXplID0gcHJvdmlkZXIuQ29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIE1BWF9WRUNfU0laRSk7CisgICAgICAgICAgICAgICAgaWYgKGtMb2cpIEFMT0dJKCJzZXRDYXBhY2l0eSIpOworICAgICAgICAgICAgICAgIHZlY3Rvci5zZXRDYXBhY2l0eSh2ZWN0b3JTaXplKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBbJl0oRnV6emVkRGF0YVByb3ZpZGVyJiBwcm92aWRlciwgVmVjdG9yPFQ+JiB2ZWN0b3IpIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgdmVjdG9yU2l6ZSA9IHByb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCBNQVhfVkVDX1NJWkUpOworICAgICAgICAgICAgICAgIGlmIChrTG9nKSBBTE9HSSgicmVzaXplIik7CisgICAgICAgICAgICAgICAgdmVjdG9yLnJlc2l6ZSh2ZWN0b3JTaXplKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBbJl0oRnV6emVkRGF0YVByb3ZpZGVyJiBwcm92aWRlciwgVmVjdG9yPFQ+JiB2ZWN0b3IpIHsKKyAgICAgICAgICAgICAgICAodm9pZClwcm92aWRlcjsKKyAgICAgICAgICAgICAgICBpZiAoa0xvZykgQUxPR0koImFycmF5Iik7CisgICAgICAgICAgICAgICAgdmVjdG9yLmFycmF5KCk7CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgWyZdKEZ1enplZERhdGFQcm92aWRlciYgcHJvdmlkZXIsIFZlY3RvcjxUPiYgdmVjdG9yKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpcHJvdmlkZXI7CisgICAgICAgICAgICAgICAgaWYgKGtMb2cpIEFMT0dJKCJlZGl0QXJyYXkiKTsKKyAgICAgICAgICAgICAgICB2ZWN0b3IuZWRpdEFycmF5KCk7CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgWyZdKEZ1enplZERhdGFQcm92aWRlciYgcHJvdmlkZXIsIFZlY3RvcjxUPiYgdmVjdG9yKSB7CisgICAgICAgICAgICAgICAgaWYgKHZlY3Rvci5zaXplKCkgPT0gMCkgcmV0dXJuOworICAgICAgICAgICAgICAgIHNpemVfdCBpZHggPSBwcm92aWRlci5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwgdmVjdG9yLnNpemUoKSAtIDEpOworICAgICAgICAgICAgICAgIGlmIChrTG9nKSBBTE9HSSgib3BlcmF0b3JbXSIpOworICAgICAgICAgICAgICAgIHZlY3RvcltpZHhdOyAgLy8gcmV0dXJucyBhIGNvbnN0IHZhbHVlIGZvciBWZWN0b3IKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBbJl0oRnV6emVkRGF0YVByb3ZpZGVyJiBwcm92aWRlciwgVmVjdG9yPFQ+JiB2ZWN0b3IpIHsKKyAgICAgICAgICAgICAgICBpZiAodmVjdG9yLnNpemUoKSA9PSAwKSByZXR1cm47CisgICAgICAgICAgICAgICAgc2l6ZV90IGlkeCA9IHByb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCB2ZWN0b3Iuc2l6ZSgpIC0gMSk7CisgICAgICAgICAgICAgICAgaWYgKGtMb2cpIEFMT0dJKCJpdGVtQXQiKTsKKyAgICAgICAgICAgICAgICB2ZWN0b3IuaXRlbUF0KGlkeCk7CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgWyZdKEZ1enplZERhdGFQcm92aWRlciYgcHJvdmlkZXIsIFZlY3RvcjxUPiYgdmVjdG9yKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpcHJvdmlkZXI7CisgICAgICAgICAgICAgICAgaWYgKHZlY3Rvci5zaXplKCkgPT0gMCkgcmV0dXJuOworICAgICAgICAgICAgICAgIGlmIChrTG9nKSBBTE9HSSgidG9wIik7CisgICAgICAgICAgICAgICAgdmVjdG9yLnRvcCgpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIFsmXShGdXp6ZWREYXRhUHJvdmlkZXImIHByb3ZpZGVyLCBWZWN0b3I8VD4mIHZlY3RvcikgeworICAgICAgICAgICAgICAgIGlmICh2ZWN0b3Iuc2l6ZSgpID09IDApIHJldHVybjsKKyAgICAgICAgICAgICAgICBzaXplX3QgaWR4ID0gcHJvdmlkZXIuQ29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIHZlY3Rvci5zaXplKCkgLSAxKTsKKyAgICAgICAgICAgICAgICBpZiAoa0xvZykgQUxPR0koImVkaXRJdGVtQXQiKTsKKyAgICAgICAgICAgICAgICB2ZWN0b3IuZWRpdEl0ZW1BdChpZHgpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIFsmXShGdXp6ZWREYXRhUHJvdmlkZXImIHByb3ZpZGVyLCBWZWN0b3I8VD4mIHZlY3RvcikgeworICAgICAgICAgICAgICAgICh2b2lkKXByb3ZpZGVyOworICAgICAgICAgICAgICAgIGlmICh2ZWN0b3Iuc2l6ZSgpID09IDApIHJldHVybjsKKyAgICAgICAgICAgICAgICBpZiAoa0xvZykgQUxPR0koImVkaXRUb3AiKTsKKyAgICAgICAgICAgICAgICB2ZWN0b3IuZWRpdFRvcCgpID0gVHt9OworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIFsmXShGdXp6ZWREYXRhUHJvdmlkZXImIHByb3ZpZGVyLCBWZWN0b3I8VD4mIHZlY3RvcikgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaWR4ID0gcHJvdmlkZXIuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50OF90PigwLCB2ZWN0b3Iuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBWZWN0b3IgdmVjMiA9IHRlc3RWZWN0b3IocHJvdmlkZXIpOworICAgICAgICAgICAgICAgIGlmICh2ZWMyLnNpemUoKSA9PSAwKSByZXR1cm47ICAvLyBUT0RPOiBtYXliZSB3ZSBzaG91bGQgc3VwcG9ydCB0aGlzPworICAgICAgICAgICAgICAgIGlmIChrTG9nKSBBTE9HSSgiaW5zZXJ0VmVjdG9yQXQgJWQgb2Ygc2l6ZSAlenUiLCBpZHgsIHZlYzIuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICB2ZWN0b3IuaW5zZXJ0VmVjdG9yQXQodmVjMiwgaWR4KTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBbJl0oRnV6emVkRGF0YVByb3ZpZGVyJiBwcm92aWRlciwgVmVjdG9yPFQ+JiB2ZWN0b3IpIHsKKyAgICAgICAgICAgICAgICBpZiAoa0xvZykgQUxPR0koImFwcGVuZFZlY3RvciIpOworICAgICAgICAgICAgICAgIHZlY3Rvci5hcHBlbmRWZWN0b3IodGVzdFZlY3Rvcihwcm92aWRlcikpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIC8vIFRPRE86IGluc2VydEFycmF5QXQKKyAgICAgICAgICAgIC8vIFRPRE86IGFwcGVuZEFycmF5CisgICAgICAgICAgICBbJl0oRnV6emVkRGF0YVByb3ZpZGVyJiBwcm92aWRlciwgVmVjdG9yPFQ+JiB2ZWN0b3IpIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGlkeCA9IHByb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDhfdD4oMCwgdmVjdG9yLnNpemUoKSk7CisgICAgICAgICAgICAgICAgdWludDhfdCBudW1JdGVtcyA9IHByb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDhfdD4oMSwgMTAwKTsKKyAgICAgICAgICAgICAgICBpZiAoa0xvZykgQUxPR0koImluc2VydEF0Iik7CisgICAgICAgICAgICAgICAgdmVjdG9yLmluc2VydEF0KGlkeCwgbnVtSXRlbXMpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIFsmXShGdXp6ZWREYXRhUHJvdmlkZXImIHByb3ZpZGVyLCBWZWN0b3I8VD4mIHZlY3RvcikgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaWR4ID0gcHJvdmlkZXIuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50OF90PigwLCB2ZWN0b3Iuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICB1aW50OF90IG51bUl0ZW1zID0gcHJvdmlkZXIuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50OF90PigxLCAxMDApOworICAgICAgICAgICAgICAgIGlmIChrTG9nKSBBTE9HSSgiaW5zZXJ0QXQiKTsKKyAgICAgICAgICAgICAgICB2ZWN0b3IuaW5zZXJ0QXQoVHt9LCBpZHgsIG51bUl0ZW1zKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBbJl0oRnV6emVkRGF0YVByb3ZpZGVyJiBwcm92aWRlciwgVmVjdG9yPFQ+JiB2ZWN0b3IpIHsKKyAgICAgICAgICAgICAgICAodm9pZClwcm92aWRlcjsKKyAgICAgICAgICAgICAgICBpZiAodmVjdG9yLnNpemUoKSA9PSAwKSByZXR1cm47CisgICAgICAgICAgICAgICAgaWYgKGtMb2cpIEFMT0dJKCJwb3AiKTsKKyAgICAgICAgICAgICAgICB2ZWN0b3IucG9wKCk7CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgWyZdKEZ1enplZERhdGFQcm92aWRlciYgcHJvdmlkZXIsIFZlY3RvcjxUPiYgdmVjdG9yKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpcHJvdmlkZXI7CisgICAgICAgICAgICAgICAgaWYgKGtMb2cpIEFMT0dJKCJwdXNoIik7CisgICAgICAgICAgICAgICAgdmVjdG9yLnB1c2goKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBbJl0oRnV6emVkRGF0YVByb3ZpZGVyJiBwcm92aWRlciwgVmVjdG9yPFQ+JiB2ZWN0b3IpIHsKKyAgICAgICAgICAgICAgICAodm9pZClwcm92aWRlcjsKKyAgICAgICAgICAgICAgICBpZiAoa0xvZykgQUxPR0koImFkZCIpOworICAgICAgICAgICAgICAgIHZlY3Rvci5hZGQoKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBbJl0oRnV6emVkRGF0YVByb3ZpZGVyJiBwcm92aWRlciwgVmVjdG9yPFQ+JiB2ZWN0b3IpIHsKKyAgICAgICAgICAgICAgICAodm9pZClwcm92aWRlcjsKKyAgICAgICAgICAgICAgICBpZiAoa0xvZykgQUxPR0koImFkZCIpOworICAgICAgICAgICAgICAgIHZlY3Rvci5hZGQoVHt9KTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBbJl0oRnV6emVkRGF0YVByb3ZpZGVyJiBwcm92aWRlciwgVmVjdG9yPFQ+JiB2ZWN0b3IpIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGlkeCA9IHByb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDhfdD4oMCwgdmVjdG9yLnNpemUoKSAtIDEpOworICAgICAgICAgICAgICAgIGlmIChrTG9nKSBBTE9HSSgicmVwbGFjZUF0Iik7CisgICAgICAgICAgICAgICAgdmVjdG9yLnJlcGxhY2VBdChpZHgpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIFsmXShGdXp6ZWREYXRhUHJvdmlkZXImIHByb3ZpZGVyLCBWZWN0b3I8VD4mIHZlY3RvcikgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaWR4ID0gcHJvdmlkZXIuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50OF90PigwLCB2ZWN0b3Iuc2l6ZSgpIC0gMSk7CisgICAgICAgICAgICAgICAgaWYgKGtMb2cpIEFMT0dJKCJyZXBsYWNlQXQiKTsKKyAgICAgICAgICAgICAgICB2ZWN0b3IucmVwbGFjZUF0KFR7fSwgaWR4KTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBbJl0oRnV6emVkRGF0YVByb3ZpZGVyJiBwcm92aWRlciwgVmVjdG9yPFQ+JiB2ZWN0b3IpIHsKKyAgICAgICAgICAgICAgICBpZiAodmVjdG9yLnNpemUoKSA9PSAwKSByZXR1cm47CisgICAgICAgICAgICAgICAgdWludDhfdCBpZHggPSBwcm92aWRlci5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQ4X3Q+KDAsIHZlY3Rvci5zaXplKCkgLSAxKTsKKyAgICAgICAgICAgICAgICBpZiAoa0xvZykgQUxPR0koInJlbW90ZUl0ZW1zQXQiKTsKKyAgICAgICAgICAgICAgICB2ZWN0b3IucmVtb3ZlSXRlbXNBdChpZHgpOyAgLy8gVE9ETzogZGlmZmVyZW50IGNvdW50CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgLy8gcmVtb3ZlQXQgaXMgYWxpYXMgZm9yIHJlbW92ZUl0ZW1zQXQKKyAgICAgICAgICAgIC8vIFRPRE86IHNvcnQKKyAgICAgICAgICAgIFsmXShGdXp6ZWREYXRhUHJvdmlkZXImIHByb3ZpZGVyLCBWZWN0b3I8VD4mIHZlY3RvcikgeworICAgICAgICAgICAgICAgICh2b2lkKXByb3ZpZGVyOworICAgICAgICAgICAgICAgIGlmIChrTG9nKSBBTE9HSSgiZ2V0SXRlbVNpemUiKTsKKyAgICAgICAgICAgICAgICB2ZWN0b3IuZ2V0SXRlbVNpemUoKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAvLyBUT0RPOiBpdGVyYXRvcnMKKyAgICB9OworCisgICAgVmVjdG9yPFQ+IHRlc3RWZWN0b3IoRnV6emVkRGF0YVByb3ZpZGVyJiBwcm92aWRlcikgeworICAgICAgICBWZWN0b3I8VD4gdmVjOworICAgICAgICBzaXplX3QgdmVjdG9yU2l6ZSA9IHByb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCBNQVhfVkVDX1NJWkUpOworICAgICAgICByZXR1cm4gdmVjOworICAgIH0KKworICAgIHZvaWQgZnV6eihGdXp6ZWREYXRhUHJvdmlkZXImJiBwcm92aWRlcikgeworICAgICAgICB3aGlsZSAocHJvdmlkZXIucmVtYWluaW5nX2J5dGVzKCkpIHsKKyAgICAgICAgICAgIHNpemVfdCBmdW5jSWR4ID0gcHJvdmlkZXIuQ29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIGZ1bmNzLnNpemUoKSAtIDEpOworICAgICAgICAgICAgZnVuY3NbZnVuY0lkeF0ocHJvdmlkZXIsIHZlY3Rvcik7CisgICAgICAgIH0KKyAgICB9Cit9OworCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgRnV6emVkRGF0YVByb3ZpZGVyIHByb3ZpZGVyKGRhdGEsIHNpemUpOworCisgICAgcHJvdmlkZXIuUGlja1ZhbHVlSW5BcnJheTxzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4+KHsKKyAgICAgICAgICAgIFsmXSgpIHsgVmVjdG9yRnV6emVyRGF0YTx1aW50OF90PigpLmZ1enooc3RkOjptb3ZlKHByb3ZpZGVyKSk7IH0sCisgICAgICAgICAgICBbJl0oKSB7IFZlY3RvckZ1enplckRhdGE8aW50MzJfdD4oKS5mdXp6KHN0ZDo6bW92ZShwcm92aWRlcikpOyB9LAorICAgICAgICAgICAgWyZdKCkgeyBWZWN0b3JGdXp6ZXJEYXRhPE5vblRyaXZpYWxEZXN0cnVjdG9yPigpLmZ1enooc3RkOjptb3ZlKHByb3ZpZGVyKSk7IH0sCisgICAgfSkoKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGlidXRpbHMvVmVjdG9yX3Rlc3QuY3BwIGIvbGlidXRpbHMvYmluZGVyL1ZlY3Rvcl90ZXN0LmNwcApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBsaWJ1dGlscy9WZWN0b3JfdGVzdC5jcHAKcmVuYW1lIHRvIGxpYnV0aWxzL2JpbmRlci9WZWN0b3JfdGVzdC5jcHAKaW5kZXggNmQ5MGVhYS4uMzEyZGNmNiAxMDA2NDQKLS0tIGEvbGlidXRpbHMvVmVjdG9yX3Rlc3QuY3BwCisrKyBiL2xpYnV0aWxzL2JpbmRlci9WZWN0b3JfdGVzdC5jcHAKQEAgLTE2LDcgKzE2LDYgQEAKIAogI2RlZmluZSBMT0dfVEFHICJWZWN0b3JfdGVzdCIKIAotI2RlZmluZSBfX1NURENfTElNSVRfTUFDUk9TCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKZGlmZiAtLWdpdCBhL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvRXJyb3JzLmggYi9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9FcnJvcnMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGlidXRpbHMvaW5jbHVkZS91dGlscy9FcnJvcnMuaApyZW5hbWUgdG8gbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvRXJyb3JzLmgKZGlmZiAtLWdpdCBhL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTGlnaHRSZWZCYXNlLmggYi9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9MaWdodFJlZkJhc2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGlidXRpbHMvaW5jbHVkZS91dGlscy9MaWdodFJlZkJhc2UuaApyZW5hbWUgdG8gbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvTGlnaHRSZWZCYXNlLmgKZGlmZiAtLWdpdCBhL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIGIvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIGxpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oCnJlbmFtZSB0byBsaWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgKaW5kZXggNWUzZmE3ZC4uYjZhODcwNyAxMDA2NDQKLS0tIGEvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgKKysrIGIvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oCkBAIC00MDQsNyArNDA0LDcgQEAKIHB1YmxpYzoKICAgICB0eXBlZGVmIHR5cGVuYW1lIFJlZkJhc2U6OndlYWtyZWZfdHlwZSB3ZWFrcmVmX3R5cGU7CiAKLSAgICBpbmxpbmUgd3AoKSA6IG1fcHRyKG51bGxwdHIpLCBtX3JlZnMobnVsbHB0cikgeyB9CisgICAgaW5saW5lIGNvbnN0ZXhwciB3cCgpIDogbV9wdHIobnVsbHB0ciksIG1fcmVmcyhudWxscHRyKSB7IH0KIAogICAgIC8vIGlmIG51bGxwdHIsIHJldHVybnMgbnVsbHB0cgogICAgIC8vCkBAIC01NTUsNyArNTU1LDcgQEAKIHdwPFQ+Ojp3cChUKiBvdGhlcikKICAgICA6IG1fcHRyKG90aGVyKQogewotICAgIG1fcmVmcyA9IG90aGVyID8gbV9yZWZzID0gb3RoZXItPmNyZWF0ZVdlYWsodGhpcykgOiBudWxscHRyOworICAgIG1fcmVmcyA9IG90aGVyID8gb3RoZXItPmNyZWF0ZVdlYWsodGhpcykgOiBudWxscHRyOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KQEAgLTY2Miw4ICs2NjIsNyBAQAogdGVtcGxhdGU8dHlwZW5hbWUgVD4gdGVtcGxhdGU8dHlwZW5hbWUgVT4KIHdwPFQ+JiB3cDxUPjo6b3BlcmF0b3IgPSAoY29uc3Qgc3A8VT4mIG90aGVyKQogewotICAgIHdlYWtyZWZfdHlwZSogbmV3UmVmcyA9Ci0gICAgICAgIG90aGVyICE9IG51bGxwdHIgPyBvdGhlci0+Y3JlYXRlV2Vhayh0aGlzKSA6IDA7CisgICAgd2Vha3JlZl90eXBlKiBuZXdSZWZzID0gb3RoZXIgIT0gbnVsbHB0ciA/IG90aGVyLT5jcmVhdGVXZWFrKHRoaXMpIDogbnVsbHB0cjsKICAgICBVKiBvdGhlclB0cihvdGhlci5tX3B0cik7CiAgICAgaWYgKG1fcHRyKSBtX3JlZnMtPmRlY1dlYWsodGhpcyk7CiAgICAgbV9wdHIgPSBvdGhlclB0cjsKQEAgLTY5NSw4ICs2OTQsOCBAQAogewogICAgIGlmIChtX3B0cikgewogICAgICAgICBtX3JlZnMtPmRlY1dlYWsodGhpcyk7Ci0gICAgICAgIG1fcmVmcyA9IDA7Ci0gICAgICAgIG1fcHRyID0gMDsKKyAgICAgICAgbV9yZWZzID0gbnVsbHB0cjsKKyAgICAgICAgbV9wdHIgPSBudWxscHRyOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oIGIvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaApzaW1pbGFyaXR5IGluZGV4IDgzJQpyZW5hbWUgZnJvbSBsaWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgKcmVuYW1lIHRvIGxpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgKaW5kZXggM2VmNTZhMy4uODY3ZGJhYyAxMDA2NDQKLS0tIGEvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oCisrKyBiL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgKQEAgLTI0LDYgKzI0LDE1IEBACiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL1R5cGVIZWxwZXJzLmg+CiAKKyNpZiBfX2hhc19pbmNsdWRlKDxzdHJpbmdfdmlldz4pCisjaW5jbHVkZSA8c3RyaW5nX3ZpZXc+CisjZGVmaW5lIEhBU19TVFJJTkdfVklFVworI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDIwMDJMCisjaW5jbHVkZSA8Y29tcGFyZT4KKyNlbmRpZgorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNTMsMTIgKzYyLDEzIEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgflN0cmluZzE2KCk7CiAKLSAgICBpbmxpbmUgIGNvbnN0IGNoYXIxNl90KiAgICAgc3RyaW5nKCkgY29uc3Q7CisgICAgaW5saW5lICBjb25zdCBjaGFyMTZfdCogICAgIGNfc3RyKCkgY29uc3Q7CiAKLXByaXZhdGU6Ci0gICAgc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyAgIHN0ZF9zdHJpbmcoY29uc3QgU3RyaW5nMTYmIHN0cik7Ci1wdWJsaWM6CiAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgIHNpemUoKSBjb25zdDsKKyAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICAgICAgZW1wdHkoKSBjb25zdDsKKworICAgIGlubGluZSAgc2l6ZV90ICAgICAgICAgICAgICBsZW5ndGgoKSBjb25zdDsKKwogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBzZXRUbyhjb25zdCBTdHJpbmcxNiYgb3RoZXIpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICBzZXRUbyhjb25zdCBjaGFyMTZfdCogb3RoZXIpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICBzZXRUbyhjb25zdCBjaGFyMTZfdCogb3RoZXIsIHNpemVfdCBsZW4pOwpAQCAtODYsNiArOTYsNyBAQAogICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICBzdGFydHNXaXRoKGNvbnN0IGNoYXIxNl90KiBwcmVmaXgpIGNvbnN0OwogCiAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgIGNvbnRhaW5zKGNvbnN0IGNoYXIxNl90KiBjaHJzKSBjb25zdDsKKyAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICAgICAgY29udGFpbnMoY29uc3QgU3RyaW5nMTYmIG90aGVyKSBjb25zdDsKIAogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICByZXBsYWNlQWxsKGNoYXIxNl90IHJlcGxhY2VUaGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIxNl90IHdpdGhUaGlzKTsKQEAgLTk4LDYgKzEwOSw5IEBACiAgICAgaW5saW5lICBib29sICAgICAgICAgICAgICAgIG9wZXJhdG9yIT0oY29uc3QgU3RyaW5nMTYmIG90aGVyKSBjb25zdDsKICAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICAgICAgb3BlcmF0b3I+PShjb25zdCBTdHJpbmcxNiYgb3RoZXIpIGNvbnN0OwogICAgIGlubGluZSAgYm9vbCAgICAgICAgICAgICAgICBvcGVyYXRvcj4oY29uc3QgU3RyaW5nMTYmIG90aGVyKSBjb25zdDsKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDIwMDJMCisgICAgaW5saW5lIHN0ZDo6c3Ryb25nX29yZGVyaW5nIG9wZXJhdG9yPD0+KGNvbnN0IFN0cmluZzE2JiBvdGhlcikgY29uc3Q7CisjZW5kaWYKIAogICAgIGlubGluZSAgYm9vbCAgICAgICAgICAgICAgICBvcGVyYXRvcjwoY29uc3QgY2hhcjE2X3QqIG90aGVyKSBjb25zdDsKICAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICAgICAgb3BlcmF0b3I8PShjb25zdCBjaGFyMTZfdCogb3RoZXIpIGNvbnN0OwpAQCAtMTA1LDkgKzExOSwxOCBAQAogICAgIGlubGluZSAgYm9vbCAgICAgICAgICAgICAgICBvcGVyYXRvciE9KGNvbnN0IGNoYXIxNl90KiBvdGhlcikgY29uc3Q7CiAgICAgaW5saW5lICBib29sICAgICAgICAgICAgICAgIG9wZXJhdG9yPj0oY29uc3QgY2hhcjE2X3QqIG90aGVyKSBjb25zdDsKICAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICAgICAgb3BlcmF0b3I+KGNvbnN0IGNoYXIxNl90KiBvdGhlcikgY29uc3Q7CisjaWYgX19jcGx1c3BsdXMgPj0gMjAyMDAyTAorICAgIGlubGluZSBzdGQ6OnN0cm9uZ19vcmRlcmluZyBvcGVyYXRvcjw9Pihjb25zdCBjaGFyMTZfdCogb3RoZXIpIGNvbnN0OworI2VuZGlmCiAKICAgICBpbmxpbmUgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgY29uc3QgY2hhcjE2X3QqKCkgY29uc3Q7CiAKKyNpZmRlZiBIQVNfU1RSSU5HX1ZJRVcKKyAgICAvLyBJbXBsaWNpdCBjYXN0IHRvIHN0ZDo6dTE2c3RyaW5nIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiBwdXJwb3NlIC0gdTE2c3RyaW5nX3ZpZXcgaXMgbXVjaAorICAgIC8vIGxpZ2h0ZXIgYW5kIGlmIG9uZSBuZWVkcywgdGhleSBjYW4gc3RpbGwgY3JlYXRlIHUxNnN0cmluZyBmcm9tIHUxNnN0cmluZ192aWV3LgorICAgIGlubGluZSAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciBzdGQ6OnUxNnN0cmluZ192aWV3KCkgY29uc3Q7CisjZW5kaWYKKwogICAgIC8vIFN0YXRpYyBhbmQgbm9uLXN0YXRpYyBTdHJpbmcxNiBiZWhhdmUgdGhlIHNhbWUgZm9yIHRoZSB1c2Vycywgc28KICAgICAvLyB0aGlzIG1ldGhvZCBpc24ndCBvZiBtdWNoIHVzZSBmb3IgdGhlIHVzZXJzLiBJdCBpcyBwdWJsaWMgZm9yIHRlc3RpbmcuCiAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgIGlzU3RhdGljU3RyaW5nKCkgY29uc3Q7CkBAIC0xNzQsNiArMTk3LDE0IEBACiAKICAgICB0ZW1wbGF0ZSA8c2l6ZV90IE4+CiAgICAgZXhwbGljaXQgY29uc3RleHByIFN0cmluZzE2KGNvbnN0IFN0YXRpY0RhdGE8Tj4mIHMpIDogbVN0cmluZyhzLmRhdGEpIHt9CisKKy8vIFRoZXNlIHN5bWJvbHMgYXJlIGZvciBwb3RlbnRpYWwgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIHByZWJ1aWx0cy4gVG8gYmUgcmVtb3ZlZC4KKyNpZmRlZiBFTkFCTEVfU1RSSU5HMTZfT0JTT0xFVEVfTUVUSE9EUworcHVibGljOgorI2Vsc2UKK3ByaXZhdGU6CisjZW5kaWYKKyAgICBpbmxpbmUgIGNvbnN0IGNoYXIxNl90KiAgICAgc3RyaW5nKCkgY29uc3Q7CiB9OwogCiAvLyBTdHJpbmcxNiBjYW4gYmUgdHJpdmlhbGx5IG1vdmVkIHVzaW5nIG1lbWNweSgpIGJlY2F1c2UgbW92aW5nIGRvZXMgbm90CkBAIC0yMzQsMTQgKzI2NSwyOSBAQAogICAgIHJldHVybiBjb21wYXJlX3R5cGUobGhzLCByaHMpIDwgMDsKIH0KIAoraW5saW5lIGNvbnN0IGNoYXIxNl90KiBTdHJpbmcxNjo6Y19zdHIoKSBjb25zdAoreworICAgIHJldHVybiBtU3RyaW5nOworfQorCiBpbmxpbmUgY29uc3QgY2hhcjE2X3QqIFN0cmluZzE2OjpzdHJpbmcoKSBjb25zdAogewogICAgIHJldHVybiBtU3RyaW5nOwogfQogCi1pbmxpbmUgc3RkOjpzdHJpbmcgU3RyaW5nMTY6OnN0ZF9zdHJpbmcoY29uc3QgU3RyaW5nMTYmIHN0cikKK2lubGluZSBib29sIFN0cmluZzE2OjplbXB0eSgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIHN0ZDo6c3RyaW5nKFN0cmluZzgoc3RyKS5zdHJpbmcoKSk7CisgICAgcmV0dXJuIGxlbmd0aCgpID09IDA7Cit9CisKK2lubGluZSBzaXplX3QgU3RyaW5nMTY6Omxlbmd0aCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHNpemUoKTsKK30KKworaW5saW5lIGJvb2wgU3RyaW5nMTY6OmNvbnRhaW5zKGNvbnN0IFN0cmluZzE2JiBvdGhlcikgY29uc3QKK3sKKyAgICByZXR1cm4gY29udGFpbnMob3RoZXIuY19zdHIoKSk7CiB9CiAKIGlubGluZSBTdHJpbmcxNiYgU3RyaW5nMTY6Om9wZXJhdG9yPShjb25zdCBTdHJpbmcxNiYgb3RoZXIpCkBAIC0yOTgsNiArMzQ0LDE5IEBACiAgICAgcmV0dXJuIHN0cnpjbXAxNihtU3RyaW5nLCBzaXplKCksIG90aGVyLm1TdHJpbmcsIG90aGVyLnNpemUoKSkgPiAwOwogfQogCisjaWYgX19jcGx1c3BsdXMgPj0gMjAyMDAyTAoraW5saW5lIHN0ZDo6c3Ryb25nX29yZGVyaW5nIFN0cmluZzE2OjpvcGVyYXRvcjw9Pihjb25zdCBTdHJpbmcxNiYgb3RoZXIpIGNvbnN0IHsKKyAgICBpbnQgcmVzdWx0ID0gc3RyemNtcDE2KG1TdHJpbmcsIHNpemUoKSwgb3RoZXIubVN0cmluZywgb3RoZXIuc2l6ZSgpKTsKKyAgICBpZiAocmVzdWx0ID09IDApIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6c3Ryb25nX29yZGVyaW5nOjplcXVhbDsKKyAgICB9IGVsc2UgaWYgKHJlc3VsdCA8IDApIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6c3Ryb25nX29yZGVyaW5nOjpsZXNzOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBzdGQ6OnN0cm9uZ19vcmRlcmluZzo6Z3JlYXRlcjsKKyAgICB9Cit9CisjZW5kaWYKKwogaW5saW5lIGJvb2wgU3RyaW5nMTY6Om9wZXJhdG9yPChjb25zdCBjaGFyMTZfdCogb3RoZXIpIGNvbnN0CiB7CiAgICAgcmV0dXJuIHN0cmNtcDE2KG1TdHJpbmcsIG90aGVyKSA8IDA7CkBAIC0zMjgsMTMgKzM4NywzMyBAQAogICAgIHJldHVybiBzdHJjbXAxNihtU3RyaW5nLCBvdGhlcikgPiAwOwogfQogCisjaWYgX19jcGx1c3BsdXMgPj0gMjAyMDAyTAoraW5saW5lIHN0ZDo6c3Ryb25nX29yZGVyaW5nIFN0cmluZzE2OjpvcGVyYXRvcjw9Pihjb25zdCBjaGFyMTZfdCogb3RoZXIpIGNvbnN0IHsKKyAgICBpbnQgcmVzdWx0ID0gc3RyY21wMTYobVN0cmluZywgb3RoZXIpOworICAgIGlmIChyZXN1bHQgPT0gMCkgeworICAgICAgICByZXR1cm4gc3RkOjpzdHJvbmdfb3JkZXJpbmc6OmVxdWFsOworICAgIH0gZWxzZSBpZiAocmVzdWx0IDwgMCkgeworICAgICAgICByZXR1cm4gc3RkOjpzdHJvbmdfb3JkZXJpbmc6Omxlc3M7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6c3Ryb25nX29yZGVyaW5nOjpncmVhdGVyOworICAgIH0KK30KKyNlbmRpZgorCiBpbmxpbmUgU3RyaW5nMTY6Om9wZXJhdG9yIGNvbnN0IGNoYXIxNl90KigpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1TdHJpbmc7CiB9CiAKK2lubGluZSBTdHJpbmcxNjo6b3BlcmF0b3Igc3RkOjp1MTZzdHJpbmdfdmlldygpIGNvbnN0Cit7CisgICAgcmV0dXJuIHttU3RyaW5nLCBsZW5ndGgoKX07Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCisjdW5kZWYgSEFTX1NUUklOR19WSUVXCisKICNlbmRpZiAvLyBBTkRST0lEX1NUUklORzE2X0gKZGlmZiAtLWdpdCBhL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oIGIvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oCnNpbWlsYXJpdHkgaW5kZXggNzQlCnJlbmFtZSBmcm9tIGxpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oCnJlbmFtZSB0byBsaWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgKaW5kZXggOGIyZGNmOS4uZTBkNzU4OCAxMDA2NDQKLS0tIGEvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgKKysrIGIvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oCkBAIC0xOCw3ICsxOCw2IEBACiAjZGVmaW5lIEFORFJPSURfU1RSSU5HOF9ICiAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+CiAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9Vbmljb2RlLmg+CkBAIC0yNyw2ICsyNiwyMCBAQAogI2luY2x1ZGUgPHN0cmluZy5oPiAvLyBmb3Igc3RyY21wCiAjaW5jbHVkZSA8c3RkYXJnLmg+CiAKKyNpZiBfX2hhc19pbmNsdWRlKDxzdHJpbmc+KQorI2luY2x1ZGUgPHN0cmluZz4KKyNkZWZpbmUgSEFTX1NUUklORworI2VuZGlmCisKKyNpZiBfX2hhc19pbmNsdWRlKDxzdHJpbmdfdmlldz4pCisjaW5jbHVkZSA8c3RyaW5nX3ZpZXc+CisjZGVmaW5lIEhBU19TVFJJTkdfVklFVworI2VuZGlmCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDIwMDJMCisjaW5jbHVkZSA8Y29tcGFyZT4KKyNlbmRpZgorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNTIsMjEgKzY1LDE0IEBACiAgICAgZXhwbGljaXQgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoY29uc3QgY2hhcjMyX3QqIG8sIHNpemVfdCBudW1DaGFycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5TdHJpbmc4KCk7CiAKLSAgICBzdGF0aWMgaW5saW5lIGNvbnN0IFN0cmluZzggZW1wdHkoKTsKLQogICAgIHN0YXRpYyBTdHJpbmc4ICAgICAgICAgICAgICBmb3JtYXQoY29uc3QgY2hhciogZm10LCAuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpOwogICAgIHN0YXRpYyBTdHJpbmc4ICAgICAgICAgICAgICBmb3JtYXRWKGNvbnN0IGNoYXIqIGZtdCwgdmFfbGlzdCBhcmdzKTsKIAogICAgIGlubGluZSAgY29uc3QgY2hhciogICAgICAgICBjX3N0cigpIGNvbnN0OwotICAgIGlubGluZSAgY29uc3QgY2hhciogICAgICAgICBzdHJpbmcoKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nICAgc3RkX3N0cmluZyhjb25zdCBTdHJpbmc4JiBzdHIpOwotcHVibGljOgogCiAgICAgaW5saW5lICBzaXplX3QgICAgICAgICAgICAgIHNpemUoKSBjb25zdDsKICAgICBpbmxpbmUgIHNpemVfdCAgICAgICAgICAgICAgYnl0ZXMoKSBjb25zdDsKLSAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICAgICAgaXNFbXB0eSgpIGNvbnN0OworICAgIGlubGluZSAgYm9vbCAgICAgICAgICAgICAgICBlbXB0eSgpIGNvbnN0OwogCiAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgIGxlbmd0aCgpIGNvbnN0OwogCkBAIC0xMDQsNiArMTEwLDkgQEAKICAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICAgICAgb3BlcmF0b3IhPShjb25zdCBTdHJpbmc4JiBvdGhlcikgY29uc3Q7CiAgICAgaW5saW5lICBib29sICAgICAgICAgICAgICAgIG9wZXJhdG9yPj0oY29uc3QgU3RyaW5nOCYgb3RoZXIpIGNvbnN0OwogICAgIGlubGluZSAgYm9vbCAgICAgICAgICAgICAgICBvcGVyYXRvcj4oY29uc3QgU3RyaW5nOCYgb3RoZXIpIGNvbnN0OworI2lmIF9fY3BsdXNwbHVzID49IDIwMjAwMkwKKyAgICBpbmxpbmUgc3RkOjpzdHJvbmdfb3JkZXJpbmcgb3BlcmF0b3I8PT4oY29uc3QgU3RyaW5nOCYgb3RoZXIpIGNvbnN0OworI2VuZGlmCiAKICAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICAgICAgb3BlcmF0b3I8KGNvbnN0IGNoYXIqIG90aGVyKSBjb25zdDsKICAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICAgICAgb3BlcmF0b3I8PShjb25zdCBjaGFyKiBvdGhlcikgY29uc3Q7CkBAIC0xMTEsOSArMTIwLDE2IEBACiAgICAgaW5saW5lICBib29sICAgICAgICAgICAgICAgIG9wZXJhdG9yIT0oY29uc3QgY2hhciogb3RoZXIpIGNvbnN0OwogICAgIGlubGluZSAgYm9vbCAgICAgICAgICAgICAgICBvcGVyYXRvcj49KGNvbnN0IGNoYXIqIG90aGVyKSBjb25zdDsKICAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICAgICAgb3BlcmF0b3I+KGNvbnN0IGNoYXIqIG90aGVyKSBjb25zdDsKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDIwMDJMCisgICAgaW5saW5lIHN0ZDo6c3Ryb25nX29yZGVyaW5nIG9wZXJhdG9yPD0+KGNvbnN0IGNoYXIqIG90aGVyKSBjb25zdDsKKyNlbmRpZgogCiAgICAgaW5saW5lICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yIGNvbnN0IGNoYXIqKCkgY29uc3Q7CiAKKyNpZmRlZiBIQVNfU1RSSU5HX1ZJRVcKKyAgICBpbmxpbmUgZXhwbGljaXQgICAgICAgICAgICAgb3BlcmF0b3Igc3RkOjpzdHJpbmdfdmlldygpIGNvbnN0OworI2VuZGlmCisKICAgICAgICAgICAgIGNoYXIqICAgICAgICAgICAgICAgbG9ja0J1ZmZlcihzaXplX3Qgc2l6ZSk7CiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHVubG9ja0J1ZmZlcigpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICB1bmxvY2tCdWZmZXIoc2l6ZV90IHNpemUpOwpAQCAtMTIxLDEwMSArMTM3LDM1IEBACiAgICAgICAgICAgICAvLyByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBieXRlIG9mIG90aGVyIGluIHRoaXMgYXQgb3IgYWZ0ZXIKICAgICAgICAgICAgIC8vIHN0YXJ0LCBvciAtMSBpZiBub3QgZm91bmQKICAgICAgICAgICAgIHNzaXplX3QgICAgICAgICAgICAgZmluZChjb25zdCBjaGFyKiBvdGhlciwgc2l6ZV90IHN0YXJ0ID0gMCkgY29uc3Q7CisgICAgaW5saW5lICBzc2l6ZV90ICAgICAgICAgICAgIGZpbmQoY29uc3QgU3RyaW5nOCYgb3RoZXIsIHNpemVfdCBzdGFydCA9IDApIGNvbnN0OwogCiAgICAgICAgICAgICAvLyByZXR1cm4gdHJ1ZSBpZiB0aGlzIHN0cmluZyBjb250YWlucyB0aGUgc3BlY2lmaWVkIHN1YnN0cmluZwogICAgIGlubGluZSAgYm9vbCAgICAgICAgICAgICAgICBjb250YWlucyhjb25zdCBjaGFyKiBvdGhlcikgY29uc3Q7CisgICAgaW5saW5lICBib29sICAgICAgICAgICAgICAgIGNvbnRhaW5zKGNvbnN0IFN0cmluZzgmIG90aGVyKSBjb25zdDsKIAogICAgICAgICAgICAgLy8gcmVtb3ZlcyBhbGwgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIHN1YnN0cmluZwogICAgICAgICAgICAgLy8gcmV0dXJucyB0cnVlIGlmIGFueSB3ZXJlIGZvdW5kIGFuZCByZW1vdmVkCiAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgIHJlbW92ZUFsbChjb25zdCBjaGFyKiBvdGhlcik7CisgICAgaW5saW5lICBib29sICAgICAgICAgICAgICAgIHJlbW92ZUFsbChjb25zdCBTdHJpbmc4JiBvdGhlcik7CiAKICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgdG9Mb3dlcigpOwogCi0KLSAgICAvKgotICAgICAqIFRoZXNlIG1ldGhvZHMgb3BlcmF0ZSBvbiB0aGUgc3RyaW5nIGFzIGlmIGl0IHdlcmUgYSBwYXRoIG5hbWUuCi0gICAgICovCi0KLSAgICAvKgotICAgICAqIEdldCBqdXN0IHRoZSBmaWxlbmFtZSBjb21wb25lbnQuCi0gICAgICoKLSAgICAgKiAiL3RtcC9mb28vYmFyLmMiIC0tPiAiYmFyLmMiCi0gICAgICovCi0gICAgU3RyaW5nOCBnZXRQYXRoTGVhZih2b2lkKSBjb25zdDsKLQotICAgIC8qCi0gICAgICogUmVtb3ZlIHRoZSBsYXN0IChmaWxlIG5hbWUpIGNvbXBvbmVudCwgbGVhdmluZyBqdXN0IHRoZSBkaXJlY3RvcnkKLSAgICAgKiBuYW1lLgotICAgICAqCi0gICAgICogIi90bXAvZm9vL2Jhci5jIiAtLT4gIi90bXAvZm9vIgotICAgICAqICIvdG1wIiAtLT4gIiIgLy8gPz8/Pz8gc2hvdWxkbid0IHRoaXMgYmUgIi8iID8/Pz8gWFhYCi0gICAgICogImJhci5jIiAtLT4gIiIKLSAgICAgKi8KLSAgICBTdHJpbmc4IGdldFBhdGhEaXIodm9pZCkgY29uc3Q7Ci0KLSAgICAvKgotICAgICAqIFJldHJpZXZlIHRoZSBmcm9udCAocm9vdCBkaXIpIGNvbXBvbmVudC4gIE9wdGlvbmFsbHkgYWxzbyByZXR1cm4gdGhlCi0gICAgICogcmVtYWluaW5nIGNvbXBvbmVudHMuCi0gICAgICoKLSAgICAgKiAiL3RtcC9mb28vYmFyLmMiIC0tPiAidG1wIiAocmVtYWluID0gImZvby9iYXIuYyIpCi0gICAgICogIi90bXAiIC0tPiAidG1wIiAocmVtYWluID0gIiIpCi0gICAgICogImJhci5jIiAtLT4gImJhci5jIiAocmVtYWluID0gIiIpCi0gICAgICovCi0gICAgU3RyaW5nOCB3YWxrUGF0aChTdHJpbmc4KiBvdXRSZW1haW5zID0gbnVsbHB0cikgY29uc3Q7Ci0KLSAgICAvKgotICAgICAqIFJldHVybiB0aGUgZmlsZW5hbWUgZXh0ZW5zaW9uLiAgVGhpcyBpcyB0aGUgbGFzdCAnLicgYW5kIGFueSBudW1iZXIKLSAgICAgKiBvZiBjaGFyYWN0ZXJzIHRoYXQgZm9sbG93IGl0LiAgVGhlICcuJyBpcyBpbmNsdWRlZCBpbiBjYXNlIHdlCi0gICAgICogZGVjaWRlIHRvIGV4cGFuZCBvdXIgZGVmaW5pdGlvbiBvZiB3aGF0IGNvbnN0aXR1dGVzIGFuIGV4dGVuc2lvbi4KLSAgICAgKgotICAgICAqICIvdG1wL2Zvby9iYXIuYyIgLS0+ICIuYyIKLSAgICAgKiAiL3RtcCIgLS0+ICIiCi0gICAgICogIi90bXAvZm9vLmJhci9iYXoiIC0tPiAiIgotICAgICAqICJmb28uanBlZyIgLS0+ICIuanBlZyIKLSAgICAgKiAiZm9vLiIgLS0+ICIiCi0gICAgICovCi0gICAgU3RyaW5nOCBnZXRQYXRoRXh0ZW5zaW9uKHZvaWQpIGNvbnN0OwotCi0gICAgLyoKLSAgICAgKiBSZXR1cm4gdGhlIHBhdGggd2l0aG91dCB0aGUgZXh0ZW5zaW9uLiAgUnVsZXMgZm9yIHdoYXQgY29uc3RpdHV0ZXMKLSAgICAgKiBhbiBleHRlbnNpb24gYXJlIGRlc2NyaWJlZCBpbiB0aGUgY29tbWVudCBmb3IgZ2V0UGF0aEV4dGVuc2lvbigpLgotICAgICAqCi0gICAgICogIi90bXAvZm9vL2Jhci5jIiAtLT4gIi90bXAvZm9vL2JhciIKLSAgICAgKi8KLSAgICBTdHJpbmc4IGdldEJhc2VQYXRoKHZvaWQpIGNvbnN0OwotCi0gICAgLyoKLSAgICAgKiBBZGQgYSBjb21wb25lbnQgdG8gdGhlIHBhdGhuYW1lLiAgV2UgZ3VhcmFudGVlIHRoYXQgdGhlcmUgaXMKLSAgICAgKiBleGFjdGx5IG9uZSBwYXRoIHNlcGFyYXRvciBiZXR3ZWVuIHRoZSBvbGQgcGF0aCBhbmQgdGhlIG5ldy4KLSAgICAgKiBJZiB0aGVyZSBpcyBubyBleGlzdGluZyBuYW1lLCB3ZSBqdXN0IGNvcHkgdGhlIG5ldyBuYW1lIGluLgotICAgICAqCi0gICAgICogSWYgbGVhZiBpcyBhIGZ1bGx5IHF1YWxpZmllZCBwYXRoIChpLmUuIHN0YXJ0cyB3aXRoICcvJywgaXQKLSAgICAgKiByZXBsYWNlcyB3aGF0ZXZlciB3YXMgdGhlcmUgYmVmb3JlLgotICAgICAqLwotICAgIFN0cmluZzgmIGFwcGVuZFBhdGgoY29uc3QgY2hhciogbGVhZik7Ci0gICAgU3RyaW5nOCYgYXBwZW5kUGF0aChjb25zdCBTdHJpbmc4JiBsZWFmKSAgeyByZXR1cm4gYXBwZW5kUGF0aChsZWFmLnN0cmluZygpKTsgfQotCi0gICAgLyoKLSAgICAgKiBMaWtlIGFwcGVuZFBhdGgoKSwgYnV0IGRvZXMgbm90IGFmZmVjdCB0aGlzIHN0cmluZy4gIFJldHVybnMgYSBuZXcgb25lIGluc3RlYWQuCi0gICAgICovCi0gICAgU3RyaW5nOCBhcHBlbmRQYXRoQ29weShjb25zdCBjaGFyKiBsZWFmKSBjb25zdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBTdHJpbmc4IHAoKnRoaXMpOyBwLmFwcGVuZFBhdGgobGVhZik7IHJldHVybiBwOyB9Ci0gICAgU3RyaW5nOCBhcHBlbmRQYXRoQ29weShjb25zdCBTdHJpbmc4JiBsZWFmKSBjb25zdCB7IHJldHVybiBhcHBlbmRQYXRoQ29weShsZWFmLnN0cmluZygpKTsgfQotCi0gICAgLyoKLSAgICAgKiBDb252ZXJ0cyBhbGwgc2VwYXJhdG9ycyBpbiB0aGlzIHN0cmluZyB0byAvLCB0aGUgZGVmYXVsdCBwYXRoIHNlcGFyYXRvci4KLSAgICAgKgotICAgICAqIElmIHRoZSBkZWZhdWx0IE9TIHNlcGFyYXRvciBpcyBiYWNrc2xhc2gsIHRoaXMgY29udmVydHMgYWxsCi0gICAgICogYmFja3NsYXNoZXMgdG8gc2xhc2hlcywgaW4tcGxhY2UuIE90aGVyd2lzZSBpdCBkb2VzIG5vdGhpbmcuCi0gICAgICogUmV0dXJucyBzZWxmLgotICAgICAqLwotICAgIFN0cmluZzgmIGNvbnZlcnRUb1Jlc1BhdGgoKTsKLQogcHJpdmF0ZToKKyAgICAgICAgICAgIFN0cmluZzggZ2V0UGF0aERpcih2b2lkKSBjb25zdDsKKyAgICAgICAgICAgIFN0cmluZzggZ2V0UGF0aEV4dGVuc2lvbih2b2lkKSBjb25zdDsKKwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICByZWFsX2FwcGVuZChjb25zdCBjaGFyKiBvdGhlciwgc2l6ZV90IG51bUNoYXJzKTsKLSAgICAgICAgICAgIGNoYXIqICAgICAgICAgICAgICAgZmluZF9leHRlbnNpb24odm9pZCkgY29uc3Q7CiAKICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1TdHJpbmc7CisKKy8vIFRoZXNlIHN5bWJvbHMgYXJlIGZvciBwb3RlbnRpYWwgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIHByZWJ1aWx0cy4gVG8gYmUgcmVtb3ZlZC4KKyNpZmRlZiBFTkFCTEVfU1RSSU5HOF9PQlNPTEVURV9NRVRIT0RTCitwdWJsaWM6CisjZWxzZQorcHJpdmF0ZToKKyNlbmRpZgorICAgIGlubGluZSAgY29uc3QgY2hhciogICAgICAgICBzdHJpbmcoKSBjb25zdDsKKyAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICAgICAgaXNFbXB0eSgpIGNvbnN0OwogfTsKIAogLy8gU3RyaW5nOCBjYW4gYmUgdHJpdmlhbGx5IG1vdmVkIHVzaW5nIG1lbWNweSgpIGJlY2F1c2UgbW92aW5nIGRvZXMgbm90CkBAIC0yNDAsMTAgKzE5MCw2IEBACiAgICAgcmV0dXJuIGNvbXBhcmVfdHlwZShsaHMsIHJocykgPCAwOwogfQogCi1pbmxpbmUgY29uc3QgU3RyaW5nOCBTdHJpbmc4OjplbXB0eSgpIHsKLSAgICByZXR1cm4gU3RyaW5nOCgpOwotfQotCiBpbmxpbmUgY29uc3QgY2hhciogU3RyaW5nODo6Y19zdHIoKSBjb25zdAogewogICAgIHJldHVybiBtU3RyaW5nOwpAQCAtMjUzLDE2ICsxOTksMTYgQEAKICAgICByZXR1cm4gbVN0cmluZzsKIH0KIAotaW5saW5lIHN0ZDo6c3RyaW5nIFN0cmluZzg6OnN0ZF9zdHJpbmcoY29uc3QgU3RyaW5nOCYgc3RyKQotewotICAgIHJldHVybiBzdGQ6OnN0cmluZyhzdHIuc3RyaW5nKCkpOwotfQotCiBpbmxpbmUgc2l6ZV90IFN0cmluZzg6OnNpemUoKSBjb25zdAogewogICAgIHJldHVybiBsZW5ndGgoKTsKIH0KIAoraW5saW5lIGJvb2wgU3RyaW5nODo6ZW1wdHkoKSBjb25zdAoreworICAgIHJldHVybiBsZW5ndGgoKSA9PSAwOworfQorCiBpbmxpbmUgYm9vbCBTdHJpbmc4Ojppc0VtcHR5KCkgY29uc3QKIHsKICAgICByZXR1cm4gbGVuZ3RoKCkgPT0gMDsKQEAgLTI3MywxMSArMjE5LDI2IEBACiAgICAgcmV0dXJuIGxlbmd0aCgpOwogfQogCitpbmxpbmUgc3NpemVfdCBTdHJpbmc4OjpmaW5kKGNvbnN0IFN0cmluZzgmIG90aGVyLCBzaXplX3Qgc3RhcnQpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZpbmQob3RoZXIuY19zdHIoKSwgc3RhcnQpOworfQorCiBpbmxpbmUgYm9vbCBTdHJpbmc4Ojpjb250YWlucyhjb25zdCBjaGFyKiBvdGhlcikgY29uc3QKIHsKICAgICByZXR1cm4gZmluZChvdGhlcikgPj0gMDsKIH0KIAoraW5saW5lIGJvb2wgU3RyaW5nODo6Y29udGFpbnMoY29uc3QgU3RyaW5nOCYgb3RoZXIpIGNvbnN0Cit7CisgICAgcmV0dXJuIGNvbnRhaW5zKG90aGVyLmNfc3RyKCkpOworfQorCitpbmxpbmUgYm9vbCBTdHJpbmc4OjpyZW1vdmVBbGwoY29uc3QgU3RyaW5nOCYgb3RoZXIpCit7CisgICAgcmV0dXJuIHJlbW92ZUFsbChvdGhlci5jX3N0cigpKTsKK30KKwogaW5saW5lIFN0cmluZzgmIFN0cmluZzg6Om9wZXJhdG9yPShjb25zdCBTdHJpbmc4JiBvdGhlcikKIHsKICAgICBzZXRUbyhvdGhlcik7CkBAIC0zNTEsNiArMzEyLDE5IEBACiAgICAgcmV0dXJuIHN0cmNtcChtU3RyaW5nLCBvdGhlci5tU3RyaW5nKSA+IDA7CiB9CiAKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDIwMDJMCitpbmxpbmUgc3RkOjpzdHJvbmdfb3JkZXJpbmcgU3RyaW5nODo6b3BlcmF0b3I8PT4oY29uc3QgU3RyaW5nOCYgb3RoZXIpIGNvbnN0IHsKKyAgICBpbnQgcmVzdWx0ID0gc3RyY21wKG1TdHJpbmcsIG90aGVyLm1TdHJpbmcpOworICAgIGlmIChyZXN1bHQgPT0gMCkgeworICAgICAgICByZXR1cm4gc3RkOjpzdHJvbmdfb3JkZXJpbmc6OmVxdWFsOworICAgIH0gZWxzZSBpZiAocmVzdWx0IDwgMCkgeworICAgICAgICByZXR1cm4gc3RkOjpzdHJvbmdfb3JkZXJpbmc6Omxlc3M7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6c3Ryb25nX29yZGVyaW5nOjpncmVhdGVyOworICAgIH0KK30KKyNlbmRpZgorCiBpbmxpbmUgYm9vbCBTdHJpbmc4OjpvcGVyYXRvcjwoY29uc3QgY2hhciogb3RoZXIpIGNvbnN0CiB7CiAgICAgcmV0dXJuIHN0cmNtcChtU3RyaW5nLCBvdGhlcikgPCAwOwpAQCAtMzgxLDEzICszNTUsMzYgQEAKICAgICByZXR1cm4gc3RyY21wKG1TdHJpbmcsIG90aGVyKSA+IDA7CiB9CiAKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDIwMDJMCitpbmxpbmUgc3RkOjpzdHJvbmdfb3JkZXJpbmcgU3RyaW5nODo6b3BlcmF0b3I8PT4oY29uc3QgY2hhciogb3RoZXIpIGNvbnN0IHsKKyAgICBpbnQgcmVzdWx0ID0gc3RyY21wKG1TdHJpbmcsIG90aGVyKTsKKyAgICBpZiAocmVzdWx0ID09IDApIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6c3Ryb25nX29yZGVyaW5nOjplcXVhbDsKKyAgICB9IGVsc2UgaWYgKHJlc3VsdCA8IDApIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6c3Ryb25nX29yZGVyaW5nOjpsZXNzOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBzdGQ6OnN0cm9uZ19vcmRlcmluZzo6Z3JlYXRlcjsKKyAgICB9Cit9CisjZW5kaWYKKwogaW5saW5lIFN0cmluZzg6Om9wZXJhdG9yIGNvbnN0IGNoYXIqKCkgY29uc3QKIHsKICAgICByZXR1cm4gbVN0cmluZzsKIH0KIAorI2lmZGVmIEhBU19TVFJJTkdfVklFVworaW5saW5lIFN0cmluZzg6Om9wZXJhdG9yIHN0ZDo6c3RyaW5nX3ZpZXcoKSBjb25zdAoreworICAgIHJldHVybiB7bVN0cmluZywgbGVuZ3RoKCl9OworfQorI2VuZGlmCisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCisjdW5kZWYgSEFTX1NUUklORworI3VuZGVmIEhBU19TVFJJTkdfVklFVworCiAjZW5kaWYgLy8gQU5EUk9JRF9TVFJJTkc4X0gKZGlmZiAtLWdpdCBhL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIGIvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIGxpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oCnJlbmFtZSB0byBsaWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgKaW5kZXggNTRhYTY5MS4uZmI5YjhlOCAxMDA2NDQKLS0tIGEvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgKKysrIGIvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oCkBAIC0zMCw3ICszMCw3IEBACiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogY2xhc3Mgc3AgewogcHVibGljOgotICAgIGlubGluZSBzcCgpIDogbV9wdHIobnVsbHB0cikgeyB9CisgICAgaW5saW5lIGNvbnN0ZXhwciBzcCgpIDogbV9wdHIobnVsbHB0cikgeyB9CiAKICAgICAvLyBUaGUgb2xkIHdheSBvZiB1c2luZyBzcDw+IHdhcyBsaWtlIHRoaXMuIFRoaXMgaXMgYmFkIGJlY2F1c2UgaXQgcmVsaWVzCiAgICAgLy8gb24gaW1wbGljaXQgY29udmVyc2lvbiB0byBzcDw+LCB3aGljaCB3ZSB3b3VsZCBsaWtlIHRvIHJlbW92ZSAoaWYgYW4KQEAgLTk4LDYgKzk4LDE1IEBACiAKICAgICB2b2lkIGNsZWFyKCk7CiAKKyAgICAvLyBSZWxlYXNlcyB0aGUgb3duZXJzaGlwIG9mIHRoZSBvYmplY3QgbWFuYWdlZCBieSB0aGlzIGluc3RhbmNlIG9mIHNwLCBpZiBhbnkuCisgICAgLy8gVGhlIGNhbGxlciBpcyBub3cgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIGl0LiBUaGF0IGlzLCB0aGUgY2FsbGVyIG11c3QgZW5zdXJlCisgICAgLy8gZGVjU3Ryb25nKCkgaXMgY2FsbGVkIHdoZW4gdGhlIHBvaW50ZXIgaXMgbm8gbG9uZ2VyIHVzZWQuCisgICAgW1tub2Rpc2NhcmRdXSBpbmxpbmUgVCogcmVsZWFzZSgpIG5vZXhjZXB0IHsKKyAgICAgICAgYXV0byByZXQgPSBtX3B0cjsKKyAgICAgICAgbV9wdHIgPSBudWxscHRyOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKwogICAgIC8vIEFjY2Vzc29ycwogCiAgICAgaW5saW5lIFQmICAgICAgIG9wZXJhdG9yKiAoKSBjb25zdCAgICAgeyByZXR1cm4gKm1fcHRyOyB9CmRpZmYgLS1naXQgYS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmggYi9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oCnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIGxpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaApyZW5hbWUgdG8gbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaAppbmRleCAxNTU0ZjUyLi4wMDcwMzZiIDEwMDY0NAotLS0gYS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgKKysrIGIvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaApAQCAtMTA5LDYgKzEwOSwxMSBAQAogQU5EUk9JRF9CQVNJQ19UWVBFU19UUkFJVFMoIGZsb2F0ICkKIEFORFJPSURfQkFTSUNfVFlQRVNfVFJBSVRTKCBkb3VibGUgKQogCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgdHJhaXRfdHJpdmlhbF9jdG9yPFQqPiAgIHsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHRyYWl0X3RyaXZpYWxfZHRvcjxUKj4gICB7IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCB0cmFpdF90cml2aWFsX2NvcHk8VCo+ICAgeyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgdHJhaXRfdHJpdmlhbF9tb3ZlPFQqPiAgIHsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogCkBAIC0xOTUsNyArMjAwLDcgQEAKIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHVzZV90cml2aWFsX21vdmU8VFlQRT46OnZhbHVlPjo6dHlwZQogaW5saW5lCiBtb3ZlX2ZvcndhcmRfdHlwZShUWVBFKiBkLCBjb25zdCBUWVBFKiBzLCBzaXplX3QgbiA9IDEpIHsKLSAgICBtZW1tb3ZlKGQsIHMsIG4qc2l6ZW9mKFRZUEUpKTsKKyAgICBtZW1tb3ZlKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGQpLCBzLCBuICogc2l6ZW9mKFRZUEUpKTsKIH0KIAogdGVtcGxhdGU8dHlwZW5hbWUgVFlQRT4KQEAgLTIyMiw3ICsyMjcsNyBAQAogdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8dXNlX3RyaXZpYWxfbW92ZTxUWVBFPjo6dmFsdWU+Ojp0eXBlCiBpbmxpbmUKIG1vdmVfYmFja3dhcmRfdHlwZShUWVBFKiBkLCBjb25zdCBUWVBFKiBzLCBzaXplX3QgbiA9IDEpIHsKLSAgICBtZW1tb3ZlKGQsIHMsIG4qc2l6ZW9mKFRZUEUpKTsKKyAgICBtZW1tb3ZlKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGQpLCBzLCBuICogc2l6ZW9mKFRZUEUpKTsKIH0KIAogdGVtcGxhdGU8dHlwZW5hbWUgVFlQRT4KZGlmZiAtLWdpdCBhL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oIGIvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWJ1dGlscy9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaApyZW5hbWUgdG8gbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oCmRpZmYgLS1naXQgYS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3Rvci5oIGIvbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgKc2ltaWxhcml0eSBpbmRleCA5MiUKcmVuYW1lIGZyb20gbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3IuaApyZW5hbWUgdG8gbGlidXRpbHMvYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgKaW5kZXggYmUzNWVhMi4uZDVkYjNjYiAxMDA2NDQKLS0tIGEvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3IuaAorKysgYi9saWJ1dGlscy9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3IuaApAQCAtNjcsMTMgKzY3LDEwIEBACiAgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgflZlY3RvcigpOwogCiAgICAgLyohIGNvcHkgb3BlcmF0b3IgKi8KLSAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxUWVBFPiYgICAgIG9wZXJhdG9yID0gKGNvbnN0IFZlY3RvcjxUWVBFPiYgcmhzKSBjb25zdDsKLSAgICAgICAgICAgIFZlY3RvcjxUWVBFPiYgICAgICAgICAgIG9wZXJhdG9yID0gKGNvbnN0IFZlY3RvcjxUWVBFPiYgcmhzKTsKKyAgICBWZWN0b3I8VFlQRT4mIG9wZXJhdG9yPShjb25zdCBWZWN0b3I8VFlQRT4mIHJocyk7ICAgICAgICAvLyBOT0xJTlQoY2VydC1vb3A1NC1jcHApCisgICAgVmVjdG9yPFRZUEU+JiBvcGVyYXRvcj0oY29uc3QgU29ydGVkVmVjdG9yPFRZUEU+JiByaHMpOyAgLy8gTk9MSU5UKGNlcnQtb29wNTQtY3BwKQogCi0gICAgICAgICAgICBjb25zdCBWZWN0b3I8VFlQRT4mICAgICBvcGVyYXRvciA9IChjb25zdCBTb3J0ZWRWZWN0b3I8VFlQRT4mIHJocykgY29uc3Q7Ci0gICAgICAgICAgICBWZWN0b3I8VFlQRT4mICAgICAgICAgICBvcGVyYXRvciA9IChjb25zdCBTb3J0ZWRWZWN0b3I8VFlQRT4mIHJocyk7Ci0KLSAgICAgICAgICAgIC8qCisgICAgLyoKICAgICAgKiBlbXB0eSB0aGUgdmVjdG9yCiAgICAgICovCiAKQEAgLTI0OCwyNyArMjQ1LDE4IEBACiAgICAgZmluaXNoX3ZlY3RvcigpOwogfQogCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLVZlY3RvcjxUWVBFPiYgVmVjdG9yPFRZUEU+OjpvcGVyYXRvciA9IChjb25zdCBWZWN0b3I8VFlQRT4mIHJocykgewotICAgIFZlY3RvckltcGw6Om9wZXJhdG9yID0gKHJocyk7Cit0ZW1wbGF0ZSA8Y2xhc3MgVFlQRT4KK2lubGluZSBWZWN0b3I8VFlQRT4mIFZlY3RvcjxUWVBFPjo6b3BlcmF0b3I9KGNvbnN0IFZlY3RvcjxUWVBFPiYgcmhzKSAgLy8gTk9MSU5UKGNlcnQtb29wNTQtY3BwKQoreworICAgIFZlY3RvckltcGw6Om9wZXJhdG9yPShyaHMpOwogICAgIHJldHVybiAqdGhpczsKIH0KIAotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1jb25zdCBWZWN0b3I8VFlQRT4mIFZlY3RvcjxUWVBFPjo6b3BlcmF0b3IgPSAoY29uc3QgVmVjdG9yPFRZUEU+JiByaHMpIGNvbnN0IHsKLSAgICBWZWN0b3JJbXBsOjpvcGVyYXRvciA9IChzdGF0aWNfY2FzdDxjb25zdCBWZWN0b3JJbXBsJj4ocmhzKSk7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLVZlY3RvcjxUWVBFPiYgVmVjdG9yPFRZUEU+OjpvcGVyYXRvciA9IChjb25zdCBTb3J0ZWRWZWN0b3I8VFlQRT4mIHJocykgewotICAgIFZlY3RvckltcGw6Om9wZXJhdG9yID0gKHN0YXRpY19jYXN0PGNvbnN0IFZlY3RvckltcGwmPihyaHMpKTsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+IGlubGluZQotY29uc3QgVmVjdG9yPFRZUEU+JiBWZWN0b3I8VFlQRT46Om9wZXJhdG9yID0gKGNvbnN0IFNvcnRlZFZlY3RvcjxUWVBFPiYgcmhzKSBjb25zdCB7Ci0gICAgVmVjdG9ySW1wbDo6b3BlcmF0b3IgPSAocmhzKTsKK3RlbXBsYXRlIDxjbGFzcyBUWVBFPgoraW5saW5lIFZlY3RvcjxUWVBFPiYgVmVjdG9yPFRZUEU+OjpvcGVyYXRvcj0oCisgICAgICAgIGNvbnN0IFNvcnRlZFZlY3RvcjxUWVBFPiYgcmhzKSAgLy8gTk9MSU5UKGNlcnQtb29wNTQtY3BwKQoreworICAgIFZlY3RvckltcGw6Om9wZXJhdG9yPShzdGF0aWNfY2FzdDxjb25zdCBWZWN0b3JJbXBsJj4ocmhzKSk7CiAgICAgcmV0dXJuICp0aGlzOwogfQogCmRpZmYgLS1naXQgYS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCBiL2xpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgKcmVuYW1lIHRvIGxpYnV0aWxzL2JpbmRlci9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaApkaWZmIC0tZ2l0IGEvbGlidXRpbHMvaW5jbHVkZS91dGlscy9DYWxsU3RhY2suaCBiL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvQ2FsbFN0YWNrLmgKaW5kZXggZmU0ZDRmNS4uMDIzOWI2OCAxMDA2NDQKLS0tIGEvbGlidXRpbHMvaW5jbHVkZS91dGlscy9DYWxsU3RhY2suaAorKysgYi9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0NhbGxTdGFjay5oCkBAIC0xNCw4ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaWZuZGVmIEFORFJPSURfQ0FMTFNUQUNLX0gKLSNkZWZpbmUgQU5EUk9JRF9DQUxMU1RBQ0tfSAorI3ByYWdtYSBvbmNlCiAKICNpbmNsdWRlIDxtZW1vcnk+CiAKQEAgLTI3LDE3ICsyNiwxOSBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCiAjaWYgIWRlZmluZWQoX19BUFBMRV9fKSAmJiAhZGVmaW5lZChfV0lOMzIpCi0jIGRlZmluZSBXRUFLU19BVkFJTEFCTEUgMQorIyBkZWZpbmUgQ0FMTFNUQUNLX1dFQUtTX0FWQUlMQUJMRSAxCiAjZW5kaWYKICNpZm5kZWYgQ0FMTFNUQUNLX1dFQUsKLSMgaWZkZWYgV0VBS1NfQVZBSUxBQkxFCisjIGlmZGVmIENBTExTVEFDS19XRUFLU19BVkFJTEFCTEUKICMgICBkZWZpbmUgQ0FMTFNUQUNLX1dFQUsgX19hdHRyaWJ1dGVfXygod2VhaykpCi0jIGVsc2UgLy8gIVdFQUtTX0FWQUlMQUJMRQorIyBlbHNlIC8vICFDQUxMU1RBQ0tfV0VBS1NfQVZBSUxBQkxFCiAjICAgZGVmaW5lIENBTExTVEFDS19XRUFLCi0jIGVuZGlmIC8vICFXRUFLU19BVkFJTEFCTEUKKyMgZW5kaWYgLy8gIUNBTExTVEFDS19XRUFLU19BVkFJTEFCTEUKICNlbmRpZiAvLyBDQUxMU1RBQ0tfV0VBSyBwcmVkZWZpbmVkCiAKLSNkZWZpbmUgQUxXQVlTX0lOTElORSBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkKKyNpZm5kZWYgQ0FMTFNUQUNLX0FMV0FZU19JTkxJTkUKKyNkZWZpbmUgQ0FMTFNUQUNLX0FMV0FZU19JTkxJTkUgX19hdHRyaWJ1dGVfXygoYWx3YXlzX2lubGluZSkpCisjZW5kaWYgIC8vIENBTExTVEFDS19BTFdBWVNfSU5MSU5FIHByZWRlZmluZWQKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC04OSw3ICs5MCw3IEBACiAgICAgLy8KICAgICAvLyBETyBOT1QgVVNFIFRIRVNFLiBUaGV5IHdpbGwgZGlzYXBwZWFyLgogICAgIHN0cnVjdCBTdGFja0RlbGV0ZXIgewotI2lmZGVmIFdFQUtTX0FWQUlMQUJMRQorI2lmZGVmIENBTExTVEFDS19XRUFLU19BVkFJTEFCTEUKICAgICAgICAgdm9pZCBvcGVyYXRvcigpKENhbGxTdGFjayogc3RhY2spIHsKICAgICAgICAgICAgIGRlbGV0ZVN0YWNrKHN0YWNrKTsKICAgICAgICAgfQpAQCAtMTAxLDggKzEwMiw4IEBACiAgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9wdHI8Q2FsbFN0YWNrLCBTdGFja0RlbGV0ZXI+IENhbGxTdGFja1VQdHI7CiAKICAgICAvLyBSZXR1cm4gY3VycmVudCBjYWxsIHN0YWNrIGlmIHBvc3NpYmxlLCBudWxscHRyIG90aGVyd2lzZS4KLSNpZmRlZiBXRUFLU19BVkFJTEFCTEUKLSAgICBzdGF0aWMgQ2FsbFN0YWNrVVB0ciBBTFdBWVNfSU5MSU5FIGdldEN1cnJlbnQoaW50MzJfdCBpZ25vcmVEZXB0aCA9IDEpIHsKKyNpZmRlZiBDQUxMU1RBQ0tfV0VBS1NfQVZBSUxBQkxFCisgICAgc3RhdGljIENhbGxTdGFja1VQdHIgQ0FMTFNUQUNLX0FMV0FZU19JTkxJTkUgZ2V0Q3VycmVudChpbnQzMl90IGlnbm9yZURlcHRoID0gMSkgewogICAgICAgICBpZiAocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGdldEN1cnJlbnRJbnRlcm5hbCkgPT0gMCkgewogICAgICAgICAgICAgQUxPR1coIkNhbGxTdGFjazo6Z2V0Q3VycmVudEludGVybmFsIG5vdCBsaW5rZWQsIHJldHVybmluZyBudWxsIik7CiAgICAgICAgICAgICByZXR1cm4gQ2FsbFN0YWNrVVB0cihudWxscHRyKTsKQEAgLTExMCwxNSArMTExLDE2IEBACiAgICAgICAgICAgICByZXR1cm4gZ2V0Q3VycmVudEludGVybmFsKGlnbm9yZURlcHRoKTsKICAgICAgICAgfQogICAgIH0KLSNlbHNlIC8vICFXRUFLU19BVkFJTEFCTEUKLSAgICBzdGF0aWMgQ2FsbFN0YWNrVVB0ciBBTFdBWVNfSU5MSU5FIGdldEN1cnJlbnQoaW50MzJfdCA9IDEpIHsKKyNlbHNlIC8vICFDQUxMU1RBQ0tfV0VBS1NfQVZBSUxBQkxFCisgICAgc3RhdGljIENhbGxTdGFja1VQdHIgQ0FMTFNUQUNLX0FMV0FZU19JTkxJTkUgZ2V0Q3VycmVudChpbnQzMl90ID0gMSkgewogICAgICAgICByZXR1cm4gQ2FsbFN0YWNrVVB0cihudWxscHRyKTsKICAgICB9Ci0jZW5kaWYgLy8gIVdFQUtTX0FWQUlMQUJMRQorI2VuZGlmIC8vICFDQUxMU1RBQ0tfV0VBS1NfQVZBSUxBQkxFCiAKLSNpZmRlZiBXRUFLU19BVkFJTEFCTEUKLSAgICBzdGF0aWMgdm9pZCBBTFdBWVNfSU5MSU5FIGxvZ1N0YWNrKGNvbnN0IGNoYXIqIGxvZ3RhZywgQ2FsbFN0YWNrKiBzdGFjayA9IGdldEN1cnJlbnQoKS5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfTG9nUHJpb3JpdHkgcHJpb3JpdHkgPSBBTkRST0lEX0xPR19ERUJVRykgeworI2lmZGVmIENBTExTVEFDS19XRUFLU19BVkFJTEFCTEUKKyAgICBzdGF0aWMgdm9pZCBDQUxMU1RBQ0tfQUxXQVlTX0lOTElORSBsb2dTdGFjayhjb25zdCBjaGFyKiBsb2d0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbFN0YWNrKiBzdGFjayA9IGdldEN1cnJlbnQoKS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX0xvZ1ByaW9yaXR5IHByaW9yaXR5ID0gQU5EUk9JRF9MT0dfREVCVUcpIHsKICAgICAgICAgaWYgKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pihsb2dTdGFja0ludGVybmFsKSAhPSAwICYmIHN0YWNrICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgIGxvZ1N0YWNrSW50ZXJuYWwobG9ndGFnLCBzdGFjaywgcHJpb3JpdHkpOwogICAgICAgICB9IGVsc2UgewpAQCAtMTI3LDMwICsxMjksMzEgQEAKICAgICB9CiAKICNlbHNlCi0gICAgc3RhdGljIHZvaWQgQUxXQVlTX0lOTElORSBsb2dTdGFjayhjb25zdCBjaGFyKiBsb2d0YWcsIENhbGxTdGFjayogPSBnZXRDdXJyZW50KCkuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX0xvZ1ByaW9yaXR5ID0gQU5EUk9JRF9MT0dfREVCVUcpIHsKKyAgICBzdGF0aWMgdm9pZCBDQUxMU1RBQ0tfQUxXQVlTX0lOTElORSBsb2dTdGFjayhjb25zdCBjaGFyKiBsb2d0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbFN0YWNrKiA9IGdldEN1cnJlbnQoKS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX0xvZ1ByaW9yaXR5ID0gQU5EUk9JRF9MT0dfREVCVUcpIHsKICAgICAgICAgQUxPRyhMT0dfV0FSTiwgbG9ndGFnLCAiQ2FsbFN0YWNrOjpsb2dTdGFja0ludGVybmFsIG5vdCBsaW5rZWQiKTsKICAgICB9Ci0jZW5kaWYgLy8gIVdFQUtTX0FWQUlMQUJMRQorI2VuZGlmIC8vICFDQUxMU1RBQ0tfV0VBS1NfQVZBSUxBQkxFCiAKLSNpZmRlZiBXRUFLU19BVkFJTEFCTEUKLSAgICBzdGF0aWMgU3RyaW5nOCBBTFdBWVNfSU5MSU5FIHN0YWNrVG9TdHJpbmcoY29uc3QgY2hhciogcHJlZml4ID0gbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FsbFN0YWNrKiBzdGFjayA9IGdldEN1cnJlbnQoKS5nZXQoKSkgeworI2lmZGVmIENBTExTVEFDS19XRUFLU19BVkFJTEFCTEUKKyAgICBzdGF0aWMgU3RyaW5nOCBDQUxMU1RBQ0tfQUxXQVlTX0lOTElORQorICAgIHN0YWNrVG9TdHJpbmcoY29uc3QgY2hhciogcHJlZml4ID0gbnVsbHB0ciwgY29uc3QgQ2FsbFN0YWNrKiBzdGFjayA9IGdldEN1cnJlbnQoKS5nZXQoKSkgewogICAgICAgICBpZiAocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHN0YWNrVG9TdHJpbmdJbnRlcm5hbCkgIT0gMCAmJiBzdGFjayAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICByZXR1cm4gc3RhY2tUb1N0cmluZ0ludGVybmFsKHByZWZpeCwgc3RhY2spOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIFN0cmluZzg6OmZvcm1hdCgiJXM8Q2FsbFN0YWNrIHBhY2thZ2Ugbm90IGxpbmtlZD4iLCAocHJlZml4ID8gcHJlZml4IDogIiIpKTsKICAgICAgICAgfQogICAgIH0KLSNlbHNlIC8vICFXRUFLU19BVkFJTEFCTEUKLSAgICBzdGF0aWMgU3RyaW5nOCBBTFdBWVNfSU5MSU5FIHN0YWNrVG9TdHJpbmcoY29uc3QgY2hhciogcHJlZml4ID0gbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FsbFN0YWNrKiA9IGdldEN1cnJlbnQoKS5nZXQoKSkgeworI2Vsc2UgLy8gIUNBTExTVEFDS19XRUFLU19BVkFJTEFCTEUKKyAgICBzdGF0aWMgU3RyaW5nOCBDQUxMU1RBQ0tfQUxXQVlTX0lOTElORSBzdGFja1RvU3RyaW5nKGNvbnN0IGNoYXIqIHByZWZpeCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYWxsU3RhY2sqID0gZ2V0Q3VycmVudCgpLmdldCgpKSB7CiAgICAgICAgIHJldHVybiBTdHJpbmc4Ojpmb3JtYXQoIiVzPENhbGxTdGFjayBwYWNrYWdlIG5vdCBsaW5rZWQ+IiwgKHByZWZpeCA/IHByZWZpeCA6ICIiKSk7CiAgICAgfQotI2VuZGlmIC8vICFXRUFLU19BVkFJTEFCTEUKKyNlbmRpZiAvLyAhQ0FMTFNUQUNLX1dFQUtTX0FWQUlMQUJMRQogCiAgIHByaXZhdGU6Ci0jaWZkZWYgV0VBS1NfQVZBSUxBQkxFCisjaWZkZWYgQ0FMTFNUQUNLX1dFQUtTX0FWQUlMQUJMRQogICAgIHN0YXRpYyBDYWxsU3RhY2tVUHRyIENBTExTVEFDS19XRUFLIGdldEN1cnJlbnRJbnRlcm5hbChpbnQzMl90IGlnbm9yZURlcHRoKTsKICAgICBzdGF0aWMgdm9pZCBDQUxMU1RBQ0tfV0VBSyBsb2dTdGFja0ludGVybmFsKGNvbnN0IGNoYXIqIGxvZ3RhZywgY29uc3QgQ2FsbFN0YWNrKiBzdGFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfTG9nUHJpb3JpdHkgcHJpb3JpdHkpOwpAQCAtMTU4LDExICsxNjEsMTMgQEAKICAgICAvLyBUaGUgZGVsZXRlciBpcyBvbmx5IGludm9rZWQgb24gbm9uLW51bGwgcG9pbnRlcnMuIEhlbmNlIGl0IHdpbGwgbmV2ZXIgYmUKICAgICAvLyBpbnZva2VkIGlmIENhbGxTdGFjayBpcyBub3QgbGlua2VkLgogICAgIHN0YXRpYyB2b2lkIENBTExTVEFDS19XRUFLIGRlbGV0ZVN0YWNrKENhbGxTdGFjayogc3RhY2spOwotI2VuZGlmIC8vIFdFQUtTX0FWQUlMQUJMRQorI2VuZGlmIC8vIENBTExTVEFDS19XRUFLU19BVkFJTEFCTEUKIAogICAgIFZlY3RvcjxTdHJpbmc4PiBtRnJhbWVMaW5lczsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKLSNlbmRpZiAvLyBBTkRST0lEX0NBTExTVEFDS19ICisjdW5kZWYgQ0FMTFNUQUNLX1dFQUtTX0FWQUlMQUJMRQorI3VuZGVmIENBTExTVEFDS19XRUFLCisjdW5kZWYgQ0FMTFNUQUNLX0FMV0FZU19JTkxJTkUKZGlmZiAtLWdpdCBhL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvRXJyb3JzLmggYi9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0Vycm9ycy5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjJlYmExMGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0Vycm9ycy5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL2JpbmRlci9pbmNsdWRlL3V0aWxzL0Vycm9ycy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGlidXRpbHMvaW5jbHVkZS91dGlscy9MaWdodFJlZkJhc2UuaCBiL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTGlnaHRSZWZCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uOWRhMmNmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTGlnaHRSZWZCYXNlLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vYmluZGVyL2luY2x1ZGUvdXRpbHMvTGlnaHRSZWZCYXNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0xvb3Blci5oIGIvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Mb29wZXIuaAppbmRleCBiMzg3ZDY4Li5lZWEzNDhlIDEwMDY0NAotLS0gYS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0xvb3Blci5oCisrKyBiL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTG9vcGVyLmgKQEAgLTMyMyw2ICszMjMsMTIgQEAKICAgICBpbnQgYWRkRmQoaW50IGZkLCBpbnQgaWRlbnQsIGludCBldmVudHMsIGNvbnN0IHNwPExvb3BlckNhbGxiYWNrPiYgY2FsbGJhY2ssIHZvaWQqIGRhdGEpOwogCiAgICAgLyoqCisgICAgICogTWF5IGJlIHVzZWZ1bCBmb3IgdGVzdGluZywgaW5zdGVhZCBvZiBleGVjdXRpbmcgYSBsb29wZXIgb24gYW5vdGhlciB0aHJlYWQgZm9yIGNvZGUgZXhwZWN0aW5nCisgICAgICogYSBsb29wZXIsIHlvdSBjYW4gY2FsbCBjYWxsYmFja3MgZGlyZWN0bHkuCisgICAgICovCisgICAgYm9vbCBnZXRGZFN0YXRlRGVidWcoaW50IGZkLCBpbnQqIGlkZW50LCBpbnQqIGV2ZW50cywgc3A8TG9vcGVyQ2FsbGJhY2s+KiBjYiwgdm9pZCoqIGRhdGEpOworCisgICAgLyoqCiAgICAgICogUmVtb3ZlcyBhIHByZXZpb3VzbHkgYWRkZWQgZmlsZSBkZXNjcmlwdG9yIGZyb20gdGhlIGxvb3Blci4KICAgICAgKgogICAgICAqIFdoZW4gdGhpcyBtZXRob2QgcmV0dXJucywgaXQgaXMgc2FmZSB0byBjbG9zZSB0aGUgZmlsZSBkZXNjcmlwdG9yIHNpbmNlIHRoZSBsb29wZXIKQEAgLTM0NSw2ICszNTEsMTggQEAKICAgICBpbnQgcmVtb3ZlRmQoaW50IGZkKTsKIAogICAgIC8qKgorICAgICAqIFRlbGwgdGhlIGtlcm5lbCB0byBjaGVjayBmb3IgdGhlIHNhbWUgZXZlbnRzIHdlJ3JlIGFscmVhZHkgY2hlY2tpbmcgZm9yCisgICAgICogd2l0aCB0aGlzIEZELiBUaGlzIGlzIHRvIGJlIHVzZWQgd2hlbiB0aGVyZSBpcyBhIGtlcm5lbCBkcml2ZXIgYnVnIHdoZXJlCisgICAgICogdGhlIGtlcm5lbCBkb2VzIG5vdCBwcm9wZXJseSBtYXJrIGl0c2VsZiBhcyBoYXZpbmcgbmV3IGRhdGEgYXZhaWxhYmxlLCBpbgorICAgICAqIG9yZGVyIHRvIGZvcmNlICJmZF9vcC0+cG9sbCgpIiB0byBiZSBjYWxsZWQuIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvCisgICAgICogdXNlIHRoaXMgaW4gZ2VuZXJhbCwgYW5kIHlvdSBzaG91bGRuJ3QgdXNlIGl0IHVubGVzcyB0aGVyZSBpcyBhIHBsYW4gdG8KKyAgICAgKiBmaXggdGhlIGtlcm5lbC4gU2VlIGFsc28gYi8yOTY4MTcyNTYuCisgICAgICoKKyAgICAgKiBSZXR1cm5zIDEgaWYgc3VjY2Vzc2Z1bGx5IHJlcG9sbGVkLCAwIGlmIG5vdC4KKyAgICAgKi8KKyAgICBpbnQgcmVwb2xsKGludCBmZCk7CisKKyAgICAvKioKICAgICAgKiBFbnF1ZXVlcyBhIG1lc3NhZ2UgdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSBzcGVjaWZpZWQgaGFuZGxlci4KICAgICAgKgogICAgICAqIFRoZSBoYW5kbGVyIG11c3Qgbm90IGJlIG51bGwuCkBAIC00ODcsOCArNTA1LDYgQEAKICAgICB2b2lkIHJlYnVpbGRFcG9sbExvY2tlZCgpOwogICAgIHZvaWQgc2NoZWR1bGVFcG9sbFJlYnVpbGRMb2NrZWQoKTsKIAotICAgIHN0YXRpYyB2b2lkIGluaXRUTFNLZXkoKTsKLSAgICBzdGF0aWMgdm9pZCB0aHJlYWREZXN0cnVjdG9yKHZvaWQgKnN0KTsKICAgICBzdGF0aWMgdm9pZCBpbml0RXBvbGxFdmVudChzdHJ1Y3QgZXBvbGxfZXZlbnQqIGV2ZW50SXRlbSk7CiB9OwogCmRpZmYgLS1naXQgYS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0xydUNhY2hlLmggYi9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL0xydUNhY2hlLmgKaW5kZXggYjQyNDNhMy4uNzA5MDFiNiAxMDA2NDQKLS0tIGEvbGlidXRpbHMvaW5jbHVkZS91dGlscy9McnVDYWNoZS5oCisrKyBiL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvTHJ1Q2FjaGUuaApAQCAtMTYxLDEyICsxNjEsMTIgQEAKIC8vIEltcGxlbWVudGF0aW9uIGlzIGhlcmUsIGJlY2F1c2UgaXQncyBmdWxseSB0ZW1wbGF0ZWQKIHRlbXBsYXRlIDx0eXBlbmFtZSBUS2V5LCB0eXBlbmFtZSBUVmFsdWU+CiBMcnVDYWNoZTxUS2V5LCBUVmFsdWU+OjpMcnVDYWNoZSh1aW50MzJfdCBtYXhDYXBhY2l0eSkKLSAgICA6IG1TZXQobmV3IExydUNhY2hlU2V0KCkpCi0gICAgLCBtTGlzdGVuZXIobnVsbHB0cikKLSAgICAsIG1PbGRlc3QobnVsbHB0cikKLSAgICAsIG1Zb3VuZ2VzdChudWxscHRyKQotICAgICwgbU1heENhcGFjaXR5KG1heENhcGFjaXR5KQotICAgICwgbU51bGxWYWx1ZSgwKSB7CisgICAgOiBtU2V0KG5ldyBMcnVDYWNoZVNldCgpKSwKKyAgICAgIG1MaXN0ZW5lcihudWxscHRyKSwKKyAgICAgIG1PbGRlc3QobnVsbHB0ciksCisgICAgICBtWW91bmdlc3QobnVsbHB0ciksCisgICAgICBtTWF4Q2FwYWNpdHkobWF4Q2FwYWNpdHkpLAorICAgICAgbU51bGxWYWx1ZXt9IHsKICAgICBtU2V0LT5tYXhfbG9hZF9mYWN0b3IoMS4wKTsKIH07CiAKZGlmZiAtLWdpdCBhL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIGIvbGlidXRpbHMvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uODZkNzJiMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL2JpbmRlci9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCBiL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5iODg3OTJmCi0tLSAvZGV2L251bGwKKysrIGIvbGlidXRpbHMvaW5jbHVkZS91dGlscy9TdHJpbmcxNi5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL2JpbmRlci9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCBiL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmZhNWEwODIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cmluZzguaApAQCAtMCwwICsxIEBACisuLi8uLi9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJpbmc4LmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaCBiL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmZkOGJjNjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaApAQCAtMCwwICsxIEBACisuLi8uLi9iaW5kZXIvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1RyYWNlLmggYi9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1RyYWNlLmgKaW5kZXggOTk4NmJmNS4uMTgwOTEwMCAxMDA2NDQKLS0tIGEvbGlidXRpbHMvaW5jbHVkZS91dGlscy9UcmFjZS5oCisrKyBiL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHJhY2UuaApAQCAtMTcsMTMgKzE3LDYgQEAKICNpZm5kZWYgQU5EUk9JRF9UUkFDRV9ICiAjZGVmaW5lIEFORFJPSURfVFJBQ0VfSAogCi0jaWYgZGVmaW5lZChfV0lOMzIpCi0KLSNkZWZpbmUgQVRSQUNFX05BTUUoLi4uKQotI2RlZmluZSBBVFJBQ0VfQ0FMTCgpCi0KLSNlbHNlICAvLyAhX1dJTjMyCi0KICNpbmNsdWRlIDxzdGRpbnQuaD4KIAogI2luY2x1ZGUgPGN1dGlscy90cmFjZS5oPgpAQCAtNTYsNiArNDksNCBAQAogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCi0jZW5kaWYgIC8vIF9XSU4zMgotCiAjZW5kaWYgLy8gQU5EUk9JRF9UUkFDRV9ICmRpZmYgLS1naXQgYS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmggYi9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uODQ4ZjZkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaApAQCAtMCwwICsxIEBACisuLi8uLi9iaW5kZXIvaW5jbHVkZS91dGlscy9UeXBlSGVscGVycy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmggYi9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi44YTQ4MGJjCi0tLSAvZGV2L251bGwKKysrIGIvbGlidXRpbHMvaW5jbHVkZS91dGlscy9Vbmljb2RlLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vYmluZGVyL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGlidXRpbHMvaW5jbHVkZS91dGlscy9WZWN0b3IuaCBiL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZTE1NzFlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vYmluZGVyL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaCBiL2xpYnV0aWxzL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjQ3MjY0NDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ1dGlscy9pbmNsdWRlL3V0aWxzL1ZlY3RvckltcGwuaApAQCAtMCwwICsxIEBACisuLi8uLi9iaW5kZXIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJ1dGlscy9taXNjLmNwcCBiL2xpYnV0aWxzL21pc2MuY3BwCmluZGV4IGY3N2UxODkuLmUxYjVmMDEgMTAwNjQ0Ci0tLSBhL2xpYnV0aWxzL21pc2MuY3BwCisrKyBiL2xpYnV0aWxzL21pc2MuY3BwCkBAIC0yMCw3ICsyMCw3IEBACiAKICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKICNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfUkVDT1ZFUllfXykKZGlmZiAtLWdpdCBhL2xpYnByb2Nlc3Nncm91cC9jZ3JvdXByY19mb3JtYXQvQW5kcm9pZC5icCBiL2xpYnZlbmRvcnN1cHBvcnQvQW5kcm9pZC5icApzaW1pbGFyaXR5IGluZGV4IDcyJQpyZW5hbWUgZnJvbSBsaWJwcm9jZXNzZ3JvdXAvY2dyb3VwcmNfZm9ybWF0L0FuZHJvaWQuYnAKcmVuYW1lIHRvIGxpYnZlbmRvcnN1cHBvcnQvQW5kcm9pZC5icAppbmRleCAwNTkwOTI0Li5mOWE4ODliIDEwMDY0NAotLS0gYS9saWJwcm9jZXNzZ3JvdXAvY2dyb3VwcmNfZm9ybWF0L0FuZHJvaWQuYnAKKysrIGIvbGlidmVuZG9yc3VwcG9ydC9BbmRyb2lkLmJwCkBAIC0xLDQgKzEsNCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAvLwogLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNiwyNCArMTYsMjIgQEAKICAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCiB9CiAKLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGliY2dyb3VwcmNfZm9ybWF0IiwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICByYW1kaXNrX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICB2ZW5kb3JfcmFtZGlza19hdmFpbGFibGU6IHRydWUsCi0gICAgcmVjb3ZlcnlfYXZhaWxhYmxlOiB0cnVlLAorY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYnZlbmRvcnN1cHBvcnQiLAogICAgIG5hdGl2ZV9icmlkZ2Vfc3VwcG9ydGVkOiB0cnVlLAotICAgIHNyY3M6IFsKLSAgICAgICAgImNncm91cF9jb250cm9sbGVyLmNwcCIsCi0gICAgXSwKKyAgICByZWNvdmVyeV9hdmFpbGFibGU6IHRydWUsCisgICAgbGxuZGs6IHsKKyAgICAgICAgc3ltYm9sX2ZpbGU6ICJsaWJ2ZW5kb3JzdXBwb3J0Lm1hcC50eHQiLAorICAgIH0sCisgICAgc3JjczogWyJ2ZXJzaW9uX3Byb3BzLmNwcCJdLAogICAgIGNmbGFnczogWwogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJpbmNsdWRlIiwKLSAgICBdLAorICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJpbmNsdWRlL3ZlbmRvcnN1cHBvcnQiXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYmJhc2UiLAogICAgIF0sCiB9CmRpZmYgLS1naXQgYS9saWJ2ZW5kb3JzdXBwb3J0L09XTkVSUyBiL2xpYnZlbmRvcnN1cHBvcnQvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYjE4ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2ZW5kb3JzdXBwb3J0L09XTkVSUwpAQCAtMCwwICsxLDIgQEAKK2ppeW9uZ0Bnb29nbGUuY29tCitqdXN0aW55dW5AZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbGlidmVuZG9yc3VwcG9ydC9URVNUX01BUFBJTkcgYi9saWJ2ZW5kb3JzdXBwb3J0L1RFU1RfTUFQUElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmQwOWJhCi0tLSAvZGV2L251bGwKKysrIGIvbGlidmVuZG9yc3VwcG9ydC9URVNUX01BUFBJTkcKQEAgLTAsMCArMSw3IEBACit7CisgICJwb3N0c3VibWl0IjogWworICAgIHsKKyAgICAgICJuYW1lIjogImxpYnZlbmRvcnN1cHBvcnQtdGVzdHMiCisgICAgfQorICBdCit9CmRpZmYgLS1naXQgYS9saWJ2ZW5kb3JzdXBwb3J0L2luY2x1ZGUvdmVuZG9yc3VwcG9ydC9hcGlfbGV2ZWwuaCBiL2xpYnZlbmRvcnN1cHBvcnQvaW5jbHVkZS92ZW5kb3JzdXBwb3J0L2FwaV9sZXZlbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MjdiYzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2ZW5kb3JzdXBwb3J0L2luY2x1ZGUvdmVuZG9yc3VwcG9ydC9hcGlfbGV2ZWwuaApAQCAtMCwwICsxLDY1IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKworX19CRUdJTl9ERUNMUworCisjZGVmaW5lIF9fQU5EUk9JRF9WRU5ET1JfQVBJX01BWF9fIDEwMDAwMDAKKyNkZWZpbmUgX19JTlZBTElEX0FQSV9MRVZFTCAtMQorCisvKioKKyAqIEBicmllZiBGaW5kIGNvcnJlc3BvbmRpbmcgdmVuZG9yIEFQSSBsZXZlbCBmcm9tIGFuIFNESyBBUEkgdmVyc2lvbi4KKyAqCisgKiBAZGV0YWlscworICogU0RLIEFQSSB2ZXJzaW9ucyBhbmQgdmVuZG9yIEFQSSBsZXZlbHMgYXJlIG5vdCBjb21wYXRpYmxlIGFuZCBub3QKKyAqIGV4Y2hhbmdlYWJsZS4gSG93ZXZlciwgdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjb21wYXJlIHRoZSB0d28gdmVyc2lvbnMKKyAqIHRvIGtub3cgd2hpY2ggb25lIGlzIG5ld2VyIHRoYW4gdGhlIG90aGVyLgorICoKKyAqIEBwYXJhbSBzZGtBcGlMZXZlbCBUaGUgU0RLIHZlcnNpb24gaW50LiBUaGlzIG11c3QgYmUgbGVzcyB0aGFuIDEwMDAwLgorICogQHJldHVybiBUaGUgY29ycmVzcG9uZGluZyB2ZW5kb3IgQVBJIGxldmVsIG9mIHRoZSBTREsgdmVyc2lvbi4gLTEgaWYgdGhlIFNESworICogdmVyc2lvbiBpcyBpbnZhbGlkIG9yIDEwMDAwLgorICovCitpbnQgQVZlbmRvclN1cHBvcnRfZ2V0VmVuZG9yQXBpTGV2ZWxPZihpbnQgc2RrQXBpTGV2ZWwpOworCisvKioKKyAqIEBicmllZiBGaW5kIGNvcnJlc3BvbmRpbmcgU0RLIEFQSSB2ZXJzaW9uIGZyb20gYSB2ZW5kb3IgQVBJIGxldmVsLgorICoKKyAqIEBwYXJhbSB2ZW5kb3JBcGlMZXZlbCBUaGUgdmVuZG9yIEFQSSBsZXZlbCBpbnQuCisgKiBAcmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIFNESyBBUEkgdmVyc2lvbiBvZiB0aGUgdmVuZG9yIEFQSSBsZXZlbC4gLTEgaWYgdGhlCisgKiB2ZW5kb3IgQVBJIGxldmVsIGlzIGludmFsaWQuCisgKi8KK2ludCBBVmVuZG9yU3VwcG9ydF9nZXRTZGtBcGlMZXZlbE9mKGludCB2ZW5kb3JBcGlMZXZlbCk7CisKKyNpZiAhZGVmaW5lZChfX0FORFJPSURfVkVORE9SX18pCisvKioKKyAqIEBicmllZiBQcm92aWRlIHZlbmRvciBBUEkgbGV2ZWwgdG8gc3lzdGVtIG1vZHVsZXMuCisgKgorICogQGRldGFpbHMKKyAqIEJlZm9yZSBkZXByZWNhdGluZyBWTkRLLCBzeXN0ZW0gbW9kdWxlcyByZWFkIHJvLnZuZGsudmVyc2lvbiB0byBmaW5kIHRoZQorICogQVBJIGxldmVsIHRoYXQgdmVuZG9yIGltYWdlIGhhZCBpbXBsZW1lbnRlZC4gV2l0aCB0aGUgVk5ESyBkZXByZWNhdGlvbiwgdGhpcworICogbXVzdCBiZSByZXBsYWNlZCB3aXRoIHJvLmJvYXJkLmFwaV9sZXZlbC4gSG93ZXZlciwgdGhlcmUgc3RpbGwgYXJlIGRldmljZXMKKyAqIGtlZXBpbmcgb2xkIHZlbmRvciBwYXJ0aXRpb25zIHdpdGggdGhlIG5ldyBzeXN0ZW0gdXBncmFkZWQuIEluIHRoaXMgY2FzZSwgdGhlCisgKiBWTkRLIHZlcnNpb24gY2FuIGJlIHVzZWQgYXMgYmVmb3JlLgorICogVGhpcyBBUEkgaXMgZm9yIHBsYXRmb3JtIG9ubHkuCisgKgorICogQHJldHVybiByby52bmRrLnZlcnNpb24gaWYgZXhpc3QuIE90aGVyd2lzZSBmYWxsYmFjayB0byByby5ib2FyZC5hcGlfbGV2ZWwuCisgKiAwIGlmIG5vbmUgb2YgdGhlc2UgcHJvcGVydGllcyBhcmUgZm91bmQuIFRoaXMgaXMgdW5leHBlY3RlZCwgdGhvdWdoLgorICovCitpbnQgQVZlbmRvclN1cHBvcnRfZ2V0VmVuZG9yQXBpTGV2ZWwoKTsKKyNlbmRpZiAgLy8gX19BTkRST0lEX1ZFTkRPUl9fCisKK19fRU5EX0RFQ0xTCmRpZmYgLS1naXQgYS9saWJ2ZW5kb3JzdXBwb3J0L2xpYnZlbmRvcnN1cHBvcnQubWFwLnR4dCBiL2xpYnZlbmRvcnN1cHBvcnQvbGlidmVuZG9yc3VwcG9ydC5tYXAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5OWM4MzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJ2ZW5kb3JzdXBwb3J0L2xpYnZlbmRvcnN1cHBvcnQubWFwLnR4dApAQCAtMCwwICsxLDcgQEAKK0xJQlZFTkRPUlNVUFBPUlQgeworICBnbG9iYWw6CisgICAgQVZlbmRvclN1cHBvcnRfZ2V0VmVuZG9yQXBpTGV2ZWxPZjsgIyBsbG5kayBzeXN0ZW1hcGkKKyAgICBBVmVuZG9yU3VwcG9ydF9nZXRTZGtBcGlMZXZlbE9mOyAjIGxsbmRrIHN5c3RlbWFwaQorICBsb2NhbDoKKyAgICAqOworfTsKZGlmZiAtLWdpdCBhL2xpYnByb2Nlc3Nncm91cC9jZ3JvdXByY19mb3JtYXQvQW5kcm9pZC5icCBiL2xpYnZlbmRvcnN1cHBvcnQvdGVzdHMvQW5kcm9pZC5icApzaW1pbGFyaXR5IGluZGV4IDY2JQpjb3B5IGZyb20gbGlicHJvY2Vzc2dyb3VwL2Nncm91cHJjX2Zvcm1hdC9BbmRyb2lkLmJwCmNvcHkgdG8gbGlidmVuZG9yc3VwcG9ydC90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDA1OTA5MjQuLjQyZTMzNzEgMTAwNjQ0Ci0tLSBhL2xpYnByb2Nlc3Nncm91cC9jZ3JvdXByY19mb3JtYXQvQW5kcm9pZC5icAorKysgYi9saWJ2ZW5kb3JzdXBwb3J0L3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTEsNCArMSw0IEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8gQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKIC8vCiAvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIC8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE2LDI0ICsxNiwxOCBAQAogICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJBbmRyb2lkLUFwYWNoZS0yLjAiXSwKIH0KIAotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWJjZ3JvdXByY19mb3JtYXQiLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotICAgIHJhbWRpc2tfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZlbmRvcl9yYW1kaXNrX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICByZWNvdmVyeV9hdmFpbGFibGU6IHRydWUsCi0gICAgbmF0aXZlX2JyaWRnZV9zdXBwb3J0ZWQ6IHRydWUsCitjY190ZXN0IHsKKyAgICBuYW1lOiAibGlidmVuZG9yc3VwcG9ydC10ZXN0cyIsCiAgICAgc3JjczogWwotICAgICAgICAiY2dyb3VwX2NvbnRyb2xsZXIuY3BwIiwKKyAgICAgICAgInZlcnNpb25fcHJvcHNfdGVzdC5jcHAiLAogICAgIF0sCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2FsbCIsCiAgICAgICAgICItV2Vycm9yIiwKICAgICBdLAotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImluY2x1ZGUiLAotICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGlidmVuZG9yc3VwcG9ydCIsCiAgICAgXSwKKyAgICB0ZXN0X3N1aXRlczogWyJnZW5lcmFsLXRlc3RzIl0sCiB9CisKZGlmZiAtLWdpdCBhL2xpYnZlbmRvcnN1cHBvcnQvdGVzdHMvdmVyc2lvbl9wcm9wc190ZXN0LmNwcCBiL2xpYnZlbmRvcnN1cHBvcnQvdGVzdHMvdmVyc2lvbl9wcm9wc190ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDU0Yzg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlidmVuZG9yc3VwcG9ydC90ZXN0cy92ZXJzaW9uX3Byb3BzX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDx2ZW5kb3JzdXBwb3J0L2FwaV9sZXZlbC5oPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgeworCitURVNUKFZlbmRvclN1cHBvcnQsIEdldENvcnJlc3BvbmRpbmdWZW5kb3JBcGlMZXZlbCkgeworICAgIEFTU0VSVF9FUShfX0FORFJPSURfQVBJX1VfXywgQVZlbmRvclN1cHBvcnRfZ2V0VmVuZG9yQXBpTGV2ZWxPZihfX0FORFJPSURfQVBJX1VfXykpOworICAgIEFTU0VSVF9FUSgyMDI0MDQsIEFWZW5kb3JTdXBwb3J0X2dldFZlbmRvckFwaUxldmVsT2YoX19BTkRST0lEX0FQSV9WX18pKTsKKyAgICBBU1NFUlRfRVEoX19JTlZBTElEX0FQSV9MRVZFTCwgQVZlbmRvclN1cHBvcnRfZ2V0VmVuZG9yQXBpTGV2ZWxPZihfX0FORFJPSURfQVBJX0ZVVFVSRV9fKSk7Cit9CisKK1RFU1QoVmVuZG9yU3VwcG9ydCwgR2V0Q29ycmVzcG9uZGluZ1Nka0FwaUxldmVsKSB7CisgICAgQVNTRVJUX0VRKF9fQU5EUk9JRF9BUElfVV9fLCBBVmVuZG9yU3VwcG9ydF9nZXRTZGtBcGlMZXZlbE9mKF9fQU5EUk9JRF9BUElfVV9fKSk7CisgICAgQVNTRVJUX0VRKF9fQU5EUk9JRF9BUElfVl9fLCBBVmVuZG9yU3VwcG9ydF9nZXRTZGtBcGlMZXZlbE9mKDIwMjQwNCkpOworICAgIEFTU0VSVF9FUShfX0lOVkFMSURfQVBJX0xFVkVMLCBBVmVuZG9yU3VwcG9ydF9nZXRTZGtBcGlMZXZlbE9mKF9fQU5EUk9JRF9WRU5ET1JfQVBJX01BWF9fKSk7CisgICAgQVNTRVJUX0VRKF9fSU5WQUxJRF9BUElfTEVWRUwsIEFWZW5kb3JTdXBwb3J0X2dldFNka0FwaUxldmVsT2YoMzUpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGlidmVuZG9yc3VwcG9ydC92ZXJzaW9uX3Byb3BzLmNwcCBiL2xpYnZlbmRvcnN1cHBvcnQvdmVyc2lvbl9wcm9wcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNiYTg5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnZlbmRvcnN1cHBvcnQvdmVyc2lvbl9wcm9wcy5jcHAKQEAgLTAsMCArMSw1NSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhcGlfbGV2ZWwuaCIKKworI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2lmICFkZWZpbmVkKF9fQU5EUk9JRF9WRU5ET1JfXykKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2VuZGlmCisKK2ludCBBVmVuZG9yU3VwcG9ydF9nZXRWZW5kb3JBcGlMZXZlbE9mKGludCBzZGtBcGlMZXZlbCkgeworICAgIGlmIChzZGtBcGlMZXZlbCA8IF9fQU5EUk9JRF9BUElfVl9fKSB7CisgICAgICAgIHJldHVybiBzZGtBcGlMZXZlbDsKKyAgICB9CisgICAgLy8gSW4gQW5kcm9pZCBWLCB2ZW5kb3IgQVBJIGxldmVsIHN0YXJ0ZWQgd2l0aCB2ZXJzaW9uIDIwMjQwNC4KKyAgICAvLyBUaGUgY2FsY3VsYXRpb24gYXNzdW1lcyB0aGF0IHRoZSBTREsgYXBpIGxldmVsIGJ1bXBzIG9uY2UgYSB5ZWFyLgorICAgIGlmIChzZGtBcGlMZXZlbCA8IF9fQU5EUk9JRF9BUElfRlVUVVJFX18pIHsKKyAgICAgICAgcmV0dXJuIDIwMjQwNCArICgoc2RrQXBpTGV2ZWwgLSBfX0FORFJPSURfQVBJX1ZfXykgKiAxMDApOworICAgIH0KKyAgICBBTE9HRSgiVGhlIFNESyB2ZXJzaW9uIG11c3QgYmUgbGVzcyB0aGFuIDEwMDAwOiAlZCIsIHNka0FwaUxldmVsKTsKKyAgICByZXR1cm4gX19JTlZBTElEX0FQSV9MRVZFTDsKK30KKworaW50IEFWZW5kb3JTdXBwb3J0X2dldFNka0FwaUxldmVsT2YoaW50IHZlbmRvckFwaUxldmVsKSB7CisgICAgaWYgKHZlbmRvckFwaUxldmVsIDwgX19BTkRST0lEX0FQSV9WX18pIHsKKyAgICAgICAgcmV0dXJuIHZlbmRvckFwaUxldmVsOworICAgIH0KKyAgICBpZiAodmVuZG9yQXBpTGV2ZWwgPj0gMjAyNDA0ICYmIHZlbmRvckFwaUxldmVsIDwgX19BTkRST0lEX1ZFTkRPUl9BUElfTUFYX18pIHsKKyAgICAgICAgcmV0dXJuICh2ZW5kb3JBcGlMZXZlbCAtIDIwMjQwNCkgLyAxMDAgKyBfX0FORFJPSURfQVBJX1ZfXzsKKyAgICB9CisgICAgQUxPR0UoIlVuZXhwZWN0ZWQgdmVuZG9yIGFwaSBsZXZlbDogJWQiLCB2ZW5kb3JBcGlMZXZlbCk7CisgICAgcmV0dXJuIF9fSU5WQUxJRF9BUElfTEVWRUw7Cit9CisKKyNpZiAhZGVmaW5lZChfX0FORFJPSURfVkVORE9SX18pCitpbnQgQVZlbmRvclN1cHBvcnRfZ2V0VmVuZG9yQXBpTGV2ZWwoKSB7CisgICAgaW50IHZlbmRvckFwaUxldmVsID0gYW5kcm9pZDo6YmFzZTo6R2V0SW50UHJvcGVydHkoInJvLnZuZGsudmVyc2lvbiIsIDApOworICAgIGlmICh2ZW5kb3JBcGlMZXZlbCkgeworICAgICAgICByZXR1cm4gdmVuZG9yQXBpTGV2ZWw7CisgICAgfQorICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpHZXRJbnRQcm9wZXJ0eSgicm8uYm9hcmQuYXBpX2xldmVsIiwgMCk7Cit9CisjZW5kaWYgIC8vIF9fQU5EUk9JRF9WRU5ET1JfXwpkaWZmIC0tZ2l0IGEvbGlidm5ka3N1cHBvcnQvaW5jbHVkZS92bmRrc3VwcG9ydC9saW5rZXIuaCBiL2xpYnZuZGtzdXBwb3J0L2luY2x1ZGUvdm5ka3N1cHBvcnQvbGlua2VyLmgKaW5kZXggNWY0OGMzOS4uNjg0NTEzNSAxMDA2NDQKLS0tIGEvbGlidm5ka3N1cHBvcnQvaW5jbHVkZS92bmRrc3VwcG9ydC9saW5rZXIuaAorKysgYi9saWJ2bmRrc3VwcG9ydC9pbmNsdWRlL3ZuZGtzdXBwb3J0L2xpbmtlci5oCkBAIC0yMCwxNSArMjAsOCBAQAogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAotLyoKLSAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBwcm9jZXNzIGlzIGEgdmVuZG9yIHByb2Nlc3MuCi0gKgotICogTm90ZSB0aGF0IHRoaXMgaXMgb25seSBjaGVja2luZyB3aGF0IHByb2Nlc3MgaXMgcnVubmluZyBhbmQgaGFzIG5vdGhpbmcgdG8KLSAqIGRvIHdpdGggd2hhdCBuYW1lc3BhY2UgdGhlIGNhbGxlciBpcyBsb2FkZWQgYXQuICBGb3IgZXhhbXBsZSwgYSBWTkRLLVNQCi0gKiBsaWJyYXJ5IGxvYWRlZCBieSBTUC1IQUwgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIG1heSBzdGlsbCBnZXQgYSAnZmFsc2UnLAotICogYmVjYXVzZSBpdCBpcyBydW5uaW5nIGluIGEgc3lzdGVtIHByb2Nlc3MuCi0gKi8KLWludCBhbmRyb2lkX2lzX2luX3ZlbmRvcl9wcm9jZXNzKCk7CitpbnQgYW5kcm9pZF9pc19pbl92ZW5kb3JfcHJvY2VzcygpIF9fYXR0cmlidXRlX18oKAorICAgICAgICBkZXByZWNhdGVkKCJUaGlzIGZ1bmN0aW9uIHdvdWxkIG5vdCBnaXZlIGV4YWN0IHJlc3VsdCBpZiBWTkRLIGlzIGRlcHJlY2F0ZWQuIikpKTsKIAogdm9pZCogYW5kcm9pZF9sb2FkX3NwaGFsX2xpYnJhcnkoY29uc3QgY2hhciogbmFtZSwgaW50IGZsYWcpOwogCmRpZmYgLS1naXQgYS9saWJ2bmRrc3VwcG9ydC9saWJ2bmRrc3VwcG9ydC5tYXAudHh0IGIvbGlidm5ka3N1cHBvcnQvbGlidm5ka3N1cHBvcnQubWFwLnR4dAppbmRleCAxZDk0YjlkLi4zMjU1MDVkIDEwMDY0NAotLS0gYS9saWJ2bmRrc3VwcG9ydC9saWJ2bmRrc3VwcG9ydC5tYXAudHh0CisrKyBiL2xpYnZuZGtzdXBwb3J0L2xpYnZuZGtzdXBwb3J0Lm1hcC50eHQKQEAgLTEsNiArMSw2IEBACiBMSUJWTkRLU1VQUE9SVCB7CiAgIGdsb2JhbDoKLSAgICBhbmRyb2lkX2lzX2luX3ZlbmRvcl9wcm9jZXNzOyAjIGxsbmRrIHN5c3RlbWFwaQorICAgIGFuZHJvaWRfaXNfaW5fdmVuZG9yX3Byb2Nlc3M7ICMgbGxuZGstZGVwcmVjYXRlZD0zNSBzeXN0ZW1hcGkKICAgICBhbmRyb2lkX2xvYWRfc3BoYWxfbGlicmFyeTsgIyBsbG5kayBzeXN0ZW1hcGkKICAgICBhbmRyb2lkX3VubG9hZF9zcGhhbF9saWJyYXJ5OyAjIGxsbmRrIHN5c3RlbWFwaQogICBsb2NhbDoKZGlmZiAtLWdpdCBhL2xpYnZuZGtzdXBwb3J0L2xpbmtlci5jcHAgYi9saWJ2bmRrc3VwcG9ydC9saW5rZXIuY3BwCmluZGV4IGFkNGZiMzEuLmIyYjI1N2UgMTAwNjQ0Ci0tLSBhL2xpYnZuZGtzdXBwb3J0L2xpbmtlci5jcHAKKysrIGIvbGlidm5ka3N1cHBvcnQvbGlua2VyLmNwcApAQCAtNzUsNyArNzUsNyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBoYW5kbGU7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0QoIkxvYWRpbmcgJXMgZnJvbSBjdXJyZW50IG5hbWVzcGFjZSBpbnN0ZWFkIG9mIHNwaGFsIG5hbWVzcGFjZS4iLCBuYW1lKTsKKyAgICAgICAgQUxPR1coIkxvYWRpbmcgJXMgZnJvbSBjdXJyZW50IG5hbWVzcGFjZSBpbnN0ZWFkIG9mIHNwaGFsIG5hbWVzcGFjZS4iLCBuYW1lKTsKICAgICAgICAgcmV0dXJuIGRsb3BlbihuYW1lLCBmbGFnKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9taW5pX2tleWN0bC9PV05FUlMgYi9taW5pX2tleWN0bC9PV05FUlMKaW5kZXggZjllN2IyNS4uMWYyNDg1YSAxMDA2NDQKLS0tIGEvbWluaV9rZXljdGwvT1dORVJTCisrKyBiL21pbmlfa2V5Y3RsL09XTkVSUwpAQCAtMSw0ICsxLDMgQEAKLWFsYW5zdG9rZXNAZ29vZ2xlLmNvbQogZWJpZ2dlcnNAZ29vZ2xlLmNvbQogamVmZnZAZ29vZ2xlLmNvbQogaml5b25nQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21rYm9vdGZzL0FuZHJvaWQuYnAgYi9ta2Jvb3Rmcy9BbmRyb2lkLmJwCmluZGV4IGNkMmE2MjQuLmUwMTkxZjAgMTAwNjQ0Ci0tLSBhL21rYm9vdGZzL0FuZHJvaWQuYnAKKysrIGIvbWtib290ZnMvQW5kcm9pZC5icApAQCAtNiw3ICs2LDcgQEAKIAogY2NfYmluYXJ5X2hvc3QgewogICAgIG5hbWU6ICJta2Jvb3RmcyIsCi0gICAgc3JjczogWyJta2Jvb3Rmcy5jIl0sCisgICAgc3JjczogWyJta2Jvb3Rmcy5jcHAiXSwKICAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJiYXNlIiwKZGlmZiAtLWdpdCBhL21rYm9vdGZzL21rYm9vdGZzLmMgYi9ta2Jvb3Rmcy9ta2Jvb3Rmcy5jcHAKc2ltaWxhcml0eSBpbmRleCA5MSUKcmVuYW1lIGZyb20gbWtib290ZnMvbWtib290ZnMuYwpyZW5hbWUgdG8gbWtib290ZnMvbWtib290ZnMuY3BwCmluZGV4IGQzOTIyYmYuLmE0NWM2YTIgMTAwNjQ0Ci0tLSBhL21rYm9vdGZzL21rYm9vdGZzLmMKKysrIGIvbWtib290ZnMvbWtib290ZnMuY3BwCkBAIC0xOSw2ICsxOSw5IEBACiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9mc19jb25maWcuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorCiAvKiBOT1RFUwogKioKICoqIC0gc2VlIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vZWFybHktdXNlcnNwYWNlL2J1ZmZlci1mb3JtYXQudHh0CkBAIC03NSw3ICs3OCw3IEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBfZWplY3Qoc3RydWN0IHN0YXQgKnMsIGNoYXIgKm91dCwgaW50IG9sZW4sIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGRhdGFzaXplKQorc3RhdGljIHZvaWQgX2VqZWN0KHN0cnVjdCBzdGF0ICpzLCBjb25zdCBjaGFyICpvdXQsIGludCBvbGVuLCBjaGFyICpkYXRhLCB1bnNpZ25lZCBkYXRhc2l6ZSkKIHsKICAgICAvLyBOb3RoaW5nIGlzIHNwZWNpYWwgYWJvdXQgdGhpcyB2YWx1ZSwganVzdCBwaWNrZWQgc29tZXRoaW5nIGluIHRoZQogICAgIC8vIGFwcHJveGltYXRlIHJhbmdlIHRoYXQgd2FzIGJlaW5nIHVzZWQgYWxyZWFkeSwgYW5kIGF2b2lkaW5nIHNtYWxsCkBAIC0xNTEsOSArMTU0LDEwIEBACiAgICAgRElSKiBkID0gb3BlbmRpcihpbik7CiAgICAgaWYgKGQgPT0gTlVMTCkgZXJyKDEsICJjYW5ub3Qgb3BlbiBkaXJlY3RvcnkgJyVzJyIsIGluKTsKIAorICAgIC8vIFRPRE86IHN3aXRjaCB0byBzdGQ6OnZlY3RvcgogICAgIGludCBzaXplID0gMzI7CiAgICAgaW50IGVudHJpZXMgPSAwOwotICAgIGNoYXIqKiBuYW1lcyA9IG1hbGxvYyhzaXplICogc2l6ZW9mKGNoYXIqKSk7CisgICAgY2hhcioqIG5hbWVzID0gKGNoYXIqKikgbWFsbG9jKHNpemUgKiBzaXplb2YoY2hhciopKTsKICAgICBpZiAobmFtZXMgPT0gTlVMTCkgewogICAgICAgZXJyeCgxLCAiZmFpbGVkIHRvIGFsbG9jYXRlIGRpciBuYW1lcyBhcnJheSAoc2l6ZSAlZCkiLCBzaXplKTsKICAgICB9CkBAIC0xNjcsNyArMTcxLDcgQEAKIAogICAgICAgICBpZiAoZW50cmllcyA+PSBzaXplKSB7CiAgICAgICAgICAgc2l6ZSAqPSAyOwotICAgICAgICAgIG5hbWVzID0gcmVhbGxvYyhuYW1lcywgc2l6ZSAqIHNpemVvZihjaGFyKikpOworICAgICAgICAgIG5hbWVzID0gKGNoYXIqKikgcmVhbGxvYyhuYW1lcywgc2l6ZSAqIHNpemVvZihjaGFyKikpOwogICAgICAgICAgIGlmIChuYW1lcyA9PSBOVUxMKSB7CiAgICAgICAgICAgICBlcnJ4KDEsICJmYWlsZWQgdG8gcmVhbGxvY2F0ZSBkaXIgbmFtZXMgYXJyYXkgKHNpemUgJWQpIiwgc2l6ZSk7CiAgICAgICAgICAgfQpAQCAtMjExLDIwICsyMTUsMTIgQEAKICAgICBpZihsc3RhdChpbiwgJnMpKSBlcnIoMSwgImNvdWxkIG5vdCBzdGF0ICclcyciLCBpbik7CiAKICAgICBpZihTX0lTUkVHKHMuc3RfbW9kZSkpewotICAgICAgICBpbnQgZmQgPSBvcGVuKGluLCBPX1JET05MWSk7Ci0gICAgICAgIGlmKGZkIDwgMCkgZXJyKDEsICJjYW5ub3Qgb3BlbiAnJXMnIGZvciByZWFkIiwgaW4pOwotCi0gICAgICAgIGNoYXIqIHRtcCA9IChjaGFyKikgbWFsbG9jKHMuc3Rfc2l6ZSk7Ci0gICAgICAgIGlmKHRtcCA9PSAwKSBlcnJ4KDEsICJjYW5ub3QgYWxsb2NhdGUgJXpkIGJ5dGVzIiwgcy5zdF9zaXplKTsKLQotICAgICAgICBpZihyZWFkKGZkLCB0bXAsIHMuc3Rfc2l6ZSkgIT0gcy5zdF9zaXplKSB7Ci0gICAgICAgICAgICBlcnIoMSwgImNhbm5vdCByZWFkICV6ZCBieXRlcyIsIHMuc3Rfc2l6ZSk7CisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnQ7CisgICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZyhpbiwgJmNvbnRlbnQpKSB7CisgICAgICAgICAgICBlcnIoMSwgImNhbm5vdCByZWFkICclcyciLCBpbik7CiAgICAgICAgIH0KIAotICAgICAgICBfZWplY3QoJnMsIG91dCwgb2xlbiwgdG1wLCBzLnN0X3NpemUpOwotCi0gICAgICAgIGZyZWUodG1wKTsKLSAgICAgICAgY2xvc2UoZmQpOworICAgICAgICBfZWplY3QoJnMsIG91dCwgb2xlbiwgY29udGVudC5kYXRhKCksIGNvbnRlbnQuc2l6ZSgpKTsKICAgICB9IGVsc2UgaWYoU19JU0RJUihzLnN0X21vZGUpKSB7CiAgICAgICAgIF9lamVjdCgmcywgb3V0LCBvbGVuLCAwLCAwKTsKICAgICAgICAgX2FyY2hpdmVfZGlyKGluLCBvdXQsIGlsZW4sIG9sZW4pOwpAQCAtNDAyLDcgKzM5OCw3IEBACiBzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQogewogICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICAgIlVzYWdlOiBta2Jvb3RmcyBbLW4gRklMRV0gWy1kIERJUnwtRiBGSUxFXSBESVIuLi5cbiIKKyAgICAgICAgICAgICJVc2FnZTogbWtib290ZnMgWy1uIEZJTEVdIFstZCBESVJ8LWYgRklMRV0gRElSLi4uXG4iCiAgICAgICAgICAgICAiXG4iCiAgICAgICAgICAgICAiXHQtZCwgLS1kaXJuYW1lPURJUjogZnMtY29uZmlnIGRpcmVjdG9yeVxuIgogICAgICAgICAgICAgIlx0LWYsIC0tZmlsZT1GSUxFOiBDYW5uZWQgY29uZmlndXJhdGlvbiBmaWxlXG4iCkBAIC00MTAsMTEgKzQwNiwxMSBAQAogICAgICAgICAgICAgIlx0LW4sIC0tbm9kZXM9RklMRTogRGV2IG5vZGVzIGRlc2NyaXB0aW9uIGZpbGVcbiIKICAgICAgICAgICAgICJcbiIKICAgICAgICAgICAgICJEZXYgbm9kZXMgZGVzY3JpcHRpb246XG4iCi0gICAgICAgICAgICAiXHRbZGlyfG5vZF0gW3Blcm1zXSBbdWlkXSBbZ2lkXSBbY3xiXSBbbWlub3JdIFttYWpvcl1cbiIKKyAgICAgICAgICAgICJcdFtkaXJ8bm9kXSBbcGVybXNdIFt1aWRdIFtnaWRdIFtjfGJdIFttYWpvcl0gW21pbm9yXVxuIgogICAgICAgICAgICAgIlx0RXhhbXBsZTpcbiIKICAgICAgICAgICAgICJcdFx0IyBNeSBkZXZpY2Ugbm9kZXNcbiIKICAgICAgICAgICAgICJcdFx0ZGlyIGRldiAwNzU1IDAgMFxuIgotICAgICAgICAgICAgIlx0XHRub2QgZGV2L251bGwgMDYwMCAwIDAgYyAxIDVcbiIKKyAgICAgICAgICAgICJcdFx0bm9kIGRldi9udWxsIDA2MDAgMCAwIGMgMSAzXG4iCiAgICAgKTsKIH0KIApAQCAtNDQ1LDIwICs0NDEsMTIgQEAKICAgICBpbnQgbnVtX2RpcnMgPSBhcmdjIC0gb3B0aW5kOwogICAgIGFyZ3YgKz0gb3B0aW5kOwogCi0gICAgaWYgKG51bV9kaXJzIDw9IDApIHsKLSAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgZXJyeCgxLCAibm8gZGlyZWN0b3JpZXMgdG8gcHJvY2Vzcz8hIik7Ci0gICAgfQotCi0gICAgd2hpbGUobnVtX2RpcnMtLSA+IDApeworICAgIHdoaWxlIChudW1fZGlycy0tID4gMCl7CiAgICAgICAgIGNoYXIgKnggPSBzdHJjaHIoKmFyZ3YsICc9Jyk7Ci0gICAgICAgIGlmKHggIT0gMCkgewotICAgICAgICAgICAgKngrKyA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB4ID0gIiI7CisgICAgICAgIGlmICh4ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICp4KysgPSAnXDAnOwogICAgICAgICB9Ci0KLSAgICAgICAgYXJjaGl2ZSgqYXJndiwgeCk7CisgICAgICAgIGFyY2hpdmUoKmFyZ3YsIHggPzogIiIpOwogCiAgICAgICAgIGFyZ3YrKzsKICAgICB9CmRpZmYgLS1naXQgYS9wcm9wZXJ0eV9zZXJ2aWNlL2xpYnByb3BlcnR5aW5mb3BhcnNlci9BbmRyb2lkLmJwIGIvcHJvcGVydHlfc2VydmljZS9saWJwcm9wZXJ0eWluZm9wYXJzZXIvQW5kcm9pZC5icAppbmRleCA4NzY0NmY5Li5iNGExNmQzIDEwMDY0NAotLS0gYS9wcm9wZXJ0eV9zZXJ2aWNlL2xpYnByb3BlcnR5aW5mb3BhcnNlci9BbmRyb2lkLmJwCisrKyBiL3Byb3BlcnR5X3NlcnZpY2UvbGlicHJvcGVydHlpbmZvcGFyc2VyL0FuZHJvaWQuYnAKQEAgLTI1LDQgKzI1LDggQEAKICAgICAgICAgfSwKICAgICB9LAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLnJ1bnRpbWUiLAorICAgIF0sCiB9CmRpZmYgLS1naXQgYS9wcm9wZXJ0eV9zZXJ2aWNlL2xpYnByb3BlcnR5aW5mb3BhcnNlci9pbmNsdWRlL3Byb3BlcnR5X2luZm9fcGFyc2VyL3Byb3BlcnR5X2luZm9fcGFyc2VyLmggYi9wcm9wZXJ0eV9zZXJ2aWNlL2xpYnByb3BlcnR5aW5mb3BhcnNlci9pbmNsdWRlL3Byb3BlcnR5X2luZm9fcGFyc2VyL3Byb3BlcnR5X2luZm9fcGFyc2VyLmgKaW5kZXggMDU0ODAyMS4uNjU3MDVhYyAxMDA2NDQKLS0tIGEvcHJvcGVydHlfc2VydmljZS9saWJwcm9wZXJ0eWluZm9wYXJzZXIvaW5jbHVkZS9wcm9wZXJ0eV9pbmZvX3BhcnNlci9wcm9wZXJ0eV9pbmZvX3BhcnNlci5oCisrKyBiL3Byb3BlcnR5X3NlcnZpY2UvbGlicHJvcGVydHlpbmZvcGFyc2VyL2luY2x1ZGUvcHJvcGVydHlfaW5mb19wYXJzZXIvcHJvcGVydHlfaW5mb19wYXJzZXIuaApAQCAtMjAsNiArMjAsOCBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogCitzdGF0aWMgY29uc3RleHByIGNoYXIgUFJPUF9UUkVFX0ZJTEVbXSA9ICIvZGV2L19fcHJvcGVydGllc19fL3Byb3BlcnR5X2luZm8iOworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgcHJvcGVydGllcyB7CiAKZGlmZiAtLWdpdCBhL3Byb3BlcnR5X3NlcnZpY2UvbGlicHJvcGVydHlpbmZvc2VyaWFsaXplci9wcm9wZXJ0eV9pbmZvX3NlcmlhbGl6ZXJfdGVzdC5jcHAgYi9wcm9wZXJ0eV9zZXJ2aWNlL2xpYnByb3BlcnR5aW5mb3NlcmlhbGl6ZXIvcHJvcGVydHlfaW5mb19zZXJpYWxpemVyX3Rlc3QuY3BwCmluZGV4IGE0ODQ0NDEuLmJlZDRhNzMgMTAwNjQ0Ci0tLSBhL3Byb3BlcnR5X3NlcnZpY2UvbGlicHJvcGVydHlpbmZvc2VyaWFsaXplci9wcm9wZXJ0eV9pbmZvX3NlcmlhbGl6ZXJfdGVzdC5jcHAKKysrIGIvcHJvcGVydHlfc2VydmljZS9saWJwcm9wZXJ0eWluZm9zZXJpYWxpemVyL3Byb3BlcnR5X2luZm9fc2VyaWFsaXplcl90ZXN0LmNwcApAQCAtNzI5LDcgKzcyOSw2IEBACiAgICAgICB7InN5cy5pbXMuUU1JX0RBRU1PTl9TVEFUVVMiLCAidTpvYmplY3RfcjpxY29tX2ltc19wcm9wOnMwIn0sCiAgICAgICB7InN5cy5saXN0ZW5lcnMucmVnaXN0ZXJlZCIsICJ1Om9iamVjdF9yOnFzZWVjb210ZWVfcHJvcDpzMCJ9LAogICAgICAgeyJzeXMubG9nYm9vdGNvbXBsZXRlIiwgInU6b2JqZWN0X3I6c3lzdGVtX3Byb3A6czAifSwKLSAgICAgIHsic3lzLm9lbV91bmxvY2tfYWxsb3dlZCIsICJ1Om9iamVjdF9yOnN5c3RlbV9wcm9wOnMwIn0sCiAgICAgICB7InN5cy5xY29tLmRldnVwIiwgInU6b2JqZWN0X3I6c3lzdGVtX3Byb3A6czAifSwKICAgICAgIHsic3lzLnN5c2N0bC5leHRyYV9mcmVlX2tieXRlcyIsICJ1Om9iamVjdF9yOnN5c3RlbV9wcm9wOnMwIn0sCiAgICAgICB7InN5cy51c2IuY29uZmlnIiwgInU6b2JqZWN0X3I6c3lzdGVtX3JhZGlvX3Byb3A6czAifSwKZGlmZiAtLWdpdCBhL3Jvb3RkaXIvQW5kcm9pZC5icCBiL3Jvb3RkaXIvQW5kcm9pZC5icAppbmRleCBlOTg3MzNhLi40NGFjYmJhIDEwMDY0NAotLS0gYS9yb290ZGlyL0FuZHJvaWQuYnAKKysrIGIvcm9vdGRpci9BbmRyb2lkLmJwCkBAIC0xNywxMiArMTcsMzAgQEAKIH0KIAogcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiaW5pdC5ib3Jpbmdzc2wuenlnb3RlNjRfMzIucmMiLAorICAgIHNyYzogImluaXQuYm9yaW5nc3NsLnp5Z290ZTY0XzMyLnJjIiwKKyAgICBzdWJfZGlyOiAiaW5pdC9odyIsCisgICAgc3ltbGlua3M6IFsKKyAgICAgICAgImluaXQuYm9yaW5nc3NsLnp5Z290ZTMyLnJjIiwKKyAgICAgICAgImluaXQuYm9yaW5nc3NsLm5vX3p5Z290ZS5yYyIsCisgICAgXSwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiaW5pdC5ib3Jpbmdzc2wuenlnb3RlNjQucmMiLAorICAgIHNyYzogImluaXQuYm9yaW5nc3NsLnp5Z290ZTY0LnJjIiwKKyAgICBzdWJfZGlyOiAiaW5pdC9odyIsCit9CisKK3ByZWJ1aWx0X2V0YyB7CiAgICAgbmFtZTogImluaXQucmMiLAogICAgIHNyYzogImluaXQucmMiLAogICAgIHN1Yl9kaXI6ICJpbml0L2h3IiwKICAgICByZXF1aXJlZDogWwogICAgICAgICAiZnN2ZXJpdHlfaW5pdCIsCiAgICAgICAgICJwbGF0Zm9ybS1ib290Y2xhc3NwYXRoIiwKKyAgICAgICAgImluaXQuYm9yaW5nc3NsLnp5Z290ZTY0LnJjIiwKKyAgICAgICAgImluaXQuYm9yaW5nc3NsLnp5Z290ZTY0XzMyLnJjIiwKICAgICBdLAogfQogCkBAIC0zMiwxMCArNTAsMTUgQEAKICAgICByZWNvdmVyeV9hdmFpbGFibGU6IHRydWUsCiB9CiAKK2ZpbGVncm91cCB7CisgICAgbmFtZTogInN5c3RlbV9saW5rZXJfY29uZmlnX2pzb25fZmlsZSIsCisgICAgc3JjczogWyJldGMvbGlua2VyLmNvbmZpZy5qc29uIl0sCit9CisKIC8vIFRPRE8oYi8xNDcyMTAyMTMpIEdlbmVyYXRlIGxpc3Qgb2YgbGlicmFyaWVzIGR1cmluZyBidWlsZCBhbmQgZmlsbCBpbiBhdCBidWlsZCB0aW1lCiBsaW5rZXJfY29uZmlnIHsKICAgICBuYW1lOiAic3lzdGVtX2xpbmtlcl9jb25maWciLAotICAgIHNyYzogImV0Yy9saW5rZXIuY29uZmlnLmpzb24iLAorICAgIHNyYzogIjpzeXN0ZW1fbGlua2VyX2NvbmZpZ19qc29uX2ZpbGUiLAogICAgIGluc3RhbGxhYmxlOiBmYWxzZSwKIH0KIApAQCAtNDQsNyArNjcsNyBAQAogICAgIG5hbWU6ICJwdWJsaWMubGlicmFyaWVzLmFuZHJvaWQudHh0IiwKICAgICBzcmM6ICJldGMvcHVibGljLmxpYnJhcmllcy5hbmRyb2lkLnR4dCIsCiAgICAgZmlsZW5hbWU6ICJwdWJsaWMubGlicmFyaWVzLnR4dCIsCi0gICAgaW5zdGFsbGFibGU6IGZhbHNlLAorICAgIG5vX2Z1bGxfaW5zdGFsbDogdHJ1ZSwKIH0KIAogLy8gYWRiX2RlYnVnLnByb3AgaW4gZGVidWcgcmFtZGlzawpAQCAtNTMsMyArNzYsMTI3IEBACiAgICAgc3JjOiAiYWRiX2RlYnVnLnByb3AiLAogICAgIGRlYnVnX3JhbWRpc2s6IHRydWUsCiB9CisKK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogImluaXQuenlnb3RlNjQucmMiLAorICAgIHNyYzogImluaXQuenlnb3RlNjQucmMiLAorICAgIHN1Yl9kaXI6ICJpbml0L2h3IiwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiaW5pdC56eWdvdGUzMi5yYyIsCisgICAgc3JjOiAiaW5pdC56eWdvdGUzMi5yYyIsCisgICAgc3ViX2RpcjogImluaXQvaHciLAorfQorCitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJpbml0Lnp5Z290ZTY0XzMyLnJjIiwKKyAgICBzcmM6ICJpbml0Lnp5Z290ZTY0XzMyLnJjIiwKKyAgICBzdWJfZGlyOiAiaW5pdC9odyIsCit9CisKK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogImluaXQudXNiLnJjIiwKKyAgICBzcmM6ICJpbml0LnVzYi5yYyIsCisgICAgc3ViX2RpcjogImluaXQvaHciLAorfQorCitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJpbml0LnVzYi5jb25maWdmcy5yYyIsCisgICAgc3JjOiAiaW5pdC51c2IuY29uZmlnZnMucmMiLAorICAgIHN1Yl9kaXI6ICJpbml0L2h3IiwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiZXRjX2hvc3RzIiwKKyAgICBzcmM6ICJldGMvaG9zdHMiLAorICAgIGZpbGVuYW1lOiAiaG9zdHMiLAorfQorCitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJpbml0LWRlYnVnLnJjIiwKKyAgICBzcmM6ICJpbml0LWRlYnVnLnJjIiwKKyAgICBzdWJfZGlyOiAiaW5pdCIsCit9CisKK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogImFzYW4ub3B0aW9ucyIsCisgICAgc3JjOiAiYXNhbi5vcHRpb25zIiwKK30KKworc2hfYmluYXJ5IHsKKyAgICBuYW1lOiAiYXNhbl9leHRyYWN0IiwKKyAgICBzcmM6ICJhc2FuX2V4dHJhY3Quc2giLAorICAgIGluaXRfcmM6IFsiYXNhbl9leHRyYWN0LnJjIl0sCisgICAgLy8gV2UgbmVlZCBiemlwMiBvbiBkZXZpY2UgZm9yIGV4dHJhY3Rpb24uCisgICAgcmVxdWlyZWQ6IFsiYnppcDIiXSwKK30KKworbGxuZGtfbGlicmFyaWVzX3R4dCB7CisgICAgbmFtZTogImxsbmRrLmxpYnJhcmllcy50eHQiLAorfQorCitzYW5pdGl6ZXJfbGlicmFyaWVzX3R4dCB7CisgICAgbmFtZTogInNhbml0aXplci5saWJyYXJpZXMudHh0IiwKK30KKworRVhQT1JUX0dMT0JBTF9BU0FOX09QVElPTlMgPSBzZWxlY3Qoc29vbmdfY29uZmlnX3ZhcmlhYmxlKCJBTkRST0lEIiwgIkFTQU5fRU5BQkxFRCIpLCB7CisgICAgdHJ1ZTogImV4cG9ydCBBU0FOX09QVElPTlMgaW5jbHVkZT0vc3lzdGVtL2FzYW4ub3B0aW9ucyIsCisgICAgZGVmYXVsdDogIiIsCit9KQorCitFWFBPUlRfR0xPQkFMX0hXQVNBTl9PUFRJT05TID0gc2VsZWN0KHNvb25nX2NvbmZpZ192YXJpYWJsZSgiQU5EUk9JRCIsICJIV0FTQU5fRU5BQkxFRCIpLCB7CisgICAgdHJ1ZTogImV4cG9ydCBIV0FTQU5fT1BUSU9OUyBoZWFwX2hpc3Rvcnlfc2l6ZT0xMDIzLHN0YWNrX2hpc3Rvcnlfc2l6ZT01MTIsZXhwb3J0X21lbW9yeV9zdGF0cz0wLG1heF9tYWxsb2NfZmlsbF9zaXplPTEzMTA3MixtYWxsb2NfZmlsbF9ieXRlPTAiLAorICAgIGRlZmF1bHQ6ICIiLAorfSkKKworRVhQT1JUX0dMT0JBTF9HQ09WX09QVElPTlMgPSBzZWxlY3Qoc29vbmdfY29uZmlnX3ZhcmlhYmxlKCJBTkRST0lEIiwgIkdDT1ZfQ09WRVJBR0UiKSwgeworICAgIHRydWU6ICJleHBvcnQgR0NPVl9QUkVGSVggL2RhdGEvbWlzYy90cmFjZSIsCisgICAgZGVmYXVsdDogIiIsCit9KQorCitFWFBPUlRfR0xPQkFMX0NMQU5HX0NPVkVSQUdFX09QVElPTlMgPSBzZWxlY3QoKHNvb25nX2NvbmZpZ192YXJpYWJsZSgiQU5EUk9JRCIsICJDTEFOR19DT1ZFUkFHRSIpLCBzb29uZ19jb25maWdfdmFyaWFibGUoIkFORFJPSUQiLCAiQ0xBTkdfQ09WRVJBR0VfQ09OVElOVU9VU19NT0RFIikpLCB7CisgICAgKHRydWUsIHRydWUpOiAiZXhwb3J0IExMVk1fUFJPRklMRV9GSUxFIC9kYXRhL21pc2MvdHJhY2UvY2xhbmclYy0lMjBtLnByb2ZyYXciLAorICAgICh0cnVlLCBkZWZhdWx0KTogImV4cG9ydCBMTFZNX1BST0ZJTEVfRklMRSAvZGF0YS9taXNjL3RyYWNlL2NsYW5nLSUyMG0ucHJvZnJhdyIsCisgICAgKGRlZmF1bHQsIGRlZmF1bHQpOiAiIiwKK30pCisKK0VYUE9SVF9HTE9CQUxfU0NVRE9fQUxMT0NBVElPTl9SSU5HX0JVRkZFUl9TSVpFID0gc2VsZWN0KHNvb25nX2NvbmZpZ192YXJpYWJsZSgiQU5EUk9JRCIsICJTQ1VET19BTExPQ0FUSU9OX1JJTkdfQlVGRkVSX1NJWkUiKSwgeworICAgICIiOiAiIiwKKyAgICBhbnkgQCBzaXplOiAiZXhwb3J0IFNDVURPX0FMTE9DQVRJT05fUklOR19CVUZGRVJfU0laRSAiICsgc2l6ZSwKKyAgICBkZWZhdWx0OiAiIiwKK30pCisKK2dlbnJ1bGUgeworICAgIG5hbWU6ICJpbml0LmVudmlyb24ucmMuZ2VuIiwKKyAgICBzcmNzOiBbImluaXQuZW52aXJvbi5yYy5pbiJdLAorICAgIG91dDogWyJpbml0LmVudmlyb24ucmMiXSwKKyAgICBjbWQ6ICJjcCAtZiAkKGluKSAkKG91dCkgJiYgIiArCisgICAgICAgICJlY2hvICcgICAgIiArIEVYUE9SVF9HTE9CQUxfQVNBTl9PUFRJT05TICsgIicgPj4gJChvdXQpICYmICIgKworICAgICAgICAiZWNobyAnICAgICIgKyBFWFBPUlRfR0xPQkFMX0dDT1ZfT1BUSU9OUyArICInID4+ICQob3V0KSAmJiAiICsKKyAgICAgICAgImVjaG8gJyAgICAiICsgRVhQT1JUX0dMT0JBTF9DTEFOR19DT1ZFUkFHRV9PUFRJT05TICsgIicgPj4gJChvdXQpICYmICIgKworICAgICAgICAiZWNobyAnICAgICIgKyBFWFBPUlRfR0xPQkFMX0hXQVNBTl9PUFRJT05TICsgIicgPj4gJChvdXQpICYmICIgKworICAgICAgICAiZWNobyAnICAgICIgKyBFWFBPUlRfR0xPQkFMX1NDVURPX0FMTE9DQVRJT05fUklOR19CVUZGRVJfU0laRSArICInID4+ICQob3V0KSIsCit9CisKK3ByZWJ1aWx0X3Jvb3QgeworICAgIG5hbWU6ICJpbml0LmVudmlyb24ucmMtc29vbmciLAorICAgIHNyYzogIjppbml0LmVudmlyb24ucmMuZ2VuIiwKKyAgICBmaWxlbmFtZTogImluaXQuZW52aXJvbi5yYyIsCisgICAgaW5zdGFsbF9pbl9yb290OiB0cnVlLAorICAgIG5vX2Z1bGxfaW5zdGFsbDogdHJ1ZSwKKyAgICByZXF1aXJlZDogc2VsZWN0KChzb29uZ19jb25maWdfdmFyaWFibGUoIkFORFJPSUQiLCAiQVNBTl9FTkFCTEVEIiksIHNvb25nX2NvbmZpZ192YXJpYWJsZSgiQU5EUk9JRCIsICJTQU5JVElaRV9UQVJHRVRfU1lTVEVNX0VOQUJMRUQiKSksIHsKKyAgICAgICAgKHRydWUsIHRydWUpOiBbCisgICAgICAgICAgICAiYXNhbi5vcHRpb25zIiwKKyAgICAgICAgICAgICJhc2FuX2V4dHJhY3QiLAorICAgICAgICBdLAorICAgICAgICAodHJ1ZSwgZGVmYXVsdCk6IFsiYXNhbi5vcHRpb25zIl0sCisgICAgICAgIChkZWZhdWx0LCBkZWZhdWx0KTogW10sCisgICAgfSksCit9CisKK2ZpbGVncm91cCB7CisgICAgbmFtZTogInJhbWRpc2tfbm9kZV9saXN0IiwKKyAgICBzcmNzOiBbInJhbWRpc2tfbm9kZV9saXN0Il0sCisgICAgZXhwb3J0X3RvX21ha2VfdmFyOiAiUkFNRElTS19OT0RFX0xJU1QiLAorfQpkaWZmIC0tZ2l0IGEvcm9vdGRpci9BbmRyb2lkLm1rIGIvcm9vdGRpci9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzYyODcyLi4wMDAwMDAwCi0tLSBhL3Jvb3RkaXIvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLWNvcHktZmlsZXMsc3lzdGVtL2NvcmUvcm9vdGRpciwpKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgaW5pdC1kZWJ1Zy5yYwotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBpbml0LWRlYnVnLnJjCi1MT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKExPQ0FMX01PRFVMRSkKLUxPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9FVEMpL2luaXQKLQotaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYXNhbi5vcHRpb25zCi1pZm5lcSAoJChmaWx0ZXIgYWRkcmVzcywkKFNBTklUSVpFX1RBUkdFVCkpLCkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBhc2FuLm9wdGlvbnMKLUxPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoTE9DQUxfTU9EVUxFKQotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUKQotCi1pbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCi0KLSMgQVNBTiBleHRyYXRpb24uCi1BU0FOX0VYVFJBQ1RfRklMRVMgOj0KLWlmZXEgKCQoU0FOSVRJWkVfVEFSR0VUX1NZU1RFTSksdHJ1ZSkKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFOj0gYXNhbl9leHRyYWN0Ci1MT0NBTF9MSUNFTlNFX0tJTkRTOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TOj0gbm90aWNlCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVYRUNVVEFCTEVTCi1MT0NBTF9TUkNfRklMRVMgOj0gYXNhbl9leHRyYWN0LnNoCi1MT0NBTF9JTklUX1JDIDo9IGFzYW5fZXh0cmFjdC5yYwotIyBXZSBuZWVkIGJ6aXAyIG9uIGRldmljZSBmb3IgZXh0cmFjdGlvbi4KLUxPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gYnppcDIKLWluY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKLUFTQU5fRVhUUkFDVF9GSUxFUyA6PSBhc2FuX2V4dHJhY3QKLWVuZGlmCi0KLWVuZGlmCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBpbml0LmVudmlyb24ucmMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9NT0RVTEUgOj0gaW5pdC5lbnZpcm9uLnJjCi1MT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX1JPT1RfT1VUKQotCi1FWFBPUlRfR0xPQkFMX0FTQU5fT1BUSU9OUyA6PQotaWZuZXEgKCQoZmlsdGVyIGFkZHJlc3MsJChTQU5JVElaRV9UQVJHRVQpKSwpCi0gIEVYUE9SVF9HTE9CQUxfQVNBTl9PUFRJT05TIDo9IGV4cG9ydCBBU0FOX09QVElPTlMgaW5jbHVkZT0vc3lzdGVtL2FzYW4ub3B0aW9ucwotICBMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IGFzYW4ub3B0aW9ucyAkKEFTQU5fT1BUSU9OU19GSUxFUykgJChBU0FOX0VYVFJBQ1RfRklMRVMpCi1lbmRpZgotCi1FWFBPUlRfR0xPQkFMX0hXQVNBTl9PUFRJT05TIDo9Ci1pZm5lcSAoJChmaWx0ZXIgaHdhZGRyZXNzLCQoU0FOSVRJWkVfVEFSR0VUKSksKQotICBpZm5lcSAoJChIV0FERFJFU1NfU0FOSVRJWkVSX0dMT0JBTF9PUFRJT05TKSwpCi0gICAgRVhQT1JUX0dMT0JBTF9IV0FTQU5fT1BUSU9OUyA6PSBleHBvcnQgSFdBU0FOX09QVElPTlMgJChIV0FERFJFU1NfU0FOSVRJWkVSX0dMT0JBTF9PUFRJT05TKQotICBlbmRpZgotZW5kaWYKLQotRVhQT1JUX0dMT0JBTF9HQ09WX09QVElPTlMgOj0KLWlmZXEgKCQoTkFUSVZFX0NPVkVSQUdFKSx0cnVlKQotICBFWFBPUlRfR0xPQkFMX0dDT1ZfT1BUSU9OUyA6PSBleHBvcnQgR0NPVl9QUkVGSVggL2RhdGEvbWlzYy90cmFjZQotZW5kaWYKLQotRVhQT1JUX0dMT0JBTF9DTEFOR19DT1ZFUkFHRV9PUFRJT05TIDo9Ci1pZmVxICgkKENMQU5HX0NPVkVSQUdFKSx0cnVlKQotICBpZmVxICgkKENMQU5HX0NPVkVSQUdFX0NPTlRJTlVPVVNfTU9ERSksdHJ1ZSkKLSAgICBFWFBPUlRfR0xPQkFMX0NMQU5HX0NPVkVSQUdFX09QVElPTlMgOj0gZXhwb3J0IExMVk1fUFJPRklMRV9GSUxFIC9kYXRhL21pc2MvdHJhY2UvY2xhbmclYy0lMjBtLnByb2ZyYXcKLSAgZWxzZQotICAgIEVYUE9SVF9HTE9CQUxfQ0xBTkdfQ09WRVJBR0VfT1BUSU9OUyA6PSBleHBvcnQgTExWTV9QUk9GSUxFX0ZJTEUgL2RhdGEvbWlzYy90cmFjZS9jbGFuZy0lMjBtLnByb2ZyYXcKLSAgZW5kaWYKLWVuZGlmCi0KLSMgUHV0IGl0IGhlcmUgaW5zdGVhZCBvZiBpbiBpbml0LnJjIG1vZHVsZSBkZWZpbml0aW9uLAotIyBiZWNhdXNlIGluaXQucmMgaXMgY29uZGl0aW9uYWxseSBpbmNsdWRlZC4KLSMKLSMgY3JlYXRlIHNvbWUgZGlyZWN0b3JpZXMgKHNvbWUgYXJlIG1vdW50IHBvaW50cykgYW5kIHN5bWxpbmtzCi1MT0NBTF9QT1NUX0lOU1RBTExfQ01EIDo9IG1rZGlyIC1wICQoYWRkcHJlZml4ICQoVEFSR0VUX1JPT1RfT1VUKS8sIFwKLSAgICBkZXYgcHJvYyBzeXMgc3lzdGVtIGRhdGEgZGF0YV9taXJyb3Igb2RtIG9lbSBhY2N0IGNvbmZpZyBzdG9yYWdlIG1udCBhcGV4IGRlYnVnX3JhbWRpc2sgXAotICAgIGxpbmtlcmNvbmZpZyBzZWNvbmRfc3RhZ2VfcmVzb3VyY2VzIHBvc3RpbnN0YWxsICQoQk9BUkRfUk9PVF9FWFRSQV9GT0xERVJTKSk7IFwKLSAgICBsbiAtc2YgL3N5c3RlbS9iaW4gJChUQVJHRVRfUk9PVF9PVVQpL2JpbjsgXAotICAgIGxuIC1zZiAvc3lzdGVtL2V0YyAkKFRBUkdFVF9ST09UX09VVCkvZXRjOyBcCi0gICAgbG4gLXNmIC9kYXRhL3VzZXJfZGUvMC9jb20uYW5kcm9pZC5zaGVsbC9maWxlcy9idWdyZXBvcnRzICQoVEFSR0VUX1JPT1RfT1VUKS9idWdyZXBvcnRzOyBcCi0gICAgbG4gLXNmbiAvc3lzL2tlcm5lbC9kZWJ1ZyAkKFRBUkdFVF9ST09UX09VVCkvZDsgXAotICAgIGxuIC1zZiAvc3RvcmFnZS9zZWxmL3ByaW1hcnkgJChUQVJHRVRfUk9PVF9PVVQpL3NkY2FyZAotaWZkZWYgQk9BUkRfVVNFU19WRU5ET1JJTUFHRQotICBMT0NBTF9QT1NUX0lOU1RBTExfQ01EICs9IDsgbWtkaXIgLXAgJChUQVJHRVRfUk9PVF9PVVQpL3ZlbmRvcgotZWxzZQotICBMT0NBTF9QT1NUX0lOU1RBTExfQ01EICs9IDsgbG4gLXNmIC9zeXN0ZW0vdmVuZG9yICQoVEFSR0VUX1JPT1RfT1VUKS92ZW5kb3IKLWVuZGlmCi1pZmRlZiBCT0FSRF9VU0VTX1BST0RVQ1RJTUFHRQotICBMT0NBTF9QT1NUX0lOU1RBTExfQ01EICs9IDsgbWtkaXIgLXAgJChUQVJHRVRfUk9PVF9PVVQpL3Byb2R1Y3QKLWVsc2UKLSAgTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCArPSA7IGxuIC1zZiAvc3lzdGVtL3Byb2R1Y3QgJChUQVJHRVRfUk9PVF9PVVQpL3Byb2R1Y3QKLWVuZGlmCi1pZmRlZiBCT0FSRF9VU0VTX1NZU1RFTV9FWFRJTUFHRQotICBMT0NBTF9QT1NUX0lOU1RBTExfQ01EICs9IDsgbWtkaXIgLXAgJChUQVJHRVRfUk9PVF9PVVQpL3N5c3RlbV9leHQKLWVsc2UKLSAgTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCArPSA7IGxuIC1zZiAvc3lzdGVtL3N5c3RlbV9leHQgJChUQVJHRVRfUk9PVF9PVVQpL3N5c3RlbV9leHQKLWVuZGlmCi1pZmRlZiBCT0FSRF9VU0VTX01FVEFEQVRBX1BBUlRJVElPTgotICBMT0NBTF9QT1NUX0lOU1RBTExfQ01EICs9IDsgbWtkaXIgLXAgJChUQVJHRVRfUk9PVF9PVVQpL21ldGFkYXRhCi1lbmRpZgotCi0jIEZvciAvb2RtIHBhcnRpdGlvbi4KLUxPQ0FMX1BPU1RfSU5TVEFMTF9DTUQgKz0gOyBta2RpciAtcCAkKFRBUkdFVF9ST09UX09VVCkvb2RtCi0jIEZvciBUcmVibGUgR2VuZXJpYyBTeXN0ZW0gSW1hZ2UgKEdTSSksIHN5c3RlbS1hcy1yb290IEdTSSBuZWVkcyB0byB3b3JrIG9uCi0jIGJvdGggZGV2aWNlcyB3aXRoIGFuZCB3aXRob3V0IC9vZG0gcGFydGl0aW9uLiBUaG9zZSBzeW1saW5rcyBhcmUgZm9yIGRldmljZXMKLSMgd2l0aG91dCAvb2RtIHBhcnRpdGlvbi4gRm9yIGRldmljZXMgd2l0aCAvb2RtIHBhcnRpdGlvbiwgbW91bnQgb2RtLmltZyB1bmRlcgotIyAvb2RtIHdpbGwgaGlkZSB0aG9zZSBzeW1saW5rcy4KLUxPQ0FMX1BPU1RfSU5TVEFMTF9DTUQgKz0gOyBsbiAtc2YgL3ZlbmRvci9vZG0vYXBwICQoVEFSR0VUX1JPT1RfT1VUKS9vZG0vYXBwCi1MT0NBTF9QT1NUX0lOU1RBTExfQ01EICs9IDsgbG4gLXNmIC92ZW5kb3Ivb2RtL2JpbiAkKFRBUkdFVF9ST09UX09VVCkvb2RtL2JpbgotTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCArPSA7IGxuIC1zZiAvdmVuZG9yL29kbS9ldGMgJChUQVJHRVRfUk9PVF9PVVQpL29kbS9ldGMKLUxPQ0FMX1BPU1RfSU5TVEFMTF9DTUQgKz0gOyBsbiAtc2YgL3ZlbmRvci9vZG0vZmlybXdhcmUgJChUQVJHRVRfUk9PVF9PVVQpL29kbS9maXJtd2FyZQotTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCArPSA7IGxuIC1zZiAvdmVuZG9yL29kbS9mcmFtZXdvcmsgJChUQVJHRVRfUk9PVF9PVVQpL29kbS9mcmFtZXdvcmsKLUxPQ0FMX1BPU1RfSU5TVEFMTF9DTUQgKz0gOyBsbiAtc2YgL3ZlbmRvci9vZG0vbGliICQoVEFSR0VUX1JPT1RfT1VUKS9vZG0vbGliCi1MT0NBTF9QT1NUX0lOU1RBTExfQ01EICs9IDsgbG4gLXNmIC92ZW5kb3Ivb2RtL2xpYjY0ICQoVEFSR0VUX1JPT1RfT1VUKS9vZG0vbGliNjQKLUxPQ0FMX1BPU1RfSU5TVEFMTF9DTUQgKz0gOyBsbiAtc2YgL3ZlbmRvci9vZG0vb3ZlcmxheSAkKFRBUkdFVF9ST09UX09VVCkvb2RtL292ZXJsYXkKLUxPQ0FMX1BPU1RfSU5TVEFMTF9DTUQgKz0gOyBsbiAtc2YgL3ZlbmRvci9vZG0vcHJpdi1hcHAgJChUQVJHRVRfUk9PVF9PVVQpL29kbS9wcml2LWFwcAotTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCArPSA7IGxuIC1zZiAvdmVuZG9yL29kbS91c3IgJChUQVJHRVRfUk9PVF9PVVQpL29kbS91c3IKLQotCi0jIEZvciAvdmVuZG9yX2Rsa20gcGFydGl0aW9uLgotTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCArPSA7IG1rZGlyIC1wICQoVEFSR0VUX1JPT1RfT1VUKS92ZW5kb3JfZGxrbQotIyBGb3IgVHJlYmxlIEdlbmVyaWMgU3lzdGVtIEltYWdlIChHU0kpLCBzeXN0ZW0tYXMtcm9vdCBHU0kgbmVlZHMgdG8gd29yayBvbgotIyBib3RoIGRldmljZXMgd2l0aCBhbmQgd2l0aG91dCAvdmVuZG9yX2Rsa20gcGFydGl0aW9uLiBUaG9zZSBzeW1saW5rcyBhcmUgZm9yCi0jIGRldmljZXMgd2l0aG91dCAvdmVuZG9yX2Rsa20gcGFydGl0aW9uLiBGb3IgZGV2aWNlcyB3aXRoIC92ZW5kb3JfZGxrbQotIyBwYXJ0aXRpb24sIG1vdW50IHZlbmRvcl9kbGttLmltZyB1bmRlciAvdmVuZG9yX2Rsa20gd2lsbCBoaWRlIHRob3NlIHN5bWxpbmtzLgotIyBOb3RlIHRoYXQgL3ZlbmRvcl9kbGttL2xpYiBpcyBvbWl0dGVkIGJlY2F1c2UgdmVuZG9yIERMS01zIHNob3VsZCBiZSBhY2Nlc3NlZAotIyB2aWEgL3ZlbmRvci9saWIvbW9kdWxlcyBkaXJlY3RseS4KLUxPQ0FMX1BPU1RfSU5TVEFMTF9DTUQgKz0gOyBsbiAtc2YgL3ZlbmRvci92ZW5kb3JfZGxrbS9ldGMgJChUQVJHRVRfUk9PVF9PVVQpL3ZlbmRvcl9kbGttL2V0YwotCi0jIEZvciAvb2RtX2Rsa20gcGFydGl0aW9uLgotTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCArPSA7IG1rZGlyIC1wICQoVEFSR0VUX1JPT1RfT1VUKS9vZG1fZGxrbQotIyBGb3IgVHJlYmxlIEdlbmVyaWMgU3lzdGVtIEltYWdlIChHU0kpLCBzeXN0ZW0tYXMtcm9vdCBHU0kgbmVlZHMgdG8gd29yayBvbgotIyBib3RoIGRldmljZXMgd2l0aCBhbmQgd2l0aG91dCAvb2RtX2Rsa20gcGFydGl0aW9uLiBUaG9zZSBzeW1saW5rcyBhcmUgZm9yCi0jIGRldmljZXMgd2l0aG91dCAvb2RtX2Rsa20gcGFydGl0aW9uLiBGb3IgZGV2aWNlcyB3aXRoIC9vZG1fZGxrbQotIyBwYXJ0aXRpb24sIG1vdW50IG9kbV9kbGttLmltZyB1bmRlciAvb2RtX2Rsa20gd2lsbCBoaWRlIHRob3NlIHN5bWxpbmtzLgotIyBOb3RlIHRoYXQgL29kbV9kbGttL2xpYiBpcyBvbWl0dGVkIGJlY2F1c2Ugb2RtIERMS01zIHNob3VsZCBiZSBhY2Nlc3NlZAotIyB2aWEgL29kbS9saWIvbW9kdWxlcyBkaXJlY3RseS4KLUxPQ0FMX1BPU1RfSU5TVEFMTF9DTUQgKz0gOyBsbiAtc2YgL29kbS9vZG1fZGxrbS9ldGMgJChUQVJHRVRfUk9PVF9PVVQpL29kbV9kbGttL2V0YwotCi0jIEZvciAvc3lzdGVtX2Rsa20gcGFydGl0aW9uCi1MT0NBTF9QT1NUX0lOU1RBTExfQ01EICs9IDsgbWtkaXIgLXAgJChUQVJHRVRfUk9PVF9PVVQpL3N5c3RlbV9kbGttCi0KLWlmZGVmIEJPQVJEX0NBQ0hFSU1BR0VfRklMRV9TWVNURU1fVFlQRQotICBMT0NBTF9QT1NUX0lOU1RBTExfQ01EICs9IDsgbWtkaXIgLXAgJChUQVJHRVRfUk9PVF9PVVQpL2NhY2hlCi1lbHNlCi0gIExPQ0FMX1BPU1RfSU5TVEFMTF9DTUQgKz0gOyBsbiAtc2YgL2RhdGEvY2FjaGUgJChUQVJHRVRfUk9PVF9PVVQpL2NhY2hlCi1lbmRpZgotaWZkZWYgQk9BUkRfUk9PVF9FWFRSQV9TWU1MSU5LUwotIyBCT0FSRF9ST09UX0VYVFJBX1NZTUxJTktTIGlzIGEgbGlzdCBvZiA8dGFyZ2V0Pjo8bGlua19uYW1lPi4KLSAgTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCArPSAkKGZvcmVhY2ggcywgJChCT0FSRF9ST09UX0VYVFJBX1NZTUxJTktTKSxcCi0gICAgJChldmFsIHAgOj0gJChzdWJzdCA6LCQoc3BhY2UpLCQocykpKVwKLSAgICA7IG1rZGlyIC1wICQoZGlyICQoVEFSR0VUX1JPT1RfT1VUKS8kKHdvcmQgMiwkKHApKSkgXAotICAgIDsgbG4gLXNmICQod29yZCAxLCQocCkpICQoVEFSR0VUX1JPT1RfT1VUKS8kKHdvcmQgMiwkKHApKSkKLWVuZGlmCi0KLSMgVGhlIGluaXQgc3ltbGluayBtdXN0IGJlIGEgcG9zdCBpbnN0YWxsIGNvbW1hbmQgb2YgYSBmaWxlIHRoYXQgaXMgdG8gVEFSR0VUX1JPT1RfT1VULgotIyBTaW5jZSBpbml0LmVudmlyb24ucmMgaXMgcmVxdWlyZWQgZm9yIGluaXQgYW5kIHNhdGlzZmllcyB0aGF0IHJlcXVpcmVtZW50LCB3ZSBoaWphY2sgaXQgdG8gY3JlYXRlIHRoZSBzeW1saW5rLgotTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCArPSA7IGxuIC1zZiAvc3lzdGVtL2Jpbi9pbml0ICQoVEFSR0VUX1JPT1RfT1VUKS9pbml0Ci0KLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2Jhc2VfcnVsZXMubWsKLQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKExPQ0FMX1BBVEgpL2luaXQuZW52aXJvbi5yYy5pbgotCUBlY2hvICJHZW5lcmF0ZTogJDwgLT4gJEAiCi0JQG1rZGlyIC1wICQoZGlyICRAKQotCSQoaGlkZSkgY3AgJDwgJEAKLQkkKGhpZGUpIHNlZCAtaSAtZSAncz8lRVhQT1JUX0dMT0JBTF9BU0FOX09QVElPTlMlPyQoRVhQT1JUX0dMT0JBTF9BU0FOX09QVElPTlMpP2cnICRACi0JJChoaWRlKSBzZWQgLWkgLWUgJ3M/JUVYUE9SVF9HTE9CQUxfR0NPVl9PUFRJT05TJT8kKEVYUE9SVF9HTE9CQUxfR0NPVl9PUFRJT05TKT9nJyAkQAotCSQoaGlkZSkgc2VkIC1pIC1lICdzPyVFWFBPUlRfR0xPQkFMX0NMQU5HX0NPVkVSQUdFX09QVElPTlMlPyQoRVhQT1JUX0dMT0JBTF9DTEFOR19DT1ZFUkFHRV9PUFRJT05TKT9nJyAkQAotCSQoaGlkZSkgc2VkIC1pIC1lICdzPyVFWFBPUlRfR0xPQkFMX0hXQVNBTl9PUFRJT05TJT8kKEVYUE9SVF9HTE9CQUxfSFdBU0FOX09QVElPTlMpP2cnICRACi0KLSMgQXBwZW5kIFBMQVRGT1JNX1ZOREtfVkVSU0lPTiB0byBiYXNlIG5hbWUuCi1kZWZpbmUgYXBwZW5kX3ZuZGtfdmVyc2lvbgotJChzdHJpcCBcCi0gICQoYmFzZW5hbWUgJCgxKSkuJChQTEFURk9STV9WTkRLX1ZFUlNJT04pJChzdWZmaXggJCgxKSkgXAotKQotZW5kZWYKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIHNhbml0aXplci5saWJyYXJpZXMudHh0Ci1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBzYW5pdGl6ZXIubGlicmFyaWVzLnR4dAotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfRVRDKQotTE9DQUxfTU9EVUxFX1NURU0gOj0gJChMT0NBTF9NT0RVTEUpCi1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfU0FOSVRJWkVSX1JVTlRJTUVfTElCUkFSSUVTIDo9IFwKLSAgICAkKFNBTklUSVpFUl9TVEVNUykgXAotICAgICQoMk5EX1NBTklUSVpFUl9TVEVNUykKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKToKLQlAZWNobyAiR2VuZXJhdGU6ICRAIgotCUBta2RpciAtcCAkKGRpciAkQCkKLQkkKGhpZGUpIGVjaG8gLW4gPiAkQAotCSQoaGlkZSkgJChmb3JlYWNoIGxpYiwkKFBSSVZBVEVfU0FOSVRJWkVSX1JVTlRJTUVfTElCUkFSSUVTKSwgXAotCQllY2hvICQobGliKSA+PiAkQDspCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyByYW1kaXNrX25vZGVfbGlzdAotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSByYW1kaXNrX25vZGVfbGlzdAotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoTE9DQUxfTU9EVUxFKQotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChQUk9EVUNUX09VVCkKLQotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1pbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCi0KLWluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL3Jvb3RkaXIvYXZiL0FuZHJvaWQuYnAgYi9yb290ZGlyL2F2Yi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ODRlM2UKLS0tIC9kZXYvbnVsbAorKysgYi9yb290ZGlyL2F2Yi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNzEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3Nvb25nX2NvbmZpZ19tb2R1bGVfdHlwZSB7CisgICAgbmFtZTogImF2Yl9rZXlzX3ByZWJ1aWx0X2F2YiIsCisgICAgbW9kdWxlX3R5cGU6ICJwcmVidWlsdF9hdmIiLAorICAgIGNvbmZpZ19uYW1lc3BhY2U6ICJBTkRST0lEIiwKKyAgICBib29sX3ZhcmlhYmxlczogWworICAgICAgICAiQk9BUkRfTU9WRV9HU0lfQVZCX0tFWVNfVE9fVkVORE9SX0JPT1QiLAorICAgIF0sCisgICAgcHJvcGVydGllczogWworICAgICAgICAicmFtZGlzayIsCisgICAgICAgICJ2ZW5kb3JfcmFtZGlzayIsCisgICAgXSwKK30KKworYXZiX2tleXNfcHJlYnVpbHRfYXZiIHsKKyAgICBuYW1lOiAicS1kZXZlbG9wZXItZ3NpLmF2YnB1YmtleSIsCisgICAgc3JjOiAicS1kZXZlbG9wZXItZ3NpLmF2YnB1YmtleSIsCisgICAgc29vbmdfY29uZmlnX3ZhcmlhYmxlczogeworICAgICAgICBCT0FSRF9NT1ZFX0dTSV9BVkJfS0VZU19UT19WRU5ET1JfQk9PVDogeworICAgICAgICAgICAgcmFtZGlzazogZmFsc2UsCisgICAgICAgICAgICB2ZW5kb3JfcmFtZGlzazogdHJ1ZSwKKyAgICAgICAgICAgIGNvbmRpdGlvbnNfZGVmYXVsdDogeworICAgICAgICAgICAgICAgIHJhbWRpc2s6IHRydWUsCisgICAgICAgICAgICAgICAgdmVuZG9yX3JhbWRpc2s6IGZhbHNlLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCithdmJfa2V5c19wcmVidWlsdF9hdmIgeworICAgIG5hbWU6ICJyLWRldmVsb3Blci1nc2kuYXZicHVia2V5IiwKKyAgICBzcmM6ICJyLWRldmVsb3Blci1nc2kuYXZicHVia2V5IiwKKyAgICBzb29uZ19jb25maWdfdmFyaWFibGVzOiB7CisgICAgICAgIEJPQVJEX01PVkVfR1NJX0FWQl9LRVlTX1RPX1ZFTkRPUl9CT09UOiB7CisgICAgICAgICAgICByYW1kaXNrOiBmYWxzZSwKKyAgICAgICAgICAgIHZlbmRvcl9yYW1kaXNrOiB0cnVlLAorICAgICAgICAgICAgY29uZGl0aW9uc19kZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgcmFtZGlzazogdHJ1ZSwKKyAgICAgICAgICAgICAgICB2ZW5kb3JfcmFtZGlzazogZmFsc2UsCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgIH0sCit9CisKK2F2Yl9rZXlzX3ByZWJ1aWx0X2F2YiB7CisgICAgbmFtZTogInMtZGV2ZWxvcGVyLWdzaS5hdmJwdWJrZXkiLAorICAgIHNyYzogInMtZGV2ZWxvcGVyLWdzaS5hdmJwdWJrZXkiLAorICAgIHNvb25nX2NvbmZpZ192YXJpYWJsZXM6IHsKKyAgICAgICAgQk9BUkRfTU9WRV9HU0lfQVZCX0tFWVNfVE9fVkVORE9SX0JPT1Q6IHsKKyAgICAgICAgICAgIHJhbWRpc2s6IGZhbHNlLAorICAgICAgICAgICAgdmVuZG9yX3JhbWRpc2s6IHRydWUsCisgICAgICAgICAgICBjb25kaXRpb25zX2RlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICByYW1kaXNrOiB0cnVlLAorICAgICAgICAgICAgICAgIHZlbmRvcl9yYW1kaXNrOiBmYWxzZSwKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL3Jvb3RkaXIvYXZiL0FuZHJvaWQubWsgYi9yb290ZGlyL2F2Yi9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2YzMTcyLi4wMDAwMDAwCi0tLSBhL3Jvb3RkaXIvYXZiL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaWZlcSAoJChCT0FSRF9NT1ZFX0dTSV9BVkJfS0VZU19UT19WRU5ET1JfQk9PVCksdHJ1ZSkgIyBBVkIga2V5cyBhcmUgaW5zdGFsbGVkIHRvIHZlbmRvciByYW1kaXNrCi0gIGlmZXEgKCQoQk9BUkRfTU9WRV9SRUNPVkVSWV9SRVNPVVJDRVNfVE9fVkVORE9SX0JPT1QpLHRydWUpICMgbm8gZGVkaWNhdGVkIHJlY292ZXJ5IHBhcnRpdGlvbgotICAgIG15X2dzaV9hdmJfa2V5c19wYXRoIDo9ICQoVEFSR0VUX1ZFTkRPUl9SQU1ESVNLX09VVCkvZmlyc3Rfc3RhZ2VfcmFtZGlzay9hdmIKLSAgZWxzZSAjIGRldmljZSBoYXMgYSBkZWRpY2F0ZWQgcmVjb3ZlcnkgcGFydGl0aW9uCi0gICAgbXlfZ3NpX2F2Yl9rZXlzX3BhdGggOj0gJChUQVJHRVRfVkVORE9SX1JBTURJU0tfT1VUKS9hdmIKLSAgZW5kaWYKLWVsc2UKLSAgaWZlcSAoJChCT0FSRF9VU0VTX1JFQ09WRVJZX0FTX0JPT1QpLHRydWUpICMgbm8gZGVkaWNhdGVkIHJlY292ZXJ5IHBhcnRpdGlvbgotICAgIG15X2dzaV9hdmJfa2V5c19wYXRoIDo9ICQoVEFSR0VUX1JFQ09WRVJZX1JPT1RfT1VUKS9maXJzdF9zdGFnZV9yYW1kaXNrL2F2YgotICBlbHNlICMgZGV2aWNlIGhhcyBhIGRlZGljYXRlZCByZWNvdmVyeSBwYXJ0aXRpb24KLSAgICBteV9nc2lfYXZiX2tleXNfcGF0aCA6PSAkKFRBUkdFVF9SQU1ESVNLX09VVCkvYXZiCi0gIGVuZGlmCi1lbmRpZgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgcS1kZXZlbG9wZXItZ3NpLmF2YnB1YmtleQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBxLWRldmVsb3Blci1nc2kuYXZicHVia2V5Ci1MT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKLUxPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKExPQ0FMX01PRFVMRSkKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQobXlfZ3NpX2F2Yl9rZXlzX3BhdGgpCi0KLWluY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIHItZGV2ZWxvcGVyLWdzaS5hdmJwdWJrZXkKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gci1kZXZlbG9wZXItZ3NpLmF2YnB1YmtleQotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9TUkNfRklMRVMgOj0gJChMT0NBTF9NT0RVTEUpCi1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKG15X2dzaV9hdmJfa2V5c19wYXRoKQotCi1pbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBzLWRldmVsb3Blci1nc2kuYXZicHVia2V5Ci1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IHMtZGV2ZWxvcGVyLWdzaS5hdmJwdWJrZXkKLUxPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoTE9DQUxfTU9EVUxFKQotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChteV9nc2lfYXZiX2tleXNfcGF0aCkKLQotaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQotCi1teV9nc2lfYXZiX2tleXNfcGF0aCA6PQpkaWZmIC0tZ2l0IGEvcm9vdGRpci9jcmVhdGVfcm9vdF9zdHJ1Y3R1cmUubWsgYi9yb290ZGlyL2NyZWF0ZV9yb290X3N0cnVjdHVyZS5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGFmMjM5Ci0tLSAvZGV2L251bGwKKysrIGIvcm9vdGRpci9jcmVhdGVfcm9vdF9zdHJ1Y3R1cmUubWsKQEAgLTAsMCArMSwxNTEgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2lmbmVxICgkKGZpbHRlciBhZGRyZXNzLCQoU0FOSVRJWkVfVEFSR0VUKSksKQorQVNBTl9FWFRSQUNUX0ZJTEVTIDo9CitpZmVxICgkKFNBTklUSVpFX1RBUkdFVF9TWVNURU0pLHRydWUpCitBU0FOX0VYVFJBQ1RfRklMRVMgOj0gYXNhbl9leHRyYWN0CitlbmRpZgorZW5kaWYKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBpbml0LmVudmlyb24ucmMKKyMgVE9ETyhiLzM1MzQyOTQyMik6IG1vdmUgTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCB0byBvdGhlciBydWxlcyBhbmQgcmVtb3ZlIEFuZHJvaWQubWsgbW9kdWxlLgorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX01PRFVMRSA6PSBpbml0LmVudmlyb24ucmMKK0xPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQorTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfUk9PVF9PVVQpCisKK2lmbmVxICgkKGZpbHRlciBhZGRyZXNzLCQoU0FOSVRJWkVfVEFSR0VUKSksKQorICBMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IGFzYW4ub3B0aW9ucyAkKEFTQU5fRVhUUkFDVF9GSUxFUykKK2VuZGlmCisKKyMgUHV0IGl0IGhlcmUgaW5zdGVhZCBvZiBpbiBpbml0LnJjIG1vZHVsZSBkZWZpbml0aW9uLAorIyBiZWNhdXNlIGluaXQucmMgaXMgY29uZGl0aW9uYWxseSBpbmNsdWRlZC4KKyMKKyMgY3JlYXRlIHNvbWUgZGlyZWN0b3JpZXMgKHNvbWUgYXJlIG1vdW50IHBvaW50cykgYW5kIHN5bWxpbmtzCitMT0NBTF9QT1NUX0lOU1RBTExfQ01EIDo9IG1rZGlyIC1wICQoYWRkcHJlZml4ICQoVEFSR0VUX1JPT1RfT1VUKS8sIFwKKyAgICBkZXYgcHJvYyBzeXMgc3lzdGVtIGRhdGEgZGF0YV9taXJyb3Igb2RtIG9lbSBhY2N0IGNvbmZpZyBzdG9yYWdlIG1udCBhcGV4IGJvb3RzdHJhcC1hcGV4IGRlYnVnX3JhbWRpc2sgXAorICAgIGxpbmtlcmNvbmZpZyBzZWNvbmRfc3RhZ2VfcmVzb3VyY2VzIHBvc3RpbnN0YWxsIHRtcCAkKEJPQVJEX1JPT1RfRVhUUkFfRk9MREVSUykpOyBcCisgICAgbG4gLXNmIC9zeXN0ZW0vYmluICQoVEFSR0VUX1JPT1RfT1VUKS9iaW47IFwKKyAgICBsbiAtc2YgL3N5c3RlbS9ldGMgJChUQVJHRVRfUk9PVF9PVVQpL2V0YzsgXAorICAgIGxuIC1zZiAvZGF0YS91c2VyX2RlLzAvY29tLmFuZHJvaWQuc2hlbGwvZmlsZXMvYnVncmVwb3J0cyAkKFRBUkdFVF9ST09UX09VVCkvYnVncmVwb3J0czsgXAorICAgIGxuIC1zZm4gL3N5cy9rZXJuZWwvZGVidWcgJChUQVJHRVRfUk9PVF9PVVQpL2Q7IFwKKyAgICBsbiAtc2YgL3N0b3JhZ2Uvc2VsZi9wcmltYXJ5ICQoVEFSR0VUX1JPT1RfT1VUKS9zZGNhcmQ7IFwKKyAgICBsbiAtc2YgL3Byb2R1Y3QvZXRjL3NlY3VyaXR5L2FkYl9rZXlzICQoVEFSR0VUX1JPT1RfT1VUKS9hZGJfa2V5cworCitBTExfUk9PVERJUl9TWU1MSU5LUyA6PSBcCisgICQoVEFSR0VUX1JPT1RfT1VUKS9iaW4gXAorICAkKFRBUkdFVF9ST09UX09VVCkvZXRjIFwKKyAgJChUQVJHRVRfUk9PVF9PVVQpL2J1Z3JlcG9ydHMgXAorICAkKFRBUkdFVF9ST09UX09VVCkvZCBcCisgICQoVEFSR0VUX1JPT1RfT1VUKS9zZGNhcmQKKworaWZkZWYgQk9BUkRfVVNFU19WRU5ET1JJTUFHRQorICBMT0NBTF9QT1NUX0lOU1RBTExfQ01EICs9IDsgbWtkaXIgLXAgJChUQVJHRVRfUk9PVF9PVVQpL3ZlbmRvcgorZWxzZQorICBMT0NBTF9QT1NUX0lOU1RBTExfQ01EICs9IDsgbG4gLXNmIC9zeXN0ZW0vdmVuZG9yICQoVEFSR0VUX1JPT1RfT1VUKS92ZW5kb3IKKyAgQUxMX1JPT1RESVJfU1lNTElOS1MgKz0gJChUQVJHRVRfUk9PVF9PVVQpL3ZlbmRvcgorZW5kaWYKK2lmZGVmIEJPQVJEX1VTRVNfUFJPRFVDVElNQUdFCisgIExPQ0FMX1BPU1RfSU5TVEFMTF9DTUQgKz0gOyBta2RpciAtcCAkKFRBUkdFVF9ST09UX09VVCkvcHJvZHVjdAorZWxzZQorICBMT0NBTF9QT1NUX0lOU1RBTExfQ01EICs9IDsgbG4gLXNmIC9zeXN0ZW0vcHJvZHVjdCAkKFRBUkdFVF9ST09UX09VVCkvcHJvZHVjdAorICBBTExfUk9PVERJUl9TWU1MSU5LUyArPSAkKFRBUkdFVF9ST09UX09VVCkvcHJvZHVjdAorZW5kaWYKK2lmZGVmIEJPQVJEX1VTRVNfU1lTVEVNX0VYVElNQUdFCisgIExPQ0FMX1BPU1RfSU5TVEFMTF9DTUQgKz0gOyBta2RpciAtcCAkKFRBUkdFVF9ST09UX09VVCkvc3lzdGVtX2V4dAorZWxzZQorICBMT0NBTF9QT1NUX0lOU1RBTExfQ01EICs9IDsgbG4gLXNmIC9zeXN0ZW0vc3lzdGVtX2V4dCAkKFRBUkdFVF9ST09UX09VVCkvc3lzdGVtX2V4dAorICBBTExfUk9PVERJUl9TWU1MSU5LUyArPSAkKFRBUkdFVF9ST09UX09VVCkvc3lzdGVtX2V4dAorZW5kaWYKK2lmZGVmIEJPQVJEX1VTRVNfTUVUQURBVEFfUEFSVElUSU9OCisgIExPQ0FMX1BPU1RfSU5TVEFMTF9DTUQgKz0gOyBta2RpciAtcCAkKFRBUkdFVF9ST09UX09VVCkvbWV0YWRhdGEKK2VuZGlmCisKKyMgRm9yIC9vZG0gcGFydGl0aW9uLgorTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCArPSA7IG1rZGlyIC1wICQoVEFSR0VUX1JPT1RfT1VUKS9vZG0KKyMgRm9yIFRyZWJsZSBHZW5lcmljIFN5c3RlbSBJbWFnZSAoR1NJKSwgc3lzdGVtLWFzLXJvb3QgR1NJIG5lZWRzIHRvIHdvcmsgb24KKyMgYm90aCBkZXZpY2VzIHdpdGggYW5kIHdpdGhvdXQgL29kbSBwYXJ0aXRpb24uIFRob3NlIHN5bWxpbmtzIGFyZSBmb3IgZGV2aWNlcworIyB3aXRob3V0IC9vZG0gcGFydGl0aW9uLiBGb3IgZGV2aWNlcyB3aXRoIC9vZG0gcGFydGl0aW9uLCBtb3VudCBvZG0uaW1nIHVuZGVyCisjIC9vZG0gd2lsbCBoaWRlIHRob3NlIHN5bWxpbmtzLgorTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCArPSA7IGxuIC1zZiAvdmVuZG9yL29kbS9hcHAgJChUQVJHRVRfUk9PVF9PVVQpL29kbS9hcHAKK0xPQ0FMX1BPU1RfSU5TVEFMTF9DTUQgKz0gOyBsbiAtc2YgL3ZlbmRvci9vZG0vYmluICQoVEFSR0VUX1JPT1RfT1VUKS9vZG0vYmluCitMT0NBTF9QT1NUX0lOU1RBTExfQ01EICs9IDsgbG4gLXNmIC92ZW5kb3Ivb2RtL2V0YyAkKFRBUkdFVF9ST09UX09VVCkvb2RtL2V0YworTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCArPSA7IGxuIC1zZiAvdmVuZG9yL29kbS9maXJtd2FyZSAkKFRBUkdFVF9ST09UX09VVCkvb2RtL2Zpcm13YXJlCitMT0NBTF9QT1NUX0lOU1RBTExfQ01EICs9IDsgbG4gLXNmIC92ZW5kb3Ivb2RtL2ZyYW1ld29yayAkKFRBUkdFVF9ST09UX09VVCkvb2RtL2ZyYW1ld29yaworTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCArPSA7IGxuIC1zZiAvdmVuZG9yL29kbS9saWIgJChUQVJHRVRfUk9PVF9PVVQpL29kbS9saWIKK0xPQ0FMX1BPU1RfSU5TVEFMTF9DTUQgKz0gOyBsbiAtc2YgL3ZlbmRvci9vZG0vbGliNjQgJChUQVJHRVRfUk9PVF9PVVQpL29kbS9saWI2NAorTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCArPSA7IGxuIC1zZiAvdmVuZG9yL29kbS9vdmVybGF5ICQoVEFSR0VUX1JPT1RfT1VUKS9vZG0vb3ZlcmxheQorTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCArPSA7IGxuIC1zZiAvdmVuZG9yL29kbS9wcml2LWFwcCAkKFRBUkdFVF9ST09UX09VVCkvb2RtL3ByaXYtYXBwCitMT0NBTF9QT1NUX0lOU1RBTExfQ01EICs9IDsgbG4gLXNmIC92ZW5kb3Ivb2RtL3VzciAkKFRBUkdFVF9ST09UX09VVCkvb2RtL3VzcgorCitBTExfUk9PVERJUl9TWU1MSU5LUyArPSBcCisgICQoVEFSR0VUX1JPT1RfT1VUKS9vZG0vYXBwIFwKKyAgJChUQVJHRVRfUk9PVF9PVVQpL29kbS9iaW4gXAorICAkKFRBUkdFVF9ST09UX09VVCkvb2RtL2V0YyBcCisgICQoVEFSR0VUX1JPT1RfT1VUKS9vZG0vZmlybXdhcmUgXAorICAkKFRBUkdFVF9ST09UX09VVCkvb2RtL2ZyYW1ld29yayBcCisgICQoVEFSR0VUX1JPT1RfT1VUKS9vZG0vbGliIFwKKyAgJChUQVJHRVRfUk9PVF9PVVQpL29kbS9saWI2NCBcCisgICQoVEFSR0VUX1JPT1RfT1VUKS9vZG0vb3ZlcmxheSBcCisgICQoVEFSR0VUX1JPT1RfT1VUKS9vZG0vcHJpdi1hcHAgXAorICAkKFRBUkdFVF9ST09UX09VVCkvb2RtL3VzcgorCisKKyMgRm9yIC92ZW5kb3JfZGxrbSBwYXJ0aXRpb24uCitMT0NBTF9QT1NUX0lOU1RBTExfQ01EICs9IDsgbWtkaXIgLXAgJChUQVJHRVRfUk9PVF9PVVQpL3ZlbmRvcl9kbGttCisjIEZvciBUcmVibGUgR2VuZXJpYyBTeXN0ZW0gSW1hZ2UgKEdTSSksIHN5c3RlbS1hcy1yb290IEdTSSBuZWVkcyB0byB3b3JrIG9uCisjIGJvdGggZGV2aWNlcyB3aXRoIGFuZCB3aXRob3V0IC92ZW5kb3JfZGxrbSBwYXJ0aXRpb24uIFRob3NlIHN5bWxpbmtzIGFyZSBmb3IKKyMgZGV2aWNlcyB3aXRob3V0IC92ZW5kb3JfZGxrbSBwYXJ0aXRpb24uIEZvciBkZXZpY2VzIHdpdGggL3ZlbmRvcl9kbGttCisjIHBhcnRpdGlvbiwgbW91bnQgdmVuZG9yX2Rsa20uaW1nIHVuZGVyIC92ZW5kb3JfZGxrbSB3aWxsIGhpZGUgdGhvc2Ugc3ltbGlua3MuCisjIE5vdGUgdGhhdCAvdmVuZG9yX2Rsa20vbGliIGlzIG9taXR0ZWQgYmVjYXVzZSB2ZW5kb3IgRExLTXMgc2hvdWxkIGJlIGFjY2Vzc2VkCisjIHZpYSAvdmVuZG9yL2xpYi9tb2R1bGVzIGRpcmVjdGx5LgorTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCArPSA7IGxuIC1zZiAvdmVuZG9yL3ZlbmRvcl9kbGttL2V0YyAkKFRBUkdFVF9ST09UX09VVCkvdmVuZG9yX2Rsa20vZXRjCitBTExfUk9PVERJUl9TWU1MSU5LUyArPSAkKFRBUkdFVF9ST09UX09VVCkvdmVuZG9yX2Rsa20vZXRjCisKKyMgRm9yIC9vZG1fZGxrbSBwYXJ0aXRpb24uCitMT0NBTF9QT1NUX0lOU1RBTExfQ01EICs9IDsgbWtkaXIgLXAgJChUQVJHRVRfUk9PVF9PVVQpL29kbV9kbGttCisjIEZvciBUcmVibGUgR2VuZXJpYyBTeXN0ZW0gSW1hZ2UgKEdTSSksIHN5c3RlbS1hcy1yb290IEdTSSBuZWVkcyB0byB3b3JrIG9uCisjIGJvdGggZGV2aWNlcyB3aXRoIGFuZCB3aXRob3V0IC9vZG1fZGxrbSBwYXJ0aXRpb24uIFRob3NlIHN5bWxpbmtzIGFyZSBmb3IKKyMgZGV2aWNlcyB3aXRob3V0IC9vZG1fZGxrbSBwYXJ0aXRpb24uIEZvciBkZXZpY2VzIHdpdGggL29kbV9kbGttCisjIHBhcnRpdGlvbiwgbW91bnQgb2RtX2Rsa20uaW1nIHVuZGVyIC9vZG1fZGxrbSB3aWxsIGhpZGUgdGhvc2Ugc3ltbGlua3MuCisjIE5vdGUgdGhhdCAvb2RtX2Rsa20vbGliIGlzIG9taXR0ZWQgYmVjYXVzZSBvZG0gRExLTXMgc2hvdWxkIGJlIGFjY2Vzc2VkCisjIHZpYSAvb2RtL2xpYi9tb2R1bGVzIGRpcmVjdGx5LgorTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCArPSA7IGxuIC1zZiAvb2RtL29kbV9kbGttL2V0YyAkKFRBUkdFVF9ST09UX09VVCkvb2RtX2Rsa20vZXRjCitBTExfUk9PVERJUl9TWU1MSU5LUyArPSAkKFRBUkdFVF9ST09UX09VVCkvb2RtX2Rsa20vZXRjCisKKyMgRm9yIC9zeXN0ZW1fZGxrbSBwYXJ0aXRpb24KK0xPQ0FMX1BPU1RfSU5TVEFMTF9DTUQgKz0gOyBta2RpciAtcCAkKFRBUkdFVF9ST09UX09VVCkvc3lzdGVtX2Rsa20KKworaWZkZWYgQk9BUkRfQ0FDSEVJTUFHRV9GSUxFX1NZU1RFTV9UWVBFCisgIExPQ0FMX1BPU1RfSU5TVEFMTF9DTUQgKz0gOyBta2RpciAtcCAkKFRBUkdFVF9ST09UX09VVCkvY2FjaGUKK2Vsc2UKKyAgTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCArPSA7IGxuIC1zZiAvZGF0YS9jYWNoZSAkKFRBUkdFVF9ST09UX09VVCkvY2FjaGUKKyAgQUxMX1JPT1RESVJfU1lNTElOS1MgKz0gJChUQVJHRVRfUk9PVF9PVVQpL2NhY2hlCitlbmRpZgoraWZkZWYgQk9BUkRfUk9PVF9FWFRSQV9TWU1MSU5LUworIyBCT0FSRF9ST09UX0VYVFJBX1NZTUxJTktTIGlzIGEgbGlzdCBvZiA8dGFyZ2V0Pjo8bGlua19uYW1lPi4KKyAgTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCArPSAkKGZvcmVhY2ggcywgJChCT0FSRF9ST09UX0VYVFJBX1NZTUxJTktTKSxcCisgICAgJChldmFsIHAgOj0gJChzdWJzdCA6LCQoc3BhY2UpLCQocykpKVwKKyAgICA7IG1rZGlyIC1wICQoZGlyICQoVEFSR0VUX1JPT1RfT1VUKS8kKHdvcmQgMiwkKHApKSkgXAorICAgIDsgbG4gLXNmICQod29yZCAxLCQocCkpICQoVEFSR0VUX1JPT1RfT1VUKS8kKHdvcmQgMiwkKHApKSkKKyAgQUxMX1JPT1RESVJfU1lNTElOS1MgKz0gJChmb3JlYWNoIHMsJChCT0FSRF9ST09UX0VYVFJBX1NZTUxJTktTKSwkKFRBUkdFVF9ST09UX09VVCkvJChjYWxsIHdvcmQtY29sb24sMiwkcykpCitlbmRpZgorCisjIFRoZSBpbml0IHN5bWxpbmsgbXVzdCBiZSBhIHBvc3QgaW5zdGFsbCBjb21tYW5kIG9mIGEgZmlsZSB0aGF0IGlzIHRvIFRBUkdFVF9ST09UX09VVC4KKyMgU2luY2UgaW5pdC5lbnZpcm9uLnJjIGlzIHJlcXVpcmVkIGZvciBpbml0IGFuZCBzYXRpc2ZpZXMgdGhhdCByZXF1aXJlbWVudCwgd2UgaGlqYWNrIGl0IHRvIGNyZWF0ZSB0aGUgc3ltbGluay4KK0xPQ0FMX1BPU1RfSU5TVEFMTF9DTUQgKz0gOyBsbiAtc2YgL3N5c3RlbS9iaW4vaW5pdCAkKFRBUkdFVF9ST09UX09VVCkvaW5pdAorQUxMX1JPT1RESVJfU1lNTElOS1MgKz0gJChUQVJHRVRfUk9PVF9PVVQpL2luaXQKKworQUxMX0RFRkFVTFRfSU5TVEFMTEVEX01PRFVMRVMgKz0gJChBTExfUk9PVERJUl9TWU1MSU5LUykKKworaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5taworCiskKEFMTF9ST09URElSX1NZTUxJTktTKTogJChMT0NBTF9CVUlMVF9NT0RVTEUpCisKK2luaXQuZW52aXJvbi5yYy1zb29uZyA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEVUQyxpbml0LmVudmlyb24ucmMtc29vbmcpL2luaXQuZW52aXJvbi5yYy1zb29uZworJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoaW5pdC5lbnZpcm9uLnJjLXNvb25nKSwkKExPQ0FMX0JVSUxUX01PRFVMRSkpKQoraW5pdC5lbnZpcm9uLnJjLXNvb25nIDo9CmRpZmYgLS1naXQgYS9yb290ZGlyL2V0Yy9saW5rZXIuY29uZmlnLmpzb24gYi9yb290ZGlyL2V0Yy9saW5rZXIuY29uZmlnLmpzb24KaW5kZXggNDdmNzdiMS4uOGIzNTQyZiAxMDA2NDQKLS0tIGEvcm9vdGRpci9ldGMvbGlua2VyLmNvbmZpZy5qc29uCisrKyBiL3Jvb3RkaXIvZXRjL2xpbmtlci5jb25maWcuanNvbgpAQCAtOSwxMSArOSw2IEBACiAgICAgImxpYm5hdGl2ZWhlbHBlci5zbyIsCiAgICAgImxpYm5hdGl2ZWxvYWRlci5zbyIsCiAgICAgImxpYnNpZ2NoYWluLnNvIiwKLSAgICAvLyBUT0RPKGIvMTIyODc2MzM2KTogUmVtb3ZlIGxpYnBhYy5zbyBvbmNlIGl0J3MgbWlncmF0ZWQgdG8gV2VidmlldwotICAgICJsaWJwYWMuc28iLAotICAgIC8vIFRPRE8oYi8xODQ4NzI5NzkpOiBSZW1vdmUgbGliYmluZGVyX3JwY191bnN0YWJsZS5zbyBvbmNlIHN0YWJsaXplZCBhbmQKLSAgICAvLyBhZGRlZCB0byBsaWJiaW5kZXJfbmRrLgotICAgICJsaWJiaW5kZXJfcnBjX3Vuc3RhYmxlLnNvIiwKICAgICAvLyBUT0RPKGIvMTIwNzg2NDE3IG9yIGIvMTM0NjU5Mjk0KTogbGliaWN1dWMuc28KICAgICAvLyBhbmQgbGliaWN1aTE4bi5zbyBhcmUga2VwdCBmb3IgYXBwIGNvbXBhdC4KICAgICAibGliaWN1aTE4bi5zbyIsCkBAIC0zNSw2ICszMCw4IEBACiAgIF0sCiAgICJwcm92aWRlTGlicyI6IFsKICAgICAibGliYXB0WF9lbmNvZGVyLnNvIiwKLSAgICAibGliYXB0WEhEX2VuY29kZXIuc28iCisgICAgImxpYmFwdFhIRF9lbmNvZGVyLnNvIiwKKyAgICAibGliRUdMLnNvIiwKKyAgICAibGliR0xFU3YyLnNvIgogICBdCiB9CmRpZmYgLS1naXQgYS9yb290ZGlyL2V0Yy9wdWJsaWMubGlicmFyaWVzLmFuZHJvaWQudHh0IGIvcm9vdGRpci9ldGMvcHVibGljLmxpYnJhcmllcy5hbmRyb2lkLnR4dAppbmRleCBjYWNjNDdjLi45YmUyZWY2IDEwMDY0NAotLS0gYS9yb290ZGlyL2V0Yy9wdWJsaWMubGlicmFyaWVzLmFuZHJvaWQudHh0CisrKyBiL3Jvb3RkaXIvZXRjL3B1YmxpYy5saWJyYXJpZXMuYW5kcm9pZC50eHQKQEAgLTEsNCArMSw0IEBACi0jIFNlZSBodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9uZGsvKy9tYXN0ZXIvZG9jcy9QbGF0Zm9ybUFwaXMubWQKKyMgU2VlIGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL25kay8rL21haW4vZG9jcy9QbGF0Zm9ybUFwaXMubWQKIGxpYmFuZHJvaWQuc28KIGxpYmFhdWRpby5zbwogbGliYW1pZGkuc28KZGlmZiAtLWdpdCBhL3Jvb3RkaXIvZXRjL3B1YmxpYy5saWJyYXJpZXMuaW90LnR4dCBiL3Jvb3RkaXIvZXRjL3B1YmxpYy5saWJyYXJpZXMuaW90LnR4dAppbmRleCA3N2Y4YmI4Li4wNTEzOTY4IDEwMDY0NAotLS0gYS9yb290ZGlyL2V0Yy9wdWJsaWMubGlicmFyaWVzLmlvdC50eHQKKysrIGIvcm9vdGRpci9ldGMvcHVibGljLmxpYnJhcmllcy5pb3QudHh0CkBAIC0xLDQgKzEsNCBAQAotIyBTZWUgaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vbmRrLysvbWFzdGVyL2RvY3MvUGxhdGZvcm1BcGlzLm1kCisjIFNlZSBodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9uZGsvKy9tYWluL2RvY3MvUGxhdGZvcm1BcGlzLm1kCiBsaWJhbmRyb2lkLnNvCiBsaWJhbmRyb2lkdGhpbmdzLnNvCiBsaWJhYXVkaW8uc28KZGlmZiAtLWdpdCBhL3Jvb3RkaXIvZXRjL3B1YmxpYy5saWJyYXJpZXMud2Vhci50eHQgYi9yb290ZGlyL2V0Yy9wdWJsaWMubGlicmFyaWVzLndlYXIudHh0CmluZGV4IGVhMWUyMzQuLjU5MTVkY2IgMTAwNjQ0Ci0tLSBhL3Jvb3RkaXIvZXRjL3B1YmxpYy5saWJyYXJpZXMud2Vhci50eHQKKysrIGIvcm9vdGRpci9ldGMvcHVibGljLmxpYnJhcmllcy53ZWFyLnR4dApAQCAtMSw0ICsxLDQgQEAKLSMgU2VlIGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL25kay8rL21hc3Rlci9kb2NzL1BsYXRmb3JtQXBpcy5tZAorIyBTZWUgaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vbmRrLysvbWFpbi9kb2NzL1BsYXRmb3JtQXBpcy5tZAogbGliYW5kcm9pZC5zbwogbGliYWF1ZGlvLnNvCiBsaWJhbWlkaS5zbwpkaWZmIC0tZ2l0IGEvcm9vdGRpci9pbml0LmJvcmluZ3NzbC56eWdvdGU2NC5yYyBiL3Jvb3RkaXIvaW5pdC5ib3Jpbmdzc2wuenlnb3RlNjQucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y0OWZlYQotLS0gL2Rldi9udWxsCisrKyBiL3Jvb3RkaXIvaW5pdC5ib3Jpbmdzc2wuenlnb3RlNjQucmMKQEAgLTAsMCArMSw0IEBACitvbiBpbml0ICYmIHByb3BlcnR5OnJvLnByb2R1Y3QuY3B1LmFiaWxpc3Q2ND0qCisgICAgZXhlY19zdGFydCBib3Jpbmdzc2xfc2VsZl90ZXN0NjQKK29uIHByb3BlcnR5OmFwZXhkLnN0YXR1cz1yZWFkeSAmJiBwcm9wZXJ0eTpyby5wcm9kdWN0LmNwdS5hYmlsaXN0NjQ9KgorICAgIGV4ZWNfc3RhcnQgYm9yaW5nc3NsX3NlbGZfdGVzdF9hcGV4NjQKZGlmZiAtLWdpdCBhL3Jvb3RkaXIvaW5pdC5ib3Jpbmdzc2wuenlnb3RlNjRfMzIucmMgYi9yb290ZGlyL2luaXQuYm9yaW5nc3NsLnp5Z290ZTY0XzMyLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYmU0MmQKLS0tIC9kZXYvbnVsbAorKysgYi9yb290ZGlyL2luaXQuYm9yaW5nc3NsLnp5Z290ZTY0XzMyLnJjCkBAIC0wLDAgKzEsOCBAQAorb24gaW5pdCAmJiBwcm9wZXJ0eTpyby5wcm9kdWN0LmNwdS5hYmlsaXN0MzI9KgorICAgIGV4ZWNfc3RhcnQgYm9yaW5nc3NsX3NlbGZfdGVzdDMyCitvbiBpbml0ICYmIHByb3BlcnR5OnJvLnByb2R1Y3QuY3B1LmFiaWxpc3Q2ND0qCisgICAgZXhlY19zdGFydCBib3Jpbmdzc2xfc2VsZl90ZXN0NjQKK29uIHByb3BlcnR5OmFwZXhkLnN0YXR1cz1yZWFkeSAmJiBwcm9wZXJ0eTpyby5wcm9kdWN0LmNwdS5hYmlsaXN0MzI9KgorICAgIGV4ZWNfc3RhcnQgYm9yaW5nc3NsX3NlbGZfdGVzdF9hcGV4MzIKK29uIHByb3BlcnR5OmFwZXhkLnN0YXR1cz1yZWFkeSAmJiBwcm9wZXJ0eTpyby5wcm9kdWN0LmNwdS5hYmlsaXN0NjQ9KgorICAgIGV4ZWNfc3RhcnQgYm9yaW5nc3NsX3NlbGZfdGVzdF9hcGV4NjQKZGlmZiAtLWdpdCBhL3Jvb3RkaXIvaW5pdC5lbnZpcm9uLnJjLmluIGIvcm9vdGRpci9pbml0LmVudmlyb24ucmMuaW4KaW5kZXggYmY2ZTk4Ni4uOTI0OTI3MCAxMDA2NDQKLS0tIGEvcm9vdGRpci9pbml0LmVudmlyb24ucmMuaW4KKysrIGIvcm9vdGRpci9pbml0LmVudmlyb24ucmMuaW4KQEAgLTEwLDcgKzEwLDUgQEAKICAgICBleHBvcnQgQU5EUk9JRF9UWkRBVEFfUk9PVCAvYXBleC9jb20uYW5kcm9pZC50emRhdGEKICAgICBleHBvcnQgRVhURVJOQUxfU1RPUkFHRSAvc2RjYXJkCiAgICAgZXhwb3J0IEFTRUNfTU9VTlRQT0lOVCAvbW50L2FzZWMKLSAgICAlRVhQT1JUX0dMT0JBTF9BU0FOX09QVElPTlMlCi0gICAgJUVYUE9SVF9HTE9CQUxfR0NPVl9PUFRJT05TJQotICAgICVFWFBPUlRfR0xPQkFMX0NMQU5HX0NPVkVSQUdFX09QVElPTlMlCi0gICAgJUVYUE9SVF9HTE9CQUxfSFdBU0FOX09QVElPTlMlCisgICAgIyBBZGRpdGlvbmFsIGVudmlyb25tZW50IHZhcmlhYmxlcyB3aWxsIGJlIGFwcGVuZGVkIGhlcmUgZHVyaW5nIGJ1aWxkIChzZWUgQW5kcm9pZC5icCkuCisgICAgIyBETyBOT1QgQUREIGFkZGl0aW9uYWwgc2VjdGlvbnMgbGlrZSAnb24gPGV2ZW50PicgaGVyZS4KZGlmZiAtLWdpdCBhL3Jvb3RkaXIvaW5pdC5yYyBiL3Jvb3RkaXIvaW5pdC5yYwppbmRleCAxZTY5MThkLi42MTdlNjBhIDEwMDY0NAotLS0gYS9yb290ZGlyL2luaXQucmMKKysrIGIvcm9vdGRpci9pbml0LnJjCkBAIC03MCwyMSArNzAsMTkgQEAKIAogICAgIHN0YXJ0IHVldmVudGQKIAorICAgICMgTW91bnQgdHJhY2VmcyAod2l0aCBHSUQ9QUlEX1JFQURUUkFDRUZTKQorICAgIG1vdW50IHRyYWNlZnMgdHJhY2VmcyAvc3lzL2tlcm5lbC90cmFjaW5nIGdpZD0zMDEyCisKICAgICAjIFJ1biBhcGV4ZC1ib290c3RyYXAgc28gdGhhdCBBUEVYZXMgdGhhdCBwcm92aWRlIGNyaXRpY2FsIGxpYnJhcmllcwogICAgICMgYmVjb21lIGF2YWlsYWJsZS4gTm90ZSB0aGF0IHRoaXMgaXMgZXhlY3V0ZWQgYXMgZXhlY19zdGFydCB0byBlbnN1cmUgdGhhdAogICAgICMgdGhlIGxpYnJhcmllcyBhcmUgYXZhaWxhYmxlIHRvIHRoZSBwcm9jZXNzZXMgc3RhcnRlZCBhZnRlciB0aGlzIHN0YXRlbWVudC4KICAgICBleGVjX3N0YXJ0IGFwZXhkLWJvb3RzdHJhcAotCi0gICAgIyBHZW5lcmF0ZSBsaW5rZXIgY29uZmlnIGJhc2VkIG9uIGFwZXggbW91bnRlZCBpbiBib290c3RyYXAgbmFtZXNwYWNlCi0gICAgdXBkYXRlX2xpbmtlcl9jb25maWcKKyAgICBwZXJmb3JtX2FwZXhfY29uZmlnIC0tYm9vdHN0cmFwCiAKICAgICAjIFRoZXNlIG11c3QgYWxyZWFkeSBleGlzdCBieSB0aGUgdGltZSBib3Jpbmdzc2xfc2VsZl90ZXN0MzIgLyBib3Jpbmdzc2xfc2VsZl90ZXN0NjQgcnVuLgogICAgIG1rZGlyIC9kZXYvYm9yaW5nc3NsIDA3NTUgcm9vdCByb290CiAgICAgbWtkaXIgL2Rldi9ib3Jpbmdzc2wvc2VsZnRlc3QgMDc1NSByb290IHJvb3QKIAotICAgICMgTW91bnQgdHJhY2VmcyAod2l0aCBHSUQ9QUlEX1JFQURUUkFDRUZTKQotICAgIG1vdW50IHRyYWNlZnMgdHJhY2VmcyAvc3lzL2tlcm5lbC90cmFjaW5nIGdpZD0zMDEyCi0KICAgICAjIGNyZWF0ZSBzeXMgZGlyY3RvcnkKICAgICBta2RpciAvZGV2L3N5cyAwNzU1IHN5c3RlbSBzeXN0ZW0KICAgICBta2RpciAvZGV2L3N5cy9mcyAwNzU1IHN5c3RlbSBzeXN0ZW0KQEAgLTk0LDUwICs5MiwyOSBAQAogICAgICMgY2hlY2tlciBwcm9ncmFtcy4KICAgICBta2RpciAvZGV2L2ZzY2tsb2dzIDA3NzAgcm9vdCBzeXN0ZW0KIAorICAgICMgQ3JlYXRlIHRtcGZzIGZvciB1c2UgYnkgdGhlIHNoZWxsIHVzZXIuCisgICAgbW91bnQgdG1wZnMgdG1wZnMgL3RtcAorICAgIHJlc3RvcmVjb24gL3RtcAorICAgIGNob3duIHNoZWxsIHNoZWxsIC90bXAKKyAgICBjaG1vZCAwNzcxIC90bXAKKwogb24gaW5pdAogICAgIHN5c2Nsa3R6IDAKIAogICAgICMgTWl4IGRldmljZS1zcGVjaWZpYyBpbmZvcm1hdGlvbiBpbnRvIHRoZSBlbnRyb3B5IHBvb2wKICAgICBjb3B5IC9wcm9jL2NtZGxpbmUgL2Rldi91cmFuZG9tCi0gICAgY29weSAvc3lzdGVtL2V0Yy9wcm9wLmRlZmF1bHQgL2Rldi91cmFuZG9tCisgICAgY29weSAvcHJvYy9ib290Y29uZmlnIC9kZXYvdXJhbmRvbQogCiAgICAgc3ltbGluayAvcHJvYy9zZWxmL2ZkLzAgL2Rldi9zdGRpbgogICAgIHN5bWxpbmsgL3Byb2Mvc2VsZi9mZC8xIC9kZXYvc3Rkb3V0CiAgICAgc3ltbGluayAvcHJvYy9zZWxmL2ZkLzIgL2Rldi9zdGRlcnIKIAotICAgICMgQ3JlYXRlIGVuZXJneS1hd2FyZSBzY2hlZHVsZXIgdHVuaW5nIG5vZGVzCi0gICAgbWtkaXIgL2Rldi9zdHVuZS9mb3JlZ3JvdW5kCi0gICAgbWtkaXIgL2Rldi9zdHVuZS9iYWNrZ3JvdW5kCi0gICAgbWtkaXIgL2Rldi9zdHVuZS90b3AtYXBwCi0gICAgbWtkaXIgL2Rldi9zdHVuZS9ydAotICAgIGNob3duIHN5c3RlbSBzeXN0ZW0gL2Rldi9zdHVuZQotICAgIGNob3duIHN5c3RlbSBzeXN0ZW0gL2Rldi9zdHVuZS9mb3JlZ3JvdW5kCi0gICAgY2hvd24gc3lzdGVtIHN5c3RlbSAvZGV2L3N0dW5lL2JhY2tncm91bmQKLSAgICBjaG93biBzeXN0ZW0gc3lzdGVtIC9kZXYvc3R1bmUvdG9wLWFwcAotICAgIGNob3duIHN5c3RlbSBzeXN0ZW0gL2Rldi9zdHVuZS9ydAotICAgIGNob3duIHN5c3RlbSBzeXN0ZW0gL2Rldi9zdHVuZS90YXNrcwotICAgIGNob3duIHN5c3RlbSBzeXN0ZW0gL2Rldi9zdHVuZS9mb3JlZ3JvdW5kL3Rhc2tzCi0gICAgY2hvd24gc3lzdGVtIHN5c3RlbSAvZGV2L3N0dW5lL2JhY2tncm91bmQvdGFza3MKLSAgICBjaG93biBzeXN0ZW0gc3lzdGVtIC9kZXYvc3R1bmUvdG9wLWFwcC90YXNrcwotICAgIGNob3duIHN5c3RlbSBzeXN0ZW0gL2Rldi9zdHVuZS9ydC90YXNrcwotICAgIGNob3duIHN5c3RlbSBzeXN0ZW0gL2Rldi9zdHVuZS9jZ3JvdXAucHJvY3MKLSAgICBjaG93biBzeXN0ZW0gc3lzdGVtIC9kZXYvc3R1bmUvZm9yZWdyb3VuZC9jZ3JvdXAucHJvY3MKLSAgICBjaG93biBzeXN0ZW0gc3lzdGVtIC9kZXYvc3R1bmUvYmFja2dyb3VuZC9jZ3JvdXAucHJvY3MKLSAgICBjaG93biBzeXN0ZW0gc3lzdGVtIC9kZXYvc3R1bmUvdG9wLWFwcC9jZ3JvdXAucHJvY3MKLSAgICBjaG93biBzeXN0ZW0gc3lzdGVtIC9kZXYvc3R1bmUvcnQvY2dyb3VwLnByb2NzCi0gICAgY2htb2QgMDY2NCAvZGV2L3N0dW5lL3Rhc2tzCi0gICAgY2htb2QgMDY2NCAvZGV2L3N0dW5lL2ZvcmVncm91bmQvdGFza3MKLSAgICBjaG1vZCAwNjY0IC9kZXYvc3R1bmUvYmFja2dyb3VuZC90YXNrcwotICAgIGNobW9kIDA2NjQgL2Rldi9zdHVuZS90b3AtYXBwL3Rhc2tzCi0gICAgY2htb2QgMDY2NCAvZGV2L3N0dW5lL3J0L3Rhc2tzCi0gICAgY2htb2QgMDY2NCAvZGV2L3N0dW5lL2Nncm91cC5wcm9jcwotICAgIGNobW9kIDA2NjQgL2Rldi9zdHVuZS9mb3JlZ3JvdW5kL2Nncm91cC5wcm9jcwotICAgIGNobW9kIDA2NjQgL2Rldi9zdHVuZS9iYWNrZ3JvdW5kL2Nncm91cC5wcm9jcwotICAgIGNobW9kIDA2NjQgL2Rldi9zdHVuZS90b3AtYXBwL2Nncm91cC5wcm9jcwotICAgIGNobW9kIDA2NjQgL2Rldi9zdHVuZS9ydC9jZ3JvdXAucHJvY3MKKyAgICAjIENyZWF0ZSBzb2NrZXQgZGlyIGZvciBvdC1kYWVtb24KKyAgICBta2RpciAvZGV2L3NvY2tldC9vdC1kYWVtb24gMDc3MCB0aHJlYWRfbmV0d29yayB0aHJlYWRfbmV0d29yawogCiAgICAgIyBjcHVjdGwgaGllcmFyY2h5IGZvciBkZXZpY2VzIHVzaW5nIHV0aWxjbGFtcAogICAgIG1rZGlyIC9kZXYvY3B1Y3RsL2ZvcmVncm91bmQKKyAgICBta2RpciAvZGV2L2NwdWN0bC9mb3JlZ3JvdW5kX3dpbmRvdwogICAgIG1rZGlyIC9kZXYvY3B1Y3RsL2JhY2tncm91bmQKICAgICBta2RpciAvZGV2L2NwdWN0bC90b3AtYXBwCiAgICAgbWtkaXIgL2Rldi9jcHVjdGwvcnQKQEAgLTE0Niw2ICsxMjMsNyBAQAogICAgIG1rZGlyIC9kZXYvY3B1Y3RsL2RleDJvYXQKICAgICBjaG93biBzeXN0ZW0gc3lzdGVtIC9kZXYvY3B1Y3RsCiAgICAgY2hvd24gc3lzdGVtIHN5c3RlbSAvZGV2L2NwdWN0bC9mb3JlZ3JvdW5kCisgICAgY2hvd24gc3lzdGVtIHN5c3RlbSAvZGV2L2NwdWN0bC9mb3JlZ3JvdW5kX3dpbmRvdwogICAgIGNob3duIHN5c3RlbSBzeXN0ZW0gL2Rldi9jcHVjdGwvYmFja2dyb3VuZAogICAgIGNob3duIHN5c3RlbSBzeXN0ZW0gL2Rldi9jcHVjdGwvdG9wLWFwcAogICAgIGNob3duIHN5c3RlbSBzeXN0ZW0gL2Rldi9jcHVjdGwvcnQKQEAgLTE1NCw2ICsxMzIsNyBAQAogICAgIGNob3duIHN5c3RlbSBzeXN0ZW0gL2Rldi9jcHVjdGwvZGV4Mm9hdAogICAgIGNob3duIHN5c3RlbSBzeXN0ZW0gL2Rldi9jcHVjdGwvdGFza3MKICAgICBjaG93biBzeXN0ZW0gc3lzdGVtIC9kZXYvY3B1Y3RsL2ZvcmVncm91bmQvdGFza3MKKyAgICBjaG93biBzeXN0ZW0gc3lzdGVtIC9kZXYvY3B1Y3RsL2ZvcmVncm91bmRfd2luZG93L3Rhc2tzCiAgICAgY2hvd24gc3lzdGVtIHN5c3RlbSAvZGV2L2NwdWN0bC9iYWNrZ3JvdW5kL3Rhc2tzCiAgICAgY2hvd24gc3lzdGVtIHN5c3RlbSAvZGV2L2NwdWN0bC90b3AtYXBwL3Rhc2tzCiAgICAgY2hvd24gc3lzdGVtIHN5c3RlbSAvZGV2L2NwdWN0bC9ydC90YXNrcwpAQCAtMTYyLDYgKzE0MSw3IEBACiAgICAgY2hvd24gc3lzdGVtIHN5c3RlbSAvZGV2L2NwdWN0bC9kZXgyb2F0L3Rhc2tzCiAgICAgY2hvd24gc3lzdGVtIHN5c3RlbSAvZGV2L2NwdWN0bC9jZ3JvdXAucHJvY3MKICAgICBjaG93biBzeXN0ZW0gc3lzdGVtIC9kZXYvY3B1Y3RsL2ZvcmVncm91bmQvY2dyb3VwLnByb2NzCisgICAgY2hvd24gc3lzdGVtIHN5c3RlbSAvZGV2L2NwdWN0bC9mb3JlZ3JvdW5kX3dpbmRvdy9jZ3JvdXAucHJvY3MKICAgICBjaG93biBzeXN0ZW0gc3lzdGVtIC9kZXYvY3B1Y3RsL2JhY2tncm91bmQvY2dyb3VwLnByb2NzCiAgICAgY2hvd24gc3lzdGVtIHN5c3RlbSAvZGV2L2NwdWN0bC90b3AtYXBwL2Nncm91cC5wcm9jcwogICAgIGNob3duIHN5c3RlbSBzeXN0ZW0gL2Rldi9jcHVjdGwvcnQvY2dyb3VwLnByb2NzCkBAIC0xNzAsNiArMTUwLDcgQEAKICAgICBjaG93biBzeXN0ZW0gc3lzdGVtIC9kZXYvY3B1Y3RsL2RleDJvYXQvY2dyb3VwLnByb2NzCiAgICAgY2htb2QgMDY2NCAvZGV2L2NwdWN0bC90YXNrcwogICAgIGNobW9kIDA2NjQgL2Rldi9jcHVjdGwvZm9yZWdyb3VuZC90YXNrcworICAgIGNobW9kIDA2NjQgL2Rldi9jcHVjdGwvZm9yZWdyb3VuZF93aW5kb3cvdGFza3MKICAgICBjaG1vZCAwNjY0IC9kZXYvY3B1Y3RsL2JhY2tncm91bmQvdGFza3MKICAgICBjaG1vZCAwNjY0IC9kZXYvY3B1Y3RsL3RvcC1hcHAvdGFza3MKICAgICBjaG1vZCAwNjY0IC9kZXYvY3B1Y3RsL3J0L3Rhc2tzCkBAIC0xNzgsNiArMTU5LDcgQEAKICAgICBjaG1vZCAwNjY0IC9kZXYvY3B1Y3RsL2RleDJvYXQvdGFza3MKICAgICBjaG1vZCAwNjY0IC9kZXYvY3B1Y3RsL2Nncm91cC5wcm9jcwogICAgIGNobW9kIDA2NjQgL2Rldi9jcHVjdGwvZm9yZWdyb3VuZC9jZ3JvdXAucHJvY3MKKyAgICBjaG1vZCAwNjY0IC9kZXYvY3B1Y3RsL2ZvcmVncm91bmRfd2luZG93L2Nncm91cC5wcm9jcwogICAgIGNobW9kIDA2NjQgL2Rldi9jcHVjdGwvYmFja2dyb3VuZC9jZ3JvdXAucHJvY3MKICAgICBjaG1vZCAwNjY0IC9kZXYvY3B1Y3RsL3RvcC1hcHAvY2dyb3VwLnByb2NzCiAgICAgY2htb2QgMDY2NCAvZGV2L2NwdWN0bC9ydC9jZ3JvdXAucHJvY3MKQEAgLTIwMywyNCArMTg1LDYgQEAKICAgICBjaG1vZCAwNjY0IC9kZXYvY3B1Y3RsL2NhbWVyYS1kYWVtb24vdGFza3MKICAgICBjaG1vZCAwNjY0IC9kZXYvY3B1Y3RsL2NhbWVyYS1kYWVtb24vY2dyb3VwLnByb2NzCiAKLSAgICAjIENyZWF0ZSBhbiBzdHVuZSBncm91cCBmb3IgY2FtZXJhLXNwZWNpZmljIHByb2Nlc3NlcwotICAgIG1rZGlyIC9kZXYvc3R1bmUvY2FtZXJhLWRhZW1vbgotICAgIGNob3duIHN5c3RlbSBzeXN0ZW0gL2Rldi9zdHVuZS9jYW1lcmEtZGFlbW9uCi0gICAgY2hvd24gc3lzdGVtIHN5c3RlbSAvZGV2L3N0dW5lL2NhbWVyYS1kYWVtb24vdGFza3MKLSAgICBjaG93biBzeXN0ZW0gc3lzdGVtIC9kZXYvc3R1bmUvY2FtZXJhLWRhZW1vbi9jZ3JvdXAucHJvY3MKLSAgICBjaG1vZCAwNjY0IC9kZXYvc3R1bmUvY2FtZXJhLWRhZW1vbi90YXNrcwotICAgIGNobW9kIDA2NjQgL2Rldi9zdHVuZS9jYW1lcmEtZGFlbW9uL2Nncm91cC5wcm9jcwotCi0gICAgIyBDcmVhdGUgYW4gc3R1bmUgZ3JvdXAgZm9yIE5OQVBJIEhBTCBwcm9jZXNzZXMKLSAgICBta2RpciAvZGV2L3N0dW5lL25uYXBpLWhhbAotICAgIGNob3duIHN5c3RlbSBzeXN0ZW0gL2Rldi9zdHVuZS9ubmFwaS1oYWwKLSAgICBjaG93biBzeXN0ZW0gc3lzdGVtIC9kZXYvc3R1bmUvbm5hcGktaGFsL3Rhc2tzCi0gICAgY2hvd24gc3lzdGVtIHN5c3RlbSAvZGV2L3N0dW5lL25uYXBpLWhhbC9jZ3JvdXAucHJvY3MKLSAgICBjaG1vZCAwNjY0IC9kZXYvc3R1bmUvbm5hcGktaGFsL3Rhc2tzCi0gICAgY2htb2QgMDY2NCAvZGV2L3N0dW5lL25uYXBpLWhhbC9jZ3JvdXAucHJvY3MKLSAgICB3cml0ZSAvZGV2L3N0dW5lL25uYXBpLWhhbC9zY2hlZHR1bmUuYm9vc3QgMQotICAgIHdyaXRlIC9kZXYvc3R1bmUvbm5hcGktaGFsL3NjaGVkdHVuZS5wcmVmZXJfaWRsZSAxCi0KICAgICAjIENyZWF0ZSBibGtpbyBncm91cCBhbmQgYXBwbHkgaW5pdGlhbCBzZXR0aW5ncy4KICAgICAjIFRoaXMgZmVhdHVyZSBuZWVkcyBrZXJuZWwgdG8gc3VwcG9ydCBpdCwgYW5kIHRoZQogICAgICMgZGV2aWNlJ3MgaW5pdC5yYyBtdXN0IGFjdHVhbGx5IHNldCB0aGUgY29ycmVjdCB2YWx1ZXMuCkBAIC0yNDAsNiArMjA0LDcgQEAKICAgICB3cml0ZSAvZGV2L2Jsa2lvL2JhY2tncm91bmQvYmxraW8uYmZxLndlaWdodCAxMAogICAgIHdyaXRlIC9kZXYvYmxraW8vYmxraW8uZ3JvdXBfaWRsZSAwCiAgICAgd3JpdGUgL2Rldi9ibGtpby9iYWNrZ3JvdW5kL2Jsa2lvLmdyb3VwX2lkbGUgMAorICAgIHdyaXRlIC9kZXYvYmxraW8vYmFja2dyb3VuZC9ibGtpby5wcmlvLmNsYXNzIHJlc3RyaWN0LXRvLWJlCiAKICAgICByZXN0b3JlY29uX3JlY3Vyc2l2ZSAvbW50CiAKQEAgLTI5NSw2ICsyNjAsOSBAQAogICAgIG1rZGlyIC9tbnQvcnVudGltZS9mdWxsIDA3NTUgcm9vdCByb290CiAgICAgbWtkaXIgL21udC9ydW50aW1lL2Z1bGwvc2VsZiAwNzU1IHJvb3Qgcm9vdAogCisgICAgIyBGb3IgUHJlLXJlYm9vdCBEZXhvcHQKKyAgICBta2RpciAvbW50L3ByZV9yZWJvb3RfZGV4b3B0IDA3NTUgYXJ0ZCBhcnRkCisKICAgICAjIFN5bWxpbmsgdG8ga2VlcCBsZWdhY3kgYXBwcyB3b3JraW5nIGluIG11bHRpLXVzZXIgd29ybGQKICAgICBzeW1saW5rIC9zdG9yYWdlL3NlbGYvcHJpbWFyeSAvbW50L3NkY2FyZAogICAgIHN5bWxpbmsgL21udC91c2VyLzAvcHJpbWFyeSAvbW50L3J1bnRpbWUvZGVmYXVsdC9zZWxmL3ByaW1hcnkKQEAgLTM0Myw2ICszMTEsOSBAQAogICAgIG1rZGlyIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQKICAgICBjb3B5IC9kZXYvY3B1c2V0L2NwdXMgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC9jcHVzCiAgICAgY29weSAvZGV2L2NwdXNldC9tZW1zIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvbWVtcworICAgIG1rZGlyIC9kZXYvY3B1c2V0L2ZvcmVncm91bmRfd2luZG93CisgICAgY29weSAvZGV2L2NwdXNldC9jcHVzIC9kZXYvY3B1c2V0L2ZvcmVncm91bmRfd2luZG93L2NwdXMKKyAgICBjb3B5IC9kZXYvY3B1c2V0L21lbXMgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZF93aW5kb3cvbWVtcwogICAgIG1rZGlyIC9kZXYvY3B1c2V0L2JhY2tncm91bmQKICAgICBjb3B5IC9kZXYvY3B1c2V0L2NwdXMgL2Rldi9jcHVzZXQvYmFja2dyb3VuZC9jcHVzCiAgICAgY29weSAvZGV2L2NwdXNldC9tZW1zIC9kZXYvY3B1c2V0L2JhY2tncm91bmQvbWVtcwpAQCAtMzcxLDYgKzM0Miw3IEBACiAgICAgIyBjaGFuZ2UgcGVybWlzc2lvbnMgZm9yIGFsbCBjcHVzZXRzIHdlJ2xsIHRvdWNoIGF0IHJ1bnRpbWUKICAgICBjaG93biBzeXN0ZW0gc3lzdGVtIC9kZXYvY3B1c2V0CiAgICAgY2hvd24gc3lzdGVtIHN5c3RlbSAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kCisgICAgY2hvd24gc3lzdGVtIHN5c3RlbSAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kX3dpbmRvdwogICAgIGNob3duIHN5c3RlbSBzeXN0ZW0gL2Rldi9jcHVzZXQvYmFja2dyb3VuZAogICAgIGNob3duIHN5c3RlbSBzeXN0ZW0gL2Rldi9jcHVzZXQvc3lzdGVtLWJhY2tncm91bmQKICAgICBjaG93biBzeXN0ZW0gc3lzdGVtIC9kZXYvY3B1c2V0L3RvcC1hcHAKQEAgLTM3OCw2ICszNTAsNyBAQAogICAgIGNob3duIHN5c3RlbSBzeXN0ZW0gL2Rldi9jcHVzZXQvY2FtZXJhLWRhZW1vbgogICAgIGNob3duIHN5c3RlbSBzeXN0ZW0gL2Rldi9jcHVzZXQvdGFza3MKICAgICBjaG93biBzeXN0ZW0gc3lzdGVtIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKKyAgICBjaG93biBzeXN0ZW0gc3lzdGVtIC9kZXYvY3B1c2V0L2ZvcmVncm91bmRfd2luZG93L3Rhc2tzCiAgICAgY2hvd24gc3lzdGVtIHN5c3RlbSAvZGV2L2NwdXNldC9iYWNrZ3JvdW5kL3Rhc2tzCiAgICAgY2hvd24gc3lzdGVtIHN5c3RlbSAvZGV2L2NwdXNldC9zeXN0ZW0tYmFja2dyb3VuZC90YXNrcwogICAgIGNob3duIHN5c3RlbSBzeXN0ZW0gL2Rldi9jcHVzZXQvdG9wLWFwcC90YXNrcwpAQCAtMzg1LDYgKzM1OCw3IEBACiAgICAgY2hvd24gc3lzdGVtIHN5c3RlbSAvZGV2L2NwdXNldC9jYW1lcmEtZGFlbW9uL3Rhc2tzCiAgICAgY2hvd24gc3lzdGVtIHN5c3RlbSAvZGV2L2NwdXNldC9jZ3JvdXAucHJvY3MKICAgICBjaG93biBzeXN0ZW0gc3lzdGVtIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvY2dyb3VwLnByb2NzCisgICAgY2hvd24gc3lzdGVtIHN5c3RlbSAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kX3dpbmRvdy9jZ3JvdXAucHJvY3MKICAgICBjaG93biBzeXN0ZW0gc3lzdGVtIC9kZXYvY3B1c2V0L2JhY2tncm91bmQvY2dyb3VwLnByb2NzCiAgICAgY2hvd24gc3lzdGVtIHN5c3RlbSAvZGV2L2NwdXNldC9zeXN0ZW0tYmFja2dyb3VuZC9jZ3JvdXAucHJvY3MKICAgICBjaG93biBzeXN0ZW0gc3lzdGVtIC9kZXYvY3B1c2V0L3RvcC1hcHAvY2dyb3VwLnByb2NzCkBAIC0zOTUsNiArMzY5LDcgQEAKICAgICBjaG1vZCAwNzc1IC9kZXYvY3B1c2V0L3N5c3RlbS1iYWNrZ3JvdW5kCiAKICAgICBjaG1vZCAwNjY0IC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKKyAgICBjaG1vZCAwNjY0IC9kZXYvY3B1c2V0L2ZvcmVncm91bmRfd2luZG93L3Rhc2tzCiAgICAgY2htb2QgMDY2NCAvZGV2L2NwdXNldC9iYWNrZ3JvdW5kL3Rhc2tzCiAgICAgY2htb2QgMDY2NCAvZGV2L2NwdXNldC9zeXN0ZW0tYmFja2dyb3VuZC90YXNrcwogICAgIGNobW9kIDA2NjQgL2Rldi9jcHVzZXQvdG9wLWFwcC90YXNrcwpAQCAtNDAyLDYgKzM3Nyw3IEBACiAgICAgY2htb2QgMDY2NCAvZGV2L2NwdXNldC90YXNrcwogICAgIGNobW9kIDA2NjQgL2Rldi9jcHVzZXQvY2FtZXJhLWRhZW1vbi90YXNrcwogICAgIGNobW9kIDA2NjQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC9jZ3JvdXAucHJvY3MKKyAgICBjaG1vZCAwNjY0IC9kZXYvY3B1c2V0L2ZvcmVncm91bmRfd2luZG93L2Nncm91cC5wcm9jcwogICAgIGNobW9kIDA2NjQgL2Rldi9jcHVzZXQvYmFja2dyb3VuZC9jZ3JvdXAucHJvY3MKICAgICBjaG1vZCAwNjY0IC9kZXYvY3B1c2V0L3N5c3RlbS1iYWNrZ3JvdW5kL2Nncm91cC5wcm9jcwogICAgIGNobW9kIDA2NjQgL2Rldi9jcHVzZXQvdG9wLWFwcC9jZ3JvdXAucHJvY3MKQEAgLTQxMywxNiArMzg5LDYgQEAKICAgICBjaG93biBzeXN0ZW0gc3lzdGVtIC9wcm9jL3ByZXNzdXJlL21lbW9yeQogICAgIGNobW9kIDA2NjQgL3Byb2MvcHJlc3N1cmUvbWVtb3J5CiAKLSAgICAjIHF0YWd1aWQgd2lsbCBsaW1pdCBhY2Nlc3MgdG8gc3BlY2lmaWMgZGF0YSBiYXNlZCBvbiBncm91cCBtZW1iZXJzaGlwcy4KLSAgICAjICAgbmV0X2J3X2FjY3QgZ3JhbnRzIGltcGVyc29uYXRpb24gb2Ygc29ja2V0IG93bmVycy4KLSAgICAjICAgbmV0X2J3X3N0YXRzIGdyYW50cyBhY2Nlc3MgdG8gb3RoZXIgYXBwcycgZGV0YWlsZWQgdGFnZ2VkLXNvY2tldCBzdGF0cy4KLSAgICBjaG93biByb290IG5ldF9id19hY2N0IC9wcm9jL25ldC94dF9xdGFndWlkL2N0cmwKLSAgICBjaG93biByb290IG5ldF9id19zdGF0cyAvcHJvYy9uZXQveHRfcXRhZ3VpZC9zdGF0cwotCi0gICAgIyBBbGxvdyBldmVyeWJvZHkgdG8gcmVhZCB0aGUgeHRfcXRhZ3VpZCByZXNvdXJjZSB0cmFja2luZyBtaXNjIGRldi4KLSAgICAjIFRoaXMgaXMgbmVlZGVkIGJ5IGFueSBwcm9jZXNzIHRoYXQgdXNlcyBzb2NrZXQgdGFnZ2luZy4KLSAgICBjaG1vZCAwNjQ0IC9kZXYveHRfcXRhZ3VpZAotCiAgICAgbW91bnQgYnBmIGJwZiAvc3lzL2ZzL2JwZiBub2RldiBub2V4ZWMgbm9zdWlkCiAKICAgICAjIHBzdG9yZS9yYW1vb3BzIHByZXZpb3VzIGNvbnNvbGUgbG9nCkBAIC00ODAsMTUgKzQ0NiwxNiBAQAogICAgIHN0YXJ0IGh3c2VydmljZW1hbmFnZXIKICAgICBzdGFydCB2bmRzZXJ2aWNlbWFuYWdlcgogCisgICAgIyBNb3VudCAvbW50L3ZtIEFTQVAgdG8gYWxsb3cgZWFybHkgVk1zIHRvIHJ1bi4KKyAgICBta2RpciAvbW50L3ZtIDA3NTUgcm9vdCByb290CisgICAgbW91bnQgdG1wZnMgdG1wZnMgL21udC92bSBub3N1aWQgbm9kZXYgbm9leGVjIHJ3CisgICAgcmVzdG9yZWNvbiAvbW50L3ZtCisgICAgY2hvd24gc3lzdGVtIHN5c3RlbSAvbW50L3ZtCisgICAgY2htb2QgMDc3MCAvbW50L3ZtCisgICAgbWtkaXIgL21udC92bS9lYXJseSAwNzcwIHN5c3RlbSBzeXN0ZW0KKwogIyBSdW4gYm9yaW5nc3NsIHNlbGYgdGVzdCBmb3IgZWFjaCBBQkkuICBBbnkgZmFpbHVyZXMgdHJpZ2dlciByZWJvb3QgdG8gZmlybXdhcmUuCi1vbiBpbml0ICYmIHByb3BlcnR5OnJvLnByb2R1Y3QuY3B1LmFiaWxpc3QzMj0qCi0gICAgZXhlY19zdGFydCBib3Jpbmdzc2xfc2VsZl90ZXN0MzIKLW9uIGluaXQgJiYgcHJvcGVydHk6cm8ucHJvZHVjdC5jcHUuYWJpbGlzdDY0PSoKLSAgICBleGVjX3N0YXJ0IGJvcmluZ3NzbF9zZWxmX3Rlc3Q2NAotb24gcHJvcGVydHk6YXBleGQuc3RhdHVzPXJlYWR5ICYmIHByb3BlcnR5OnJvLnByb2R1Y3QuY3B1LmFiaWxpc3QzMj0qCi0gICAgZXhlY19zdGFydCBib3Jpbmdzc2xfc2VsZl90ZXN0X2FwZXgzMgotb24gcHJvcGVydHk6YXBleGQuc3RhdHVzPXJlYWR5ICYmIHByb3BlcnR5OnJvLnByb2R1Y3QuY3B1LmFiaWxpc3Q2ND0qCi0gICAgZXhlY19zdGFydCBib3Jpbmdzc2xfc2VsZl90ZXN0X2FwZXg2NAoraW1wb3J0IC9zeXN0ZW0vZXRjL2luaXQvaHcvaW5pdC5ib3Jpbmdzc2wuJHtyby56eWdvdGV9LnJjCiAKIHNlcnZpY2UgYm9yaW5nc3NsX3NlbGZfdGVzdDMyIC9zeXN0ZW0vYmluL2JvcmluZ3NzbF9zZWxmX3Rlc3QzMgogICAgIHJlYm9vdF9vbl9mYWlsdXJlIHJlYm9vdCxib3Jpbmdzc2wtc2VsZi1jaGVjay1mYWlsZWQKQEAgLTU1MSw5ICs1MTgsMTAgQEAKICAgICB0cmlnZ2VyIHBvc3QtZnMtZGF0YQogCiAgICAgIyBTaG91bGQgYmUgYmVmb3JlIG5ldGQsIGJ1dCBhZnRlciBhcGV4LCBwcm9wZXJ0aWVzIGFuZCBsb2dnaW5nIGlzIGF2YWlsYWJsZS4KLSAgICB0cmlnZ2VyIGxvYWRfYnBmX3Byb2dyYW1zCisgICAgdHJpZ2dlciBsb2FkLWJwZi1wcm9ncmFtcworICAgIHRyaWdnZXIgYnBmLXByb2dzLWxvYWRlZAogCi0gICAgIyBOb3cgd2UgY2FuIHN0YXJ0IHp5Z290ZSBmb3IgZGV2aWNlcyB3aXRoIGZpbGUgYmFzZWQgZW5jcnlwdGlvbgorICAgICMgTm93IHdlIGNhbiBzdGFydCB6eWdvdGUuCiAgICAgdHJpZ2dlciB6eWdvdGUtc3RhcnQKIAogICAgICMgUmVtb3ZlIGEgZmlsZSB0byB3YWtlIHVwIGFueXRoaW5nIHdhaXRpbmcgZm9yIGZpcm13YXJlLgpAQCAtNjI0LDEwICs1OTIsMTAgQEAKICAgICBjaG1vZCAwNzAwIC9tZXRhZGF0YS92b2xkCiAgICAgbWtkaXIgL21ldGFkYXRhL3Bhc3N3b3JkX3Nsb3RzIDA3NzEgcm9vdCBzeXN0ZW0KICAgICBta2RpciAvbWV0YWRhdGEvYm9vdHN0YXQgMDc1MCBzeXN0ZW0gbG9nCi0gICAgbWtkaXIgL21ldGFkYXRhL290YSAwNzAwIHJvb3Qgc3lzdGVtCi0gICAgbWtkaXIgL21ldGFkYXRhL290YS9zbmFwc2hvdHMgMDcwMCByb290IHN5c3RlbQotICAgIG1rZGlyIC9tZXRhZGF0YS91c2Vyc3BhY2VyZWJvb3QgMDc3MCByb290IHN5c3RlbQorICAgIG1rZGlyIC9tZXRhZGF0YS9vdGEgMDc1MCByb290IHN5c3RlbQorICAgIG1rZGlyIC9tZXRhZGF0YS9vdGEvc25hcHNob3RzIDA3NTAgcm9vdCBzeXN0ZW0KICAgICBta2RpciAvbWV0YWRhdGEvd2F0Y2hkb2cgMDc3MCByb290IHN5c3RlbQorICAgIG1rZGlyIC9tZXRhZGF0YS90cmFkZWlubW9kZSAwNzcwIHJvb3Qgc3lzdGVtCiAKICAgICBta2RpciAvbWV0YWRhdGEvYXBleCAwNzAwIHJvb3Qgc3lzdGVtCiAgICAgbWtkaXIgL21ldGFkYXRhL2FwZXgvc2Vzc2lvbnMgMDcwMCByb290IHN5c3RlbQpAQCAtNjM5LDcgKzYwNywxOCBAQAogICAgIHJlc3RvcmVjb25fcmVjdXJzaXZlIC9tZXRhZGF0YS9hcGV4CiAKICAgICBta2RpciAvbWV0YWRhdGEvc3RhZ2VkLWluc3RhbGwgMDc3MCByb290IHN5c3RlbQotICAgIG1rZGlyIC9tZXRhZGF0YS9zZXBvbGljeSAwNzAwIHJvb3Qgcm9vdAorCisgICAgbWtkaXIgL21ldGFkYXRhL2Fjb25maWcgMDc3NSByb290IHN5c3RlbQorICAgIG1rZGlyIC9tZXRhZGF0YS9hY29uZmlnL2ZsYWdzIDA3NzAgcm9vdCBzeXN0ZW0KKyAgICBta2RpciAvbWV0YWRhdGEvYWNvbmZpZy9tYXBzIDA3NzUgcm9vdCBzeXN0ZW0KKyAgICBta2RpciAvbWV0YWRhdGEvYWNvbmZpZy9ib290IDA3NzUgcm9vdCBzeXN0ZW0KKworICAgIG1rZGlyIC9tZXRhZGF0YS9hY29uZmlnX3Rlc3RfbWlzc2lvbnMgMDc3NSByb290IHN5c3RlbQorCisgICAgIyBTZWUgZmxhZyBlbmFibGVfc3lzdGVtX2Fjb25maWdkX3J1c3QsIHdoaWNoIHRvZ2dsZXMgdGhlc2UgcHJvY2Vzc2VzLgorICAgIGV4ZWNfc3RhcnQgc3lzdGVtX2Fjb25maWdkX3BsYXRmb3JtX2luaXQKKyAgICBleGVjX3N0YXJ0IGFjb25maWdkLXBsYXRmb3JtLWluaXQKKwogb24gbGF0ZS1mcwogICAgICMgRW5zdXJlIHRoYXQgdHJhY2VmcyBoYXMgdGhlIGNvcnJlY3QgcGVybWlzc2lvbnMuCiAgICAgIyBUaGlzIGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IGlmIGl0IGlzIGNhbGxlZCBpbiBwb3N0LWZzLgpAQCAtNjUzLDEwICs2MzIsNiBAQAogICAgIGV4ZWMgLS0gL3N5c3RlbS9iaW4vZnN2ZXJpdHlfaW5pdCAtLWxvYWQtdmVyaWZpZWQta2V5cwogCiAjIE9ubHkgZW5hYmxlIHRoZSBib290cmVjZWl2ZXIgdHJhY2luZyBpbnN0YW5jZSBmb3Iga2VybmVscyA1LjEwIGFuZCBhYm92ZS4KLW9uIGxhdGUtZnMgJiYgcHJvcGVydHk6cm8ua2VybmVsLnZlcnNpb249NC45Ci0gICAgc2V0cHJvcCBib290cmVjZWl2ZXIuZW5hYmxlIDAKLW9uIGxhdGUtZnMgJiYgcHJvcGVydHk6cm8ua2VybmVsLnZlcnNpb249NC4xNAotICAgIHNldHByb3AgYm9vdHJlY2VpdmVyLmVuYWJsZSAwCiBvbiBsYXRlLWZzICYmIHByb3BlcnR5OnJvLmtlcm5lbC52ZXJzaW9uPTQuMTkKICAgICBzZXRwcm9wIGJvb3RyZWNlaXZlci5lbmFibGUgMAogb24gbGF0ZS1mcyAmJiBwcm9wZXJ0eTpyby5rZXJuZWwudmVyc2lvbj01LjQKQEAgLTY3Nyw4ICs2NTIsNiBAQAogCiBvbiBwb3N0LWZzLWRhdGEKIAotICAgIG1hcmtfcG9zdF9kYXRhCi0KICAgICAjIFN0YXJ0IGNoZWNrcG9pbnQgYmVmb3JlIHdlIHRvdWNoIGRhdGEKICAgICBleGVjIC0gc3lzdGVtIHN5c3RlbSAtLSAvc3lzdGVtL2Jpbi92ZGMgY2hlY2twb2ludCBwcmVwYXJlQ2hlY2twb2ludAogCkBAIC03MDQsNyArNjc3LDcgQEAKIAogICAgICMgU3RhcnQgdG9tYnN0b25lZCBlYXJseSB0byBiZSBhYmxlIHRvIHN0b3JlIHRvbWJzdG9uZXMuCiAgICAgbWtkaXIgL2RhdGEvYW5yIDA3NzUgc3lzdGVtIHN5c3RlbSBlbmNyeXB0aW9uPVJlcXVpcmUKLSAgICBta2RpciAvZGF0YS90b21ic3RvbmVzIDA3NzEgc3lzdGVtIHN5c3RlbSBlbmNyeXB0aW9uPVJlcXVpcmUKKyAgICBta2RpciAvZGF0YS90b21ic3RvbmVzIDA3NzUgc3lzdGVtIHN5c3RlbSBlbmNyeXB0aW9uPVJlcXVpcmUKICAgICBta2RpciAvZGF0YS92ZW5kb3IvdG9tYnN0b25lcyAwNzcxIHJvb3Qgcm9vdAogICAgIG1rZGlyIC9kYXRhL3ZlbmRvci90b21ic3RvbmVzL3dpZmkgMDc3MSB3aWZpIHdpZmkKICAgICBzdGFydCB0b21ic3RvbmVkCkBAIC04MDIsMTEgKzc3NSwxMSBAQAogICAgIG1rZGlyIC9kYXRhL21pc2MvYXBucyAwNzcwIHN5c3RlbSByYWRpbwogICAgIG1rZGlyIC9kYXRhL21pc2MvZW1lcmdlbmN5bnVtYmVyZGIgMDc3MCBzeXN0ZW0gcmFkaW8KICAgICBta2RpciAvZGF0YS9taXNjL25ldHdvcmtfd2F0Y2hsaXN0IDA3NzQgc3lzdGVtIHN5c3RlbQorICAgIG1rZGlyIC9kYXRhL21pc2MvdGVsZXBob255Y29uZmlnIDA3NzAgc3lzdGVtIHJhZGlvCiAgICAgbWtkaXIgL2RhdGEvbWlzYy90ZXh0Y2xhc3NpZmllciAwNzcxIHN5c3RlbSBzeXN0ZW0KICAgICBta2RpciAvZGF0YS9taXNjL3ZwbiAwNzcwIHN5c3RlbSB2cG4KICAgICBta2RpciAvZGF0YS9taXNjL3NoYXJlZF9yZWxybyAwNzcxIHNoYXJlZF9yZWxybyBzaGFyZWRfcmVscm8KICAgICBta2RpciAvZGF0YS9taXNjL3N5c3RlbWtleXMgMDcwMCBzeXN0ZW0gc3lzdGVtCi0gICAgbWtkaXIgL2RhdGEvbWlzYy90aHJlYWRuZXR3b3JrIDA3NzAgdGhyZWFkX25ldHdvcmsgdGhyZWFkX25ldHdvcmsKICAgICBta2RpciAvZGF0YS9taXNjL3dpZmkgMDc3MCB3aWZpIHdpZmkKICAgICBta2RpciAvZGF0YS9taXNjL3dpZmkvc29ja2V0cyAwNzcwIHdpZmkgd2lmaQogICAgIG1rZGlyIC9kYXRhL21pc2Mvd2lmaS93cGFfc3VwcGxpY2FudCAwNzcwIHdpZmkgd2lmaQpAQCAtODM4LDYgKzgxMSw3IEBACiAgICAgbWtkaXIgL2RhdGEvbWlzYy9hcGV4ZGF0YSAwNzExIHJvb3Qgcm9vdAogICAgIG1rZGlyIC9kYXRhL21pc2MvYXBleHJvbGxiYWNrIDA3MDAgcm9vdCByb290CiAgICAgbWtkaXIgL2RhdGEvbWlzYy9hcHBjb21wYXQvIDA3MDAgc3lzdGVtIHN5c3RlbQorICAgIG1rZGlyIC9kYXRhL21pc2MvdXByb2Jlc3RhdHMtY29uZmlncy8gMDc3NyB1cHJvYmVzdGF0cyB1cHJvYmVzdGF0cwogICAgIG1rZGlyIC9kYXRhL21pc2Mvc25hcHNob3RjdGxfbG9nIDA3NTUgcm9vdCByb290CiAgICAgIyBjcmVhdGUgbG9jYXRpb24gdG8gc3RvcmUgcHJlLXJlYm9vdCBpbmZvcm1hdGlvbgogICAgIG1rZGlyIC9kYXRhL21pc2MvcHJlcmVib290IDA3MDAgc3lzdGVtIHN5c3RlbQpAQCAtODQ3LDYgKzgyMSw4IEBACiAgICAgbWtkaXIgL2RhdGEvbWlzYy9vZHNpZ24gMDcxMCByb290IHN5c3RlbQogICAgICMgZGlyZWN0b3J5IHVzZWQgZm9yIG9kc2lnbiBtZXRyaWNzCiAgICAgbWtkaXIgL2RhdGEvbWlzYy9vZHNpZ24vbWV0cmljcyAwNzcwIHJvb3Qgc3lzdGVtCisgICAgIyBkaXJlY3RvcnkgdXNlZCBmb3IgY29ubmVjdGl2aXR5IGJsb2Igc3RvcmUuCisgICAgbWtkaXIgL2RhdGEvbWlzYy9jb25uZWN0aXZpdHlibG9iZGIgMDc3MCBzeXN0ZW0gc3lzdGVtCiAKICAgICAjIERpcmVjdG9yeSBmb3IgVmlydHVhbGl6YXRpb25TZXJ2aWNlIHRlbXBvcmFyeSBpbWFnZSBmaWxlcy4KICAgICAjIERlbGV0ZSBhbnkgc3RhbGUgZmlsZXMgb3duZWQgYnkgdGhlIG9sZCB2aXJ0dWFsaXphdGlvbnNlcnZpY2UgdWlkIChiLzIzMDA1NjcyNikuCkBAIC04NjgsNiArODQ0LDkgQEAKICAgICBta2RpciAvZGF0YS9hcHAtbGliIDA3NzEgc3lzdGVtIHN5c3RlbSBlbmNyeXB0aW9uPVJlcXVpcmUKICAgICBta2RpciAvZGF0YS9hcHAgMDc3MSBzeXN0ZW0gc3lzdGVtIGVuY3J5cHRpb249UmVxdWlyZQogCisgICAgIyBDcmVhdGUgZGlyZWN0b3J5IGZvciBhcHAgbWV0YWRhdGEgZmlsZXMKKyAgICBta2RpciAvZGF0YS9hcHAtbWV0YWRhdGEgMDcwMCBzeXN0ZW0gc3lzdGVtIGVuY3J5cHRpb249UmVxdWlyZQorCiAgICAgIyBjcmVhdGUgZGlyZWN0b3J5IGZvciB1cGRhdGVkIGZvbnQgZmlsZXMuCiAgICAgbWtkaXIgL2RhdGEvZm9udHMvIDA3NzEgcm9vdCByb290IGVuY3J5cHRpb249UmVxdWlyZQogICAgIG1rZGlyIC9kYXRhL2ZvbnRzL2ZpbGVzIDA3NzEgc3lzdGVtIHN5c3RlbQpAQCAtOTM5LDE1ICs5MTgsMjYgQEAKICAgICAjIGVuY3J5cHRpb24gcG9saWNpZXMgYXBwbHkgcmVjdXJzaXZlbHkuICBUaGVzZSBkaXJlY3RvcmllcyBzaG91bGQgbmV2ZXIKICAgICAjIGNvbnRhaW4gYW55IHN1YmRpcmVjdG9yaWVzIG90aGVyIHRoYW4gdGhlIHBlci11c2VyIG9uZXMuICAvZGF0YS9tZWRpYS9vYmIKICAgICAjIGlzIGFuIGV4Y2VwdGlvbiB0aGF0IGV4aXN0cyBmb3IgbGVnYWN5IHJlYXNvbnMuCi0gICAgbWtkaXIgL2RhdGEvbWVkaWEgMDc3MCBtZWRpYV9ydyBtZWRpYV9ydyBlbmNyeXB0aW9uPU5vbmUKLSAgICBta2RpciAvZGF0YS9taXNjX2NlIDAxNzcxIHN5c3RlbSBtaXNjIGVuY3J5cHRpb249Tm9uZQotICAgIG1rZGlyIC9kYXRhL21pc2NfZGUgMDE3NzEgc3lzdGVtIG1pc2MgZW5jcnlwdGlvbj1Ob25lCi0gICAgbWtkaXIgL2RhdGEvc3lzdGVtX2NlIDA3NzAgc3lzdGVtIHN5c3RlbSBlbmNyeXB0aW9uPU5vbmUKLSAgICBta2RpciAvZGF0YS9zeXN0ZW1fZGUgMDc3MCBzeXN0ZW0gc3lzdGVtIGVuY3J5cHRpb249Tm9uZQotICAgIG1rZGlyIC9kYXRhL3VzZXIgMDcxMSBzeXN0ZW0gc3lzdGVtIGVuY3J5cHRpb249Tm9uZQotICAgIG1rZGlyIC9kYXRhL3VzZXJfZGUgMDcxMSBzeXN0ZW0gc3lzdGVtIGVuY3J5cHRpb249Tm9uZQotICAgIG1rZGlyIC9kYXRhL3ZlbmRvcl9jZSAwNzcxIHJvb3Qgcm9vdCBlbmNyeXB0aW9uPU5vbmUKLSAgICBta2RpciAvZGF0YS92ZW5kb3JfZGUgMDc3MSByb290IHJvb3QgZW5jcnlwdGlvbj1Ob25lCisgICAgIworICAgICMgRG9uJ3QgdXNlIGFueSB3cml0ZSBtb2RlIGJpdHMgKDAyMjIpIGZvciBhbnkgb2YgdGhlc2UgZGlyZWN0b3JpZXMsIHNpbmNlCisgICAgIyB0aGUgb25seSBwcm9jZXNzIHRoYXQgc2hvdWxkIHdyaXRlIHRvIHRoZW0gZGlyZWN0bHkgaXMgdm9sZCAoc2luY2UgaXQKKyAgICAjIG5lZWRzIHRvIHNldCB1cCBmaWxlLWJhc2VkIGVuY3J5cHRpb24gb24gdGhlIHN1YmRpcmVjdG9yaWVzKSwgd2hpY2ggcnVucworICAgICMgYXMgcm9vdCB3aXRoIENBUF9EQUNfT1ZFUlJJREUuICBUaGlzIGlzIGFsc28gZnVsbHkgZW5mb3JjZWQgdmlhIHRoZQorICAgICMgU0VMaW51eCBwb2xpY3kuICBCdXQgd2UgYWxzbyBzZXQgdGhlIERBQyBmaWxlIG1vZGVzIGFjY29yZGluZ2x5LCB0byB0cnkgdG8KKyAgICAjIG1pbmltaXplIGRpZmZlcmVuY2VzIGluIGJlaGF2aW9yIGlmIFNFTGludXggaXMgc2V0IHRvIHBlcm1pc3NpdmUgbW9kZS4KKyAgICBta2RpciAvZGF0YS9tZWRpYSAwNTUwIG1lZGlhX3J3IG1lZGlhX3J3IGVuY3J5cHRpb249Tm9uZQorICAgIG1rZGlyIC9kYXRhL21pc2NfY2UgMDU1MSBzeXN0ZW0gbWlzYyBlbmNyeXB0aW9uPU5vbmUKKyAgICBta2RpciAvZGF0YS9taXNjX2RlIDA1NTEgc3lzdGVtIG1pc2MgZW5jcnlwdGlvbj1Ob25lCisgICAgbWtkaXIgL2RhdGEvc3lzdGVtX2NlIDA1NTAgc3lzdGVtIHN5c3RlbSBlbmNyeXB0aW9uPU5vbmUKKyAgICBta2RpciAvZGF0YS9zeXN0ZW1fZGUgMDU1MCBzeXN0ZW0gc3lzdGVtIGVuY3J5cHRpb249Tm9uZQorICAgIG1rZGlyIC9kYXRhL3VzZXIgMDUxMSBzeXN0ZW0gc3lzdGVtIGVuY3J5cHRpb249Tm9uZQorICAgIG1rZGlyIC9kYXRhL3VzZXJfZGUgMDUxMSBzeXN0ZW0gc3lzdGVtIGVuY3J5cHRpb249Tm9uZQorICAgIG1rZGlyIC9kYXRhL3ZlbmRvcl9jZSAwNTUxIHJvb3Qgcm9vdCBlbmNyeXB0aW9uPU5vbmUKKyAgICBta2RpciAvZGF0YS92ZW5kb3JfZGUgMDU1MSByb290IHJvb3QgZW5jcnlwdGlvbj1Ob25lCisKKyAgICAjIFNpbWlsYXIgdG8gdGhlIHRvcC1sZXZlbCBDRSBhbmQgREUgZGlyZWN0b3JpZXMsIC9kYXRhL3N0b3JhZ2VfYXJlYSBtdXN0CisgICAgIyBpdHNlbGYgYmUgdW5lbmNyeXB0ZWQsIHNpbmNlIGl0IGNvbnRhaW5zIGVuY3J5cHRlZCBkaXJlY3Rvcmllcy4KKyAgICBta2RpciAvZGF0YS9zdG9yYWdlX2FyZWEgMDU1MSByb290IHJvb3QgZW5jcnlwdGlvbj1Ob25lCiAKICAgICAjIFNldCB0aGUgY2FzZWZvbGQgZmxhZyBvbiAvZGF0YS9tZWRpYS4gIEZvciB1cGdyYWRlcywgYSByZXN0b3JlY29uIGNhbiBiZQogICAgICMgbmVlZGVkIGZpcnN0IHRvIHJlbGFiZWwgdGhlIGRpcmVjdG9yeSBmcm9tIG1lZGlhX3J3X2RhdGFfZmlsZS4KQEAgLTk2Miw4ICs5NTIsMTIgQEAKICAgICBta2RpciAvZGF0YV9taXJyb3IvZGF0YV9kZSAwNzAwIHJvb3Qgcm9vdAogICAgIG1rZGlyIC9kYXRhX21pcnJvci9taXNjX2NlIDA3MDAgcm9vdCByb290CiAgICAgbWtkaXIgL2RhdGFfbWlycm9yL21pc2NfZGUgMDcwMCByb290IHJvb3QKKyAgICBta2RpciAvZGF0YV9taXJyb3Ivc3RvcmFnZV9hcmVhIDA3MDAgcm9vdCByb290CiAKICAgICAjIENyZWF0ZSBDRSBhbmQgREUgZGF0YSBkaXJlY3RvcnkgZm9yIGRlZmF1bHQgdm9sdW1lCisgICAgIyBOb3QgbmVlZGVkIGZvciBzdG9yYWdlX2FyZWEgZGlyZWN0b3J5LCBzaW5jZSB0aGlzIGlzCisgICAgIyBub3Qgc3VwcG9ydGVkIGZvciBub24tZGVmYXVsdCB2b2x1bWVzIGFuZCB0aGUgcGF0aAorICAgICMgZG9lcyBub3QgaW5jbHVkZSB0aGUgdm9sdW1lIElECiAgICAgbWtkaXIgL2RhdGFfbWlycm9yL2RhdGFfY2UvbnVsbCAwNzAwIHJvb3Qgcm9vdAogICAgIG1rZGlyIC9kYXRhX21pcnJvci9kYXRhX2RlL251bGwgMDcwMCByb290IHJvb3QKICAgICBta2RpciAvZGF0YV9taXJyb3IvbWlzY19jZS9udWxsIDA3MDAgcm9vdCByb290CkBAIC05NzgsNiArOTcyLDkgQEAKICAgICBtb3VudCBub25lIC9kYXRhL21pc2NfY2UgL2RhdGFfbWlycm9yL21pc2NfY2UvbnVsbCBiaW5kIHJlYwogICAgIG1vdW50IG5vbmUgL2RhdGEvbWlzY19kZSAvZGF0YV9taXJyb3IvbWlzY19kZS9udWxsIGJpbmQgcmVjCiAKKyAgICAjIEFsc28gYmluZCBtb3VudCBmb3IgdGhlIHN0b3JhZ2UgYXJlYSBkaXJlY3RvcnkgKG1pbnVzIHRoZSB2b2x1bWUgSUQpCisgICAgbW91bnQgbm9uZSAvZGF0YS9zdG9yYWdlX2FyZWEgL2RhdGFfbWlycm9yL3N0b3JhZ2VfYXJlYSBiaW5kIHJlYworCiAgICAgIyBDcmVhdGUgbWlycm9yIGRpcmVjdG9yeSBmb3Igaml0IHByb2ZpbGVzCiAgICAgbWtkaXIgL2RhdGFfbWlycm9yL2N1cl9wcm9maWxlcyAwNzAwIHJvb3Qgcm9vdAogICAgIG1vdW50IG5vbmUgL2RhdGEvbWlzYy9wcm9maWxlcy9jdXIgL2RhdGFfbWlycm9yL2N1cl9wcm9maWxlcyBiaW5kIHJlYwpAQCAtMTAwOSw4ICsxMDA2LDE5IEBACiAgICAgd2FpdF9mb3JfcHJvcCBhcGV4ZC5zdGF0dXMgYWN0aXZhdGVkCiAgICAgcGVyZm9ybV9hcGV4X2NvbmZpZwogCisgICAgIyBTZWUgZmxhZyBlbmFibGVfc3lzdGVtX2Fjb25maWdkX3J1c3QsIHdoaWNoIHRvZ2dsZXMgdGhlc2UgcHJvY2Vzc2VzLgorICAgIGV4ZWNfc3RhcnQgYWNvbmZpZ2QtbWFpbmxpbmUtaW5pdAorICAgIGV4ZWNfc3RhcnQgc3lzdGVtX2Fjb25maWdkX21haW5saW5lX2luaXQKKworICAgICMgc3lzdGVtX2Fjb25maWdkX3NvY2tldF9zZXJ2aWNlIGlzIHJlcGxhY2luZyBhY29uZmlnZDoKKyAgICAjICAgLSBBIGZsYWcgKGVuYWJsZV9zeXN0ZW1fYWNvbmZpZ2RfcnVzdCkgdG9nZ2xlcyB3aGljaCBzb2NrZXQgZXhlY3V0ZXMuCisgICAgIyAgIC0gV2hlbiBlbmFibGVkLCBhY29uZmlnZCBpcyBhIG5vLW9wLCBzeXN0ZW1fYWNvbmZpZ2Rfc29ja2V0X3NlcnZpY2UgZXhlY3V0ZXMuCisgICAgIyAgIC0gQ29udmVyc2VseSwgd2hlbiBkaXNhYmxlZCwgYWNvbmZpZ2QgZXhlY3V0ZXMsIGFuZCBzeXN0ZW1fYWNvbmZpZ2Rfc29ja2V0X3NlcnZpY2UgaXMgYSBuby1vcC4KKyAgICBzdGFydCBzeXN0ZW1fYWNvbmZpZ2Rfc29ja2V0X3NlcnZpY2UKKyAgICBzdGFydCBhY29uZmlnZAorCiAgICAgIyBDcmVhdGUgZGlyZWN0b3JpZXMgZm9yIGJvb3QgYW5pbWF0aW9uLgotICAgIG1rZGlyIC9kYXRhL2Jvb3RhbmltIDA3NTUgc3lzdGVtIHN5c3RlbSBlbmNyeXB0aW9uPURlbGV0ZUlmTmVjZXNzYXJ5CisgICAgbWtkaXIgL2RhdGEvbWlzYy9ib290YW5pbSAwNzU1IHN5c3RlbSBzeXN0ZW0KIAogICAgIGV4ZWNfc3RhcnQgZGVyaXZlX3NkawogCkBAIC0xMDM0LDEzICsxMDQyLDkgQEAKICAgICAjIE11c3Qgc3RhcnQgYWZ0ZXIgJ2Rlcml2ZV9jbGFzc3BhdGgnIHRvIGhhdmUgKkNMQVNTUEFUSCB2YXJpYWJsZXMgc2V0LgogICAgIHN0YXJ0IG9kc2lnbgogCi0gICAgIyBCZWZvcmUgd2UgY2FuIGxvY2sga2V5cyBhbmQgcHJvY2VlZCB0byB0aGUgbmV4dCBib290IHN0YWdlLCB3YWl0IGZvcgotICAgICMgb2RzaWduIHRvIGJlIGRvbmUgd2l0aCB0aGUga2V5CisgICAgIyBXYWl0IGZvciBvZHNpZ24gdG8gYmUgZG9uZSB3aXRoIHRoZSBrZXkuCiAgICAgd2FpdF9mb3JfcHJvcCBvZHNpZ24ua2V5LmRvbmUgMQogCi0gICAgIyBMb2NrIHRoZSBmcy12ZXJpdHkga2V5cmluZywgc28gbm8gbW9yZSBrZXlzIGNhbiBiZSBhZGRlZAotICAgIGV4ZWMgLS0gL3N5c3RlbS9iaW4vZnN2ZXJpdHlfaW5pdCAtLWxvY2sKLQogICAgICMgQnVtcCB0aGUgYm9vdCBsZXZlbCB0byAxMDAwMDAwMDAwOyB0aGlzIHByZXZlbnRzIGZ1cnRoZXIgb24tZGV2aWNlIHNpZ25pbmcuCiAgICAgIyBUaGlzIGlzIGEgc3BlY2lhbCB2YWx1ZSB0aGF0IHNodXRzIGRvd24gdGhlIHRocmVhZCB3aGljaCBsaXN0ZW5zIGZvcgogICAgICMgZnVydGhlciB1cGRhdGVzLgpAQCAtMTA2NywzMiArMTA3MSwzMiBAQAogICAgICMgVXBkYXRlIGRtLXZlcml0eSBzdGF0ZSBhbmQgc2V0IHBhcnRpdGlvbi4qLnZlcmlmaWVkIHByb3BlcnRpZXMuCiAgICAgdmVyaXR5X3VwZGF0ZV9zdGF0ZQogCitvbiBwcm9wZXJ0eTp2b2xkLmNoZWNrcG9pbnRfY29tbWl0dGVkPTEKKyAgICB0cmlnZ2VyIHBvc3QtZnMtZGF0YS1jaGVja3BvaW50ZWQKKworIyBJdCBpcyBpbXBvcnRhbnQgdGhhdCB3ZSBzdGFydCBicGZsb2FkZXIgYWZ0ZXI6CisjICAgLSAvc3lzL2ZzL2JwZiBpcyBhbHJlYWR5IG1vdW50ZWQsCisjICAgLSBhcGV4IChpbmNsLiByb2xsYmFjaykgaXMgaW5pdGlhbGl6ZWQgKHNvIHRoYXQgd2UgY2FuIGxvYWQgYnBmCisjICAgICBwcm9ncmFtcyBzaGlwcGVkIGFzIHBhcnQgb2YgYXBleCBtYWlubGluZSBtb2R1bGVzKQorIyAgIC0gbG9nZCBpcyByZWFkeSBmb3IgdXMgdG8gbG9nIHN0dWZmCisjCisjIEF0IHRoZSBzYW1lIHRpbWUgd2Ugd2FudCB0byBiZSBhcyBlYXJseSBhcyBwb3NzaWJsZSB0byByZWR1Y2UgcmFjZXMgYW5kIHRodXMKKyMgZmFpbHVyZXMgKGJlZm9yZSBtZW1vcnkgaXMgZnJhZ21lbnRlZCwgYW5kIGNwdSBpcyBidXN5IHJ1bm5pbmcgdG9ucyBvZiBvdGhlcgorIyBzdHVmZikgYW5kIHdlIGFic29sdXRlbHkgd2FudCB0byBiZSBiZWZvcmUgbmV0ZCBhbmQgdGhlIHN5c3RlbSBib290IHNsb3QgaXMKKyMgY29uc2lkZXJlZCB0byBoYXZlIGJvb3RlZCBzdWNjZXNzZnVsbHkuCitvbiBsb2FkLWJwZi1wcm9ncmFtcworICAgIGV4ZWNfc3RhcnQgYnBmbG9hZGVyCisKK29uIGJwZi1wcm9ncy1sb2FkZWQKKyAgICBzdGFydCBuZXRkCisKICMgSXQgaXMgcmVjb21tZW5kZWQgdG8gcHV0IHVubmVjZXNzYXJ5IGRhdGEvIGluaXRpYWxpemF0aW9uIGZyb20gcG9zdC1mcy1kYXRhCiAjIHRvIHN0YXJ0LXp5Z290ZSBpbiBkZXZpY2UncyBpbml0LnJjIHRvIHVuYmxvY2sgenlnb3RlIHN0YXJ0Lgotb24genlnb3RlLXN0YXJ0ICYmIHByb3BlcnR5OnJvLmNyeXB0by5zdGF0ZT11bmVuY3J5cHRlZAorb24genlnb3RlLXN0YXJ0CiAgICAgd2FpdF9mb3JfcHJvcCBvZHNpZ24udmVyaWZpY2F0aW9uLmRvbmUgMQogICAgICMgQS9CIHVwZGF0ZSB2ZXJpZmllciB0aGF0IG1hcmtzIGEgc3VjY2Vzc2Z1bCBib290LgotICAgIGV4ZWNfc3RhcnQgdXBkYXRlX3ZlcmlmaWVyX25vbmVuY3J5cHRlZAorICAgIGV4ZWNfc3RhcnQgdXBkYXRlX3ZlcmlmaWVyCiAgICAgc3RhcnQgc3RhdHNkCi0gICAgc3RhcnQgbmV0ZAotICAgIHN0YXJ0IHp5Z290ZQotICAgIHN0YXJ0IHp5Z290ZV9zZWNvbmRhcnkKLQotb24genlnb3RlLXN0YXJ0ICYmIHByb3BlcnR5OnJvLmNyeXB0by5zdGF0ZT11bnN1cHBvcnRlZAotICAgIHdhaXRfZm9yX3Byb3Agb2RzaWduLnZlcmlmaWNhdGlvbi5kb25lIDEKLSAgICAjIEEvQiB1cGRhdGUgdmVyaWZpZXIgdGhhdCBtYXJrcyBhIHN1Y2Nlc3NmdWwgYm9vdC4KLSAgICBleGVjX3N0YXJ0IHVwZGF0ZV92ZXJpZmllcl9ub25lbmNyeXB0ZWQKLSAgICBzdGFydCBzdGF0c2QKLSAgICBzdGFydCBuZXRkCi0gICAgc3RhcnQgenlnb3RlCi0gICAgc3RhcnQgenlnb3RlX3NlY29uZGFyeQotCi1vbiB6eWdvdGUtc3RhcnQgJiYgcHJvcGVydHk6cm8uY3J5cHRvLnN0YXRlPWVuY3J5cHRlZCAmJiBwcm9wZXJ0eTpyby5jcnlwdG8udHlwZT1maWxlCi0gICAgd2FpdF9mb3JfcHJvcCBvZHNpZ24udmVyaWZpY2F0aW9uLmRvbmUgMQotICAgICMgQS9CIHVwZGF0ZSB2ZXJpZmllciB0aGF0IG1hcmtzIGEgc3VjY2Vzc2Z1bCBib290LgotICAgIGV4ZWNfc3RhcnQgdXBkYXRlX3ZlcmlmaWVyX25vbmVuY3J5cHRlZAotICAgIHN0YXJ0IHN0YXRzZAotICAgIHN0YXJ0IG5ldGQKICAgICBzdGFydCB6eWdvdGUKICAgICBzdGFydCB6eWdvdGVfc2Vjb25kYXJ5CiAKQEAgLTExMDEsNiArMTEwNSw5IEBACiAgICAgd3JpdGUgL3Byb2Mvc3lzL3ZtL2RpcnR5X2V4cGlyZV9jZW50aXNlY3MgMjAwCiAgICAgd3JpdGUgL3Byb2Mvc3lzL3ZtL2RpcnR5X2JhY2tncm91bmRfcmF0aW8gIDUKIAorb24gYm9vdCAmJiBwcm9wZXJ0eTpzdXNwZW5kLmRpc2FibGVfc3luY19vbl9zdXNwZW5kPXRydWUKKyAgICB3cml0ZSAvc3lzL3Bvd2VyL3N5bmNfb25fc3VzcGVuZCAwCisKIG9uIGJvb3QKICAgICAjIGJhc2ljIG5ldHdvcmsgaW5pdAogICAgIGlmdXAgbG8KQEAgLTExNDIsNyArMTE0OSw3IEBACiAgICAgd3JpdGUgL2Rldi9zeXMvZnMvYnktbmFtZS91c2VyZGF0YS9pb3N0YXRfZW5hYmxlIDEKIAogICAgICMgc2V0IHJlYWRhaGVhZCBtdWx0aXBsaWVyIGZvciBQT1NJWF9GQURWX1NFUVVFTlRJQUwgZmlsZXMKLSAgICB3cml0ZSAvZGV2L3N5cy9mcy9ieS1uYW1lL3VzZXJkYXRhL3NlcV9maWxlX3JhX211bCAxNgorICAgIHdyaXRlIC9kZXYvc3lzL2ZzL2J5LW5hbWUvdXNlcmRhdGEvc2VxX2ZpbGVfcmFfbXVsIDEyOAogCiAgICAgIyBsaW1pdCBkaXNjYXJkIHNpemUgdG8gMTI4TUIgaW4gb3JkZXIgdG8gYXZvaWQgbG9uZyBJTyBsYXRlbmN5CiAgICAgIyBmb3IgZmlsZXN5c3RlbSB0dW5pbmcgZmlyc3QgKGRtIG9yIHNkYSkKQEAgLTEyMDAsNiArMTIwNyw5IEBACiAgICAgY2hvd24gc3lzdGVtIHN5c3RlbSAvc3lzL2tlcm5lbC9pcHY0L3RjcF9ybWVtX21pbgogICAgIGNob3duIHN5c3RlbSBzeXN0ZW0gL3N5cy9rZXJuZWwvaXB2NC90Y3Bfcm1lbV9kZWYKICAgICBjaG93biBzeXN0ZW0gc3lzdGVtIC9zeXMva2VybmVsL2lwdjQvdGNwX3JtZW1fbWF4CisgICAgY2hvd24gc3lzdGVtIHN5c3RlbSAvc3lzL2Zpcm13YXJlL2FjcGkvdGFibGVzCisgICAgY2hvd24gc3lzdGVtIHN5c3RlbSAvc3lzL2Zpcm13YXJlL2FjcGkvdGFibGVzL0JFUlQKKyAgICBjaG93biBzeXN0ZW0gc3lzdGVtIC9zeXMvZmlybXdhcmUvYWNwaS90YWJsZXMvZGF0YS9CRVJUCiAgICAgY2hvd24gcm9vdCByYWRpbyAvcHJvYy9jbWRsaW5lCiAgICAgY2hvd24gcm9vdCBzeXN0ZW0gL3Byb2MvYm9vdGNvbmZpZwogCkBAIC0xMjUwLDcgKzEyNjAsNyBAQAogIyBjb250cm9sbGluZyBhY2Nlc3MuIE9uIG9sZGVyIGtlcm5lbHMsIHRoZSBwYXJhbm9pZCB2YWx1ZSBpcyB0aGUgb25seSBtZWFucyBvZgogIyBjb250cm9sbGluZyBhY2Nlc3MuIEl0IGlzIG5vcm1hbGx5IDMgKGFsbG93IG9ubHkgcm9vdCksIGJ1dCB0aGUgc2hlbGwgdXNlcgogIyBjYW4gbG93ZXIgaXQgdG8gMSAoYWxsb3dpbmcgdGhyZWFkLXNjb3BlZCBwb2ZpbGluZykgdmlhIHNlY3VyaXR5LnBlcmZfaGFyZGVuLgotb24gbG9hZF9icGZfcHJvZ3JhbXMgJiYgcHJvcGVydHk6c3lzLmluaXQucGVyZl9sc21faG9va3M9MQorb24gbG9hZC1icGYtcHJvZ3JhbXMgJiYgcHJvcGVydHk6c3lzLmluaXQucGVyZl9sc21faG9va3M9MQogICAgIHdyaXRlIC9wcm9jL3N5cy9rZXJuZWwvcGVyZl9ldmVudF9wYXJhbm9pZCAtMQogb24gcHJvcGVydHk6c2VjdXJpdHkucGVyZl9oYXJkZW49MCAmJiBwcm9wZXJ0eTpzeXMuaW5pdC5wZXJmX2xzbV9ob29rcz0iIgogICAgIHdyaXRlIC9wcm9jL3N5cy9rZXJuZWwvcGVyZl9ldmVudF9wYXJhbm9pZCAxCkBAIC0xMzE1LDQ0ICsxMzI1LDYgQEAKIG9uIGluaXQgJiYgcHJvcGVydHk6cm8uZGVidWdnYWJsZT0xCiAgICAgc3RhcnQgY29uc29sZQogCi1vbiB1c2Vyc3BhY2UtcmVib290LXJlcXVlc3RlZAotICAjIFRPRE8oYi8xMzU5ODQ2NzQpOiByZXNldCBhbGwgbmVjZXNzYXJ5IHByb3BlcnRpZXMgaGVyZS4KLSAgc2V0cHJvcCBzeXMuYm9vdF9jb21wbGV0ZWQgIiIKLSAgc2V0cHJvcCBkZXYuYm9vdGNvbXBsZXRlICIiCi0gIHNldHByb3Agc3lzLmluaXQudXBkYXRhYmxlX2NyYXNoaW5nICIiCi0gIHNldHByb3Agc3lzLmluaXQudXBkYXRhYmxlX2NyYXNoaW5nX3Byb2Nlc3NfbmFtZSAiIgotICBzZXRwcm9wIHN5cy51c2VyLjAuY2VfYXZhaWxhYmxlICIiCi0gIHNldHByb3Agc3lzLnNodXRkb3duLnJlcXVlc3RlZCAiIgotICBzZXRwcm9wIHNlcnZpY2UuYm9vdGFuaW0uZXhpdCAiIgotICBzZXRwcm9wIHNlcnZpY2UuYm9vdGFuaW0ucHJvZ3Jlc3MgIiIKLQotb24gdXNlcnNwYWNlLXJlYm9vdC1mcy1yZW1vdW50Ci0gICMgTWFrZSBzdXJlIHRoYXQgdm9sZCBpcyBydW5uaW5nLgotICAjIFRoaXMgaXMgbW9zdGx5IGEgcHJlY2F1dGlvbiBtZWFzdXJlIGluIGNhc2Ugdm9sZCBmb3Igc29tZSByZWFzb24gd2Fzbid0IHJ1bm5pbmcgd2hlbgotICAjIHVzZXJzcGFjZSByZWJvb3Qgd2FzIGluaXRpYXRlZC4KLSAgc3RhcnQgdm9sZAotICBleGVjIC0gc3lzdGVtIHN5c3RlbSAtLSAvc3lzdGVtL2Jpbi92ZGMgY2hlY2twb2ludCByZXNldENoZWNrcG9pbnQKLSAgZXhlYyAtIHN5c3RlbSBzeXN0ZW0gLS0gL3N5c3RlbS9iaW4vdmRjIGNoZWNrcG9pbnQgbWFya0Jvb3RBdHRlbXB0Ci0gICMgVW5tb3VudCAvZGF0YV9taXJyb3IgbW91bnRzIGluIHRoZSByZXZlcnNlIG9yZGVyIG9mIGNvcnJlc3BvbmRpbmcgbW91bnRzLgotICB1bW91bnQgL2RhdGFfbWlycm9yL2RhdGFfY2UvbnVsbC8wCi0gIHVtb3VudCAvZGF0YV9taXJyb3IvZGF0YV9jZS9udWxsCi0gIHVtb3VudCAvZGF0YV9taXJyb3IvZGF0YV9kZS9udWxsCi0gIHVtb3VudCAvZGF0YV9taXJyb3IvY3VyX3Byb2ZpbGVzCi0gIHVtb3VudCAvZGF0YV9taXJyb3IvcmVmX3Byb2ZpbGVzCi0gIHVtb3VudCAvZGF0YV9taXJyb3IKLSAgcmVtb3VudF91c2VyZGF0YQotICBzdGFydCBib290YW5pbQotCi1vbiB1c2Vyc3BhY2UtcmVib290LXJlc3VtZQotICB0cmlnZ2VyIHVzZXJzcGFjZS1yZWJvb3QtZnMtcmVtb3VudAotICB0cmlnZ2VyIHBvc3QtZnMtZGF0YQotICB0cmlnZ2VyIHp5Z290ZS1zdGFydAotICB0cmlnZ2VyIGVhcmx5LWJvb3QKLSAgdHJpZ2dlciBib290Ci0KLW9uIHByb3BlcnR5OnN5cy5ib290X2NvbXBsZXRlZD0xICYmIHByb3BlcnR5OnN5cy5pbml0LnVzZXJzcGFjZV9yZWJvb3QuaW5fcHJvZ3Jlc3M9MQotICBzZXRwcm9wIHN5cy5pbml0LnVzZXJzcGFjZV9yZWJvb3QuaW5fcHJvZ3Jlc3MgIiIKLQogIyBNdWx0aS1HZW4gTFJVIEV4cGVyaW1lbnQKIG9uIHByb3BlcnR5OnBlcnNpc3QuZGV2aWNlX2NvbmZpZy5tZ2xydV9uYXRpdmUubHJ1X2dlbl9jb25maWc9bm9uZQogICB3cml0ZSAvc3lzL2tlcm5lbC9tbS9scnVfZ2VuL2VuYWJsZWQgMApAQCAtMTM2NCwzICsxMzM2LDE2IEBACiAgIHdyaXRlIC9zeXMva2VybmVsL21tL2xydV9nZW4vZW5hYmxlZCA1CiBvbiBwcm9wZXJ0eTpwZXJzaXN0LmRldmljZV9jb25maWcubWdscnVfbmF0aXZlLmxydV9nZW5fY29uZmlnPWFsbAogICB3cml0ZSAvc3lzL2tlcm5lbC9tbS9scnVfZ2VuL2VuYWJsZWQgNworCisjIEFsbG93IG90aGVyIHByb2Nlc3NlcyB0byBydW4gYHNuYXBzaG90Y3RsYCB0aHJvdWdoIGBpbml0YC4gVGhpcyByZXF1aXJlcworIyBgc2V0X3Byb3BgIHBlcm1pc3Npb24gb24gYHNuYXBzaG90Y3RsX3Byb3BgLgorb24gcHJvcGVydHk6c3lzLnNuYXBzaG90Y3RsLm1hcD1yZXF1ZXN0ZWQKKyAgICAjICJyb290IiBpcyBuZWVkZWQgdG8gdGFsayB0byBnc2lkIGFuZCBwYXNzIGl0cyBjaGVjayBvbiB1aWQuCisgICAgIyAic3lzdGVtIiBpcyBuZWVkZWQgdG8gd3JpdGUgdG8gIi9kZXYvc29ja2V0L3NuYXB1c2VyZCIgdG8gdGFsayB0bworICAgICMgc25hcHVzZXJkLgorICAgIGV4ZWMgLSByb290IHJvb3Qgc3lzdGVtIC0tIC9zeXN0ZW0vYmluL3NuYXBzaG90Y3RsIG1hcAorICAgIHNldHByb3Agc3lzLnNuYXBzaG90Y3RsLm1hcCAiZmluaXNoZWQiCisKK29uIHByb3BlcnR5OnN5cy5zbmFwc2hvdGN0bC51bm1hcD1yZXF1ZXN0ZWQKKyAgICBleGVjIC0gcm9vdCByb290IHN5c3RlbSAtLSAvc3lzdGVtL2Jpbi9zbmFwc2hvdGN0bCB1bm1hcAorICAgIHNldHByb3Agc3lzLnNuYXBzaG90Y3RsLnVubWFwICJmaW5pc2hlZCIKZGlmZiAtLWdpdCBhL3Jvb3RkaXIvaW5pdC51c2IucmMgYi9yb290ZGlyL2luaXQudXNiLnJjCmluZGV4IDA3MzBjY2UuLmIzMGQ2ZDAgMTAwNjQ0Ci0tLSBhL3Jvb3RkaXIvaW5pdC51c2IucmMKKysrIGIvcm9vdGRpci9pbml0LnVzYi5yYwpAQCAtMTgsNiArMTgsNyBAQAogICAgIGRpc2FibGVkCiAgICAgdXBkYXRhYmxlCiAgICAgc2VjbGFiZWwgdTpyOmFkYmQ6czAKKyAgICB1c2VyIHJvb3QKIAogb24gcHJvcGVydHk6dmVuZG9yLnN5cy51c2IuYWRiLmRpc2FibGVkPSoKICAgICBzZXRwcm9wIHN5cy51c2IuYWRiLmRpc2FibGVkICR7dmVuZG9yLnN5cy51c2IuYWRiLmRpc2FibGVkfQpAQCAtMTM4LDcgKzEzOSwzIEBACiBvbiBwcm9wZXJ0eTpzeXMudXNiLnR5cGVjLnBvd2VyX3JvbGU9c2luawogICAgIHdyaXRlIC9zeXMvY2xhc3MvZHVhbF9yb2xlX3VzYi9vdGdfZGVmYXVsdC9wb3dlcl9yb2xlICR7c3lzLnVzYi50eXBlYy5wb3dlcl9yb2xlfQogICAgIHNldHByb3Agc3lzLnVzYi50eXBlYy5zdGF0ZSAke3N5cy51c2IudHlwZWMucG93ZXJfcm9sZX0KLQotb24gdXNlcnNwYWNlLXJlYm9vdC1yZXF1ZXN0ZWQKLSAgc2V0cHJvcCBzeXMudXNiLmNvbmZpZyAiIgotICBzZXRwcm9wIHN5cy51c2Iuc3RhdGUgIiIKZGlmZiAtLWdpdCBhL3Jvb3RkaXIvaW5pdC56eWdvdGUzMi5yYyBiL3Jvb3RkaXIvaW5pdC56eWdvdGUzMi5yYwppbmRleCAyZjBlYzhhLi44NjJhZmI2IDEwMDY0NAotLS0gYS9yb290ZGlyL2luaXQuenlnb3RlMzIucmMKKysrIGIvcm9vdGRpci9pbml0Lnp5Z290ZTMyLnJjCkBAIC0xMyw4ICsxMyw4IEBACiAgICAgb25yZXN0YXJ0IHJlc3RhcnQgYXVkaW9zZXJ2ZXIKICAgICBvbnJlc3RhcnQgcmVzdGFydCBjYW1lcmFzZXJ2ZXIKICAgICBvbnJlc3RhcnQgcmVzdGFydCBtZWRpYQotICAgIG9ucmVzdGFydCByZXN0YXJ0IG1lZGlhLnR1bmVyCisgICAgb25yZXN0YXJ0IHJlc3RhcnQgLS1vbmx5LWlmLXJ1bm5pbmcgbWVkaWEudHVuZXIKICAgICBvbnJlc3RhcnQgcmVzdGFydCBuZXRkCiAgICAgb25yZXN0YXJ0IHJlc3RhcnQgd2lmaWNvbmQKLSAgICB0YXNrX3Byb2ZpbGVzIFByb2Nlc3NDYXBhY2l0eUhpZ2gKKyAgICB0YXNrX3Byb2ZpbGVzIFByb2Nlc3NDYXBhY2l0eUhpZ2ggTWF4UGVyZm9ybWFuY2UKICAgICBjcml0aWNhbCB3aW5kb3c9JHt6eWdvdGUuY3JpdGljYWxfd2luZG93Lm1pbnV0ZTotb2ZmfSB0YXJnZXQ9enlnb3RlLWZhdGFsCmRpZmYgLS1naXQgYS9yb290ZGlyL2luaXQuenlnb3RlNjQucmMgYi9yb290ZGlyL2luaXQuenlnb3RlNjQucmMKaW5kZXggNzRhNjRjOC4uMzQyMjEyMSAxMDA2NDQKLS0tIGEvcm9vdGRpci9pbml0Lnp5Z290ZTY0LnJjCisrKyBiL3Jvb3RkaXIvaW5pdC56eWdvdGU2NC5yYwpAQCAtMTMsNyArMTMsNyBAQAogICAgIG9ucmVzdGFydCByZXN0YXJ0IGF1ZGlvc2VydmVyCiAgICAgb25yZXN0YXJ0IHJlc3RhcnQgY2FtZXJhc2VydmVyCiAgICAgb25yZXN0YXJ0IHJlc3RhcnQgbWVkaWEKLSAgICBvbnJlc3RhcnQgcmVzdGFydCBtZWRpYS50dW5lcgorICAgIG9ucmVzdGFydCByZXN0YXJ0IC0tb25seS1pZi1ydW5uaW5nIG1lZGlhLnR1bmVyCiAgICAgb25yZXN0YXJ0IHJlc3RhcnQgbmV0ZAogICAgIG9ucmVzdGFydCByZXN0YXJ0IHdpZmljb25kCiAgICAgdGFza19wcm9maWxlcyBQcm9jZXNzQ2FwYWNpdHlIaWdoIE1heFBlcmZvcm1hbmNlCmRpZmYgLS1naXQgYS9yb290ZGlyL3JhbWRpc2tfbm9kZV9saXN0IGIvcm9vdGRpci9yYW1kaXNrX25vZGVfbGlzdAppbmRleCBkM2FiOGE2Li40ZjQ1ZmFhIDEwMDY0NAotLS0gYS9yb290ZGlyL3JhbWRpc2tfbm9kZV9saXN0CisrKyBiL3Jvb3RkaXIvcmFtZGlza19ub2RlX2xpc3QKQEAgLTEsMyArMSw0IEBACiBkaXIgZGV2IDA3NTUgMCAwCiBub2QgZGV2L251bGwgMDYwMCAwIDAgYyAxIDMKIG5vZCBkZXYvY29uc29sZSAwNjAwIDAgMCBjIDUgMQorbm9kIGRldi91cmFuZG9tIDA2MDAgMCAwIGMgMSA5CmRpZmYgLS1naXQgYS9yb290ZGlyL3VldmVudGQucmMgYi9yb290ZGlyL3VldmVudGQucmMKaW5kZXggMGI3ZmZiOC4uMzkyNzUwMSAxMDA2NDQKLS0tIGEvcm9vdGRpci91ZXZlbnRkLnJjCisrKyBiL3Jvb3RkaXIvdWV2ZW50ZC5yYwpAQCAtMjMsNiArMjMsMTEgQEAKIHN1YnN5c3RlbSBkbWFfaGVhcAogICAgZGV2bmFtZSB1ZXZlbnRfZGV2cGF0aAogICAgZGlybmFtZSAvZGV2L2RtYV9oZWFwCisKK3N1YnN5c3RlbSB2ZmlvCisgICAgZGV2bmFtZSB1ZXZlbnRfZGV2cGF0aAorICAgIGRpcm5hbWUgL2Rldi92ZmlvCisKICMgdWV2ZW50ZCBjYW4gb25seSBzZXQgcGVybWlzc2lvbnMgb24gZGV2aWNlIG5vZGVzIGFuZCB0aGVpciBhc3NvY2lhdGVkCiAjIHN5c2ZzIGF0dHJpYnV0ZXMsIG5vdCBvbiBhcmJpdHJhcnkgcGF0aHMuCiAjCkBAIC00Myw2ICs0OCw3IEBACiAvZGV2L2JpbmRlciAgICAgICAgICAgICAgIDA2NjYgICByb290ICAgICAgIHJvb3QKIC9kZXYvaHdiaW5kZXIgICAgICAgICAgICAgMDY2NiAgIHJvb3QgICAgICAgcm9vdAogL2Rldi92bmRiaW5kZXIgICAgICAgICAgICAwNjY2ICAgcm9vdCAgICAgICByb290CisvZGV2L3ZmaW8vKiAgICAgICAgICAgICAgIDA2NjYgICByb290ICAgICAgIHJvb3QKIAogL2Rldi9wbXNnMCAgICAgICAgICAgICAgICAwMjIyICAgcm9vdCAgICAgICBsb2cKIC9kZXYvZG1hX2hlYXAvc3lzdGVtICAgICAgMDQ0NCAgIHN5c3RlbSAgICAgc3lzdGVtCkBAIC02NSw2ICs3MSw3IEBACiAvZGV2L210cF91c2IgICAgICAgICAgICAgIDA2NjAgICByb290ICAgICAgIG10cAogL2Rldi91c2JfYWNjZXNzb3J5ICAgICAgICAwNjYwICAgcm9vdCAgICAgICB1c2IKIC9kZXYvdHVuICAgICAgICAgICAgICAgICAgMDY2MCAgIHN5c3RlbSAgICAgdnBuCisvZGV2L2hpZHJhdyogICAgICAgICAgICAgIDA2NjAgICBzeXN0ZW0gICAgIHN5c3RlbQogCiAjIENETUEgcmFkaW8gaW50ZXJmYWNlIE1VWAogL2Rldi9wcHAgICAgICAgICAgICAgICAgICAwNjYwICAgcmFkaW8gICAgICB2cG4KZGlmZiAtLWdpdCBhL3J1bi1hcy9ydW4tYXMuY3BwIGIvcnVuLWFzL3J1bi1hcy5jcHAKaW5kZXggY2M5MmM2OC4uMzIwNTdiNCAxMDA2NDQKLS0tIGEvcnVuLWFzL3J1bi1hcy5jcHAKKysrIGIvcnVuLWFzL3J1bi1hcy5jcHAKQEAgLTc2LDkgKzc2LDYgQEAKICAgICBlcnJvcigxLCBlcnJubywgImNvdWxkbid0IHN0YXQgJXMiLCBwYXRoKTsKICAgfQogCi0gIC8vIC9kYXRhL3VzZXIvMCBpcyBhIGtub3duIHNhZmUgc3ltbGluay4KLSAgaWYgKHN0cmNtcCgiL2RhdGEvdXNlci8wIiwgcGF0aCkgPT0gMCkgcmV0dXJuOwotCiAgIC8vIE11c3QgYmUgYSByZWFsIGRpcmVjdG9yeSwgbm90IGEgc3ltbGluay4KICAgaWYgKCFTX0lTRElSKHN0LnN0X21vZGUpKSB7CiAgICAgZXJyb3IoMSwgMCwgIiVzIG5vdCBhIGRpcmVjdG9yeTogJW8iLCBwYXRoLCBzdC5zdF9tb2RlKTsKQEAgLTE5MSwyNyArMTg4LDE3IEBACiAgIH0KIAogICAvLyBSZXRyaWV2ZSBwYWNrYWdlIGluZm9ybWF0aW9uIGZyb20gc3lzdGVtLCBzd2l0Y2hpbmcgZWdpZCBzbyB3ZSBjYW4gcmVhZCB0aGUgZmlsZS4KKyAgcGtnX2luZm8gaW5mbyA9IHsubmFtZSA9IHBrZ25hbWV9OwogICBnaWRfdCBvbGRfZWdpZCA9IGdldGVnaWQoKTsKICAgaWYgKHNldGVnaWQoQUlEX1BBQ0tBR0VfSU5GTykgPT0gLTEpIGVycm9yKDEsIGVycm5vLCAic2V0ZWdpZChBSURfUEFDS0FHRV9JTkZPKSBmYWlsZWQiKTsKLSAgcGtnX2luZm8gaW5mbzsKLSAgbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOwotICBpbmZvLm5hbWUgPSBwa2duYW1lOwogICBpZiAoIXBhY2thZ2VsaXN0X3BhcnNlKHBhY2thZ2VsaXN0X3BhcnNlX2NhbGxiYWNrLCAmaW5mbykpIHsKICAgICBlcnJvcigxLCBlcnJubywgInBhY2thZ2VsaXN0X3BhcnNlIGZhaWxlZCIpOwogICB9Ci0KLSAgLy8gSGFuZGxlIGEgbXVsdGktdXNlciBkYXRhIHBhdGgKLSAgaWYgKHVzZXJJZCA+IDApIHsKLSAgICBmcmVlKGluZm8uZGF0YV9kaXIpOwotICAgIGlmIChhc3ByaW50ZigmaW5mby5kYXRhX2RpciwgIi9kYXRhL3VzZXIvJWQvJXMiLCB1c2VySWQsIHBrZ25hbWUpID09IC0xKSB7Ci0gICAgICBlcnJvcigxLCBlcnJubywgImFzcHJpbnRmIGZhaWxlZCIpOwotICAgIH0KLSAgfQorICBpZiAoc2V0ZWdpZChvbGRfZWdpZCkgPT0gLTEpIGVycm9yKDEsIGVycm5vLCAiY291bGRuJ3QgcmVzdG9yZSBlZ2lkIik7CiAKICAgaWYgKGluZm8udWlkID09IDApIHsKICAgICBlcnJvcigxLCAwLCAidW5rbm93biBwYWNrYWdlOiAlcyIsIHBrZ25hbWUpOwogICB9Ci0gIGlmIChzZXRlZ2lkKG9sZF9lZ2lkKSA9PSAtMSkgZXJyb3IoMSwgZXJybm8sICJjb3VsZG4ndCByZXN0b3JlIGVnaWQiKTsKIAogICAvLyBWZXJpZnkgdGhhdCB1c2VyIGlkIGlzIG5vdCB0b28gYmlnLgogICBpZiAoKFVJRF9NQVggLSBpbmZvLnVpZCkgLyBBSURfVVNFUl9PRkZTRVQgPCAodWlkX3QpdXNlcklkKSB7CkBAIC0yMzEsNiArMjE4LDEyIEBACiAgICAgZXJyb3IoMSwgMCwgInBhY2thZ2Ugbm90IGRlYnVnZ2FibGU6ICVzIiwgcGtnbmFtZSk7CiAgIH0KIAorICAvLyBFbnN1cmUgd2UgaGF2ZSB0aGUgcmlnaHQgZGF0YSBwYXRoIGZvciB0aGUgc3BlY2lmaWMgdXNlci4KKyAgZnJlZShpbmZvLmRhdGFfZGlyKTsKKyAgaWYgKGFzcHJpbnRmKCZpbmZvLmRhdGFfZGlyLCAiL2RhdGEvdXNlci8lZC8lcyIsIHVzZXJJZCwgcGtnbmFtZSkgPT0gLTEpIHsKKyAgICBlcnJvcigxLCBlcnJubywgImFzcHJpbnRmIGZhaWxlZCIpOworICB9CisKICAgLy8gQ2hlY2sgdGhhdCB0aGUgZGF0YSBkaXJlY3RvcnkgcGF0aCBpcyB2YWxpZC4KICAgY2hlY2tfZGF0YV9wYXRoKHBrZ25hbWUsIGluZm8uZGF0YV9kaXIsIHVzZXJBcHBJZCk7CiAKZGlmZiAtLWdpdCBhL3NoZWxsX2FuZF91dGlsaXRpZXMvQW5kcm9pZC5icCBiL3NoZWxsX2FuZF91dGlsaXRpZXMvQW5kcm9pZC5icAppbmRleCBkODVmNmVkLi4xZjVjMTc5IDEwMDY0NAotLS0gYS9zaGVsbF9hbmRfdXRpbGl0aWVzL0FuZHJvaWQuYnAKKysrIGIvc2hlbGxfYW5kX3V0aWxpdGllcy9BbmRyb2lkLmJwCkBAIC0xOCw2ICsxOCw3IEBACiAgICAgICAgICJhd2siLAogICAgICAgICAiYmMiLAogICAgICAgICAiYnppcDIiLAorICAgICAgICAiY3B1LXRhcmdldC1mZWF0dXJlcyIsCiAgICAgICAgICJmc2NrLmV4ZmF0IiwKICAgICAgICAgImxkZCIsCiAgICAgICAgICJsb2d3cmFwcGVyIiwKQEAgLTU3LDYgKzU4LDcgQEAKICAgICAgICAgInRvb2xib3hfdmVuZG9yIiwKICAgICAgICAgInRveWJveF92ZW5kb3IiLAogICAgIF0sCisgICAgdmVuZG9yOiB0cnVlLAogfQogCiAvLyBzaGVsbCBhbmQgdXRpbGl0aWVzIGZvciBmaXJzdCBzdGFnZSBjb25zb2xlLiBUaGUgbGlzdCBvZiBiaW5hcmllcyBhcmUKZGlmZiAtLWdpdCBhL3NoZWxsX2FuZF91dGlsaXRpZXMvUkVBRE1FLm1kIGIvc2hlbGxfYW5kX3V0aWxpdGllcy9SRUFETUUubWQKaW5kZXggOWE3MzNiYi4uYzdjNjIyZSAxMDA2NDQKLS0tIGEvc2hlbGxfYW5kX3V0aWxpdGllcy9SRUFETUUubWQKKysrIGIvc2hlbGxfYW5kX3V0aWxpdGllcy9SRUFETUUubWQKQEAgLTM3LDcgKzM3LDQ2IEBACiBmdWxsIGxpc3QgZm9yIGEgcmVsZWFzZSBieSBydW5uaW5nIGB0b3lib3hgIGRpcmVjdGx5LgogCiAKLSMjIEFuZHJvaWQgMTQgKCJVIikKKyMjIEFuZHJvaWQgMTUgKEFQSSBsZXZlbCAzNSwgIlZhbmlsbGEgSWNlIENyZWFtIikKKworQlNEOiBmc2NrXF9tc2RvcyBuZXdmc1xfbXNkb3MKKworYnppcDI6IGJ6Y2F0IGJ6aXAyIGJ1bnppcDIKKworZ2F2aW5ob3dhcmQvYmM6IGJjCisKK29uZS10cnVlLWF3azogYXdrCisKK3Rvb2xib3g6IGdldGV2ZW50IGdldHByb3Agc2V0cHJvcCBzdGFydCBzdG9wCisKK3RveWJveCAoWzAuOC4xMV0oaHR0cHM6Ly9sYW5kbGV5Lm5ldC90b3lib3gvbmV3cy5odG1sIzA4LTA0LTIwMjQpLWlzaCk6CitbIGFjcGkgYmFzZTY0IGJhc2VuYW1lIGJsa2Rpc2NhcmQgYmxraWQgYmxvY2tkZXYgYnJjdGwgY2FsIGNhdCBjaGF0dHIKK2NoY29uIGNoZ3JwIGNobW9kIGNob3duIGNocm9vdCBjaHJ0IGNrc3VtIGNsZWFyIGNtcCBjb21tIGNwIGNwaW8gY3V0CitkYXRlIGRkIGRldm1lbSBkZiBkaWZmIGRpcm5hbWUgZG1lc2cgZG9zMnVuaXggZHUgZWNobyBlZ3JlcCBlbnYgZXhwYW5kCitleHByIGZhbGxvY2F0ZSBmYWxzZSBmZ3JlcCBmaWxlIGZpbmQgZmxvY2sgZm10IGZyZWUgZnJlZXJhbWRpc2sgZnNmcmVlemUKK2ZzeW5jIGdldGNvbmYgZ2V0ZW5mb3JjZSAqKmdldGZhdHRyKiogZ2V0b3B0ICoqZ3Bpb2RldGVjdCoqICoqZ3Bpb2ZpbmQqKgorKipncGlvZ2V0KiogKipncGlvaW5mbyoqICoqZ3Bpb3NldCoqIGdyZXAgZ3JvdXBzIGd1bnppcCBnemlwIGhlYWQgaGVscCBob3N0bmFtZQoraHdjbG9jayBpMmNkZXRlY3QgaTJjZHVtcCBpMmNnZXQgaTJjc2V0ICoqaTJjdHJhbnNmZXIqKiBpY29udiBpZCBpZmNvbmZpZworaW5vdGlmeWQgaW5zbW9kIGluc3RhbGwgaW9uaWNlIGlvcmVuaWNlIGlvdG9wIGtpbGwga2lsbGFsbCBsbiBsb2FkXF9wb2xpY3kKK2xvZyBsb2dnZXIgbG9nbmFtZSBsb3NldHVwIGxzIGxzYXR0ciBsc21vZCBsc29mIGxzcGNpIGxzdXNiIG1ha2VkZXZzCittZDVzdW0gKiptZW1lYXRlcioqIG1pY3JvY29tIG1rZGlyIG1rZmlmbyBta25vZCBta3N3YXAgbWt0ZW1wIG1vZGluZm8gbW9kcHJvYmUKK21vcmUgbW91bnQgbW91bnRwb2ludCBtdiBuYmQtY2xpZW50IG5jIG5ldGNhdCBuZXRzdGF0IG5pY2Ugbmwgbm9odXAKK25wcm9jIG5zZW50ZXIgb2QgcGFydHByb2JlIHBhc3RlIHBhdGNoIHBncmVwIHBpZG9mIHBpbmcgcGluZzYgcGl2b3RcX3Jvb3QKK3BraWxsIHBtYXAgcHJpbnRlbnYgcHJpbnRmIHBybGltaXQgcHMgcHdkIHB3ZHggcmVhZGVsZiByZWFkbGluayByZWFscGF0aAorcmVuaWNlIHJlc3RvcmVjb24gcmV2IHJma2lsbCBybSBybWRpciBybW1vZCBydGN3YWtlIHJ1bmNvbiBzZWQgc2VuZGV2ZW50CitzZXEgc2V0ZW5mb3JjZSAqKnNldGZhdHRyKiogc2V0c2lkIHNoYTFzdW0gc2hhMjI0c3VtIHNoYTI1NnN1bSBzaGEzODRzdW0KK3NoYTUxMnN1bSBzbGVlcCBzb3J0IHNwbGl0IHN0YXQgc3RyaW5ncyBzdHR5IHN3YXBvZmYgc3dhcG9uIHN5bmMgc3lzY3RsCit0YWMgdGFpbCB0YXIgdGFza3NldCB0ZWUgdGVzdCB0aW1lIHRpbWVvdXQgdG9wIHRvdWNoIHRyIHRyYWNlcm91dGUKK3RyYWNlcm91dGU2IHRydWUgdHJ1bmNhdGUgdHR5IHR1bmN0bCB1Y2xhbXBzZXQgdWxpbWl0IHVtb3VudCB1bmFtZQordW5pcSB1bml4MmRvcyB1bmxpbmsgdW5zaGFyZSB1cHRpbWUgdXNsZWVwIHV1ZGVjb2RlIHV1ZW5jb2RlIHV1aWRnZW4KK3Zjb25maWcgdmkgdm1zdGF0IHdhdGNoIHdjIHdoaWNoIHdob2FtaSB4YXJncyB4eGQgeWVzIHpjYXQKKworTm90ZTogdGVjaG5pY2FsbHkgZ2V0ZmF0dHIgYW5kIHNldGZhdHRyIHdlcmUgYXZhaWxhYmxlIGluIGVhcmxpZXIgdmVyc2lvbnMsCitidXQgdGhlIHN5bWxpbmtzIHdlcmUgbWlzc2luZyB1bnRpbCB0aGlzIHJlbGVhc2UsIHNvIHRoZXkgd2VyZSBvbmx5IGF2YWlsYWJsZQorYXMgYHRveWJveCBnZXRmYXR0cmAgYW5kIGB0b3lib3ggc2V0ZmF0dHJgIHJhdGhlciB0aGFuIGRpcmVjdGx5LgorCisKKyMjIEFuZHJvaWQgMTQgKEFQSSBsZXZlbCAzNCwgIlVwc2lkZSBEb3duIENha2UiKQogCiBCU0Q6IGZzY2tcX21zZG9zIG5ld2ZzXF9tc2RvcwogCkBAIC03MSw3ICsxMTAsNyBAQAogdmNvbmZpZyB2aSB2bXN0YXQgd2F0Y2ggd2Mgd2hpY2ggd2hvYW1pIHhhcmdzIHh4ZCB5ZXMgemNhdAogCiAKLSMjIEFuZHJvaWQgMTMgKCJUIikKKyMjIEFuZHJvaWQgMTMgKDMzLCAiVGlyYW1pc3UiKQogCiBCU0Q6IGZzY2tcX21zZG9zIG5ld2ZzXF9tc2RvcwogCkBAIC0xMDUsNyArMTQ0LDcgQEAKIHZjb25maWcgdmkgdm1zdGF0IHdhdGNoIHdjIHdoaWNoIHdob2FtaSB4YXJncyB4eGQgeWVzIHpjYXQKIAogCi0jIyBBbmRyb2lkIDEyICgiUyIpCisjIyBBbmRyb2lkIDEyICgzMSwgIlNub3cgQ29uZSIpCiAKIEJTRDogZnNja1xfbXNkb3MgbmV3ZnNcX21zZG9zCiAKQEAgLTEzOSw3ICsxNzgsNyBAQAogdm1zdGF0IHdhdGNoIHdjIHdoaWNoIHdob2FtaSB4YXJncyB4eGQgeWVzIHpjYXQKIAogCi0jIyBBbmRyb2lkIDExICgiUiIpCisjIyBBbmRyb2lkIDExIChBUEkgbGV2ZWwgMzAsICJSZWQgVmVsdmV0IENha2UiKQogCiBCU0Q6IGZzY2tcX21zZG9zIG5ld2ZzXF9tc2RvcwogCkBAIC0xNzMsNyArMjEyLDcgQEAKIHdob2FtaSB4YXJncyB4eGQgeWVzIHpjYXQKIAogCi0jIyBBbmRyb2lkIDEwICgiUSIpCisjIyBBbmRyb2lkIDEwIChBUEkgbGV2ZWwgMjksICJRdWluY2UgVGFydCIpCiAKIEJTRDogZ3JlcCBmc2NrXF9tc2RvcyBuZXdmc1xfbXNkb3MKIApAQCAtMjA1LDcgKzI0NCw3IEBACiB3YyB3aGljaCB3aG9hbWkgeGFyZ3MgeHhkIHllcyB6Y2F0CiAKIAotIyMgQW5kcm9pZCA5LjAgKFBpZSkKKyMjIEFuZHJvaWQgOS4wIChBUEkgbGV2ZWwgMjgsICJQaWUiKQogCiBCU0Q6IGRkIGdyZXAKIApAQCAtMjMyLDcgKzI3MSw3IEBACiB3aGljaCB3aG9hbWkgeGFyZ3MgeHhkIHllcyB6Y2F0CiAKIAotIyMgQW5kcm9pZCA4LjAgKE9yZW8pCisjIyBBbmRyb2lkIDguMCAoQVBJIGxldmVsIDI2LCAiT3JlbyIpCiAKIEJTRDogZGQgZ3JlcAogCkBAIC0yNTcsNyArMjk2LDcgQEAKIHZtc3RhdCB3YyB3aGljaCB3aG9hbWkgeGFyZ3MgeHhkIHllcyAqKnpjYXQqKgogCiAKLSMjIEFuZHJvaWQgNy4wIChOb3VnYXQpCisjIyBBbmRyb2lkIDcuMCAoQVBJIGxldmVsIDI0LCAiTm91Z2F0IikKIAogQlNEOiBkZCBncmVwCiAKQEAgLTI3OSw3ICszMTgsNyBAQAogKip1cHRpbWUqKiB1c2xlZXAgdm1zdGF0IHdjIHdoaWNoIHdob2FtaSB4YXJncyAqKnh4ZCoqIHllcwogCiAKLSMjIEFuZHJvaWQgNi4wIChNYXJzaG1hbGxvdykKKyMjIEFuZHJvaWQgNi4wIChBUEkgbGV2ZWwgMjMsICJNYXJzaG1hbGxvdyIpCiAKIEJTRDogZGQgZHUgZ3JlcAogCkBAIC0zMDAsNyArMzM5LDcgQEAKIHZtc3RhdCB3YyB3aGljaCB3aG9hbWkgeGFyZ3MgeWVzCiAKIAotIyMgQW5kcm9pZCA1LjAgKExvbGxpcG9wKQorIyMgQW5kcm9pZCA1LjAgKEFQSSBsZXZlbCAyMSwgIkxvbGxpcG9wIikKIAogQlNEOiBjYXQgY2hvd24gY3AgZGQgZHUgZ3JlcCBraWxsIGxuIG12IHByaW50ZW52IHJtIHJtZGlyIHNsZWVwIHN5bmMKIApAQCAtMzEyLDcgKzM1MSw3IEBACiB0b3AgdG91Y2ggdW1vdW50IHVwdGltZSB2bXN0YXQgd2F0Y2hwcm9wcyB3aXBlCiAKIAotIyMgQW5kcm9pZCA0LjQgKEtpdEthdCkKKyMjIEFuZHJvaWQgNC40IChBUEkgbGV2ZWwgMTksICJLaXRLYXQiKQogCiBCU0Q6IGNhdCBjcCBkZCBkdSBncmVwIG5ld2ZzXF9tc2RvcwogCkBAIC0zMjQsNyArMzYzLDcgQEAKIHN0b3Agc3dhcG9mZiBzd2Fwb24gc3luYyB0b3AgdG91Y2ggdW1vdW50IHVwdGltZSB2bXN0YXQgd2F0Y2hwcm9wcyB3aXBlCiAKIAotIyMgQW5kcm9pZCA0LjEtNC4zIChKZWxseUJlYW4pCisjIyBBbmRyb2lkIDQuMS00LjMgKEFQSSBsZXZlbCAxNiwgIkplbGx5IEJlYW4iKQogCiBCU0Q6IGNhdCBjcCBkZCBkdSBncmVwIG5ld2ZzXF9tc2RvcwogCkBAIC0zMzYsNyArMzc1LDcgQEAKIHN5bmMgdG9wIHRvdWNoIHVtb3VudCB1cHRpbWUgdm1zdGF0IHdhdGNocHJvcHMgd2lwZQogCiAKLSMjIEFuZHJvaWQgNC4wIChJY2VDcmVhbVNhbmR3aWNoKQorIyMgQW5kcm9pZCA0LjAgKEFQSSBsZXZlbCAxNCwgIkljZSBDcmVhbSBTYW5kd2ljaCIpCiAKIEJTRDogY2F0IGRkIG5ld2ZzXF9tc2RvcwogCkBAIC0zNDcsNyArMzg2LDcgQEAKIHRvdWNoIHVtb3VudCB1cHRpbWUgdm1zdGF0IHdhdGNocHJvcHMgd2lwZQogCiAKLSMjIEFuZHJvaWQgMi4zIChHaW5nZXJicmVhZCkKKyMjIEFuZHJvaWQgMi4zIChBUEkgbGV2ZWwgOSwgIkdpbmdlcmJyZWFkIikKIAogQlNEOiBjYXQgZGQgbmV3ZnNcX21zZG9zCiAKZGlmZiAtLWdpdCBhL3N0b3JhZ2VkL0FuZHJvaWQuYnAgYi9zdG9yYWdlZC9BbmRyb2lkLmJwCmluZGV4IGMzNDQ3ZDIuLjM1N2MwZTYgMTAwNjQ0Ci0tLSBhL3N0b3JhZ2VkL0FuZHJvaWQuYnAKKysrIGIvc3RvcmFnZWQvQW5kcm9pZC5icApAQCAtMjQsNyArMjQsNyBAQAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmhlYWx0aEAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5oZWFsdGhAMi4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuaGVhbHRoLVYyLW5kayIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmhlYWx0aC1WMy1uZGsiLAogICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliYmluZGVyX25kayIsCkBAIC0xMzYsMyArMTM2LDM3IEBACiAgICAgXSwKICAgICBwYXRoOiAiYmluZGVyIiwKIH0KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJzdG9yYWdlZF9zZXJ2aWNlX2Z1enplcl9kZWZhdWx0cyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgInN0b3JhZ2VkX2RlZmF1bHRzIiwKKyAgICAgICAgInNlcnZpY2VfZnV6emVyX2RlZmF1bHRzIiwKKyAgICAgICAgImZ1enplcl9kaXNhYmxlX2xlYWtzIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdG9yYWdlZCIsCisgICAgXSwKKyAgICBmdXp6X2NvbmZpZzogeworICAgICAgICBjYzogWworICAgICAgICAgICAgImR2YW5kZXJAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIHRyaWFnZV9hc3NpZ25lZTogIndhZ2hwYXdhbkBnb29nbGUuY29tIiwKKyAgICB9LAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAic3RvcmFnZWRfc2VydmljZV9mdXp6ZXIiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJzdG9yYWdlZF9zZXJ2aWNlX2Z1enplcl9kZWZhdWx0cyIsCisgICAgXSwKKyAgICBzcmNzOiBbInRlc3RzL2Z1enplcnMvc3RvcmFnZWRfc2VydmljZV9mdXp6ZXIuY3BwIl0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJzdG9yYWdlZF9wcml2YXRlX3NlcnZpY2VfZnV6emVyIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAic3RvcmFnZWRfc2VydmljZV9mdXp6ZXJfZGVmYXVsdHMiLAorICAgIF0sCisgICAgc3JjczogWyJ0ZXN0cy9mdXp6ZXJzL3N0b3JhZ2VkX3ByaXZhdGVfc2VydmljZV9mdXp6ZXIuY3BwIl0sCit9CmRpZmYgLS1naXQgYS9zdG9yYWdlZC9pbmNsdWRlL3N0b3JhZ2VkX3NlcnZpY2UuaCBiL3N0b3JhZ2VkL2luY2x1ZGUvc3RvcmFnZWRfc2VydmljZS5oCmluZGV4IDdlYzY4NjQuLmJmN2FmODAgMTAwNjQ0Ci0tLSBhL3N0b3JhZ2VkL2luY2x1ZGUvc3RvcmFnZWRfc2VydmljZS5oCisrKyBiL3N0b3JhZ2VkL2luY2x1ZGUvc3RvcmFnZWRfc2VydmljZS5oCkBAIC0yOCw2ICsyOCw3IEBACiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6b3M7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6b3M6OnN0b3JhZ2VkOwogCituYW1lc3BhY2UgYW5kcm9pZCB7CiBjbGFzcyBTdG9yYWdlZFNlcnZpY2UgOiBwdWJsaWMgQmluZGVyU2VydmljZTxTdG9yYWdlZFNlcnZpY2U+LCBwdWJsaWMgQm5TdG9yYWdlZCB7CiBwcml2YXRlOgogICAgIHZvaWQgZHVtcFVpZFJlY29yZHNEZWJ1ZyhpbnQgZmQsIGNvbnN0IHZlY3RvcjxzdHJ1Y3QgdWlkX3JlY29yZD4mIGVudHJpZXMpOwpAQCAtNTMsNCArNTQsNSBAQAogCiBzcDxJU3RvcmFnZWRQcml2YXRlPiBnZXRfc3RvcmFnZWRfcHJpX3NlcnZpY2UoKTsKIAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKICNlbmRpZiAvKiBfU1RPUkFHRURfU0VSVklDRV9IXyAqLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N0b3JhZ2VkL3N0b3JhZ2VkX3NlcnZpY2UuY3BwIGIvc3RvcmFnZWQvc3RvcmFnZWRfc2VydmljZS5jcHAKaW5kZXggNDVmMWQ0ZC4uMDBkMzZkNyAxMDA2NDQKLS0tIGEvc3RvcmFnZWQvc3RvcmFnZWRfc2VydmljZS5jcHAKKysrIGIvc3RvcmFnZWQvc3RvcmFnZWRfc2VydmljZS5jcHAKQEAgLTM4LDYgKzM4LDcgQEAKIAogZXh0ZXJuIHNwPHN0b3JhZ2VkX3Q+IHN0b3JhZ2VkX3NwOwogCituYW1lc3BhY2UgYW5kcm9pZCB7CiBzdGF0dXNfdCBTdG9yYWdlZFNlcnZpY2U6OnN0YXJ0KCkgewogICAgIHJldHVybiBCaW5kZXJTZXJ2aWNlPFN0b3JhZ2VkU2VydmljZT46OnB1Ymxpc2goKTsKIH0KQEAgLTIxOCwzICsyMTksNCBAQAogCiAgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PElTdG9yYWdlZFByaXZhdGU+KGJpbmRlcik7CiB9Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N0b3JhZ2VkL3Rlc3RzL2Z1enplcnMvc3RvcmFnZWRfcHJpdmF0ZV9zZXJ2aWNlX2Z1enplci5jcHAgYi9zdG9yYWdlZC90ZXN0cy9mdXp6ZXJzL3N0b3JhZ2VkX3ByaXZhdGVfc2VydmljZV9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZWI3OTYKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9yYWdlZC90ZXN0cy9mdXp6ZXJzL3N0b3JhZ2VkX3ByaXZhdGVfc2VydmljZV9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZnV6emJpbmRlci9saWJiaW5kZXJfZHJpdmVyLmg+CisKKyNpbmNsdWRlIDxzdG9yYWdlZC5oPgorI2luY2x1ZGUgPHN0b3JhZ2VkX3NlcnZpY2UuaD4KKworc3A8c3RvcmFnZWRfdD4gc3RvcmFnZWRfc3A7CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJJbml0aWFsaXplKGludCAvKiphcmdjKi8sIGNoYXIgLyoqKiphcmd2Ki8pIHsKKyAgICBzdG9yYWdlZF9zcCA9IG5ldyBzdG9yYWdlZF90KCk7CisgICAgc3RvcmFnZWRfc3AtPmluaXQoKTsKKyAgICByZXR1cm4gMDsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGF1dG8gc3RvcmFnZWRQcml2YXRlU2VydmljZSA9IG5ldyBTdG9yYWdlZFByaXZhdGVTZXJ2aWNlKCk7CisgICAgZnV6elNlcnZpY2Uoc3RvcmFnZWRQcml2YXRlU2VydmljZSwgRnV6emVkRGF0YVByb3ZpZGVyKGRhdGEsIHNpemUpKTsKKyAgICByZXR1cm4gMDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zdG9yYWdlZC90ZXN0cy9mdXp6ZXJzL3N0b3JhZ2VkX3NlcnZpY2VfZnV6emVyLmNwcCBiL3N0b3JhZ2VkL3Rlc3RzL2Z1enplcnMvc3RvcmFnZWRfc2VydmljZV9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMWVjYzMKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9yYWdlZC90ZXN0cy9mdXp6ZXJzL3N0b3JhZ2VkX3NlcnZpY2VfZnV6emVyLmNwcApAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGZ1enpiaW5kZXIvbGliYmluZGVyX2RyaXZlci5oPgorCisjaW5jbHVkZSA8c3RvcmFnZWQuaD4KKyNpbmNsdWRlIDxzdG9yYWdlZF9zZXJ2aWNlLmg+CisKK3NwPHN0b3JhZ2VkX3Q+IHN0b3JhZ2VkX3NwOworCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVySW5pdGlhbGl6ZShpbnQgLyoqYXJnYyovLCBjaGFyIC8qKioqYXJndiovKSB7CisgICAgc3RvcmFnZWRfc3AgPSBuZXcgc3RvcmFnZWRfdCgpOworICAgIHN0b3JhZ2VkX3NwLT5pbml0KCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBhdXRvIHN0b3JhZ2VkU2VydmljZSA9IG5ldyBTdG9yYWdlZFNlcnZpY2UoKTsKKyAgICBmdXp6U2VydmljZShzdG9yYWdlZFNlcnZpY2UsIEZ1enplZERhdGFQcm92aWRlcihkYXRhLCBzaXplKSk7CisgICAgcmV0dXJuIDA7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbGJveC9BbmRyb2lkLmJwIGIvdG9vbGJveC9BbmRyb2lkLmJwCmluZGV4IDg1OTRlYzQuLjEyMGNjNmUgMTAwNjQ0Ci0tLSBhL3Rvb2xib3gvQW5kcm9pZC5icAorKysgYi90b29sYm94L0FuZHJvaWQuYnAKQEAgLTY5LDYgKzY5LDcgQEAKICAgICBuYW1lOiAidG9vbGJveCIsCiAgICAgZGVmYXVsdHM6IFsidG9vbGJveF9iaW5hcnlfZGVmYXVsdHMiXSwKICAgICByZWNvdmVyeV9hdmFpbGFibGU6IHRydWUsCisgICAgdmVuZG9yX3JhbWRpc2tfYXZhaWxhYmxlOiB0cnVlLAogfQogCiBjY19iaW5hcnkgewpkaWZmIC0tZ2l0IGEvdG9vbGJveC9PV05FUlMgYi90b29sYm94L09XTkVSUwppbmRleCA1ZTJjNTgxLi44OThkZGNlIDEwMDY0NAotLS0gYS90b29sYm94L09XTkVSUworKysgYi90b29sYm94L09XTkVSUwpAQCAtMSwyICsxLDMgQEAKIGluY2x1ZGUgcGxhdGZvcm0vc3lzdGVtL2NvcmU6L2phbml0b3JzL09XTkVSUwogcGVyLWZpbGUgbW9kcHJvYmUuYz13aWxsbWN2aWNrZXJAZ29vZ2xlLmNvbSxkdmFuZGVyQGdvb2dsZS5jb20KK3Blci1maWxlIGdldGV2ZW50LmM9ZmlsZTpwbGF0Zm9ybS9mcmFtZXdvcmtzL2Jhc2U6L0lOUFVUX09XTkVSUwpkaWZmIC0tZ2l0IGEvdG9vbGJveC9nZXRldmVudC5jIGIvdG9vbGJveC9nZXRldmVudC5jCmluZGV4IGUyYzc3YzMuLjdiODk2ZTkgMTAwNjQ0Ci0tLSBhL3Rvb2xib3gvZ2V0ZXZlbnQuYworKysgYi90b29sYm94L2dldGV2ZW50LmMKQEAgLTExMSw4ICsxMTEsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgYml0c19zaXplID0gcmVzICsgMTY7CiAgICAgICAgICAgICBiaXRzID0gcmVhbGxvYyhiaXRzLCBiaXRzX3NpemUgKiAyKTsKLSAgICAgICAgICAgIGlmKGJpdHMgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICBlcnIoMSwgImZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgb2Ygc2l6ZSAlZFxuIiwgKGludCliaXRzX3NpemUpOworICAgICAgICAgICAgaWYgKGJpdHMgPT0gTlVMTCkgZXJyKDEsICJmYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIG9mIHNpemUgJXpkIiwgYml0c19zaXplKTsKICAgICAgICAgfQogICAgICAgICByZXMyID0gMDsKICAgICAgICAgc3dpdGNoKGkpIHsKQEAgLTQ0Miw3ICs0NDEsNyBAQAogICAgIGlmKHJlcyA8IChpbnQpc2l6ZW9mKCpldmVudCkpIHsKICAgICAgICAgaWYoZXJybm8gPT0gRUlOVFIpCiAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgZ2V0IGV2ZW50LCAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgZ2V0IGlub3RpZnkgZXZlbnRzLCAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogICAgIC8vcHJpbnRmKCJnb3QgJWQgYnl0ZXMgb2YgZXZlbnQgaW5mb3JtYXRpb25cbiIsIHJlcyk7CkBAIC02NjUsNyArNjY0LDcgQEAKICAgICAgICAgICAgICAgICBpZih1ZmRzW2ldLnJldmVudHMgJiBQT0xMSU4pIHsKICAgICAgICAgICAgICAgICAgICAgcmVzID0gcmVhZCh1ZmRzW2ldLmZkLCAmZXZlbnQsIHNpemVvZihldmVudCkpOwogICAgICAgICAgICAgICAgICAgICBpZihyZXMgPCAoaW50KXNpemVvZihldmVudCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IGdldCBldmVudFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBnZXQgZXZkZXYgZXZlbnQsICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYoZ2V0X3RpbWUpIHsKZGlmZiAtLWdpdCBhL3Rvb2xib3gvbW9kcHJvYmUuY3BwIGIvdG9vbGJveC9tb2Rwcm9iZS5jcHAKaW5kZXggMTdkNGUzMS4uMTMwMjZhYyAxMDA2NDQKLS0tIGEvdG9vbGJveC9tb2Rwcm9iZS5jcHAKKysrIGIvdG9vbGJveC9tb2Rwcm9iZS5jcHAKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPGdldG9wdC5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8c3RyaW5nPgogCkBAIC04NSw2ICs4NiwyMCBAQAogICAgIH0KIH0KIAorc3RhdGljIGJvb2wgTW9kRGlyTWF0Y2hlc0tlcm5lbFBhZ2VTaXplKGNvbnN0IGNoYXIqIG1vZF9kaXIpIHsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGtlcm5lbF9wZ3NpemVfa2IgPSBnZXRwYWdlc2l6ZSgpIC8gMTAyNDsKKyAgICBjb25zdCBjaGFyKiBtb2Rfc2Z4ID0gc3RycmNocihtb2RfZGlyLCAnXycpOworICAgIHVuc2lnbmVkIGludCBtb2RfcGdzaXplX2tiOworICAgIGludCBtb2Rfc2Z4X2xlbjsKKworICAgIGlmIChtb2Rfc2Z4ID09IE5VTEwgfHwgc3NjYW5mKG1vZF9zZngsICJfJXVrJW4iLCAmbW9kX3Bnc2l6ZV9rYiwgJm1vZF9zZnhfbGVuKSAhPSAxIHx8CisgICAgICAgIHN0cmxlbihtb2Rfc2Z4KSAhPSBtb2Rfc2Z4X2xlbikgeworICAgICAgICBtb2RfcGdzaXplX2tiID0gNDsKKyAgICB9CisKKyAgICByZXR1cm4ga2VybmVsX3Bnc2l6ZV9rYiA9PSBtb2RfcGdzaXplX2tiOworfQorCiAvLyBGaW5kIGRpcmVjdG9yaWVzIGluIGZvcm1hdCBvZiAiL2xpYi9tb2R1bGVzL3gueS56LSoiLgogc3RhdGljIGludCBLZXJuZWxWZXJzaW9uTmFtZUZpbHRlcihjb25zdCBkaXJlbnQqIGRlKSB7CiAgICAgdW5zaWduZWQgaW50IG1ham9yLCBtaW5vcjsKQEAgLTEwMCw3ICsxMTUsNyBAQAogICAgIH0KIAogICAgIGlmIChhbmRyb2lkOjpiYXNlOjpTdGFydHNXaXRoKGRlLT5kX25hbWUsIGtlcm5lbF92ZXJzaW9uKSkgewotICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgcmV0dXJuIE1vZERpck1hdGNoZXNLZXJuZWxQYWdlU2l6ZShkZS0+ZF9uYW1lKTsKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9CkBAIC0xMTIsNiArMTI3LDcgQEAKICAgICBhbmRyb2lkOjpiYXNlOjpTZXRNaW5pbXVtTG9nU2V2ZXJpdHkoYW5kcm9pZDo6YmFzZTo6SU5GTyk7CiAKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbW9kdWxlczsKKyAgICBzdGQ6OnN0cmluZyBtb2R1bGVzX2xvYWRfZmlsZTsKICAgICBzdGQ6OnN0cmluZyBtb2R1bGVfcGFyYW1ldGVyczsKICAgICBzdGQ6OnN0cmluZyBtb2RzOwogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtb2RfZGlyczsKQEAgLTExOSw3ICsxMzUsNyBAQAogICAgIGJvb2wgYmxvY2tsaXN0ID0gZmFsc2U7CiAgICAgaW50IHJ2ID0gRVhJVF9TVUNDRVNTOwogCi0gICAgaW50IG9wdDsKKyAgICBpbnQgb3B0LCBmZDsKICAgICBpbnQgb3B0aW9uX2luZGV4ID0gMDsKICAgICAvLyBOQjogV2UgaGF2ZSBub24tc3RhbmRhcmQgc2hvcnQgb3B0aW9ucyAtbCBhbmQgLUQgdG8gbWFrZSBpdCBlYXNpZXIgZm9yCiAgICAgLy8gT0VNcyB0byB0cmFuc2l0aW9uIGZyb20gdG95Ym94LgpAQCAtMTQ0LDE2ICsxNjAsMTkgQEAKICAgICAgICAgICAgICAgICAvLyBpcyBzdXBwb3J0ZWQgaGVyZSBieSBkZWZhdWx0LCBpZ25vcmUgZmxhZyBpZiBubyBhcmd1bWVudC4KICAgICAgICAgICAgICAgICBjaGVja19tb2RlKCk7CiAgICAgICAgICAgICAgICAgaWYgKG9wdGFyZyA9PSBOVUxMKSBicmVhazsKLSAgICAgICAgICAgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmcob3B0YXJnLCAmbW9kcykpIHsKKworICAgICAgICAgICAgICAgIC8vIFNpbmNlIGxpYm1vZHByb2JlIGRvZXNuJ3QgZmFpbCB3aGVuIHRoZSBtb2R1bGVzIGxvYWQgZmlsZQorICAgICAgICAgICAgICAgIC8vIGRvZXNuJ3QgZXhpc3QsIGxldCdzIGNoZWNrIHRoYXQgaGVyZSBzbyB0aGF0IHdlIGRvbid0CisgICAgICAgICAgICAgICAgLy8gc2lsZW50bHkgZmFpbC4KKyAgICAgICAgICAgICAgICBmZCA9IG9wZW4ob3B0YXJnLCBPX1JET05MWSB8IE9fQ0xPRVhFQyB8IE9fQklOQVJZKTsKKyAgICAgICAgICAgICAgICBpZiAoZmQgPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBvcGVuICIgPDwgb3B0YXJnOwotICAgICAgICAgICAgICAgICAgICBydiA9IEVYSVRfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yIChhdXRvIG1vZCA6IGFuZHJvaWQ6OmJhc2U6OlNwbGl0KHN0cmlwQ29tbWVudHMobW9kcyksICJcbiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZCA9IGFuZHJvaWQ6OmJhc2U6OlRyaW0obW9kKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vZCA9PSAiIikgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGQ6OmZpbmQobW9kdWxlcy5iZWdpbigpLCBtb2R1bGVzLmVuZCgpLCBtb2QpICE9IG1vZHVsZXMuZW5kKCkpIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICBtb2R1bGVzLmVtcGxhY2VfYmFjayhtb2QpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjbG9zZShmZCk7CisKKyAgICAgICAgICAgICAgICBtb2RfZGlycy5lbXBsYWNlX2JhY2soYW5kcm9pZDo6YmFzZTo6RGlybmFtZShvcHRhcmcpKTsKKyAgICAgICAgICAgICAgICBtb2R1bGVzX2xvYWRfZmlsZSA9IGFuZHJvaWQ6OmJhc2U6OkJhc2VuYW1lKG9wdGFyZyk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICdiJzoKICAgICAgICAgICAgICAgICBibG9ja2xpc3QgPSB0cnVlOwpAQCAtMjI2LDM3ICsyNDUsNDggQEAKICAgICAgICAgfQogICAgICAgICBmcmVlKGtlcm5lbF9kaXJzKTsKIAotICAgICAgICAvLyBBbGxvdyBtb2R1bGVzIHRvIGJlIGRpcmVjdGx5IGluc2lkZSAvbGliL21vZHVsZXMKLSAgICAgICAgbW9kX2RpcnMuZW1wbGFjZV9iYWNrKExJQl9NT0RVTEVTX1BSRUZJWCk7CisgICAgICAgIGlmIChtb2RfZGlycy5lbXB0eSgpIHx8IGdldHBhZ2VzaXplKCkgPT0gNDA5NikgeworICAgICAgICAgICAgLy8gQWxsb3cgbW9kdWxlcyB0byBiZSBkaXJlY3RseSBpbnNpZGUgL2xpYi9tb2R1bGVzCisgICAgICAgICAgICBtb2RfZGlycy5lbXBsYWNlX2JhY2soTElCX01PRFVMRVNfUFJFRklYKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIExPRyhERUJVRykgPDwgIm1vZGUgaXMgIiA8PCBtb2RlOwogICAgIExPRyhERUJVRykgPDwgIm1vZF9kaXJzIGlzOiAiIDw8IGFuZHJvaWQ6OmJhc2U6OkpvaW4obW9kX2RpcnMsICIgIik7CiAgICAgTE9HKERFQlVHKSA8PCAibW9kdWxlcyBpczogIiA8PCBhbmRyb2lkOjpiYXNlOjpKb2luKG1vZHVsZXMsICIgIik7CisgICAgTE9HKERFQlVHKSA8PCAibW9kdWxlcyBsb2FkIGZpbGUgaXM6ICIgPDwgbW9kdWxlc19sb2FkX2ZpbGU7CiAgICAgTE9HKERFQlVHKSA8PCAibW9kdWxlIHBhcmFtZXRlcnMgaXM6ICIgPDwgYW5kcm9pZDo6YmFzZTo6Sm9pbihtb2R1bGVfcGFyYW1ldGVycywgIiAiKTsKIAogICAgIGlmIChtb2R1bGVzLmVtcHR5KCkpIHsKICAgICAgICAgaWYgKG1vZGUgPT0gTGlzdE1vZHVsZXNNb2RlKSB7CiAgICAgICAgICAgICAvLyBlbXVsYXRlIHRveWJveCBtb2Rwcm9iZSBsaXN0IHdpdGggbm8gcGF0dGVybiAobGlzdCBhbGwpCiAgICAgICAgICAgICBtb2R1bGVzLmVtcGxhY2VfYmFjaygiKiIpOwotICAgICAgICB9IGVsc2UgeworICAgICAgICB9IGVsc2UgaWYgKG1vZHVsZXNfbG9hZF9maWxlLmVtcHR5KCkpIHsKICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk5vIG1vZHVsZXMgZ2l2ZW4uIjsKICAgICAgICAgICAgIHByaW50X3VzYWdlKCk7CiAgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwogICAgICAgICB9CiAgICAgfQotICAgIGlmIChwYXJhbWV0ZXJfY291bnQgJiYgbW9kdWxlcy5zaXplKCkgPiAxKSB7CisgICAgaWYgKHBhcmFtZXRlcl9jb3VudCAmJiAobW9kdWxlcy5zaXplKCkgPiAxIHx8ICFtb2R1bGVzX2xvYWRfZmlsZS5lbXB0eSgpKSkgewogICAgICAgICBMT0coRVJST1IpIDw8ICJPbmx5IG9uZSBtb2R1bGUgbWF5IGJlIGxvYWRlZCB3aGVuIHNwZWNpZnlpbmcgbW9kdWxlIHBhcmFtZXRlcnMuIjsKICAgICAgICAgcHJpbnRfdXNhZ2UoKTsKICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKICAgICB9CiAKLSAgICBNb2Rwcm9iZSBtKG1vZF9kaXJzLCAibW9kdWxlcy5sb2FkIiwgYmxvY2tsaXN0KTsKKyAgICBNb2Rwcm9iZSBtKG1vZF9kaXJzLCBtb2R1bGVzX2xvYWRfZmlsZS5lbXB0eSgpID8gIm1vZHVsZXMubG9hZCIgOiBtb2R1bGVzX2xvYWRfZmlsZSwgYmxvY2tsaXN0KTsKKyAgICBpZiAobW9kZSA9PSBBZGRNb2R1bGVzTW9kZSAmJiAhbW9kdWxlc19sb2FkX2ZpbGUuZW1wdHkoKSkgeworICAgICAgICBpZiAoIW0uTG9hZExpc3RlZE1vZHVsZXMoZmFsc2UpKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGxvYWQgYWxsIHRoZSBtb2R1bGVzIGZyb20gIiA8PCBtb2R1bGVzX2xvYWRfZmlsZTsKKyAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICAgICAgLyogRmFsbC10aHJvdWdoIHRvIGxvYWQgbW9kdWxlcyBwcm92aWRlZCBvbiB0aGUgY29tbWFuZCBsaW5lIChpZiBhbnkpKi8KKyAgICB9CiAKICAgICBmb3IgKGNvbnN0IGF1dG8mIG1vZHVsZSA6IG1vZHVsZXMpIHsKICAgICAgICAgc3dpdGNoIChtb2RlKSB7CiAgICAgICAgICAgICBjYXNlIEFkZE1vZHVsZXNNb2RlOgogICAgICAgICAgICAgICAgIGlmICghbS5Mb2FkV2l0aEFsaWFzZXMobW9kdWxlLCB0cnVlLCBtb2R1bGVfcGFyYW1ldGVycykpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG0uSXNCbG9ja2xpc3RlZChtb2R1bGUpKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBsb2FkIG1vZHVsZSAiIDw8IG1vZHVsZTsKICAgICAgICAgICAgICAgICAgICAgcnYgPSBFWElUX0ZBSUxVUkU7CiAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdG9vbGJveC9zZXRwcm9wLmNwcCBiL3Rvb2xib3gvc2V0cHJvcC5jcHAKaW5kZXggYWNmOGMzZS4uOTFlZGY0NSAxMDA2NDQKLS0tIGEvdG9vbGJveC9zZXRwcm9wLmNwcAorKysgYi90b29sYm94L3NldHByb3AuY3BwCkBAIC01OCw3ICs1OCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAodmFsdWUuc2l6ZSgpID49IFBST1BfVkFMVUVfTUFYICYmICFTdGFydHNXaXRoKHZhbHVlLCAicm8uIikpIHsKKyAgICBpZiAodmFsdWUuc2l6ZSgpID49IFBST1BfVkFMVUVfTUFYICYmICFTdGFydHNXaXRoKG5hbWUsICJyby4iKSkgewogICAgICAgICBzdGQ6OmNlcnIgPDwgIlZhbHVlICciIDw8IHZhbHVlIDw8ICInIGlzIHRvbyBsb25nLCAiIDw8IHZhbHVlLnNpemUoKQogICAgICAgICAgICAgICAgICAgPDwgIiBieXRlcyB2cyBhIG1heCBvZiAiIDw8IFBST1BfVkFMVUVfTUFYIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKZGlmZiAtLWdpdCBhL3RydXN0eS9PV05FUlMgYi90cnVzdHkvT1dORVJTCmluZGV4IDYxYjk3YzYuLjQ2ZjE0MTAgMTAwNjQ0Ci0tLSBhL3RydXN0eS9PV05FUlMKKysrIGIvdHJ1c3R5L09XTkVSUwpAQCAtMSwxMSArMSw1IEBACi1hcm1lbGxlbEBnb29nbGUuY29tCi1hcnZlQGFuZHJvaWQuY29tCi1kYW5pZWxhbmdlbGxAZ29vZ2xlLmNvbQotZ21hckBnb29nbGUuY29tCi1tYXJjb25lQGdvb2dsZS5jb20KLW1tYXVyZXJAZ29vZ2xlLmNvbQotbmNicmF5QGdvb2dsZS5jb20KLXN3aWxsZGVuQGdvb2dsZS5jb20KLXRodXJzdG9uQGdvb2dsZS5jb20KLXRyb25nQGdvb2dsZS5jb20KLXdlbmhhb3dhbmdAZ29vZ2xlLmNvbQorIyBpbmNsdWRlIE9XTkVSUyBmcm9tIHRoZSB0b3AgbGV2ZWwgdHJ1c3R5IHJlcG8KK2luY2x1ZGUgdHJ1c3R5Om1haW46L09XTkVSUworCittaWtlbWN0ZXJuYW5AZ29vZ2xlLmNvbQorc3dpbGxkZW5AZ29vZ2xlLmNvbQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydXN0eS9hcHBsb2FkZXIvYXBwbG9hZGVyLmNwcCBiL3RydXN0eS9hcHBsb2FkZXIvYXBwbG9hZGVyLmNwcAppbmRleCAxN2QwODNjLi4wOTE1ZWFiIDEwMDY0NAotLS0gYS90cnVzdHkvYXBwbG9hZGVyL2FwcGxvYWRlci5jcHAKKysrIGIvdHJ1c3R5L2FwcGxvYWRlci9hcHBsb2FkZXIuY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8QnVmZmVyQWxsb2NhdG9yL0J1ZmZlckFsbG9jYXRvci5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8Z2V0b3B0Lmg+CiAjaW5jbHVkZSA8c3RkYm9vbC5oPgpAQCAtMTA2LDcgKzEwNywxMSBAQAogICAgICAgICByZXR1cm4ge307CiAgICAgfQogCi0gICAgYXNzZXJ0KHN0LnN0X3NpemUgPj0gMCk7CisgICAgaWYgKHN0LnN0X3NpemUgPT0gMCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJaZXJvIGxlbmd0aCBmaWxlICciIDw8IGZpbGVfbmFtZSA8PCAiJyI7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisKICAgICBmaWxlX3NpemUgPSBzdC5zdF9zaXplOwogCiAgICAgLyogVGhlIGRtYWJ1ZiBzaXplIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgdGhlIHBhZ2Ugc2l6ZSAqLwpAQCAtMTIyLDcgKzEyNyw4IEBACiAgICAgQnVmZmVyQWxsb2NhdG9yIGFsbG9jOwogICAgIHVuaXF1ZV9mZCBkbWFidWZfZmQoYWxsb2MuQWxsb2Moa0RtYWJ1ZlN5c3RlbUhlYXBOYW1lLCBmaWxlX3BhZ2Vfc2l6ZSkpOwogICAgIGlmICghZG1hYnVmX2ZkLm9rKCkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiRXJyb3IgY3JlYXRpbmcgZG1hYnVmOiAiIDw8IGRtYWJ1Zl9mZC5nZXQoKTsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRXJyb3IgY3JlYXRpbmcgZG1hYnVmIGZvciAiIDw8IGZpbGVfcGFnZV9zaXplCisgICAgICAgICAgICAgICAgICAgPDwgIiBieXRlczogIiA8PCBkbWFidWZfZmQuZ2V0KCk7CiAgICAgICAgIHJldHVybiBkbWFidWZfZmQ7CiAgICAgfQogCmRpZmYgLS1naXQgYS90cnVzdHkvYXBwbG9hZGVyL2Z1enovYXBwX2Z1enplci5jcHAgYi90cnVzdHkvYXBwbG9hZGVyL2Z1enovYXBwX2Z1enplci5jcHAKaW5kZXggYWEwY2FjYS4uMGEwMzdmOSAxMDA2NDQKLS0tIGEvdHJ1c3R5L2FwcGxvYWRlci9mdXp6L2FwcF9mdXp6ZXIuY3BwCisrKyBiL3RydXN0eS9hcHBsb2FkZXIvZnV6ei9hcHBfZnV6emVyLmNwcApAQCAtNDMsMTAgKzQzLDYgQEAKICAgICAgICAgezB4YjUsIDB4ZTgsIDB4YTcsIDB4ZTksIDB4ZWYsIDB4MTcsIDB4M2EsIDB4OTd9LAogfTsKIAotc3RhdGljIGlubGluZSB1aW50cHRyX3QgUm91bmRQYWdlVXAodWludHB0cl90IHZhbCkgewotICAgIHJldHVybiAodmFsICsgKFBBR0VfU0laRSAtIDEpKSAmIH4oUEFHRV9TSVpFIC0gMSk7Ci19Ci0KIHN0YXRpYyBib29sIFNlbmRMb2FkTXNnKGludCBjaGFuLCBpbnQgZG1hX2J1Ziwgc2l6ZV90IGRtYV9idWZfc2l6ZSkgewogICAgIGFwcGxvYWRlcl9oZWFkZXIgaGRyID0gewogICAgICAgICAgICAgLmNtZCA9IEFQUExPQURFUl9DTURfTE9BRF9BUFBMSUNBVElPTiwKQEAgLTEwNyw3ICsxMDMsNyBAQAogICAgICAgICBhbmRyb2lkOjp0cnVzdHk6OmZ1eno6OkFib3J0KCk7CiAgICAgfQogCi0gICAgdWludDY0X3Qgc2htX2xlbiA9IHNpemUgPyBSb3VuZFBhZ2VVcChzaXplKSA6IFBBR0VfU0laRTsKKyAgICB1aW50NjRfdCBzaG1fbGVuID0gc2l6ZSA/IHNpemUgOiA0MDk2OwogICAgIEJ1ZmZlckFsbG9jYXRvciBhbGxvYzsKICAgICB1bmlxdWVfZmQgZG1hX2J1ZihhbGxvYy5BbGxvYyhrRG1hYnVmU3lzdGVtSGVhcE5hbWUsIHNobV9sZW4pKTsKICAgICBpZiAoZG1hX2J1ZiA8IDApIHsKZGlmZiAtLWdpdCBhL3RydXN0eS9jb25maXJtYXRpb251aS9UcnVzdHlBcHAuY3BwIGIvdHJ1c3R5L2NvbmZpcm1hdGlvbnVpL1RydXN0eUFwcC5jcHAKaW5kZXggY2VlODY1NS4uMjM1NmVlZiAxMDA2NDQKLS0tIGEvdHJ1c3R5L2NvbmZpcm1hdGlvbnVpL1RydXN0eUFwcC5jcHAKKysrIGIvdHJ1c3R5L2NvbmZpcm1hdGlvbnVpL1RydXN0eUFwcC5jcHAKQEAgLTMwLDEwICszMCw2IEBACiAKIHVzaW5nIDo6YW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOwogCi1zdGF0aWMgaW5saW5lIHVpbnRwdHJfdCBSb3VuZFBhZ2VVcCh1aW50cHRyX3QgdmFsKSB7Ci0gICAgcmV0dXJuICh2YWwgKyAoUEFHRV9TSVpFIC0gMSkpICYgfihQQUdFX1NJWkUgLSAxKTsKLX0KLQogc3NpemVfdCBUcnVzdHlBcHA6OlRydXN0eVJwYyhjb25zdCB1aW50OF90KiBvYmVnaW4sIGNvbnN0IHVpbnQ4X3QqIG9lbmQsIHVpbnQ4X3QqIGliZWdpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogaWVuZCkgewogICAgIHVpbnQzMl90IG9sZW4gPSBvZW5kIC0gb2JlZ2luOwpAQCAtOTksNyArOTUsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgdWludDMyX3Qgc2htX2xlbiA9IFJvdW5kUGFnZVVwKENPTkZJUk1BVElPTlVJX01BWF9NU0dfU0laRSk7CisgICAgdWludDMyX3Qgc2htX2xlbiA9IENPTkZJUk1BVElPTlVJX01BWF9NU0dfU0laRTsKICAgICBCdWZmZXJBbGxvY2F0b3IgYWxsb2NhdG9yOwogICAgIHVuaXF1ZV9mZCBkbWFfYnVmKGFsbG9jYXRvci5BbGxvYygic3lzdGVtIiwgc2htX2xlbikpOwogICAgIGlmIChkbWFfYnVmIDwgMCkgewpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2NvbmZpcm1hdGlvbnVpL2Z1enovQW5kcm9pZC5icCBiL3RydXN0eS9jb25maXJtYXRpb251aS9mdXp6L0FuZHJvaWQuYnAKaW5kZXggNDc4MDk0My4uOTY4MDRiZCAxMDA2NDQKLS0tIGEvdHJ1c3R5L2NvbmZpcm1hdGlvbnVpL2Z1enovQW5kcm9pZC5icAorKysgYi90cnVzdHkvY29uZmlybWF0aW9udWkvZnV6ei9BbmRyb2lkLmJwCkBAIC0yNiw3ICsyNiw4IEBACiAgICAgICAgICItRFRSVVNUWV9BUFBfRklMRU5BTUU9XCJjb25maXJtYXRpb251aS5zeW1zLmVsZlwiIiwKICAgICBdLAogICAgIGZ1enpfY29uZmlnOiB7Ci0gICAgICAgY2M6IFsidHJvbmdAZ29vZ2xlLmNvbSJdLAorICAgICAgIGNjOiBbIm1pa2VtY3Rlcm5hbkBnb29nbGUuY29tIl0sCisgICAgICAgY29tcG9uZW50aWQ6IDEyOTAyMzcsCiAgICAgfSwKIAogfQpAQCAtNDAsNyArNDEsOCBAQAogICAgICAgICAibGliZG1hYnVmaGVhcCIsCiAgICAgXSwKICAgICBmdXp6X2NvbmZpZzogewotICAgICAgIGNjOiBbInRyb25nQGdvb2dsZS5jb20iXSwKKyAgICAgICBjYzogWyJtaWtlbWN0ZXJuYW5AZ29vZ2xlLmNvbSJdLAorICAgICAgIGNvbXBvbmVudGlkOiAxMjkwMjM3LAogICAgIH0sCiAKICAgICAvLyBUaGUgaW5pdGlhbCBjb3JwdXMgZm9yIHRoaXMgZnV6emVyIHdhcyBkZXJpdmVkIGJ5IGR1bXBpbmcgbWVzc2FnZXMgZnJvbS90bwpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2NvdmVyYWdlL2NvdmVyYWdlLmNwcCBiL3RydXN0eS9jb3ZlcmFnZS9jb3ZlcmFnZS5jcHAKaW5kZXggM2M2YjVjNS4uOGZjMmY1YyAxMDA2NDQKLS0tIGEvdHJ1c3R5L2NvdmVyYWdlL2NvdmVyYWdlLmNwcAorKysgYi90cnVzdHkvY292ZXJhZ2UvY292ZXJhZ2UuY3BwCkBAIC00MywxMCArNDMsNiBAQAogdXNpbmcgc3RkOjp0b19zdHJpbmc7CiB1c2luZyBzdGQ6OnVuaXF1ZV9wdHI7CiAKLXN0YXRpYyBpbmxpbmUgdWludHB0cl90IFJvdW5kUGFnZVVwKHVpbnRwdHJfdCB2YWwpIHsKLSAgICByZXR1cm4gKHZhbCArIChQQUdFX1NJWkUgLSAxKSkgJiB+KFBBR0VfU0laRSAtIDEpOwotfQotCiBDb3ZlcmFnZVJlY29yZDo6Q292ZXJhZ2VSZWNvcmQoc3RyaW5nIHRpcGNfZGV2LCBzdHJ1Y3QgdXVpZCogdXVpZCkKICAgICA6IHRpcGNfZGV2XyhzdGQ6Om1vdmUodGlwY19kZXYpKSwKICAgICAgIGNvdmVyYWdlX3Nydl9mZF8oLTEpLApAQCAtMTM2LDcgKzEzMiw3IEBACiAgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJmYWlsZWQgdG8gb3BlbiBjb3ZlcmFnZSBjbGllbnQ6ICIgPDwgcmV0LmVycm9yKCk7CiAgICAgfQogICAgIHJlY29yZF9sZW5fID0gcmVzcC5vcGVuX2FyZ3MucmVjb3JkX2xlbjsKLSAgICBzaG1fbGVuXyA9IFJvdW5kUGFnZVVwKHJlY29yZF9sZW5fKTsKKyAgICBzaG1fbGVuXyA9IHJlY29yZF9sZW5fOwogCiAgICAgQnVmZmVyQWxsb2NhdG9yIGFsbG9jYXRvcjsKIApkaWZmIC0tZ2l0IGEvdHJ1c3R5L2Z1enovQW5kcm9pZC5icCBiL3RydXN0eS9mdXp6L0FuZHJvaWQuYnAKaW5kZXggNWQwZmY3OS4uOGE5M2U1ZSAxMDA2NDQKLS0tIGEvdHJ1c3R5L2Z1enovQW5kcm9pZC5icAorKysgYi90cnVzdHkvZnV6ei9BbmRyb2lkLmJwCkBAIC00MSw5ICs0MSw2IEBACiAgICAgICAgICJ1dGlscy5jcHAiLAogICAgIF0sCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYkZ1enplciIsCi0gICAgXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlidHJ1c3R5X2NvdmVyYWdlIiwKICAgICAgICAgImxpYmJhc2UiLApkaWZmIC0tZ2l0IGEvdHJ1c3R5L2Z1enovY291bnRlcnMuY3BwIGIvdHJ1c3R5L2Z1enovY291bnRlcnMuY3BwCmluZGV4IDY1YTNiYTYuLmU3MzBlYzMgMTAwNjQ0Ci0tLSBhL3RydXN0eS9mdXp6L2NvdW50ZXJzLmNwcAorKysgYi90cnVzdHkvZnV6ei9jb3VudGVycy5jcHAKQEAgLTE2LDEyICsxNiwxMiBAQAogCiAjZGVmaW5lIExPR19UQUcgInRydXN0eS1mdXp6LWNvdW50ZXJzIgogCi0jaW5jbHVkZSA8RnV6emVyRGVmcy5oPgotCiAjaW5jbHVkZSA8dHJ1c3R5L2Z1enovY291bnRlcnMuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHRydXN0eS9jb3ZlcmFnZS9jb3ZlcmFnZS5oPgogI2luY2x1ZGUgPHRydXN0eS9jb3ZlcmFnZS90aXBjLmg+CiAKQEAgLTQ1LDkgKzQ1LDYgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGFzc2VydChmdXp6ZXI6OkV4dHJhQ291bnRlcnNCZWdpbigpKTsKLSAgICBhc3NlcnQoZnV6emVyOjpFeHRyYUNvdW50ZXJzRW5kKCkpOwotCiAgICAgdm9sYXRpbGUgdWludDhfdCogYmVnaW4gPSBOVUxMOwogICAgIHZvbGF0aWxlIHVpbnQ4X3QqIGVuZCA9IE5VTEw7CiAgICAgcmVjb3JkXy0+R2V0UmF3Q291bnRzKCZiZWdpbiwgJmVuZCk7CkBAIC02Niw5ICs2Myw4IEBACiAgICAgaWYgKCFyZWNvcmRfLT5Jc09wZW4oKSkgewogICAgICAgICByZXR1cm47CiAgICAgfQotCiAgICAgcmVjb3JkXy0+UmVzZXRDb3VudHMoKTsKLSAgICBmdXp6ZXI6OkNsZWFyRXh0cmFDb3VudGVycygpOworICAgIG1lbXNldF9leHBsaWNpdChjb25zdF9jYXN0PHVpbnQ4X3QqPihjb3VudGVycyksIDAsIHNpemVvZihjb3VudGVycykpOwogfQogCiB2b2lkIEV4dHJhQ291bnRlcnM6OkZsdXNoKCkgewpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2Z1enovaW5jbHVkZS90cnVzdHkvZnV6ei91dGlscy5oIGIvdHJ1c3R5L2Z1enovaW5jbHVkZS90cnVzdHkvZnV6ei91dGlscy5oCmluZGV4IGM5MDY0MTIuLmNmNDk2MmUgMTAwNjQ0Ci0tLSBhL3RydXN0eS9mdXp6L2luY2x1ZGUvdHJ1c3R5L2Z1enovdXRpbHMuaAorKysgYi90cnVzdHkvZnV6ei9pbmNsdWRlL3RydXN0eS9mdXp6L3V0aWxzLmgKQEAgLTIxLDcgKzIxLDcgQEAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcmVzdWx0Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgogCi0jZGVmaW5lIFRJUENfTUFYX01TR19TSVpFIFBBR0VfU0laRQorI2RlZmluZSBUSVBDX01BWF9NU0dfU0laRSA0MDk2CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSB0cnVzdHkgewpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2dhdGVrZWVwZXIvYW5kcm9pZC5oYXJkd2FyZS5nYXRla2VlcGVyLXNlcnZpY2UudHJ1c3R5LnJjIGIvdHJ1c3R5L2dhdGVrZWVwZXIvYW5kcm9pZC5oYXJkd2FyZS5nYXRla2VlcGVyLXNlcnZpY2UudHJ1c3R5LnJjCmluZGV4IDY2ZWNiZDEuLjJjOWJkODMgMTAwNjQ0Ci0tLSBhL3RydXN0eS9nYXRla2VlcGVyL2FuZHJvaWQuaGFyZHdhcmUuZ2F0ZWtlZXBlci1zZXJ2aWNlLnRydXN0eS5yYworKysgYi90cnVzdHkvZ2F0ZWtlZXBlci9hbmRyb2lkLmhhcmR3YXJlLmdhdGVrZWVwZXItc2VydmljZS50cnVzdHkucmMKQEAgLTEsNCArMSw1IEBACi1zZXJ2aWNlIHZlbmRvci5nYXRla2VlcGVyX2RlZmF1bHQgL3ZlbmRvci9iaW4vaHcvYW5kcm9pZC5oYXJkd2FyZS5nYXRla2VlcGVyLXNlcnZpY2UudHJ1c3R5CitzZXJ2aWNlIHZlbmRvci5nYXRla2VlcGVyX2RlZmF1bHQgL3ZlbmRvci9iaW4vaHcvYW5kcm9pZC5oYXJkd2FyZS5nYXRla2VlcGVyLXNlcnZpY2UudHJ1c3R5IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tZGV2ICR7cm8uaGFyZHdhcmUudHJ1c3R5X2lwY19kZXYuZ2F0ZWtlZXBlcjotL2Rldi90cnVzdHktaXBjLWRldjB9CiAgICAgY2xhc3MgaGFsCiAgICAgdXNlciBzeXN0ZW0KICAgICBncm91cCBzeXN0ZW0KZGlmZiAtLWdpdCBhL3RydXN0eS9nYXRla2VlcGVyL3NlcnZpY2UuY3BwIGIvdHJ1c3R5L2dhdGVrZWVwZXIvc2VydmljZS5jcHAKaW5kZXggZDA5ODA0Zi4uNTkzNjZiOCAxMDA2NDQKLS0tIGEvdHJ1c3R5L2dhdGVrZWVwZXIvc2VydmljZS5jcHAKKysrIGIvdHJ1c3R5L2dhdGVrZWVwZXIvc2VydmljZS5jcHAKQEAgLTE4LDEyICsxOCw2NiBAQAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfbWFuYWdlci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3Byb2Nlc3MuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KIAogI2luY2x1ZGUgInRydXN0eV9nYXRla2VlcGVyLmgiCisjaW5jbHVkZSAidHJ1c3R5X2dhdGVrZWVwZXJfaXBjLmgiCiAKIHVzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpnYXRla2VlcGVyOjpUcnVzdHlHYXRlS2VlcGVyRGV2aWNlOwogCi1pbnQgbWFpbigpIHsKK3N0YXRpYyBjb25zdCBjaGFyKiBfc29wdHMgPSAiaEQ6IjsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIF9sb3B0c1tdID0geworICAgICAgICB7ImhlbHAiLCBub19hcmd1bWVudCwgMCwgJ2gnfSwKKyAgICAgICAgeyJkZXYiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0QnfSwKKyAgICAgICAgezAsIDAsIDAsIDB9LAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIqIHVzYWdlID0KKyAgICAgICAgIlVzYWdlOiAlcyBbb3B0aW9uc11cbiIKKyAgICAgICAgIlxuIgorICAgICAgICAib3B0aW9uczpcbiIKKyAgICAgICAgIiAgLWgsIC0taGVscCAgICAgICAgICAgIHByaW50cyB0aGlzIG1lc3NhZ2UgYW5kIGV4aXRcbiIKKyAgICAgICAgIiAgLUQsIC0tZGV2IG5hbWUgICAgICAgIFRydXN0eSBkZXZpY2UgbmFtZVxuIgorICAgICAgICAiXG4iOworCitzdGF0aWMgY29uc3QgY2hhciogdXNhZ2VfbG9uZyA9ICJcbiI7CisKK3N0YXRpYyB2b2lkIHByaW50X3VzYWdlX2FuZF9leGl0KGNvbnN0IGNoYXIqIHByb2csIGludCBjb2RlLCBib29sIHZlcmJvc2UpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgdXNhZ2UsIHByb2cpOworICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMiLCB1c2FnZV9sb25nKTsKKyAgICB9CisgICAgZXhpdChjb2RlKTsKK30KKworc3RhdGljIHZvaWQgcGFyc2Vfb3B0aW9ucyhpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBpbnQgYzsKKyAgICBpbnQgb2lkeCA9IDA7CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgX3NvcHRzLCBfbG9wdHMsICZvaWR4KTsKKyAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgIGJyZWFrOyAvKiBkb25lICovCisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ0QnOgorICAgICAgICAgICAgICAgIHRydXN0eV9nYXRla2VlcGVyX3NldF9kZXZfbmFtZShvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgICAgICAgICBwcmludF91c2FnZV9hbmRfZXhpdChhcmd2WzBdLCBFWElUX1NVQ0NFU1MsIHRydWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHByaW50X3VzYWdlX2FuZF9leGl0KGFyZ3ZbMF0sIEVYSVRfRkFJTFVSRSwgZmFsc2UpOworICAgICAgICB9CisgICAgfQorfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBwYXJzZV9vcHRpb25zKGFyZ2MsIGFyZ3YpOworCiAgICAgQUJpbmRlclByb2Nlc3Nfc2V0VGhyZWFkUG9vbE1heFRocmVhZENvdW50KDApOwogCiAgICAgc3RkOjpzaGFyZWRfcHRyPFRydXN0eUdhdGVLZWVwZXJEZXZpY2U+IGdhdGVrZWVwZXIgPQpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2dhdGVrZWVwZXIvdHJ1c3R5X2dhdGVrZWVwZXJfaXBjLmMgYi90cnVzdHkvZ2F0ZWtlZXBlci90cnVzdHlfZ2F0ZWtlZXBlcl9pcGMuYwppbmRleCBmNjc5NDRiLi41Y2E5NTFjIDEwMDY0NAotLS0gYS90cnVzdHkvZ2F0ZWtlZXBlci90cnVzdHlfZ2F0ZWtlZXBlcl9pcGMuYworKysgYi90cnVzdHkvZ2F0ZWtlZXBlci90cnVzdHlfZ2F0ZWtlZXBlcl9pcGMuYwpAQCAtMjgsMTIgKzI4LDE1IEBACiAjaW5jbHVkZSAidHJ1c3R5X2dhdGVrZWVwZXJfaXBjLmgiCiAjaW5jbHVkZSAiZ2F0ZWtlZXBlcl9pcGMuaCIKIAotI2RlZmluZSBUUlVTVFlfREVWSUNFX05BTUUgIi9kZXYvdHJ1c3R5LWlwYy1kZXYwIgotCitzdGF0aWMgY29uc3QgY2hhciogdHJ1c3R5X2RldmljZV9uYW1lID0gIi9kZXYvdHJ1c3R5LWlwYy1kZXYwIjsKIHN0YXRpYyBpbnQgaGFuZGxlXyA9IDA7CiAKK3ZvaWQgdHJ1c3R5X2dhdGVrZWVwZXJfc2V0X2Rldl9uYW1lKGNvbnN0IGNoYXIqIGRldmljZV9uYW1lKSB7CisgICAgdHJ1c3R5X2RldmljZV9uYW1lID0gZGV2aWNlX25hbWU7Cit9CisKIGludCB0cnVzdHlfZ2F0ZWtlZXBlcl9jb25uZWN0KCkgewotICAgIGludCByYyA9IHRpcGNfY29ubmVjdChUUlVTVFlfREVWSUNFX05BTUUsIEdBVEVLRUVQRVJfUE9SVCk7CisgICAgaW50IHJjID0gdGlwY19jb25uZWN0KHRydXN0eV9kZXZpY2VfbmFtZSwgR0FURUtFRVBFUl9QT1JUKTsKICAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgIHJldHVybiByYzsKICAgICB9CmRpZmYgLS1naXQgYS90cnVzdHkvZ2F0ZWtlZXBlci90cnVzdHlfZ2F0ZWtlZXBlcl9pcGMuaCBiL3RydXN0eS9nYXRla2VlcGVyL3RydXN0eV9nYXRla2VlcGVyX2lwYy5oCmluZGV4IGY4ZGU3ZjguLjQ3YmEzM2IgMTAwNjQ0Ci0tLSBhL3RydXN0eS9nYXRla2VlcGVyL3RydXN0eV9nYXRla2VlcGVyX2lwYy5oCisrKyBiL3RydXN0eS9nYXRla2VlcGVyL3RydXN0eV9nYXRla2VlcGVyX2lwYy5oCkBAIC0xNiw2ICsxNiw3IEBACiAKIF9fQkVHSU5fREVDTFMKIAordm9pZCB0cnVzdHlfZ2F0ZWtlZXBlcl9zZXRfZGV2X25hbWUoY29uc3QgY2hhciogZGV2aWNlX25hbWUpOwogaW50IHRydXN0eV9nYXRla2VlcGVyX2Nvbm5lY3QoKTsKIGludCB0cnVzdHlfZ2F0ZWtlZXBlcl9jYWxsKHVpbnQzMl90IGNtZCwgdm9pZCAqaW4sIHVpbnQzMl90IGluX3NpemUsIHVpbnQ4X3QgKm91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpvdXRfc2l6ZSk7CmRpZmYgLS1naXQgYS90cnVzdHkva2V5bWFzdGVyL0FuZHJvaWQuYnAgYi90cnVzdHkva2V5bWFzdGVyL0FuZHJvaWQuYnAKaW5kZXggYjI0OTAxMy4uNWExZTQyMCAxMDA2NDQKLS0tIGEvdHJ1c3R5L2tleW1hc3Rlci9BbmRyb2lkLmJwCisrKyBiL3RydXN0eS9rZXltYXN0ZXIvQW5kcm9pZC5icApAQCAtNDQsNyArNDQsNyBAQAogICAgICAgICAibGlidHJ1c3R5IiwKICAgICAgICAgImxpYmtleW1hc3Rlcl9tZXNzYWdlcyIsCiAgICAgICAgICJsaWJrZXltYXN0ZXIzZGV2aWNlIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUua2V5bWFzdGVyQDMuMCIKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUua2V5bWFzdGVyQDMuMCIsCiAgICAgXSwKIH0KIApAQCAtNzQsNyArNzQsNyBAQAogICAgICAgICAibGlidHJ1c3R5IiwKICAgICAgICAgImxpYmtleW1hc3Rlcl9tZXNzYWdlcyIsCiAgICAgICAgICJsaWJrZXltYXN0ZXI0IiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUua2V5bWFzdGVyQDQuMCIKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUua2V5bWFzdGVyQDQuMCIsCiAgICAgXSwKIAogICAgIHZpbnRmX2ZyYWdtZW50czogWyI0LjAvYW5kcm9pZC5oYXJkd2FyZS5rZXltYXN0ZXJANC4wLXNlcnZpY2UudHJ1c3R5LnhtbCJdLApAQCAtMTA1LDI1ICsxMDUsMjMgQEAKICAgICAgICAgImtleW1pbnQvVHJ1c3R5U2hhcmVkU2VjcmV0LmNwcCIsCiAgICAgICAgICJrZXltaW50L3NlcnZpY2UuY3BwIiwKICAgICBdLAotICAgIGRlZmF1bHRzOiBbCi0gICAgICAgICJrZXltaW50X3VzZV9sYXRlc3RfaGFsX2FpZGxfbmRrX3NoYXJlZCIsCi0gICAgXSwKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5zZWN1cml0eS5rZXltaW50LVYzLW5kayIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLnNlY3VyaXR5LnJrcC1WMy1uZGsiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5zZWN1cml0eS5zZWN1cmVjbG9jay1WMS1uZGsiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5zZWN1cml0eS5zaGFyZWRzZWNyZXQtVjEtbmRrIiwKLSAgICAgICAgImxpYl9hbmRyb2lkX2tleW1hc3Rlcl9rZXltaW50X3V0aWxzIiwKKyAgICAgICAgImxpYl9hbmRyb2lkX2tleW1hc3Rlcl9rZXltaW50X3V0aWxzX1YzIiwKICAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliYmluZGVyX25kayIsCiAgICAgICAgICJsaWJoYXJkd2FyZSIsCiAgICAgICAgICJsaWJrZXltYXN0ZXJfbWVzc2FnZXMiLAotICAgICAgICAibGlia2V5bWludCIsCisgICAgICAgICJsaWJrZXltYXN0ZXJjb25maWciLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnRydXN0eSIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKICAgICByZXF1aXJlZDogWwotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5oYXJkd2FyZV9rZXlzdG9yZS54bWwiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5oYXJkd2FyZV9rZXlzdG9yZV9WMy54bWwiLAogICAgIF0sCiB9CiAKQEAgLTIwOCwzICsyMDYsMzYgQEAKICAgICAgICAgIi1XZXJyb3IiLAogICAgIF0sCiB9CisKK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogInJrcF91ZHNfY2VydF90ZXN0LnhtbCIsCisgICAgdmVuZG9yOiB0cnVlLAorICAgIHNyYzogInNldF91ZHNfY2VydHMvcmtwX3Vkc19jZXJ0X3Rlc3QueG1sIiwKK30KKworY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAidHJ1c3R5X3JrcF9zZXRfdWRzX2NlcnQiLAorICAgIHZlbmRvcjogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgInNldF91ZHNfY2VydHMvc2V0X3Vkc19jZXJ0aWZpY2F0ZXMuY3BwIiwKKyAgICAgICAgImlwYy90cnVzdHlfa2V5bWFzdGVyX2lwYy5jcHAiLAorICAgIF0sCisKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmMiLAorICAgICAgICAibGliY3J5cHRvIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ0cnVzdHkiLAorICAgICAgICAibGliaGFyZHdhcmUiLAorICAgICAgICAibGlia2V5bWFzdGVyX21lc3NhZ2VzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnhtbDIiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1hc3Rlci9URVNUX01BUFBJTkcgYi90cnVzdHkva2V5bWFzdGVyL1RFU1RfTUFQUElORwppbmRleCAwNDc1ZTA0Li40ZjA4MmQ4IDEwMDY0NAotLS0gYS90cnVzdHkva2V5bWFzdGVyL1RFU1RfTUFQUElORworKysgYi90cnVzdHkva2V5bWFzdGVyL1RFU1RfTUFQUElORwpAQCAtMTAsMTMgKzEwLDE1IEBACiAgICAgICAgICJuYW1lIjogIlJrcGRBcHBVbml0VGVzdHMiCiAgICAgICB9LAogICAgICAgewotICAgICAgICAibmFtZSI6ICJSa3BkQXBwR29vZ2xlVW5pdFRlc3RzIgorICAgICAgICAibmFtZSI6ICJSa3BkQXBwR29vZ2xlVW5pdFRlc3RzIiwKKyAgICAgICAgImtleXdvcmRzIjogWyJpbnRlcm5hbCJdCiAgICAgICB9LAogICAgICAgewogICAgICAgICAibmFtZSI6ICJSa3BkQXBwSW50ZWdyYXRpb25UZXN0cyIKICAgICAgIH0sCiAgICAgICB7Ci0gICAgICAgICJuYW1lIjogIlJrcGRBcHBHb29nbGVJbnRlZ3JhdGlvblRlc3RzIgorICAgICAgICAibmFtZSI6ICJSa3BkQXBwR29vZ2xlSW50ZWdyYXRpb25UZXN0cyIsCisgICAgICAgICJrZXl3b3JkcyI6IFsiaW50ZXJuYWwiXQogICAgICAgfQogICBdCiB9CmRpZmYgLS1naXQgYS90cnVzdHkva2V5bWFzdGVyL1RydXN0eUtleW1hc3Rlci5jcHAgYi90cnVzdHkva2V5bWFzdGVyL1RydXN0eUtleW1hc3Rlci5jcHAKaW5kZXggYWM5ODY5NS4uYjExOGEyMCAxMDA2NDQKLS0tIGEvdHJ1c3R5L2tleW1hc3Rlci9UcnVzdHlLZXltYXN0ZXIuY3BwCisrKyBiL3RydXN0eS9rZXltYXN0ZXIvVHJ1c3R5S2V5bWFzdGVyLmNwcApAQCAtMjE4LDYgKzIxOCwxMSBAQAogICAgIEZvcndhcmRDb21tYW5kKEtNX0RFTEVURV9BTExfS0VZUywgcmVxdWVzdCwgcmVzcG9uc2UpOwogfQogCit2b2lkIFRydXN0eUtleW1hc3Rlcjo6RGVzdHJveUF0dGVzdGF0aW9uSWRzKGNvbnN0IERlc3Ryb3lBdHRlc3RhdGlvbklkc1JlcXVlc3QmIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc3Ryb3lBdHRlc3RhdGlvbklkc1Jlc3BvbnNlKiByZXNwb25zZSkgeworICAgIEZvcndhcmRDb21tYW5kKEtNX0RFU1RST1lfQVRURVNUQVRJT05fSURTLCByZXF1ZXN0LCByZXNwb25zZSk7Cit9CisKIHZvaWQgVHJ1c3R5S2V5bWFzdGVyOjpCZWdpbk9wZXJhdGlvbihjb25zdCBCZWdpbk9wZXJhdGlvblJlcXVlc3QmIHJlcXVlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVnaW5PcGVyYXRpb25SZXNwb25zZSogcmVzcG9uc2UpIHsKICAgICBGb3J3YXJkQ29tbWFuZChLTV9CRUdJTl9PUEVSQVRJT04sIHJlcXVlc3QsIHJlc3BvbnNlKTsKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltYXN0ZXIvZnV6ei9BbmRyb2lkLmJwIGIvdHJ1c3R5L2tleW1hc3Rlci9mdXp6L0FuZHJvaWQuYnAKaW5kZXggNWYyNGJjNi4uYjEwZjcyNyAxMDA2NDQKLS0tIGEvdHJ1c3R5L2tleW1hc3Rlci9mdXp6L0FuZHJvaWQuYnAKKysrIGIvdHJ1c3R5L2tleW1hc3Rlci9mdXp6L0FuZHJvaWQuYnAKQEAgLTI2LDcgKzI2LDkgQEAKICAgICAgICAgIi1EVFJVU1RZX0FQUF9GSUxFTkFNRT1cImtleW1hc3Rlci5zeW1zLmVsZlwiIiwKICAgICBdLAogICAgIGZ1enpfY29uZmlnOiB7Ci0gICAgICAgY2M6IFsidHJvbmdAZ29vZ2xlLmNvbSJdLAorICAgICAgIGNjOiBbInRyb25nQGdvb2dsZS5jb20iLCAiZHJ5c2RhbGVAZ29vZ2xlLmNvbSJdLAorICAgICAgIGNvbXBvbmVudGlkOiAxMDg0NzMzLAorICAgICAgIGhvdGxpc3RzOiBbIjQyNzE2OTYiXSwKICAgICB9LAogCiAgICAgLy8gVGhlIGluaXRpYWwgY29ycHVzIGZvciB0aGlzIGZ1enplciB3YXMgZGVyaXZlZCBieSBkdW1waW5nIG1lc3NhZ2VzIGZyb20KZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltYXN0ZXIvaW5jbHVkZS90cnVzdHlfa2V5bWFzdGVyL1RydXN0eUtleW1hc3Rlci5oIGIvdHJ1c3R5L2tleW1hc3Rlci9pbmNsdWRlL3RydXN0eV9rZXltYXN0ZXIvVHJ1c3R5S2V5bWFzdGVyLmgKaW5kZXggNjBkM2Y4Ny4uYzUwMTc4YiAxMDA2NDQKLS0tIGEvdHJ1c3R5L2tleW1hc3Rlci9pbmNsdWRlL3RydXN0eV9rZXltYXN0ZXIvVHJ1c3R5S2V5bWFzdGVyLmgKKysrIGIvdHJ1c3R5L2tleW1hc3Rlci9pbmNsdWRlL3RydXN0eV9rZXltYXN0ZXIvVHJ1c3R5S2V5bWFzdGVyLmgKQEAgLTU1LDYgKzU1LDggQEAKICAgICB2b2lkIFVwZ3JhZGVLZXkoY29uc3QgVXBncmFkZUtleVJlcXVlc3QmIHJlcXVlc3QsIFVwZ3JhZGVLZXlSZXNwb25zZSogcmVzcG9uc2UpOwogICAgIHZvaWQgRGVsZXRlS2V5KGNvbnN0IERlbGV0ZUtleVJlcXVlc3QmIHJlcXVlc3QsIERlbGV0ZUtleVJlc3BvbnNlKiByZXNwb25zZSk7CiAgICAgdm9pZCBEZWxldGVBbGxLZXlzKGNvbnN0IERlbGV0ZUFsbEtleXNSZXF1ZXN0JiByZXF1ZXN0LCBEZWxldGVBbGxLZXlzUmVzcG9uc2UqIHJlc3BvbnNlKTsKKyAgICB2b2lkIERlc3Ryb3lBdHRlc3RhdGlvbklkcyhjb25zdCBEZXN0cm95QXR0ZXN0YXRpb25JZHNSZXF1ZXN0JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc3Ryb3lBdHRlc3RhdGlvbklkc1Jlc3BvbnNlKiByZXNwb25zZSk7CiAgICAgdm9pZCBCZWdpbk9wZXJhdGlvbihjb25zdCBCZWdpbk9wZXJhdGlvblJlcXVlc3QmIHJlcXVlc3QsIEJlZ2luT3BlcmF0aW9uUmVzcG9uc2UqIHJlc3BvbnNlKTsKICAgICB2b2lkIFVwZGF0ZU9wZXJhdGlvbihjb25zdCBVcGRhdGVPcGVyYXRpb25SZXF1ZXN0JiByZXF1ZXN0LCBVcGRhdGVPcGVyYXRpb25SZXNwb25zZSogcmVzcG9uc2UpOwogICAgIHZvaWQgRmluaXNoT3BlcmF0aW9uKGNvbnN0IEZpbmlzaE9wZXJhdGlvblJlcXVlc3QmIHJlcXVlc3QsIEZpbmlzaE9wZXJhdGlvblJlc3BvbnNlKiByZXNwb25zZSk7CmRpZmYgLS1naXQgYS90cnVzdHkva2V5bWFzdGVyL2luY2x1ZGUvdHJ1c3R5X2tleW1hc3Rlci9pcGMva2V5bWFzdGVyX2lwYy5oIGIvdHJ1c3R5L2tleW1hc3Rlci9pbmNsdWRlL3RydXN0eV9rZXltYXN0ZXIvaXBjL2tleW1hc3Rlcl9pcGMuaAppbmRleCAwOWY2OTZiLi44MjJlOTMzIDEwMDY0NAotLS0gYS90cnVzdHkva2V5bWFzdGVyL2luY2x1ZGUvdHJ1c3R5X2tleW1hc3Rlci9pcGMva2V5bWFzdGVyX2lwYy5oCisrKyBiL3RydXN0eS9rZXltYXN0ZXIvaW5jbHVkZS90cnVzdHlfa2V5bWFzdGVyL2lwYy9rZXltYXN0ZXJfaXBjLmgKQEAgLTc4LDYgKzc4LDggQEAKICAgICBLTV9TRVRfQVRURVNUQVRJT05fSURTID0gKDB4YzAwMCA8PCBLRVlNQVNURVJfUkVRX1NISUZUKSwKICAgICBLTV9TRVRfQVRURVNUQVRJT05fSURTX0tNMyA9ICgweGMwMDEgPDwgS0VZTUFTVEVSX1JFUV9TSElGVCksCiAgICAgS01fQ09ORklHVVJFX0JPT1RfUEFUQ0hMRVZFTCA9ICgweGQwMDAgPDwgS0VZTUFTVEVSX1JFUV9TSElGVCksCisgICAgS01fQVBQRU5EX1VEU19DRVJUX0NIQUlOID0gKDB4ZTAwMDAgPDwgS0VZTUFTVEVSX1JFUV9TSElGVCksCisgICAgS01fQ0xFQVJfVURTX0NFUlRfQ0hBSU4gPSAoMHhlMDAwMSA8PCBLRVlNQVNURVJfUkVRX1NISUZUKSwKIH07CiAKICNpZmRlZiBfX0FORFJPSURfXwpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1hc3Rlci9pbmNsdWRlL3RydXN0eV9rZXltYXN0ZXIvaXBjL3RydXN0eV9rZXltYXN0ZXJfaXBjLmggYi90cnVzdHkva2V5bWFzdGVyL2luY2x1ZGUvdHJ1c3R5X2tleW1hc3Rlci9pcGMvdHJ1c3R5X2tleW1hc3Rlcl9pcGMuaAppbmRleCAxNjIwN2U2Li4xNTI0MWY0IDEwMDY0NAotLS0gYS90cnVzdHkva2V5bWFzdGVyL2luY2x1ZGUvdHJ1c3R5X2tleW1hc3Rlci9pcGMvdHJ1c3R5X2tleW1hc3Rlcl9pcGMuaAorKysgYi90cnVzdHkva2V5bWFzdGVyL2luY2x1ZGUvdHJ1c3R5X2tleW1hc3Rlci9pcGMvdHJ1c3R5X2tleW1hc3Rlcl9pcGMuaApAQCAtMjIsMTAgKzIyLDExIEBACiAKIF9fQkVHSU5fREVDTFMKIAotY29uc3QgdWludDMyX3QgVFJVU1RZX0tFWU1BU1RFUl9SRUNWX0JVRl9TSVpFID0gMiAqIFBBR0VfU0laRTsKK2NvbnN0IHVpbnQzMl90IFRSVVNUWV9LRVlNQVNURVJfUkVDVl9CVUZfU0laRSA9IDIgKiA0MDk2OwogY29uc3QgdWludDMyX3QgVFJVU1RZX0tFWU1BU1RFUl9TRU5EX0JVRl9TSVpFID0KLSAgICAgICAgKFBBR0VfU0laRSAtIHNpemVvZihzdHJ1Y3Qga2V5bWFzdGVyX21lc3NhZ2UpIC0gMTYgLyogdGlwYyBoZWFkZXIgKi8pOworICAgICAgICAoNDA5NiAtIHNpemVvZihzdHJ1Y3Qga2V5bWFzdGVyX21lc3NhZ2UpIC0gMTYgLyogdGlwYyBoZWFkZXIgKi8pOwogCit2b2lkIHRydXN0eV9rZXltYXN0ZXJfc2V0X2Rldl9uYW1lKGNvbnN0IGNoYXIqIGRldmljZV9uYW1lKTsKIGludCB0cnVzdHlfa2V5bWFzdGVyX2Nvbm5lY3Qodm9pZCk7CiBpbnQgdHJ1c3R5X2tleW1hc3Rlcl9jYWxsKHVpbnQzMl90IGNtZCwgdm9pZCogaW4sIHVpbnQzMl90IGluX3NpemUsIHVpbnQ4X3QqIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIG91dF9zaXplKTsKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltYXN0ZXIvaXBjL3RydXN0eV9rZXltYXN0ZXJfaXBjLmNwcCBiL3RydXN0eS9rZXltYXN0ZXIvaXBjL3RydXN0eV9rZXltYXN0ZXJfaXBjLmNwcAppbmRleCBkYjFhOWY0Li5jMDE4NzdmIDEwMDY0NAotLS0gYS90cnVzdHkva2V5bWFzdGVyL2lwYy90cnVzdHlfa2V5bWFzdGVyX2lwYy5jcHAKKysrIGIvdHJ1c3R5L2tleW1hc3Rlci9pcGMvdHJ1c3R5X2tleW1hc3Rlcl9pcGMuY3BwCkBAIC0zNiwxNSArMzYsMTggQEAKICNpbmNsdWRlIDx0cnVzdHlfa2V5bWFzdGVyL2lwYy90cnVzdHlfa2V5bWFzdGVyX2lwYy5oPgogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgogCi0jZGVmaW5lIFRSVVNUWV9ERVZJQ0VfTkFNRSAiL2Rldi90cnVzdHktaXBjLWRldjAiCitzdGF0aWMgY29uc3QgY2hhciogdHJ1c3R5X2RldmljZV9uYW1lID0gIi9kZXYvdHJ1c3R5LWlwYy1kZXYwIjsKIAogc3RhdGljIGludCBoYW5kbGVfID0gLTE7CiAKIHN0YXRpYyBjb25zdCBpbnQgdGltZW91dF9tcyA9IDEwICogMTAwMDsKIHN0YXRpYyBjb25zdCBpbnQgbWF4X3RpbWVvdXRfbXMgPSA2MCAqIDEwMDA7CiAKK3ZvaWQgdHJ1c3R5X2tleW1hc3Rlcl9zZXRfZGV2X25hbWUoY29uc3QgY2hhciogZGV2aWNlX25hbWUpIHsKKyAgICB0cnVzdHlfZGV2aWNlX25hbWUgPSBkZXZpY2VfbmFtZTsKK30KIGludCB0cnVzdHlfa2V5bWFzdGVyX2Nvbm5lY3QoKSB7Ci0gICAgaW50IHJjID0gdGlwY19jb25uZWN0KFRSVVNUWV9ERVZJQ0VfTkFNRSwgS0VZTUFTVEVSX1BPUlQpOworICAgIGludCByYyA9IHRpcGNfY29ubmVjdCh0cnVzdHlfZGV2aWNlX25hbWUsIEtFWU1BU1RFUl9QT1JUKTsKICAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgIHJldHVybiByYzsKICAgICB9CmRpZmYgLS1naXQgYS90cnVzdHkva2V5bWFzdGVyL2tleW1pbnQvVHJ1c3R5S2V5TWludERldmljZS5jcHAgYi90cnVzdHkva2V5bWFzdGVyL2tleW1pbnQvVHJ1c3R5S2V5TWludERldmljZS5jcHAKaW5kZXggYjY5NmZmOS4uZmVjNGM2MCAxMDA2NDQKLS0tIGEvdHJ1c3R5L2tleW1hc3Rlci9rZXltaW50L1RydXN0eUtleU1pbnREZXZpY2UuY3BwCisrKyBiL3RydXN0eS9rZXltYXN0ZXIva2V5bWludC9UcnVzdHlLZXlNaW50RGV2aWNlLmNwcApAQCAtMjU4LDcgKzI1OCwxMSBAQAogfQogCiBTY29wZWRBU3RhdHVzIFRydXN0eUtleU1pbnREZXZpY2U6OmRlc3Ryb3lBdHRlc3RhdGlvbklkcygpIHsKLSAgICByZXR1cm4ga21FcnJvcjJTY29wZWRBU3RhdHVzKEtNX0VSUk9SX1VOSU1QTEVNRU5URUQpOworICAgIGtleW1hc3Rlcjo6RGVzdHJveUF0dGVzdGF0aW9uSWRzUmVxdWVzdCByZXF1ZXN0KGltcGxfLT5tZXNzYWdlX3ZlcnNpb24oKSk7CisgICAga2V5bWFzdGVyOjpEZXN0cm95QXR0ZXN0YXRpb25JZHNSZXNwb25zZSByZXNwb25zZShpbXBsXy0+bWVzc2FnZV92ZXJzaW9uKCkpOworICAgIGltcGxfLT5EZXN0cm95QXR0ZXN0YXRpb25JZHMocmVxdWVzdCwgJnJlc3BvbnNlKTsKKworICAgIHJldHVybiBrbUVycm9yMlNjb3BlZEFTdGF0dXMocmVzcG9uc2UuZXJyb3IpOwogfQogCiBTY29wZWRBU3RhdHVzIFRydXN0eUtleU1pbnREZXZpY2U6OmJlZ2luKEtleVB1cnBvc2UgcHVycG9zZSwgY29uc3QgdmVjdG9yPHVpbnQ4X3Q+JiBrZXlCbG9iLApkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1hc3Rlci9rZXltaW50L2FuZHJvaWQuaGFyZHdhcmUuc2VjdXJpdHkua2V5bWludC1zZXJ2aWNlLnRydXN0eS5yYyBiL3RydXN0eS9rZXltYXN0ZXIva2V5bWludC9hbmRyb2lkLmhhcmR3YXJlLnNlY3VyaXR5LmtleW1pbnQtc2VydmljZS50cnVzdHkucmMKaW5kZXggMzg5YWY0MS4uMGNlYjU4NCAxMDA2NDQKLS0tIGEvdHJ1c3R5L2tleW1hc3Rlci9rZXltaW50L2FuZHJvaWQuaGFyZHdhcmUuc2VjdXJpdHkua2V5bWludC1zZXJ2aWNlLnRydXN0eS5yYworKysgYi90cnVzdHkva2V5bWFzdGVyL2tleW1pbnQvYW5kcm9pZC5oYXJkd2FyZS5zZWN1cml0eS5rZXltaW50LXNlcnZpY2UudHJ1c3R5LnJjCkBAIC0xLDQgKzEsNSBAQAotc2VydmljZSB2ZW5kb3Iua2V5bWludC10cnVzdHkgL3ZlbmRvci9iaW4vaHcvYW5kcm9pZC5oYXJkd2FyZS5zZWN1cml0eS5rZXltaW50LXNlcnZpY2UudHJ1c3R5CitzZXJ2aWNlIHZlbmRvci5rZXltaW50LXRydXN0eSAvdmVuZG9yL2Jpbi9ody9hbmRyb2lkLmhhcmR3YXJlLnNlY3VyaXR5LmtleW1pbnQtc2VydmljZS50cnVzdHkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1kZXYgJHtyby5oYXJkd2FyZS50cnVzdHlfaXBjX2Rldi5rZXltaW50Oi0vZGV2L3RydXN0eS1pcGMtZGV2MH0KICAgICBjbGFzcyBlYXJseV9oYWwKICAgICB1c2VyIG5vYm9keQogICAgIGdyb3VwIGRybXJwYwpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1hc3Rlci9rZXltaW50L3NlcnZpY2UuY3BwIGIvdHJ1c3R5L2tleW1hc3Rlci9rZXltaW50L3NlcnZpY2UuY3BwCmluZGV4IDE0NTQ5ZDIuLjU4M2Q4NDAgMTAwNjQ0Ci0tLSBhL3RydXN0eS9rZXltYXN0ZXIva2V5bWludC9zZXJ2aWNlLmNwcAorKysgYi90cnVzdHkva2V5bWFzdGVyL2tleW1pbnQvc2VydmljZS5jcHAKQEAgLTE4LDExICsxOCwxMyBAQAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfbWFuYWdlci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3Byb2Nlc3MuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KIAogI2luY2x1ZGUgPHRydXN0eV9rZXltYXN0ZXIvVHJ1c3R5S2V5TWludERldmljZS5oPgogI2luY2x1ZGUgPHRydXN0eV9rZXltYXN0ZXIvVHJ1c3R5UmVtb3RlbHlQcm92aXNpb25lZENvbXBvbmVudERldmljZS5oPgogI2luY2x1ZGUgPHRydXN0eV9rZXltYXN0ZXIvVHJ1c3R5U2VjdXJlQ2xvY2suaD4KICNpbmNsdWRlIDx0cnVzdHlfa2V5bWFzdGVyL1RydXN0eVNoYXJlZFNlY3JldC5oPgorI2luY2x1ZGUgPHRydXN0eV9rZXltYXN0ZXIvaXBjL3RydXN0eV9rZXltYXN0ZXJfaXBjLmg+CiAKIHVzaW5nIGFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpzZWN1cml0eTo6a2V5bWludDo6dHJ1c3R5OjpUcnVzdHlLZXlNaW50RGV2aWNlOwogdXNpbmcgYWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OnNlY3VyaXR5OjprZXltaW50Ojp0cnVzdHk6OlRydXN0eVJlbW90ZWx5UHJvdmlzaW9uZWRDb21wb25lbnREZXZpY2U7CkBAIC0zOSw3ICs0MSw1OCBAQAogICAgIHJldHVybiBzZXJ2aWNlOwogfQogCi1pbnQgbWFpbigpIHsKK3N0YXRpYyBjb25zdCBjaGFyKiBfc29wdHMgPSAiaEQ6IjsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIF9sb3B0c1tdID0geworICAgICAgICB7ImhlbHAiLCBub19hcmd1bWVudCwgMCwgJ2gnfSwKKyAgICAgICAgeyJkZXYiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0QnfSwKKyAgICAgICAgezAsIDAsIDAsIDB9LAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIqIHVzYWdlID0KKyAgICAgICAgIlVzYWdlOiAlcyBbb3B0aW9uc11cbiIKKyAgICAgICAgIlxuIgorICAgICAgICAib3B0aW9uczpcbiIKKyAgICAgICAgIiAgLWgsIC0taGVscCAgICAgICAgICAgIHByaW50cyB0aGlzIG1lc3NhZ2UgYW5kIGV4aXRcbiIKKyAgICAgICAgIiAgLUQsIC0tZGV2IG5hbWUgICAgICAgIFRydXN0eSBkZXZpY2UgbmFtZVxuIgorICAgICAgICAiXG4iOworCitzdGF0aWMgY29uc3QgY2hhciogdXNhZ2VfbG9uZyA9ICJcbiI7CisKK3N0YXRpYyB2b2lkIHByaW50X3VzYWdlX2FuZF9leGl0KGNvbnN0IGNoYXIqIHByb2csIGludCBjb2RlLCBib29sIHZlcmJvc2UpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgdXNhZ2UsIHByb2cpOworICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMiLCB1c2FnZV9sb25nKTsKKyAgICB9CisgICAgZXhpdChjb2RlKTsKK30KKworc3RhdGljIHZvaWQgcGFyc2Vfb3B0aW9ucyhpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBpbnQgYzsKKyAgICBpbnQgb2lkeCA9IDA7CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgX3NvcHRzLCBfbG9wdHMsICZvaWR4KTsKKyAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgIGJyZWFrOyAvKiBkb25lICovCisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ0QnOgorICAgICAgICAgICAgICAgIHRydXN0eV9rZXltYXN0ZXJfc2V0X2Rldl9uYW1lKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgJ2gnOgorICAgICAgICAgICAgICAgIHByaW50X3VzYWdlX2FuZF9leGl0KGFyZ3ZbMF0sIEVYSVRfU1VDQ0VTUywgdHJ1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcHJpbnRfdXNhZ2VfYW5kX2V4aXQoYXJndlswXSwgRVhJVF9GQUlMVVJFLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIHBhcnNlX29wdGlvbnMoYXJnYywgYXJndik7CiAgICAgYXV0byB0cnVzdHlLZXltYXN0ZXIgPSBzdGQ6Om1ha2Vfc2hhcmVkPGtleW1hc3Rlcjo6VHJ1c3R5S2V5bWFzdGVyPigpOwogICAgIGludCBlcnIgPSB0cnVzdHlLZXltYXN0ZXItPkluaXRpYWxpemUoa2V5bWFzdGVyOjpLbVZlcnNpb246OktFWU1JTlRfMyk7CiAgICAgaWYgKGVyciAhPSAwKSB7CmRpZmYgLS1naXQgYS90cnVzdHkva2V5bWFzdGVyL3NldF9hdHRlc3RhdGlvbl9pZHMvc2V0X2F0dGVzdGF0aW9uX2lkcy5jcHAgYi90cnVzdHkva2V5bWFzdGVyL3NldF9hdHRlc3RhdGlvbl9pZHMvc2V0X2F0dGVzdGF0aW9uX2lkcy5jcHAKaW5kZXggZTk0NDE2Ny4uZGVjNjRlMSAxMDA2NDQKLS0tIGEvdHJ1c3R5L2tleW1hc3Rlci9zZXRfYXR0ZXN0YXRpb25faWRzL3NldF9hdHRlc3RhdGlvbl9pZHMuY3BwCisrKyBiL3RydXN0eS9rZXltYXN0ZXIvc2V0X2F0dGVzdGF0aW9uX2lkcy9zZXRfYXR0ZXN0YXRpb25faWRzLmNwcApAQCAtMTcsOCArMTcsMTAgQEAKICNpbmNsdWRlIDxnZXRvcHQuaD4KIAogI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CiAjaW5jbHVkZSA8dHJ1c3R5X2tleW1hc3Rlci9pcGMvdHJ1c3R5X2tleW1hc3Rlcl9pcGMuaD4KIAogbmFtZXNwYWNlIHsKQEAgLTM0LDE0ICszNiw2NiBAQAogICAgICAgICB7Im1vZGVsIiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsICdtJ30sCiAgICAgICAgIHsiaW1laSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCAnaSd9LAogICAgICAgICB7Im1laWQiLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgJ2MnfSwKKyAgICAgICAgeyJpbWVpMiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCAnMid9LAogICAgICAgICB7MCwgMCwgMCwgMH0sCiB9OwogCitzdGQ6OnN0cmluZyBURUxFUEhPTllfQ01EX0dFVF9JTUVJID0gImNtZCBwaG9uZSBnZXQtaW1laSAiOworCisvLyBSdW4gYSBzaGVsbCBjb21tYW5kIGFuZCBjb2xsZWN0IHRoZSBvdXRwdXQgb2YgaXQuIElmIGFueSBlcnJvciwgc2V0IGFuIGVtcHR5IHN0cmluZyBhcyB0aGUKKy8vIG91dHB1dC4KK3N0ZDo6c3RyaW5nIGV4ZWNfY29tbWFuZChjb25zdCBzdGQ6OnN0cmluZyYgY29tbWFuZCkgeworICAgIGNoYXIgYnVmZmVyWzEyOF07CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgICBGSUxFKiBwaXBlID0gcG9wZW4oY29tbWFuZC5jX3N0cigpLCAiciIpOworICAgIGlmICghcGlwZSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInBvcGVuKCclcycpIGZhaWxlZFxuIiwgY29tbWFuZC5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICB3aGlsZSAoIWZlb2YocGlwZSkpIHsKKyAgICAgICAgaWYgKGZnZXRzKGJ1ZmZlciwgMTI4LCBwaXBlKSAhPSBOVUxMKSB7CisgICAgICAgICAgICByZXN1bHQgKz0gYnVmZmVyOworICAgICAgICB9CisgICAgfQorCisgICAgcGNsb3NlKHBpcGUpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIEdldCBJTUVJIHVzaW5nIFRlbGVwaG9ueSBzZXJ2aWNlIHNoZWxsIGNvbW1hbmQuIElmIGFueSBlcnJvciB3aGlsZSBleGVjdXRpbmcgdGhlIGNvbW1hbmQKKy8vIHRoZW4gZW1wdHkgc3RyaW5nIHdpbGwgYmUgcmV0dXJuZWQgYXMgb3V0cHV0Lgorc3RkOjpzdHJpbmcgZ2V0X2ltZWkoaW50IHNsb3QpIHsKKyAgICBzdGQ6OnN0cmluZyBjbWQgPSBURUxFUEhPTllfQ01EX0dFVF9JTUVJICsgc3RkOjp0b19zdHJpbmcoc2xvdCk7CisgICAgc3RkOjpzdHJpbmcgb3V0cHV0ID0gZXhlY19jb21tYW5kKGNtZCk7CisKKyAgICBpZiAob3V0cHV0LmVtcHR5KCkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJSZXRyaWV2ZSBJTUVJIGNvbW1hbmQgKCclcycpIGZhaWxlZFxuIiwgY21kLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gIiI7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG91dCA9CisgICAgICAgICAgICA6OmFuZHJvaWQ6OmJhc2U6OlRva2VuaXplKDo6YW5kcm9pZDo6YmFzZTo6VHJpbShvdXRwdXQpLCAiRGV2aWNlIElNRUk6Iik7CisKKyAgICBpZiAob3V0LnNpemUoKSAhPSAxKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgcGFyc2luZyBjb21tYW5kICgnJXMnKSBvdXRwdXQgJyVzJ1xuIiwgY21kLmNfc3RyKCksIG91dHB1dC5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuICIiOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGltZWkgPSA6OmFuZHJvaWQ6OmJhc2U6OlRyaW0ob3V0WzBdKTsKKyAgICBpZiAoaW1laS5jb21wYXJlKCJudWxsIikgPT0gMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIklNRUkgdmFsdWUgZnJvbSBjb21tYW5kICgnJXMnKSBpcyBudWxsLCBza2lwcGluZyIsIGNtZC5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuICIiOworICAgIH0KKyAgICByZXR1cm4gaW1laTsKK30KKwogc3RkOjpzdHJpbmcgYnVmMnN0cmluZyhjb25zdCBrZXltYXN0ZXI6OkJ1ZmZlciYgYnVmKSB7CiAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGJ1Zi5wZWVrX3JlYWQoKSksIGJ1Zi5hdmFpbGFibGVfcmVhZCgpKTsKIH0KIAotdm9pZCBwcmludF91c2FnZShjb25zdCBjaGFyKiBwcm9nLCBjb25zdCBrZXltYXN0ZXI6OlNldEF0dGVzdGF0aW9uSWRzUmVxdWVzdCYgcmVxKSB7Cit2b2lkIHByaW50X3VzYWdlKGNvbnN0IGNoYXIqIHByb2csIGNvbnN0IGtleW1hc3Rlcjo6U2V0QXR0ZXN0YXRpb25JZHNLTTNSZXF1ZXN0JiByZXEpIHsKICAgICBmcHJpbnRmKHN0ZGVyciwKICAgICAgICAgICAgICJVc2FnZTogJXMgW29wdGlvbnNdXG4iCiAgICAgICAgICAgICAiXG4iCkBAIC01NSwzNCArMTA5LDUzIEBACiAgICAgICAgICAgICAiICAtbSwgLS1tb2RlbCA8dmFsPiAgICAgICAgICBzZXQgbW9kZWwgKGRlZmF1bHQgJyVzJylcbiIKICAgICAgICAgICAgICIgIC1pLCAtLWltZWkgPHZhbD4gICAgICAgICAgIHNldCBJTUVJIChkZWZhdWx0ICclcycpXG4iCiAgICAgICAgICAgICAiICAtYywgLS1tZWlkIDx2YWw+ICAgICAgICAgICBzZXQgTUVJRCAoZGVmYXVsdCAnJXMnKVxuIgorICAgICAgICAgICAgIiAgLTIsIC0taW1laTIgPHZhbD4gICAgICAgICAgc2V0IHNlY29uZCBJTUVJIChkZWZhdWx0ICclcycpXG4iCiAgICAgICAgICAgICAiXG4iLAotICAgICAgICAgICAgcHJvZywgYnVmMnN0cmluZyhyZXEuYnJhbmQpLmNfc3RyKCksIGJ1ZjJzdHJpbmcocmVxLmRldmljZSkuY19zdHIoKSwKLSAgICAgICAgICAgIGJ1ZjJzdHJpbmcocmVxLnByb2R1Y3QpLmNfc3RyKCksIGJ1ZjJzdHJpbmcocmVxLnNlcmlhbCkuY19zdHIoKSwKLSAgICAgICAgICAgIGJ1ZjJzdHJpbmcocmVxLm1hbnVmYWN0dXJlcikuY19zdHIoKSwgYnVmMnN0cmluZyhyZXEubW9kZWwpLmNfc3RyKCksCi0gICAgICAgICAgICBidWYyc3RyaW5nKHJlcS5pbWVpKS5jX3N0cigpLCBidWYyc3RyaW5nKHJlcS5tZWlkKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHByb2csIGJ1ZjJzdHJpbmcocmVxLmJhc2UuYnJhbmQpLmNfc3RyKCksIGJ1ZjJzdHJpbmcocmVxLmJhc2UuZGV2aWNlKS5jX3N0cigpLAorICAgICAgICAgICAgYnVmMnN0cmluZyhyZXEuYmFzZS5wcm9kdWN0KS5jX3N0cigpLCBidWYyc3RyaW5nKHJlcS5iYXNlLnNlcmlhbCkuY19zdHIoKSwKKyAgICAgICAgICAgIGJ1ZjJzdHJpbmcocmVxLmJhc2UubWFudWZhY3R1cmVyKS5jX3N0cigpLCBidWYyc3RyaW5nKHJlcS5iYXNlLm1vZGVsKS5jX3N0cigpLAorICAgICAgICAgICAgYnVmMnN0cmluZyhyZXEuYmFzZS5pbWVpKS5jX3N0cigpLCBidWYyc3RyaW5nKHJlcS5iYXNlLm1laWQpLmNfc3RyKCksCisgICAgICAgICAgICBidWYyc3RyaW5nKHJlcS5zZWNvbmRfaW1laSkuY19zdHIoKSk7Cit9CisKK3ZvaWQgc2V0X3RvKGtleW1hc3Rlcjo6QnVmZmVyKiBidWYsIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIGlmICghdmFsdWUuZW1wdHkoKSkgeworICAgICAgICBidWYtPlJlaW5pdGlhbGl6ZSh2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7CisgICAgfQogfQogCiB2b2lkIHNldF9mcm9tX3Byb3Aoa2V5bWFzdGVyOjpCdWZmZXIqIGJ1ZiwgY29uc3Qgc3RkOjpzdHJpbmcmIHByb3ApIHsKICAgICBzdGQ6OnN0cmluZyBwcm9wX3ZhbHVlID0gOjphbmRyb2lkOjpiYXNlOjpHZXRQcm9wZXJ0eShwcm9wLCAvKiBkZWZhdWx0X3ZhbHVlID0gKi8gIiIpOwotICAgIGlmICghcHJvcF92YWx1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIGJ1Zi0+UmVpbml0aWFsaXplKHByb3BfdmFsdWUuZGF0YSgpLCBwcm9wX3ZhbHVlLnNpemUoKSk7Ci0gICAgfQorICAgIHNldF90byhidWYsIHByb3BfdmFsdWUpOwogfQogCi12b2lkIHBvcHVsYXRlX2lkcyhrZXltYXN0ZXI6OlNldEF0dGVzdGF0aW9uSWRzUmVxdWVzdCogcmVxKSB7Cit2b2lkIHBvcHVsYXRlX2Jhc2VfaWRzKGtleW1hc3Rlcjo6U2V0QXR0ZXN0YXRpb25JZHNSZXF1ZXN0KiByZXEpIHsKICAgICBzZXRfZnJvbV9wcm9wKCZyZXEtPmJyYW5kLCAicm8ucHJvZHVjdC5icmFuZCIpOwogICAgIHNldF9mcm9tX3Byb3AoJnJlcS0+ZGV2aWNlLCAicm8ucHJvZHVjdC5kZXZpY2UiKTsKICAgICBzZXRfZnJvbV9wcm9wKCZyZXEtPnByb2R1Y3QsICJyby5wcm9kdWN0Lm5hbWUiKTsKICAgICBzZXRfZnJvbV9wcm9wKCZyZXEtPnNlcmlhbCwgInJvLnNlcmlhbG5vIik7CiAgICAgc2V0X2Zyb21fcHJvcCgmcmVxLT5tYW51ZmFjdHVyZXIsICJyby5wcm9kdWN0Lm1hbnVmYWN0dXJlciIpOwogICAgIHNldF9mcm9tX3Byb3AoJnJlcS0+bW9kZWwsICJyby5wcm9kdWN0Lm1vZGVsIik7CisgICAgc3RkOjpzdHJpbmcgaW1laSA9IGdldF9pbWVpKDApOworICAgIHNldF90bygmcmVxLT5pbWVpLCBpbWVpKTsKK30KKwordm9pZCBwb3B1bGF0ZV9pZHMoa2V5bWFzdGVyOjpTZXRBdHRlc3RhdGlvbklkc0tNM1JlcXVlc3QqIHJlcSkgeworICAgIHBvcHVsYXRlX2Jhc2VfaWRzKCZyZXEtPmJhc2UpOworCisgICAgLy8gLSAiV2hhdCBhYm91dCBJTUVJPyIKKyAgICAvLyAtICJZb3UndmUgYWxyZWFkeSBoYWQgaXQuIgorICAgIC8vIC0gIldlJ3ZlIGhhZCBvbmUsIHllcy4gV2hhdCBhYm91dCBzZWNvbmQgSU1FST8iCisgICAgLy8gLSAiSSBkb24ndCB0aGluayBoZSBrbm93cyBhYm91dCBzZWNvbmQgSU1FSSwgUGlwLiIKKyAgICBzdGQ6OnN0cmluZyBpbWVpMiA9IGdldF9pbWVpKDEpOworICAgIHNldF90bygmcmVxLT5zZWNvbmRfaW1laSwgaW1laTIpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UKIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CiAgICAgLy8gQnkgZGVmYXVsdCwgc2V0IGF0dGVzdGF0aW9uIElEcyB0byB0aGUgdmFsdWVzIGluIHVzZXJzcGFjZSBwcm9wZXJ0aWVzLgotICAgIGtleW1hc3Rlcjo6U2V0QXR0ZXN0YXRpb25JZHNSZXF1ZXN0IHJlcSgvKiB2ZXIgPSAqLyA0KTsKKyAgICBrZXltYXN0ZXI6OlNldEF0dGVzdGF0aW9uSWRzS00zUmVxdWVzdCByZXEoLyogdmVyID0gKi8gNCk7CiAgICAgcG9wdWxhdGVfaWRzKCZyZXEpOwogCiAgICAgd2hpbGUgKHRydWUpIHsKQEAgLTk0LDI4ICsxNjcsMzEgQEAKIAogICAgICAgICBzd2l0Y2ggKGMpIHsKICAgICAgICAgICAgIGNhc2UgJ2InOgotICAgICAgICAgICAgICAgIHJlcS5icmFuZC5SZWluaXRpYWxpemUob3B0YXJnLCBzdHJsZW4ob3B0YXJnKSk7CisgICAgICAgICAgICAgICAgcmVxLmJhc2UuYnJhbmQuUmVpbml0aWFsaXplKG9wdGFyZywgc3RybGVuKG9wdGFyZykpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAnZCc6Ci0gICAgICAgICAgICAgICAgcmVxLmRldmljZS5SZWluaXRpYWxpemUob3B0YXJnLCBzdHJsZW4ob3B0YXJnKSk7CisgICAgICAgICAgICAgICAgcmVxLmJhc2UuZGV2aWNlLlJlaW5pdGlhbGl6ZShvcHRhcmcsIHN0cmxlbihvcHRhcmcpKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgJ3AnOgotICAgICAgICAgICAgICAgIHJlcS5wcm9kdWN0LlJlaW5pdGlhbGl6ZShvcHRhcmcsIHN0cmxlbihvcHRhcmcpKTsKKyAgICAgICAgICAgICAgICByZXEuYmFzZS5wcm9kdWN0LlJlaW5pdGlhbGl6ZShvcHRhcmcsIHN0cmxlbihvcHRhcmcpKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgJ3MnOgotICAgICAgICAgICAgICAgIHJlcS5zZXJpYWwuUmVpbml0aWFsaXplKG9wdGFyZywgc3RybGVuKG9wdGFyZykpOworICAgICAgICAgICAgICAgIHJlcS5iYXNlLnNlcmlhbC5SZWluaXRpYWxpemUob3B0YXJnLCBzdHJsZW4ob3B0YXJnKSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICdNJzoKLSAgICAgICAgICAgICAgICByZXEubWFudWZhY3R1cmVyLlJlaW5pdGlhbGl6ZShvcHRhcmcsIHN0cmxlbihvcHRhcmcpKTsKKyAgICAgICAgICAgICAgICByZXEuYmFzZS5tYW51ZmFjdHVyZXIuUmVpbml0aWFsaXplKG9wdGFyZywgc3RybGVuKG9wdGFyZykpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAnbSc6Ci0gICAgICAgICAgICAgICAgcmVxLm1vZGVsLlJlaW5pdGlhbGl6ZShvcHRhcmcsIHN0cmxlbihvcHRhcmcpKTsKKyAgICAgICAgICAgICAgICByZXEuYmFzZS5tb2RlbC5SZWluaXRpYWxpemUob3B0YXJnLCBzdHJsZW4ob3B0YXJnKSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICdpJzoKLSAgICAgICAgICAgICAgICByZXEuaW1laS5SZWluaXRpYWxpemUob3B0YXJnLCBzdHJsZW4ob3B0YXJnKSk7CisgICAgICAgICAgICAgICAgcmVxLmJhc2UuaW1laS5SZWluaXRpYWxpemUob3B0YXJnLCBzdHJsZW4ob3B0YXJnKSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICdjJzoKLSAgICAgICAgICAgICAgICByZXEubWVpZC5SZWluaXRpYWxpemUob3B0YXJnLCBzdHJsZW4ob3B0YXJnKSk7CisgICAgICAgICAgICAgICAgcmVxLmJhc2UubWVpZC5SZWluaXRpYWxpemUob3B0YXJnLCBzdHJsZW4ob3B0YXJnKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICcyJzoKKyAgICAgICAgICAgICAgICByZXEuc2Vjb25kX2ltZWkuUmVpbml0aWFsaXplKG9wdGFyZywgc3RybGVuKG9wdGFyZykpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAnaCc6CiAgICAgICAgICAgICAgICAgcHJpbnRfdXNhZ2UoYXJndlswXSwgcmVxKTsKQEAgLTE0NCwxOSArMjIwLDM0IEBACiAgICAgICAgICAgICIgIG1hbnVmYWN0dXJlcjogJXNcbiIKICAgICAgICAgICAgIiAgbW9kZWw6ICAgICAgICAlc1xuIgogICAgICAgICAgICAiICBJTUVJOiAgICAgICAgICVzXG4iCi0gICAgICAgICAgICIgIE1FSUQ6ICAgICAgICAgJXNcbiIsCi0gICAgICAgICAgIGJ1ZjJzdHJpbmcocmVxLmJyYW5kKS5jX3N0cigpLCBidWYyc3RyaW5nKHJlcS5kZXZpY2UpLmNfc3RyKCksCi0gICAgICAgICAgIGJ1ZjJzdHJpbmcocmVxLnByb2R1Y3QpLmNfc3RyKCksIGJ1ZjJzdHJpbmcocmVxLnNlcmlhbCkuY19zdHIoKSwKLSAgICAgICAgICAgYnVmMnN0cmluZyhyZXEubWFudWZhY3R1cmVyKS5jX3N0cigpLCBidWYyc3RyaW5nKHJlcS5tb2RlbCkuY19zdHIoKSwKLSAgICAgICAgICAgYnVmMnN0cmluZyhyZXEuaW1laSkuY19zdHIoKSwgYnVmMnN0cmluZyhyZXEubWVpZCkuY19zdHIoKSk7CisgICAgICAgICAgICIgIE1FSUQ6ICAgICAgICAgJXNcbiIKKyAgICAgICAgICAgIiAgU0VDT05EX0lNRUk6ICAlc1xuXG4iLAorICAgICAgICAgICBidWYyc3RyaW5nKHJlcS5iYXNlLmJyYW5kKS5jX3N0cigpLCBidWYyc3RyaW5nKHJlcS5iYXNlLmRldmljZSkuY19zdHIoKSwKKyAgICAgICAgICAgYnVmMnN0cmluZyhyZXEuYmFzZS5wcm9kdWN0KS5jX3N0cigpLCBidWYyc3RyaW5nKHJlcS5iYXNlLnNlcmlhbCkuY19zdHIoKSwKKyAgICAgICAgICAgYnVmMnN0cmluZyhyZXEuYmFzZS5tYW51ZmFjdHVyZXIpLmNfc3RyKCksIGJ1ZjJzdHJpbmcocmVxLmJhc2UubW9kZWwpLmNfc3RyKCksCisgICAgICAgICAgIGJ1ZjJzdHJpbmcocmVxLmJhc2UuaW1laSkuY19zdHIoKSwgYnVmMnN0cmluZyhyZXEuYmFzZS5tZWlkKS5jX3N0cigpLAorICAgICAgICAgICBidWYyc3RyaW5nKHJlcS5zZWNvbmRfaW1laSkuY19zdHIoKSk7CisgICAgZmZsdXNoKHN0ZG91dCk7CiAKICAgICBrZXltYXN0ZXI6OkVtcHR5S2V5bWFzdGVyUmVzcG9uc2UgcnNwKC8qIHZlciA9ICovIDQpOwotICAgIHJldCA9IHRydXN0eV9rZXltYXN0ZXJfc2VuZChLTV9TRVRfQVRURVNUQVRJT05fSURTLCByZXEsICZyc3ApOwotICAgIGlmIChyZXQpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJTRVRfQVRURVNUQVRJT05fSURTIGZhaWxlZDogJWRcbiIsIHJldCk7Ci0gICAgICAgIHRydXN0eV9rZXltYXN0ZXJfZGlzY29ubmVjdCgpOwotICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIGNvbnN0IGNoYXIqIG1zZzsKKyAgICBpZiAocmVxLnNlY29uZF9pbWVpLmF2YWlsYWJsZV9yZWFkKCkgPT0gMCkgeworICAgICAgICAvLyBObyBTRUNPTkRfSU1FSSBzZXQsIHVzZSBiYXNlIGNvbW1hbmQuCisgICAgICAgIHJldCA9IHRydXN0eV9rZXltYXN0ZXJfc2VuZChLTV9TRVRfQVRURVNUQVRJT05fSURTLCByZXEuYmFzZSwgJnJzcCk7CisgICAgICAgIG1zZyA9ICJTRVRfQVRURVNUQVRJT05fSURTIjsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBTRUNPTkRfSU1FSSBpcyBzZXQsIHVzZSB1cGRhdGVkIGNvbW1hbmQuCisgICAgICAgIHJldCA9IHRydXN0eV9rZXltYXN0ZXJfc2VuZChLTV9TRVRfQVRURVNUQVRJT05fSURTX0tNMywgcmVxLCAmcnNwKTsKKyAgICAgICAgbXNnID0gIlNFVF9BVFRFU1RBVElPTl9JRFNfS00zIjsKICAgICB9CisgICAgdHJ1c3R5X2tleW1hc3Rlcl9kaXNjb25uZWN0KCk7CiAKLSAgICByZXR1cm4gRVhJVF9TVUNDRVNTOworICAgIGlmIChyZXQpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyBmYWlsZWQ6ICVkXG4iLCBtc2csIHJldCk7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCJkb25lXG4iKTsKKyAgICAgICAgcHJpbnRmKCJcbk5PVEU6IGRldmljZSByZWJvb3QgbWF5IGJlIHJlcXVpcmVkIGJlZm9yZSBjaGFuZ2VzIHRha2UgZWZmZWN0LlxuIik7CisgICAgICAgIHJldHVybiBFWElUX1NVQ0NFU1M7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1hc3Rlci9zZXRfdWRzX2NlcnRzL3JrcF91ZHNfY2VydF90ZXN0LnhtbCBiL3RydXN0eS9rZXltYXN0ZXIvc2V0X3Vkc19jZXJ0cy9ya3BfdWRzX2NlcnRfdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNiN2I0YwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltYXN0ZXIvc2V0X3Vkc19jZXJ0cy9ya3BfdWRzX2NlcnRfdGVzdC54bWwKQEAgLTAsMCArMSw0MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8UGl4ZWxVZHNDZXJ0aWZpY2F0ZXM+CisgIDxDZXJ0aWZpY2F0ZUNoYWluPgorICAgIDxOdW1iZXJPZkNlcnRpZmljYXRlcz4zPC9OdW1iZXJPZkNlcnRpZmljYXRlcz4KKyAgICA8Q2VydGlmaWNhdGUgZm9ybWF0PSJwZW0iPgorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlCV1RDQjNxQURBZ0VDQWdVQTNxMis3ekFNQmdncWhrak9QUVFEQXdVQU1CSXhFREFPQmdOVkJBTU1CMGRUCitUVWt4TGpBd0loZ1BNakF5TkRBeE1ERXdNREF3TURCYUdBODVPVGs1TVRJek1USXpOVGsxT1Zvd0VqRVFNQTRHCitBMVVFQXd3SFIxTk5TVEV1TURCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCRnNOUGRzUG14Mk5LTmlUCis3b1JlRjM2SFRYamZ0UmZHZmZZZ1BmL3ZFaHJUN1hMSjdkVGhrY2IrT0ZZV1lsT2NrZGszRFJncVROV1FYc290CitVc1pod1J2ZVU4aHVFak9CTzUrZHdEaVdQcytzOWpTUkFuNWlubFRxSjBZR0FtZEhSekFNQmdncWhrak9QUVFECitBd1VBQTJnQU1HVUNNUUN1aUp3bVJXT2dmV2JxZFNsblhmaENicGhqZFdjNnNIZWxMa2tNMjF2eFEzUlpraEMyCitFUmg5MFJBMXJ4QitYVGdDTUhacllHM2xlUzBQRW96NWhVdml2MjdMYkJIQlU2R2VPenJTMmUwVkgwQk1TTlhOCitpUDlXbml0K21KdzU4bmlFR3c9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorICAgIDwvQ2VydGlmaWNhdGU+CisgICAgPENlcnRpZmljYXRlIGZvcm1hdD0icGVtIj4KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQldUQ0IzcUFEQWdFQ0FnVUEzcTIrN3pBTUJnZ3Foa2pPUFFRREF3VUFNQkl4RURBT0JnTlZCQU1NQjBkVAorVFVreExqQXdJaGdQTWpBeU5EQXhNREV3TURBd01EQmFHQTg1T1RrNU1USXpNVEl6TlRrMU9Wb3dFakVRTUE0RworQTFVRUF3d0hSMU5OU1RFdU1EQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQkZzTlBkc1BteDJOS05pVAorN29SZUYzNkhUWGpmdFJmR2ZmWWdQZi92RWhyVDdYTEo3ZFRoa2NiK09GWVdZbE9ja2RrM0RSZ3FUTldRWHNvdAorVXNaaHdSdmVVOGh1RWpPQk81K2R3RGlXUHMrczlqU1JBbjVpbmxUcUowWUdBbWRIUnpBTUJnZ3Foa2pPUFFRRAorQXdVQUEyZ0FNR1VDTVFDdWlKd21SV09nZldicWRTbG5YZmhDYnBoamRXYzZzSGVsTGtrTTIxdnhRM1Jaa2hDMgorRVJoOTBSQTFyeEIrWFRnQ01IWnJZRzNsZVMwUEVvejVoVXZpdjI3TGJCSEJVNkdlT3pyUzJlMFZIMEJNU05YTgoraVA5V25pdCttSnc1OG5pRUd3PT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKyAgICA8L0NlcnRpZmljYXRlPgorICAgIDxDZXJ0aWZpY2F0ZSBmb3JtYXQ9InBlbSI+CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUJXVENCM3FBREFnRUNBZ1VBM3EyKzd6QU1CZ2dxaGtqT1BRUURBd1VBTUJJeEVEQU9CZ05WQkFNTUIwZFQKK1RVa3hMakF3SWhnUE1qQXlOREF4TURFd01EQXdNREJhR0E4NU9UazVNVEl6TVRJek5UazFPVm93RWpFUU1BNEcKK0ExVUVBd3dIUjFOTlNURXVNREIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQUJGc05QZHNQbXgyTktOaVQKKzdvUmVGMzZIVFhqZnRSZkdmZllnUGYvdkVoclQ3WExKN2RUaGtjYitPRllXWWxPY2tkazNEUmdxVE5XUVhzb3QKK1VzWmh3UnZlVThodUVqT0JPNStkd0RpV1BzK3M5alNSQW41aW5sVHFKMFlHQW1kSFJ6QU1CZ2dxaGtqT1BRUUQKK0F3VUFBMmdBTUdVQ01RQ3VpSndtUldPZ2ZXYnFkU2xuWGZoQ2JwaGpkV2M2c0hlbExra00yMXZ4UTNSWmtoQzIKK0VSaDkwUkExcnhCK1hUZ0NNSFpyWUczbGVTMFBFb3o1aFV2aXYyN0xiQkhCVTZHZU96clMyZTBWSDBCTVNOWE4KK2lQOVduaXQrbUp3NThuaUVHdz09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisgICAgPC9DZXJ0aWZpY2F0ZT4KKyAgPC9DZXJ0aWZpY2F0ZUNoYWluPgorPC9QaXhlbFVkc0NlcnRpZmljYXRlcz4KZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltYXN0ZXIvc2V0X3Vkc19jZXJ0cy9zZXRfdWRzX2NlcnRpZmljYXRlcy5jcHAgYi90cnVzdHkva2V5bWFzdGVyL3NldF91ZHNfY2VydHMvc2V0X3Vkc19jZXJ0aWZpY2F0ZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMzU2YTkKLS0tIC9kZXYvbnVsbAorKysgYi90cnVzdHkva2V5bWFzdGVyL3NldF91ZHNfY2VydHMvc2V0X3Vkc19jZXJ0aWZpY2F0ZXMuY3BwCkBAIC0wLDAgKzEsMjc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8bGlieG1sL3htbHJlYWRlci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGVtLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3Vpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPHRydXN0eV9rZXltYXN0ZXIvaXBjL3RydXN0eV9rZXltYXN0ZXJfaXBjLmg+CisKK3N0YXRpYyBjb25zdCBjaGFyKiBfc29wdHMgPSAiaCI7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbiBfbG9wdHNbXSA9IHsKKyAgICAgICAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIDAsICdoJ30sCisgICAgICAgIHswLCAwLCAwLCAwfSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKiB1c2FnZSA9CisgICAgICAgICJVc2FnZTogJXMgW29wdGlvbnNdIHhtbC1maWxlXG4iCisgICAgICAgICJcbiIKKyAgICAgICAgIm9wdGlvbnM6XG4iCisgICAgICAgICIgIC1oLCAtLWhlbHAgICAgICAgICAgICBwcmludHMgdGhpcyBtZXNzYWdlIGFuZCBleGl0XG4iCisgICAgICAgICJcbiI7CisKK3N0YXRpYyB2b2lkIHByaW50X3VzYWdlX2FuZF9leGl0KGNvbnN0IGNoYXIqIHByb2csIGludCBjb2RlKSB7CisgICAgZnByaW50ZihzdGRlcnIsIHVzYWdlLCBwcm9nKTsKKyAgICBleGl0KGNvZGUpOworfQorCitzdGF0aWMgdm9pZCBwYXJzZV9vcHRpb25zKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIGludCBjOworICAgIGludCBvaWR4ID0gMDsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCBfc29wdHMsIF9sb3B0cywgJm9pZHgpOworICAgICAgICBpZiAoYyA9PSAtMSkgeworICAgICAgICAgICAgYnJlYWs7IC8qIGRvbmUgKi8KKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgY2FzZSAnaCc6CisgICAgICAgICAgICAgICAgcHJpbnRfdXNhZ2VfYW5kX2V4aXQoYXJndlswXSwgRVhJVF9TVUNDRVNTKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBwcmludF91c2FnZV9hbmRfZXhpdChhcmd2WzBdLCBFWElUX0ZBSUxVUkUpOworICAgICAgICB9CisgICAgfQorfQorCitzdHJ1Y3QgQXBwZW5kVWRzQ2VydGlmaWNhdGVSZXF1ZXN0IDogcHVibGljIGtleW1hc3Rlcjo6S2V5bWFzdGVyTWVzc2FnZSB7CisgICAgZXhwbGljaXQgQXBwZW5kVWRzQ2VydGlmaWNhdGVSZXF1ZXN0KGludDMyX3QgdmVyID0ga2V5bWFzdGVyOjprRGVmYXVsdE1lc3NhZ2VWZXJzaW9uKQorICAgICAgICA6IEtleW1hc3Rlck1lc3NhZ2UodmVyKSB7fQorCisgICAgc2l6ZV90IFNlcmlhbGl6ZWRTaXplKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gY2VydF9kYXRhLlNlcmlhbGl6ZWRTaXplKCk7IH0KKyAgICB1aW50OF90KiBTZXJpYWxpemUodWludDhfdCogYnVmLCBjb25zdCB1aW50OF90KiBlbmQpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIGNlcnRfZGF0YS5TZXJpYWxpemUoYnVmLCBlbmQpOworICAgIH0KKyAgICBib29sIERlc2VyaWFsaXplKGNvbnN0IHVpbnQ4X3QqKiBidWZfcHRyLCBjb25zdCB1aW50OF90KiBlbmQpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIGNlcnRfZGF0YS5EZXNlcmlhbGl6ZShidWZfcHRyLCBlbmQpOworICAgIH0KKworICAgIGtleW1hc3Rlcjo6QnVmZmVyIGNlcnRfZGF0YTsKK307CisKK3N0cnVjdCBDbGVhclVkc0NlcnRpZmljYXRlUmVxdWVzdCA6IHB1YmxpYyBrZXltYXN0ZXI6OktleW1hc3Rlck1lc3NhZ2UgeworICAgIGV4cGxpY2l0IENsZWFyVWRzQ2VydGlmaWNhdGVSZXF1ZXN0KGludDMyX3QgdmVyID0ga2V5bWFzdGVyOjprRGVmYXVsdE1lc3NhZ2VWZXJzaW9uKQorICAgICAgICA6IEtleW1hc3Rlck1lc3NhZ2UodmVyKSB7fQorCisgICAgc2l6ZV90IFNlcmlhbGl6ZWRTaXplKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfQorICAgIHVpbnQ4X3QqIFNlcmlhbGl6ZSh1aW50OF90KiBidWYsIGNvbnN0IHVpbnQ4X3QqKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBidWY7IH0KKyAgICBib29sIERlc2VyaWFsaXplKGNvbnN0IHVpbnQ4X3QqKiwgY29uc3QgdWludDhfdCopIG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH07Cit9OworCitzdHJ1Y3QgS2V5bWFzdGVyTm9SZXNwb25zZSA6IHB1YmxpYyBrZXltYXN0ZXI6OktleW1hc3RlclJlc3BvbnNleworICAgIGV4cGxpY2l0IEtleW1hc3Rlck5vUmVzcG9uc2UoaW50MzJfdCB2ZXIgPSBrZXltYXN0ZXI6OmtEZWZhdWx0TWVzc2FnZVZlcnNpb24pCisgICAgICAgIDoga2V5bWFzdGVyOjpLZXltYXN0ZXJSZXNwb25zZSh2ZXIpIHt9CisKKyAgICBzaXplX3QgTm9uRXJyb3JTZXJpYWxpemVkU2l6ZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIDA7IH0KKyAgICB1aW50OF90KiBOb25FcnJvclNlcmlhbGl6ZSh1aW50OF90KiBidWYsIGNvbnN0IHVpbnQ4X3QqKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBidWY7IH0KKyAgICBib29sIE5vbkVycm9yRGVzZXJpYWxpemUoY29uc3QgdWludDhfdCoqLCBjb25zdCB1aW50OF90Kikgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorfTsKKworc3RydWN0IEFwcGVuZFVkc0NlcnRpZmljYXRlUmVzcG9uc2UgOiBwdWJsaWMgS2V5bWFzdGVyTm9SZXNwb25zZSB7fTsKK3N0cnVjdCBDbGVhclVkc0NlcnRpZmljYXRlUmVzcG9uc2UgOiBwdWJsaWMgS2V5bWFzdGVyTm9SZXNwb25zZSB7fTsKKworc3RhdGljIGludCBzZXRfdWRzX2NlcnRfYmluKHVpbnQzMl90IGNtZCwgY29uc3Qgdm9pZCogY2VydF9kYXRhLCBzaXplX3QgY2VydF9kYXRhX3NpemUpIHsKKyAgICBpbnQgcmV0OworCisgICAgQXBwZW5kVWRzQ2VydGlmaWNhdGVSZXF1ZXN0IHJlcTsKKyAgICByZXEuY2VydF9kYXRhLlJlaW5pdGlhbGl6ZShjZXJ0X2RhdGEsIGNlcnRfZGF0YV9zaXplKTsKKyAgICBBcHBlbmRVZHNDZXJ0aWZpY2F0ZVJlc3BvbnNlIHJzcDsKKworICAgIHJldCA9IHRydXN0eV9rZXltYXN0ZXJfc2VuZChjbWQsIHJlcSwgJnJzcCk7CisgICAgaWYgKHJldCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInRydXN0eV9rZXltYXN0ZXJfc2VuZCBjbWQgMHgleCBmYWlsZWQgJWRcbiIsIGNtZCwgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfdWRzX2NlcnRfcGVtKHVpbnQzMl90IGNtZCwgY29uc3QgeG1sQ2hhciogcGVta2V5KSB7CisgICAgaW50IHJldDsKKyAgICBpbnQgc3NscmV0OworCisgICAgLyogQ29udmVydCBmcm9tIHBlbSB0byBiaW5hcnkgKi8KKyAgICBCSU8qIGJpbyA9IEJJT19uZXdfbWVtX2J1ZihwZW1rZXksIHhtbFN0cmxlbihwZW1rZXkpKTsKKyAgICBpZiAoIWJpbykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkJJT19uZXdfbWVtX2J1ZiBmYWlsZWRcbiIpOworICAgICAgICBFUlJfcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBjaGFyKiBrZXlfbmFtZTsKKyAgICBjaGFyKiBrZXlfaGVhZGVyOworICAgIHVpbnQ4X3QqIGtleTsKKyAgICBsb25nIGtleWxlbjsKKyAgICBzc2xyZXQgPSBQRU1fcmVhZF9iaW8oYmlvLCAma2V5X25hbWUsICZrZXlfaGVhZGVyLCAma2V5LCAma2V5bGVuKTsKKyAgICBCSU9fZnJlZShiaW8pOworCisgICAgaWYgKCFzc2xyZXQpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJQRU1fcmVhZF9iaW8gZmFpbGVkXG4iKTsKKyAgICAgICAgRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogU2VuZCBrZXkgaW4gYmluYXJ5IGZvcm1hdCB0byB0cnVzdHkgKi8KKyAgICByZXQgPSBzZXRfdWRzX2NlcnRfYmluKGNtZCwga2V5LCBrZXlsZW4pOworCisgICAgT1BFTlNTTF9mcmVlKGtleV9uYW1lKTsKKyAgICBPUEVOU1NMX2ZyZWUoa2V5X2hlYWRlcik7CisgICAgT1BFTlNTTF9mcmVlKGtleSk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNldF91ZHNfY2VydCh1aW50MzJfdCBjbWQsIGNvbnN0IHhtbENoYXIqIGZvcm1hdCwgY29uc3QgeG1sQ2hhciogc3RyKSB7CisgICAgaW50IHJldDsKKworICAgIGlmICh4bWxTdHJFcXVhbChmb3JtYXQsIEJBRF9DQVNUICJwZW0iKSkgeworICAgICAgICByZXQgPSBzZXRfdWRzX2NlcnRfcGVtKGNtZCwgc3RyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoInVuc3VwcG9ydGVkIGtleS9jZXJ0IGZvcm1hdDogJXNcbiIsIGZvcm1hdCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworLy8gVE9ETzogR3VhcmQgYnkgUHJvZHVjdGlvbiBNb2RlCitzdGF0aWMgaW50IGNsZWFyX2NlcnRfY2hhaW4oKSB7CisgICAgaW50IHJldDsKKyAgICBDbGVhclVkc0NlcnRpZmljYXRlUmVxdWVzdCByZXE7CisgICAgQ2xlYXJVZHNDZXJ0aWZpY2F0ZVJlc3BvbnNlIHJzcDsKKworICAgIHJldCA9IHRydXN0eV9rZXltYXN0ZXJfc2VuZChLTV9DTEVBUl9VRFNfQ0VSVF9DSEFJTiwgcmVxLCAmcnNwKTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHRydXN0eV9rZXltYXN0ZXJfc2VuZCBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3htbCh4bWxUZXh0UmVhZGVyUHRyIHhtbCkgeworICAgIGludCByZXQ7CisgICAgY29uc3QgeG1sQ2hhciogZWxlbWVudCA9IE5VTEw7CisgICAgY29uc3QgeG1sQ2hhciogZWxlbWVudF9mb3JtYXQgPSBOVUxMOworICAgIGJvb2wgaXNQaXhlbFVkc0NlcnQgPSBmYWxzZTsKKworICAgIHdoaWxlICgocmV0ID0geG1sVGV4dFJlYWRlclJlYWQoeG1sKSkgPT0gMSkgeworICAgICAgICBpbnQgbm9kZXR5cGUgPSB4bWxUZXh0UmVhZGVyTm9kZVR5cGUoeG1sKTsKKyAgICAgICAgY29uc3QgeG1sQ2hhciAqbmFtZSwgKnZhbHVlOworICAgICAgICBuYW1lID0geG1sVGV4dFJlYWRlckNvbnN0TmFtZSh4bWwpOworICAgICAgICBzd2l0Y2ggKG5vZGV0eXBlKSB7CisgICAgICAgICAgICBjYXNlIFhNTF9SRUFERVJfVFlQRV9FTEVNRU5UOgorICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBuYW1lOworICAgICAgICAgICAgICAgIGVsZW1lbnRfZm9ybWF0ID0geG1sVGV4dFJlYWRlckdldEF0dHJpYnV0ZSh4bWwsIEJBRF9DQVNUICJmb3JtYXQiKTsKKyAgICAgICAgICAgICAgICBpZiAoaXNQaXhlbFVkc0NlcnQgfHwgeG1sU3RyRXF1YWwobmFtZSwgQkFEX0NBU1QgIlBpeGVsVWRzQ2VydGlmaWNhdGVzIikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGZpcnN0IGVsZW1lbnQgbmFtZSBtdXN0IGJlICJQaXhlbFVkc0NlcnRpZmljYXRlcyIKKyAgICAgICAgICAgICAgICAgICAgaXNQaXhlbFVkc0NlcnQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTm90IGEgUGl4ZWxVZHNDZXJ0aWZpY2F0ZXM6IFwiJXNcIlxuIiwgbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHhtbFN0ckVxdWFsKG5hbWUsIEJBRF9DQVNUICJDZXJ0aWZpY2F0ZUNoYWluIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gY2xlYXJfY2VydF9jaGFpbigpOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBDbGVhciBjZXJ0IGNoYWluIGNtZCBmYWlsZWQsICVkXG4iLCBlbGVtZW50LCByZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzOiBDbGVhciBjZXJ0IGNoYWluIGNtZCBkb25lXG4iLCBlbGVtZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFhNTF9SRUFERVJfVFlQRV9URVhUOgorICAgICAgICAgICAgICAgIHZhbHVlID0geG1sVGV4dFJlYWRlckNvbnN0VmFsdWUoeG1sKTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWQ7CisgICAgICAgICAgICAgICAgaWYgKHhtbFN0ckVxdWFsKGVsZW1lbnQsIEJBRF9DQVNUICJDZXJ0aWZpY2F0ZSIpKSB7CisgICAgICAgICAgICAgICAgICAgIGNtZCA9IEtNX0FQUEVORF9VRFNfQ0VSVF9DSEFJTjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXQgPSBzZXRfdWRzX2NlcnQoY21kLCBlbGVtZW50X2Zvcm1hdCwgdmFsdWUpOworICAgICAgICAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcywgZm9ybWF0ICVzOiBDbWQgMHgleCBmYWlsZWQsICVkXG4iLCBlbGVtZW50LCBlbGVtZW50X2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQsIHJldCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByaW50ZigiJXMsIGZvcm1hdCAlczogQ21kIDB4JXggZG9uZVxuIiwgZWxlbWVudCwgZWxlbWVudF9mb3JtYXQsIGNtZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFhNTF9SRUFERVJfVFlQRV9FTkRfRUxFTUVOVDoKKyAgICAgICAgICAgICAgICBlbGVtZW50ID0gTlVMTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBhcnNlX2FuZF9wcm92aXNpb25feG1sX2ZpbGUoY29uc3QgY2hhciogZmlsZW5hbWUpIHsKKyAgICBpbnQgcmV0OworICAgIHhtbFRleHRSZWFkZXJQdHIgeG1sID0geG1sUmVhZGVyRm9yRmlsZShmaWxlbmFtZSwgTlVMTCwgMCk7CisgICAgaWYgKCF4bWwpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gb3BlbiAlc1xuIiwgZmlsZW5hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0ID0gcHJvY2Vzc194bWwoeG1sKTsKKworICAgIHhtbEZyZWVUZXh0UmVhZGVyKHhtbCk7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHBhcnNlIG9yIHByb2Nlc3MgJXNcbiIsIGZpbGVuYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIHBhcnNlX29wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKG9wdGluZCArIDEgIT0gYXJnYykgeworICAgICAgICBwcmludF91c2FnZV9hbmRfZXhpdChhcmd2WzBdLCBFWElUX0ZBSUxVUkUpOworICAgIH0KKworICAgIHJldCA9IHRydXN0eV9rZXltYXN0ZXJfY29ubmVjdCgpOworICAgIGlmIChyZXQpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ0cnVzdHlfa2V5bWFzdGVyX2Nvbm5lY3QgZmFpbGVkICVkXG4iLCByZXQpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKworICAgIHJldCA9IHBhcnNlX2FuZF9wcm92aXNpb25feG1sX2ZpbGUoYXJndltvcHRpbmRdKTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAicGFyc2VfYW5kX3Byb3Zpc2lvbl94bWxfZmlsZSBmYWlsZWQgJWRcbiIsIHJldCk7CisgICAgICAgIHRydXN0eV9rZXltYXN0ZXJfZGlzY29ubmVjdCgpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKworICAgIHJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS90cnVzdHkva2V5bWludC9BbmRyb2lkLmJwIGIvdHJ1c3R5L2tleW1pbnQvQW5kcm9pZC5icAppbmRleCBjMTllYmJkLi4zNmVmYjFiIDEwMDY0NAotLS0gYS90cnVzdHkva2V5bWludC9BbmRyb2lkLmJwCisrKyBiL3RydXN0eS9rZXltaW50L0FuZHJvaWQuYnAKQEAgLTE3LDI1ICsxNyw0NCBAQAogICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJBbmRyb2lkLUFwYWNoZS0yLjAiXSwKIH0KIAotcnVzdF9iaW5hcnkgewotICAgIG5hbWU6ICJhbmRyb2lkLmhhcmR3YXJlLnNlY3VyaXR5LmtleW1pbnQtc2VydmljZS5ydXN0LnRydXN0eSIsCitydXN0X2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiYW5kcm9pZC5oYXJkd2FyZS5zZWN1cml0eS5rZXltaW50LXNlcnZpY2UucnVzdC50cnVzdHkuZGVmYXVsdCIsCiAgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiaHciLAotICAgIHZlbmRvcjogdHJ1ZSwKLSAgICBpbml0X3JjOiBbImFuZHJvaWQuaGFyZHdhcmUuc2VjdXJpdHkua2V5bWludC1zZXJ2aWNlLnJ1c3QudHJ1c3R5LnJjIl0sCi0gICAgdmludGZfZnJhZ21lbnRzOiBbImFuZHJvaWQuaGFyZHdhcmUuc2VjdXJpdHkua2V5bWludC1zZXJ2aWNlLnJ1c3QudHJ1c3R5LnhtbCJdLAogICAgIHNyY3M6IFsKLSAgICAgICAgInNyYy9rZXltaW50X2hhbF9tYWluLnJzIgorICAgICAgICAic3JjL2tleW1pbnRfaGFsX21haW4ucnMiLAogICAgIF0sCiAgICAgcnVzdGxpYnM6IFsKICAgICAgICAgImxpYmFuZHJvaWRfbG9nZ2VyIiwKICAgICAgICAgImxpYmJpbmRlcl9ycyIsCisgICAgICAgICJsaWJjbGFwIiwKICAgICAgICAgImxpYmttcl93aXJlIiwKICAgICAgICAgImxpYmttcl9oYWwiLAogICAgICAgICAibGlidHJ1c3R5LXJzIiwKICAgICAgICAgImxpYmxpYmMiLAogICAgICAgICAibGlibG9nX3J1c3QiLAogICAgIF0sCi0gICAgcmVxdWlyZWQ6IFsKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuaGFyZHdhcmVfa2V5c3RvcmUueG1sIiwKKyAgICBwcmVmZXJfcmxpYjogdHJ1ZSwKK30KKworcnVzdF9iaW5hcnkgeworICAgIG5hbWU6ICJhbmRyb2lkLmhhcmR3YXJlLnNlY3VyaXR5LmtleW1pbnQtc2VydmljZS5ydXN0LnRydXN0eSIsCisgICAgdmVuZG9yOiB0cnVlLAorICAgIGRlZmF1bHRzOiBbImFuZHJvaWQuaGFyZHdhcmUuc2VjdXJpdHkua2V5bWludC1zZXJ2aWNlLnJ1c3QudHJ1c3R5LmRlZmF1bHQiXSwKKyAgICBpbml0X3JjOiBbImFuZHJvaWQuaGFyZHdhcmUuc2VjdXJpdHkua2V5bWludC1zZXJ2aWNlLnJ1c3QudHJ1c3R5LnJjIl0sCisgICAgdmludGZfZnJhZ21lbnRzOiBbImFuZHJvaWQuaGFyZHdhcmUuc2VjdXJpdHkua2V5bWludC1zZXJ2aWNlLnJ1c3QudHJ1c3R5LnhtbCJdLAorICAgIHJlcXVpcmVkOiBzZWxlY3QocmVsZWFzZV9mbGFnKCJSRUxFQVNFX0FJRExfVVNFX1VORlJPWkVOIiksIHsKKyAgICAgICAgdHJ1ZTogWyJhbmRyb2lkLmhhcmR3YXJlLmhhcmR3YXJlX2tleXN0b3JlLnhtbCJdLAorICAgICAgICBkZWZhdWx0OiBbImFuZHJvaWQuaGFyZHdhcmUuaGFyZHdhcmVfa2V5c3RvcmVfVjMueG1sIl0sCisgICAgfSksCit9CisKK3J1c3RfYmluYXJ5IHsKKyAgICBuYW1lOiAiYW5kcm9pZC5oYXJkd2FyZS5zZWN1cml0eS5rZXltaW50LXNlcnZpY2UucnVzdC50cnVzdHkuc3lzdGVtLm5vbnNlY3VyZSIsCisgICAgc3lzdGVtX2V4dF9zcGVjaWZpYzogdHJ1ZSwKKyAgICBkZWZhdWx0czogWyJhbmRyb2lkLmhhcmR3YXJlLnNlY3VyaXR5LmtleW1pbnQtc2VydmljZS5ydXN0LnRydXN0eS5kZWZhdWx0Il0sCisgICAgaW5pdF9yYzogWyJhbmRyb2lkLmhhcmR3YXJlLnNlY3VyaXR5LmtleW1pbnQtc2VydmljZS5ydXN0LnRydXN0eS5zeXN0ZW0ubm9uc2VjdXJlLnJjIl0sCisgICAgZmVhdHVyZXM6IFsibm9uc2VjdXJlIl0sCisgICAgcnVzdGxpYnM6IFsKKyAgICAgICAgImxpYmttcl9oYWxfbm9uc2VjdXJlIiwKICAgICBdLAogfQpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvYW5kcm9pZC5oYXJkd2FyZS5zZWN1cml0eS5rZXltaW50LXNlcnZpY2UucnVzdC50cnVzdHkucmMgYi90cnVzdHkva2V5bWludC9hbmRyb2lkLmhhcmR3YXJlLnNlY3VyaXR5LmtleW1pbnQtc2VydmljZS5ydXN0LnRydXN0eS5yYwppbmRleCBlM2Q5NGM2Li4zZTNmMmE1IDEwMDY0NAotLS0gYS90cnVzdHkva2V5bWludC9hbmRyb2lkLmhhcmR3YXJlLnNlY3VyaXR5LmtleW1pbnQtc2VydmljZS5ydXN0LnRydXN0eS5yYworKysgYi90cnVzdHkva2V5bWludC9hbmRyb2lkLmhhcmR3YXJlLnNlY3VyaXR5LmtleW1pbnQtc2VydmljZS5ydXN0LnRydXN0eS5yYwpAQCAtMSw3ICsxLDggQEAKLXNlcnZpY2UgdmVuZG9yLmtleW1pbnQucnVzdC10cnVzdHkgL3ZlbmRvci9iaW4vaHcvYW5kcm9pZC5oYXJkd2FyZS5zZWN1cml0eS5rZXltaW50LXNlcnZpY2UucnVzdC50cnVzdHkKK3NlcnZpY2UgdmVuZG9yLmtleW1pbnQucnVzdC10cnVzdHkgL3ZlbmRvci9iaW4vaHcvYW5kcm9pZC5oYXJkd2FyZS5zZWN1cml0eS5rZXltaW50LXNlcnZpY2UucnVzdC50cnVzdHkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1kZXYgJHtyby5oYXJkd2FyZS50cnVzdHlfaXBjX2Rldi5rZXltaW50Oi0vZGV2L3RydXN0eS1pcGMtZGV2MH0KICAgICBjbGFzcyBlYXJseV9oYWwKICAgICB1c2VyIG5vYm9keQogICAgIGdyb3VwIGRybXJwYwogICAgICMgVGhlIGtleW1pbnQgc2VydmljZSBpcyBub3QgYWxsb3dlZCB0byByZXN0YXJ0LgogICAgICMgSWYgaXQgY3Jhc2hlcywgYSBkZXZpY2UgcmVzdGFydCBpcyByZXF1aXJlZC4KLSAgICBvbmVzaG90ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgIG9uZXNob3QKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2FuZHJvaWQuaGFyZHdhcmUuc2VjdXJpdHkua2V5bWludC1zZXJ2aWNlLnJ1c3QudHJ1c3R5LnN5c3RlbS5ub25zZWN1cmUucmMgYi90cnVzdHkva2V5bWludC9hbmRyb2lkLmhhcmR3YXJlLnNlY3VyaXR5LmtleW1pbnQtc2VydmljZS5ydXN0LnRydXN0eS5zeXN0ZW0ubm9uc2VjdXJlLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMGUxMGEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVzdHkva2V5bWludC9hbmRyb2lkLmhhcmR3YXJlLnNlY3VyaXR5LmtleW1pbnQtc2VydmljZS5ydXN0LnRydXN0eS5zeXN0ZW0ubm9uc2VjdXJlLnJjCkBAIC0wLDAgKzEsMTcgQEAKK3NlcnZpY2Ugc3lzdGVtLmtleW1pbnQucnVzdC10cnVzdHkubm9uc2VjdXJlIFwKKyAgL3N5c3RlbV9leHQvYmluL2h3L2FuZHJvaWQuaGFyZHdhcmUuc2VjdXJpdHkua2V5bWludC1zZXJ2aWNlLnJ1c3QudHJ1c3R5LnN5c3RlbS5ub25zZWN1cmUgXAorICAtLWRldiAke3N5c3RlbS5rZXltaW50LnRydXN0eV9pcGNfZGV2Oi0vZGV2L3RydXN0eS1pcGMtZGV2MH0KKyAgICBkaXNhYmxlZAorICAgIHVzZXIgbm9ib2R5CisgICAgZ3JvdXAgZHJtcnBjCisgICAgIyBUaGUga2V5bWludCBzZXJ2aWNlIGlzIG5vdCBhbGxvd2VkIHRvIHJlc3RhcnQuCisgICAgIyBJZiBpdCBjcmFzaGVzLCBhIGRldmljZSByZXN0YXJ0IGlzIHJlcXVpcmVkLgorICAgIG9uZXNob3QKKworIyBPbmx5IHN0YXJ0cyB0aGUgbm9uLXNlY3VyZSBLZXlNaW50IEhBTHMgd2hlbiB0aGUgS2V5TWludCBWTSBmZWF0dXJlIGlzIGVuYWJsZWQKKyMgVE9ETyhiLzM1NzgyMTY5MCk6IFN0YXJ0IHRoZSBLZXlNaW50IEhBTHMgd2hlbiB0aGUgS2V5TWludCBWTSBpcyByZWFkeSBvbmNlIHRoZSBUcnVzdHkgVk0KKyMgaGFzIGEgbWVjaGFuaXNtIHRvIG5vdGlmeSB0aGUgaG9zdC4KK29uIGxhdGUtZnMgJiYgcHJvcGVydHk6cm8uaGFyZHdhcmUudHJ1c3R5LnNlY3VyaXR5X3ZtLmtleW1pbnQuZW5hYmxlZD0xICYmIFwKKyAgIHByb3BlcnR5OnRydXN0eS5zZWN1cml0eV92bS52bV9jaWQ9KgorICAgIHNldHByb3Agc3lzdGVtLmtleW1pbnQudHJ1c3R5X2lwY19kZXYgVlNPQ0s6JHt0cnVzdHkuc2VjdXJpdHlfdm0udm1fY2lkfToxCisgICAgc3RhcnQgc3lzdGVtLmtleW1pbnQucnVzdC10cnVzdHkubm9uc2VjdXJlCmRpZmYgLS1naXQgYS90cnVzdHkva2V5bWludC9mdXp6L0FuZHJvaWQuYnAgYi90cnVzdHkva2V5bWludC9mdXp6L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU3M2RiNwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovQW5kcm9pZC5icApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJBbmRyb2lkLUFwYWNoZS0yLjAiXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogInRydXN0eV9rZXltaW50X2Z1enplciIsCisgICAgZGVmYXVsdHM6IFsidHJ1c3R5X2Z1enplcl9kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsiOnRydXN0eV90aXBjX2Z1enplciJdLAorICAgIGNmbGFnczogWworICAgICAgICAiLURUUlVTVFlfQVBQX1BPUlQ9XCJjb20uYW5kcm9pZC50cnVzdHkua2V5bWludFwiIiwKKyAgICAgICAgIi1EVFJVU1RZX0FQUF9VVUlEPVwiNWY5MDJhY2UtNWU1Yy00Y2Q4LWFlNTQtODdiODhjMjJkZGFmXCIiLAorICAgICAgICAiLURUUlVTVFlfQVBQX0ZJTEVOQU1FPVwia2V5bWludF9hcHAuc3ltcy5lbGZcIiIsCisgICAgXSwKKyAgICBmdXp6X2NvbmZpZzogeworICAgICAgIGNjOiBbImRyeXNkYWxlQGdvb2dsZS5jb20iXSwKKyAgICAgICBjb21wb25lbnRpZDogMTA4NDczMywKKyAgICAgICBob3RsaXN0czogWyI0MjcxNjk2Il0sCisgICAgfSwKKworICAgIC8vIFRoZSBpbml0aWFsIGNvcnB1cyBmb3IgdGhpcyBmdXp6ZXIgd2FzIGRlcml2ZWQgYnkgZHVtcGluZyBtZXNzYWdlcyBmcm9tCisgICAgLy8gdGhlIEhBTCBzZXJ2aWNlIHdoaWxlIHJ1bm5pbmcgdGhlIFZUUyB0ZXN0cyBmb3IgS2V5TWludC4KKyAgICBjb3JwdXM6IFsiY29ycHVzLyoiXSwKK30KZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjExODAtMCBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjExODAtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGZjZTI1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTE4MC0wCkBAIC0wLDAgKzEgQEAKK4IRgApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEyODE0MC0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTI4MTQwLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA2ZjY0MAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEyODE0MC0wCkBAIC0wLDAgKzEgQEAKK4ISgUAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMjgxNDMtMCBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjEyODE0My0wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MjllYWEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMjgxNDMtMApAQCAtMCwwICsxIEBACiuCEoFDZm9vClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTI4MTU4LTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMjgxNTgtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWEzMmFiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTI4MTU4LTAKQEAgLTAsMCArMSBAQAorghKBWEATVMRkw4Kamb2boyVysw/1qxnjMTqP4R3pepy58DcD6ljY/yTpE9P79XZg9DSHqMLdcmOdq9hKIVJxr7szP1pEClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTI4MTU4LTEgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMjgxNTgtMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTM3NTM0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTI4MTU4LTEKQEAgLTAsMCArMSwyIEBACiuCEoFYQJZ2ikUQKVm8MGqbSeqEuzogijxxKvfW47qnCisj73346pM0QxJUJGTxrAP0IoKjWRNPg8cfqBVT1vKtOwllULQeClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg1LTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyODUtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDkwZjIyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg1LTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg1LTEgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyODUtMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTk1YTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg1LTEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg1LTIgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyODUtMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmU2MWE0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg1LTIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg1LTMgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyODUtMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTI3NjczCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg1LTMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg2LTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyODYtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWI2YTliCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg2LTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg2LTEgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyODYtMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmFjMjczCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg2LTEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg2LTIgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyODYtMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjBkNDA1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg2LTIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg2LTMgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyODYtMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWYwMjBhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg2LTMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg3LTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyODctMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDM2NTgwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg3LTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg3LTEgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyODctMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGVhZDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg3LTEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg3LTIgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyODctMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzc1NDc4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg3LTIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg3LTMgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyODctMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjIyNGVlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg3LTMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg4LTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyODgtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDMyODVhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg4LTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg4LTEgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyODgtMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2EwYTViCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg4LTEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg4LTIgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyODgtMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzViYTE3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg4LTIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg4LTMgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyODgtMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mjc4NTRlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg4LTMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg5LTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyODktMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjhiNTljCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg5LTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg5LTEgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyODktMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjBkY2RiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg5LTEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg5LTIgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyODktMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjNjNjE5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg5LTIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg5LTMgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyODktMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTUxZTAxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4Mjg5LTMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhhLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyOGEtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTczY2EzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhhLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhhLTEgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyOGEtMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjVjZTIzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhhLTEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhhLTIgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyOGEtMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWU1YjA2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhhLTIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhhLTMgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyOGEtMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjU4MThjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhhLTMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhiLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyOGItMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjFkZTlkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhiLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhiLTEgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyOGItMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTM5NGMyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhiLTEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhiLTIgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyOGItMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzA3YzlmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhiLTIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhiLTMgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyOGItMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzA5NGIzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhiLTMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhjLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyOGMtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmRhODAwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhjLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhjLTEgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyOGMtMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmVkY2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhjLTEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhjLTIgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyOGMtMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWY4ZmFmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhjLTIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhjLTMgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyOGMtMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGYzNjBjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhjLTMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhkLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyOGQtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjM4OGIzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhkLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhkLTEgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyOGQtMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjM4ZDRhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhkLTEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhkLTIgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyOGQtMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTk4YWMzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhkLTIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhkLTMgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyOGQtMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGJkYzNlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhkLTMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhlLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyOGUtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGNmYTI0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhlLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhlLTEgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyOGUtMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmUzYmIzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhlLTEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhlLTIgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyOGUtMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2Y3ZDFjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhlLTIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhlLTMgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyOGUtMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDY3NDRmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhlLTMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhmLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyOGYtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTg1MTVmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhmLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhmLTEgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyOGYtMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDFkMTkyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhmLTEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhmLTIgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyOGYtMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODJkOWExCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhmLTIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhmLTMgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyOGYtMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzI0NmY4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjhmLTMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjkwLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyOTAtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODY1Y2E3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjkwLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjkwLTEgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyOTAtMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjM2OWY3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjkwLTEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjkyLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxMzgyOTItMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmNmZmJmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTM4MjkyLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg1LTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNDg0ODUtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzQxYmRmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg1LTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg1LTEgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNDg0ODUtMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGY3NGNkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg1LTEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg1LTIgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNDg0ODUtMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWQ0ODg4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg1LTIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg1LTMgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNDg0ODUtMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTMzZTFjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg1LTMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg2LTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNDg0ODYtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGMyMTA2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg2LTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg2LTEgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNDg0ODYtMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDRjNjNhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg2LTEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg2LTIgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNDg0ODYtMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzljNDc3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg2LTIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg2LTMgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNDg0ODYtMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTdhMzIyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg2LTMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg3LTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNDg0ODctMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDRlZDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg3LTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg3LTEgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNDg0ODctMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTVkOTBkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg3LTEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg3LTIgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNDg0ODctMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTY2NjY0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg3LTIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg3LTMgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNDg0ODctMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDZhMmRmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg3LTMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg4LTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNDg0ODgtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmRlMDRlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg4LTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg4LTEgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNDg0ODgtMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGVjOWZlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg4LTEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg4LTIgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNDg0ODgtMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDBhYTMyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg4LTIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg4LTMgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNDg0ODgtMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzQxNGU0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg4LTMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg5LTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNDg0ODktMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2U0OGE1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg5LTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg5LTEgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNDg0ODktMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjNiYTc4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg5LTEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg5LTIgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNDg0ODktMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTFhNzU2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg5LTIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg5LTMgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNDg0ODktMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmRhOTlhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDg5LTMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDhhLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNDg0OGEtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDhjMThmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDhhLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDhhLTEgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNDg0OGEtMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODgxMzJhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDhhLTEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDhhLTIgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNDg0OGEtMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjczNWY0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDhhLTIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDhhLTMgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNDg0OGEtMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzE0OGExCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDhhLTMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDhiLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNDg0OGItMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDNhN2ZjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTQ4NDhiLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTU4NjU5LTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNTg2NTktMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Njg5OGE3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTU4NjU5LTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTU4NjU5LTEgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNTg2NTktMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzJiOTg5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTU4NjU5LTEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTU4NjU5LTIgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNTg2NTktMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjJhNmRkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTU4NjU5LTIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTU4NjU5LTMgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNTg2NTktMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGJiMTEzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTU4NjU5LTMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTY4MjU4LTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNjgyNTgtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjhlMjgxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTY4MjU4LTAKQEAgLTAsMCArMSBAQAorghaCWDRqdXN0IHNvbWUgZ2FyYmFnZSBkYXRhIHdoaWNoIGlzIG5vdCBhIHZhbGlkIGtleSBibG9igoI6b//9pkhjbGllbnRpZII6b//9Q0dhcHBkYXRhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTY4MjU4LTEgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNjgyNTgtMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yjk0MjIwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTY4MjU4LTEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTc4MTU4LTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNzgxNTgtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzQxYmZkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTc4MTU4LTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTc4MTU4LTEgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNzgxNTgtMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTMwNWQyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTc4MTU4LTEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTc4MTU4LTIgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNzgxNTgtMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDljYzg0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTc4MTU4LTIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTc4MTU4LTMgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNzgxNTgtMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2QwN2NiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTc4MTU4LTMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTc4MTU5LTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNzgxNTktMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDdkMjdhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTc4MTU5LTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTc4MTU5LTEgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNzgxNTktMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTUxNWNjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTc4MTU5LTEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTc4MTU5LTIgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNzgxNTktMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWY1NzdjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTc4MTU5LTIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTc4MTU5LTMgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxNzgxNTktMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTNiMjRjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTc4MTU5LTMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgxYTg0LTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODFhODQtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjkwNDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgxYTg0LTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgxYTg0LTEgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODFhODQtMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjIzM2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgxYTg0LTEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgxYTg0LTIgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODFhODQtMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzljOTUzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgxYTg0LTIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgxYTg0LTMgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODFhODQtMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzhiMmJlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgxYTg0LTMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgxZTgzLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODFlODMtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjgxMjM3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgxZTgzLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgxZTgzLTEgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODFlODMtMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmFkMzU3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgxZTgzLTEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgxZTgzLTIgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODFlODMtMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTY3Y2FkCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgxZTgzLTIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgxZTgzLTMgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODFlODMtMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDU1MzdiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgxZTgzLTMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgzMTg0LTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODMxODQtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDRmN2E4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgzMTg0LTAKQEAgLTAsMCArMSBAQAorghgxhBs/jxRU9tbJREZmb29iYXKAgApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzE4NC0xIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgzMTg0LTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM5YTMxYgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzE4NC0xCkBAIC0wLDAgKzEgQEAKK4IYMYQ7T2nswchexidGZm9vYmFygIAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODMxODQtMiBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzE4NC0yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NTg2ZjAKLS0tIC9kZXYvbnVsbAorKysgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODMxODQtMgpAQCAtMCwwICsxIEBACiuCGDGEG1mX6c2RLqAgRmZvb2JhcoCAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgzMTg0LTMgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODMxODQtMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmZiMTJhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgzMTg0LTMKQEAgLTAsMCArMSBAQAorghgxhBsa+mJ4QZtOYEZmb29iYXKAgApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzI4NC0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgzMjg0LTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY4MTllOAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzI4NC0wCkBAIC0wLDAgKzEgQEAKK4IYMoQ7Ksb1lija0PdZBvhhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYYCAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgzMjg0LTEgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODMyODQtMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDVhMDU2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgzMjg0LTEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgzMjg0LTIgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODMyODQtMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDliMjRiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgzMjg0LTIKQEAgLTAsMCArMSBAQAorghgyhBtf28hLHTVdclkG92FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWGAgApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzI4NC0zIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgzMjg0LTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVkNzEzZAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzI4NC0zCkBAIC0wLDAgKzEsMiBAQAorghgyhDsKK5lFPaSulP5ZBvlhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWGAgApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzM4Ni0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgzMzg2LTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk2Mzc0ZgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzM4Ni0wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzM4Ni0xIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgzMzg2LTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA3NTE1ZQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzM4Ni0xCkBAIC0wLDAgKzEgQEAKK4IYM4YbGsE22C5bEouBTEhlbGxvIFdvcmxkIYFAgICAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgzMzg2LTIgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODMzODYtMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjcwMTI2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgzMzg2LTIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgzMzg2LTMgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODMzODYtMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWM4NzAwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgzMzg2LTMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgzNDgxLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODM0ODEtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjQ5MTNmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgzNDgxLTAKQEAgLTAsMCArMSBAQAorghg0gTt6wasIypaU8QpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzQ4MS0xIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTgzNDgxLTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE4OTUwMQotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzQ4MS0xCkBAIC0wLDAgKzEgQEAKK4IYNIEbFd+GwveZEDYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODM0ODEtMiBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzQ4MS0yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxOWRiYjIKLS0tIC9kZXYvbnVsbAorKysgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODM0ODEtMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODM0ODEtMyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4MzQ4MS0zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzODc1YWMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODM0ODEtMwpAQCAtMCwwICsxIEBACiuCGDSBGyDoqKIPJZifClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTg0MTgwLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJlcXMtODIxODQxODAtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGE2YzU1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTg0MTgwLTAKQEAgLTAsMCArMSBAQAorghhBgApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4NDI4MS0wIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yZXFzLTgyMTg0MjgxLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc1YmI0YgotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcmVxcy04MjE4NDI4MS0wCkBAIC0wLDAgKzEgQEAKK4IYQoH0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwMDM1NTA0LTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDAwMzU1MDQtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTAwMTY5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwMDM1NTA0LTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwMWUxNzBkLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDAxZTE3MGQtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDZhZGMwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwMWUxNzBkLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwMzAzMDMxLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDAzMDMwMzEtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTk2NWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwMzAzMDMxLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwMzEzNTYzLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDAzMTM1NjMtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGQzYTY3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwMzEzNTYzLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwMzMzMjMzLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDAzMzMyMzMtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDhlMTc4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwMzMzMjMzLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwMzY1YTE3LTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDAzNjVhMTctMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjRhY2IyCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwMzY1YTE3LTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwM2NjMGNjLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDAzY2MwY2MtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2ZjZWM4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwM2NjMGNjLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwM2U3YjFhLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDAzZTdiMWEtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmVhYzhjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwM2U3YjFhLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwNDItMCBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDQyLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTczMDJhZAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9rZXltaW50L2Z1enovY29ycHVzL2tleW1pbnQtcnNwcy0wMDQyLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwNjQ2NjMwLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA2NDY2MzAtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWNjZTg1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwNjQ2NjMwLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIwMDgxLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjAwODEtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDRhOWQzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIwMDgxLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIwMDgxLTEgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjAwODEtMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTYxODJhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIwMDgxLTEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIwMDgxLTIgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjAwODEtMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzc1YTJlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIwMDgxLTIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIwMDgxLTMgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjAwODEtMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTM1OWRhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIwMDgxLTMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIyMTgwLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjIxODAtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWJlNWFlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIyMTgwLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIyMjgwLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjIyODAtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzk3YzIwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIyMjgwLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIyNTgwLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjI1ODAtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjkxNzk1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIyNTgwLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIyNjgwLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjI2ODAtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDVjYmYzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIyNjgwLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIyNzgwLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjI3ODAtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yjc5MDYwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIyNzgwLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIyODgwLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjI4ODAtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2VhYjRjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIyODgwLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIyOTgwLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjI5ODAtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDcyYjU1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIyOTgwLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIyYTgwLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjJhODAtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTYwZDY3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIyYTgwLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIyYjgwLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjJiODAtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGNiYTU0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIyYjgwLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIyYzgwLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjJjODAtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWViNTFmCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIyYzgwLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzMDgwLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjMwODAtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWYxNTM1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzMDgwLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzNDgwLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjM0ODAtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTFkZjUwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzNDgwLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODE5LTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjM4MTktMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWNlZmM4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODE5LTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODFkLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjM4MWQtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTYxY2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODFkLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODFlLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjM4MWUtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWEyNjY0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODFlLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODIwLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjM4MjAtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTFjMWY0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODIwLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODI1LTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjM4MjUtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzU2ZWVlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODI1LTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODI3LTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjM4MjctMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmVhMDEzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODI3LTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODJiLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjM4MmItMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmNhOTgwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODJiLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODMzLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjM4MzMtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDhmNjFlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODMzLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODM2LTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjM4MzYtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGRkOWIwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODM2LTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODM3LTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjM4MzctMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTc5YTcxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODM3LTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODM4LTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjM4MzgtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDFkMWJlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODM4LTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODM5LTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjM4MzktMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mjk3MTEwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODM5LTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODNhLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjM4M2EtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2ZjODA0Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODNhLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODNlLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjM4M2UtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmJjOTc4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODNlLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODQwLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjM4NDAtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjczMjExCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODQwLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODQxLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjM4NDEtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjliYzJhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODQxLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODQ2LTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjM4NDYtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjQwNDMwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODQ2LTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODRkLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjM4NGQtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDI1MTZlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODRkLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODRlLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjM4NGUtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmYyOTMwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODRlLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODRmLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjM4NGYtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2I2N2MzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODRmLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODUwLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjM4NTAtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTI1MWNjCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzODUwLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzOTAzLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA4MjM5MDMtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmU0MjA2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwODIzOTAzLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwOWE4MWZhLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDA5YTgxZmEtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWZmYTc4Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwOWE4MWZhLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwYjVhZTc5LTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDBiNWFlNzktMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWYwODViCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAwYjVhZTc5LTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAxODIwMDgxLTAgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDE4MjAwODEtMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OThhMzc3Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAxODIwMDgxLTAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAxODIwMDgxLTEgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDE4MjAwODEtMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2Y0YWY1Ci0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAxODIwMDgxLTEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAxODIwMDgxLTIgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDE4MjAwODEtMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTY4ZjRiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAxODIwMDgxLTIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAxODIwMDgxLTMgYi90cnVzdHkva2V5bWludC9mdXp6L2NvcnB1cy9rZXltaW50LXJzcHMtMDE4MjAwODEtMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGE1ZjIzCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvZnV6ei9jb3JwdXMva2V5bWludC1yc3BzLTAxODIwMDgxLTMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvc3JjL2tleW1pbnRfaGFsX21haW4ucnMgYi90cnVzdHkva2V5bWludC9zcmMva2V5bWludF9oYWxfbWFpbi5ycwppbmRleCBjZmE4NTlmLi5hMGIxZDc5IDEwMDY0NAotLS0gYS90cnVzdHkva2V5bWludC9zcmMva2V5bWludF9oYWxfbWFpbi5ycworKysgYi90cnVzdHkva2V5bWludC9zcmMva2V5bWludF9oYWxfbWFpbi5ycwpAQCAtMTQsMTAgKzE0LDExIEBACiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogLy8hIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgdGhlIEhBTCBzZXJ2aWNlIGZvciBLZXltaW50IChSdXN0KSBpbiBUcnVzdHkuCit1c2UgY2xhcDo6UGFyc2VyOwogdXNlIGttcl9oYWw6OnsKICAgICBleHRyYWN0X3JzcCwga2V5bWludCwgcnBjLCBzZWN1cmVjbG9jaywgc2VuZF9oYWxfaW5mbywgc2hhcmVkc2VjcmV0LCBTZXJpYWxpemVkQ2hhbm5lbCwKIH07Ci11c2UgbG9nOjp7ZXJyb3IsIGluZm99OwordXNlIGxvZzo6e2Vycm9yLCBpbmZvLCB3YXJufTsKIHVzZSBzdGQ6OnsKICAgICBmZmk6OkNTdHJpbmcsCiAgICAgb3BzOjpEZXJlZk11dCwKQEAgLTgxLDM3ICs4Miw3NyBAQAogICAgIH0KIH0KIAorI1tkZXJpdmUoUGFyc2VyLCBEZWJ1ZyldCitzdHJ1Y3QgQXJncyB7CisgICAgLy8vIFRpcGMgZGV2aWNlIHBhdGgKKyAgICAjW2FyZyhzaG9ydCwgbG9uZywgZGVmYXVsdF92YWx1ZV90ID0gREVGQVVMVF9ERVZJQ0UudG9fc3RyaW5nKCkpXQorICAgIGRldjogU3RyaW5nLAorfQorCiBmbiBtYWluKCkgewotICAgIGlmIGxldCBFcnIoZSkgPSBpbm5lcl9tYWluKCkgeworICAgIGlmIGxldCBFcnIoSGFsU2VydmljZUVycm9yKGUpKSA9IGlubmVyX21haW4oKSB7CiAgICAgICAgIHBhbmljISgiSEFMIHNlcnZpY2UgZmFpbGVkOiB7Oj99IiwgZSk7CiAgICAgfQogfQogCiBmbiBpbm5lcl9tYWluKCkgLT4gUmVzdWx0PCgpLCBIYWxTZXJ2aWNlRXJyb3I+IHsKKyAgICBsZXQgYXJncyA9IEFyZ3M6OnBhcnNlKCk7CiAgICAgLy8gSW5pdGlhbGl6ZSBBbmRyb2lkIGxvZ2dpbmcuCiAgICAgYW5kcm9pZF9sb2dnZXI6OmluaXRfb25jZSgKICAgICAgICAgYW5kcm9pZF9sb2dnZXI6OkNvbmZpZzo6ZGVmYXVsdCgpCiAgICAgICAgICAgICAud2l0aF90YWcoImtleW1pbnQtaGFsLXRydXN0eSIpCi0gICAgICAgICAgICAud2l0aF9taW5fbGV2ZWwobG9nOjpMZXZlbDo6SW5mbykKLSAgICAgICAgICAgIC53aXRoX2xvZ19pZChhbmRyb2lkX2xvZ2dlcjo6TG9nSWQ6OlN5c3RlbSksCisgICAgICAgICAgICAud2l0aF9tYXhfbGV2ZWwobG9nOjpMZXZlbEZpbHRlcjo6SW5mbykKKyAgICAgICAgICAgIC53aXRoX2xvZ19idWZmZXIoYW5kcm9pZF9sb2dnZXI6OkxvZ0lkOjpTeXN0ZW0pLAogICAgICk7CiAgICAgLy8gUmVkaXJlY3QgcGFuaWMgbWVzc2FnZXMgdG8gbG9nY2F0LgogICAgIHBhbmljOjpzZXRfaG9vayhCb3g6Om5ldyh8cGFuaWNfaW5mb3wgewogICAgICAgICBlcnJvciEoInt9IiwgcGFuaWNfaW5mbyk7CiAgICAgfSkpOwogCi0gICAgaW5mbyEoIlRydXN0eSBLTSBIQUwgc2VydmljZSBpcyBzdGFydGluZy4iKTsKKyAgICBpZiBjZmchKGZlYXR1cmUgPSAibm9uc2VjdXJlIikgeworICAgICAgICB3YXJuISgiTm9uLXNlY3VyZSBUcnVzdHkgS00gSEFMIHNlcnZpY2UgaXMgc3RhcnRpbmcuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5mbyEoIlRydXN0eSBLTSBIQUwgc2VydmljZSBpcyBzdGFydGluZy4iKTsKKyAgICB9CiAKICAgICBpbmZvISgiU3RhcnRpbmcgdGhyZWFkIHBvb2wgbm93LiIpOwogICAgIGJpbmRlcjo6UHJvY2Vzc1N0YXRlOjpzdGFydF90aHJlYWRfcG9vbCgpOwogCiAgICAgLy8gQ3JlYXRlIGNvbm5lY3Rpb24gdG8gdGhlIFRBCi0gICAgbGV0IGNvbm5lY3Rpb24gPSB0cnVzdHk6OlRpcGNDaGFubmVsOjpjb25uZWN0KERFRkFVTFRfREVWSUNFLCBUUlVTVFlfS0VZTUlOVF9SVVNUX1NFUlZJQ0VfTkFNRSkKLSAgICAgICAgLm1hcF9lcnIofGV8IHsKLSAgICAgICAgICAgIEhhbFNlcnZpY2VFcnJvcihmb3JtYXQhKCJGYWlsZWQgdG8gY29ubmVjdCB0byBUcnVzdHkgS2V5bWludCBUQSBiZWNhdXNlIG9mIHs6P30uIiwgZSkpCi0gICAgICAgIH0pPzsKKyAgICBsZXQgY29ubmVjdGlvbiA9CisgICAgICAgIHRydXN0eTo6VGlwY0NoYW5uZWw6OmNvbm5lY3QoYXJncy5kZXYuYXNfc3RyKCksIFRSVVNUWV9LRVlNSU5UX1JVU1RfU0VSVklDRV9OQU1FKS5tYXBfZXJyKAorICAgICAgICAgICAgfGV8IHsKKyAgICAgICAgICAgICAgICBIYWxTZXJ2aWNlRXJyb3IoZm9ybWF0ISgKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjb25uZWN0IHRvIFRydXN0eSBLZXltaW50IFRBIGF0IHt9IGJlY2F1c2Ugb2Ygezo/fS4iLAorICAgICAgICAgICAgICAgICAgICBhcmdzLmRldiwgZQorICAgICAgICAgICAgICAgICkpCisgICAgICAgICAgICB9LAorICAgICAgICApPzsKICAgICBsZXQgdGlwY19jaGFubmVsID0gQXJjOjpuZXcoTXV0ZXg6Om5ldyhUaXBjQ2hhbm5lbChjb25uZWN0aW9uKSkpOwogCisgICAgI1tjZmcoZmVhdHVyZSA9ICJub25zZWN1cmUiKV0KKyAgICB7CisgICAgICAgIC8vIFdoZW4gdGhlIG5vbi1zZWN1cmUgZmVhdHVyZSBpcyBlbmFibGVkLCByZXRyaWV2ZSByb290LW9mLXRydXN0IGluZm9ybWF0aW9uCisgICAgICAgIC8vICh3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIHZlcmlmaWVkIGJvb3Qga2V5IGhhc2gpIGZyb20gQW5kcm9pZCBwcm9wZXJ0aWVzLCBhbmQKKyAgICAgICAgLy8gcG9wdWxhdGUgdGhlIFRBIHdpdGggdGhpcyBpbmZvcm1hdGlvbi4gT24gYSByZWFsIGRldmljZSwgdGhlIGJvb3Rsb2FkZXIgc2hvdWxkCisgICAgICAgIC8vIHByb3ZpZGUgdGhpcyBkYXRhIHRvIHRoZSBUQSBkaXJlY3RseS4KKyAgICAgICAgbGV0IGJvb3RfcmVxID0ga21yX2hhbF9ub25zZWN1cmU6OmdldF9ib290X2luZm8oKTsKKyAgICAgICAgaW5mbyEoImJvb3QvSEFMLT5UQTogYm9vdCBpbmZvIGlzIHs6P30iLCBib290X3JlcSk7CisgICAgICAgIGttcl9oYWw6OnNlbmRfYm9vdF9pbmZvKHRpcGNfY2hhbm5lbC5sb2NrKCkudW53cmFwKCkuZGVyZWZfbXV0KCksIGJvb3RfcmVxKQorICAgICAgICAgICAgLm1hcF9lcnIofGV8IEhhbFNlcnZpY2VFcnJvcihmb3JtYXQhKCJGYWlsZWQgdG8gc2VuZCBib290IGluZm86IHs6P30iLCBlKSkpPzsKKyAgICAgICAgLy8gV2hlbiB0aGUgbm9uLXNlY3VyZSBmZWF0dXJlIGlzIGVuYWJsZWQsIGFsc28gcmV0cmlldmUgZGV2aWNlIElEIGluZm9ybWF0aW9uCisgICAgICAgIC8vIChleGNlcHQgZm9yIElNRUkvTUVJRCB2YWx1ZXMpIGZyb20gQW5kcm9pZCBwcm9wZXJ0aWVzIGFuZCBwb3B1bGF0ZSB0aGUgVEEgd2l0aAorICAgICAgICAvLyB0aGlzIGluZm9ybWF0aW9uLiBPbiBhIHJlYWwgZGV2aWNlLCBhIGZhY3RvcnkgcHJvdmlzaW9uaW5nIHByb2Nlc3Mgd291bGQgcG9wdWxhdGUKKyAgICAgICAgLy8gdGhpcyBpbmZvcm1hdGlvbi4KKyAgICAgICAgbGV0IGF0dGVzdF9pZHMgPSBrbXJfaGFsX25vbnNlY3VyZTo6YXR0ZXN0YXRpb25faWRfaW5mbygpOworICAgICAgICBpZiBsZXQgRXJyKGUpID0KKyAgICAgICAgICAgIGttcl9oYWw6OnNlbmRfYXR0ZXN0X2lkcyh0aXBjX2NoYW5uZWwubG9jaygpLnVud3JhcCgpLmRlcmVmX211dCgpLCBhdHRlc3RfaWRzKQorICAgICAgICB7CisgICAgICAgICAgICBlcnJvciEoIkZhaWxlZCB0byBzZW5kIGF0dGVzdGF0aW9uIElEIGluZm86IHs6P30iLCBlKTsKKyAgICAgICAgfQorICAgICAgICBpbmZvISgiU3VjY2Vzc2Z1bGx5IHNlbnQgbm9uLXNlY3VyZSBib290IGluZm8gYW5kIGF0dGVzdGF0aW9uIElEcyB0byB0aGUgVEEuIik7CisgICAgfQorCiAgICAgLy8gUmVnaXN0ZXIgdGhlIEtleW1pbnQgc2VydmljZQogICAgIGxldCBrbV9zZXJ2aWNlID0ga2V5bWludDo6RGV2aWNlOjpuZXdfYXNfYmluZGVyKHRpcGNfY2hhbm5lbC5jbG9uZSgpKTsKICAgICBsZXQga21fc2VydmljZV9uYW1lID0gZm9ybWF0ISgie30ve30iLCBLTV9TRVJWSUNFX05BTUUsIFNFUlZJQ0VfSU5TVEFOQ0UpOwpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2tleW1pbnQvdHJ1c3R5LWtleW1pbnQubWsgYi90cnVzdHkva2V5bWludC90cnVzdHkta2V5bWludC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTc5MWVhCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2tleW1pbnQvdHJ1c3R5LWtleW1pbnQubWsKQEAgLTAsMCArMSw0MyBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3Blbi1Tb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIworIyBUaGlzIG1ha2VmaWxlIHNob3VsZCBiZSBpbmNsdWRlZCBieSBkZXZpY2VzIHRoYXQgdXNlIFRydXN0eSBURUUKKyMgdG8gcHVsbCBpbiBhIHNldCBvZiBUcnVzdHkgS2V5TWludCBzcGVjaWZpYyBtb2R1bGVzLgorIworIyBBbGxvdyBLZXlNaW50IEhBTCBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIHNlbGVjdGlvbiBhdCBidWlsZCB0aW1lLiBUaGlzIG11c3QgYmUKKyMgc3luY2hyb25pemVkIHdpdGggdGhlIFRBIGltcGxlbWVudGF0aW9uIGluY2x1ZGVkIGluIFRydXN0eS4gUG9zc2libGUgdmFsdWVzOgorIworIyAtIFJ1c3QgaW1wbGVtZW50YXRpb24gZm9yIFRydXN0eSBWTSAocmVxdWlyZXMgVHJ1c3R5IFZNIHN1cHBvcnQpOgorIyAgIGV4cG9ydCBUUlVTVFlfS0VZTUlOVF9JTVBMPXJ1c3QKKyMgICBleHBvcnQgVFJVU1RZX1NZU1RFTV9WTT1ub25zZWN1cmUKKyMgLSBSdXN0IGltcGxlbWVudGF0aW9uIGZvciBUcnVzdHkgVEVFIChubyBUcnVzdHkgVk0gc3VwcG9ydCk6CisjICAgZXhwb3J0IFRSVVNUWV9LRVlNSU5UX0lNUEw9cnVzdAorIyAtIEMrKyBpbXBsZW1lbnRhdGlvbiAoZGVmYXVsdCk6IChhbnkgb3RoZXIgdmFsdWUgb3IgdW5zZXQgVFJVU1RZX0tFWU1JTlRfSU1QTCkKKworaWZlcSAoJChUUlVTVFlfS0VZTUlOVF9JTVBMKSxydXN0KQorICAgIGlmZXEgKCQoVFJVU1RZX1NZU1RFTV9WTSksbm9uc2VjdXJlKQorICAgICAgICBMT0NBTF9LRVlNSU5UX1BST0RVQ1RfUEFDS0FHRSA6PSBhbmRyb2lkLmhhcmR3YXJlLnNlY3VyaXR5LmtleW1pbnQtc2VydmljZS5ydXN0LnRydXN0eS5zeXN0ZW0ubm9uc2VjdXJlCisgICAgZWxzZQorICAgICAgICBMT0NBTF9LRVlNSU5UX1BST0RVQ1RfUEFDS0FHRSA6PSBhbmRyb2lkLmhhcmR3YXJlLnNlY3VyaXR5LmtleW1pbnQtc2VydmljZS5ydXN0LnRydXN0eQorICAgIGVuZGlmCitlbHNlCisgICAgIyBEZWZhdWx0IHRvIHRoZSBDKysgaW1wbGVtZW50YXRpb24KKyAgICBMT0NBTF9LRVlNSU5UX1BST0RVQ1RfUEFDS0FHRSA6PSBhbmRyb2lkLmhhcmR3YXJlLnNlY3VyaXR5LmtleW1pbnQtc2VydmljZS50cnVzdHkKK2VuZGlmCisKK1BST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgICQoTE9DQUxfS0VZTUlOVF9QUk9EVUNUX1BBQ0tBR0UpIFwKZGlmZiAtLWdpdCBhL3RydXN0eS9saWJ0cnVzdHktcnMvQW5kcm9pZC5icCBiL3RydXN0eS9saWJ0cnVzdHktcnMvQW5kcm9pZC5icAppbmRleCA0ZmMxNjJiLi5lMjg5MDA1IDEwMDY0NAotLS0gYS90cnVzdHkvbGlidHJ1c3R5LXJzL0FuZHJvaWQuYnAKKysrIGIvdHJ1c3R5L2xpYnRydXN0eS1ycy9BbmRyb2lkLmJwCkBAIC0yMSw5ICsyMSwxMCBAQAogICAgIGNyYXRlX25hbWU6ICJ0cnVzdHkiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgc3JjczogWwotICAgICAgICAic3JjL2xpYi5ycyIKKyAgICAgICAgInNyYy9saWIucnMiLAogICAgIF0sCiAgICAgcnVzdGxpYnM6IFsKKyAgICAgICAgImxpYmxvZ19ydXN0IiwKICAgICAgICAgImxpYm5peCIsCiAgICAgICAgICJsaWJsaWJjIiwKICAgICBdLApAQCAtMzYsNSArMzcsNSBAQAogICAgIHJ1c3RsaWJzOiBbCiAgICAgICAgICJsaWJ0cnVzdHktcnMiLAogICAgICAgICAibGlibGliYyIsCi0gICAgXQorICAgIF0sCiB9CmRpZmYgLS1naXQgYS90cnVzdHkvbGlidHJ1c3R5LXJzL3NyYy9saWIucnMgYi90cnVzdHkvbGlidHJ1c3R5LXJzL3NyYy9saWIucnMKaW5kZXggMjhlYTA3NS4uOTIzN2M4YiAxMDA2NDQKLS0tIGEvdHJ1c3R5L2xpYnRydXN0eS1ycy9zcmMvbGliLnJzCisrKyBiL3RydXN0eS9saWJ0cnVzdHktcnMvc3JjL2xpYi5ycwpAQCAtNjEsMTIgKzYxLDE4IEBACiAvLyEgYGBgCiAKIHVzZSBjcmF0ZTo6c3lzOjp0aXBjX2Nvbm5lY3Q7Cit1c2UgbG9nOjp7dHJhY2UsIHdhcm59OwordXNlIG5peDo6c3lzOjpzb2NrZXQ7Cit1c2Ugc3RkOjpjb252ZXJ0OjpGcm9tOwogdXNlIHN0ZDo6ZmZpOjpDU3RyaW5nOwogdXNlIHN0ZDo6ZnM6OkZpbGU7Cit1c2Ugc3RkOjppbzsKIHVzZSBzdGQ6OmlvOjpwcmVsdWRlOjoqOwogdXNlIHN0ZDo6aW86OntFcnJvcktpbmQsIFJlc3VsdH07CiB1c2Ugc3RkOjpvczo6dW5peDo6cHJlbHVkZTo6QXNSYXdGZDsKIHVzZSBzdGQ6OnBhdGg6OlBhdGg7Cit1c2Ugc3RkOjp0aHJlYWQ7Cit1c2Ugc3RkOjp0aW1lOwogCiBtb2Qgc3lzOwogCkBAIC05OCwxNSArMTA0LDk5IEBACiAgICAgLy8vIGJ5dGVzLiBUaGlzIGlzIGhhbmRsZWQgd2l0aCBhIHBhbmljIGJlY2F1c2UgdGhlIHNlcnZpY2UgbmFtZXMgYXJlIGFsbAogICAgIC8vLyBoYXJkLWNvZGVkIGNvbnN0YW50cywgYW5kIHNvIHN1Y2ggYW4gZXJyb3Igc2hvdWxkIGFsd2F5cyBiZSBpbmRpY2F0aXZlIG9mIGEKICAgICAvLy8gYnVnIGluIHRoZSBjYWxsaW5nIGNvZGUuCi0gICAgcHViIGZuIGNvbm5lY3QoZGV2aWNlOiBpbXBsIEFzUmVmPFBhdGg+LCBzZXJ2aWNlOiAmc3RyKSAtPiBSZXN1bHQ8U2VsZj4geworICAgIHB1YiBmbiBjb25uZWN0KGRldmljZTogJnN0ciwgc2VydmljZTogJnN0cikgLT4gUmVzdWx0PFNlbGY+IHsKKyAgICAgICAgaWYgbGV0IFNvbWUoY2lkX3BvcnRfc3RyKSA9IGRldmljZS5zdHJpcF9wcmVmaXgoIlZTT0NLOiIpIHsKKyAgICAgICAgICAgIFNlbGY6OmNvbm5lY3RfdnNvY2soY2lkX3BvcnRfc3RyLCBzZXJ2aWNlKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU2VsZjo6Y29ubmVjdF90aXBjKGRldmljZSwgc2VydmljZSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIGNvbm5lY3RfdnNvY2sodHlwZV9jaWRfcG9ydF9zdHI6ICZzdHIsIHNlcnZpY2U6ICZzdHIpIC0+IFJlc3VsdDxTZWxmPiB7CisgICAgICAgIGxldCBjaWRfcG9ydF9zdHI7CisgICAgICAgIGxldCBzb2NrZXRfdHlwZTsKKyAgICAgICAgaWYgbGV0IFNvbWUoc3RyZWFtX2NpZF9wb3J0X3N0cikgPSB0eXBlX2NpZF9wb3J0X3N0ci5zdHJpcF9wcmVmaXgoIlNUUkVBTToiKSB7CisgICAgICAgICAgICBzb2NrZXRfdHlwZSA9IHNvY2tldDo6U29ja1R5cGU6OlN0cmVhbTsKKyAgICAgICAgICAgIGNpZF9wb3J0X3N0ciA9IHN0cmVhbV9jaWRfcG9ydF9zdHI7CisgICAgICAgIH0gZWxzZSBpZiBsZXQgU29tZShzZXFwYWNrZXRfY2lkX3BvcnRfc3RyKSA9IHR5cGVfY2lkX3BvcnRfc3RyLnN0cmlwX3ByZWZpeCgiU0VRUEFDS0VUOiIpIHsKKyAgICAgICAgICAgIHNvY2tldF90eXBlID0gc29ja2V0OjpTb2NrVHlwZTo6U2VxUGFja2V0OworICAgICAgICAgICAgY2lkX3BvcnRfc3RyID0gc2VxcGFja2V0X2NpZF9wb3J0X3N0cjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBEZWZhdWx0IHRvIFNPQ0tfU1RSRUFNIGlmIG5laXRoZXIgdHlwZSBpcyBzcGVjaWZpZWQuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVE9ETzogdXNlIFNPQ0tfU0VRUEFDS0VUIGJ5IGRlZmF1bHQgaW5zdGVhZCBvZiBTT0NLX1NUUkVBTSB3aGVuIFNPQ0tfU0VRUEFDS0VUIGlzIGZ1bGx5CisgICAgICAgICAgICAgKiBzdXBwb3J0ZWQgc2luY2UgaXQgbWF0Y2hlcyB0aXBjIGJldHRlci4gQXQgdGhlIG1vbWVudCBTT0NLX1NFUVBBQ0tFVCBpcyBub3Qgc3VwcG9ydGVkIGJ5CisgICAgICAgICAgICAgKiBjcm9zdm0uIEl0IGlzIGFsc28gc2lnbmlmaWNhbnRseSBzbG93ZXIgc2luY2UgdGhlIExpbnV4IGtlcm5lbCBpbXBsZW1lbnRhdGlvbiAoYXMgb2YKKyAgICAgICAgICAgICAqIHY2LjctcmMxKSBzZW5kcyBjcmVkaXQgdXBkYXRlIHBhY2tldHMgZXZlcnkgdGltZSBpdCByZWNlaXZlcyBhIGRhdGEgcGFja2V0IHdoaWxlIHRoZQorICAgICAgICAgICAgICogU09DS19TVFJFQU0gdmVyc2lvbiBza2lwcyB0aGVzZSB1bmxlc3MgdGhlIHJlbWFpbmluZyBidWZmZXIgc3BhY2UgaXMgImxvdyIuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHNvY2tldF90eXBlID0gc29ja2V0OjpTb2NrVHlwZTo6U3RyZWFtOworICAgICAgICAgICAgY2lkX3BvcnRfc3RyID0gdHlwZV9jaWRfcG9ydF9zdHI7CisgICAgICAgIH0KKworICAgICAgICBsZXQgW2NpZCwgcG9ydF06IFt1MzI7IDJdID0gY2lkX3BvcnRfc3RyCisgICAgICAgICAgICAuc3BsaXQoJzonKQorICAgICAgICAgICAgLm1hcCh8dnwgdi5wYXJzZTo6PHUzMj4oKS5tYXBfZXJyKHxlfCBpbzo6RXJyb3I6Om5ldyhpbzo6RXJyb3JLaW5kOjpJbnZhbGlkSW5wdXQsIGUpKSkKKyAgICAgICAgICAgIC5jb2xsZWN0Ojo8UmVzdWx0PFZlYzx1MzI+Pj4oKT8KKyAgICAgICAgICAgIC50cnlfaW50bygpCisgICAgICAgICAgICAubWFwX2Vycih8ZXwgeworICAgICAgICAgICAgICAgIGlvOjpFcnJvcjo6bmV3KGlvOjpFcnJvcktpbmQ6OkludmFsaWRJbnB1dCwgZm9ybWF0ISgiV3JvbmcgbnVtYmVyIG9mIGFyZ3M6IHtlOj99IikpCisgICAgICAgICAgICB9KT87CisKKyAgICAgICAgdHJhY2UhKCJnb3QgY2lkLCBwb3J0OiB7Y2lkfSwge3BvcnR9Iik7CisgICAgICAgIGxldCBzID0gc29ja2V0Ojpzb2NrZXQoCisgICAgICAgICAgICBzb2NrZXQ6OkFkZHJlc3NGYW1pbHk6OlZzb2NrLAorICAgICAgICAgICAgc29ja2V0X3R5cGUsCisgICAgICAgICAgICBzb2NrZXQ6OlNvY2tGbGFnOjpTT0NLX0NMT0VYRUMsCisgICAgICAgICAgICBOb25lLAorICAgICAgICApPzsKKyAgICAgICAgdHJhY2UhKCJnb3Qgc29ja2V0Iik7CisgICAgICAgIGxldCBzYSA9IHNvY2tldDo6VnNvY2tBZGRyOjpuZXcoY2lkLCBwb3J0KTsKKyAgICAgICAgdHJhY2UhKCJnb3Qgc2EiKTsKKworICAgICAgICAvL2xldCBjb25uZWN0X3RpbWVvdXQgPSBsaWJjOjp0aW1ldmFsIHt0dl9zZWM6IDYwLCB0dl91c2VjOiAwfTsKKyAgICAgICAgLy8gVE9ETzogU2V0IEFGX1ZTT0NLL1NPX1ZNX1NPQ0tFVFNfQ09OTkVDVF9USU1FT1VUIHNvY2tvcHQuCisKKyAgICAgICAgbGV0IG11dCByZXRyeSA9IDEwOworICAgICAgICBsb29wIHsKKyAgICAgICAgICAgIGxldCByZXMgPSBzb2NrZXQ6OmNvbm5lY3Qocy5hc19yYXdfZmQoKSwgJnNhKTsKKyAgICAgICAgICAgIGlmIHJlcy5pc19vaygpIHx8IHJldHJ5IDw9IDAgeworICAgICAgICAgICAgICAgIHJlcz87CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3YXJuISgidnNvY2s6e2NpZH06e3BvcnR9IGNvbm5lY3QgZmFpbGVkIHtyZXM6P30sIHtyZXRyeX0gcmV0cmllcyByZW1haW5pbmciKTsKKyAgICAgICAgICAgIHJldHJ5IC09IDE7CisgICAgICAgICAgICB0aHJlYWQ6OnNsZWVwKHRpbWU6OkR1cmF0aW9uOjpmcm9tX3NlY3MoNSkpOworICAgICAgICB9CisgICAgICAgIHRyYWNlISgiY29ubmVjdGVkIik7CisgICAgICAgIC8vIFRPRE86IEN1cnJlbnQgdnNvY2sgdGlwYyBicmlkZ2UgaW4gdHJ1c3R5IGV4cGVjdHMgYSBwb3J0IG5hbWUgaW4gdGhlCisgICAgICAgIC8vIGZpcnN0IHBhY2tldC4gV2UgbmVlZCB0byByZXBsYWNlIHRoaXMgd2l0aCBhIHByb3RvY29sIHRoYXQgYWxzbyBkb2VzIERJQ0UKKyAgICAgICAgLy8gYmFzZWQgYXV0aGVudGljYXRpb24uCisgICAgICAgIC8vIGBzYCBpcyBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvciBiZWNhdXNlIGl0IGNhbWUgZnJvbSBzb2NrZXQ6OnNvY2tldC4KKyAgICAgICAgbGV0IG11dCBjaGFubmVsID0gU2VsZihGaWxlOjpmcm9tKHMpKTsKKyAgICAgICAgY2hhbm5lbC5zZW5kKHNlcnZpY2UuYXNfYnl0ZXMoKSk/OworICAgICAgICB0cmFjZSEoInNlbnQgdGlwYyBwb3J0IG5hbWUiKTsKKworICAgICAgICAvLyBXb3JrIGFyb3VuZCBsYWNrIG9mIHNlcSBwYWNrZXQgc3VwcG9ydC4gUmVhZCBhIHN0YXR1cyBieXRlIHRvIHByZXZlbnQKKyAgICAgICAgLy8gdGhlIGNhbGxlciBmcm9tIHNlbmRpbmcgbW9yZSBkYXRhIHVudGlsIHNydl9uYW1lIGhhcyBiZWVuIHJlYWQuCisgICAgICAgIGxldCBtdXQgc3RhdHVzID0gWzA7IDFdOworICAgICAgICBjaGFubmVsLnJlY3Zfbm9fYWxsb2MoJm11dCBzdGF0dXMpPzsKKyAgICAgICAgdHJhY2UhKCJnb3Qgc3RhdHVzIGJ5dGU6IHtzdGF0dXM6P30iKTsKKyAgICAgICAgT2soY2hhbm5lbCkKKyAgICB9CisKKyAgICBmbiBjb25uZWN0X3RpcGMoZGV2aWNlOiBpbXBsIEFzUmVmPFBhdGg+LCBzZXJ2aWNlOiAmc3RyKSAtPiBSZXN1bHQ8U2VsZj4gewogICAgICAgICBsZXQgZmlsZSA9IEZpbGU6Om9wdGlvbnMoKS5yZWFkKHRydWUpLndyaXRlKHRydWUpLm9wZW4oZGV2aWNlKT87CiAKICAgICAgICAgbGV0IHNydl9uYW1lID0gQ1N0cmluZzo6bmV3KHNlcnZpY2UpLmV4cGVjdCgiU2VydmljZSBuYW1lIGNvbnRhaW5lZCBudWxsIGJ5dGVzIik7CisgICAgICAgIC8vIFNBRkVUWTogVGhlIGZpbGUgZGVzY3JpcHRvciBpcyB2YWxpZCBiZWNhdXNlIGl0IGNhbWUgZnJvbSBhIGBGaWxlYCwgYW5kIHRoZSBuYW1lIGlzIGEKKyAgICAgICAgLy8gdmFsaWQgQyBzdHJpbmcgYmVjYXVzZSBpdCBjYW1lIGZyb20gYSBgQ1N0cmluZ2AuCiAgICAgICAgIHVuc2FmZSB7CiAgICAgICAgICAgICB0aXBjX2Nvbm5lY3QoZmlsZS5hc19yYXdfZmQoKSwgc3J2X25hbWUuYXNfcHRyKCkpPzsKICAgICAgICAgfQogCi0gICAgICAgIE9rKFRpcGNDaGFubmVsKGZpbGUpKQorICAgICAgICBPayhTZWxmKGZpbGUpKQogICAgIH0KIAogICAgIC8vLyBTZW5kcyBhIG1lc3NhZ2UgdG8gdGhlIGNvbm5lY3RlZCBzZXJ2aWNlLgpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2xpYnRydXN0eS90aXBjLXRlc3QvdGlwY190ZXN0LmMgYi90cnVzdHkvbGlidHJ1c3R5L3RpcGMtdGVzdC90aXBjX3Rlc3QuYwppbmRleCA4MWM5ODgxLi4xMjE4MzdkIDEwMDY0NAotLS0gYS90cnVzdHkvbGlidHJ1c3R5L3RpcGMtdGVzdC90aXBjX3Rlc3QuYworKysgYi90cnVzdHkvbGlidHJ1c3R5L3RpcGMtdGVzdC90aXBjX3Rlc3QuYwpAQCAtMjIsOCArMjIsMTAgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxnZXRvcHQuaD4KICNkZWZpbmUgX19VU0VfR05VCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvbW1hbi5oPgogI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CiAKICNpbmNsdWRlIDxCdWZmZXJBbGxvY2F0b3IvQnVmZmVyQWxsb2NhdG9yV3JhcHBlci5oPgogCkBAIC0zMSw4ICszMywyNyBAQAogCiAjZGVmaW5lIFRJUENfREVGQVVMVF9ERVZOQU1FICIvZGV2L3RydXN0eS1pcGMtZGV2MCIKIAotc3RhdGljIGNvbnN0IGNoYXIgKmRldl9uYW1lID0gTlVMTDsKLXN0YXRpYyBjb25zdCBjaGFyICp0ZXN0X25hbWUgPSBOVUxMOworLyogY2xhbmctZm9ybWF0IG9mZiAqLworI2RlZmluZSBCRU5DSF9SRVNVTFRfVFBMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorInsiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorIiAgICBcInNjaGVtYV92ZXJzaW9uXCI6IDMsIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorIiAgICBcInN1aXRlX25hbWVcIjogXCJ0aXBjXCIsIiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyIgICAgXCJiZW5jaF9uYW1lXCI6IFwiJXNcIiwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyIgICAgXCJyZXN1bHRzXCI6IFsiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyIgICAgICAgIHsiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyIgICAgICAgICAgICBcIm1ldHJpY19uYW1lXCI6IFwidGltZV9taWNyb19zZWNcIiwiICAgICAgICAgIFwKKyIgICAgICAgICAgICBcIm1pblwiOiBcIiUiIFBSSWQ2NCAiXCIsIiAgICAgICAgICAgICAgICAgICAgIFwKKyIgICAgICAgICAgICBcIm1heFwiOiBcIiUiIFBSSWQ2NCAiXCIsIiAgICAgICAgICAgICAgICAgICAgIFwKKyIgICAgICAgICAgICBcImF2Z1wiOiBcIiUiIFBSSWQ2NCAiXCIsIiAgICAgICAgICAgICAgICAgICAgIFwKKyIgICAgICAgICAgICBcImNvbGRcIjogXCIlIiBQUklkNjQgIlwiLCIgICAgICAgICAgICAgICAgICAgIFwKKyIgICAgICAgICAgICBcInJhd19taW5cIjogJSIgUFJJZDY0ICIsIiAgICAgICAgICAgICAgICAgICAgIFwKKyIgICAgICAgICAgICBcInJhd19tYXhcIjogJSIgUFJJZDY0ICIsIiAgICAgICAgICAgICAgICAgICAgIFwKKyIgICAgICAgICAgICBcInJhd19hdmdcIjogJSIgUFJJZDY0ICIsIiAgICAgICAgICAgICAgICAgICAgIFwKKyIgICAgICAgICAgICBcInJhd19jb2xkXCI6ICUiIFBSSWQ2NCAiIiAgICAgICAgICAgICAgICAgICAgIFwKKyIgICAgICAgIH0sIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyIgICAgXSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyJ9IgorLyogY2xhbmctZm9ybWF0IG9uICovCiAKIHN0YXRpYyBjb25zdCBjaGFyICp1dWlkX25hbWUgPSAiY29tLmFuZHJvaWQuaXBjLXVuaXR0ZXN0LnNydi51dWlkIjsKIHN0YXRpYyBjb25zdCBjaGFyICplY2hvX25hbWUgPSAiY29tLmFuZHJvaWQuaXBjLXVuaXR0ZXN0LnNydi5lY2hvIjsKQEAgLTQ0LDggKzY1LDkgQEAKIHN0YXRpYyBjb25zdCBjaGFyICpjbG9zZXIzX25hbWUgPSAiY29tLmFuZHJvaWQuaXBjLXVuaXR0ZXN0LnNydi5jbG9zZXIzIjsKIHN0YXRpYyBjb25zdCBjaGFyICptYWluX2N0cmxfbmFtZSA9ICJjb20uYW5kcm9pZC5pcGMtdW5pdHRlc3QuY3RybCI7CiBzdGF0aWMgY29uc3QgY2hhciogcmVjZWl2ZXJfbmFtZSA9ICJjb20uYW5kcm9pZC50cnVzdHkubWVtcmVmLnJlY2VpdmVyIjsKK3N0YXRpYyBjb25zdCBzaXplX3QgbWVtcmVmX2NodW5rX3NpemUgPSA0MDk2OwogCi1zdGF0aWMgY29uc3QgY2hhciogX3NvcHRzID0gImhzdkRTOnQ6cjptOmI6IjsKK3N0YXRpYyBjb25zdCBjaGFyKiBfc29wdHMgPSAiaHN2RDpTOnQ6cjptOmI6QjoiOwogLyogY2xhbmctZm9ybWF0IG9mZiAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gX2xvcHRzW10gPSAgewogICAgIHsiaGVscCIsICAgIG5vX2FyZ3VtZW50LCAgICAgICAwLCAnaCd9LApAQCAtNTYsNiArNzgsOCBAQAogICAgIHsicmVwZWF0IiwgIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAncid9LAogICAgIHsiYnVyc3QiLCAgIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnYid9LAogICAgIHsibXNnc2l6ZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnbSd9LAorICAgIHsidGVzdCIsICAgIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAndCd9LAorICAgIHsiYmVuY2giLCAgIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnQid9LAogICAgIHswLCAwLCAwLCAwfQogfTsKIC8qIGNsYW5nLWZvcm1hdCBvbiAqLwpAQCAtNzMsNiArOTcsNyBAQAogICAgICAgICAiICAtbSwgLS1tc2dzaXplIHNpemUgICAgbWF4IG1lc3NhZ2Ugc2l6ZVxuIgogICAgICAgICAiICAtdiwgLS12YXJpYWJsZSAgICAgICAgdmFyaWFibGUgbWVzc2FnZSBzaXplXG4iCiAgICAgICAgICIgIC1zLCAtLXNpbGVudCAgICAgICAgICBzaWxlbnRcbiIKKyAgICAgICAgIiAgLUIsIC0tYmVuY2ggICAgICAgICAgIFJ1biBhcyBCZW5jaG1hcmsgTiB0aW1lc1xuIgogICAgICAgICAiXG4iOwogCiBzdGF0aWMgY29uc3QgY2hhciogdXNhZ2VfbG9uZyA9CkBAIC05NSwxMiArMTIwLDM0IEBACiAgICAgICAgICIgICBzZW5kLWZkICAgICAgLSB0cmFuc21pdCBkbWFfYnVmIHRvIHRydXN0eSwgdXNlIGFzIHNobVxuIgogICAgICAgICAiXG4iOwogCi1zdGF0aWMgdWludCBvcHRfcmVwZWF0ICA9IDE7Ci1zdGF0aWMgdWludCBvcHRfbXNnc2l6ZSA9IDMyOwotc3RhdGljIHVpbnQgb3B0X21zZ2J1cnN0ID0gMzI7Ci1zdGF0aWMgYm9vbCBvcHRfdmFyaWFibGUgPSBmYWxzZTsKLXN0YXRpYyBib29sIG9wdF9zaWxlbnQgPSBmYWxzZTsKLXN0YXRpYyBjaGFyKiBzcnZfbmFtZSA9IE5VTEw7CitzdHJ1Y3QgdGlwY190ZXN0X3BhcmFtcyB7CisgICAgdWludCByZXBlYXQ7CisgICAgdWludCBtc2dzaXplOworICAgIHVpbnQgbXNnYnVyc3Q7CisgICAgYm9vbCB2YXJpYWJsZTsKKyAgICBib29sIHNpbGVudDsKKyAgICB1aW50IGJlbmNoOworICAgIGNoYXIqIHNydl9uYW1lOworICAgIGNoYXIqIGRldl9uYW1lOworICAgIGNoYXIqIHRlc3RfbmFtZTsKK307Cit0eXBlZGVmIGludCAoKnRpcGNfdGVzdF9mdW5jX3QpKGNvbnN0IHN0cnVjdCB0aXBjX3Rlc3RfcGFyYW1zKik7CisKK3N0cnVjdCB0aXBjX3Rlc3RfZGVmIHsKKyAgICBjaGFyKiB0ZXN0X25hbWU7CisgICAgdGlwY190ZXN0X2Z1bmNfdCBmdW5jOworfTsKKworc3RhdGljIHZvaWQgaW5pdF9wYXJhbXMoc3RydWN0IHRpcGNfdGVzdF9wYXJhbXMqIHBhcmFtcykgeworICAgIHBhcmFtcy0+cmVwZWF0ID0gMTsKKyAgICBwYXJhbXMtPm1zZ3NpemUgPSAzMjsKKyAgICBwYXJhbXMtPm1zZ2J1cnN0ID0gMzI7CisgICAgcGFyYW1zLT52YXJpYWJsZSA9IGZhbHNlOworICAgIHBhcmFtcy0+c2lsZW50ID0gZmFsc2U7CisgICAgcGFyYW1zLT5iZW5jaCA9IDA7CisgICAgcGFyYW1zLT5zcnZfbmFtZSA9IE5VTEw7CisgICAgcGFyYW1zLT50ZXN0X25hbWUgPSBOVUxMOworfQogCiBzdGF0aWMgdm9pZCBwcmludF91c2FnZV9hbmRfZXhpdChjb25zdCBjaGFyICpwcm9nLCBpbnQgY29kZSwgYm9vbCB2ZXJib3NlKQogewpAQCAtMTA5LDggKzE1Niw3IEBACiAgICAgZXhpdChjb2RlKTsKIH0KIAotc3RhdGljIHZvaWQgcGFyc2Vfb3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17CitzdGF0aWMgdm9pZCBwYXJzZV9vcHRpb25zKGludCBhcmdjLCBjaGFyKiogYXJndiwgc3RydWN0IHRpcGNfdGVzdF9wYXJhbXMqIHBhcmFtcykgewogICAgIGludCBjOwogICAgIGludCBvaWR4ID0gMDsKIApAQCAtMTIwLDM1ICsxNjYsMzkgQEAKIAogICAgICAgICBzd2l0Y2ggKGMpIHsKICAgICAgICAgICAgIGNhc2UgJ0QnOgotICAgICAgICAgICAgICAgIGRldl9uYW1lID0gc3RyZHVwKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5kZXZfbmFtZSA9IHN0cmR1cChvcHRhcmcpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBjYXNlICdTJzoKLSAgICAgICAgICAgICAgICBzcnZfbmFtZSA9IHN0cmR1cChvcHRhcmcpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c3J2X25hbWUgPSBzdHJkdXAob3B0YXJnKTsKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgY2FzZSAndCc6Ci0gICAgICAgICAgICAgICAgdGVzdF9uYW1lID0gc3RyZHVwKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgcGFyYW1zLT50ZXN0X25hbWUgPSBzdHJkdXAob3B0YXJnKTsKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgY2FzZSAndic6Ci0gICAgICAgICAgICAgICAgb3B0X3ZhcmlhYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnZhcmlhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgY2FzZSAncic6Ci0gICAgICAgICAgICAgICAgb3B0X3JlcGVhdCA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnJlcGVhdCA9IGF0b2kob3B0YXJnKTsKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgY2FzZSAnbSc6Ci0gICAgICAgICAgICAgICAgb3B0X21zZ3NpemUgPSBhdG9pKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5tc2dzaXplID0gYXRvaShvcHRhcmcpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBjYXNlICdiJzoKLSAgICAgICAgICAgICAgICBvcHRfbXNnYnVyc3QgPSBhdG9pKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5tc2didXJzdCA9IGF0b2kob3B0YXJnKTsKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgY2FzZSAncyc6Ci0gICAgICAgICAgICAgICAgb3B0X3NpbGVudCA9IHRydWU7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zaWxlbnQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICdCJzoKKyAgICAgICAgICAgICAgICBwYXJhbXMtPmJlbmNoID0gYXRvaShvcHRhcmcpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBjYXNlICdoJzoKQEAgLTE2MSwzMiArMjExLDMxIEBACiAgICAgfQogfQogCi1zdGF0aWMgaW50IGNvbm5lY3RfdGVzdCh1aW50IHJlcGVhdCkKLXsKK3N0YXRpYyBpbnQgY29ubmVjdF90ZXN0KGNvbnN0IHN0cnVjdCB0aXBjX3Rlc3RfcGFyYW1zKiBwYXJhbXMpIHsKICAgICB1aW50IGk7CiAgICAgaW50IGVjaG9fZmQ7CiAgICAgaW50IGRzaW5rX2ZkOwogICAgIGludCBjdXN0b21fZmQ7CiAKLSAgICBpZiAoIW9wdF9zaWxlbnQpIHsKLSAgICAgICAgcHJpbnRmKCIlczogcmVwZWF0ID0gJXVcbiIsIF9fZnVuY19fLCByZXBlYXQpOworICAgIGlmICghcGFyYW1zLT5zaWxlbnQpIHsKKyAgICAgICAgcHJpbnRmKCIlczogcmVwZWF0ID0gJXVcbiIsIF9fZnVuY19fLCBwYXJhbXMtPnJlcGVhdCk7CiAgICAgfQogCi0gICAgZm9yIChpID0gMDsgaSA8IHJlcGVhdDsgaSsrKSB7Ci0gICAgICAgIGlmIChzcnZfbmFtZSkgewotICAgICAgICAgICAgY3VzdG9tX2ZkID0gdGlwY19jb25uZWN0KGRldl9uYW1lLCBzcnZfbmFtZSk7CisgICAgZm9yIChpID0gMDsgaSA8IHBhcmFtcy0+cmVwZWF0OyBpKyspIHsKKyAgICAgICAgaWYgKHBhcmFtcy0+c3J2X25hbWUpIHsKKyAgICAgICAgICAgIGN1c3RvbV9mZCA9IHRpcGNfY29ubmVjdChwYXJhbXMtPmRldl9uYW1lLCBwYXJhbXMtPnNydl9uYW1lKTsKICAgICAgICAgICAgIGlmIChjdXN0b21fZmQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gY29ubmVjdCB0byAnJXMnIHNlcnZpY2VcbiIsIHNydl9uYW1lKTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBjb25uZWN0IHRvICclcycgc2VydmljZVxuIiwgcGFyYW1zLT5zcnZfbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoY3VzdG9tX2ZkID49IDApIHsKICAgICAgICAgICAgICAgICB0aXBjX2Nsb3NlKGN1c3RvbV9mZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlY2hvX2ZkID0gdGlwY19jb25uZWN0KGRldl9uYW1lLCBlY2hvX25hbWUpOworICAgICAgICAgICAgZWNob19mZCA9IHRpcGNfY29ubmVjdChwYXJhbXMtPmRldl9uYW1lLCBlY2hvX25hbWUpOwogICAgICAgICAgICAgaWYgKGVjaG9fZmQgPCAwKSB7CiAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gY29ubmVjdCB0byAnJXMnIHNlcnZpY2VcbiIsICJlY2hvIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBkc2lua19mZCA9IHRpcGNfY29ubmVjdChkZXZfbmFtZSwgZGF0YXNpbmtfbmFtZSk7CisgICAgICAgICAgICBkc2lua19mZCA9IHRpcGNfY29ubmVjdChwYXJhbXMtPmRldl9uYW1lLCBkYXRhc2lua19uYW1lKTsKICAgICAgICAgICAgIGlmIChkc2lua19mZCA8IDApIHsKICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBjb25uZWN0IHRvICclcycgc2VydmljZVxuIiwgImRhdGFzaW5rIik7CiAgICAgICAgICAgICB9CkBAIC0yMDAsNzkgKzI0OSw3NSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCFvcHRfc2lsZW50KSB7CisgICAgaWYgKCFwYXJhbXMtPnNpbGVudCkgewogICAgICAgICBwcmludGYoIiVzOiBkb25lXG4iLCBfX2Z1bmNfXyk7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgY29ubmVjdF9mb28odWludCByZXBlYXQpCi17CitzdGF0aWMgaW50IGNvbm5lY3RfZm9vKGNvbnN0IHN0cnVjdCB0aXBjX3Rlc3RfcGFyYW1zKiBwYXJhbXMpIHsKICAgICB1aW50IGk7CiAgICAgaW50IGZkOwogCi0gICAgaWYgKCFvcHRfc2lsZW50KSB7Ci0gICAgICAgIHByaW50ZigiJXM6IHJlcGVhdCA9ICV1XG4iLCBfX2Z1bmNfXywgcmVwZWF0KTsKKyAgICBpZiAoIXBhcmFtcy0+c2lsZW50KSB7CisgICAgICAgIHByaW50ZigiJXM6IHJlcGVhdCA9ICV1XG4iLCBfX2Z1bmNfXywgcGFyYW1zLT5yZXBlYXQpOwogICAgIH0KIAotICAgIGZvciAoaSA9IDA7IGkgPCByZXBlYXQ7IGkrKykgewotICAgICAgICBmZCA9IHRpcGNfY29ubmVjdChkZXZfbmFtZSwgImZvbyIpOworICAgIGZvciAoaSA9IDA7IGkgPCBwYXJhbXMtPnJlcGVhdDsgaSsrKSB7CisgICAgICAgIGZkID0gdGlwY19jb25uZWN0KHBhcmFtcy0+ZGV2X25hbWUsICJmb28iKTsKICAgICAgICAgaWYgKGZkID49IDApIHsKICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic3VjY2VlZGVkIHRvIGNvbm5lY3QgdG8gJyVzJyBzZXJ2aWNlXG4iLCAiZm9vIik7CiAgICAgICAgICAgICB0aXBjX2Nsb3NlKGZkKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmICghb3B0X3NpbGVudCkgeworICAgIGlmICghcGFyYW1zLT5zaWxlbnQpIHsKICAgICAgICAgcHJpbnRmKCIlczogZG9uZVxuIiwgX19mdW5jX18pOwogICAgIH0KIAogICAgIHJldHVybiAwOwogfQogCi0KLXN0YXRpYyBpbnQgY2xvc2VyMV90ZXN0KHVpbnQgcmVwZWF0KQoteworc3RhdGljIGludCBjbG9zZXIxX3Rlc3QoY29uc3Qgc3RydWN0IHRpcGNfdGVzdF9wYXJhbXMqIHBhcmFtcykgewogICAgIHVpbnQgaTsKICAgICBpbnQgZmQ7CiAKLSAgICBpZiAoIW9wdF9zaWxlbnQpIHsKLSAgICAgICAgcHJpbnRmKCIlczogcmVwZWF0ID0gJXVcbiIsIF9fZnVuY19fLCByZXBlYXQpOworICAgIGlmICghcGFyYW1zLT5zaWxlbnQpIHsKKyAgICAgICAgcHJpbnRmKCIlczogcmVwZWF0ID0gJXVcbiIsIF9fZnVuY19fLCBwYXJhbXMtPnJlcGVhdCk7CiAgICAgfQogCi0gICAgZm9yIChpID0gMDsgaSA8IHJlcGVhdDsgaSsrKSB7Ci0gICAgICAgIGZkID0gdGlwY19jb25uZWN0KGRldl9uYW1lLCBjbG9zZXIxX25hbWUpOworICAgIGZvciAoaSA9IDA7IGkgPCBwYXJhbXMtPnJlcGVhdDsgaSsrKSB7CisgICAgICAgIGZkID0gdGlwY19jb25uZWN0KHBhcmFtcy0+ZGV2X25hbWUsIGNsb3NlcjFfbmFtZSk7CiAgICAgICAgIGlmIChmZCA8IDApIHsKICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGNvbm5lY3QgdG8gJyVzJyBzZXJ2aWNlXG4iLCAiY2xvc2VyMSIpOwogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFvcHRfc2lsZW50KSB7CisgICAgICAgIGlmICghcGFyYW1zLT5zaWxlbnQpIHsKICAgICAgICAgICAgIHByaW50ZigiJXM6IGNvbm5lY3RlZFxuIiwgX19mdW5jX18pOwogICAgICAgICB9CiAgICAgICAgIHRpcGNfY2xvc2UoZmQpOwogICAgIH0KIAotICAgIGlmICghb3B0X3NpbGVudCkgeworICAgIGlmICghcGFyYW1zLT5zaWxlbnQpIHsKICAgICAgICAgcHJpbnRmKCIlczogZG9uZVxuIiwgX19mdW5jX18pOwogICAgIH0KIAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGNsb3NlcjJfdGVzdCh1aW50IHJlcGVhdCkKLXsKK3N0YXRpYyBpbnQgY2xvc2VyMl90ZXN0KGNvbnN0IHN0cnVjdCB0aXBjX3Rlc3RfcGFyYW1zKiBwYXJhbXMpIHsKICAgICB1aW50IGk7CiAgICAgaW50IGZkOwogCi0gICAgaWYgKCFvcHRfc2lsZW50KSB7Ci0gICAgICAgIHByaW50ZigiJXM6IHJlcGVhdCA9ICV1XG4iLCBfX2Z1bmNfXywgcmVwZWF0KTsKKyAgICBpZiAoIXBhcmFtcy0+c2lsZW50KSB7CisgICAgICAgIHByaW50ZigiJXM6IHJlcGVhdCA9ICV1XG4iLCBfX2Z1bmNfXywgcGFyYW1zLT5yZXBlYXQpOwogICAgIH0KIAotICAgIGZvciAoaSA9IDA7IGkgPCByZXBlYXQ7IGkrKykgewotICAgICAgICBmZCA9IHRpcGNfY29ubmVjdChkZXZfbmFtZSwgY2xvc2VyMl9uYW1lKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGFyYW1zLT5yZXBlYXQ7IGkrKykgeworICAgICAgICBmZCA9IHRpcGNfY29ubmVjdChwYXJhbXMtPmRldl9uYW1lLCBjbG9zZXIyX25hbWUpOwogICAgICAgICBpZiAoZmQgPCAwKSB7Ci0gICAgICAgICAgICBpZiAoIW9wdF9zaWxlbnQpIHsKKyAgICAgICAgICAgIGlmICghcGFyYW1zLT5zaWxlbnQpIHsKICAgICAgICAgICAgICAgICBwcmludGYoImZhaWxlZCB0byBjb25uZWN0IHRvICclcycgc2VydmljZVxuIiwgImNsb3NlcjIiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKQEAgLTI4MiwzOCArMzI3LDM3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoIW9wdF9zaWxlbnQpIHsKKyAgICBpZiAoIXBhcmFtcy0+c2lsZW50KSB7CiAgICAgICAgIHByaW50ZigiJXM6IGRvbmVcbiIsIF9fZnVuY19fKTsKICAgICB9CiAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjbG9zZXIzX3Rlc3QodWludCByZXBlYXQpCi17CitzdGF0aWMgaW50IGNsb3NlcjNfdGVzdChjb25zdCBzdHJ1Y3QgdGlwY190ZXN0X3BhcmFtcyogcGFyYW1zKSB7CiAgICAgdWludCBpLCBqOwogICAgIHNzaXplX3QgcmM7CiAgICAgaW50IGZkWzRdOwogICAgIGNoYXIgYnVmWzY0XTsKIAotICAgIGlmICghb3B0X3NpbGVudCkgewotICAgICAgICBwcmludGYoIiVzOiByZXBlYXQgPSAldVxuIiwgX19mdW5jX18sIHJlcGVhdCk7CisgICAgaWYgKCFwYXJhbXMtPnNpbGVudCkgeworICAgICAgICBwcmludGYoIiVzOiByZXBlYXQgPSAldVxuIiwgX19mdW5jX18sIHBhcmFtcy0+cmVwZWF0KTsKICAgICB9CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgcmVwZWF0OyBpKyspIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGFyYW1zLT5yZXBlYXQ7IGkrKykgewogICAgICAgICAvKiBvcGVuIDQgY29ubmVjdGlvbnMgdG8gY2xvc2VyMyBzZXJ2aWNlICovCiAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKLSAgICAgICAgICAgIGZkW2pdID0gdGlwY19jb25uZWN0KGRldl9uYW1lLCBjbG9zZXIzX25hbWUpOworICAgICAgICAgICAgZmRbal0gPSB0aXBjX2Nvbm5lY3QocGFyYW1zLT5kZXZfbmFtZSwgY2xvc2VyM19uYW1lKTsKICAgICAgICAgICAgIGlmIChmZFtqXSA8IDApIHsKICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImZkWyVkXTogZmFpbGVkIHRvIGNvbm5lY3QgdG8gJyVzJyBzZXJ2aWNlXG4iLCBqLCAiY2xvc2VyMyIpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIW9wdF9zaWxlbnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXBhcmFtcy0+c2lsZW50KSB7CiAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXM6IGZkWyVkXT0lZDogY29ubmVjdGVkXG4iLCBfX2Z1bmNfXywgaiwgZmRbal0pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtZW1zZXQoYnVmLCBpICsgaiwgc2l6ZW9mKGJ1ZikpOwogICAgICAgICAgICAgICAgIHJjID0gd3JpdGUoZmRbal0sIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwogICAgICAgICAgICAgICAgIGlmIChyYyAhPSBzaXplb2YoYnVmKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdF9zaWxlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJhbXMtPnNpbGVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlczogZmRbJWRdPSVkOiB3cml0ZSByZXR1cm5lZCAgPSAlemRcbiIsIF9fZnVuY19fLCBqLCBmZFtqXSwgcmMpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHBlcnJvcigiY2xvc2VyM190ZXN0OiB3cml0ZSIpOwpAQCAtMzI5LDcgKzM3Myw3IEBACiAgICAgICAgICAgICBpZiAoZmRbal0gPCAwKSBjb250aW51ZTsKICAgICAgICAgICAgIHJjID0gd3JpdGUoZmRbal0sIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwogICAgICAgICAgICAgaWYgKHJjICE9IHNpemVvZihidWYpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFvcHRfc2lsZW50KSB7CisgICAgICAgICAgICAgICAgaWYgKCFwYXJhbXMtPnNpbGVudCkgewogICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzOiBmZFslZF09JWQ6IHdyaXRlIHJldHVybmVkID0gJXpkXG4iLCBfX2Z1bmNfXywgaiwgZmRbal0sIHJjKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcGVycm9yKCJjbG9zZXIzX3Rlc3Q6IHdyaXRlIik7CkBAIC0zNDQsMzggKzM4OCwzNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCFvcHRfc2lsZW50KSB7CisgICAgaWYgKCFwYXJhbXMtPnNpbGVudCkgewogICAgICAgICBwcmludGYoIiVzOiBkb25lXG4iLCBfX2Z1bmNfXyk7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIGludCBlY2hvX3Rlc3QodWludCByZXBlYXQsIHVpbnQgbXNnc3osIGJvb2wgdmFyKQoteworc3RhdGljIGludCBlY2hvX3Rlc3QoY29uc3Qgc3RydWN0IHRpcGNfdGVzdF9wYXJhbXMqIHBhcmFtcykgewogICAgIHVpbnQgaTsKICAgICBzc2l6ZV90IHJjOwogICAgIHNpemVfdCBtc2dfbGVuOwogICAgIGludCBlY2hvX2ZkID0gLTE7Ci0gICAgY2hhciB0eF9idWZbbXNnc3pdOwotICAgIGNoYXIgcnhfYnVmW21zZ3N6XTsKKyAgICBjaGFyIHR4X2J1ZltwYXJhbXMtPm1zZ3NpemVdOworICAgIGNoYXIgcnhfYnVmW3BhcmFtcy0+bXNnc2l6ZV07CiAKLSAgICBpZiAoIW9wdF9zaWxlbnQpIHsKLSAgICAgICAgcHJpbnRmKCIlczogcmVwZWF0ICV1OiBtc2dzeiAldTogdmFyaWFibGUgJXNcbiIsIF9fZnVuY19fLCByZXBlYXQsIG1zZ3N6LAotICAgICAgICAgICAgICAgdmFyID8gInRydWUiIDogImZhbHNlIik7CisgICAgaWYgKCFwYXJhbXMtPnNpbGVudCkgeworICAgICAgICBwcmludGYoIiVzOiByZXBlYXQgJXU6IHBhcmFtcy0+bXNnc2l6ZSAldTogdmFyaWFibGUgJXNcbiIsIF9fZnVuY19fLCBwYXJhbXMtPnJlcGVhdCwKKyAgICAgICAgICAgICAgIHBhcmFtcy0+bXNnc2l6ZSwgcGFyYW1zLT52YXJpYWJsZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwogICAgIH0KIAotICAgIGVjaG9fZmQgPSB0aXBjX2Nvbm5lY3QoZGV2X25hbWUsIGVjaG9fbmFtZSk7CisgICAgZWNob19mZCA9IHRpcGNfY29ubmVjdChwYXJhbXMtPmRldl9uYW1lLCBlY2hvX25hbWUpOwogICAgIGlmIChlY2hvX2ZkIDwgMCkgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBjb25uZWN0IHRvIHNlcnZpY2VcbiIpOwogICAgICAgICByZXR1cm4gZWNob19mZDsKICAgICB9CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgcmVwZWF0OyBpKyspIHsKLSAgICAgICAgbXNnX2xlbiA9IG1zZ3N6OwotICAgICAgICBpZiAob3B0X3ZhcmlhYmxlICYmIG1zZ3N6KSB7Ci0gICAgICAgICAgICBtc2dfbGVuID0gcmFuZCgpICUgbXNnc3o7CisgICAgZm9yIChpID0gMDsgaSA8IHBhcmFtcy0+cmVwZWF0OyBpKyspIHsKKyAgICAgICAgbXNnX2xlbiA9IHBhcmFtcy0+bXNnc2l6ZTsKKyAgICAgICAgaWYgKHBhcmFtcy0+dmFyaWFibGUgJiYgcGFyYW1zLT5tc2dzaXplKSB7CisgICAgICAgICAgICBtc2dfbGVuID0gcmFuZCgpICUgcGFyYW1zLT5tc2dzaXplOwogICAgICAgICB9CiAKICAgICAgICAgbWVtc2V0KHR4X2J1ZiwgaSArIDEsIG1zZ19sZW4pOwpAQCAtNDA1LDM3ICs0NDcsMzcgQEAKIAogICAgIHRpcGNfY2xvc2UoZWNob19mZCk7CiAKLSAgICBpZiAoIW9wdF9zaWxlbnQpIHsKKyAgICBpZiAoIXBhcmFtcy0+c2lsZW50KSB7CiAgICAgICAgIHByaW50ZigiJXM6IGRvbmVcbiIsIF9fZnVuY19fKTsKICAgICB9CiAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBidXJzdF93cml0ZV90ZXN0KHVpbnQgcmVwZWF0LCB1aW50IG1zZ2J1cnN0LCB1aW50IG1zZ3N6LCBib29sIHZhcikKLXsKK3N0YXRpYyBpbnQgYnVyc3Rfd3JpdGVfdGVzdChjb25zdCBzdHJ1Y3QgdGlwY190ZXN0X3BhcmFtcyogcGFyYW1zKSB7CiAgICAgaW50IGZkOwogICAgIHVpbnQgaSwgajsKICAgICBzc2l6ZV90IHJjOwogICAgIHNpemVfdCBtc2dfbGVuOwotICAgIGNoYXIgdHhfYnVmW21zZ3N6XTsKKyAgICBjaGFyIHR4X2J1ZltwYXJhbXMtPm1zZ3NpemVdOwogCi0gICAgaWYgKCFvcHRfc2lsZW50KSB7Ci0gICAgICAgIHByaW50ZigiJXM6IHJlcGVhdCAldTogYnVyc3QgJXU6IG1zZ3N6ICV1OiB2YXJpYWJsZSAlc1xuIiwgX19mdW5jX18sIHJlcGVhdCwgbXNnYnVyc3QsCi0gICAgICAgICAgICAgICBtc2dzeiwgdmFyID8gInRydWUiIDogImZhbHNlIik7CisgICAgaWYgKCFwYXJhbXMtPnNpbGVudCkgeworICAgICAgICBwcmludGYoIiVzOiByZXBlYXQgJXU6IGJ1cnN0ICV1OiBwYXJhbXMtPm1zZ3NpemUgJXU6IHZhcmlhYmxlICVzXG4iLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgIHBhcmFtcy0+cmVwZWF0LCBwYXJhbXMtPm1zZ2J1cnN0LCBwYXJhbXMtPm1zZ3NpemUsCisgICAgICAgICAgICAgICBwYXJhbXMtPnZhcmlhYmxlID8gInRydWUiIDogImZhbHNlIik7CiAgICAgfQogCi0gICAgZm9yIChpID0gMDsgaSA8IHJlcGVhdDsgaSsrKSB7Ci0gICAgICAgIGZkID0gdGlwY19jb25uZWN0KGRldl9uYW1lLCBkYXRhc2lua19uYW1lKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGFyYW1zLT5yZXBlYXQ7IGkrKykgeworICAgICAgICBmZCA9IHRpcGNfY29ubmVjdChwYXJhbXMtPmRldl9uYW1lLCBkYXRhc2lua19uYW1lKTsKICAgICAgICAgaWYgKGZkIDwgMCkgewogICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gY29ubmVjdCB0byAnJXMnIHNlcnZpY2VcbiIsICJkYXRhc2luayIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBmb3IgKGogPSAwOyBqIDwgbXNnYnVyc3Q7IGorKykgewotICAgICAgICAgICAgbXNnX2xlbiA9IG1zZ3N6OwotICAgICAgICAgICAgaWYgKHZhciAmJiBtc2dzeikgewotICAgICAgICAgICAgICAgIG1zZ19sZW4gPSByYW5kKCkgJSBtc2dzejsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHBhcmFtcy0+bXNnYnVyc3Q7IGorKykgeworICAgICAgICAgICAgbXNnX2xlbiA9IHBhcmFtcy0+bXNnc2l6ZTsKKyAgICAgICAgICAgIGlmIChwYXJhbXMtPnZhcmlhYmxlICYmIHBhcmFtcy0+bXNnc2l6ZSkgeworICAgICAgICAgICAgICAgIG1zZ19sZW4gPSByYW5kKCkgJSBwYXJhbXMtPm1zZ3NpemU7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1lbXNldCh0eF9idWYsIGkgKyAxLCBtc2dfbGVuKTsKQEAgLTQ0OSwyMyArNDkxLDIxIEBACiAgICAgICAgIHRpcGNfY2xvc2UoZmQpOwogICAgIH0KIAotICAgIGlmICghb3B0X3NpbGVudCkgeworICAgIGlmICghcGFyYW1zLT5zaWxlbnQpIHsKICAgICAgICAgcHJpbnRmKCIlczogZG9uZVxuIiwgX19mdW5jX18pOwogICAgIH0KIAogICAgIHJldHVybiAwOwogfQogCi0KLXN0YXRpYyBpbnQgX3dhaXRfZm9yX21zZyhpbnQgZmQsIHVpbnQgbXNnc3osIGludCB0aW1lb3V0KQoteworc3RhdGljIGludCBfd2FpdF9mb3JfbXNnKGludCBmZCwgaW50IHRpbWVvdXQsIGNvbnN0IHN0cnVjdCB0aXBjX3Rlc3RfcGFyYW1zKiBwYXJhbXMpIHsKICAgICBpbnQgcmM7CiAgICAgZmRfc2V0IHJmZHM7CiAgICAgdWludCBtc2djbnQgPSAwOwotICAgIGNoYXIgcnhfYnVmW21zZ3N6XTsKKyAgICBjaGFyIHJ4X2J1ZltwYXJhbXMtPm1zZ3NpemVdOwogICAgIHN0cnVjdCB0aW1ldmFsIHR2OwogCi0gICAgaWYgKCFvcHRfc2lsZW50KSB7CisgICAgaWYgKCFwYXJhbXMtPnNpbGVudCkgewogICAgICAgICBwcmludGYoIndhaXRpbmcgKCVkKSBmb3IgbXNnXG4iLCB0aW1lb3V0KTsKICAgICB9CiAKQEAgLTQ3OSw3ICs1MTksNyBAQAogICAgICAgICByYyA9IHNlbGVjdChmZCArIDEsICZyZmRzLCBOVUxMLCBOVUxMLCAmdHYpOwogCiAgICAgICAgIGlmIChyYyA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAoIW9wdF9zaWxlbnQpIHsKKyAgICAgICAgICAgIGlmICghcGFyYW1zLT5zaWxlbnQpIHsKICAgICAgICAgICAgICAgICBwcmludGYoInNlbGVjdCB0aW1lZG91dFxuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTUwMSw0MiArNTQxLDQwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoIW9wdF9zaWxlbnQpIHsKKyAgICBpZiAoIXBhcmFtcy0+c2lsZW50KSB7CiAgICAgICAgIHByaW50ZigiZ290ICV1IG1lc3NhZ2VzXG4iLCBtc2djbnQpOwogICAgIH0KIAogICAgIHJldHVybiAwOwogfQogCi0KLXN0YXRpYyBpbnQgc2VsZWN0X3Rlc3QodWludCByZXBlYXQsIHVpbnQgbXNnYnVyc3QsIHVpbnQgbXNnc3opCi17CitzdGF0aWMgaW50IHNlbGVjdF90ZXN0KGNvbnN0IHN0cnVjdCB0aXBjX3Rlc3RfcGFyYW1zKiBwYXJhbXMpIHsKICAgICBpbnQgZmQ7CiAgICAgdWludCBpLCBqOwogICAgIHNzaXplX3QgcmM7Ci0gICAgY2hhciB0eF9idWZbbXNnc3pdOworICAgIGNoYXIgdHhfYnVmW3BhcmFtcy0+bXNnc2l6ZV07CiAKLSAgICBpZiAoIW9wdF9zaWxlbnQpIHsKLSAgICAgICAgcHJpbnRmKCIlczogcmVwZWF0ICV1XG4iLCBfX2Z1bmNfXywgcmVwZWF0KTsKKyAgICBpZiAoIXBhcmFtcy0+c2lsZW50KSB7CisgICAgICAgIHByaW50ZigiJXM6IHJlcGVhdCAldVxuIiwgX19mdW5jX18sIHBhcmFtcy0+cmVwZWF0KTsKICAgICB9CiAKLSAgICBmZCA9IHRpcGNfY29ubmVjdChkZXZfbmFtZSwgZWNob19uYW1lKTsKKyAgICBmZCA9IHRpcGNfY29ubmVjdChwYXJhbXMtPmRldl9uYW1lLCBlY2hvX25hbWUpOwogICAgIGlmIChmZCA8IDApIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gY29ubmVjdCB0byAnJXMnIHNlcnZpY2VcbiIsICJlY2hvIik7CiAgICAgICAgIHJldHVybiBmZDsKICAgICB9CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgcmVwZWF0OyBpKyspIHsKLSAgICAgICAgX3dhaXRfZm9yX21zZyhmZCwgbXNnc3osIDEpOworICAgIGZvciAoaSA9IDA7IGkgPCBwYXJhbXMtPnJlcGVhdDsgaSsrKSB7CisgICAgICAgIF93YWl0X2Zvcl9tc2coZmQsIDEsIHBhcmFtcyk7CiAKLSAgICAgICAgaWYgKCFvcHRfc2lsZW50KSB7Ci0gICAgICAgICAgICBwcmludGYoInNlbmRpbmcgYnVyc3Q6ICV1IG1zZ1xuIiwgbXNnYnVyc3QpOworICAgICAgICBpZiAoIXBhcmFtcy0+c2lsZW50KSB7CisgICAgICAgICAgICBwcmludGYoInNlbmRpbmcgYnVyc3Q6ICV1IG1zZ1xuIiwgcGFyYW1zLT5tc2didXJzdCk7CiAgICAgICAgIH0KIAotICAgICAgICBmb3IgKGogPSAwOyBqIDwgbXNnYnVyc3Q7IGorKykgewotICAgICAgICAgICAgbWVtc2V0KHR4X2J1ZiwgaSArIGosIG1zZ3N6KTsKLSAgICAgICAgICAgIHJjID0gd3JpdGUoZmQsIHR4X2J1ZiwgbXNnc3opOwotICAgICAgICAgICAgaWYgKChzaXplX3QpcmMgIT0gbXNnc3opIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHBhcmFtcy0+bXNnYnVyc3Q7IGorKykgeworICAgICAgICAgICAgbWVtc2V0KHR4X2J1ZiwgaSArIGosIHBhcmFtcy0+bXNnc2l6ZSk7CisgICAgICAgICAgICByYyA9IHdyaXRlKGZkLCB0eF9idWYsIHBhcmFtcy0+bXNnc2l6ZSk7CisgICAgICAgICAgICBpZiAoKHNpemVfdClyYyAhPSBwYXJhbXMtPm1zZ3NpemUpIHsKICAgICAgICAgICAgICAgICBwZXJyb3IoImJ1cnN0X3Rlc3Q6IHdyaXRlIik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC01NDUsMzcgKzU4MywzNiBAQAogCiAgICAgdGlwY19jbG9zZShmZCk7CiAKLSAgICBpZiAoIW9wdF9zaWxlbnQpIHsKKyAgICBpZiAoIXBhcmFtcy0+c2lsZW50KSB7CiAgICAgICAgIHByaW50ZigiJXM6IGRvbmVcbiIsIF9fZnVuY19fKTsKICAgICB9CiAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBibG9ja2VkX3JlYWRfdGVzdCh1aW50IHJlcGVhdCkKLXsKK3N0YXRpYyBpbnQgYmxvY2tlZF9yZWFkX3Rlc3QoY29uc3Qgc3RydWN0IHRpcGNfdGVzdF9wYXJhbXMqIHBhcmFtcykgewogICAgIGludCBmZDsKICAgICB1aW50IGk7CiAgICAgc3NpemVfdCByYzsKICAgICBjaGFyIHJ4X2J1Zls1MTJdOwogCi0gICAgaWYgKCFvcHRfc2lsZW50KSB7Ci0gICAgICAgIHByaW50ZigiJXM6IHJlcGVhdCAldVxuIiwgX19mdW5jX18sIHJlcGVhdCk7CisgICAgaWYgKCFwYXJhbXMtPnNpbGVudCkgeworICAgICAgICBwcmludGYoIiVzOiByZXBlYXQgJXVcbiIsIF9fZnVuY19fLCBwYXJhbXMtPnJlcGVhdCk7CiAgICAgfQogCi0gICAgZmQgPSB0aXBjX2Nvbm5lY3QoZGV2X25hbWUsIGVjaG9fbmFtZSk7CisgICAgZmQgPSB0aXBjX2Nvbm5lY3QocGFyYW1zLT5kZXZfbmFtZSwgZWNob19uYW1lKTsKICAgICBpZiAoZmQgPCAwKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGNvbm5lY3QgdG8gJyVzJyBzZXJ2aWNlXG4iLCAiZWNobyIpOwogICAgICAgICByZXR1cm4gZmQ7CiAgICAgfQogCi0gICAgZm9yIChpID0gMDsgaSA8IHJlcGVhdDsgaSsrKSB7CisgICAgZm9yIChpID0gMDsgaSA8IHBhcmFtcy0+cmVwZWF0OyBpKyspIHsKICAgICAgICAgcmMgPSByZWFkKGZkLCByeF9idWYsIHNpemVvZihyeF9idWYpKTsKICAgICAgICAgaWYgKHJjIDwgMCkgewogICAgICAgICAgICAgcGVycm9yKCJzZWxlY3RfdGVzdDogcmVhZCIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIW9wdF9zaWxlbnQpIHsKKyAgICAgICAgICAgIGlmICghcGFyYW1zLT5zaWxlbnQpIHsKICAgICAgICAgICAgICAgICBwcmludGYoImdvdCAlemQgYnl0ZXNcbiIsIHJjKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTgzLDE1ICs2MjAsMTQgQEAKIAogICAgIHRpcGNfY2xvc2UoZmQpOwogCi0gICAgaWYgKCFvcHRfc2lsZW50KSB7CisgICAgaWYgKCFwYXJhbXMtPnNpbGVudCkgewogICAgICAgICBwcmludGYoIiVzOiBkb25lXG4iLCBfX2Z1bmNfXyk7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdGEydGFfaXBjX3Rlc3Qodm9pZCkKLXsKK3N0YXRpYyBpbnQgdGEydGFfaXBjX3Rlc3QoY29uc3Qgc3RydWN0IHRpcGNfdGVzdF9wYXJhbXMqIHBhcmFtcykgewogICAgIGVudW0gdGVzdF9tZXNzYWdlX2hlYWRlciB7CiAgICAgICAgIFRFU1RfUEFTU0VEID0gMCwKICAgICAgICAgVEVTVF9GQUlMRUQgPSAxLApAQCAtNjAzLDExICs2MzksMTEgQEAKICAgICBpbnQgcmV0OwogICAgIHVuc2lnbmVkIGNoYXIgcnhfYnVmWzI1Nl07CiAKLSAgICBpZiAoIW9wdF9zaWxlbnQpIHsKKyAgICBpZiAoIXBhcmFtcy0+c2lsZW50KSB7CiAgICAgICAgIHByaW50ZigiJXM6XG4iLCBfX2Z1bmNfXyk7CiAgICAgfQogCi0gICAgZmQgPSB0aXBjX2Nvbm5lY3QoZGV2X25hbWUsIG1haW5fY3RybF9uYW1lKTsKKyAgICBmZCA9IHRpcGNfY29ubmVjdChwYXJhbXMtPmRldl9uYW1lLCBtYWluX2N0cmxfbmFtZSk7CiAgICAgaWYgKGZkIDwgMCkgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBjb25uZWN0IHRvICclcycgc2VydmljZVxuIiwgIm1haW5fY3RybCIpOwogICAgICAgICByZXR1cm4gZmQ7CkBAIC02NTcsMTMgKzY5MywxMiBAQAogICAgICAgICAgICB1dWlkLT5jbG9ja19zZXFfYW5kX25vZGVbN10pOwogfQogCi1zdGF0aWMgaW50IGRldl91dWlkX3Rlc3Qodm9pZCkKLXsKK3N0YXRpYyBpbnQgZGV2X3V1aWRfdGVzdChjb25zdCBzdHJ1Y3QgdGlwY190ZXN0X3BhcmFtcyogcGFyYW1zKSB7CiAgICAgaW50IGZkOwogICAgIHNzaXplX3QgcmM7CiAgICAgdXVpZF90IHV1aWQ7CiAKLSAgICBmZCA9IHRpcGNfY29ubmVjdChkZXZfbmFtZSwgdXVpZF9uYW1lKTsKKyAgICBmZCA9IHRpcGNfY29ubmVjdChwYXJhbXMtPmRldl9uYW1lLCB1dWlkX25hbWUpOwogICAgIGlmIChmZCA8IDApIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gY29ubmVjdCB0byAnJXMnIHNlcnZpY2VcbiIsICJ1dWlkIik7CiAgICAgICAgIHJldHVybiBmZDsKQEAgLTY3Niw3ICs3MTEsNyBAQAogICAgIH0gZWxzZSBpZiAocmMgIT0gc2l6ZW9mKHV1aWQpKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5leHBlY3RlZCB1dWlkIHNpemUgKCVkIHZzLiAlZClcbiIsIChpbnQpcmMsIChpbnQpc2l6ZW9mKHV1aWQpKTsKICAgICB9IGVsc2UgewotICAgICAgICBwcmludF91dWlkKGRldl9uYW1lLCAmdXVpZCk7CisgICAgICAgIHByaW50X3V1aWQocGFyYW1zLT5kZXZfbmFtZSwgJnV1aWQpOwogICAgIH0KIAogICAgIHRpcGNfY2xvc2UoZmQpOwpAQCAtNjg0LDYxICs3MTksNTggQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0YV9hY2Nlc3NfdGVzdCh2b2lkKQoteworc3RhdGljIGludCB0YV9hY2Nlc3NfdGVzdChjb25zdCBzdHJ1Y3QgdGlwY190ZXN0X3BhcmFtcyogcGFyYW1zKSB7CiAgICAgaW50IGZkOwogCi0gICAgaWYgKCFvcHRfc2lsZW50KSB7CisgICAgaWYgKCFwYXJhbXMtPnNpbGVudCkgewogICAgICAgICBwcmludGYoIiVzOlxuIiwgX19mdW5jX18pOwogICAgIH0KIAotICAgIGZkID0gdGlwY19jb25uZWN0KGRldl9uYW1lLCB0YV9vbmx5X25hbWUpOworICAgIGZkID0gdGlwY19jb25uZWN0KHBhcmFtcy0+ZGV2X25hbWUsIHRhX29ubHlfbmFtZSk7CiAgICAgaWYgKGZkID49IDApIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJTdWNjZWVkIHRvIGNvbm5lY3QgdG8gJyVzJyBzZXJ2aWNlXG4iLCAidGFfb25seSIpOwogICAgICAgICB0aXBjX2Nsb3NlKGZkKTsKICAgICB9CiAKLSAgICBmZCA9IHRpcGNfY29ubmVjdChkZXZfbmFtZSwgbnNfb25seV9uYW1lKTsKKyAgICBmZCA9IHRpcGNfY29ubmVjdChwYXJhbXMtPmRldl9uYW1lLCBuc19vbmx5X25hbWUpOwogICAgIGlmIChmZCA8IDApIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gY29ubmVjdCB0byAnJXMnIHNlcnZpY2VcbiIsICJuc19vbmx5Iik7CiAgICAgICAgIHJldHVybiBmZDsKICAgICB9CiAgICAgdGlwY19jbG9zZShmZCk7CiAKLSAgICBpZiAoIW9wdF9zaWxlbnQpIHsKKyAgICBpZiAoIXBhcmFtcy0+c2lsZW50KSB7CiAgICAgICAgIHByaW50ZigiJXM6IGRvbmVcbiIsIF9fZnVuY19fKTsKICAgICB9CiAKICAgICByZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgaW50IHdyaXRldl90ZXN0KHVpbnQgcmVwZWF0LCB1aW50IG1zZ3N6LCBib29sIHZhcikKLXsKK3N0YXRpYyBpbnQgd3JpdGV2X3Rlc3QoY29uc3Qgc3RydWN0IHRpcGNfdGVzdF9wYXJhbXMqIHBhcmFtcykgewogICAgIHVpbnQgaTsKICAgICBzc2l6ZV90IHJjOwogICAgIHNpemVfdCBtc2dfbGVuOwogICAgIGludCBlY2hvX2ZkID0gLTE7Ci0gICAgY2hhciB0eDBfYnVmW21zZ3N6XTsKLSAgICBjaGFyIHR4MV9idWZbbXNnc3pdOwotICAgIGNoYXIgcnhfYnVmW21zZ3N6XTsKKyAgICBjaGFyIHR4MF9idWZbcGFyYW1zLT5tc2dzaXplXTsKKyAgICBjaGFyIHR4MV9idWZbcGFyYW1zLT5tc2dzaXplXTsKKyAgICBjaGFyIHJ4X2J1ZltwYXJhbXMtPm1zZ3NpemVdOwogICAgIHN0cnVjdCBpb3ZlYyBpb3ZzWzJdID0ge3t0eDBfYnVmLCAwfSwge3R4MV9idWYsIDB9fTsKIAotICAgIGlmICghb3B0X3NpbGVudCkgewotICAgICAgICBwcmludGYoIiVzOiByZXBlYXQgJXU6IG1zZ3N6ICV1OiB2YXJpYWJsZSAlc1xuIiwgX19mdW5jX18sIHJlcGVhdCwgbXNnc3osCi0gICAgICAgICAgICAgICB2YXIgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICBpZiAoIXBhcmFtcy0+c2lsZW50KSB7CisgICAgICAgIHByaW50ZigiJXM6IHJlcGVhdCAldTogcGFyYW1zLT5tc2dzaXplICV1OiB2YXJpYWJsZSAlc1xuIiwgX19mdW5jX18sIHBhcmFtcy0+cmVwZWF0LAorICAgICAgICAgICAgICAgcGFyYW1zLT5tc2dzaXplLCBwYXJhbXMtPnZhcmlhYmxlID8gInRydWUiIDogImZhbHNlIik7CiAgICAgfQogCi0gICAgZWNob19mZCA9IHRpcGNfY29ubmVjdChkZXZfbmFtZSwgZWNob19uYW1lKTsKKyAgICBlY2hvX2ZkID0gdGlwY19jb25uZWN0KHBhcmFtcy0+ZGV2X25hbWUsIGVjaG9fbmFtZSk7CiAgICAgaWYgKGVjaG9fZmQgPCAwKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGNvbm5lY3QgdG8gc2VydmljZVxuIik7CiAgICAgICAgIHJldHVybiBlY2hvX2ZkOwogICAgIH0KIAotICAgIGZvciAoaSA9IDA7IGkgPCByZXBlYXQ7IGkrKykgewotICAgICAgICBtc2dfbGVuID0gbXNnc3o7Ci0gICAgICAgIGlmIChvcHRfdmFyaWFibGUgJiYgbXNnc3opIHsKLSAgICAgICAgICAgIG1zZ19sZW4gPSByYW5kKCkgJSBtc2dzejsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGFyYW1zLT5yZXBlYXQ7IGkrKykgeworICAgICAgICBtc2dfbGVuID0gcGFyYW1zLT5tc2dzaXplOworICAgICAgICBpZiAocGFyYW1zLT52YXJpYWJsZSAmJiBwYXJhbXMtPm1zZ3NpemUpIHsKKyAgICAgICAgICAgIG1zZ19sZW4gPSByYW5kKCkgJSBwYXJhbXMtPm1zZ3NpemU7CiAgICAgICAgIH0KIAogICAgICAgICBpb3ZzWzBdLmlvdl9sZW4gPSBtc2dfbGVuIC8gMzsKQEAgLTc4NSwzOSArODE3LDM4IEBACiAKICAgICB0aXBjX2Nsb3NlKGVjaG9fZmQpOwogCi0gICAgaWYgKCFvcHRfc2lsZW50KSB7CisgICAgaWYgKCFwYXJhbXMtPnNpbGVudCkgewogICAgICAgICBwcmludGYoIiVzOiBkb25lXG4iLCBfX2Z1bmNfXyk7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcmVhZHZfdGVzdCh1aW50IHJlcGVhdCwgdWludCBtc2dzeiwgYm9vbCB2YXIpCi17CitzdGF0aWMgaW50IHJlYWR2X3Rlc3QoY29uc3Qgc3RydWN0IHRpcGNfdGVzdF9wYXJhbXMqIHBhcmFtcykgewogICAgIHVpbnQgaTsKICAgICBzc2l6ZV90IHJjOwogICAgIHNpemVfdCBtc2dfbGVuOwogICAgIGludCBlY2hvX2ZkID0gLTE7Ci0gICAgY2hhciB0eF9idWZbbXNnc3pdOwotICAgIGNoYXIgcngwX2J1Zlttc2dzel07Ci0gICAgY2hhciByeDFfYnVmW21zZ3N6XTsKKyAgICBjaGFyIHR4X2J1ZltwYXJhbXMtPm1zZ3NpemVdOworICAgIGNoYXIgcngwX2J1ZltwYXJhbXMtPm1zZ3NpemVdOworICAgIGNoYXIgcngxX2J1ZltwYXJhbXMtPm1zZ3NpemVdOwogICAgIHN0cnVjdCBpb3ZlYyBpb3ZzWzJdID0ge3tyeDBfYnVmLCAwfSwge3J4MV9idWYsIDB9fTsKIAotICAgIGlmICghb3B0X3NpbGVudCkgewotICAgICAgICBwcmludGYoIiVzOiByZXBlYXQgJXU6IG1zZ3N6ICV1OiB2YXJpYWJsZSAlc1xuIiwgX19mdW5jX18sIHJlcGVhdCwgbXNnc3osCi0gICAgICAgICAgICAgICB2YXIgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICBpZiAoIXBhcmFtcy0+c2lsZW50KSB7CisgICAgICAgIHByaW50ZigiJXM6IHJlcGVhdCAldTogcGFyYW1zLT5tc2dzaXplICV1OiB2YXJpYWJsZSAlc1xuIiwgX19mdW5jX18sIHBhcmFtcy0+cmVwZWF0LAorICAgICAgICAgICAgICAgcGFyYW1zLT5tc2dzaXplLCBwYXJhbXMtPnZhcmlhYmxlID8gInRydWUiIDogImZhbHNlIik7CiAgICAgfQogCi0gICAgZWNob19mZCA9IHRpcGNfY29ubmVjdChkZXZfbmFtZSwgZWNob19uYW1lKTsKKyAgICBlY2hvX2ZkID0gdGlwY19jb25uZWN0KHBhcmFtcy0+ZGV2X25hbWUsIGVjaG9fbmFtZSk7CiAgICAgaWYgKGVjaG9fZmQgPCAwKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGNvbm5lY3QgdG8gc2VydmljZVxuIik7CiAgICAgICAgIHJldHVybiBlY2hvX2ZkOwogICAgIH0KIAotICAgIGZvciAoaSA9IDA7IGkgPCByZXBlYXQ7IGkrKykgewotICAgICAgICBtc2dfbGVuID0gbXNnc3o7Ci0gICAgICAgIGlmIChvcHRfdmFyaWFibGUgJiYgbXNnc3opIHsKLSAgICAgICAgICAgIG1zZ19sZW4gPSByYW5kKCkgJSBtc2dzejsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGFyYW1zLT5yZXBlYXQ7IGkrKykgeworICAgICAgICBtc2dfbGVuID0gcGFyYW1zLT5tc2dzaXplOworICAgICAgICBpZiAocGFyYW1zLT52YXJpYWJsZSAmJiBwYXJhbXMtPm1zZ3NpemUpIHsKKyAgICAgICAgICAgIG1zZ19sZW4gPSByYW5kKCkgJSBwYXJhbXMtPm1zZ3NpemU7CiAgICAgICAgIH0KIAogICAgICAgICBpb3ZzWzBdLmlvdl9sZW4gPSBtc2dfbGVuIC8gMzsKQEAgLTg2NCwyMyArODk1LDIzIEBACiAKICAgICB0aXBjX2Nsb3NlKGVjaG9fZmQpOwogCi0gICAgaWYgKCFvcHRfc2lsZW50KSB7CisgICAgaWYgKCFwYXJhbXMtPnNpbGVudCkgewogICAgICAgICBwcmludGYoIiVzOiBkb25lXG4iLCBfX2Z1bmNfXyk7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2VuZF9mZF90ZXN0KHZvaWQpIHsKK3N0YXRpYyBpbnQgc2VuZF9mZF90ZXN0KGNvbnN0IHN0cnVjdCB0aXBjX3Rlc3RfcGFyYW1zKiBwYXJhbXMpIHsKICAgICBpbnQgcmV0OwogICAgIGludCBkbWFfYnVmID0gLTE7CiAgICAgaW50IGZkID0gLTE7CiAgICAgdm9sYXRpbGUgY2hhciogYnVmID0gTUFQX0ZBSUxFRDsKICAgICBCdWZmZXJBbGxvY2F0b3IqIGFsbG9jYXRvciA9IE5VTEw7CiAKLSAgICBjb25zdCBzaXplX3QgbnVtX3BhZ2VzID0gMTA7CisgICAgY29uc3Qgc2l6ZV90IG51bV9jaHVua3MgPSAxMDsKIAotICAgIGZkID0gdGlwY19jb25uZWN0KGRldl9uYW1lLCByZWNlaXZlcl9uYW1lKTsKKyAgICBmZCA9IHRpcGNfY29ubmVjdChwYXJhbXMtPmRldl9uYW1lLCByZWNlaXZlcl9uYW1lKTsKICAgICBpZiAoZmQgPCAwKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGNvbm5lY3QgdG8gdGVzdCBzdXBwb3J0IFRBIC0gaXMgaXQgbWlzc2luZz9cbiIpOwogICAgICAgICByZXQgPSAtMTsKQEAgLTg5NCw3ICs5MjUsNyBAQAogICAgICAgICBnb3RvIGNsZWFudXA7CiAgICAgfQogCi0gICAgc2l6ZV90IGJ1Zl9zaXplID0gUEFHRV9TSVpFICogbnVtX3BhZ2VzOworICAgIHNpemVfdCBidWZfc2l6ZSA9IG1lbXJlZl9jaHVua19zaXplICogbnVtX2NodW5rczsKICAgICBkbWFfYnVmID0gRG1hYnVmSGVhcEFsbG9jKGFsbG9jYXRvciwgInN5c3RlbSIsIGJ1Zl9zaXplLCAwLCAwIC8qIGxlZ2FjeSBhbGlnbiAqLyk7CiAgICAgaWYgKGRtYV9idWYgPCAwKSB7CiAgICAgICAgIHJldCA9IGRtYV9idWY7CkBAIC05MjcsMTMgKzk1OCwxNyBAQAogICAgIHRpcGNfY2xvc2UoZmQpOwogCiAgICAgcmV0ID0gMDsKLSAgICBmb3IgKHNpemVfdCBza2lwID0gMDsgc2tpcCA8IG51bV9wYWdlczsgc2tpcCsrKSB7Ci0gICAgICAgIHJldCB8PSBzdHJjbXAoIkhlbGxvIGZyb20gVHJ1c3R5ISIsIChjb25zdCBjaGFyKikmYnVmW3NraXAgKiBQQUdFX1NJWkVdKSA/ICgtMSkgOiAwOworICAgIGZvciAoc2l6ZV90IHNraXAgPSAwOyBza2lwIDwgbnVtX2NodW5rczsgc2tpcCsrKSB7CisgICAgICAgIGludCBjbXAgPSBzdHJjbXAoIkhlbGxvIGZyb20gVHJ1c3R5ISIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIqKSZidWZbc2tpcCAqIG1lbXJlZl9jaHVua19zaXplXSkgPyAoLTEpIDogMDsKKyAgICAgICAgaWYgKGNtcCkKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkOiBVbmV4cGVjdGVkIGNvbnRlbnQgYXQgcGFnZSAlenUgaW4gZG1hYnVmXG4iLCBza2lwKTsKKyAgICAgICAgcmV0IHw9IGNtcDsKICAgICB9CiAKIGNsZWFudXA6CiAgICAgaWYgKGJ1ZiAhPSBNQVBfRkFJTEVEKSB7Ci0gICAgICAgIG11bm1hcCgoY2hhciopYnVmLCBQQUdFX1NJWkUpOworICAgICAgICBtdW5tYXAoKGNoYXIqKWJ1ZiwgYnVmX3NpemUpOwogICAgIH0KICAgICBjbG9zZShkbWFfYnVmKTsKICAgICBpZiAoYWxsb2NhdG9yKSB7CkBAIC05NDMsNiArOTc4LDczIEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAordWludDY0X3QgZ2V0X3RpbWVfdXModm9pZCkgeworICAgIHN0cnVjdCB0aW1lc3BlYyBzcGVjOworCisgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZzcGVjKTsKKyAgICByZXR1cm4gc3BlYy50dl9zZWMgKiAxMDAwMDAwICsgc3BlYy50dl9uc2VjIC8gMTAwMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB0aXBjX3Rlc3RfZGVmIHRpcGNfdGVzdHNbXSA9IHsKKyAgICAgICAgeyJjb25uZWN0IiwgY29ubmVjdF90ZXN0fSwKKyAgICAgICAgeyJjb25uZWN0X2ZvbyIsIGNvbm5lY3RfZm9vfSwKKyAgICAgICAgeyJidXJzdF93cml0ZSIsIGJ1cnN0X3dyaXRlX3Rlc3R9LAorICAgICAgICB7InNlbGVjdCIsIHNlbGVjdF90ZXN0fSwKKyAgICAgICAgeyJibG9ja2VkX3JlYWQiLCBibG9ja2VkX3JlYWRfdGVzdH0sCisgICAgICAgIHsiY2xvc2VyMSIsIGNsb3NlcjFfdGVzdH0sCisgICAgICAgIHsiY2xvc2VyMiIsIGNsb3NlcjJfdGVzdH0sCisgICAgICAgIHsiY2xvc2VyMyIsIGNsb3NlcjNfdGVzdH0sCisgICAgICAgIHsiZWNobyIsIGVjaG9fdGVzdH0sCisgICAgICAgIHsidGEydGEtaXBjIiwgdGEydGFfaXBjX3Rlc3R9LAorICAgICAgICB7ImRldi11dWlkIiwgZGV2X3V1aWRfdGVzdH0sCisgICAgICAgIHsidGEtYWNjZXNzIiwgdGFfYWNjZXNzX3Rlc3R9LAorICAgICAgICB7IndyaXRldiIsIHdyaXRldl90ZXN0fSwKKyAgICAgICAgeyJyZWFkdiIsIHJlYWR2X3Rlc3R9LAorICAgICAgICB7InNlbmQtZmQiLCBzZW5kX2ZkX3Rlc3R9LAorfTsKKwordGlwY190ZXN0X2Z1bmNfdCBnZXRfdGVzdF9mdW5jdGlvbihjb25zdCBzdHJ1Y3QgdGlwY190ZXN0X3BhcmFtcyogcGFyYW1zKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YodGlwY190ZXN0cykgLyBzaXplb2YodGlwY190ZXN0c1swXSk7IGkrKykgeworICAgICAgICBpZiAoc3RyY21wKHBhcmFtcy0+dGVzdF9uYW1lLCB0aXBjX3Rlc3RzW2ldLnRlc3RfbmFtZSkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHRpcGNfdGVzdHNbaV0uZnVuYzsKKyAgICAgICAgfQorICAgIH0KKyAgICBmcHJpbnRmKHN0ZGVyciwgIlVucmVjb2duaXplZCB0ZXN0IG5hbWUgJyVzJ1xuIiwgcGFyYW1zLT50ZXN0X25hbWUpOworICAgIGV4aXQoMSk7Cit9CisKK3N0YXRpYyBpbnQgcnVuX2FzX2JlbmNoKGNvbnN0IHN0cnVjdCB0aXBjX3Rlc3RfcGFyYW1zKiBwYXJhbXMpIHsKKyAgICBpbnQgcmMgPSAwOworICAgIGludDY0X3QgbWluID0gSU5UNjRfTUFYOworICAgIGludDY0X3QgbWF4ID0gMDsKKyAgICBpbnQ2NF90IGF2ZyA9IDA7CisgICAgaW50NjRfdCBjb2xkID0gMDsKKworICAgIHVpbnQ2NF90IHN0YXJ0OworICAgIHVpbnQ2NF90IGVuZDsKKworICAgIHRpcGNfdGVzdF9mdW5jX3QgdGVzdCA9IGdldF90ZXN0X2Z1bmN0aW9uKHBhcmFtcyk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgKGkgPCBwYXJhbXMtPmJlbmNoICsgMSkgJiYgcmMgPT0gMDsgKytpKSB7CisgICAgICAgIHN0YXJ0ID0gZ2V0X3RpbWVfdXMoKTsKKyAgICAgICAgcmMgfD0gdGVzdChwYXJhbXMpOworICAgICAgICBlbmQgPSBnZXRfdGltZV91cygpOworICAgICAgICBpbnQ2NF90IHQgPSBlbmQgLSBzdGFydDsKKworICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICBjb2xkID0gdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1pbiA9ICh0IDwgbWluKSA/IHQgOiBtaW47CisgICAgICAgICAgICBtYXggPSAodCA+IG1heCkgPyB0IDogbWF4OworICAgICAgICAgICAgYXZnICs9IHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgYXZnIC89IHBhcmFtcy0+YmVuY2g7CisKKyAgICBwcmludGYoQkVOQ0hfUkVTVUxUX1RQTCwgcGFyYW1zLT50ZXN0X25hbWUsIG1pbiwgbWF4LCBhdmcsIGNvbGQsIG1pbiwgbWF4LCBhdmcsIGNvbGQpOworICAgIHJldHVybiByYzsKK30KKwogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewogICAgIGludCByYyA9IDA7CkBAIC05NTAsNTIgKzEwNTIsMjUgQEAKICAgICBpZiAoYXJnYyA8PSAxKSB7CiAgICAgICAgIHByaW50X3VzYWdlX2FuZF9leGl0KGFyZ3ZbMF0sIEVYSVRfRkFJTFVSRSwgZmFsc2UpOwogICAgIH0KKyAgICBzdHJ1Y3QgdGlwY190ZXN0X3BhcmFtcyBwYXJhbXM7CisgICAgaW5pdF9wYXJhbXMoJnBhcmFtcyk7CisgICAgcGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2LCAmcGFyYW1zKTsKIAotICAgIHBhcnNlX29wdGlvbnMoYXJnYywgYXJndik7Ci0KLSAgICBpZiAoIWRldl9uYW1lKSB7Ci0gICAgICAgIGRldl9uYW1lID0gVElQQ19ERUZBVUxUX0RFVk5BTUU7CisgICAgaWYgKCFwYXJhbXMuZGV2X25hbWUpIHsKKyAgICAgICAgcGFyYW1zLmRldl9uYW1lID0gVElQQ19ERUZBVUxUX0RFVk5BTUU7CiAgICAgfQogCi0gICAgaWYgKCF0ZXN0X25hbWUpIHsKKyAgICBpZiAoIXBhcmFtcy50ZXN0X25hbWUpIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJuZWVkIGEgVGVzdCB0byBydW5cbiIpOwogICAgICAgICBwcmludF91c2FnZV9hbmRfZXhpdChhcmd2WzBdLCBFWElUX0ZBSUxVUkUsIHRydWUpOwogICAgIH0KIAotICAgIGlmIChzdHJjbXAodGVzdF9uYW1lLCAiY29ubmVjdCIpID09IDApIHsKLSAgICAgICAgcmMgPSBjb25uZWN0X3Rlc3Qob3B0X3JlcGVhdCk7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAodGVzdF9uYW1lLCAiY29ubmVjdF9mb28iKSA9PSAwKSB7Ci0gICAgICAgIHJjID0gY29ubmVjdF9mb28ob3B0X3JlcGVhdCk7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAodGVzdF9uYW1lLCAiYnVyc3Rfd3JpdGUiKSA9PSAwKSB7Ci0gICAgICAgIHJjID0gYnVyc3Rfd3JpdGVfdGVzdChvcHRfcmVwZWF0LCBvcHRfbXNnYnVyc3QsIG9wdF9tc2dzaXplLCBvcHRfdmFyaWFibGUpOwotICAgIH0gZWxzZSBpZiAoc3RyY21wKHRlc3RfbmFtZSwgInNlbGVjdCIpID09IDApIHsKLSAgICAgICAgcmMgPSBzZWxlY3RfdGVzdChvcHRfcmVwZWF0LCBvcHRfbXNnYnVyc3QsIG9wdF9tc2dzaXplKTsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcCh0ZXN0X25hbWUsICJibG9ja2VkX3JlYWQiKSA9PSAwKSB7Ci0gICAgICAgIHJjID0gYmxvY2tlZF9yZWFkX3Rlc3Qob3B0X3JlcGVhdCk7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAodGVzdF9uYW1lLCAiY2xvc2VyMSIpID09IDApIHsKLSAgICAgICAgcmMgPSBjbG9zZXIxX3Rlc3Qob3B0X3JlcGVhdCk7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAodGVzdF9uYW1lLCAiY2xvc2VyMiIpID09IDApIHsKLSAgICAgICAgcmMgPSBjbG9zZXIyX3Rlc3Qob3B0X3JlcGVhdCk7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAodGVzdF9uYW1lLCAiY2xvc2VyMyIpID09IDApIHsKLSAgICAgICAgcmMgPSBjbG9zZXIzX3Rlc3Qob3B0X3JlcGVhdCk7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAodGVzdF9uYW1lLCAiZWNobyIpID09IDApIHsKLSAgICAgICAgcmMgPSBlY2hvX3Rlc3Qob3B0X3JlcGVhdCwgb3B0X21zZ3NpemUsIG9wdF92YXJpYWJsZSk7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAodGVzdF9uYW1lLCAidGEydGEtaXBjIikgPT0gMCkgewotICAgICAgICByYyA9IHRhMnRhX2lwY190ZXN0KCk7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAodGVzdF9uYW1lLCAiZGV2LXV1aWQiKSA9PSAwKSB7Ci0gICAgICAgIHJjID0gZGV2X3V1aWRfdGVzdCgpOwotICAgIH0gZWxzZSBpZiAoc3RyY21wKHRlc3RfbmFtZSwgInRhLWFjY2VzcyIpID09IDApIHsKLSAgICAgICAgcmMgPSB0YV9hY2Nlc3NfdGVzdCgpOwotICAgIH0gZWxzZSBpZiAoc3RyY21wKHRlc3RfbmFtZSwgIndyaXRldiIpID09IDApIHsKLSAgICAgICAgcmMgPSB3cml0ZXZfdGVzdChvcHRfcmVwZWF0LCBvcHRfbXNnc2l6ZSwgb3B0X3ZhcmlhYmxlKTsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcCh0ZXN0X25hbWUsICJyZWFkdiIpID09IDApIHsKLSAgICAgICAgcmMgPSByZWFkdl90ZXN0KG9wdF9yZXBlYXQsIG9wdF9tc2dzaXplLCBvcHRfdmFyaWFibGUpOwotICAgIH0gZWxzZSBpZiAoc3RyY21wKHRlc3RfbmFtZSwgInNlbmQtZmQiKSA9PSAwKSB7Ci0gICAgICAgIHJjID0gc2VuZF9mZF90ZXN0KCk7CisgICAgaWYgKHBhcmFtcy5iZW5jaCA+IDApIHsKKyAgICAgICAgcmMgPSBydW5fYXNfYmVuY2goJnBhcmFtcyk7CisgICAgICAgIHBhcmFtcy5iZW5jaCA9IDA7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbnJlY29nbml6ZWQgdGVzdCBuYW1lICclcydcbiIsIHRlc3RfbmFtZSk7Ci0gICAgICAgIHByaW50X3VzYWdlX2FuZF9leGl0KGFyZ3ZbMF0sIEVYSVRfRkFJTFVSRSwgdHJ1ZSk7CisgICAgICAgIHRpcGNfdGVzdF9mdW5jX3QgdGVzdCA9IGdldF90ZXN0X2Z1bmN0aW9uKCZwYXJhbXMpOworICAgICAgICByYyA9IHRlc3QoJnBhcmFtcyk7CiAgICAgfQotCiAgICAgcmV0dXJuIHJjID09IDAgPyBFWElUX1NVQ0NFU1MgOiBFWElUX0ZBSUxVUkU7CiB9CmRpZmYgLS1naXQgYS90cnVzdHkvbGlidHJ1c3R5L3RydXN0eS5jIGIvdHJ1c3R5L2xpYnRydXN0eS90cnVzdHkuYwppbmRleCBmNDRmOGI0Li42MzI2MmEwIDEwMDY0NAotLS0gYS90cnVzdHkvbGlidHJ1c3R5L3RydXN0eS5jCisrKyBiL3RydXN0eS9saWJ0cnVzdHkvdHJ1c3R5LmMKQEAgLTIzLDE2ICsyMywxNjEgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3Vpby5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCisjaW5jbHVkZSA8bGludXgvdm1fc29ja2V0cy5oPiAvKiBtdXN0IGJlIGFmdGVyIHN5cy9zb2NrZXQuaCAqLwogI2luY2x1ZGUgPGxvZy9sb2cuaD4KIAogI2luY2x1ZGUgPHRydXN0eS9pcGMuaD4KIAorc3RhdGljIGNvbnN0IGNoYXIqIHN0cmlwX3ByZWZpeChjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqIHByZWZpeCkgeworICAgIHNpemVfdCBwcmVmaXhfbGVuID0gc3RybGVuKHByZWZpeCk7CisgICAgaWYgKHN0cm5jbXAoc3RyLCBwcmVmaXgsIHByZWZpeF9sZW4pID09IDApIHsKKyAgICAgICAgcmV0dXJuIHN0ciArIHByZWZpeF9sZW47CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorfQorCitzdGF0aWMgYm9vbCB1c2VfdnNvY2tfY29ubmVjdGlvbiA9IGZhbHNlOworc3RhdGljIGludCB0aXBjX3Zzb2NrX2Nvbm5lY3QoY29uc3QgY2hhciogdHlwZV9jaWRfcG9ydF9zdHIsIGNvbnN0IGNoYXIqIHNydl9uYW1lKSB7CisgICAgaW50IHJldDsKKyAgICBjb25zdCBjaGFyKiBjaWRfcG9ydF9zdHI7CisgICAgY2hhciogcG9ydF9zdHI7CisgICAgY2hhciogZW5kX3N0cjsKKyAgICBpbnQgc29ja2V0X3R5cGU7CisgICAgaWYgKChjaWRfcG9ydF9zdHIgPSBzdHJpcF9wcmVmaXgodHlwZV9jaWRfcG9ydF9zdHIsICJTVFJFQU06IikpKSB7CisgICAgICAgIHNvY2tldF90eXBlID0gU09DS19TVFJFQU07CisgICAgfSBlbHNlIGlmICgoY2lkX3BvcnRfc3RyID0gc3RyaXBfcHJlZml4KHR5cGVfY2lkX3BvcnRfc3RyLCAiU0VRUEFDS0VUOiIpKSkgeworICAgICAgICBzb2NrZXRfdHlwZSA9IFNPQ0tfU0VRUEFDS0VUOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qCisgICAgICAgICAqIERlZmF1bHQgdG8gU09DS19TVFJFQU0gaWYgbmVpdGhlciB0eXBlIGlzIHNwZWNpZmllZC4KKyAgICAgICAgICoKKyAgICAgICAgICogVE9ETzogdXNlIFNPQ0tfU0VRUEFDS0VUIGJ5IGRlZmF1bHQgaW5zdGVhZCBvZiBTT0NLX1NUUkVBTSB3aGVuIFNPQ0tfU0VRUEFDS0VUIGlzIGZ1bGx5CisgICAgICAgICAqIHN1cHBvcnRlZCBzaW5jZSBpdCBtYXRjaGVzIHRpcGMgYmV0dGVyLiBBdCB0aGUgbW9tZW50IFNPQ0tfU0VRUEFDS0VUIGlzIG5vdCBzdXBwb3J0ZWQgYnkKKyAgICAgICAgICogY3Jvc3ZtLiBJdCBpcyBhbHNvIHNpZ25pZmljYW50bHkgc2xvd2VyIHNpbmNlIHRoZSBMaW51eCBrZXJuZWwgaW1wbGVtZW50YXRpb24gKGFzIG9mCisgICAgICAgICAqIHY2LjctcmMxKSBzZW5kcyBjcmVkaXQgdXBkYXRlIHBhY2tldHMgZXZlcnkgdGltZSBpdCByZWNlaXZlcyBhIGRhdGEgcGFja2V0IHdoaWxlIHRoZQorICAgICAgICAgKiBTT0NLX1NUUkVBTSB2ZXJzaW9uIHNraXBzIHRoZXNlIHVubGVzcyB0aGUgcmVtYWluaW5nIGJ1ZmZlciBzcGFjZSBpcyAibG93Ii4KKyAgICAgICAgICovCisgICAgICAgIHNvY2tldF90eXBlID0gU09DS19TVFJFQU07CisgICAgICAgIGNpZF9wb3J0X3N0ciA9IHR5cGVfY2lkX3BvcnRfc3RyOworICAgIH0KKyAgICBsb25nIGNpZCA9IHN0cnRvbChjaWRfcG9ydF9zdHIsICZwb3J0X3N0ciwgMCk7CisgICAgaWYgKHBvcnRfc3RyWzBdICE9ICc6JykgeworICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgVlNPQ0sgc3RyLCBcIiVzXCIsIG5lZWQgY2lkOnBvcnQgbWlzc2luZyA6IGFmdGVyIGNpZFxuIiwgX19mdW5jX18sCisgICAgICAgICAgICAgIGNpZF9wb3J0X3N0cik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBsb25nIHBvcnQgPSBzdHJ0b2wocG9ydF9zdHIgKyAxLCAmZW5kX3N0ciwgMCk7CisgICAgaWYgKGVuZF9zdHJbMF0gIT0gJ1wwJykgeworICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgVlNPQ0sgc3RyLCBcIiVzXCIsIG5lZWQgY2lkOnBvcnQgZ290ICVsZDolbGRcbiIsIF9fZnVuY19fLCBjaWRfcG9ydF9zdHIsCisgICAgICAgICAgICAgIGNpZCwgcG9ydCk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBpbnQgZmQgPSBzb2NrZXQoQUZfVlNPQ0ssIHNvY2tldF90eXBlLCAwKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIHJldCA9IC1lcnJubzsKKyAgICAgICAgQUxPR0UoIiVzOiBjYW4ndCBnZXQgdnNvY2sgJWxkOiVsZCBzb2NrZXQgZm9yIHRpcGMgc2VydmljZSBcIiVzXCIgKGVycj0lZClcbiIsIF9fZnVuY19fLAorICAgICAgICAgICAgICBjaWQsIHBvcnQsIHNydl9uYW1lLCBlcnJubyk7CisgICAgICAgIHJldHVybiByZXQgPCAwID8gcmV0IDogLTE7CisgICAgfQorICAgIHN0cnVjdCB0aW1ldmFsIGNvbm5lY3RfdGltZW91dCA9IHsudHZfc2VjID0gNjAsIC50dl91c2VjID0gMH07CisgICAgcmV0ID0gc2V0c29ja29wdChmZCwgQUZfVlNPQ0ssIFNPX1ZNX1NPQ0tFVFNfQ09OTkVDVF9USU1FT1VULCAmY29ubmVjdF90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNvbm5lY3RfdGltZW91dCkpOworICAgIGlmIChyZXQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiB2c29jayAlbGQ6JWxkOiBGYWlsZWQgdG8gc2V0IGNvbm5lY3QgdGltZW91dCAoZXJyPSVkKVxuIiwgX19mdW5jX18sIGNpZCwgcG9ydCwKKyAgICAgICAgICAgICAgZXJybm8pOworICAgICAgICAvKiBmYWlsZWQgdG8gc2V0IGxvbmdlciB0aW1lb3V0LCBidXQgdHJ5IHRvIGNvbm5lY3QgYW55d2F5ICovCisgICAgfQorICAgIHN0cnVjdCBzb2NrYWRkcl92bSBzYSA9IHsKKyAgICAgICAgICAgIC5zdm1fZmFtaWx5ID0gQUZfVlNPQ0ssCisgICAgICAgICAgICAuc3ZtX3BvcnQgPSBwb3J0LAorICAgICAgICAgICAgLnN2bV9jaWQgPSBjaWQsCisgICAgfTsKKyAgICBpbnQgcmV0cnkgPSAxMDsKKyAgICBkbyB7CisgICAgICAgIHJldCA9IFRFTVBfRkFJTFVSRV9SRVRSWShjb25uZWN0KGZkLCAoc3RydWN0IHNvY2thZGRyKikmc2EsIHNpemVvZihzYSkpKTsKKyAgICAgICAgaWYgKHJldCAmJiAoZXJybm8gPT0gRU5PREVWIHx8IGVycm5vID09IEVTT0NLVE5PU1VQUE9SVCkgJiYgLS1yZXRyeSkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSBrZXJuZWwgcmV0dXJucyBFU09DS1ROT1NVUFBPUlQgaW5zdGVhZCBvZiBFTk9ERVYgaWYgdGhlIHNvY2tldCB0eXBlIGlzCisgICAgICAgICAgICAgKiBTT0NLX1NFUVBBQ0tFVCBhbmQgdGhlIGd1ZXN0IENJRCB3ZSBhcmUgdHJ5aW5nIHRvIGNvbm5lY3QgdG8gaXMgbm90IHJlYWR5IHlldC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW4ndCBjb25uZWN0IHRvIHZzb2NrICVsZDolbGQgZm9yIHRpcGMgc2VydmljZSBcIiVzXCIgKGVycj0lZCkgJWQgcmV0cmllcyAiCisgICAgICAgICAgICAgICAgICAicmVtYWluaW5nXG4iLAorICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNpZCwgcG9ydCwgc3J2X25hbWUsIGVycm5vLCByZXRyeSk7CisgICAgICAgICAgICBzbGVlcCgxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHJ5ID0gMDsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKHJldHJ5KTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIHJldCA9IC1lcnJubzsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW4ndCBjb25uZWN0IHRvIHZzb2NrICVsZDolbGQgZm9yIHRpcGMgc2VydmljZSBcIiVzXCIgKGVycj0lZClcbiIsIF9fZnVuY19fLAorICAgICAgICAgICAgICBjaWQsIHBvcnQsIHNydl9uYW1lLCBlcnJubyk7CisgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgcmV0dXJuIHJldCA8IDAgPyByZXQgOiAtMTsKKyAgICB9CisgICAgLyoKKyAgICAgKiBUT0RPOiBDdXJyZW50IHZzb2NrIHRpcGMgYnJpZGdlIGluIHRydXN0eSBleHBlY3RzIGEgcG9ydCBuYW1lIGluIHRoZQorICAgICAqIGZpcnN0IHBhY2tldC4gV2UgbmVlZCB0byByZXBsYWNlIHRoaXMgd2l0aCBhIHByb3RvY29sIHRoYXQgYWxzbyBkb2VzIERJQ0UKKyAgICAgKiBiYXNlZCBhdXRoZW50aWNhdGlvbi4KKyAgICAgKi8KKyAgICByZXQgPSBURU1QX0ZBSUxVUkVfUkVUUlkod3JpdGUoZmQsIHNydl9uYW1lLCBzdHJsZW4oc3J2X25hbWUpKSk7CisgICAgaWYgKHJldCAhPSBzdHJsZW4oc3J2X25hbWUpKSB7CisgICAgICAgIHJldCA9IC1lcnJubzsKKyAgICAgICAgQUxPR0UoIiVzOiB2c29jayAlbGQ6JWxkOiBmYWlsZWQgdG8gc2VuZCB0aXBjIHNlcnZpY2UgbmFtZSBcIiVzXCIgKGVycj0lZClcbiIsIF9fZnVuY19fLAorICAgICAgICAgICAgICBjaWQsIHBvcnQsIHNydl9uYW1lLCBlcnJubyk7CisgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgcmV0dXJuIHJldCA8IDAgPyByZXQgOiAtMTsKKyAgICB9CisgICAgLyoKKyAgICAgKiBXb3JrIGFyb3VuZCBsYWNrIG9mIHNlcSBwYWNrZXQgc3VwcG9ydC4gUmVhZCBhIHN0YXR1cyBieXRlIHRvIHByZXZlbnQKKyAgICAgKiB0aGUgY2FsbGVyIGZyb20gc2VuZGluZyBtb3JlIGRhdGEgdW50aWwgc3J2X25hbWUgaGFzIGJlZW4gcmVhZC4KKyAgICAgKi8KKyAgICBpbnQ4X3Qgc3RhdHVzOworICAgIHJldCA9IFRFTVBfRkFJTFVSRV9SRVRSWShyZWFkKGZkLCAmc3RhdHVzLCBzaXplb2Yoc3RhdHVzKSkpOworICAgIGlmIChyZXQgIT0gc2l6ZW9mKHN0YXR1cykpIHsKKyAgICAgICAgQUxPR0UoIiVzOiB2c29jayAlbGQ6JWxkOiBmYWlsZWQgdG8gcmVhZCBzdGF0dXMgYnl0ZSBmb3IgY29ubmVjdCB0byB0aXBjIHNlcnZpY2UgbmFtZSAiCisgICAgICAgICAgICAgICJcIiVzXCIgKGVycj0lZClcbiIsCisgICAgICAgICAgICAgIF9fZnVuY19fLCBjaWQsIHBvcnQsIHNydl9uYW1lLCBlcnJubyk7CisgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgcmV0dXJuIHJldCA8IDAgPyByZXQgOiAtMTsKKyAgICB9CisgICAgdXNlX3Zzb2NrX2Nvbm5lY3Rpb24gPSB0cnVlOworICAgIHJldHVybiBmZDsKK30KKworc3RhdGljIHNpemVfdCB0aXBjX3Zzb2NrX3NlbmQoaW50IGZkLCBjb25zdCBzdHJ1Y3QgaW92ZWMqIGlvdiwgaW50IGlvdmNudCwgc3RydWN0IHRydXN0eV9zaG0qIHNobXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2htY250KSB7CisgICAgaW50IHJldDsKKworICAgICh2b2lkKXNobXM7CisgICAgaWYgKHNobWNudCAhPSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogdnNvY2sgZG9lcyBub3QgeWV0IHN1cHBvcnQgcGFzc2luZyBmZHNcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIC1FTk9UU1VQOworICAgIH0KKyAgICByZXQgPSBURU1QX0ZBSUxVUkVfUkVUUlkod3JpdGV2KGZkLCBpb3YsIGlvdmNudCkpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHJldCA9IC1lcnJubzsKKyAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gc2VuZCBtZXNzYWdlIChlcnI9JWQpXG4iLCBfX2Z1bmNfXywgZXJybm8pOworICAgICAgICByZXR1cm4gcmV0IDwgMCA/IHJldCA6IC0xOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKIGludCB0aXBjX2Nvbm5lY3QoY29uc3QgY2hhciogZGV2X25hbWUsIGNvbnN0IGNoYXIqIHNydl9uYW1lKSB7CiAgICAgaW50IGZkOwogICAgIGludCByYzsKIAorICAgIGNvbnN0IGNoYXIqIHR5cGVfY2lkX3BvcnRfc3RyID0gc3RyaXBfcHJlZml4KGRldl9uYW1lLCAiVlNPQ0s6Iik7CisgICAgaWYgKHR5cGVfY2lkX3BvcnRfc3RyKSB7CisgICAgICAgIHJldHVybiB0aXBjX3Zzb2NrX2Nvbm5lY3QodHlwZV9jaWRfcG9ydF9zdHIsIHNydl9uYW1lKTsKKyAgICB9CisKICAgICBmZCA9IFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKGRldl9uYW1lLCBPX1JEV1IpKTsKICAgICBpZiAoZmQgPCAwKSB7CiAgICAgICAgIHJjID0gLWVycm5vOwpAQCAtNTQsNiArMTk5LDkgQEAKIAogc3NpemVfdCB0aXBjX3NlbmQoaW50IGZkLCBjb25zdCBzdHJ1Y3QgaW92ZWMqIGlvdiwgaW50IGlvdmNudCwgc3RydWN0IHRydXN0eV9zaG0qIHNobXMsCiAgICAgICAgICAgICAgICAgICBpbnQgc2htY250KSB7CisgICAgaWYgKHVzZV92c29ja19jb25uZWN0aW9uKSB7CisgICAgICAgIHJldHVybiB0aXBjX3Zzb2NrX3NlbmQoZmQsIGlvdiwgaW92Y250LCBzaG1zLCBzaG1jbnQpOworICAgIH0KICAgICBzdHJ1Y3QgdGlwY19zZW5kX21zZ19yZXEgcmVxOwogICAgIHJlcS5pb3YgPSAoX191NjQpaW92OwogICAgIHJlcS5pb3ZfY250ID0gKF9fdTY0KWlvdmNudDsKZGlmZiAtLWdpdCBhL2xpYnByb2Nlc3Nncm91cC9jZ3JvdXByY19mb3JtYXQvQW5kcm9pZC5icCBiL3RydXN0eS9saW5lLWNvdmVyYWdlL0FuZHJvaWQuYnAKc2ltaWxhcml0eSBpbmRleCA2NyUKY29weSBmcm9tIGxpYnByb2Nlc3Nncm91cC9jZ3JvdXByY19mb3JtYXQvQW5kcm9pZC5icApjb3B5IHRvIHRydXN0eS9saW5lLWNvdmVyYWdlL0FuZHJvaWQuYnAKaW5kZXggMDU5MDkyNC4uMzZhNzNhYSAxMDA2NDQKLS0tIGEvbGlicHJvY2Vzc2dyb3VwL2Nncm91cHJjX2Zvcm1hdC9BbmRyb2lkLmJwCisrKyBiL3RydXN0eS9saW5lLWNvdmVyYWdlL0FuZHJvaWQuYnAKQEAgLTEsNCArMSw0IEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4tU291cmNlIFByb2plY3QKIC8vCiAvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIC8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE2LDI0ICsxNiwyMSBAQAogICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJBbmRyb2lkLUFwYWNoZS0yLjAiXSwKIH0KIAotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWJjZ3JvdXByY19mb3JtYXQiLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotICAgIHJhbWRpc2tfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZlbmRvcl9yYW1kaXNrX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICByZWNvdmVyeV9hdmFpbGFibGU6IHRydWUsCi0gICAgbmF0aXZlX2JyaWRnZV9zdXBwb3J0ZWQ6IHRydWUsCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGlidHJ1c3R5X2xpbmVfY292ZXJhZ2UiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgc3JjczogWwotICAgICAgICAiY2dyb3VwX2NvbnRyb2xsZXIuY3BwIiwKLSAgICBdLAotICAgIGNmbGFnczogWwotICAgICAgICAiLVdhbGwiLAotICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICJjb3ZlcmFnZS5jcHAiLAogICAgIF0sCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWwogICAgICAgICAiaW5jbHVkZSIsCiAgICAgXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJleHQyX3V1aWQiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYmRtYWJ1ZmhlYXAiLAorICAgICAgICAibGlidHJ1c3R5IiwKICAgICBdLAogfQorCmRpZmYgLS1naXQgYS90cnVzdHkvbGluZS1jb3ZlcmFnZS9jb3ZlcmFnZS5jcHAgYi90cnVzdHkvbGluZS1jb3ZlcmFnZS9jb3ZlcmFnZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRkYjU5YwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9saW5lLWNvdmVyYWdlL2NvdmVyYWdlLmNwcApAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJldGUgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgImxpbmUtY292ZXJhZ2UiCisKKyNpbmNsdWRlIDxCdWZmZXJBbGxvY2F0b3IvQnVmZmVyQWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNpbmNsdWRlIDx0cnVzdHkvbGluZS1jb3ZlcmFnZS9jb3ZlcmFnZS5oPgorI2luY2x1ZGUgPHRydXN0eS9saW5lLWNvdmVyYWdlL3RpcGMuaD4KKyNpbmNsdWRlIDx0cnVzdHkvdGlwYy5oPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjZGVmaW5lIExJTkVfQ09WRVJBR0VfQ0xJRU5UX1BPUlQgImNvbS5hbmRyb2lkLnRydXN0eS5saW5lY292ZXJhZ2UuY2xpZW50IgorCitzdHJ1Y3QgY29udHJvbCB7CisgICAgLyogV3JpdHRlbiBieSBjb250cm9sbGVyLCByZWFkIGJ5IGluc3RydW1lbnRlZCBUQSAqLworICAgIHVpbnQ2NF90ICAgICAgICBjbnRybF9mbGFnczsKKworICAgIC8qIFdyaXR0ZW4gYnkgaW5zdHJ1bWVudGVkIFRBLCByZWFkIGJ5IGNvbnRyb2xsZXIgKi8KKyAgICB1aW50NjRfdCAgICAgICAgb3Blcl9mbGFnczsKKyAgICB1aW50NjRfdCAgICAgICAgd3JpdGVfYnVmZmVyX3N0YXJ0X2NvdW50OworICAgIHVpbnQ2NF90ICAgICAgICB3cml0ZV9idWZmZXJfY29tcGxldGVfY291bnQ7Cit9OworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdHJ1c3R5IHsKK25hbWVzcGFjZSBsaW5lX2NvdmVyYWdlIHsKKwordXNpbmcgOjphbmRyb2lkOjpiYXNlOjpFcnJub0Vycm9yOwordXNpbmcgOjphbmRyb2lkOjpiYXNlOjpFcnJvcjsKK3VzaW5nIDo6c3RkOjpzdHJpbmc7CisKK0NvdmVyYWdlUmVjb3JkOjpDb3ZlcmFnZVJlY29yZChzdHJpbmcgdGlwY19kZXYsIHN0cnVjdCB1dWlkKiB1dWlkKQorICAgIDogdGlwY19kZXZfKHN0ZDo6bW92ZSh0aXBjX2RldikpLAorICAgICAgY292ZXJhZ2Vfc3J2X2ZkXygtMSksCisgICAgICB1dWlkXygqdXVpZCksCisgICAgICByZWNvcmRfbGVuXygwKSwKKyAgICAgIHNobV8oTlVMTCksCisgICAgICBzaG1fbGVuXygwKSB7fQorCitDb3ZlcmFnZVJlY29yZDo6fkNvdmVyYWdlUmVjb3JkKCkgeworICAgIGlmIChzaG1fKSB7CisgICAgICAgIG11bm1hcCgodm9pZCopc2htXywgc2htX2xlbl8pOworICAgIH0KK30KKwordm9sYXRpbGUgdm9pZCAqQ292ZXJhZ2VSZWNvcmQ6OmdldFNobSgpIHsKKyAgICBpZighSXNPcGVuKCkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nISBTSE0gaXMgTlVMTCFcbiIpOworICAgIH0KKyAgICByZXR1cm4gc2htXzsKK30KKworUmVzdWx0PHZvaWQ+IENvdmVyYWdlUmVjb3JkOjpScGMoc3RydWN0IGxpbmVfY292ZXJhZ2VfY2xpZW50X3JlcSogcmVxLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlcV9mZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBsaW5lX2NvdmVyYWdlX2NsaWVudF9yZXNwKiByZXNwKSB7CisgICAgaW50IHJjOworCisgICAgaWYgKHJlcV9mZCA8IDApIHsKKyAgICAgICAgcmMgPSB3cml0ZShjb3ZlcmFnZV9zcnZfZmRfLCByZXEsIHNpemVvZigqcmVxKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW92ZWMgaW92ID0geworICAgICAgICAgICAgICAgIC5pb3ZfYmFzZSA9IHJlcSwKKyAgICAgICAgICAgICAgICAuaW92X2xlbiA9IHNpemVvZigqcmVxKSwKKyAgICAgICAgfTsKKworICAgICAgICB0cnVzdHlfc2htIHNobSA9IHsKKyAgICAgICAgICAgICAgICAuZmQgPSByZXFfZmQsCisgICAgICAgICAgICAgICAgLnRyYW5zZmVyID0gVFJVU1RZX1NIQVJFLAorICAgICAgICB9OworCisgICAgICAgIHJjID0gdGlwY19zZW5kKGNvdmVyYWdlX3Nydl9mZF8sICZpb3YsIDEsICZzaG0sIDEpOworICAgIH0KKworICAgIGlmIChyYyAhPSAoaW50KXNpemVvZigqcmVxKSkgeworICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJmYWlsZWQgdG8gc2VuZCByZXF1ZXN0IHRvIGNvdmVyYWdlIHNlcnZlcjogIjsKKyAgICB9CisKKyAgICByYyA9IHJlYWQoY292ZXJhZ2Vfc3J2X2ZkXywgcmVzcCwgc2l6ZW9mKCpyZXNwKSk7CisgICAgaWYgKHJjICE9IChpbnQpc2l6ZW9mKCpyZXNwKSkgeworICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJmYWlsZWQgdG8gcmVhZCByZXBseSBmcm9tIGNvdmVyYWdlIHNlcnZlcjogIjsKKyAgICB9CisKKyAgICBpZiAocmVzcC0+aGRyLmNtZCAhPSAocmVxLT5oZHIuY21kIHwgTElORV9DT1ZFUkFHRV9DTElFTlRfQ01EX1JFU1BfQklUKSkgeworICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJ1bmtub3duIHJlc3BvbnNlIGNtZDogIiA8PCByZXNwLT5oZHIuY21kOworICAgIH0KKworICAgIHJldHVybiB7fTsKK30KKworUmVzdWx0PHZvaWQ+IENvdmVyYWdlUmVjb3JkOjpPcGVuKGludCBmZCkgeworICAgIHN0cnVjdCBsaW5lX2NvdmVyYWdlX2NsaWVudF9yZXEgcmVxOworICAgIHN0cnVjdCBsaW5lX2NvdmVyYWdlX2NsaWVudF9yZXNwIHJlc3A7CisKKyAgICBpZiAoc2htXykgeworICAgICAgICByZXR1cm4ge307IC8qIGFscmVhZHkgaW5pdGlhbGl6ZWQgKi8KKyAgICB9CisKKyAgICBjb3ZlcmFnZV9zcnZfZmRfPSBmZDsKKworICAgIHJlcS5oZHIuY21kID0gTElORV9DT1ZFUkFHRV9DTElFTlRfQ01EX09QRU47CisgICAgcmVxLm9wZW5fYXJncy51dWlkID0gdXVpZF87CisgICAgYXV0byByZXQgPSBScGMoJnJlcSwgLTEsICZyZXNwKTsKKyAgICBpZiAoIXJldC5vaygpKSB7CisgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJmYWlsZWQgdG8gb3BlbiBjb3ZlcmFnZSBjbGllbnQ6ICIgPDwgcmV0LmVycm9yKCk7CisgICAgfQorICAgIHJlY29yZF9sZW5fID0gcmVzcC5vcGVuX2FyZ3MucmVjb3JkX2xlbjsKKyAgICBzaG1fbGVuXyA9IHJlY29yZF9sZW5fOworCisgICAgQnVmZmVyQWxsb2NhdG9yIGFsbG9jYXRvcjsKKworICAgIGZkID0gYWxsb2NhdG9yLkFsbG9jKCJzeXN0ZW0iLCBzaG1fbGVuXyk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJmYWlsZWQgdG8gY3JlYXRlIGRtYWJ1ZiBvZiBzaXplICIgPDwgc2htX2xlbl8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGVyciBjb2RlOiAiIDw8IGZkOworICAgIH0KKyAgICB1bmlxdWVfZmQgZG1hX2J1ZihmZCk7CisKKyAgICB2b2lkKiBzaG0gPSBtbWFwKDAsIHNobV9sZW5fLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBkbWFfYnVmLCAwKTsKKyAgICBpZiAoc2htID09IE1BUF9GQUlMRUQpIHsKKyAgICAgICAgcmV0dXJuIEVycm5vRXJyb3IoKSA8PCAiZmFpbGVkIHRvIG1hcCBtZW1mZDogIjsKKyAgICB9CisKKyAgICByZXEuaGRyLmNtZCA9IExJTkVfQ09WRVJBR0VfQ0xJRU5UX0NNRF9TSEFSRV9SRUNPUkQ7CisgICAgcmVxLnNoYXJlX3JlY29yZF9hcmdzLnNobV9sZW4gPSBzaG1fbGVuXzsKKyAgICByZXQgPSBScGMoJnJlcSwgZG1hX2J1ZiwgJnJlc3ApOworICAgIGlmICghcmV0Lm9rKCkpIHsKKyAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgImZhaWxlZCB0byBzZW5kIHNoYXJlZCBtZW1vcnk6ICIgPDwgcmV0LmVycm9yKCk7CisgICAgfQorCisgICAgc2htXyA9IHNobTsKKworICAgIHJlcS5oZHIuY21kID0gTElORV9DT1ZFUkFHRV9DTElFTlRfQ01EX09QRU47CisgICAgcmVxLm9wZW5fYXJncy51dWlkID0gdXVpZF87CisgICAgcmV0ID0gUnBjKCZyZXEsIC0xLCAmcmVzcCk7CisgICAgaWYgKCFyZXQub2soKSkgeworICAgICAgICByZXR1cm4gRXJyb3IoKSA8PCAiZmFpbGVkIHRvIG9wZW4gY292ZXJhZ2UgY2xpZW50OiAiIDw8IHJldC5lcnJvcigpOworICAgIH0KKworICAgIHJldHVybiB7fTsKK30KKworYm9vbCBDb3ZlcmFnZVJlY29yZDo6SXNPcGVuKCkgeworICAgIHJldHVybiBzaG1fOworfQorCitSZXN1bHQ8dm9pZD4gQ292ZXJhZ2VSZWNvcmQ6OlNhdmVGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkgeworICAgIGlmKCFJc09wZW4oKSkgeworICAgICAgICByZXR1cm4gRXJybm9FcnJvcigpIDw8ICJXYXJuaW5nISBTSE0gaXMgTlVMTCEiOworICAgIH0KKyAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgb3V0cHV0X2ZkKFRFTVBfRkFJTFVSRV9SRVRSWShjcmVhdChmaWxlbmFtZS5jX3N0cigpLCAwMDY0NCkpKTsKKyAgICBpZiAoIW91dHB1dF9mZC5vaygpKSB7CisgICAgICAgIHJldHVybiBFcnJub0Vycm9yKCkgPDwgIkNvdWxkIG5vdCBvcGVuIG91dHB1dCBmaWxlIjsKKyAgICB9CisKKyAgICB1aW50cHRyX3QqIGJlZ2luID0gKHVpbnRwdHJfdCopKChjaGFyICopc2htXyArIHNpemVvZihzdHJ1Y3QgY29udHJvbCkpOworICAgIGJvb2wgcmV0ID0gV3JpdGVGdWxseShvdXRwdXRfZmQsIGJlZ2luLCByZWNvcmRfbGVuXyAtIHNpemVvZihzdHJ1Y3QgY29udHJvbCkpOworICAgIGlmKCFyZXQpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3ZlcmFnZSB3cml0ZSB0byBmaWxlIGZhaWxlZFxuIik7CisgICAgfQorCisgICAgcmV0dXJuIHt9OworfQorCit9ICAvLyBuYW1lc3BhY2UgbGluZV9jb3ZlcmFnZQorfSAgLy8gbmFtZXNwYWNlIHRydXN0eQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3RydXN0eS9saW5lLWNvdmVyYWdlL2luY2x1ZGUvdHJ1c3R5L2xpbmUtY292ZXJhZ2UvY292ZXJhZ2UuaCBiL3RydXN0eS9saW5lLWNvdmVyYWdlL2luY2x1ZGUvdHJ1c3R5L2xpbmUtY292ZXJhZ2UvY292ZXJhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzkwMWJlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2xpbmUtY292ZXJhZ2UvaW5jbHVkZS90cnVzdHkvbGluZS1jb3ZlcmFnZS9jb3ZlcmFnZS5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPG9wdGlvbmFsPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9yZXN1bHQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dHJ1c3R5L2xpbmUtY292ZXJhZ2UvdGlwYy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdHJ1c3R5IHsKK25hbWVzcGFjZSBsaW5lX2NvdmVyYWdlIHsKKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6UmVzdWx0OwordXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOworCitjbGFzcyBDb3ZlcmFnZVJlY29yZCB7CisgIHB1YmxpYzoKKyAgICBDb3ZlcmFnZVJlY29yZChzdGQ6OnN0cmluZyB0aXBjX2Rldiwgc3RydWN0IHV1aWQqIHV1aWQpOworCisgICAgfkNvdmVyYWdlUmVjb3JkKCk7CisgICAgUmVzdWx0PHZvaWQ+IE9wZW4oaW50IGZkKTsKKyAgICBib29sIElzT3BlbigpOworICAgIFJlc3VsdDx2b2lkPiBTYXZlRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpOworICAgIHZvbGF0aWxlIHZvaWQqIGdldFNobSgpOworCisgIHByaXZhdGU6CisgICAgUmVzdWx0PHZvaWQ+IFJwYyhzdHJ1Y3QgbGluZV9jb3ZlcmFnZV9jbGllbnRfcmVxKiByZXEsIFwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVxX2ZkLCBcCisgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGxpbmVfY292ZXJhZ2VfY2xpZW50X3Jlc3AqIHJlc3ApOworCisgICAgUmVzdWx0PHN0ZDo6cGFpcjxzaXplX3QsIHNpemVfdD4+IEdldFJlZ2lvbkJvdW5kcyh1aW50MzJfdCByZWdpb25fdHlwZSk7CisKKyAgICBzdGQ6OnN0cmluZyB0aXBjX2Rldl87CisgICAgaW50IGNvdmVyYWdlX3Nydl9mZF87CisgICAgc3RydWN0IHV1aWQgdXVpZF87CisgICAgc2l6ZV90IHJlY29yZF9sZW5fOworICAgIHZvbGF0aWxlIHZvaWQqIHNobV87CisgICAgc2l6ZV90IHNobV9sZW5fOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGxpbmVfY292ZXJhZ2UKK30gIC8vIG5hbWVzcGFjZSB0cnVzdHkKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90cnVzdHkvbGluZS1jb3ZlcmFnZS9pbmNsdWRlL3RydXN0eS9saW5lLWNvdmVyYWdlL3RpcGMuaCBiL3RydXN0eS9saW5lLWNvdmVyYWdlL2luY2x1ZGUvdHJ1c3R5L2xpbmUtY292ZXJhZ2UvdGlwYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZTg1NWMKLS0tIC9kZXYvbnVsbAorKysgYi90cnVzdHkvbGluZS1jb3ZlcmFnZS9pbmNsdWRlL3RydXN0eS9saW5lLWNvdmVyYWdlL3RpcGMuaApAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qIFRoaXMgZmlsZSBuZWVkcyB0byBiZSBrZXB0IGluLXN5bmMgd2l0aCBpdHMgY291bnRlcnBhcnQgb24gVHJ1c3R5IHNpZGUgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx0cnVzdHkvbGluZS1jb3ZlcmFnZS91dWlkLmg+CisKKworI2RlZmluZSBMSU5FX0NPVkVSQUdFX0NMSUVOVF9QT1JUICJjb20uYW5kcm9pZC50cnVzdHkubGluZWNvdmVyYWdlLmNsaWVudCIKKworLyoqCisgKiBlbnVtIGxpbmVfY292ZXJhZ2VfY2xpZW50X2NtZCAtIGNvbW1hbmQgaWRlbnRpZmllcnMgZm9yIGNvdmVyYWdlIGNsaWVudCBpbnRlcmZhY2UKKyAqIEBMSU5FX0NPVkVSQUdFX0NMSUVOVF9DTURfUkVTUF9CSVQ6ICAgICByZXNwb25zZSBiaXQgc2V0IGFzIHBhcnQgb2YgcmVzcG9uc2UKKyAqIEBMSU5FX0NPVkVSQUdFX0NMSUVOVF9DTURfU0hJRlQ6ICAgICAgICBudW1iZXIgb2YgYml0cyB1c2VkIGJ5IHJlc3BvbnNlIGJpdAorICogQExJTkVfQ09WRVJBR0VfQ0xJRU5UX0NNRF9PUEVOOiAgICAgICAgIGNvbW1hbmQgdG8gb3BlbiBjb3ZlcmFnZSByZWNvcmQKKyAqIEBMSU5FX0NPVkVSQUdFX0NMSUVOVF9DTURfU0hBUkVfUkVDT1JEOiBjb21tYW5kIHRvIHJlZ2lzdGVyIGEgc2hhcmVkIG1lbW9yeSByZWdpb24KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgY292ZXJhZ2UgcmVjb3JkIHdpbGwgYmUgd3JpdHRlbiB0bworICovCitlbnVtIGxpbmVfY292ZXJhZ2VfY2xpZW50X2NtZCB7CisgICAgTElORV9DT1ZFUkFHRV9DTElFTlRfQ01EX1JFU1BfQklUID0gMVUsCisgICAgTElORV9DT1ZFUkFHRV9DTElFTlRfQ01EX1NISUZUID0gMVUsCisgICAgTElORV9DT1ZFUkFHRV9DTElFTlRfQ01EX09QRU4gPSAoMVUgPDwgTElORV9DT1ZFUkFHRV9DTElFTlRfQ01EX1NISUZUKSwKKyAgICBMSU5FX0NPVkVSQUdFX0NMSUVOVF9DTURfU0hBUkVfUkVDT1JEID0gKDJVIDw8IExJTkVfQ09WRVJBR0VfQ0xJRU5UX0NNRF9TSElGVCksCisgICAgTElORV9DT1ZFUkFHRV9DTElFTlRfQ01EX1NFTkRfTElTVCA9ICgzVSA8PCBMSU5FX0NPVkVSQUdFX0NMSUVOVF9DTURfU0hJRlQpLAorfTsKKworLyoqCisgKiBzdHJ1Y3QgbGluZV9jb3ZlcmFnZV9jbGllbnRfaGRyIC0gaGVhZGVyIGZvciBjb3ZlcmFnZSBjbGllbnQgbWVzc2FnZXMKKyAqIEBjbWQ6IGNvbW1hbmQgaWRlbnRpZmllcgorICoKKyAqIE5vdGUgdGhhdCBubyBtZXNzYWdlcyByZXR1cm4gYSBzdGF0dXMgY29kZS4gQW55IGVycm9yIG9uIHRoZSBzZXJ2ZXIgc2lkZQorICogcmVzdWx0cyBpbiB0aGUgY29ubmVjdGlvbiBiZWluZyBjbG9zZWQuIFNvLCBvcGVyYXRpb25zIGNhbiBiZSBhc3N1bWVkIHRvIGJlCisgKiBzdWNjZXNzZnVsIGlmIHRoZXkgcmV0dXJuIGEgcmVzcG9uc2UuCisgKi8KK3N0cnVjdCBsaW5lX2NvdmVyYWdlX2NsaWVudF9oZHIgeworICAgIHVpbnQzMl90IGNtZDsKK307CisKKy8qKgorICogc3RydWN0IGxpbmVfY292ZXJhZ2VfY2xpZW50X29wZW5fcmVxIC0gYXJndW1lbnRzIGZvciByZXF1ZXN0IHRvIG9wZW4gY292ZXJhZ2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQKKyAqIEB1dWlkOiBVVUlEIG9mIHRhcmdldCBUQQorICoKKyAqIFRoZXJlIGlzIG9uZSBjb3ZlcmFnZSByZWNvcmQgcGVyIFRBLiBAdXVpZCBpcyB1c2VkIHRvIGlkZW50aWZ5IGJvdGggdGhlIFRBCisgKiBhbmQgY29ycmVzcG9uZGluZyBjb3ZlcmFnZSByZWNvcmQuCisgKi8KK3N0cnVjdCBsaW5lX2NvdmVyYWdlX2NsaWVudF9vcGVuX3JlcSB7CisgICAgc3RydWN0IHV1aWQgdXVpZDsKK307CisKKy8qKgorICogc3RydWN0IGxpbmVfY292ZXJhZ2VfY2xpZW50X29wZW5fcmVzcCAtIGFyZ3VtZW50cyBmb3IgcmVzcG9uc2UgdG8gb3BlbiBjb3ZlcmFnZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQKKyAqIEByZWNvcmRfbGVuOiBsZW5ndGggb2YgY292ZXJhZ2UgcmVjb3JkIHRoYXQgd2lsbCBiZSBlbWl0dGVkIGJ5IHRhcmdldCBUQQorICoKKyAqIFNoYXJlZCBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGlzIGNvdmVyYWdlIHJlY29yZCBtdXN0IGxhcmdlciB0aGFuCisgKiBAcmVjb3JkX2xlbi4KKyAqLworc3RydWN0IGxpbmVfY292ZXJhZ2VfY2xpZW50X29wZW5fcmVzcCB7CisgICAgdWludDMyX3QgcmVjb3JkX2xlbjsKK307CisKKy8qKgorICogc3RydWN0IGxpbmVfY292ZXJhZ2VfY2xpZW50X3NlbmRfbGlzdF9yZXNwIC0gYXJndW1lbnRzIGZvciByZXNwb25zZSB0byBzZW5kIGxpc3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQKKyAqIEB1dWlkOiBVVUlEIG9mIFRBIHRoYXQgY29ubmVjdGVkIHRvIGFnZ3JlZ2F0b3IKKyAqLworc3RydWN0IGxpbmVfY292ZXJhZ2VfY2xpZW50X3NlbmRfbGlzdF9yZXNwIHsKKyAgICBzdHJ1Y3QgdXVpZCB1dWlkOworfTsKKworLyoqCisgKiBzdHJ1Y3QgbGluZV9jb3ZlcmFnZV9jbGllbnRfc2VuZF9saXN0X3Jlc3AgLSBhcmd1bWVudHMgZm9yIHJlc3BvbnNlIHRvIHNlbmQgbGlzdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZAorICogQGluZGV4OiBpbmRleCBvZiB0aGUgbGlzdCBiZWluZyByZXF1ZXN0ZWQKKyAqLworc3RydWN0IGxpbmVfY292ZXJhZ2VfY2xpZW50X3NlbmRfbGlzdF9yZXEgeworICAgIHVpbnQzMl90IGluZGV4OworfTsKKworLyoqCisgKiBzdHJ1Y3QgbGluZV9jb3ZlcmFnZV9jbGllbnRfc2hhcmVfcmVjb3JkX3JlcSAtIGFyZ3VtZW50cyBmb3IgcmVxdWVzdCB0byBzaGFyZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5IGZvciBjb3ZlcmFnZSByZWNvcmQKKyAqIEBzaG1fbGVuOiBsZW5ndGggb2YgbWVtb3J5IHJlZ2lvbiBiZWluZyBzaGFyZWQKKyAqCisgKiBBIGhhbmRsZSB0byBhIG1lbW9yeSByZWdpb24gbXVzdCBiZSBzZW50IGFsb25nIHdpdGggdGhpcyBtZXNzYWdlLiBUaGlzIG1lbW9yeQorICogaXMgdXNlZCB0byBzdG9yZSBjb3ZlcmFnZSByZWNvcmQuCisgKgorICogVXBvbiBzdWNjZXNzLCB0aGlzIG1lbW9yeSByZWdpb24gY2FuIGJlIGFzc3VtZWQgdG8gYmUgc2hhcmVkIGJldHdlZW4gdGhlCisgKiBjbGllbnQgYW5kIHRhcmdldCBUQS4KKyAqLworc3RydWN0IGxpbmVfY292ZXJhZ2VfY2xpZW50X3NoYXJlX3JlY29yZF9yZXEgeworICAgIHVpbnQzMl90IHNobV9sZW47Cit9OworCisvKioKKyAqIHN0cnVjdCBsaW5lX2NvdmVyYWdlX2NsaWVudF9yZXEgLSBzdHJ1Y3R1cmUgZm9yIGEgY292ZXJhZ2UgY2xpZW50IHJlcXVlc3QKKyAqIEBoZHI6ICAgICAgICAgICAgICAgbWVzc2FnZSBoZWFkZXIKKyAqIEBvcGVuX2FyZ3M6ICAgICAgICAgYXJndW1lbnRzIGZvciAlQ09WRVJBR0VfQ0xJRU5UX0NNRF9PUEVOIHJlcXVlc3QKKyAqIEBzaGFyZV9yZWNvcmRfYXJnczogYXJndW1lbnRzIGZvciAlQ09WRVJBR0VfQ0xJRU5UX0NNRF9TSEFSRV9SRUNPUkQgcmVxdWVzdAorICogQGluZGV4OiBhcmd1bWVudHMgZm9yICVDT1ZFUkFHRV9DTElFTlRfQ01EX1NIQVJFX1JFQ09SRCByZXF1ZXN0CisgKi8KK3N0cnVjdCBsaW5lX2NvdmVyYWdlX2NsaWVudF9yZXEgeworICAgIHN0cnVjdCBsaW5lX2NvdmVyYWdlX2NsaWVudF9oZHIgaGRyOworICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0IGxpbmVfY292ZXJhZ2VfY2xpZW50X29wZW5fcmVxIG9wZW5fYXJnczsKKyAgICAgICAgc3RydWN0IGxpbmVfY292ZXJhZ2VfY2xpZW50X3NoYXJlX3JlY29yZF9yZXEgc2hhcmVfcmVjb3JkX2FyZ3M7CisgICAgICAgIHN0cnVjdCBsaW5lX2NvdmVyYWdlX2NsaWVudF9zZW5kX2xpc3RfcmVxIHNlbmRfbGlzdF9hcmdzOworICAgIH07Cit9OworCisvKioKKyAqIHN0cnVjdCBsaW5lX2NvdmVyYWdlX2NsaWVudF9yZXNwIC0gc3RydWN0dXJlIGZvciBhIGNvdmVyYWdlIGNsaWVudCByZXNwb25zZQorICogQGhkcjogICAgICAgbWVzc2FnZSBoZWFkZXIKKyAqIEBvcGVuX2FyZ3M6IGFyZ3VtZW50cyBmb3IgJUNPVkVSQUdFX0NMSUVOVF9DTURfT1BFTiByZXNwb25zZQorICogQHNlbmRfbGlzdF9hcmdzOiBhcmd1bWVudHMgZm9yICVDT1ZFUkFHRV9DTElFTlRfQ01EX1NIQVJFX1JFQ09SRCByZXNwb25zZQorICovCitzdHJ1Y3QgbGluZV9jb3ZlcmFnZV9jbGllbnRfcmVzcCB7CisgICAgc3RydWN0IGxpbmVfY292ZXJhZ2VfY2xpZW50X2hkciBoZHI7CisgICAgdW5pb24geworICAgICAgICBzdHJ1Y3QgbGluZV9jb3ZlcmFnZV9jbGllbnRfb3Blbl9yZXNwIG9wZW5fYXJnczsKKyAgICAgICAgc3RydWN0IGxpbmVfY292ZXJhZ2VfY2xpZW50X3NlbmRfbGlzdF9yZXNwIHNlbmRfbGlzdF9hcmdzOworICAgIH07Cit9OwpkaWZmIC0tZ2l0IGEvdHJ1c3R5L2xpbmUtY292ZXJhZ2UvaW5jbHVkZS90cnVzdHkvbGluZS1jb3ZlcmFnZS91dWlkLmggYi90cnVzdHkvbGluZS1jb3ZlcmFnZS9pbmNsdWRlL3RydXN0eS9saW5lLWNvdmVyYWdlL3V1aWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODczOTgwCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L2xpbmUtY292ZXJhZ2UvaW5jbHVkZS90cnVzdHkvbGluZS1jb3ZlcmFnZS91dWlkLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgVVVDTVAodTEsIHUyKSBpZiAodTEgIT0gdTIpIHJldHVybiB1MSA8IHUyCisKK3N0cnVjdCB1dWlkIHsKKyAgICB1aW50MzJfdCB0aW1lX2xvdzsKKyAgICB1aW50MTZfdCB0aW1lX21pZDsKKyAgICB1aW50MTZfdCB0aW1lX2hpX2FuZF92ZXJzaW9uOworICAgIHVpbnQ4X3QgY2xvY2tfc2VxX2FuZF9ub2RlWzhdOworCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3Qgc3RydWN0IHV1aWQmIHJocykgY29uc3QKKyAgICB7CisgICAgICAgIFVVQ01QKHRpbWVfbG93LCByaHMudGltZV9sb3cpOworICAgICAgICBVVUNNUCh0aW1lX21pZCwgcmhzLnRpbWVfbWlkKTsKKyAgICAgICAgVVVDTVAodGltZV9oaV9hbmRfdmVyc2lvbiwgcmhzLnRpbWVfaGlfYW5kX3ZlcnNpb24pOworICAgICAgICByZXR1cm4gbWVtY21wKGNsb2NrX3NlcV9hbmRfbm9kZSwgcmhzLmNsb2NrX3NlcV9hbmRfbm9kZSwgOCk7CisgICAgfQorfTsKZGlmZiAtLWdpdCBhL3RydXN0eS9tZXRyaWNzL2luY2x1ZGUvdHJ1c3R5L21ldHJpY3MvdGlwYy5oIGIvdHJ1c3R5L21ldHJpY3MvaW5jbHVkZS90cnVzdHkvbWV0cmljcy90aXBjLmgKaW5kZXggNjZkMDg3Ni4uNGM0ZDM3ZCAxMDA2NDQKLS0tIGEvdHJ1c3R5L21ldHJpY3MvaW5jbHVkZS90cnVzdHkvbWV0cmljcy90aXBjLmgKKysrIGIvdHJ1c3R5L21ldHJpY3MvaW5jbHVkZS90cnVzdHkvbWV0cmljcy90aXBjLmgKQEAgLTM5LDE0ICszOSwyMCBAQAogICogcmVwb3NpdG9yeS4gVGhleSBtdXN0IGJlIGtlcHQgaW4gc3luYy4KICAqLwogCi0jZGVmaW5lIE1FVFJJQ1NfUE9SVCAiY29tLmFuZHJvaWQudHJ1c3R5Lm1ldHJpY3MiCisjZGVmaW5lIE1FVFJJQ1NfUE9SVCAiY29tLmFuZHJvaWQudHJ1c3R5Lm1ldHJpY3MuY29uc3VtZXIiCisKKyNkZWZpbmUgVVVJRF9TVFJfU0laRSAoMzcpCisKKyNkZWZpbmUgSEFTSF9TSVpFX0JZVEVTIDY0CiAKIC8qKgogICogZW51bSBtZXRyaWNzX2NtZCAtIGNvbW1hbmQgaWRlbnRpZmllcnMgZm9yIG1ldHJpY3MgaW50ZXJmYWNlCi0gKiBATUVUUklDU19DTURfUkVTUF9CSVQ6ICAgICAgICAgIG1lc3NhZ2UgaXMgYSByZXNwb25zZQotICogQE1FVFJJQ1NfQ01EX1JFUV9TSElGVDogICAgICAgICBudW1iZXIgb2YgYml0cyB1c2VkIGJ5IEBNRVRSSUNTX0NNRF9SRVNQX0JJVAotICogQE1FVFJJQ1NfQ01EX1JFUE9SVF9FVkVOVF9EUk9QOiByZXBvcnQgZ2FwcyBpbiB0aGUgZXZlbnQgc3RyZWFtCi0gKiBATUVUUklDU19DTURfUkVQT1JUX0NSQVNIOiAgICAgIHJlcG9ydCBhbiBhcHAgY3Jhc2ggZXZlbnQKKyAqIEBNRVRSSUNTX0NNRF9SRVNQX0JJVDogICAgICAgICAgICAgbWVzc2FnZSBpcyBhIHJlc3BvbnNlCisgKiBATUVUUklDU19DTURfUkVRX1NISUZUOiAgICAgICAgICAgIG51bWJlciBvZiBiaXRzIHVzZWQgYnkgQE1FVFJJQ1NfQ01EX1JFU1BfQklUCisgKiBATUVUUklDU19DTURfUkVQT1JUX0VWRU5UX0RST1A6ICAgIHJlcG9ydCBnYXBzIGluIHRoZSBldmVudCBzdHJlYW0KKyAqIEBNRVRSSUNTX0NNRF9SRVBPUlRfQ1JBU0g6ICAgICAgICAgcmVwb3J0IGFuIGFwcCBjcmFzaCBldmVudAorICogQE1FVFJJQ1NfQ01EX1JFUE9SVF9FWElUOiAgICAgICAgICByZXBvcnQgYW4gYXBwIGV4aXQKKyAqIEBNRVRSSUNTX0NNRF9SRVBPUlRfU1RPUkFHRV9FUlJPUjogcmVwb3J0IHRydXN0eSBzdG9yYWdlIGVycm9yCiAgKi8KIGVudW0gbWV0cmljc19jbWQgewogICAgIE1FVFJJQ1NfQ01EX1JFU1BfQklUID0gMSwKQEAgLTU0LDYgKzYwLDggQEAKIAogICAgIE1FVFJJQ1NfQ01EX1JFUE9SVF9FVkVOVF9EUk9QID0gKDEgPDwgTUVUUklDU19DTURfUkVRX1NISUZUKSwKICAgICBNRVRSSUNTX0NNRF9SRVBPUlRfQ1JBU0ggPSAoMiA8PCBNRVRSSUNTX0NNRF9SRVFfU0hJRlQpLAorICAgIE1FVFJJQ1NfQ01EX1JFUE9SVF9FWElUID0gKDMgPDwgTUVUUklDU19DTURfUkVRX1NISUZUKSwKKyAgICBNRVRSSUNTX0NNRF9SRVBPUlRfU1RPUkFHRV9FUlJPUiA9ICg0IDw8IE1FVFJJQ1NfQ01EX1JFUV9TSElGVCksCiB9OwogCiAvKioKQEAgLTg4LDE2ICs5Niw5OCBAQAogfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CiAKIC8qKgotICogc3RydWN0IG1ldHJpY3NfcmVwb3J0X2NyYXNoX3JlcSAtIGFyZ3VtZW50cyBvZiAlTUVUUklDU19DTURfUkVQT1JUX0NSQVNICisgKiBzdHJ1Y3QgbWV0cmljc19yZXBvcnRfZXhpdF9yZXEgLSBhcmd1bWVudHMgb2YgJU1FVFJJQ1NfQ01EX1JFUE9SVF9FWElUCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdHMKLSAqIEBhcHBfaWRfbGVuOiBsZW5ndGggb2YgYXBwIElEIHRoYXQgZm9sbG93cyB0aGlzIHN0cnVjdHVyZQorICogQGFwcF9pZDogYXBwX2lkIGluIHRoZSBmb3JtIFVVSUQgaW4gYXNjaWkgZm9ybWF0CisgKiAgICAgICAgICAieHh4eHh4eHgteHh4eC14eHh4LXh4eHgteHh4eHh4eHh4eHh4IgorICogQGV4aXRfY29kZTogYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGV4aXQgY29kZQogICovCi1zdHJ1Y3QgbWV0cmljc19yZXBvcnRfY3Jhc2hfcmVxIHsKLSAgICB1aW50MzJfdCBhcHBfaWRfbGVuOworc3RydWN0IG1ldHJpY3NfcmVwb3J0X2V4aXRfcmVxIHsKKyAgICBjaGFyIGFwcF9pZFtVVUlEX1NUUl9TSVpFXTsKKyAgICB1aW50MzJfdCBleGl0X2NvZGU7CiB9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKIAotI2RlZmluZSBNRVRSSUNTX01BWF9BUFBfSURfTEVOIDI1NgorLyoqCisgKiBzdHJ1Y3QgbWV0cmljc19yZXBvcnRfY3Jhc2hfcmVxIC0gYXJndW1lbnRzIG9mICVNRVRSSUNTX0NNRF9SRVBPUlRfQ1JBU0gKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0cworICogQGFwcF9pZDogYXBwX2lkIGluIHRoZSBmb3JtIFVVSUQgaW4gYXNjaWkgZm9ybWF0CisgKiAgICAgICAgICAieHh4eHh4eHgteHh4eC14eHh4LXh4eHgteHh4eHh4eHh4eHh4IgorICogQGNyYXNoX3JlYXNvbjogYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGNvZGUgcmVwcmVzZW50aW5nIHRoZSByZWFzb24gZm9yIHRoZQorICogICAgICAgICAgICAgICAgY3Jhc2gKKyAqIEBmYXI6IEZhdWx0IEFkZHJlc3MgUmVnaXN0ZXIgY29ycmVzcG9uZGluZyB0byB0aGUgY3Jhc2guIEl0IGlzIHNldCB0byAwIGFuZAorICogICAgICAgbm90IGFsd2F5cyByZXZlYWxlZAorICogQGZhcl9oYXNoOiBGYXVsdCBBZGRyZXNzIFJlZ2lzdGVyIG9iZnVzY2F0ZWQsIGFsd2F5cyByZXZlYWxlZAorICogQGVscjogRXhjZXB0aW9uIExpbmsgUmVnaXN0ZXIgY29ycmVzcG9uZGluZyB0byB0aGUgY3Jhc2guIEl0IGlzIHNldCB0byAwIGFuZAorICogICAgICAgbm90IGFsd2F5cyByZXZlYWxlZAorICogQGVscl9oYXNoOiBFeGNlcHRpb24gTGluayBSZWdpc3RlciBvYmZ1c2NhdGVkLCBhbHdheXMgcmV2ZWFsZWQKKyAqIEBpc19oYXNoOiBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBmYXIgYW5kIGVsciBoYXZlIGJlZW4gb2IKKyAqLworc3RydWN0IG1ldHJpY3NfcmVwb3J0X2NyYXNoX3JlcSB7CisgICAgY2hhciBhcHBfaWRbVVVJRF9TVFJfU0laRV07CisgICAgdWludDMyX3QgY3Jhc2hfcmVhc29uOworICAgIHVpbnQ2NF90IGZhcjsKKyAgICB1aW50OF90IGZhcl9oYXNoW0hBU0hfU0laRV9CWVRFU107CisgICAgdWludDY0X3QgZWxyOworICAgIHVpbnQ4X3QgZWxyX2hhc2hbSEFTSF9TSVpFX0JZVEVTXTsKKyAgICBib29sIGlzX2hhc2g7Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKIAotI2RlZmluZSBNRVRSSUNTX01BWF9NU0dfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoc2l6ZW9mKHN0cnVjdCBtZXRyaWNzX3JlcSkgKyBzaXplb2Yoc3RydWN0IG1ldHJpY3NfcmVwb3J0X2NyYXNoX3JlcSkgKyBcCi0gICAgIE1FVFJJQ1NfTUFYX0FQUF9JRF9MRU4pCitlbnVtIFRydXN0eVN0b3JhZ2VFcnJvclR5cGUgeworICBUUlVTVFlfU1RPUkFHRV9FUlJPUl9VTktOT1dOID0gMCwKKyAgVFJVU1RZX1NUT1JBR0VfRVJST1JfU1VQRVJCTE9DS19JTlZBTElEID0gMSwKKyAgVFJVU1RZX1NUT1JBR0VfRVJST1JfQkxPQ0tfTUFDX01JU01BVENIID0gMiwKKyAgVFJVU1RZX1NUT1JBR0VfRVJST1JfQkxPQ0tfSEVBREVSX0lOVkFMSUQgPSAzLAorICBUUlVTVFlfU1RPUkFHRV9FUlJPUl9SUE1CX0NPVU5URVJfTUlTTUFUQ0ggPSA0LAorICBUUlVTVFlfU1RPUkFHRV9FUlJPUl9SUE1CX0NPVU5URVJfTUlTTUFUQ0hfUkVDT1ZFUkVEID0gNSwKKyAgVFJVU1RZX1NUT1JBR0VfRVJST1JfUlBNQl9DT1VOVEVSX1JFQURfRkFJTFVSRSA9IDYsCisgIFRSVVNUWV9TVE9SQUdFX0VSUk9SX1JQTUJfTUFDX01JU01BVENIID0gNywKKyAgVFJVU1RZX1NUT1JBR0VfRVJST1JfUlBNQl9BRERSX01JU01BVENIID0gOCwKKyAgVFJVU1RZX1NUT1JBR0VfRVJST1JfUlBNQl9GQUlMVVJFX1JFU1BPTlNFID0gOSwKKyAgVFJVU1RZX1NUT1JBR0VfRVJST1JfUlBNQl9VTktOT1dOID0gMTAsCisgIFRSVVNUWV9TVE9SQUdFX0VSUk9SX1JQTUJfU0NTSV9FUlJPUiA9IDExLAorICBUUlVTVFlfU1RPUkFHRV9FUlJPUl9JT19FUlJPUiA9IDEyLAorICBUUlVTVFlfU1RPUkFHRV9FUlJPUl9QUk9YWV9DT01NVU5JQ0FUSU9OX0ZBSUxVUkUgPSAxMywKK307CisKK2VudW0gVHJ1c3R5RmlsZVN5c3RlbSB7CisgIFRSVVNUWV9GU19VTktOT1dOID0gMCwKKyAgVFJVU1RZX0ZTX1RQID0gMSwKKyAgVFJVU1RZX0ZTX1REID0gMiwKKyAgVFJVU1RZX0ZTX1REUCA9IDMsCisgIFRSVVNUWV9GU19UREVBID0gNCwKKyAgVFJVU1RZX0ZTX05TUCA9IDUsCit9OworCitlbnVtIFRydXN0eUJsb2NrVHlwZSB7CisgIFRSVVNUWV9CTE9DS1RZUEVfVU5LTk9XTiA9IDAsCisgIFRSVVNUWV9CTE9DS1RZUEVfRklMRVNfUk9PVCA9IDEsCisgIFRSVVNUWV9CTE9DS1RZUEVfRlJFRV9ST09UID0gMiwKKyAgVFJVU1RZX0JMT0NLVFlQRV9GSUxFU19JTlRFUk5BTCA9IDMsCisgIFRSVVNUWV9CTE9DS1RZUEVfRlJFRV9JTlRFUk5BTCA9IDQsCisgIFRSVVNUWV9CTE9DS1RZUEVfRklMRV9FTlRSWSA9IDUsCisgIFRSVVNUWV9CTE9DS1RZUEVfRklMRV9CTE9DS19NQVAgPSA2LAorICBUUlVTVFlfQkxPQ0tUWVBFX0ZJTEVfREFUQSA9IDcsCisgIFRSVVNUWV9CTE9DS1RZUEVfQ0hFQ0tQT0lOVF9ST09UID0gOCwKKyAgVFJVU1RZX0JMT0NLVFlQRV9DSEVDS1BPSU5UX0ZJTEVTX1JPT1QgPSA5LAorICBUUlVTVFlfQkxPQ0tUWVBFX0NIRUNLUE9JTlRfRlJFRV9ST09UID0gMTAsCit9OworCitzdHJ1Y3QgbWV0cmljc19yZXBvcnRfc3RvcmFnZV9lcnJvcl9yZXEgeworICAgIGVudW0gVHJ1c3R5U3RvcmFnZUVycm9yVHlwZSBlcnJvcjsKKyAgICBjaGFyIGFwcF9pZFtVVUlEX1NUUl9TSVpFXTsKKyAgICBjaGFyIGNsaWVudF9hcHBfaWRbVVVJRF9TVFJfU0laRV07CisgICAgdWludDMyX3Qgd3JpdGU7CisgICAgZW51bSBUcnVzdHlGaWxlU3lzdGVtIGZpbGVfc3lzdGVtOworICAgIHVpbnQ2NF90IGZpbGVfcGF0aF9oYXNoOworICAgIGVudW0gVHJ1c3R5QmxvY2tUeXBlIGJsb2NrX3R5cGU7CisgICAgdWludDY0X3QgcmVwYWlyX2NvdW50ZXI7Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworc3RydWN0IG1ldHJpY3NfbXNnIHsKKyAgICBzdHJ1Y3QgbWV0cmljc19yZXEgcmVxOworICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0IG1ldHJpY3NfcmVwb3J0X2NyYXNoX3JlcSBjcmFzaF9hcmdzOworICAgICAgICBzdHJ1Y3QgbWV0cmljc19yZXBvcnRfZXhpdF9yZXEgZXhpdF9hcmdzOworICAgICAgICBzdHJ1Y3QgbWV0cmljc19yZXBvcnRfc3RvcmFnZV9lcnJvcl9yZXEgc3RvcmFnZV9hcmdzOworICAgIH07Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVzdHkvbWV0cmljcy9tZXRyaWNzLmNwcCBiL3RydXN0eS9tZXRyaWNzL21ldHJpY3MuY3BwCmluZGV4IDNhYzEyOGEuLmQyZjBiMGEgMTAwNjQ0Ci0tLSBhL3RydXN0eS9tZXRyaWNzL21ldHJpY3MuY3BwCisrKyBiL3RydXN0eS9tZXRyaWNzL21ldHJpY3MuY3BwCkBAIC03OCw5ICs3OCw4IEBACiAgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJjb25uZWN0aW9uIHRvIE1ldHJpY3MgVEEgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldCI7CiAgICAgfQogCi0gICAgdWludDhfdCBtc2dbTUVUUklDU19NQVhfTVNHX1NJWkVdOwotCi0gICAgYXV0byByYyA9IHJlYWQobWV0cmljc19mZF8sIG1zZywgc2l6ZW9mKG1zZykpOworICAgIHN0cnVjdCBtZXRyaWNzX21zZyBtZXRyaWNzX21zZzsKKyAgICBpbnQgcmMgPSByZWFkKG1ldHJpY3NfZmRfLCAmbWV0cmljc19tc2csIHNpemVvZihtZXRyaWNzX21zZykpOwogICAgIGlmIChyYyA8IDApIHsKICAgICAgICAgcmV0dXJuIEVycm5vRXJyb3IoKSA8PCAiZmFpbGVkIHRvIHJlYWQgbWV0cmljcyBtZXNzYWdlIjsKICAgICB9CkBAIC04OSwyMyArODgsMTQgQEAKICAgICBpZiAobXNnX2xlbiA8IHNpemVvZihtZXRyaWNzX3JlcSkpIHsKICAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgIm1lc3NhZ2UgdG9vIHNtYWxsOiAiIDw8IHJjOwogICAgIH0KLSAgICBhdXRvIHJlcSA9IHJlaW50ZXJwcmV0X2Nhc3Q8bWV0cmljc19yZXEqPihtc2cpOwotICAgIHNpemVfdCBvZmZzZXQgPSBzaXplb2YobWV0cmljc19yZXEpOworICAgIHVpbnQzMl90IGNtZCA9IG1ldHJpY3NfbXNnLnJlcS5jbWQ7CiAgICAgdWludDMyX3Qgc3RhdHVzID0gTUVUUklDU19OT19FUlJPUjsKIAotICAgIHN3aXRjaCAocmVxLT5jbWQpIHsKKyAgICBzd2l0Y2ggKGNtZCkgewogICAgICAgICBjYXNlIE1FVFJJQ1NfQ01EX1JFUE9SVF9DUkFTSDogewotICAgICAgICAgICAgaWYgKG1zZ19sZW4gPCBvZmZzZXQgKyBzaXplb2YobWV0cmljc19yZXBvcnRfY3Jhc2hfcmVxKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFcnJvcigpIDw8ICJtZXNzYWdlIHRvbyBzbWFsbDogIiA8PCByYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF1dG8gY3Jhc2hfYXJncyA9IHJlaW50ZXJwcmV0X2Nhc3Q8bWV0cmljc19yZXBvcnRfY3Jhc2hfcmVxKj4obXNnICsgb2Zmc2V0KTsKLSAgICAgICAgICAgIG9mZnNldCArPSBzaXplb2YobWV0cmljc19yZXBvcnRfY3Jhc2hfcmVxKTsKLQotICAgICAgICAgICAgaWYgKG1zZ19sZW4gPCBvZmZzZXQgKyBjcmFzaF9hcmdzLT5hcHBfaWRfbGVuKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVycm9yKCkgPDwgIm1lc3NhZ2UgdG9vIHNtYWxsOiAiIDw8IHJjOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXV0byBhcHBfaWRfcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4obXNnICsgb2Zmc2V0KTsKLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGFwcF9pZChhcHBfaWRfcHRyLCBjcmFzaF9hcmdzLT5hcHBfaWRfbGVuKTsKKyAgICAgICAgICAgIHN0cnVjdCBtZXRyaWNzX3JlcG9ydF9jcmFzaF9yZXEgY3Jhc2hfYXJncyA9IG1ldHJpY3NfbXNnLmNyYXNoX2FyZ3M7CisgICAgICAgICAgICBhdXRvIGFwcF9pZF9wdHIgPSBjcmFzaF9hcmdzLmFwcF9pZDsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGFwcF9pZChhcHBfaWRfcHRyLCBVVUlEX1NUUl9TSVpFKTsKIAogICAgICAgICAgICAgSGFuZGxlQ3Jhc2goYXBwX2lkKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTIxLDcgKzExMSw3IEBACiAgICAgfQogCiAgICAgbWV0cmljc19yZXNwIHJlc3AgPSB7Ci0gICAgICAgICAgICAuY21kID0gcmVxLT5jbWQgfCBNRVRSSUNTX0NNRF9SRVNQX0JJVCwKKyAgICAgICAgICAgIC5jbWQgPSBjbWQgfCBNRVRSSUNTX0NNRF9SRVNQX0JJVCwKICAgICAgICAgICAgIC5zdGF0dXMgPSBzdGF0dXMsCiAgICAgfTsKIApkaWZmIC0tZ2l0IGEvdHJ1c3R5L3NlY3JldGtlZXBlci9BbmRyb2lkLmJwIGIvdHJ1c3R5L3NlY3JldGtlZXBlci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MjNlZGEKLS0tIC9kZXYvbnVsbAorKysgYi90cnVzdHkvc2VjcmV0a2VlcGVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw5NyBAQAorLy8KKy8vIENvcHlyaWdodCAoQykgMjAyMiBUaGUgQW5kcm9pZCBPcGVuLVNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCit9CisKK3J1c3RfYmluYXJ5IHsKKyAgICBuYW1lOiAiYW5kcm9pZC5oYXJkd2FyZS5zZWN1cml0eS5zZWNyZXRrZWVwZXIudHJ1c3R5IiwKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJodyIsCisgICAgdmVuZG9yOiB0cnVlLAorICAgIGluaXRfcmM6IFsiYW5kcm9pZC5oYXJkd2FyZS5zZWN1cml0eS5zZWNyZXRrZWVwZXIudHJ1c3R5LnJjIl0sCisgICAgdmludGZfZnJhZ21lbnRzOiBbImFuZHJvaWQuaGFyZHdhcmUuc2VjdXJpdHkuc2VjcmV0a2VlcGVyLnRydXN0eS54bWwiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJzcmMvaGFsX21haW4ucnMiLAorICAgIF0sCisgICAgcnVzdGxpYnM6IFsKKyAgICAgICAgImxpYmFuZHJvaWRfbG9nZ2VyIiwKKyAgICAgICAgImxpYmF1dGhncmFwaF9oYWwiLAorICAgICAgICAibGliYXV0aGdyYXBoX3dpcmUiLAorICAgICAgICAibGliYmluZGVyX3JzIiwKKyAgICAgICAgImxpYmxpYmMiLAorICAgICAgICAibGlibG9nX3J1c3QiLAorICAgICAgICAibGlic2VjcmV0a2VlcGVyX2hhbCIsCisgICAgICAgICJsaWJ0cnVzdHktcnMiLAorICAgIF0sCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgInNlY3JldGtlZXBlcl91c2VfbGF0ZXN0X2hhbF9haWRsX3J1c3QiLAorICAgIF0sCisgICAgcHJlZmVyX3JsaWI6IHRydWUsCit9CisKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAidHJ1c3R5X3NlY3JldGtlZXBlcl9mdXp6X2RlZmF1bHRzIiwKKyAgICBzcmNzOiBbIjp0cnVzdHlfdGlwY19mdXp6ZXIiXSwKKyAgICBmdXp6X2NvbmZpZzogeworICAgICAgICBjYzogWworICAgICAgICAgICAgImFsYW5zdG9rZXNAZ29vZ2xlLmNvbSIsCisgICAgICAgICAgICAiZHJ5c2RhbGVAZ29vZ2xlLmNvbSIsCisgICAgICAgICAgICAic2hpa2hhcGFud2FyQGdvb2dsZS5jb20iLAorICAgICAgICBdLAorICAgICAgICBjb21wb25lbnRpZDogODY3MTI1LAorICAgICAgICAvLyBUT0RPOiBhZGQgU2VjcmV0a2VlcGVyIGhvdGxpc3QKKyAgICAgICAgLy8gaG90bGlzdHM6IFsiIl0sCisgICAgfSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogInRydXN0eV9zZWNyZXRrZWVwZXJfc2tfZnV6emVyIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAidHJ1c3R5X2Z1enplcl9kZWZhdWx0cyIsCisgICAgICAgICJ0cnVzdHlfc2VjcmV0a2VlcGVyX2Z1enpfZGVmYXVsdHMiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRFRSVVNUWV9BUFBfUE9SVD1cImNvbS5hbmRyb2lkLnRydXN0eS5zZWNyZXRrZWVwZXJcIiIsCisgICAgICAgICItRFRSVVNUWV9BUFBfVVVJRD1cIjQ1ODJiZjEyLTFmN2QtNDgzMC05YmU1LTM2ZTZiZDkxYzJjNlwiIiwKKyAgICAgICAgIi1EVFJVU1RZX0FQUF9GSUxFTkFNRT1cInNlY3JldGtlZXBlcl9hcHAuc3ltcy5lbGZcIiIsCisgICAgXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogInRydXN0eV9zZWNyZXRrZWVwZXJfYWdfZnV6emVyIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAidHJ1c3R5X2Z1enplcl9kZWZhdWx0cyIsCisgICAgICAgICJ0cnVzdHlfc2VjcmV0a2VlcGVyX2Z1enpfZGVmYXVsdHMiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRFRSVVNUWV9BUFBfUE9SVD1cImNvbS5hbmRyb2lkLnRydXN0eS5zZWNyZXRrZWVwZXIuYXV0aGdyYXBoXCIiLAorICAgICAgICAiLURUUlVTVFlfQVBQX1VVSUQ9XCI0NTgyYmYxMi0xZjdkLTQ4MzAtOWJlNS0zNmU2YmQ5MWMyYzZcIiIsCisgICAgICAgICItRFRSVVNUWV9BUFBfRklMRU5BTUU9XCJzZWNyZXRrZWVwZXJfYXBwLnN5bXMuZWxmXCIiLAorICAgIF0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJ0cnVzdHlfc2VjcmV0a2VlcGVyX2JsX2Z1enplciIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgInRydXN0eV9mdXp6ZXJfZGVmYXVsdHMiLAorICAgICAgICAidHJ1c3R5X3NlY3JldGtlZXBlcl9mdXp6X2RlZmF1bHRzIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLURUUlVTVFlfQVBQX1BPUlQ9XCJjb20uYW5kcm9pZC50cnVzdHkuc2VjcmV0a2VlcGVyLmJvb3Rsb2FkZXJcIiIsCisgICAgICAgICItRFRSVVNUWV9BUFBfVVVJRD1cIjQ1ODJiZjEyLTFmN2QtNDgzMC05YmU1LTM2ZTZiZDkxYzJjNlwiIiwKKyAgICAgICAgIi1EVFJVU1RZX0FQUF9GSUxFTkFNRT1cInNlY3JldGtlZXBlcl9hcHAuc3ltcy5lbGZcIiIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL3RydXN0eS9zZWNyZXRrZWVwZXIvYW5kcm9pZC5oYXJkd2FyZS5zZWN1cml0eS5zZWNyZXRrZWVwZXIudHJ1c3R5LnJjIGIvdHJ1c3R5L3NlY3JldGtlZXBlci9hbmRyb2lkLmhhcmR3YXJlLnNlY3VyaXR5LnNlY3JldGtlZXBlci50cnVzdHkucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JlMDNhZAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9zZWNyZXRrZWVwZXIvYW5kcm9pZC5oYXJkd2FyZS5zZWN1cml0eS5zZWNyZXRrZWVwZXIudHJ1c3R5LnJjCkBAIC0wLDAgKzEsNCBAQAorc2VydmljZSB2ZW5kb3Iuc2VjcmV0a2VlcGVyLnRydXN0eSAvdmVuZG9yL2Jpbi9ody9hbmRyb2lkLmhhcmR3YXJlLnNlY3VyaXR5LnNlY3JldGtlZXBlci50cnVzdHkKKyAgICBjbGFzcyBoYWwKKyAgICB1c2VyIG5vYm9keQorICAgIGdyb3VwIGRybXJwYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydXN0eS9zZWNyZXRrZWVwZXIvYW5kcm9pZC5oYXJkd2FyZS5zZWN1cml0eS5zZWNyZXRrZWVwZXIudHJ1c3R5LnhtbCBiL3RydXN0eS9zZWNyZXRrZWVwZXIvYW5kcm9pZC5oYXJkd2FyZS5zZWN1cml0eS5zZWNyZXRrZWVwZXIudHJ1c3R5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWMxNTJiCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L3NlY3JldGtlZXBlci9hbmRyb2lkLmhhcmR3YXJlLnNlY3VyaXR5LnNlY3JldGtlZXBlci50cnVzdHkueG1sCkBAIC0wLDAgKzEsNyBAQAorPG1hbmlmZXN0IHZlcnNpb249IjEuMCIgdHlwZT0iZGV2aWNlIj4KKyAgICA8aGFsIGZvcm1hdD0iYWlkbCI+CisgICAgICAgIDxuYW1lPmFuZHJvaWQuaGFyZHdhcmUuc2VjdXJpdHkuc2VjcmV0a2VlcGVyPC9uYW1lPgorICAgICAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgorICAgICAgICA8ZnFuYW1lPklTZWNyZXRrZWVwZXIvZGVmYXVsdDwvZnFuYW1lPgorICAgIDwvaGFsPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3RydXN0eS9zZWNyZXRrZWVwZXIvc3JjL2hhbF9tYWluLnJzIGIvdHJ1c3R5L3NlY3JldGtlZXBlci9zcmMvaGFsX21haW4ucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMxZGIxMwotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS9zZWNyZXRrZWVwZXIvc3JjL2hhbF9tYWluLnJzCkBAIC0wLDAgKzEsMTQ5IEBACisvLworLy8gQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4tU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vISBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIHRoZSBIQUwgc2VydmljZSBmb3IgU2VjcmV0a2VlcGVyIGluIFRydXN0eS4KK3VzZSBhdXRoZ3JhcGhfaGFsOjpjaGFubmVsOjpTZXJpYWxpemVkQ2hhbm5lbDsKK3VzZSBhdXRoZ3JhcGhfd2lyZTo6ZnJhZ21lbnRhdGlvbjo6e0ZyYWdtZW50ZXIsIFJlYXNzZW1ibGVyfTsKK3VzZSBzZWNyZXRrZWVwZXJfaGFsOjpTZWNyZXRrZWVwZXJTZXJ2aWNlOwordXNlIGFuZHJvaWRfaGFyZHdhcmVfc2VjdXJpdHlfc2VjcmV0a2VlcGVyOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6c2VjdXJpdHk6OnNlY3JldGtlZXBlcjo6SVNlY3JldGtlZXBlcjo6eworICAgIElTZWNyZXRrZWVwZXIsIEJwU2VjcmV0a2VlcGVyLAorfTsKK3VzZSBsb2c6OntlcnJvciwgaW5mb307Cit1c2Ugc3RkOjp7CisgICAgZmZpOjpDU3RyaW5nLAorICAgIGZtdDo6RGVidWcsCisgICAgcGFuaWMsCisgICAgc3luYzo6e0FyYywgTXV0ZXh9LAorfTsKK3VzZSB0cnVzdHk6OkRFRkFVTFRfREVWSUNFOworCitjb25zdCBTS19USVBDX1NFUlZJQ0VfUE9SVDogJnN0ciA9ICJjb20uYW5kcm9pZC50cnVzdHkuc2VjcmV0a2VlcGVyIjsKK2NvbnN0IEFHX1RJUENfU0VSVklDRV9QT1JUOiAmc3RyID0gImNvbS5hbmRyb2lkLnRydXN0eS5zZWNyZXRrZWVwZXIuYXV0aGdyYXBoIjsKK2NvbnN0IFRJUENfTUFYX1NJWkU6IHVzaXplID0gNDAwMDsKKworc3RhdGljIFNFUlZJQ0VfSU5TVEFOQ0U6ICZzdHIgPSAiZGVmYXVsdCI7CisKKy8vLyBMb2NhbCBlcnJvciB0eXBlIGZvciBmYWlsdXJlcyBpbiB0aGUgSEFMIHNlcnZpY2UuCisjW2Rlcml2ZShEZWJ1ZywgQ2xvbmUpXQorc3RydWN0IEhhbFNlcnZpY2VFcnJvcihTdHJpbmcpOworCisjW2Rlcml2ZShEZWJ1ZyldCitzdHJ1Y3QgVGlwY0NoYW5uZWwgeworICAgIGNoYW5uZWw6IEFyYzxNdXRleDx0cnVzdHk6OlRpcGNDaGFubmVsPj4sCit9CisKK2ltcGwgVGlwY0NoYW5uZWwgeworICAgIGZuIG5ldyhjaGFubmVsOiB0cnVzdHk6OlRpcGNDaGFubmVsKSAtPiBTZWxmIHsKKyAgICAgICAgU2VsZiB7IGNoYW5uZWw6IEFyYzo6bmV3KE11dGV4OjpuZXcoY2hhbm5lbCkpIH0KKyAgICB9Cit9CisKK2ZuIGJpbmRlcnI8RTogRGVidWc+KG1zZzogJnN0ciwgZTogRSkgLT4gYmluZGVyOjpTdGF0dXMgeworICAgIGJpbmRlcjo6U3RhdHVzOjpuZXdfZXhjZXB0aW9uKAorICAgICAgICBiaW5kZXI6OkV4Y2VwdGlvbkNvZGU6OlRSQU5TQUNUSU9OX0ZBSUxFRCwKKyAgICAgICAgU29tZSgmQ1N0cmluZzo6bmV3KGZvcm1hdCEoIkZhaWxlZCB0byB7bXNnfSB2aWEgdGlwYyBjaGFubmVsOiB7ZTo/fSIsKSkudW53cmFwKCkpLAorICAgICkKK30KKworaW1wbCBTZXJpYWxpemVkQ2hhbm5lbCBmb3IgVGlwY0NoYW5uZWwgeworICAgIC8vIE5vIG1heGltdW0gc2l6ZSBmb3IgbWVzc2FnZXMgcGFzc2VkIHRvIGBleGVjdXRlKClgIGJlY2F1c2UgaXQgcGVyZm9ybXMgZnJhZ21lbnRhdGlvbgorICAgIC8vIGFuZCByZWFzc2VtYmx5IGludGVybmFsbHkuCisgICAgY29uc3QgTUFYX1NJWkU6IHVzaXplID0gdXNpemU6Ok1BWDsKKworICAgIGZuIGV4ZWN1dGUoJnNlbGYsIHJlcV9kYXRhOiAmW3U4XSkgLT4gYmluZGVyOjpSZXN1bHQ8VmVjPHU4Pj4geworICAgICAgICAvLyBIb2xkIGxvY2sgYWNyb3NzIGJvdGggcmVxdWVzdCBhbmQgcmVzcG9uc2UuCisgICAgICAgIGxldCBtdXQgY2hhbm5lbCA9IHNlbGYuY2hhbm5lbC5sb2NrKCkudW53cmFwKCk7CisgICAgICAgIGxldCBtdXQgcGVuZGluZ19yc3AgPSBSZWFzc2VtYmxlcjo6ZGVmYXVsdCgpOworCisgICAgICAgIC8vIEJyZWFrIHJlcXVlc3QgbWVzc2FnZSBpbnRvIGZyYWdtZW50cyB0byBzZW5kLgorICAgICAgICBmb3IgcmVxX2ZyYWcgaW4gRnJhZ21lbnRlcjo6bmV3KHJlcV9kYXRhLCBUSVBDX01BWF9TSVpFKSB7CisgICAgICAgICAgICBjaGFubmVsLnNlbmQoJnJlcV9mcmFnKS5tYXBfZXJyKHxlfCBiaW5kZXJyKCJzZW5kIHJlcXVlc3QiLCBlKSk/OworCisgICAgICAgICAgICAvLyBFdmVyeSByZXF1ZXN0IGdldHMgYSByZXNwb25zZS4KKyAgICAgICAgICAgIGxldCBtdXQgcnNwX2ZyYWcgPSBWZWM6Om5ldygpOworICAgICAgICAgICAgY2hhbm5lbC5yZWN2KCZtdXQgcnNwX2ZyYWcpLm1hcF9lcnIofGV8IGJpbmRlcnIoInJlY2VpdmUgcmVzcG9uc2UiLCBlKSk/OworCisgICAgICAgICAgICBpZiBsZXQgU29tZShmdWxsX3JzcCkgPSBwZW5kaW5nX3JzcC5hY2N1bXVsYXRlKCZyc3BfZnJhZykgeworICAgICAgICAgICAgICAgIHJldHVybiBPayhmdWxsX3JzcC50b192ZWMoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhlcmUgbWF5IGJlIGFkZGl0aW9uYWwgcmVzcG9uc2UgZnJhZ21lbnRzIHRvIHJlY2VpdmUuCisgICAgICAgIGxvb3AgeworICAgICAgICAgICAgbGV0IG11dCByc3BfZnJhZyA9IFZlYzo6bmV3KCk7CisgICAgICAgICAgICBjaGFubmVsLnJlY3YoJm11dCByc3BfZnJhZykubWFwX2Vycih8ZXwgYmluZGVycigicmVjZWl2ZSByZXNwb25zZSIsIGUpKT87CisgICAgICAgICAgICBpZiBsZXQgU29tZShmdWxsX3JzcCkgPSBwZW5kaW5nX3JzcC5hY2N1bXVsYXRlKCZyc3BfZnJhZykgeworICAgICAgICAgICAgICAgIHJldHVybiBPayhmdWxsX3JzcC50b192ZWMoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ZuIG1haW4oKSB7CisgICAgaWYgbGV0IEVycihIYWxTZXJ2aWNlRXJyb3IoZSkpID0gaW5uZXJfbWFpbigpIHsKKyAgICAgICAgcGFuaWMhKCJIQUwgc2VydmljZSBmYWlsZWQ6IHs6P30iLCBlKTsKKyAgICB9Cit9CisKK2ZuIGlubmVyX21haW4oKSAtPiBSZXN1bHQ8KCksIEhhbFNlcnZpY2VFcnJvcj4geworICAgIC8vIEluaXRpYWxpemUgQW5kcm9pZCBsb2dnaW5nLgorICAgIGFuZHJvaWRfbG9nZ2VyOjppbml0X29uY2UoCisgICAgICAgIGFuZHJvaWRfbG9nZ2VyOjpDb25maWc6OmRlZmF1bHQoKQorICAgICAgICAgICAgLndpdGhfdGFnKCJzZWNyZXRrZWVwZXItaGFsLXRydXN0eSIpCisgICAgICAgICAgICAud2l0aF9tYXhfbGV2ZWwobG9nOjpMZXZlbEZpbHRlcjo6SW5mbykKKyAgICAgICAgICAgIC53aXRoX2xvZ19idWZmZXIoYW5kcm9pZF9sb2dnZXI6OkxvZ0lkOjpTeXN0ZW0pLAorICAgICk7CisgICAgLy8gUmVkaXJlY3QgcGFuaWMgbWVzc2FnZXMgdG8gbG9nY2F0LgorICAgIHBhbmljOjpzZXRfaG9vayhCb3g6Om5ldyh8cGFuaWNfaW5mb3wgeworICAgICAgICBlcnJvciEoInt9IiwgcGFuaWNfaW5mbyk7CisgICAgfSkpOworCisgICAgaW5mbyEoIlRydXN0eSBTZWNyZXRrZWVwZXIgSEFMIHNlcnZpY2UgaXMgc3RhcnRpbmcuIik7CisKKyAgICBpbmZvISgiU3RhcnRpbmcgdGhyZWFkIHBvb2wgbm93LiIpOworICAgIGJpbmRlcjo6UHJvY2Vzc1N0YXRlOjpzdGFydF90aHJlYWRfcG9vbCgpOworCisgICAgLy8gQ3JlYXRlIGNvbm5lY3Rpb25zIHRvIHRoZSBUQS4KKyAgICBsZXQgYWdfY29ubmVjdGlvbiA9IHRydXN0eTo6VGlwY0NoYW5uZWw6OmNvbm5lY3QoREVGQVVMVF9ERVZJQ0UsIEFHX1RJUENfU0VSVklDRV9QT1JUKQorICAgICAgICAubWFwX2Vycih8ZXwgeworICAgICAgICAgICAgSGFsU2VydmljZUVycm9yKGZvcm1hdCEoCisgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjb25uZWN0IHRvIFRydXN0eSBwb3J0IHtBR19USVBDX1NFUlZJQ0VfUE9SVH0gYmVjYXVzZSBvZiB7Oj99LiIsCisgICAgICAgICAgICAgICAgZQorICAgICAgICAgICAgKSkKKyAgICAgICAgfSk/OworICAgIGxldCBhZ190aXBjX2NoYW5uZWwgPSBUaXBjQ2hhbm5lbDo6bmV3KGFnX2Nvbm5lY3Rpb24pOworCisgICAgbGV0IHNrX2Nvbm5lY3Rpb24gPSB0cnVzdHk6OlRpcGNDaGFubmVsOjpjb25uZWN0KERFRkFVTFRfREVWSUNFLCBTS19USVBDX1NFUlZJQ0VfUE9SVCkKKyAgICAgICAgLm1hcF9lcnIofGV8IHsKKyAgICAgICAgICAgIEhhbFNlcnZpY2VFcnJvcihmb3JtYXQhKAorICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY29ubmVjdCB0byBUcnVzdHkgcG9ydCB7U0tfVElQQ19TRVJWSUNFX1BPUlR9IGJlY2F1c2Ugb2Ygezo/fS4iLAorICAgICAgICAgICAgICAgIGUKKyAgICAgICAgICAgICkpCisgICAgICAgIH0pPzsKKyAgICBsZXQgc2tfdGlwY19jaGFubmVsID0gVGlwY0NoYW5uZWw6Om5ldyhza19jb25uZWN0aW9uKTsKKworICAgIC8vIFJlZ2lzdGVyIHRoZSBBSURMIHNlcnZpY2UKKyAgICBsZXQgc2VydmljZSA9IFNlY3JldGtlZXBlclNlcnZpY2U6Om5ld19hc19iaW5kZXIoc2tfdGlwY19jaGFubmVsLCBhZ190aXBjX2NoYW5uZWwpOworICAgIGxldCBzZXJ2aWNlX25hbWUgPQorICAgICAgICBmb3JtYXQhKCJ7fS97fSIsIDxCcFNlY3JldGtlZXBlciBhcyBJU2VjcmV0a2VlcGVyPjo6Z2V0X2Rlc2NyaXB0b3IoKSwgU0VSVklDRV9JTlNUQU5DRSk7CisgICAgYmluZGVyOjphZGRfc2VydmljZSgmc2VydmljZV9uYW1lLCBzZXJ2aWNlLmFzX2JpbmRlcigpKS5tYXBfZXJyKHxlfCB7CisgICAgICAgIEhhbFNlcnZpY2VFcnJvcihmb3JtYXQhKCJGYWlsZWQgdG8gcmVnaXN0ZXIgc2VydmljZSB7fSBiZWNhdXNlIG9mIHs6P30uIiwgc2VydmljZV9uYW1lLCBlKSkKKyAgICB9KT87CisKKyAgICBpbmZvISgiU3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQgU2VjcmV0a2VlcGVyIEhBTCBzZXJ2aWNlLiIpOworICAgIGluZm8hKCJKb2luaW5nIHRocmVhZCBwb29sIG5vdy4iKTsKKyAgICBiaW5kZXI6OlByb2Nlc3NTdGF0ZTo6am9pbl90aHJlYWRfcG9vbCgpOworICAgIGluZm8hKCJTZWNyZXRrZWVwZXIgSEFMIHNlcnZpY2UgaXMgdGVybWluYXRpbmcuIik7IC8vIHNob3VsZCBub3QgcmVhY2ggaGVyZQorICAgIE9rKCgpKQorfQpkaWZmIC0tZ2l0IGEvdHJ1c3R5L3N0YXRzL3Rlc3QvUkVBRE1FLm1kIGIvdHJ1c3R5L3N0YXRzL3Rlc3QvUkVBRE1FLm1kCmluZGV4IDQ1ZTZhZjguLjE3NTQwOWUgMTAwNjQ0Ci0tLSBhL3RydXN0eS9zdGF0cy90ZXN0L1JFQURNRS5tZAorKysgYi90cnVzdHkvc3RhdHMvdGVzdC9SRUFETUUubWQKQEAgLTEsOCArMSw4IEBACiAjIERldmVsb3BtZW50IE5vdGVzCiAKLSogICAgRmlyc3QgZ2V0IFtyZXBvX3B1bGwucHkgYW5kIGdlcnJpdC5weV0oaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vZGV2ZWxvcG1lbnQvKy9tYXN0ZXIvdG9vbHMvcmVwb19wdWxsLykgZnJvbSBhb3NwLgorKiAgICBGaXJzdCBnZXQgW3JlcG9fcHVsbC5weSBhbmQgZ2Vycml0LnB5XShodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9kZXZlbG9wbWVudC8rL21haW4vdG9vbHMvcmVwb19wdWxsLykgZnJvbSBhb3NwLgogCi0qICAgIEFsdGhvdWdoIHRoaXMgcmVwbyBpcyBub3QgY3VycmVudGx5IGluIFRydXN0eeKAmXMgbWFuaWZlc3QsIGl04oCZcyBzdWZmaWNpZW50IHRvIGNvcHkgdGhlc2UgdHdvIHB5dGhvbiBzY3JpcHRzIHRvIHRoZSByb290IG9mIHRoZSBUcnVzdHkgcHJvamVjdCBhbmQgcnVuIHRoZW0gZnJvbSB0aGVyZS4gTWFrZSBzdXJlIHRvIGZvbGxvdyB0aGUgW3JlcG9fcHVsbCBpbnN0YWxsYXRpb25dKGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL2RldmVsb3BtZW50LysvbWFzdGVyL3Rvb2xzL3JlcG9fcHVsbC8jaW5zdGFsbGF0aW9uKSBzdGVwcyBpZiBuZWNlc3NhcnkuCisqICAgIEFsdGhvdWdoIHRoaXMgcmVwbyBpcyBub3QgY3VycmVudGx5IGluIFRydXN0eeKAmXMgbWFuaWZlc3QsIGl04oCZcyBzdWZmaWNpZW50IHRvIGNvcHkgdGhlc2UgdHdvIHB5dGhvbiBzY3JpcHRzIHRvIHRoZSByb290IG9mIHRoZSBUcnVzdHkgcHJvamVjdCBhbmQgcnVuIHRoZW0gZnJvbSB0aGVyZS4gTWFrZSBzdXJlIHRvIGZvbGxvdyB0aGUgW3JlcG9fcHVsbCBpbnN0YWxsYXRpb25dKGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL2RldmVsb3BtZW50LysvbWFpbi90b29scy9yZXBvX3B1bGwvI2luc3RhbGxhdGlvbikgc3RlcHMgaWYgbmVjZXNzYXJ5LgogCiAjIyBCdWlsZAogCmRpZmYgLS1naXQgYS90cnVzdHkvc3RhdHMvdGVzdC9zdGF0c190ZXN0LmNwcCBiL3RydXN0eS9zdGF0cy90ZXN0L3N0YXRzX3Rlc3QuY3BwCmluZGV4IDFlZGRkZWIuLjFkNmViMzQgMTAwNjQ0Ci0tLSBhL3RydXN0eS9zdGF0cy90ZXN0L3N0YXRzX3Rlc3QuY3BwCisrKyBiL3RydXN0eS9zdGF0cy90ZXN0L3N0YXRzX3Rlc3QuY3BwCkBAIC0yNTIsMjAgKzI1MiwyMCBAQAogICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OkFueU9mKDo6dGVzdGluZzo6RXEoVHJ1c3R5QXRvbXM6OlRydXN0eUFwcENyYXNoZWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6RXEoVHJ1c3R5QXRvbXM6OlRydXN0eUVycm9yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OkVxKFRydXN0eUF0b21zOjpUcnVzdHlTdG9yYWdlRXJyb3IpKSk7Ci0gICAgICAgIEFTU0VSVF9TVFJFUShTdHJpbmc4KHZlbmRvckF0b20ucmV2ZXJzZURvbWFpbk5hbWUpLCAiZ29vZ2xlLmFuZHJvaWQudHJ1c3R5Iik7CisgICAgICAgIEFTU0VSVF9FUShTdHJpbmc4KHZlbmRvckF0b20ucmV2ZXJzZURvbWFpbk5hbWUpLCAiZ29vZ2xlLmFuZHJvaWQudHJ1c3R5Iik7CiAgICAgICAgIHN3aXRjaCAodmVuZG9yQXRvbS5hdG9tSWQpIHsKICAgICAgICAgICAgIGNhc2UgVHJ1c3R5QXRvbXM6OlRydXN0eUFwcENyYXNoZWQ6CiAgICAgICAgICAgICAgICAgKythdG9tQXBwQ3Jhc2hlZENudDsKLSAgICAgICAgICAgICAgICBBU1NFUlRfU1RSRVEoU3RyaW5nOCh2ZW5kb3JBdG9tLnZhbHVlc1swXS5nZXQ8VmVuZG9yQXRvbVZhbHVlOjpzdHJpbmdWYWx1ZT4oKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICI1MjQ3ZDE5Yi1jZjA5LTQyNzItYTQ1MC0zZWYyMGRiZWZjMTQiKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoU3RyaW5nOCh2ZW5kb3JBdG9tLnZhbHVlc1swXS5nZXQ8VmVuZG9yQXRvbVZhbHVlOjpzdHJpbmdWYWx1ZT4oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICI1MjQ3ZDE5Yi1jZjA5LTQyNzItYTQ1MC0zZWYyMGRiZWZjMTQiKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgVHJ1c3R5QXRvbXM6OlRydXN0eVN0b3JhZ2VFcnJvcjoKICAgICAgICAgICAgICAgICArK2F0b21TdG9yYWdlRXJyb3JDbnQ7CiAgICAgICAgICAgICAgICAgQVNTRVJUX0VRKHZlbmRvckF0b20udmFsdWVzWzBdLmdldDxWZW5kb3JBdG9tVmFsdWU6OmludFZhbHVlPigpLCA1KTsKLSAgICAgICAgICAgICAgICBBU1NFUlRfU1RSRVEoU3RyaW5nOCh2ZW5kb3JBdG9tLnZhbHVlc1sxXS5nZXQ8VmVuZG9yQXRvbVZhbHVlOjpzdHJpbmdWYWx1ZT4oKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICI1MjQ3ZDE5Yi1jZjA5LTQyNzItYTQ1MC0zZWYyMGRiZWZjMTQiKTsKLSAgICAgICAgICAgICAgICBBU1NFUlRfU1RSRVEoU3RyaW5nOCh2ZW5kb3JBdG9tLnZhbHVlc1syXS5nZXQ8VmVuZG9yQXRvbVZhbHVlOjpzdHJpbmdWYWx1ZT4oKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICI1MjQ3ZDE5Yi1jZjA5LTQyNzItYTQ1MC0zZWYyMGRiZWZjMTQiKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoU3RyaW5nOCh2ZW5kb3JBdG9tLnZhbHVlc1sxXS5nZXQ8VmVuZG9yQXRvbVZhbHVlOjpzdHJpbmdWYWx1ZT4oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICI1MjQ3ZDE5Yi1jZjA5LTQyNzItYTQ1MC0zZWYyMGRiZWZjMTQiKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoU3RyaW5nOCh2ZW5kb3JBdG9tLnZhbHVlc1syXS5nZXQ8VmVuZG9yQXRvbVZhbHVlOjpzdHJpbmdWYWx1ZT4oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICI1MjQ3ZDE5Yi1jZjA5LTQyNzItYTQ1MC0zZWYyMGRiZWZjMTQiKTsKICAgICAgICAgICAgICAgICBBU1NFUlRfRVEodmVuZG9yQXRvbS52YWx1ZXNbM10uZ2V0PFZlbmRvckF0b21WYWx1ZTo6aW50VmFsdWU+KCksIDEpOwogICAgICAgICAgICAgICAgIEFTU0VSVF9FUSh2ZW5kb3JBdG9tLnZhbHVlc1s0XS5nZXQ8VmVuZG9yQXRvbVZhbHVlOjppbnRWYWx1ZT4oKSwgMyk7CiAgICAgICAgICAgICAgICAgQVNTRVJUX0VRKHZlbmRvckF0b20udmFsdWVzWzVdLmdldDxWZW5kb3JBdG9tVmFsdWU6OmxvbmdWYWx1ZT4oKSwKQEAgLTMzMCwxMyArMzMwLDEzIEBACiAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6QW55T2YoOjp0ZXN0aW5nOjpFcShUcnVzdHlBdG9tczo6VHJ1c3R5QXBwQ3Jhc2hlZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpFcShUcnVzdHlBdG9tczo6VHJ1c3R5RXJyb3IpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6RXEoVHJ1c3R5QXRvbXM6OlRydXN0eVN0b3JhZ2VFcnJvcikpKTsKLSAgICAgICAgQVNTRVJUX1NUUkVRKFN0cmluZzgodmVuZG9yQXRvbS5yZXZlcnNlRG9tYWluTmFtZSksICJnb29nbGUuYW5kcm9pZC50cnVzdHkiKTsKKyAgICAgICAgQVNTRVJUX0VRKFN0cmluZzgodmVuZG9yQXRvbS5yZXZlcnNlRG9tYWluTmFtZSksICJnb29nbGUuYW5kcm9pZC50cnVzdHkiKTsKIAogICAgICAgICBzd2l0Y2ggKHZlbmRvckF0b20uYXRvbUlkKSB7CiAgICAgICAgICAgICBjYXNlIFRydXN0eUF0b21zOjpUcnVzdHlBcHBDcmFzaGVkOgogICAgICAgICAgICAgICAgICsrYXRvbUFwcENyYXNoZWRDbnQ7Ci0gICAgICAgICAgICAgICAgQVNTRVJUX1NUUkVRKFN0cmluZzgodmVuZG9yQXRvbS52YWx1ZXNbMF0uZ2V0PFZlbmRvckF0b21WYWx1ZTo6c3RyaW5nVmFsdWU+KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVHJ1c3R5Q3Jhc2hlclV1aWQpOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShTdHJpbmc4KHZlbmRvckF0b20udmFsdWVzWzBdLmdldDxWZW5kb3JBdG9tVmFsdWU6OnN0cmluZ1ZhbHVlPigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAga1RydXN0eUNyYXNoZXJVdWlkKTsKICAgICAgICAgICAgICAgICBhdG9tQ3Jhc2hSZWFzb25zLnB1c2hfYmFjayh2ZW5kb3JBdG9tLnZhbHVlc1sxXS5nZXQ8VmVuZG9yQXRvbVZhbHVlOjppbnRWYWx1ZT4oKSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFRydXN0eUF0b21zOjpUcnVzdHlTdG9yYWdlRXJyb3I6CkBAIC0zNDQsNyArMzQ0LDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgVHJ1c3R5QXRvbXM6OlRydXN0eUVycm9yOgogICAgICAgICAgICAgICAgICsrYXRvbVRydXN0eUVycm9yQ250OwotICAgICAgICAgICAgICAgIEFTU0VSVF9TVFJFUShTdHJpbmc4KHZlbmRvckF0b20udmFsdWVzWzFdLmdldDxWZW5kb3JBdG9tVmFsdWU6OnN0cmluZ1ZhbHVlPigpKSwgIiIpOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShTdHJpbmc4KHZlbmRvckF0b20udmFsdWVzWzFdLmdldDxWZW5kb3JBdG9tVmFsdWU6OnN0cmluZ1ZhbHVlPigpKSwgIiIpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBGQUlMKCkgPDwgIlVua25vd24gdmVuZG9yIGF0b20gSUQ6ICIgPDwgdmVuZG9yQXRvbS5hdG9tSWQ7CmRpZmYgLS1naXQgYS90cnVzdHkvc3RvcmFnZS9pbnRlcmZhY2UvQW5kcm9pZC5icCBiL3RydXN0eS9zdG9yYWdlL2ludGVyZmFjZS9BbmRyb2lkLmJwCmluZGV4IGQwMzFiMGMuLjc2OWY1M2QgMTAwNjQ0Ci0tLSBhL3RydXN0eS9zdG9yYWdlL2ludGVyZmFjZS9BbmRyb2lkLmJwCisrKyBiL3RydXN0eS9zdG9yYWdlL2ludGVyZmFjZS9BbmRyb2lkLmJwCkBAIC0yMCw2ICsyMCw3IEBACiAKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlidHJ1c3R5c3RvcmFnZWludGVyZmFjZSIsCi0gICAgdmVuZG9yOiB0cnVlLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgc3lzdGVtX2V4dF9zcGVjaWZpYzogdHJ1ZSwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKIH0KZGlmZiAtLWdpdCBhL3RydXN0eS9zdG9yYWdlL3Byb3h5L0FuZHJvaWQuYnAgYi90cnVzdHkvc3RvcmFnZS9wcm94eS9BbmRyb2lkLmJwCmluZGV4IDJlOTdlZTAuLmYzMjE4OGEgMTAwNjQ0Ci0tLSBhL3RydXN0eS9zdG9yYWdlL3Byb3h5L0FuZHJvaWQuYnAKKysrIGIvdHJ1c3R5L3N0b3JhZ2UvcHJveHkvQW5kcm9pZC5icApAQCAtMTgsMTAgKzE4LDggQEAKICAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCiB9CiAKLWNjX2JpbmFyeSB7Ci0gICAgbmFtZTogInN0b3JhZ2Vwcm94eWQiLAotICAgIHZlbmRvcjogdHJ1ZSwKLQorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJzdG9yYWdlcHJveHlkLmRlZmF1bHRzIiwKICAgICBzcmNzOiBbCiAgICAgICAgICJjaGVja3BvaW50X2hhbmRsaW5nLmNwcCIsCiAgICAgICAgICJpcGMuYyIsCkBAIC0zMyw2ICszMSw3IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGliaGFyZHdhcmVfbGVnYWN5IiwKQEAgLTQ2LDkgKzQ1LDIyIEBACiAgICAgICAgICJsaWJ0cnVzdHlzdG9yYWdlaW50ZXJmYWNlIiwKICAgICAgICAgImxpYnRydXN0eSIsCiAgICAgXSwKLQogICAgIGNmbGFnczogWwogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKIH0KKworY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAic3RvcmFnZXByb3h5ZCIsCisgICAgZGVmYXVsdHM6IFsic3RvcmFnZXByb3h5ZC5kZWZhdWx0cyJdLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICAvLyB2ZW5kb3IgdmFyaWFudCByZXF1aXJlcyB0aGlzIGZsYWcKKyAgICBjZmxhZ3M6IFsiLURWRU5ET1JfRlNfUkVBRFlfUFJPUEVSVFkiXSwKK30KKworY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAic3RvcmFnZXByb3h5ZC5zeXN0ZW0iLAorICAgIGRlZmF1bHRzOiBbInN0b3JhZ2Vwcm94eWQuZGVmYXVsdHMiXSwKKyAgICBzeXN0ZW1fZXh0X3NwZWNpZmljOiB0cnVlLAorfQpkaWZmIC0tZ2l0IGEvdHJ1c3R5L3N0b3JhZ2UvcHJveHkvcHJveHkuYyBiL3RydXN0eS9zdG9yYWdlL3Byb3h5L3Byb3h5LmMKaW5kZXggYzg5YzViNi4uNmNiNzJkNSAxMDA2NDQKLS0tIGEvdHJ1c3R5L3N0b3JhZ2UvcHJveHkvcHJveHkuYworKysgYi90cnVzdHkvc3RvcmFnZS9wcm94eS9wcm94eS5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3Byb2Nlc3MuaD4KICNpbmNsdWRlIDxjdXRpbHMvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgogCiAjaW5jbHVkZSAiY2hlY2twb2ludF9oYW5kbGluZy5oIgpAQCAtNDAsOSArNDEsMTMgQEAKIHN0YXRpYyBjb25zdCBjaGFyKiB0cnVzdHlfZGV2bmFtZTsKIHN0YXRpYyBjb25zdCBjaGFyKiBycG1iX2Rldm5hbWU7CiBzdGF0aWMgY29uc3QgY2hhciogc3Nfc3J2X25hbWUgPSBTVE9SQUdFX0RJU0tfUFJPWFlfUE9SVDsKK3N0YXRpYyBjb25zdCBjaGFyKiBtYXhfZmlsZV9zaXplX2Zyb207CiAKIHN0YXRpYyBlbnVtIGRldl90eXBlIGRldl90eXBlID0gTU1DX1JQTUI7CiAKKy8qIExpc3QgaGVhZCBmb3Igc3RvcmFnZSBtYXBwaW5nLCBlbGVtZW50cyBhZGRlZCBhdCBpbml0LCBhbmQgbmV2ZXIgcmVtb3ZlZCAqLworc3RhdGljIHN0cnVjdCBzdG9yYWdlX21hcHBpbmdfbm9kZSogc3RvcmFnZV9tYXBwaW5nX2hlYWQ7CisKIHN0YXRpYyBlbnVtIGRldl90eXBlIHBhcnNlX2Rldl90eXBlKGNvbnN0IGNoYXIqIGRldl90eXBlX25hbWUpIHsKICAgICBpZiAoIXN0cmNtcChkZXZfdHlwZV9uYW1lLCAibW1jIikpIHsKICAgICAgICAgcmV0dXJuIE1NQ19SUE1COwpAQCAtNTcsMTcgKzYyLDYxIEBACiAgICAgfQogfQogCi1zdGF0aWMgY29uc3QgY2hhciogX3NvcHRzID0gImhwOmQ6cjp0OiI7CitzdGF0aWMgaW50IHBhcnNlX2FuZF9hcHBlbmRfZmlsZV9tYXBwaW5nKGNvbnN0IGNoYXIqIGZpbGVfbWFwcGluZykgeworICAgIGlmIChmaWxlX21hcHBpbmcgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiUHJvdmlkZWQgZmlsZSBtYXBwaW5nIGlzIG51bGxcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGNoYXIqIGZpbGVfbWFwcGluZ19kdXAgPSBzdHJkdXAoZmlsZV9tYXBwaW5nKTsKKyAgICBpZiAoZmlsZV9tYXBwaW5nX2R1cCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJDb3VsZG4ndCBkdXBsaWNhdGUgc3RyaW5nOiAlc1xuIiwgZmlsZV9tYXBwaW5nKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBjb25zdCBjaGFyKiBmaWxlX25hbWUgPSBzdHJ0b2soZmlsZV9tYXBwaW5nX2R1cCwgIjoiKTsKKyAgICBpZiAoZmlsZV9uYW1lID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIk5vIGZpbGUgbmFtZSBmb3VuZFxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgY29uc3QgY2hhciogYmFja2luZ19zdG9yYWdlID0gc3RydG9rKE5VTEwsICI6Iik7CisgICAgaWYgKGJhY2tpbmdfc3RvcmFnZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJObyBiYWNraW5nIHN0b3JhZ2UgZm91bmRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgc3RydWN0IHN0b3JhZ2VfbWFwcGluZ19ub2RlKiBuZXdfbm9kZSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHN0b3JhZ2VfbWFwcGluZ19ub2RlKSk7CisgICAgaWYgKG5ld19ub2RlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkNvdWxkbid0IGFsbG9jYXRlIGFkZGl0aW9uYWwgc3RvcmFnZV9tYXBwaW5nX25vZGVcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgICpuZXdfbm9kZSA9IChzdHJ1Y3Qgc3RvcmFnZV9tYXBwaW5nX25vZGUpey5maWxlX25hbWUgPSBmaWxlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJhY2tpbmdfc3RvcmFnZSA9IGJhY2tpbmdfc3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmV4dCA9IHN0b3JhZ2VfbWFwcGluZ19oZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mZCA9IC0xfTsKKyAgICBzdG9yYWdlX21hcHBpbmdfaGVhZCA9IG5ld19ub2RlOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciogX3NvcHRzID0gImhwOmQ6cjp0Om06ZjoiOwogc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gX2xvcHRzW10gPSB7eyJoZWxwIiwgbm9fYXJndW1lbnQsIE5VTEwsICdoJ30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7InRydXN0eV9kZXYiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2QnfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiZGF0YV9wYXRoIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdwJ30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7InJwbWJfZGV2IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdyJ30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ImRldl90eXBlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICd0J30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im1heF9maWxlX3NpemVfZnJvbSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnbSd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJmaWxlX3N0b3JhZ2VfbWFwcGluZyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnZid9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIDAsIDAsIDB9fTsKIAogc3RhdGljIHZvaWQgc2hvd191c2FnZV9hbmRfZXhpdChpbnQgY29kZSkgewotICAgIEFMT0dFKCJ1c2FnZTogc3RvcmFnZXByb3h5ZCAtZCA8dHJ1c3R5X2Rldj4gLXAgPGRhdGFfcGF0aD4gLXIgPHJwbWJfZGV2PiAtdCA8ZGV2X3R5cGU+XG4iKTsKKyAgICBBTE9HRSgidXNhZ2U6IHN0b3JhZ2Vwcm94eWQgLWQgPHRydXN0eV9kZXY+IC1wIDxkYXRhX3BhdGg+IC1yIDxycG1iX2Rldj4gLXQgPGRldl90eXBlPiAgWy1tICIKKyAgICAgICAgICAiPGZpbGU+XSBbLWYgPGZpbGU+OjxtYXBwaW5nPl1cbiIpOwogICAgIEFMT0dFKCJBdmFpbGFibGUgZGV2IHR5cGVzOiBtbWMsIHZpcnRcbiIpOworICAgIEFMT0dFKCItZiA9IE1hcHMgc2VjdXJlIHN0b3JhZ2UgZmlsZXMgbGlrZSBgMGAgYW5kIGBwZXJzaXN0LzBgXG4iCisgICAgICAgICAgInRvIGJsb2NrIGRldmljZXMuICBTdG9yYWdlcHJveHlkIHdpbGwgaGFuZGxlIGNyZWF0aW5nIHRoZVxuIgorICAgICAgICAgICJhcHByb3ByaWF0ZSBzeW1saW5rcyBpbiB0aGUgcm9vdCBkYXRhcGF0aC5cbiIpOworICAgIEFMT0dFKCItbSA9IFNwZWNpZmllcyB0aGUgbWF4IHNpemUgY29uc3RyYWludCBmb3IgZmlsZSBiYWNrZWQgc3RvcmFnZXMuXG4iCisgICAgICAgICAgIlRoZSBjb25zdHJhaW50IGlzIGNob3NlbiBieSBnaXZpbmcgYSBmaWxlLCB0aGlzIGFsbG93cyBmb3IgcGFzc2luZyBhXG4iCisgICAgICAgICAgImJsb2NrIGRldmljZSBmb3Igd2hpY2ggYSBtYXggZmlsZSBzaXplIGNhbiBiZSBxdWVyaWVkLiAgRmlsZSBiYXNlZFxuIgorICAgICAgICAgICJzdG9yYWdlcyB3aWxsIGJlIGNvbnN0cmFpbmVkIHRvIHRoYXQgc2l6ZSBhcyB3ZWxsLlxuIik7CiAgICAgZXhpdChjb2RlKTsKIH0KIApAQCAtMTg2LDYgKzIzNSw3IEBACiBzdGF0aWMgdm9pZCBwYXJzZV9hcmdzKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKICAgICBpbnQgb3B0OwogICAgIGludCBvaWR4ID0gMDsKKyAgICBpbnQgcmMgPSAwOwogCiAgICAgd2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCBfc29wdHMsIF9sb3B0cywgJm9pZHgpKSAhPSAtMSkgewogICAgICAgICBzd2l0Y2ggKG9wdCkgewpAQCAtMjA5LDYgKzI1OSwxOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICAgICAgY2FzZSAnZic6CisgICAgICAgICAgICAgICAgcmMgPSBwYXJzZV9hbmRfYXBwZW5kX2ZpbGVfbWFwcGluZyhvcHRhcmcpOworICAgICAgICAgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBwYXJzZSBmaWxlIG1hcHBpbmc6ICVzXG4iLCBvcHRhcmcpOworICAgICAgICAgICAgICAgICAgICBzaG93X3VzYWdlX2FuZF9leGl0KEVYSVRfRkFJTFVSRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICdtJzoKKyAgICAgICAgICAgICAgICBtYXhfZmlsZV9zaXplX2Zyb20gPSBzdHJkdXAob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBBTE9HRSgidW5yZWNvZ25pemVkIG9wdGlvbiAoJWMpOlxuIiwgb3B0KTsKICAgICAgICAgICAgICAgICBzaG93X3VzYWdlX2FuZF9leGl0KEVYSVRfRkFJTFVSRSk7CkBAIC0yMjQsNiArMjg2LDEyIEBACiAgICAgQUxPR0koInN0b3JhZ2UgZGF0YSByb290OiAlc1xuIiwgc3NfZGF0YV9yb290KTsKICAgICBBTE9HSSgidHJ1c3R5IGRldjogJXNcbiIsIHRydXN0eV9kZXZuYW1lKTsKICAgICBBTE9HSSgicnBtYiBkZXY6ICVzXG4iLCBycG1iX2Rldm5hbWUpOworICAgIEFMT0dJKCJGaWxlIE1hcHBpbmdzOiBcbiIpOworICAgIGNvbnN0IHN0cnVjdCBzdG9yYWdlX21hcHBpbmdfbm9kZSogY3VyciA9IHN0b3JhZ2VfbWFwcGluZ19oZWFkOworICAgIGZvciAoOyBjdXJyICE9IE5VTEw7IGN1cnIgPSBjdXJyLT5uZXh0KSB7CisgICAgICAgIEFMT0dJKCJcdCVzIC0+ICVzXG4iLCBjdXJyLT5maWxlX25hbWUsIGN1cnItPmJhY2tpbmdfc3RvcmFnZSk7CisgICAgfQorICAgIEFMT0dJKCJtYXggZmlsZSBzaXplIGZyb206ICVzXG4iLCBtYXhfZmlsZV9zaXplX2Zyb20gPyBtYXhfZmlsZV9zaXplX2Zyb20gOiAiKHVuc2V0KSIpOwogfQogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CkBAIC0yMzgsOCArMzA2LDIwIEBACiAgICAgLyogcGFyc2UgYXJndW1lbnRzICovCiAgICAgcGFyc2VfYXJncyhhcmdjLCBhcmd2KTsKIAorICAgIC8qCisgICAgICogU3RhcnQgYmluZGVyIHRocmVhZHBvb2wuIEF0IGxlYXN0IG9uZSBleHRyYSBiaW5kZXIgdGhyZWFkIGlzIG5lZWRlZCB0bworICAgICAqIGNvbm5lY3QgdG8gdGhlIHdha2Vsb2NrIHNlcnZpY2Ugd2l0aG91dCByZWx5aW5nIG9uIHBvbGxpbmcuIElmIHdlIHBvbGwgb24KKyAgICAgKiB0aGUgbWFpbiB0aHJlYWQgd2UgZW5kIHVwIHBhdXNpbmcgZm9yIGF0IGxlYXN0IDFzIGV2ZW4gaWYgdGhlIHNlcnZpY2UKKyAgICAgKiBzdGFydHMgZmFzdGVyLiBXZSBzZXQgdGhlIG1heCB0aHJlYWQgY291bnQgdG8gMCBiZWNhdXNlIHN0YXJ0VGhyZWFkUG9vbAorICAgICAqICJTdGFydHMgb25lIHRocmVhZCwgUExVUyB0aG9zZSByZXF1ZXN0ZWQgaW4gc2V0VGhyZWFkUG9vbE1heFRocmVhZENvdW50LAorICAgICAqIFBMVVMgdGhvc2UgbWFudWFsbHkgcmVxdWVzdGVkIGluIGpvaW5UaHJlYWRQb29sLiIgV2Ugb25seSBuZWVkIGEgc2luZ2xlCisgICAgICogYmluZGVyIHRocmVhZCB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMgb24uCisgICAgICovCisgICAgQUJpbmRlclByb2Nlc3Nfc2V0VGhyZWFkUG9vbE1heFRocmVhZENvdW50KDApOworICAgIEFCaW5kZXJQcm9jZXNzX3N0YXJ0VGhyZWFkUG9vbCgpOworCiAgICAgLyogaW5pdGlhbGl6ZSBzZWN1cmUgc3RvcmFnZSBkaXJlY3RvcnkgKi8KLSAgICByYyA9IHN0b3JhZ2VfaW5pdChzc19kYXRhX3Jvb3QpOworICAgIHJjID0gc3RvcmFnZV9pbml0KHNzX2RhdGFfcm9vdCwgc3RvcmFnZV9tYXBwaW5nX2hlYWQsIG1heF9maWxlX3NpemVfZnJvbSk7CiAgICAgaWYgKHJjIDwgMCkgcmV0dXJuIEVYSVRfRkFJTFVSRTsKIAogICAgIC8qIG9wZW4gcnBtYiBkZXZpY2UgKi8KZGlmZiAtLWdpdCBhL3RydXN0eS9zdG9yYWdlL3Byb3h5L3JwbWIuYyBiL3RydXN0eS9zdG9yYWdlL3Byb3h5L3JwbWIuYwppbmRleCAyMmE4NWE3Li4xZjVkMTA3IDEwMDY0NAotLS0gYS90cnVzdHkvc3RvcmFnZS9wcm94eS9ycG1iLmMKKysrIGIvdHJ1c3R5L3N0b3JhZ2UvcHJveHkvcnBtYi5jCkBAIC0zOTksNiArMzk5LDE0IEBACiAKICAgICBib29sIGlzX3JlcXVlc3Rfd3JpdGUgPSByZXEtPnJlbGlhYmxlX3dyaXRlX3NpemUgPiAwOwogCisgICAgLyoKKyAgICAgKiBJbnRlcm5hbGx5IHRoaXMgY2FsbCBjb25uZWN0cyB0byB0aGUgc3VzcGVuZCBzZXJ2aWNlLCB3aGljaCB3aWxsIGNhdXNlCisgICAgICogdGhpcyBzZXJ2aWNlIHRvIHN0YXJ0IGlmIG5vdCBhbHJlYWR5IHJ1bm5pbmcuIElmIHRoZSBiaW5kZXIgdGhyZWFkIHBvb2wKKyAgICAgKiBoYXMgbm90IGJlZW4gc3RhcnRlZCBhdCB0aGlzIHBvaW50LCB0aGlzIGNhbGwgd2lsbCBibG9jayBhbmQgcG9sbCBmb3IgdGhlCisgICAgICogc2VydmljZSBldmVyeSAxcy4gV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIHRocmVhZCBwb29sIGlzIHN0YXJ0ZWQgdG8KKyAgICAgKiByZWNlaXZlIGFuIGFzeW5jIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBzZXJ2aWNlIGlzIHN0YXJ0ZWQgdG8gYXZvaWQKKyAgICAgKiBibG9ja2luZyAoc2VlIG1haW4pLgorICAgICAqLwogICAgIHdsX3JjID0gYWNxdWlyZV93YWtlX2xvY2soUEFSVElBTF9XQUtFX0xPQ0ssIFVGU19XQUtFX0xPQ0tfTkFNRSk7CiAgICAgaWYgKHdsX3JjIDwgMCkgewogICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBhY3F1aXJlIHdha2Vsb2NrOiAlZCwgJXNcbiIsIF9fZnVuY19fLCB3bF9yYywgc3RyZXJyb3IoZXJybm8pKTsKZGlmZiAtLWdpdCBhL3RydXN0eS9zdG9yYWdlL3Byb3h5L3N0b3JhZ2UuYyBiL3RydXN0eS9zdG9yYWdlL3Byb3h5L3N0b3JhZ2UuYwppbmRleCAyMjk5NDgxLi43MmM0ZTkzIDEwMDY0NAotLS0gYS90cnVzdHkvc3RvcmFnZS9wcm94eS9zdG9yYWdlLmMKKysrIGIvdHJ1c3R5L3N0b3JhZ2UvcHJveHkvc3RvcmFnZS5jCkBAIC0xMyw2ICsxMyw3IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLworI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxmY250bC5oPgpAQCAtMzksMTggKzQwLDI0IEBACiAjZGVmaW5lIEFMVEVSTkFURV9EQVRBX0RJUiAiYWx0ZXJuYXRlLyIKIAogLyogTWF4aW11bSBmaWxlIHNpemUgZm9yIGZpbGVzeXN0ZW0gYmFja2VkIHN0b3JhZ2UgKGkuZS4gbm90IGJsb2NrIGRldiBiYWNrZWQgc3RvcmFnZSkgKi8KLSNkZWZpbmUgTUFYX0ZJTEVfU0laRSAoMHgxMDAwMDAwMDAwMCkKK3N0YXRpYyB1aW50NjRfdCBtYXhfZmlsZV9zaXplID0gMHgxMDAwMDAwMDAwMDsKIAogZW51bSBzeW5jX3N0YXRlIHsKICAgICBTU19VTlVTRUQgPSAtMSwKLSAgICBTU19DTEVBTiA9ICAwLAotICAgIFNTX0RJUlRZID0gIDEsCisgICAgU1NfQ0xFQU4gPSAwLAorICAgIFNTX0RJUlRZID0gMSwKKyAgICBTU19DTEVBTl9ORUVEX1NZTUxJTksgPSAyLAogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKnNzZGlyX25hbWU7CiAKKy8qIExpc3QgaGVhZCBmb3Igc3RvcmFnZSBtYXBwaW5nLCBlbGVtZW50cyBhZGRlZCBhdCBpbml0LCBhbmQgbmV2ZXIgcmVtb3ZlZCAqLworc3RhdGljIHN0cnVjdCBzdG9yYWdlX21hcHBpbmdfbm9kZSogc3RvcmFnZV9tYXBwaW5nX2hlYWQ7CisKKyNpZmRlZiBWRU5ET1JfRlNfUkVBRFlfUFJPUEVSVFkKKwogLyoKLSAqIFByb3BlcnR5IHNldCB0byAxIGFmdGVyIHdlIGhhdmUgb3BlbmVkIGEgZmlsZSB1bmRlciBzc2Rpcl9uYW1lLiBUaGUgYmFja2luZworICogUHJvcGVydGllcyBzZXQgdG8gMSBhZnRlciB3ZSBoYXZlIG9wZW5lZCBhIGZpbGUgdW5kZXIgc3NkaXJfbmFtZS4gVGhlIGJhY2tpbmcKICAqIGZpbGVzIGZvciBib3RoIFREIGFuZCBURFAgYXJlIGN1cnJlbnRseSBsb2NhdGVkIHVuZGVyIC9kYXRhL3ZlbmRvci9zcyBhbmQgY2FuCiAgKiBvbmx5IGJlIG9wZW5lZCBvbmNlIHVzZXJkYXRhIGlzIG1vdW50ZWQuIFRoaXMgc3RvcmFnZXByb3h5ZCBzZXJ2aWNlIGlzCiAgKiByZXN0YXJ0ZWQgd2hlbiB1c2VyZGF0YSBpcyBhdmFpbGFibGUsIHdoaWNoIGNhdXNlcyB0aGUgVHJ1c3R5IHN0b3JhZ2Ugc2VydmljZQpAQCAtNTksMTEgKzY2LDI5IEBACiAgKiBwb3J0cyB3aWxsIGJlIGF2YWlsYWJsZSAoYWx0aG91Z2ggdGhleSBtYXkgYmxvY2sgaWYgc3RpbGwgYmVpbmcgaW5pdGlhbGl6ZWQpLAogICogYW5kIGNvbm5lY3Rpb25zIHdpbGwgbm90IGJlIHJlc2V0IGFmdGVyIHRoaXMgcG9pbnQgKGFzc3VtaW5nIHRoZQogICogc3RvcmFnZXByb3h5ZCBzZXJ2aWNlIHN0YXlzIHJ1bm5pbmcpLgorICoKKyAqIGZzX3JlYWR5IC0gc2VjdXJlIHN0b3JhZ2UgaXMgcmVhZC1vbmx5IChkdWUgdG8gY2hlY2twb2ludGluZyBhZnRlciB1cGdyYWRlKQorICogZnNfcmVhZHlfcncgLSBzZWN1cmUgc3RvcmFnZSBpcyByZWFkYWJsZSBhbmQgd3JpdGFibGUKICAqLwogI2RlZmluZSBGU19SRUFEWV9QUk9QRVJUWSAicm8udmVuZG9yLnRydXN0eS5zdG9yYWdlLmZzX3JlYWR5IgorI2RlZmluZSBGU19SRUFEWV9SV19QUk9QRVJUWSAicm8udmVuZG9yLnRydXN0eS5zdG9yYWdlLmZzX3JlYWR5X3J3IgogCiAvKiBoYXMgRlNfUkVBRFlfUFJPUEVSVFkgYmVlbiBzZXQ/ICovCi1zdGF0aWMgYm9vbCBmc19yZWFkeV9pbml0aWFsaXplZCA9IGZhbHNlOworc3RhdGljIGJvb2wgZnNfcmVhZHlfc2V0ID0gZmFsc2U7CitzdGF0aWMgYm9vbCBmc19yZWFkeV9yd19zZXQgPSBmYWxzZTsKKworc3RhdGljIGJvb2wgcHJvcGVydHlfc2V0X2hlbHBlcihjb25zdCBjaGFyKiBwcm9wKSB7CisgICAgaW50IHJjID0gcHJvcGVydHlfc2V0KHByb3AsICIxIik7CisgICAgaWYgKHJjID09IDApIHsKKyAgICAgICAgQUxPR0koIlNldCBwcm9wZXJ0eSAlc1xuIiwgcHJvcCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBzZXQgcHJvcGVydHkgJXMsIHJjOiAlZFxuIiwgcHJvcCwgcmMpOworICAgIH0KKworICAgIHJldHVybiByYyA9PSAwOworfQorCisjZW5kaWYgIC8vICNpZmRlZiBWRU5ET1JfRlNfUkVBRFlfUFJPUEVSVFkKIAogc3RhdGljIGVudW0gc3luY19zdGF0ZSBmc19zdGF0ZTsKIHN0YXRpYyBlbnVtIHN5bmNfc3RhdGUgZmRfc3RhdGVbRkRfVEJMX1NJWkVdOwpAQCAtNzEsMjggKzk2LDEwNyBAQAogc3RhdGljIGJvb2wgYWx0ZXJuYXRlX21vZGU7CiAKIHN0YXRpYyBzdHJ1Y3QgewotICAgc3RydWN0IHN0b3JhZ2VfZmlsZV9yZWFkX3Jlc3AgaGRyOwotICAgdWludDhfdCBkYXRhW01BWF9SRUFEX1NJWkVdOwotfSAgcmVhZF9yc3A7CisgICAgc3RydWN0IHN0b3JhZ2VfZmlsZV9yZWFkX3Jlc3AgaGRyOworICAgIHVpbnQ4X3QgZGF0YVtNQVhfUkVBRF9TSVpFXTsKK30gcmVhZF9yc3A7CiAKLXN0YXRpYyB1aW50MzJfdCBpbnNlcnRfZmQoaW50IG9wZW5fZmxhZ3MsIGludCBmZCkKLXsKK3N0YXRpYyB1aW50MzJfdCBpbnNlcnRfZmQoaW50IG9wZW5fZmxhZ3MsIGludCBmZCwgc3RydWN0IHN0b3JhZ2VfbWFwcGluZ19ub2RlKiBub2RlKSB7CiAgICAgdWludDMyX3QgaGFuZGxlID0gZmQ7CiAKICAgICBpZiAoaGFuZGxlIDwgRkRfVEJMX1NJWkUpIHsKLSAgICAgICAgICAgIGZkX3N0YXRlW2ZkXSA9IFNTX0NMRUFOOyAvKiBmZCBjbGVhbiAqLwotICAgICAgICAgICAgaWYgKG9wZW5fZmxhZ3MgJiBPX1RSVU5DKSB7Ci0gICAgICAgICAgICAgICAgZmRfc3RhdGVbZmRdID0gU1NfRElSVFk7ICAvKiBzZXQgZmQgZGlydHkgKi8KLSAgICAgICAgICAgIH0KKyAgICAgICAgZmRfc3RhdGVbZmRdID0gU1NfQ0xFQU47IC8qIGZkIGNsZWFuICovCisgICAgICAgIGlmIChvcGVuX2ZsYWdzICYgT19UUlVOQykgeworICAgICAgICAgICAgYXNzZXJ0KG5vZGUgPT0gTlVMTCk7CisgICAgICAgICAgICBmZF9zdGF0ZVtmZF0gPSBTU19ESVJUWTsgLyogc2V0IGZkIGRpcnR5ICovCisgICAgICAgIH0KKworICAgICAgICBpZiAobm9kZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBmZF9zdGF0ZVtmZF0gPSBTU19DTEVBTl9ORUVEX1NZTUxJTks7CisgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR1coIiVzOiB1bnRyYWNrZWQgZmQgJXVcbiIsIF9fZnVuY19fLCBmZCk7CiAgICAgICAgICAgICBpZiAob3Blbl9mbGFncyAmIChPX1RSVU5DIHwgT19DUkVBVCkpIHsKICAgICAgICAgICAgICAgICBmc19zdGF0ZSA9IFNTX0RJUlRZOwogICAgICAgICAgICAgfQogICAgIH0KKworICAgIGlmIChub2RlICE9IE5VTEwpIHsKKyAgICAgICAgbm9kZS0+ZmQgPSBmZDsKKyAgICB9CisKICAgICByZXR1cm4gaGFuZGxlOwogfQogCitzdGF0aWMgdm9pZCBjbGVhcl9mZF9zeW1saW5rX3N0YXR1cyh1aW50MzJfdCBoYW5kbGUsIHN0cnVjdCBzdG9yYWdlX21hcHBpbmdfbm9kZSogZW50cnkpIHsKKyAgICAvKiBBbHdheXMgY2xlYXIgRkQsIGluIGNhc2UgZmQgaXMgbm90IGluIEZEX1RCTCAqLworICAgIGVudHJ5LT5mZCA9IC0xOworCisgICAgaWYgKGhhbmRsZSA+PSBGRF9UQkxfU0laRSkgeworICAgICAgICBBTE9HRSgiJXM6IHVudHJhY2tlZCBmZD0ldVxuIiwgX19mdW5jX18sIGhhbmRsZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZmRfc3RhdGVbaGFuZGxlXSA9PSBTU19DTEVBTl9ORUVEX1NZTUxJTkspIHsKKyAgICAgICAgZmRfc3RhdGVbaGFuZGxlXSA9IFNTX0NMRUFOOworICAgIH0KK30KKworc3RhdGljIHN0cnVjdCBzdG9yYWdlX21hcHBpbmdfbm9kZSogZ2V0X3BlbmRpbmdfc3ltbGlua19tYXBwaW5nKHVpbnQzMl90IGhhbmRsZSkgeworICAgIC8qIEZhc3QgbG9va3VwIGZhaWx1cmUsIGlzIGl0IGluIEZEIFRCTCAqLworICAgIGlmIChoYW5kbGUgPCBGRF9UQkxfU0laRSAmJiBmZF9zdGF0ZVtoYW5kbGVdICE9IFNTX0NMRUFOX05FRURfU1lNTElOSykgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBHbyBmaW5kIG91ciBtYXBwaW5nICovCisgICAgc3RydWN0IHN0b3JhZ2VfbWFwcGluZ19ub2RlKiBjdXJyID0gc3RvcmFnZV9tYXBwaW5nX2hlYWQ7CisgICAgZm9yICg7IGN1cnIgIT0gTlVMTDsgY3VyciA9IGN1cnItPm5leHQpIHsKKyAgICAgICAgaWYgKGN1cnItPmZkID09IGhhbmRsZSkgeworICAgICAgICAgICAgcmV0dXJuIGN1cnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTYWZldHkgY2hlY2s6IHN0YXRlIGluY29uc2lzdGVudCBpZiB3ZSBnZXQgaGVyZSB3aXRoIGhhbmRsZSBpbnNpZGUgdGFibGUgcmFuZ2UgKi8KKyAgICBhc3NlcnQoaGFuZGxlID49IEZEX1RCTF9TSVpFKTsKKworICAgIHJldHVybiBOVUxMOworfTsKKworc3RhdGljIGludCBwb3NzaWJseV9zeW1saW5rX2FuZF9jbGVhcl9tYXBwaW5nKHVpbnQzMl90IGhhbmRsZSkgeworICAgIHN0cnVjdCBzdG9yYWdlX21hcHBpbmdfbm9kZSogZW50cnkgPSBnZXRfcGVuZGluZ19zeW1saW5rX21hcHBpbmcoaGFuZGxlKTsKKyAgICBpZiAoZW50cnkgPT0gTlVMTCkgeworICAgICAgICAvKiBObyBtYXBwaW5ncyBwZW5kaW5nICovCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIENyZWF0ZSBmdWxsIHBhdGggKi8KKyAgICBjaGFyKiBwYXRoID0gTlVMTDsKKyAgICBpbnQgcmMgPSBhc3ByaW50ZigmcGF0aCwgIiVzLyVzIiwgc3NkaXJfbmFtZSwgZW50cnktPmZpbGVfbmFtZSk7CisgICAgaWYgKHJjIDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IGFzcHJpbnRmIGZhaWxlZFxuIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogVHJ5IGFuZCBzZXR1cCB0aGUgc3ltbGlua2luZyAqLworICAgIEFMT0dJKCJDcmVhdGluZyBzeW1saW5rICVzLT4lc1xuIiwgcGF0aCwgZW50cnktPmJhY2tpbmdfc3RvcmFnZSk7CisgICAgcmMgPSBzeW1saW5rKGVudHJ5LT5iYWNraW5nX3N0b3JhZ2UsIHBhdGgpOworICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBlcnJvciBzeW1saW5raW5nICVzLT4lcyAoJXMpXG4iLCBfX2Z1bmNfXywgcGF0aCwgZW50cnktPmJhY2tpbmdfc3RvcmFnZSwKKyAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgZnJlZShwYXRoKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKyAgICBmcmVlKHBhdGgpOworCisgICAgY2xlYXJfZmRfc3ltbGlua19zdGF0dXMoaGFuZGxlLCBlbnRyeSk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBib29sIGlzX3BlbmRpbmdfc3ltbGluayh1aW50MzJfdCBoYW5kbGUpIHsKKyAgICBzdHJ1Y3Qgc3RvcmFnZV9tYXBwaW5nX25vZGUqIGVudHJ5ID0gZ2V0X3BlbmRpbmdfc3ltbGlua19tYXBwaW5nKGhhbmRsZSk7CisgICAgcmV0dXJuIGVudHJ5ICE9IE5VTEw7Cit9CisKIHN0YXRpYyBpbnQgbG9va3VwX2ZkKHVpbnQzMl90IGhhbmRsZSwgYm9vbCBkaXJ0eSkKIHsKICAgICBpZiAoZGlydHkpIHsKQEAgLTEwNyw2ICsyMTEsMTIgQEAKIAogc3RhdGljIGludCByZW1vdmVfZmQodWludDMyX3QgaGFuZGxlKQogeworICAgIC8qIENsZWFudXAgZmQgaW4gc3ltbGluayBtYXBwaW5nIGlmIGl0IGV4aXN0cyAqLworICAgIHN0cnVjdCBzdG9yYWdlX21hcHBpbmdfbm9kZSogZW50cnkgPSBnZXRfcGVuZGluZ19zeW1saW5rX21hcHBpbmcoaGFuZGxlKTsKKyAgICBpZiAoZW50cnkgIT0gTlVMTCkgeworICAgICAgICBlbnRyeS0+ZmQgPSAtMTsKKyAgICB9CisKICAgICBpZiAoaGFuZGxlIDwgRkRfVEJMX1NJWkUpIHsKICAgICAgICAgZmRfc3RhdGVbaGFuZGxlXSA9IFNTX1VOVVNFRDsgLyogc2V0IHRvIHVuaW5zdGFsbGVkICovCiAgICAgfQpAQCAtMjQ3LDExICszNTcsNzMgQEAKICAgICB3YXRjaF9wcm9ncmVzcyh3YXRjaGVyLCAiZG9uZSBzeW5jaW5nIHBhcmVudCIpOwogfQogCitzdGF0aWMgc3RydWN0IHN0b3JhZ2VfbWFwcGluZ19ub2RlKiBnZXRfc3RvcmFnZV9tYXBwaW5nX2VudHJ5KGNvbnN0IGNoYXIqIHNvdXJjZSkgeworICAgIHN0cnVjdCBzdG9yYWdlX21hcHBpbmdfbm9kZSogY3VyciA9IHN0b3JhZ2VfbWFwcGluZ19oZWFkOworICAgIGZvciAoOyBjdXJyICE9IE5VTEw7IGN1cnIgPSBjdXJyLT5uZXh0KSB7CisgICAgICAgIGlmICghc3RyY21wKHNvdXJjZSwgY3Vyci0+ZmlsZV9uYW1lKSkgeworICAgICAgICAgICAgQUxPR0koIkZvdW5kIGJhY2tpbmcgZmlsZSAlcyBmb3IgJXNcbiIsIGN1cnItPmJhY2tpbmdfc3RvcmFnZSwgc291cmNlKTsKKyAgICAgICAgICAgIHJldHVybiBjdXJyOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgYm9vbCBpc19iYWNraW5nX3N0b3JhZ2VfbWFwcGVkKGNvbnN0IGNoYXIqIHNvdXJjZSkgeworICAgIGNvbnN0IHN0cnVjdCBzdG9yYWdlX21hcHBpbmdfbm9kZSogY3VyciA9IHN0b3JhZ2VfbWFwcGluZ19oZWFkOworICAgIGZvciAoOyBjdXJyICE9IE5VTEw7IGN1cnIgPSBjdXJyLT5uZXh0KSB7CisgICAgICAgIGlmICghc3RyY21wKHNvdXJjZSwgY3Vyci0+YmFja2luZ19zdG9yYWdlKSkgeworICAgICAgICAgICAgQUxPR0koIkJhY2tlZCBzdG9yYWdlIG1hcHBpbmcgZXhpc3RzIGZvciAlc1xuIiwgY3Vyci0+YmFja2luZ19zdG9yYWdlKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLyogQXR0ZW1wdHMgdG8gb3BlbiBhIGJhY2tlZCBmaWxlLCBpZiBtYXBwZWQsIHdpdGhvdXQgY3JlYXRpbmcgdGhlIHN5bWxpbmsuIFN5bWxpbmsgd2lsbCBiZSBjcmVhdGVkCisgKiBsYXRlciBvbiB0aGUgZmlyc3Qgd3JpdGUuICBUaGlzIGFsbG93cyB1cyB0byBjb250aW51ZSByZXBvcnRpbmcgemVybyByZWFkIHNpemVzIHVudGlsIHRoZSBmaXJzdAorICogd3JpdGUuICovCitzdGF0aWMgaW50IG9wZW5fcG9zc2libHlfbWFwcGVkX2ZpbGUoY29uc3QgY2hhciogc2hvcnRfcGF0aCwgY29uc3QgY2hhciogZnVsbF9wYXRoLCBpbnQgb3Blbl9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3RvcmFnZV9tYXBwaW5nX25vZGUqKiBlbnRyeSkgeworICAgIC8qIFNlZSBpZiBtYXBwaW5nIGV4aXN0cywgcmVwb3J0IHVwc3RyZWFtIGlmIHRoZXJlIGlzIG5vIG1hcHBpbmcuICovCisgICAgc3RydWN0IHN0b3JhZ2VfbWFwcGluZ19ub2RlKiBtYXBwaW5nX2VudHJ5ID0gZ2V0X3N0b3JhZ2VfbWFwcGluZ19lbnRyeShzaG9ydF9wYXRoKTsKKyAgICBpZiAobWFwcGluZ19lbnRyeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBURU1QX0ZBSUxVUkVfUkVUUlkob3BlbihmdWxsX3BhdGgsIG9wZW5fZmxhZ3MsIFNfSVJVU1IgfCBTX0lXVVNSKSk7CisgICAgfQorCisgICAgLyogQ2hlY2sgZm9yIGV4aXN0ZW5jZSBvZiByb290IHBhdGgsIHdlIGRvbid0IGFsbG93IG1hcHBpbmdzIGR1cmluZyBlYXJseSBib290ICovCisgICAgc3RydWN0IHN0YXQgYnVmID0gezB9OworICAgIGlmIChzdGF0KHNzZGlyX25hbWUsICZidWYpICE9IDApIHsKKyAgICAgICAgQUxPR1coIlJvb3QgcGF0aCBub3QgYWNjZXNzaWJsZSB5ZXQsIHJlZnVzZSB0byBvcGVuIG1hcHBpbmdzIGZvciBub3cuXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIFdlIGRvbid0IHN1cHBvcnQgZXhjbHVzaXZlIG9wZW5pbmcgb2YgbWFwcGVkIGZpbGVzICovCisgICAgaWYgKG9wZW5fZmxhZ3MgJiBPX0VYQ0wpIHsKKyAgICAgICAgQUxPR0UoIlJlcXVlc3RpbmcgZXhjbHVzaXZlIG9wZW4gb24gYmFja2VkIHN0b3JhZ2UgaXNuJ3Qgc3VwcG9ydGVkOiAlc1xuIiwgZnVsbF9wYXRoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIFRyeSBhbmQgb3BlbiBtYXBwaW5nIGZpbGUgKi8KKyAgICBvcGVuX2ZsYWdzICY9IH4oT19DUkVBVCB8IE9fRVhDTCk7CisgICAgQUxPR0koIiVzIEF0dGVtcHRpbmcgdG8gb3BlbiBtYXBwZWQgZmlsZTogJXNcbiIsIF9fZnVuY19fLCBtYXBwaW5nX2VudHJ5LT5iYWNraW5nX3N0b3JhZ2UpOworICAgIGludCBmZCA9CisgICAgICAgICAgICBURU1QX0ZBSUxVUkVfUkVUUlkob3BlbihtYXBwaW5nX2VudHJ5LT5iYWNraW5nX3N0b3JhZ2UsIG9wZW5fZmxhZ3MsIFNfSVJVU1IgfCBTX0lXVVNSKSk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBBTE9HRSgiJXMgRmFpbGVkIHRvIG9wZW4gbWFwcGluZyBmaWxlOiAlc1xuIiwgX19mdW5jX18sIG1hcHBpbmdfZW50cnktPmJhY2tpbmdfc3RvcmFnZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBMZXQgY2FsbGVyIGtub3cgd2hpY2ggZW50cnkgd2UgdXNlZCBmb3Igb3BlbmluZyAqLworICAgICplbnRyeSA9IG1hcHBpbmdfZW50cnk7CisgICAgcmV0dXJuIGZkOworfQorCiBpbnQgc3RvcmFnZV9maWxlX29wZW4oc3RydWN0IHN0b3JhZ2VfbXNnKiBtc2csIGNvbnN0IHZvaWQqIHIsIHNpemVfdCByZXFfbGVuLAogICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB3YXRjaGVyKiB3YXRjaGVyKSB7CiAgICAgY2hhciogcGF0aCA9IE5VTEw7CiAgICAgY29uc3Qgc3RydWN0IHN0b3JhZ2VfZmlsZV9vcGVuX3JlcSAqcmVxID0gcjsKICAgICBzdHJ1Y3Qgc3RvcmFnZV9maWxlX29wZW5fcmVzcCByZXNwID0gezB9OworICAgIHN0cnVjdCBzdG9yYWdlX21hcHBpbmdfbm9kZSogbWFwcGluZ19lbnRyeSA9IE5VTEw7CiAKICAgICBpZiAocmVxX2xlbiA8IHNpemVvZigqcmVxKSkgewogICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgcmVxdWVzdCBsZW5ndGggKCV6ZCA8ICV6ZClcbiIsCkBAIC0zMjEsMTQgKzQ5MywxOCBAQAogICAgICAgICBpZiAocmVxLT5mbGFncyAmIFNUT1JBR0VfRklMRV9PUEVOX0NSRUFURV9FWENMVVNJVkUpIHsKICAgICAgICAgICAgIC8qIGNyZWF0ZSBleGNsdXNpdmUgKi8KICAgICAgICAgICAgIG9wZW5fZmxhZ3MgfD0gT19DUkVBVCB8IE9fRVhDTDsKLSAgICAgICAgICAgIHJjID0gVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4ocGF0aCwgb3Blbl9mbGFncywgU19JUlVTUiB8IFNfSVdVU1IpKTsKKworICAgICAgICAgICAgLyogTG9vayBmb3IgYW5kIGF0dGVtcHQgb3BlbmluZyBhIG1hcHBpbmcsIGVsc2UganVzdCBkbyBub3JtYWwgb3Blbi4gKi8KKyAgICAgICAgICAgIHJjID0gb3Blbl9wb3NzaWJseV9tYXBwZWRfZmlsZShyZXEtPm5hbWUsIHBhdGgsIG9wZW5fZmxhZ3MsICZtYXBwaW5nX2VudHJ5KTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8qIHRyeSBvcGVuIGZpcnN0ICovCiAgICAgICAgICAgICByYyA9IFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKHBhdGgsIG9wZW5fZmxhZ3MsIFNfSVJVU1IgfCBTX0lXVVNSKSk7CiAgICAgICAgICAgICBpZiAocmMgPT0gLTEgJiYgZXJybm8gPT0gRU5PRU5UKSB7CiAgICAgICAgICAgICAgICAgLyogdGhlbiB0cnkgb3BlbiB3aXRoIE9fQ1JFQVRFICovCiAgICAgICAgICAgICAgICAgb3Blbl9mbGFncyB8PSBPX0NSRUFUOwotICAgICAgICAgICAgICAgIHJjID0gVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4ocGF0aCwgb3Blbl9mbGFncywgU19JUlVTUiB8IFNfSVdVU1IpKTsKKworICAgICAgICAgICAgICAgIC8qIExvb2sgZm9yIGFuZCBhdHRlbXB0IG9wZW5pbmcgYSBtYXBwaW5nLCBlbHNlIGp1c3QgZG8gbm9ybWFsIG9wZW4uICovCisgICAgICAgICAgICAgICAgcmMgPSBvcGVuX3Bvc3NpYmx5X21hcHBlZF9maWxlKHJlcS0+bmFtZSwgcGF0aCwgb3Blbl9mbGFncywgJm1hcHBpbmdfZW50cnkpOwogICAgICAgICAgICAgfQogCiAgICAgICAgIH0KQEAgLTM1MywyMyArNTI5LDM1IEBACiAgICAgaWYgKG9wZW5fZmxhZ3MgJiBPX0NSRUFUKSB7CiAgICAgICAgIHN5bmNfcGFyZW50KHBhdGgsIHdhdGNoZXIpOwogICAgIH0KLSAgICBmcmVlKHBhdGgpOwogCiAgICAgLyogYXQgdGhpcyBwb2ludCByYyBjb250YWlucyBzdG9yYWdlIGZpbGUgZmQgKi8KICAgICBtc2ctPnJlc3VsdCA9IFNUT1JBR0VfTk9fRVJST1I7Ci0gICAgcmVzcC5oYW5kbGUgPSBpbnNlcnRfZmQob3Blbl9mbGFncywgcmMpOworICAgIHJlc3AuaGFuZGxlID0gaW5zZXJ0X2ZkKG9wZW5fZmxhZ3MsIHJjLCBtYXBwaW5nX2VudHJ5KTsKICAgICBBTE9HVigiJXM6IFwiJXNcIjogZmQgPSAldTogaGFuZGxlID0gJWRcbiIsCiAgICAgICAgICAgX19mdW5jX18sIHBhdGgsIHJjLCByZXNwLmhhbmRsZSk7CiAKKyAgICBmcmVlKHBhdGgpOworICAgIHBhdGggPSBOVUxMOworCisjaWZkZWYgVkVORE9SX0ZTX1JFQURZX1BST1BFUlRZCiAgICAgLyogYSBiYWNraW5nIGZpbGUgaGFzIGJlZW4gb3BlbmVkLCBub3RpZnkgYW55IHdhaXRpbmcgaW5pdCBzdGVwcyAqLwotICAgIGlmICghZnNfcmVhZHlfaW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgcmMgPSBwcm9wZXJ0eV9zZXQoRlNfUkVBRFlfUFJPUEVSVFksICIxIik7Ci0gICAgICAgIGlmIChyYyA9PSAwKSB7Ci0gICAgICAgICAgICBmc19yZWFkeV9pbml0aWFsaXplZCA9IHRydWU7CisgICAgaWYgKCFmc19yZWFkeV9zZXQgfHwgIWZzX3JlYWR5X3J3X3NldCkgeworICAgICAgICBib29sIGlzX2NoZWNrcG9pbnRfYWN0aXZlID0gZmFsc2U7CisKKyAgICAgICAgcmMgPSBpc19kYXRhX2NoZWNrcG9pbnRfYWN0aXZlKCZpc19jaGVja3BvaW50X2FjdGl2ZSk7CisgICAgICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiaXNfZGF0YV9jaGVja3BvaW50X2FjdGl2ZSgpIGZhaWxlZCAoJWQpXG4iLCByYyk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IHNldCBwcm9wZXJ0eSAlcywgcmM6ICVkXG4iLCBGU19SRUFEWV9QUk9QRVJUWSwgcmMpOworICAgICAgICAgICAgaWYgKCFmc19yZWFkeV9yd19zZXQgJiYgIWlzX2NoZWNrcG9pbnRfYWN0aXZlKSB7CisgICAgICAgICAgICAgICAgZnNfcmVhZHlfcndfc2V0ID0gcHJvcGVydHlfc2V0X2hlbHBlcihGU19SRUFEWV9SV19QUk9QRVJUWSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghZnNfcmVhZHlfc2V0KSB7CisgICAgICAgICAgICAgICAgZnNfcmVhZHlfc2V0ID0gcHJvcGVydHlfc2V0X2hlbHBlcihGU19SRUFEWV9QUk9QRVJUWSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CisjZW5kaWYgIC8vICNpZmRlZiBWRU5ET1JfRlNfUkVBRFlfUFJPUEVSVFkKIAogICAgIHJldHVybiBpcGNfcmVzcG9uZChtc2csICZyZXNwLCBzaXplb2YocmVzcCkpOwogCkBAIC00MzEsNiArNjE5LDE0IEBACiAgICAgICAgIGdvdG8gZXJyX3Jlc3BvbnNlOwogICAgIH0KIAorICAgIC8qIEhhbmRsZSBhbnkgZGVsYXllZCBzeW1saW5raW5nIGZvciB0aGlzIGhhbmRsZSBpZiBhbnkgKi8KKyAgICByYyA9IHBvc3NpYmx5X3N5bWxpbmtfYW5kX2NsZWFyX21hcHBpbmcocmVxLT5oYW5kbGUpOworICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzeW1saW5rIHN0b3JhZ2VcbiIpOworICAgICAgICBtc2ctPnJlc3VsdCA9IFNUT1JBR0VfRVJSX0dFTkVSSUM7CisgICAgICAgIGdvdG8gZXJyX3Jlc3BvbnNlOworICAgIH0KKwogICAgIGludCBmZCA9IGxvb2t1cF9mZChyZXEtPmhhbmRsZSwgdHJ1ZSk7CiAgICAgd2F0Y2hfcHJvZ3Jlc3Mod2F0Y2hlciwgIndyaXRpbmciKTsKICAgICBpZiAod3JpdGVfd2l0aF9yZXRyeShmZCwgJnJlcS0+ZGF0YVswXSwgcmVxX2xlbiAtIHNpemVvZigqcmVxKSwKQEAgLTQ3Nyw2ICs2NzMsMTQgQEAKICAgICAgICAgZ290byBlcnJfcmVzcG9uc2U7CiAgICAgfQogCisgICAgLyogSWYgdGhpcyBoYW5kbGUgaGFzIGEgZGVsYXllZCBzeW1saW5rIHdlIHNob3VsZCByZXBvcnQgMCBzaXplIHJlYWRzIHVudGlsIGZpcnN0IHdyaXRlIG9jY3VycworICAgICAqLworICAgIGlmIChpc19wZW5kaW5nX3N5bWxpbmsocmVxLT5oYW5kbGUpKSB7CisgICAgICAgIEFMT0dJKCJQZW5kaW5nIHN5bWxpbms6IEZvcmNpbmcgcmVhZCByZXN1bHQgMC5cbiIpOworICAgICAgICBtc2ctPnJlc3VsdCA9IFNUT1JBR0VfTk9fRVJST1I7CisgICAgICAgIHJldHVybiBpcGNfcmVzcG9uZChtc2csICZyZWFkX3JzcCwgc2l6ZW9mKHJlYWRfcnNwLmhkcikpOworICAgIH0KKwogICAgIGludCBmZCA9IGxvb2t1cF9mZChyZXEtPmhhbmRsZSwgZmFsc2UpOwogICAgIHdhdGNoX3Byb2dyZXNzKHdhdGNoZXIsICJyZWFkaW5nIik7CiAgICAgc3NpemVfdCByZWFkX3JlcyA9IHJlYWRfd2l0aF9yZXRyeShmZCwgcmVhZF9yc3AuaGRyLmRhdGEsIHJlcS0+c2l6ZSwKQEAgLTU5MCw3ICs3OTQsNyBAQAogICAgICAgICAgICAgZ290byBlcnJfcmVzcG9uc2U7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBtYXhfc2l6ZSA9IE1BWF9GSUxFX1NJWkU7CisgICAgICAgIG1heF9zaXplID0gbWF4X2ZpbGVfc2l6ZTsKICAgICB9CiAKICAgICByZXNwLm1heF9zaXplID0gbWF4X3NpemU7CkBAIC02MDEsMTcgKzgwNSw3OSBAQAogICAgIHJldHVybiBpcGNfcmVzcG9uZChtc2csIE5VTEwsIDApOwogfQogCi1pbnQgc3RvcmFnZV9pbml0KGNvbnN0IGNoYXIgKmRpcm5hbWUpCi17CitpbnQgZGV0ZXJtaW5lX21heF9maWxlX3NpemUoY29uc3QgY2hhciogbWF4X2ZpbGVfc2l6ZV9mcm9tKSB7CisgICAgLyogVXNlIGRlZmF1bHQgaWYgbm9uZSBwYXNzZWQgaW4gKi8KKyAgICBpZiAobWF4X2ZpbGVfc2l6ZV9mcm9tID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0koIk5vIG1heCBmaWxlIHNvdXJjZSBnaXZlbiwgY29udGludWluZyB0byB1c2UgZGVmYXVsdDogMHglIiBQUkl4NjQgIlxuIiwKKyAgICAgICAgICAgICAgbWF4X2ZpbGVfc2l6ZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIENoZWNrIHRoYXQgbWF4X2ZpbGVfc2l6ZV9mcm9tIGlzIHBhcnQgb2Ygb3VyIG1hcHBpbmcgbGlzdC4gKi8KKyAgICBpZiAoIWlzX2JhY2tpbmdfc3RvcmFnZV9tYXBwZWQobWF4X2ZpbGVfc2l6ZV9mcm9tKSkgeworICAgICAgICBBTE9HRSgiJXM6IGZpbGUgZG9lc24ndCBtYXRjaCBtYXBwZWQgc3RvcmFnZXMgKGZpbGVuYW1lPSVzKVxuIiwgX19mdW5jX18sCisgICAgICAgICAgICAgIG1heF9maWxlX3NpemVfZnJvbSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBBTE9HSSgiVXNpbmcgJXMgdG8gZGV0ZXJtaW5lIG1heCBmaWxlIHNpemUuXG4iLCBtYXhfZmlsZV9zaXplX2Zyb20pOworCisgICAgLyogRXJyb3IgaWYgbWF4IGZpbGUgc2l6ZSBzb3VyY2Ugbm90IGZvdW5kLCBwb3NzaWJsZSBtaXNjb25maWcuICovCisgICAgc3RydWN0IHN0YXQgYnVmID0gezB9OworICAgIGludCByYyA9IHN0YXQobWF4X2ZpbGVfc2l6ZV9mcm9tLCAmYnVmKTsKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIEFMT0dFKCIlczogZXJyb3Igc3RhdCdpbmcgZmlsZSAoZmlsZW5hbWU9JXMpOiAlc1xuIiwgX19mdW5jX18sIG1heF9maWxlX3NpemVfZnJvbSwKKyAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIEN1cnJlbnRseSBvbmx5IHN1cHBvcnQgYmxvY2sgZGV2aWNlIGFzIG1heCBmaWxlIHNpemUgc291cmNlICovCisgICAgaWYgKChidWYuc3RfbW9kZSAmIFNfSUZNVCkgIT0gU19JRkJMSykgeworICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgbWF4IGZpbGUgc2l6ZSBzb3VyY2UgdHlwZTogJWRcbiIsIGJ1Zi5zdF9tb2RlKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIEFMT0dJKCIlcyBpcyBhIGJsb2NrIGRldmljZSwgZGV0ZXJtaW5pbmcgYmxvY2sgZGV2aWNlIHNpemVcbiIsIG1heF9maWxlX3NpemVfZnJvbSk7CisgICAgdWludDY0X3QgbWF4X3NpemUgPSAwOworICAgIGludCBmZCA9IFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKG1heF9maWxlX3NpemVfZnJvbSwgT19SRE9OTFkgfCBPX05PTkJMT0NLKSk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBvcGVuIGJhY2tpbmcgZmlsZSAlcyBmb3IgaW9jdGw6ICVzXG4iLCBfX2Z1bmNfXywgbWF4X2ZpbGVfc2l6ZV9mcm9tLAorICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJjID0gaW9jdGwoZmQsIEJMS0dFVFNJWkU2NCwgJm1heF9zaXplKTsKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIEFMT0dFKCIlczogZXJyb3IgY2FsbGluZyBpb2N0bCBvbiBmaWxlIChmZD0lZCk6ICVzXG4iLCBfX2Z1bmNfXywgZmQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBjbG9zZShmZCk7CisgICAgbWF4X2ZpbGVfc2l6ZSA9IG1heF9zaXplOworCisgICAgQUxPR0koIlVzaW5nIDB4JSIgUFJJeDY0ICIgYXMgbWF4IGZpbGUgc2l6ZVxuIiwgbWF4X2ZpbGVfc2l6ZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBzdG9yYWdlX2luaXQoY29uc3QgY2hhciogZGlybmFtZSwgc3RydWN0IHN0b3JhZ2VfbWFwcGluZ19ub2RlKiBtYXBwaW5ncywKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWF4X2ZpbGVfc2l6ZV9mcm9tKSB7CiAgICAgLyogSWYgdGhlcmUgaXMgYW4gYWN0aXZlIERTVSBpbWFnZSwgdXNlIHRoZSBhbHRlcm5hdGUgZnMgbW9kZS4gKi8KICAgICBhbHRlcm5hdGVfbW9kZSA9IGlzX2dzaV9ydW5uaW5nKCk7CiAKICAgICBmc19zdGF0ZSA9IFNTX0NMRUFOOwogICAgIGZvciAodWludCBpID0gMDsgaSA8IEZEX1RCTF9TSVpFOyBpKyspIHsKLSAgICAgICAgZmRfc3RhdGVbaV0gPSBTU19VTlVTRUQ7ICAvKiB1bmluc3RhbGxlZCAqLworICAgICAgICBmZF9zdGF0ZVtpXSA9IFNTX1VOVVNFRDsgLyogdW5pbnN0YWxsZWQgKi8KICAgICB9CiAKICAgICBzc2Rpcl9uYW1lID0gZGlybmFtZTsKKworICAgIHN0b3JhZ2VfbWFwcGluZ19oZWFkID0gbWFwcGluZ3M7CisKKyAgICAvKiBTZXQgdGhlIG1heCBmaWxlIHNpemUgYmFzZWQgb24gaW5jb21pbmcgY29uZmlndXJhdGlvbiAqLworICAgIGludCByYyA9IGRldGVybWluZV9tYXhfZmlsZV9zaXplKG1heF9maWxlX3NpemVfZnJvbSk7CisgICAgaWYgKHJjIDwgMCkgeworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTYyMSwxNyArODg3LDE3IEBACiAgICAgd2F0Y2hfcHJvZ3Jlc3Mod2F0Y2hlciwgInN5bmMgZmQgdGFibGUiKTsKICAgICAvKiBzeW5jIGZkIHRhYmxlIGFuZCByZXNldCBpdCB0byBjbGVhbiBzdGF0ZSBmaXJzdCAqLwogICAgIGZvciAodWludCBmZCA9IDA7IGZkIDwgRkRfVEJMX1NJWkU7IGZkKyspIHsKLSAgICAgICAgIGlmIChmZF9zdGF0ZVtmZF0gPT0gU1NfRElSVFkpIHsKLSAgICAgICAgICAgICBpZiAoZnNfc3RhdGUgPT0gU1NfQ0xFQU4pIHsKLSAgICAgICAgICAgICAgICAgLyogbmVlZCB0byBzeW5jIGluZGl2aWR1YWwgZmQgKi8KLSAgICAgICAgICAgICAgICAgcmMgPSBmc3luYyhmZCk7Ci0gICAgICAgICAgICAgICAgIGlmIChyYyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJmc3luYyBmb3IgZmQ9JWQgZmFpbGVkOiAlc1xuIiwgZmQsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmM7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgZmRfc3RhdGVbZmRdID0gU1NfQ0xFQU47IC8qIHNldCB0byBjbGVhbiAqLwotICAgICAgICAgfQorICAgICAgICBpZiAoZmRfc3RhdGVbZmRdID09IFNTX0RJUlRZKSB7CisgICAgICAgICAgICBpZiAoZnNfc3RhdGUgPT0gU1NfQ0xFQU4pIHsKKyAgICAgICAgICAgICAgICAvKiBuZWVkIHRvIHN5bmMgaW5kaXZpZHVhbCBmZCAqLworICAgICAgICAgICAgICAgIHJjID0gZnN5bmMoZmQpOworICAgICAgICAgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImZzeW5jIGZvciBmZD0lZCBmYWlsZWQ6ICVzXG4iLCBmZCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZkX3N0YXRlW2ZkXSA9IFNTX0NMRUFOOyAvKiBzZXQgdG8gY2xlYW4gKi8KKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qIGNoZWNrIGlmIHdlIG5lZWQgdG8gc3luYyBhbGwgZmlsZXN5c3RlbXMgKi8KZGlmZiAtLWdpdCBhL3RydXN0eS9zdG9yYWdlL3Byb3h5L3N0b3JhZ2UuaCBiL3RydXN0eS9zdG9yYWdlL3Byb3h5L3N0b3JhZ2UuaAppbmRleCBmMjlmZGYyLi42ZGJmZTM3IDEwMDY0NAotLS0gYS90cnVzdHkvc3RvcmFnZS9wcm94eS9zdG9yYWdlLmgKKysrIGIvdHJ1c3R5L3N0b3JhZ2UvcHJveHkvc3RvcmFnZS5oCkBAIC0yMSw2ICsyMSwxNCBAQAogLyogRGVmaW5lZCBpbiB3YXRjaGRvZy5oICovCiBzdHJ1Y3Qgd2F0Y2hlcjsKIAorLyogSXMgdXNlZCBmb3IgbWFuYWdpbmcgYWx0ZXJuYXRlIGJhY2tpbmcgc3RvcmFnZSwgZ2VuZXJhbGx5IHdpbGwgYmUgYSBibG9jayBkZXZpY2UuICovCitzdHJ1Y3Qgc3RvcmFnZV9tYXBwaW5nX25vZGUgeworICAgIHN0cnVjdCBzdG9yYWdlX21hcHBpbmdfbm9kZSogbmV4dDsKKyAgICBjb25zdCBjaGFyKiBmaWxlX25hbWU7CisgICAgY29uc3QgY2hhciogYmFja2luZ19zdG9yYWdlOworICAgIGludCBmZDsKK307CisKIGludCBzdG9yYWdlX2ZpbGVfZGVsZXRlKHN0cnVjdCBzdG9yYWdlX21zZyogbXNnLCBjb25zdCB2b2lkKiByZXEsIHNpemVfdCByZXFfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHdhdGNoZXIqIHdhdGNoZXIpOwogCkBAIC00NSw2ICs1Myw3IEBACiBpbnQgc3RvcmFnZV9maWxlX2dldF9tYXhfc2l6ZShzdHJ1Y3Qgc3RvcmFnZV9tc2cqIG1zZywgY29uc3Qgdm9pZCogcmVxLCBzaXplX3QgcmVxX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB3YXRjaGVyKiB3YXRjaGVyKTsKIAotaW50IHN0b3JhZ2VfaW5pdChjb25zdCBjaGFyKiBkaXJuYW1lKTsKK2ludCBzdG9yYWdlX2luaXQoY29uc3QgY2hhciogZGlybmFtZSwgc3RydWN0IHN0b3JhZ2VfbWFwcGluZ19ub2RlKiBoZWFkLAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtYXhfZmlsZV9zaXplX2Zyb20pOwogCiBpbnQgc3RvcmFnZV9zeW5jX2NoZWNrcG9pbnQoc3RydWN0IHdhdGNoZXIqIHdhdGNoZXIpOwpkaWZmIC0tZ2l0IGEvdHJ1c3R5L3RydXN0eS1iYXNlLm1rIGIvdHJ1c3R5L3RydXN0eS1iYXNlLm1rCmluZGV4IDE5ODZjNzMuLjlkODEwZGMgMTAwNjQ0Ci0tLSBhL3RydXN0eS90cnVzdHktYmFzZS5taworKysgYi90cnVzdHkvdHJ1c3R5LWJhc2UubWsKQEAgLTIyLDIxICsyMiwxNiBAQAogIyBGb3IgZ2F0ZWtlZXBlciwgd2UgaW5jbHVkZSB0aGUgZ2VuZXJpYyAtc2VydmljZSBhbmQgLWltcGwgdG8gdXNlIGxlZ2FjeQogIyBIQUwgbG9hZGluZyBvZiBnYXRla2VlcGVyLnRydXN0eS4KIAotIyBBbGxvdyB0aGUgS2V5TWludCBIQUwgc2VydmljZSBpbXBsZW1lbnRhdGlvbiB0byBiZSBzZWxlY3RlZCBhdCBidWlsZCB0aW1lLiAgVGhpcyBuZWVkcyB0byBiZQotIyBkb25lIGluIHN5bmMgd2l0aCB0aGUgVEEgaW1wbGVtZW50YXRpb24gaW5jbHVkZWQgaW4gVHJ1c3R5LiAgUG9zc2libGUgdmFsdWVzIGFyZToKLSMKLSMgLSBSdXN0IGltcGxlbWVudGF0aW9uOiAgIGV4cG9ydCBUUlVTVFlfS0VZTUlOVF9JTVBMPXJ1c3QKLSMgLSBDKysgaW1wbGVtZW50YXRpb246ICAgIChhbnkgb3RoZXIgdmFsdWUgb2YgVFJVU1RZX0tFWU1JTlRfSU1QTCkKKyQoY2FsbCBpbmhlcml0LXByb2R1Y3QsIHN5c3RlbS9jb3JlL3RydXN0eS9rZXltaW50L3RydXN0eS1rZXltaW50Lm1rKQogCi1pZmVxICgkKFRSVVNUWV9LRVlNSU5UX0lNUEwpLHJ1c3QpCi0gICAgTE9DQUxfS0VZTUlOVF9QUk9EVUNUX1BBQ0tBR0UgOj0gYW5kcm9pZC5oYXJkd2FyZS5zZWN1cml0eS5rZXltaW50LXNlcnZpY2UucnVzdC50cnVzdHkKK2lmZXEgKCQoU0VDUkVUS0VFUEVSX0VOQUJMRUQpLHRydWUpCisgICAgTE9DQUxfU0VDUkVUS0VFUEVSX1BST0RVQ1RfUEFDS0FHRSA6PSBhbmRyb2lkLmhhcmR3YXJlLnNlY3VyaXR5LnNlY3JldGtlZXBlci50cnVzdHkKIGVsc2UKLSAgICAjIERlZmF1bHQgdG8gdGhlIEMrKyBpbXBsZW1lbnRhdGlvbgotICAgIExPQ0FMX0tFWU1JTlRfUFJPRFVDVF9QQUNLQUdFIDo9IGFuZHJvaWQuaGFyZHdhcmUuc2VjdXJpdHkua2V5bWludC1zZXJ2aWNlLnRydXN0eQorICAgIExPQ0FMX1NFQ1JFVEtFRVBFUl9QUk9EVUNUX1BBQ0tBR0UgOj0KIGVuZGlmCiAKIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAotCSQoTE9DQUxfS0VZTUlOVF9QUk9EVUNUX1BBQ0tBR0UpIFwKKwkkKExPQ0FMX1NFQ1JFVEtFRVBFUl9QUk9EVUNUX1BBQ0tBR0UpIFwKIAlhbmRyb2lkLmhhcmR3YXJlLmdhdGVrZWVwZXItc2VydmljZS50cnVzdHkgXAogCXRydXN0eV9hcHBsb2FkZXIgXAogCmRpZmYgLS1naXQgYS9mYXN0Ym9vdC9BbmRyb2lkLm1rIGIvdHJ1c3R5L3RydXN0eS1zdG9yYWdlLWNmLm1rCnNpbWlsYXJpdHkgaW5kZXggNjElCnJlbmFtZSBmcm9tIGZhc3Rib290L0FuZHJvaWQubWsKcmVuYW1lIHRvIHRydXN0eS90cnVzdHktc3RvcmFnZS1jZi5tawppbmRleCBjZGUwY2IyLi4zYjQ2NDQ1IDEwMDY0NAotLS0gYS9mYXN0Ym9vdC9BbmRyb2lkLm1rCisrKyBiL3RydXN0eS90cnVzdHktc3RvcmFnZS1jZi5tawpAQCAtMSw0ICsxLDUgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDA3IEdvb2dsZSBJbmMuCisjCisjIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuLVNvdXJjZSBQcm9qZWN0CiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xMSwxNSArMTIsMTQgQEAKICMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jCi0jIFBhY2thZ2UgZmFzdGJvb3QtcmVsYXRlZCBleGVjdXRhYmxlcy4KICMKIAotbXlfZGlzdF9maWxlcyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9ta2UyZnMKLW15X2Rpc3RfZmlsZXMgKz0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvbWFrZV9mMmZzCi1teV9kaXN0X2ZpbGVzICs9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL21ha2VfZjJmc19jYXNlZm9sZAotJChjYWxsIGRpc3QtZm9yLWdvYWxzLGRpc3RfZmlsZXMgc2RrLCQobXlfZGlzdF9maWxlcykpCi1teV9kaXN0X2ZpbGVzIDo9CisjCisjIFRoaXMgbWFrZWZpbGUgc2hvdWxkIGJlIGluY2x1ZGVkIGJ5IHRoZSBjdXR0bGVmaXNoIGRldmljZQorIyB3aGVuIGVuYWJsaW5nIHRoZSBUcnVzdHkgVk0gdG8gcHVsbCBpbiB0aGUgYmFzZWxpbmUgc2V0CisjIG9mIHN0b3JhZ2Ugc3BlY2lmaWMgbW9kdWxlcworCitQUk9EVUNUX1BBQ0tBR0VTICs9IFwKKwlzdG9yYWdlcHJveHlkLnN5c3RlbSBcCisJcnBtYl9kZXYuc3lzdGVtIFwKKwpkaWZmIC0tZ2l0IGEvdHJ1c3R5L3V0aWxzL2FjdnAvdHJ1c3R5X21vZHVsZXdyYXBwZXIuY3BwIGIvdHJ1c3R5L3V0aWxzL2FjdnAvdHJ1c3R5X21vZHVsZXdyYXBwZXIuY3BwCmluZGV4IDcwZmZiNTIuLjgxN2I2MDAgMTAwNjQ0Ci0tLSBhL3RydXN0eS91dGlscy9hY3ZwL3RydXN0eV9tb2R1bGV3cmFwcGVyLmNwcAorKysgYi90cnVzdHkvdXRpbHMvYWN2cC90cnVzdHlfbW9kdWxld3JhcHBlci5jcHAKQEAgLTIxLDE1ICsyMSwxNyBAQAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9yZXN1bHQuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxsb2cvbG9nLmg+CiAjaW5jbHVkZSA8bW9kdWxld3JhcHBlci5oPgogI2luY2x1ZGUgPG9wZW5zc2wvc3Bhbi5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAjaW5jbHVkZSA8dHJ1c3R5L3RpcGMuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CiAKICNpbmNsdWRlICJhY3ZwX2lwYy5oIgogCkBAIC00MSw5ICs0Myw2IEBACiB1c2luZyBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQ7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjpXcml0ZUZ1bGx5OwogCi1zdGF0aWMgaW5saW5lIHNpemVfdCBBbGlnblVwVG9QYWdlKHNpemVfdCBzaXplKSB7Ci0gICAgcmV0dXJuIChzaXplICsgKFBBR0VfU0laRSAtIDEpKSAmIH4oUEFHRV9TSVpFIC0gMSk7Ci19CiAKIG5hbWVzcGFjZSB7CiAKQEAgLTEwMywxNSArMTAyLDEyIEBACiAgICAgc3RydWN0IGFjdnBfcmVxIHJlcXVlc3Q7CiAgICAgcmVxdWVzdC5udW1fYXJncyA9IGFyZ3Muc2l6ZSgpOwogCi0gICAgc2l6ZV90IHRvdGFsX2FyZ3Nfc2l6ZSA9IDA7CisgICAgaW50IHRvdGFsX2FyZ3Nfc2l6ZSA9IDA7CiAgICAgZm9yIChhdXRvIGFyZyA6IGFyZ3MpIHsKICAgICAgICAgdG90YWxfYXJnc19zaXplICs9IGFyZy5zaXplKCk7CiAgICAgfQogCi0gICAgc2htX3NpemVfID0gQUNWUF9NSU5fU0hBUkVEX01FTU9SWTsKLSAgICBpZiAodG90YWxfYXJnc19zaXplID4gc2htX3NpemVfKSB7Ci0gICAgICAgIHNobV9zaXplXyA9IEFsaWduVXBUb1BhZ2UodG90YWxfYXJnc19zaXplKTsKLSAgICB9CisgICAgc2htX3NpemVfID0gc3RkOjptYXgoQUNWUF9NSU5fU0hBUkVEX01FTU9SWSwgdG90YWxfYXJnc19zaXplKTsKICAgICByZXF1ZXN0LmJ1ZmZlcl9zaXplID0gc2htX3NpemVfOwogCiAgICAgc3RydWN0IGlvdmVjIGlvdiA9IHsKQEAgLTIwOCw2ICsyMDQsMTEgQEAKICAgICByZXR1cm4ge307CiB9CiAKK3N0YXRpYyBib29sIEVxU3RyaW5nKGJzc2w6OlNwYW48Y29uc3QgdWludDhfdD4gY21kLCBjb25zdCBjaGFyICpzdHIpIHsKKyAgICByZXR1cm4gY21kLnNpemUoKSA9PSBzdHJsZW4oc3RyKSAmJgorICAgICAgICAgICBtZW1jbXAoc3RyLCBjbWQuZGF0YSgpLCBjbWQuc2l6ZSgpKSA9PSAwOworfQorCiBpbnQgbWFpbigpIHsKICAgICBmb3IgKDs7KSB7CiAgICAgICAgIGF1dG8gYnVmZmVyID0gYnNzbDo6YWN2cDo6UmVxdWVzdEJ1ZmZlcjo6TmV3KCk7CkBAIC0yMTcsMTcgKzIxOCwyNCBAQAogICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKICAgICAgICAgfQogCi0gICAgICAgIE1vZHVsZVdyYXBwZXIgd3JhcHBlcjsKLSAgICAgICAgYXV0byByZXMgPSB3cmFwcGVyLlNlbmRNZXNzYWdlKGFyZ3MpOwotICAgICAgICBpZiAoIXJlcy5vaygpKSB7Ci0gICAgICAgICAgICBzdGQ6OmNlcnIgPDwgcmVzLmVycm9yKCkgPDwgc3RkOjplbmRsOwotICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKLSAgICAgICAgfQorICAgICAgICBpZiAoRXFTdHJpbmcoYXJnc1swXSwgImZsdXNoIikpIHsKKyAgICAgICAgICAgIGlmICghYnNzbDo6YWN2cDo6Rmx1c2hCdWZmZXIoU1RET1VUX0ZJTEVOTykpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IGZsdXNoIHRoZSBidWZmZXIgdG8gc3Rkb3V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTW9kdWxlV3JhcHBlciB3cmFwcGVyOworICAgICAgICAgICAgYXV0byByZXMgPSB3cmFwcGVyLlNlbmRNZXNzYWdlKGFyZ3MpOworICAgICAgICAgICAgaWYgKCFyZXMub2soKSkgeworICAgICAgICAgICAgICAgIHN0ZDo6Y2VyciA8PCByZXMuZXJyb3IoKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICByZXMgPSB3cmFwcGVyLkZvcndhcmRSZXNwb25zZSgpOwotICAgICAgICBpZiAoIXJlcy5vaygpKSB7Ci0gICAgICAgICAgICBzdGQ6OmNlcnIgPDwgcmVzLmVycm9yKCkgPDwgc3RkOjplbmRsOwotICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgICAgIHJlcyA9IHdyYXBwZXIuRm9yd2FyZFJlc3BvbnNlKCk7CisgICAgICAgICAgICBpZiAoIXJlcy5vaygpKSB7CisgICAgICAgICAgICAgICAgc3RkOjpjZXJyIDw8IHJlcy5lcnJvcigpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9saWJwcm9jZXNzZ3JvdXAvY2dyb3VwcmNfZm9ybWF0L0FuZHJvaWQuYnAgYi90cnVzdHkvdXRpbHMvY292ZXJhZ2UtY29udHJvbGxlci9BbmRyb2lkLmJwCnNpbWlsYXJpdHkgaW5kZXggNjElCmNvcHkgZnJvbSBsaWJwcm9jZXNzZ3JvdXAvY2dyb3VwcmNfZm9ybWF0L0FuZHJvaWQuYnAKY29weSB0byB0cnVzdHkvdXRpbHMvY292ZXJhZ2UtY29udHJvbGxlci9BbmRyb2lkLmJwCmluZGV4IDA1OTA5MjQuLmU2ZDMwZDkgMTAwNjQ0Ci0tLSBhL2xpYnByb2Nlc3Nncm91cC9jZ3JvdXByY19mb3JtYXQvQW5kcm9pZC5icAorKysgYi90cnVzdHkvdXRpbHMvY292ZXJhZ2UtY29udHJvbGxlci9BbmRyb2lkLmJwCkBAIC0xLDQgKzEsNCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAvLwogLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNiwyNCArMTYsMTkgQEAKICAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCiB9CiAKLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGliY2dyb3VwcmNfZm9ybWF0IiwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICByYW1kaXNrX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICB2ZW5kb3JfcmFtZGlza19hdmFpbGFibGU6IHRydWUsCi0gICAgcmVjb3ZlcnlfYXZhaWxhYmxlOiB0cnVlLAotICAgIG5hdGl2ZV9icmlkZ2Vfc3VwcG9ydGVkOiB0cnVlLAotICAgIHNyY3M6IFsKLSAgICAgICAgImNncm91cF9jb250cm9sbGVyLmNwcCIsCi0gICAgXSwKLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1XYWxsIiwKLSAgICAgICAgIi1XZXJyb3IiLAotICAgIF0sCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWwotICAgICAgICAiaW5jbHVkZSIsCi0gICAgXSwKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogInRydXN0eS1jb3ZlcmFnZS1jb250cm9sbGVyIiwKKyAgICB2ZW5kb3I6IHRydWUsCisKKyAgICBzcmNzOiBbImNvbnRyb2xsZXIuY3BwIl0sCiAgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmMiLAorICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliZG1hYnVmaGVhcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlidHJ1c3R5IiwKKyAgICAgICAgImxpYnRydXN0eV9saW5lX2NvdmVyYWdlIiwKICAgICBdLAogfQpkaWZmIC0tZ2l0IGEvdHJ1c3R5L3V0aWxzL2NvdmVyYWdlLWNvbnRyb2xsZXIvY29udHJvbGxlci5jcHAgYi90cnVzdHkvdXRpbHMvY292ZXJhZ2UtY29udHJvbGxlci9jb250cm9sbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWQ3MGIxCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L3V0aWxzL2NvdmVyYWdlLWNvbnRyb2xsZXIvY29udHJvbGxlci5jcHAKQEAgLTAsMCArMSwxODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRydXN0eS9saW5lLWNvdmVyYWdlL2NvdmVyYWdlLmg+CisjaW5jbHVkZSA8dHJ1c3R5L3RpcGMuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb250cm9sbGVyLmgiCisKKyNkZWZpbmUgUkVBRF9PTkNFKHgpICgqKCh2b2xhdGlsZSBfX3R5cGVvZl9fKHgpICopICYoeCkpKQorI2RlZmluZSBXUklURV9PTkNFKHgsIHZhbCkgKCooKHZvbGF0aWxlIF9fdHlwZW9mX18odmFsKSAqKSAmKHgpKSA9ICh2YWwpKQorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdHJ1c3R5IHsKK25hbWVzcGFjZSBjb250cm9sbGVyIHsKKwordXNpbmcgOjphbmRyb2lkOjp0cnVzdHk6OmxpbmVfY292ZXJhZ2U6OkNvdmVyYWdlUmVjb3JkOworCit2b2lkIENvbnRyb2xsZXI6OnJ1bihzdGQ6OnN0cmluZyBvdXRwdXRfZGlyKSB7CisgICAgY29ubmVjdENvdmVyYWdlU2VydmVyKCk7CisgICAgc3RydWN0IGNvbnRyb2wgKmNvbnRyb2w7CisgICAgdWludDY0X3QgY29tcGxldGVfY250ID0gMCwgc3RhcnRfY250ID0gMCwgZmxhZ3M7CisKKyAgICB3aGlsZSgxKSB7CisgICAgICAgIHNldFVwU2htKCk7CisKKyAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHJlY29yZF9saXN0Xy5zaXplKCk7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGNvbnRyb2wgPSAoc3RydWN0IGNvbnRyb2wgKilyZWNvcmRfbGlzdF9baW5kZXhdLT5nZXRTaG0oKTsKKyAgICAgICAgICAgIHN0YXJ0X2NudCA9IFJFQURfT05DRSgoY29udHJvbC0+d3JpdGVfYnVmZmVyX3N0YXJ0X2NvdW50KSk7CisgICAgICAgICAgICBjb21wbGV0ZV9jbnQgPSBSRUFEX09OQ0UoY29udHJvbC0+d3JpdGVfYnVmZmVyX2NvbXBsZXRlX2NvdW50KTsKKyAgICAgICAgICAgIGZsYWdzID0gUkVBRF9PTkNFKGNvbnRyb2wtPmNudHJsX2ZsYWdzKTsKKworICAgICAgICAgICAgaWYgKGNvbXBsZXRlX2NudCAhPSBjb3VudGVyc1tpbmRleF0gJiYgc3RhcnRfY250ID09IGNvbXBsZXRlX2NudCkgeworICAgICAgICAgICAgICAgIFdSSVRFX09OQ0UoY29udHJvbC0+Y250cmxfZmxhZ3MsIEZMQUdfTk9ORSk7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmlsZW5hbWU7CisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoIi8lcy4lIiBQUkl1NjQgIi5wcm9mcmF3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dWlkX2xpc3RfW2luZGV4XS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJzW2luZGV4XSk7CisgICAgICAgICAgICAgICAgZmlsZW5hbWUuaW5zZXJ0KDAsIG91dHB1dF9kaXIpOworICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlJlc3VsdDx2b2lkPiByZXMgPSByZWNvcmRfbGlzdF9baW5kZXhdLT5TYXZlRmlsZShmaWxlbmFtZSk7CisgICAgICAgICAgICAgICAgY291bnRlcnNbaW5kZXhdKys7CisgICAgICAgICAgICAgICAgV1JJVEVfT05DRShjb250cm9sLT5yZWFkX2J1ZmZlcl9jbnQsIGNvdW50ZXJzW2luZGV4XSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihjb21wbGV0ZV9jbnQgPT0gY291bnRlcnNbaW5kZXhdICYmCisgICAgICAgICAgICAgICAgIShmbGFncyAmIEZMQUdfUlVOKSkgeworICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfUlVOOworICAgICAgICAgICAgICAgIFdSSVRFX09OQ0UoY29udHJvbC0+Y250cmxfZmxhZ3MsIGZsYWdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBDb250cm9sbGVyOjpjb25uZWN0Q292ZXJhZ2VTZXJ2ZXIoKSB7CisgICAgY292ZXJhZ2Vfc3J2X2ZkID0gdGlwY19jb25uZWN0KFRJUENfREVWLCBMSU5FX0NPVkVSQUdFX0NMSUVOVF9QT1JUKTsKKyAgICBpZiAoY292ZXJhZ2Vfc3J2X2ZkIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgXAorICAgICAgICAgICAgICAgICJFcnJvcjogRmFpbGVkIHRvIGNvbm5lY3QgdG8gVHJ1c3R5IGNvdmVyYWdlIHNlcnZlcjogJWRcbiIsIGNvdmVyYWdlX3Nydl9mZCk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKK3ZvaWQgQ29udHJvbGxlcjo6c2V0VXBTaG0oKSB7CisgICAgc3RydWN0IGxpbmVfY292ZXJhZ2VfY2xpZW50X3JlcSByZXE7CisgICAgc3RydWN0IGxpbmVfY292ZXJhZ2VfY2xpZW50X3Jlc3AgcmVzcDsKKyAgICB1aW50MzJfdCBjdXJfaW5kZXggPSByZWNvcmRfbGlzdF8uc2l6ZSgpOworICAgIHN0cnVjdCB1dWlkIHplcm9fdXVpZCA9IHswLCAwLCAwLCB7IDAgfX07CisgICAgY2hhciB1dWlkX3N0cltVVUlEX1NUUl9TSVpFXTsKKyAgICByZXEuaGRyLmNtZCA9IExJTkVfQ09WRVJBR0VfQ0xJRU5UX0NNRF9TRU5EX0xJU1Q7CisgICAgaW50IHJjID0gd3JpdGUoY292ZXJhZ2Vfc3J2X2ZkLCAmcmVxLCBzaXplb2YocmVxKSk7CisgICAgICAgIGlmIChyYyAhPSAoaW50KXNpemVvZihyZXEpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBzZW5kIHJlcXVlc3QgdG8gY292ZXJhZ2Ugc2VydmVyOiAlZFxuIiwgcmMpOworICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlKDEpIHsKKyAgICAgICAgcmMgPSByZWFkKGNvdmVyYWdlX3Nydl9mZCwgJnJlc3AsIHNpemVvZihyZXNwKSk7CisgICAgICAgIGlmIChyYyAhPSAoaW50KXNpemVvZihyZXNwKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gcmVhZCByZXBseSBmcm9tIGNvdmVyYWdlIHNlcnZlcjo6ICVkXG4iLCByYyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzcC5oZHIuY21kID09IChyZXEuaGRyLmNtZCB8IExJTkVfQ09WRVJBR0VfQ0xJRU5UX0NNRF9SRVNQX0JJVCkpIHsKKyAgICAgICAgICAgIGlmICghbWVtY21wKCZyZXNwLnNlbmRfbGlzdF9hcmdzLnV1aWQsICZ6ZXJvX3V1aWQsIHNpemVvZihzdHJ1Y3QgdXVpZCkpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZih1dWlkX3NldF8uZmluZChyZXNwLnNlbmRfbGlzdF9hcmdzLnV1aWQpID09IHV1aWRfc2V0Xy5lbmQoKSkgeworICAgICAgICAgICAgICAgIHV1aWRfc2V0Xy5pbnNlcnQocmVzcC5zZW5kX2xpc3RfYXJncy51dWlkKTsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKHV1aWRfc3RyLAorICAgICAgICAgICAgICAgICAgICAiJTA4IiBQUkl4MzIgIi0lMDQiIFBSSXgxNiAiLSUwNCIgUFJJeDE2ICItJTAyIiBQUkl4OCAiJTAyIiBQUkl4OAorICAgICAgICAgICAgICAgICAgICAiLSUwMiIgUFJJeDggIiUwMiIgUFJJeDggIiUwMiIgUFJJeDggIiUwMiIgUFJJeDggIiUwMiIgUFJJeDggIiUwMiIgUFJJeDgsCisgICAgICAgICAgICAgICAgICAgIHJlc3Auc2VuZF9saXN0X2FyZ3MudXVpZC50aW1lX2xvdywKKyAgICAgICAgICAgICAgICAgICAgcmVzcC5zZW5kX2xpc3RfYXJncy51dWlkLnRpbWVfbWlkLAorICAgICAgICAgICAgICAgICAgICByZXNwLnNlbmRfbGlzdF9hcmdzLnV1aWQudGltZV9oaV9hbmRfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgcmVzcC5zZW5kX2xpc3RfYXJncy51dWlkLmNsb2NrX3NlcV9hbmRfbm9kZVswXSwKKyAgICAgICAgICAgICAgICAgICAgcmVzcC5zZW5kX2xpc3RfYXJncy51dWlkLmNsb2NrX3NlcV9hbmRfbm9kZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgcmVzcC5zZW5kX2xpc3RfYXJncy51dWlkLmNsb2NrX3NlcV9hbmRfbm9kZVsyXSwKKyAgICAgICAgICAgICAgICAgICAgcmVzcC5zZW5kX2xpc3RfYXJncy51dWlkLmNsb2NrX3NlcV9hbmRfbm9kZVszXSwKKyAgICAgICAgICAgICAgICAgICAgcmVzcC5zZW5kX2xpc3RfYXJncy51dWlkLmNsb2NrX3NlcV9hbmRfbm9kZVs0XSwKKyAgICAgICAgICAgICAgICAgICAgcmVzcC5zZW5kX2xpc3RfYXJncy51dWlkLmNsb2NrX3NlcV9hbmRfbm9kZVs1XSwKKyAgICAgICAgICAgICAgICAgICAgcmVzcC5zZW5kX2xpc3RfYXJncy51dWlkLmNsb2NrX3NlcV9hbmRfbm9kZVs2XSwKKyAgICAgICAgICAgICAgICAgICAgcmVzcC5zZW5kX2xpc3RfYXJncy51dWlkLmNsb2NrX3NlcV9hbmRfbm9kZVs3XSk7CisgICAgICAgICAgICAgICAgdXVpZF9saXN0Xy5wdXNoX2JhY2sodXVpZF9zdHIpOworICAgICAgICAgICAgICAgIHJlY29yZF9saXN0Xy5wdXNoX2JhY2soc3RkOjptYWtlX3VuaXF1ZTxDb3ZlcmFnZVJlY29yZD4oVElQQ19ERVYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNwLnNlbmRfbGlzdF9hcmdzLnV1aWQpKTsKKyAgICAgICAgICAgICAgICBjb3VudGVycy5wdXNoX2JhY2soMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gcmVzcG9uc2UgaGVhZGVyXG4iKTsKKyAgICAgICAgfQorICAgICAgICBjdXJfaW5kZXgrKzsKKyAgICAgICAgcmVxLmhkci5jbWQgPSBMSU5FX0NPVkVSQUdFX0NMSUVOVF9DTURfU0VORF9MSVNUOworICAgICAgICByZXEuc2VuZF9saXN0X2FyZ3MuaW5kZXggPSBjdXJfaW5kZXg7CisgICAgICAgIGludCByYyA9IHdyaXRlKGNvdmVyYWdlX3Nydl9mZCwgJnJlcSwgc2l6ZW9mKHJlcSkpOworICAgICAgICBpZiAocmMgIT0gKGludClzaXplb2YocmVxKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gc2VuZCByZXF1ZXN0IHRvIGNvdmVyYWdlIHNlcnZlcjogJWRcbiIsIHJjKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvcihpbnQgaW5kID0gMCA7IGluZCA8IHJlY29yZF9saXN0Xy5zaXplKCkgOyBpbmQrKykgeworICAgICAgICByZWNvcmRfbGlzdF9baW5kXS0+T3Blbihjb3ZlcmFnZV9zcnZfZmQpOworICAgIH0KK30KKworCit9ICAvLyBuYW1lc3BhY2UgY29udHJvbGxlcgorfSAgLy8gbmFtZXNwYWNlIHRydXN0eQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworCisgICAgc3RkOjpzdHJpbmcgb3B0YXJnID0gIiI7CisgICAgZG8geworICAgICAgICBpbnQgYzsKKyAgICAgICAgYyA9IGdldG9wdChhcmdjLCBhcmd2LCAibyIpOworCisgICAgICAgIGlmIChjID09IC0xKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICBjYXNlICdvJzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogJXMgLW8gW291dHB1dF9kaXJlY3RvcnldXG4iLCBhcmd2WzBdKTsKKyAgICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKDEpOworCisgICAgaWYgKGFyZ2MgPiBvcHRpbmQgKyAxKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHRvbyBtYW55IGFyZ3VtZW50c1xuIiwgYXJndlswXSk7CisgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisKKyAgICBpZiAoYXJnYyA+IG9wdGluZCkgeworICAgICAgICBvcHRhcmcgPSBhcmd2W29wdGluZF07CisgICAgfQorICAgIGlmIChvcHRhcmcuc2l6ZSgpPT0wKSB7CisgICAgICAgIG9wdGFyZyA9ICJkYXRhL2xvY2FsL3RtcCI7CisgICAgfQorCisgICAgYW5kcm9pZDo6dHJ1c3R5Ojpjb250cm9sbGVyOjpDb250cm9sbGVyIGN1cjsKKyAgICBjdXIucnVuKG9wdGFyZyk7CisKKyAgICByZXR1cm4gRVhJVF9TVUNDRVNTOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydXN0eS91dGlscy9jb3ZlcmFnZS1jb250cm9sbGVyL2NvbnRyb2xsZXIuaCBiL3RydXN0eS91dGlscy9jb3ZlcmFnZS1jb250cm9sbGVyL2NvbnRyb2xsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDFhMWFlCi0tLSAvZGV2L251bGwKKysrIGIvdHJ1c3R5L3V0aWxzL2NvdmVyYWdlLWNvbnRyb2xsZXIvY29udHJvbGxlci5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHRydXN0eS9saW5lLWNvdmVyYWdlL2NvdmVyYWdlLmg+CisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzZXQ+CisKKyNkZWZpbmUgVElQQ19ERVYgIi9kZXYvdHJ1c3R5LWlwYy1kZXYwIgorI2RlZmluZSBURVNUX1NSVl9QT1JUICJjb20uYW5kcm9pZC50cnVzdHkuc2FuY292LnRlc3Quc3J2IgorI2RlZmluZSBURVNUX1NSVl9NT0RVTEUgInNydi5zeW1zLmVsZiIKKworI2RlZmluZSBVVUlEX1NUUl9TSVpFICgzNykKKworI2RlZmluZSBGTEFHX05PTkUgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgRkxBR19SVU4gICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIEZMQUdfVE9HR0xFX0NMRUFSICAgICAgIDB4MgorCitzdHJ1Y3QgY29udHJvbCB7CisgICAgLyogV3JpdHRlbiBieSBjb250cm9sbGVyLCByZWFkIGJ5IGluc3RydW1lbnRlZCBUQSAqLworICAgIHVpbnQ2NF90ICAgICAgICBjbnRybF9mbGFnczsKKyAgICB1aW50NjRfdCAgICAgICAgcmVhZF9idWZmZXJfY250OworCisgICAgLyogV3JpdHRlbiBieSBpbnN0cnVtZW50ZWQgVEEsIHJlYWQgYnkgY29udHJvbGxlciAqLworICAgIHVpbnQ2NF90ICAgICAgICB3cml0ZV9idWZmZXJfc3RhcnRfY291bnQ7CisgICAgdWludDY0X3QgICAgICAgIHdyaXRlX2J1ZmZlcl9jb21wbGV0ZV9jb3VudDsKK307CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB0cnVzdHkgeworbmFtZXNwYWNlIGNvbnRyb2xsZXIgeworCitjbGFzcyBDb250cm9sbGVyIHsKKyAgcHVibGljOgorICAgIHB1YmxpYzoKKyAgICAgICAgdm9pZCBydW4oc3RkOjpzdHJpbmcgb3V0cHV0X2Rpcik7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8bGluZV9jb3ZlcmFnZTo6Q292ZXJhZ2VSZWNvcmQ+PnJlY29yZF9saXN0XzsKKyAgICAgICAgc3RkOjpzZXQ8c3RydWN0IHV1aWQ+dXVpZF9zZXRfOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz51dWlkX2xpc3RfOworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gY291bnRlcnM7CisgICAgICAgIGludCBjb3ZlcmFnZV9zcnZfZmQ7CisKKyAgICAgICAgdm9pZCBjb25uZWN0Q292ZXJhZ2VTZXJ2ZXIoKTsKKyAgICAgICAgdm9pZCBzZXRVcFNobSgpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNvbnRyb2xsZXIKK30gIC8vIG5hbWVzcGFjZSB0cnVzdHkKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS90cnVzdHkvdXRpbHMvcnBtYl9kZXYvQW5kcm9pZC5icCBiL3RydXN0eS91dGlscy9ycG1iX2Rldi9BbmRyb2lkLmJwCmluZGV4IGEyNzAwODcuLmVmMjNjYzUgMTAwNjQ0Ci0tLSBhL3RydXN0eS91dGlscy9ycG1iX2Rldi9BbmRyb2lkLmJwCisrKyBiL3RydXN0eS91dGlscy9ycG1iX2Rldi9BbmRyb2lkLmJwCkBAIC0xNSwxNSArMTUsMTMgQEAKICAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCiB9CiAKLWNjX2JpbmFyeSB7Ci0gICAgbmFtZTogInJwbWJfZGV2IiwKLSAgICB2ZW5kb3I6IHRydWUsCi0KK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAicnBtYl9kZXYuY2NfZGVmYXVsdHMiLAogICAgIHNyY3M6IFsKICAgICAgICAgInJwbWJfZGV2LmMiLAogICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmMiLAorICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJjcnlwdG8iLAogICAgIF0sCkBAIC0zMSw3ICsyOSwzMiBAQAogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKK30KKworY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAicnBtYl9kZXYiLAorICAgIGRlZmF1bHRzOiBbInJwbWJfZGV2LmNjX2RlZmF1bHRzIl0sCisgICAgdmVuZG9yOiB0cnVlLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogICAgIGluaXRfcmM6IFsKICAgICAgICAgInJwbWJfZGV2LnJjIiwKICAgICBdLAogfQorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJycG1iX2Rldi5zeXN0ZW0iLAorICAgIGRlZmF1bHRzOiBbInJwbWJfZGV2LmNjX2RlZmF1bHRzIl0sCisgICAgc3lzdGVtX2V4dF9zcGVjaWZpYzogdHJ1ZSwKKyAgICBpbml0X3JjOiBbCisgICAgICAgICJycG1iX2Rldi5zeXN0ZW0ucmMiLAorICAgIF0sCit9CisKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogInJwbWJfZGV2Lnd2LnN5c3RlbSIsCisgICAgZGVmYXVsdHM6IFsicnBtYl9kZXYuY2NfZGVmYXVsdHMiXSwKKyAgICBzeXN0ZW1fZXh0X3NwZWNpZmljOiB0cnVlLAorICAgIGluaXRfcmM6IFsKKyAgICAgICAgInJwbWJfZGV2Lnd2LnN5c3RlbS5yYyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL3RydXN0eS91dGlscy9ycG1iX2Rldi9ycG1iX2Rldi5jIGIvdHJ1c3R5L3V0aWxzL3JwbWJfZGV2L3JwbWJfZGV2LmMKaW5kZXggMGE5ZTZhMS4uY2VlMzAzNyAxMDA2NDQKLS0tIGEvdHJ1c3R5L3V0aWxzL3JwbWJfZGV2L3JwbWJfZGV2LmMKKysrIGIvdHJ1c3R5L3V0aWxzL3JwbWJfZGV2L3JwbWJfZGV2LmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlICJycG1iX3Byb3RvY29sLmgiCiAKICNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxjdXRpbHMvc29ja2V0cy5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxnZXRvcHQuaD4KQEAgLTYxMywyMCArNjE0LDI0IEBACiAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CiAgICAgfQogCi0gICAgY21kcmVzX3NvY2sgPSBzb2NrZXQoQUZfVU5JWCwgU09DS19TVFJFQU0sIDApOworICAgIGNtZHJlc19zb2NrID0gYW5kcm9pZF9nZXRfY29udHJvbF9zb2NrZXQoc29ja2V0X3BhdGgpOwogICAgIGlmIChjbWRyZXNfc29jayA8IDApIHsKLSAgICAgICAgQUxPR0UoInJwbWJfZGV2OiBGYWlsZWQgdG8gY3JlYXRlIGNvbW1hbmQvcmVzcG9uc2Ugc29ja2V0OiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKLSAgICB9CisgICAgICAgIEFMT0dXKCJhbmRyb2lkX2dldF9jb250cm9sX3NvY2tldCglcykgZmFpbGVkLCBmYWxsIGJhY2sgdG8gY3JlYXRlIGl0XG4iLCBzb2NrZXRfcGF0aCk7CisgICAgICAgIGNtZHJlc19zb2NrID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKTsKKyAgICAgICAgaWYgKGNtZHJlc19zb2NrIDwgMCkgeworICAgICAgICAgICAgQUxPR0UoInJwbWJfZGV2OiBGYWlsZWQgdG8gY3JlYXRlIGNvbW1hbmQvcmVzcG9uc2Ugc29ja2V0OiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgIH0KIAotICAgIGNtZHJlc19zb2NrYWRkci5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKLSAgICBzdHJuY3B5KGNtZHJlc19zb2NrYWRkci5zdW5fcGF0aCwgc29ja2V0X3BhdGgsIHNpemVvZihjbWRyZXNfc29ja2FkZHIuc3VuX3BhdGgpKTsKKyAgICAgICAgY21kcmVzX3NvY2thZGRyLnN1bl9mYW1pbHkgPSBBRl9VTklYOworICAgICAgICBzdHJuY3B5KGNtZHJlc19zb2NrYWRkci5zdW5fcGF0aCwgc29ja2V0X3BhdGgsIHNpemVvZihjbWRyZXNfc29ja2FkZHIuc3VuX3BhdGgpKTsKIAotICAgIHJldCA9IGJpbmQoY21kcmVzX3NvY2ssIChzdHJ1Y3Qgc29ja2FkZHIqKSZjbWRyZXNfc29ja2FkZHIsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfdW4pKTsKLSAgICBpZiAocmV0IDwgMCkgewotICAgICAgICBBTE9HRSgicnBtYl9kZXY6IEZhaWxlZCB0byBiaW5kIGNvbW1hbmQvcmVzcG9uc2Ugc29ja2V0OiAlczogJXNcbiIsIHNvY2tldF9wYXRoLAotICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICByZXQgPSBiaW5kKGNtZHJlc19zb2NrLCAoc3RydWN0IHNvY2thZGRyKikmY21kcmVzX3NvY2thZGRyLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3VuKSk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgicnBtYl9kZXY6IEZhaWxlZCB0byBiaW5kIGNvbW1hbmQvcmVzcG9uc2Ugc29ja2V0OiAlczogJXNcbiIsIHNvY2tldF9wYXRoLAorICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXQgPSBsaXN0ZW4oY21kcmVzX3NvY2ssIDEpOwpkaWZmIC0tZ2l0IGEvdHJ1c3R5L3V0aWxzL3JwbWJfZGV2L3JwbWJfZGV2LnJjIGIvdHJ1c3R5L3V0aWxzL3JwbWJfZGV2L3JwbWJfZGV2LnJjCmluZGV4IDllMjAzYjguLjMzZWMwZjIgMTAwNjQ0Ci0tLSBhL3RydXN0eS91dGlscy9ycG1iX2Rldi9ycG1iX2Rldi5yYworKysgYi90cnVzdHkvdXRpbHMvcnBtYl9kZXYvcnBtYl9kZXYucmMKQEAgLTEsMjkgKzEsMzQgQEAKICMgUlBNQiBNb2NrCi1vbiBwb3N0LWZzLWRhdGEKLSAgICBta2RpciAvZGF0YS92ZW5kb3Ivc3MKLSAgICBjaG93biByb290IHN5c3RlbSAvZGF0YS92ZW5kb3Ivc3MKLSAgICBjaG1vZCAwNzcwIC9kYXRhL3ZlbmRvci9zcwotICAgIHJtIC9kYXRhL3ZlbmRvci9zcy9ycG1iX3NvY2sKLSAgICBzdGFydCBycG1iX21vY2tfaW5pdAorb24gcG9zdC1mcworICAgIG1rZGlyIC9tbnQvdmVuZG9yL3BlcnNpc3Qvc3MgMDc3MCByb290IHN5c3RlbQorICAgIGV4ZWNfc3RhcnQgcnBtYl9tb2NrX2luaXQKICAgICBzdGFydCBycG1iX21vY2sKIAorb24gcG9zdC1mcy1kYXRhCisgICAgbWtkaXIgL2RhdGEvdmVuZG9yL3NzIDA3NzAgcm9vdCBzeXN0ZW0KKyAgICBzeW1saW5rIC9tbnQvdmVuZG9yL3BlcnNpc3Qvc3MgL2RhdGEvdmVuZG9yL3NzL3BlcnNpc3QKKyAgICBjaG93biByb290IHN5c3RlbSAvZGF0YS92ZW5kb3Ivc3MvcGVyc2lzdAorICAgIGNobW9kIDA3NzAgL2RhdGEvdmVuZG9yL3NzL3BlcnNpc3QKKwogICAgICMgU3RvcmFnZSBwcm94eQotICAgIHN0YXJ0IHN0b3JhZ2Vwcm94eWQKKyAgICByZXN0YXJ0IHN0b3JhZ2Vwcm94eWQKIAotc2VydmljZSBzdG9yYWdlcHJveHlkIC92ZW5kb3IvYmluL3N0b3JhZ2Vwcm94eWQgLWQgL2Rldi90cnVzdHktaXBjLWRldjAgXAotICAgICAgICAtciAvZGF0YS92ZW5kb3Ivc3MvcnBtYl9zb2NrIC1wIC9kYXRhL3ZlbmRvci9zcyAtdCBzb2NrCi0gICAgY2xhc3MgbWFpbgotICAgIGRpc2FibGVkCi0gICAgdXNlciByb290CitzZXJ2aWNlIHN0b3JhZ2Vwcm94eWQgL3ZlbmRvci9iaW4vc3RvcmFnZXByb3h5ZCAtZCAke3JvLmhhcmR3YXJlLnRydXN0eV9pcGNfZGV2Oi0vZGV2L3RydXN0eS1pcGMtZGV2MH0gXAorICAgICAgICAtciAvZGV2L3NvY2tldC9ycG1iX21vY2sgLXAgL2RhdGEvdmVuZG9yL3NzIC10IHNvY2sKKyAgICBjbGFzcyBlYXJseV9oYWwKKyAgICB1c2VyIHN5c3RlbQorICAgIGdyb3VwIHN5c3RlbQogCi1zZXJ2aWNlIHJwbWJfbW9ja19pbml0IC92ZW5kb3IvYmluL3JwbWJfZGV2IC0tZGV2IC9kYXRhL3ZlbmRvci9zcy9SUE1CX0RBVEEgLS1pbml0IC0tc2l6ZSAyMDQ4CitzZXJ2aWNlIHJwbWJfbW9ja19pbml0IC92ZW5kb3IvYmluL3JwbWJfZGV2IC0tZGV2IC9tbnQvdmVuZG9yL3BlcnNpc3Qvc3MvUlBNQl9EQVRBIC0taW5pdCAtLXNpemUgMjA0OAogICAgIGRpc2FibGVkCiAgICAgdXNlciBzeXN0ZW0KICAgICBncm91cCBzeXN0ZW0KICAgICBvbmVzaG90CiAKLXNlcnZpY2UgcnBtYl9tb2NrIC92ZW5kb3IvYmluL3JwbWJfZGV2IC0tZGV2IC9kYXRhL3ZlbmRvci9zcy9SUE1CX0RBVEEgLS1zb2NrIC9kYXRhL3ZlbmRvci9zcy9ycG1iX3NvY2sKK3NlcnZpY2UgcnBtYl9tb2NrIC92ZW5kb3IvYmluL3JwbWJfZGV2IC0tZGV2IC9tbnQvdmVuZG9yL3BlcnNpc3Qvc3MvUlBNQl9EQVRBIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLS1zb2NrIHJwbWJfbW9jawogICAgIGNsYXNzIG1haW4KICAgICBkaXNhYmxlZAogICAgIHVzZXIgc3lzdGVtCiAgICAgZ3JvdXAgc3lzdGVtCisgICAgc29ja2V0IHJwbWJfbW9jayBzdHJlYW0gNjYwIHN5c3RlbSBzeXN0ZW0KZGlmZiAtLWdpdCBhL3RydXN0eS91dGlscy9ycG1iX2Rldi9ycG1iX2Rldi5zeXN0ZW0ucmMgYi90cnVzdHkvdXRpbHMvcnBtYl9kZXYvcnBtYl9kZXYuc3lzdGVtLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNDE5ZWQKLS0tIC9kZXYvbnVsbAorKysgYi90cnVzdHkvdXRpbHMvcnBtYl9kZXYvcnBtYl9kZXYuc3lzdGVtLnJjCkBAIC0wLDAgKzEsNjQgQEAKK3NlcnZpY2Ugc3RvcmFnZXByb3h5ZF9zeXN0ZW0gL3N5c3RlbV9leHQvYmluL3N0b3JhZ2Vwcm94eWQuc3lzdGVtIFwKKyAgICAgICAgLWQgJHtzdG9yYWdlcHJveHlkX3N5c3RlbS50cnVzdHlfaXBjX2RldjotL2Rldi90cnVzdHktaXBjLWRldjB9IFwKKyAgICAgICAgLXIgL2Rldi9zb2NrZXQvcnBtYl9tb2NrX3N5c3RlbSBcCisgICAgICAgIC1wIC9kYXRhL3NlY3VyZV9zdG9yYWdlX3N5c3RlbSBcCisgICAgICAgIC10IHNvY2sKKyAgICBkaXNhYmxlZAorICAgIHVzZXIgc3lzdGVtCisgICAgZ3JvdXAgc3lzdGVtCisKK3NlcnZpY2UgcnBtYl9tb2NrX2luaXRfc3lzdGVtIC9zeXN0ZW1fZXh0L2Jpbi9ycG1iX2Rldi5zeXN0ZW0gXAorICAgICAgICAtLWRldiAvbW50L3NlY3VyZV9zdG9yYWdlX3JwbWJfc3lzdGVtL3BlcnNpc3QvUlBNQl9EQVRBIC0taW5pdCAtLXNpemUgMjA0OAorICAgIGRpc2FibGVkCisgICAgdXNlciBzeXN0ZW0KKyAgICBncm91cCBzeXN0ZW0KKyAgICBvbmVzaG90CisKK3NlcnZpY2UgcnBtYl9tb2NrX3N5c3RlbSAvc3lzdGVtX2V4dC9iaW4vcnBtYl9kZXYuc3lzdGVtIFwKKyAgICAgICAgLS1kZXYgL21udC9zZWN1cmVfc3RvcmFnZV9ycG1iX3N5c3RlbS9wZXJzaXN0L1JQTUJfREFUQSBcCisgICAgICAgIC0tc29jayBycG1iX21vY2tfc3lzdGVtCisgICAgZGlzYWJsZWQKKyAgICB1c2VyIHN5c3RlbQorICAgIGdyb3VwIHN5c3RlbQorICAgIHNvY2tldCBycG1iX21vY2tfc3lzdGVtIHN0cmVhbSA2NjAgc3lzdGVtIHN5c3RlbQorCisjIHN0b3JhZ2Vwcm94eWQKK29uIGxhdGUtZnMgJiYgXAorICAgIHByb3BlcnR5OnRydXN0eS5zZWN1cml0eV92bS5ub25zZWN1cmVfdm1fcmVhZHk9MSAmJiBcCisgICAgcHJvcGVydHk6c3RvcmFnZXByb3h5ZF9zeXN0ZW0udHJ1c3R5X2lwY19kZXY9KgorICAgIHdhaXQgL2Rldi9zb2NrZXQvcnBtYl9tb2NrX3N5c3RlbQorICAgIHN0YXJ0IHN0b3JhZ2Vwcm94eWRfc3lzdGVtCisKKworIyBSUE1CIE1vY2sKK29uIHBvc3QtZnMgJiYgXAorICAgIHByb3BlcnR5OnRydXN0eS5zZWN1cml0eV92bS5ub25zZWN1cmVfdm1fcmVhZHk9MSAmJiBcCisgICAgcHJvcGVydHk6dHJ1c3R5LnNlY3VyaXR5X3ZtLnZtX2NpZD0qCisgICAgIyBDcmVhdGUgYSBwZXJzaXN0ZW50IGxvY2F0aW9uIGZvciB0aGUgUlBNQiBkYXRhCisgICAgIyAod29yayBhcm91bmQgbGFjayBvZiBSUE1iIGJsb2NrIGRldmljZSBvbiBDRikuCisgICAgIyBmaWxlIGNvbnRleHRzIHNlY3VyZV9zdG9yYWdlX3JwbWJfc3lzdGVtX2ZpbGUKKyAgICAjIChvbmx5IHVzZWQgb24gQ3V0dGxlZmlzaCBhcyB0aGlzIGlzIG5vbiBzZWN1cmUpCisgICAgbWtkaXIgL21ldGFkYXRhL3NlY3VyZV9zdG9yYWdlX3JwbWJfc3lzdGVtIDA3NzAgc3lzdGVtIHN5c3RlbQorICAgIG1rZGlyIC9tbnQvc2VjdXJlX3N0b3JhZ2VfcnBtYl9zeXN0ZW0gMDc3MCBzeXN0ZW0gc3lzdGVtCisgICAgc3ltbGluayAvbWV0YWRhdGEvc2VjdXJlX3N0b3JhZ2VfcnBtYl9zeXN0ZW0gXAorICAgICAgICAgICAgL21udC9zZWN1cmVfc3RvcmFnZV9ycG1iX3N5c3RlbS9wZXJzaXN0CisgICAgIyBDcmVhdGUgYSBzeXN0ZW0gcGVyc2lzdCBkaXJlY3RvcnkgaW4gL21ldGFkYXRhCisgICAgIyAod29yayBhcm91bmQgbGFjayBvZiBkZWRpY2F0ZWQgc3lzdGVtIHBlcnNpc3QgcGFydGl0aW9uKS4KKyAgICAjIGZpbGUgY29udGV4dHMgc2VjdXJlX3N0b3JhZ2VfcGVyc2lzdF9zeXN0ZW1fZmlsZQorICAgIG1rZGlyIC9tZXRhZGF0YS9zZWN1cmVfc3RvcmFnZV9wZXJzaXN0X3N5c3RlbSAwNzcwIHN5c3RlbSBzeXN0ZW0KKyAgICBta2RpciAvbW50L3NlY3VyZV9zdG9yYWdlX3BlcnNpc3Rfc3lzdGVtIDA3NzAgc3lzdGVtIHN5c3RlbQorICAgIHN5bWxpbmsgL21ldGFkYXRhL3NlY3VyZV9zdG9yYWdlX3BlcnNpc3Rfc3lzdGVtIFwKKyAgICAgICAgICAgIC9tbnQvc2VjdXJlX3N0b3JhZ2VfcGVyc2lzdF9zeXN0ZW0vcGVyc2lzdAorICAgIHNldHByb3Agc3RvcmFnZXByb3h5ZF9zeXN0ZW0udHJ1c3R5X2lwY19kZXYgVlNPQ0s6JHt0cnVzdHkuc2VjdXJpdHlfdm0udm1fY2lkfToxCisgICAgZXhlY19zdGFydCBycG1iX21vY2tfaW5pdF9zeXN0ZW0KKyAgICBzdGFydCBycG1iX21vY2tfc3lzdGVtCisKK29uIHBvc3QtZnMtZGF0YSAmJiBcCisgICAgcHJvcGVydHk6dHJ1c3R5LnNlY3VyaXR5X3ZtLm5vbnNlY3VyZV92bV9yZWFkeT0xICYmIFwKKyAgICBwcm9wZXJ0eTpzdG9yYWdlcHJveHlkX3N5c3RlbS50cnVzdHlfaXBjX2Rldj0qCisgICAgIyBmaWxlIGNvbnRleHRzIHNlY3VyZV9zdG9yYWdlX3N5c3RlbV9maWxlCisgICAgbWtkaXIgL2RhdGEvc2VjdXJlX3N0b3JhZ2Vfc3lzdGVtIDA3NzAgcm9vdCBzeXN0ZW0KKyAgICBzeW1saW5rIC9tbnQvc2VjdXJlX3N0b3JhZ2VfcGVyc2lzdF9zeXN0ZW0vcGVyc2lzdCBcCisgICAgICAgICAgICAvZGF0YS9zZWN1cmVfc3RvcmFnZV9zeXN0ZW0vcGVyc2lzdAorICAgIGNob3duIHJvb3Qgc3lzdGVtIC9kYXRhL3NlY3VyZV9zdG9yYWdlX3N5c3RlbS9wZXJzaXN0CisgICAgcmVzdGFydCBzdG9yYWdlcHJveHlkX3N5c3RlbQpkaWZmIC0tZ2l0IGEvdHJ1c3R5L3V0aWxzL3JwbWJfZGV2L3JwbWJfZGV2Lnd2LnN5c3RlbS5yYyBiL3RydXN0eS91dGlscy9ycG1iX2Rldi9ycG1iX2Rldi53di5zeXN0ZW0ucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U3ZjhiNAotLS0gL2Rldi9udWxsCisrKyBiL3RydXN0eS91dGlscy9ycG1iX2Rldi9ycG1iX2Rldi53di5zeXN0ZW0ucmMKQEAgLTAsMCArMSw2MiBAQAorc2VydmljZSBzdG9yYWdlcHJveHlkX3d2X3N5c3RlbSAvc3lzdGVtX2V4dC9iaW4vc3RvcmFnZXByb3h5ZC5zeXN0ZW0gXAorICAgICAgICAtZCAke3N0b3JhZ2Vwcm94eWRfd3Zfc3lzdGVtLnRydXN0eV9pcGNfZGV2Oi0vZGV2L3RydXN0eS1pcGMtZGV2MH0gXAorICAgICAgICAtciAvZGV2L3NvY2tldC9ycG1iX21vY2tfd3Zfc3lzdGVtIFwKKyAgICAgICAgLXAgL2RhdGEvc2VjdXJlX3N0b3JhZ2Vfd3Zfc3lzdGVtIFwKKyAgICAgICAgLXQgc29jaworICAgIGRpc2FibGVkCisgICAgY2xhc3MgaGFsCisgICAgdXNlciBzeXN0ZW0KKyAgICBncm91cCBzeXN0ZW0KKworc2VydmljZSBycG1iX21vY2tfaW5pdF93dl9zeXN0ZW0gL3N5c3RlbV9leHQvYmluL3JwbWJfZGV2Lnd2LnN5c3RlbSBcCisgICAgICAgIC0tZGV2IC9tbnQvc2VjdXJlX3N0b3JhZ2VfcnBtYl93dl9zeXN0ZW0vcGVyc2lzdC9SUE1CX0RBVEEgLS1pbml0IC0tc2l6ZSAyMDQ4CisgICAgZGlzYWJsZWQKKyAgICB1c2VyIHN5c3RlbQorICAgIGdyb3VwIHN5c3RlbQorICAgIG9uZXNob3QKKworc2VydmljZSBycG1iX21vY2tfd3Zfc3lzdGVtIC9zeXN0ZW1fZXh0L2Jpbi9ycG1iX2Rldi53di5zeXN0ZW0gXAorICAgICAgICAtLWRldiAvbW50L3NlY3VyZV9zdG9yYWdlX3JwbWJfd3Zfc3lzdGVtL3BlcnNpc3QvUlBNQl9EQVRBIFwKKyAgICAgICAgLS1zb2NrIHJwbWJfbW9ja193dl9zeXN0ZW0KKyAgICBkaXNhYmxlZAorICAgIHVzZXIgc3lzdGVtCisgICAgZ3JvdXAgc3lzdGVtCisgICAgc29ja2V0IHJwbWJfbW9ja193dl9zeXN0ZW0gc3RyZWFtIDY2MCBzeXN0ZW0gc3lzdGVtCisKKyMgc3RvcmFnZXByb3h5ZAorb24gYm9vdCAmJiBcCisgICAgcHJvcGVydHk6dHJ1c3R5LndpZGV2aW5lX3ZtLm5vbnNlY3VyZV92bV9yZWFkeT0xICYmIFwKKyAgICBwcm9wZXJ0eTpzdG9yYWdlcHJveHlkX3d2X3N5c3RlbS50cnVzdHlfaXBjX2Rldj0qCisgICAgd2FpdCAvZGV2L3NvY2tldC9ycG1iX21vY2tfd3Zfc3lzdGVtCisgICAgZW5hYmxlIHN0b3JhZ2Vwcm94eWRfd3Zfc3lzdGVtCisKKworIyBSUE1CIE1vY2sKK29uIGVhcmx5LWJvb3QgJiYgXAorICAgIHByb3BlcnR5OnJvLmhhcmR3YXJlLnNlY3VyaXR5LnRydXN0eS53aWRldmluZV92bS5zeXN0ZW09MSAmJiBcCisgICAgcHJvcGVydHk6dHJ1c3R5LndpZGV2aW5lX3ZtLnZtX2NpZD0qICYmIFwKKyAgICBwcm9wZXJ0eTpyby5ib290LnZlbmRvci5hcGV4LmNvbS5hbmRyb2lkLnNlcnZpY2VzLndpZGV2aW5lPVwKK2NvbS5hbmRyb2lkLnNlcnZpY2VzLndpZGV2aW5lLmNmX2d1ZXN0X3RydXN0eV9ub25zZWN1cmUKKyAgICAjIENyZWF0ZSBhIHBlcnNpc3RlbnQgbG9jYXRpb24gZm9yIHRoZSBSUE1CIGRhdGEKKyAgICAjICh3b3JrIGFyb3VuZCBsYWNrIG9mIFJQTWIgYmxvY2sgZGV2aWNlIG9uIENGKS4KKyAgICAjIGZpbGUgY29udGV4dHMgc2VjdXJlX3N0b3JhZ2VfcnBtYl9zeXN0ZW1fZmlsZQorICAgICMgKG9ubHkgdXNlZCBvbiBDdXR0bGVmaXNoIGFzIHRoaXMgaXMgbm9uIHNlY3VyZSkKKyAgICBta2RpciAvbWV0YWRhdGEvc2VjdXJlX3N0b3JhZ2VfcnBtYl93dl9zeXN0ZW0gMDc3MCBzeXN0ZW0gc3lzdGVtCisgICAgbWtkaXIgL21udC9zZWN1cmVfc3RvcmFnZV9ycG1iX3d2X3N5c3RlbSAwNzcwIHN5c3RlbSBzeXN0ZW0KKyAgICBzeW1saW5rIC9tZXRhZGF0YS9zZWN1cmVfc3RvcmFnZV9ycG1iX3d2X3N5c3RlbSBcCisgICAgICAgICAgICAvbW50L3NlY3VyZV9zdG9yYWdlX3JwbWJfd3Zfc3lzdGVtL3BlcnNpc3QKKyAgICAjIENyZWF0ZSBhIHN5c3RlbSBwZXJzaXN0IGRpcmVjdG9yeSBpbiAvbWV0YWRhdGEKKyAgICAjICh3b3JrIGFyb3VuZCBsYWNrIG9mIGRlZGljYXRlZCBzeXN0ZW0gcGVyc2lzdCBwYXJ0aXRpb24pLgorICAgICMgZmlsZSBjb250ZXh0cyBzZWN1cmVfc3RvcmFnZV9wZXJzaXN0X3N5c3RlbV9maWxlCisgICAgbWtkaXIgL21ldGFkYXRhL3NlY3VyZV9zdG9yYWdlX3BlcnNpc3Rfd3Zfc3lzdGVtIDA3NzAgc3lzdGVtIHN5c3RlbQorICAgIG1rZGlyIC9tbnQvc2VjdXJlX3N0b3JhZ2VfcGVyc2lzdF93dl9zeXN0ZW0gMDc3MCBzeXN0ZW0gc3lzdGVtCisgICAgc3ltbGluayAvbWV0YWRhdGEvc2VjdXJlX3N0b3JhZ2VfcGVyc2lzdF93dl9zeXN0ZW0gXAorICAgICAgICAgICAgL21udC9zZWN1cmVfc3RvcmFnZV9wZXJzaXN0X3d2X3N5c3RlbS9wZXJzaXN0CisgICAgIyBmaWxlIGNvbnRleHRzIHNlY3VyZV9zdG9yYWdlX3N5c3RlbV9maWxlCisgICAgbWtkaXIgL2RhdGEvc2VjdXJlX3N0b3JhZ2Vfd3Zfc3lzdGVtIDA3NzAgcm9vdCBzeXN0ZW0KKyAgICBzeW1saW5rIC9tbnQvc2VjdXJlX3N0b3JhZ2VfcGVyc2lzdF93dl9zeXN0ZW0vcGVyc2lzdCBcCisgICAgICAgICAgICAvZGF0YS9zZWN1cmVfc3RvcmFnZV93dl9zeXN0ZW0vcGVyc2lzdAorICAgIGNob3duIHJvb3Qgc3lzdGVtIC9kYXRhL3NlY3VyZV9zdG9yYWdlX3d2X3N5c3RlbS9wZXJzaXN0CisgICAgc2V0cHJvcCBzdG9yYWdlcHJveHlkX3d2X3N5c3RlbS50cnVzdHlfaXBjX2RldiBWU09DSzoke3RydXN0eS53aWRldmluZV92bS52bV9jaWR9OjEKKyAgICBleGVjX3N0YXJ0IHJwbWJfbW9ja19pbml0X3d2X3N5c3RlbQorICAgIHN0YXJ0IHJwbWJfbW9ja193dl9zeXN0ZW0KZGlmZiAtLWdpdCBhL3RydXN0eS91dGlscy90cnVzdHktdXQtY3RybC9BbmRyb2lkLmJwIGIvdHJ1c3R5L3V0aWxzL3RydXN0eS11dC1jdHJsL0FuZHJvaWQuYnAKaW5kZXggNmZjMmE0OC4uYzI1NTYxNCAxMDA2NDQKLS0tIGEvdHJ1c3R5L3V0aWxzL3RydXN0eS11dC1jdHJsL0FuZHJvaWQuYnAKKysrIGIvdHJ1c3R5L3V0aWxzL3RydXN0eS11dC1jdHJsL0FuZHJvaWQuYnAKQEAgLTE2LDkgKzE2LDggQEAKICAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCiB9CiAKLWNjX2JpbmFyeSB7Ci0gICAgbmFtZTogInRydXN0eS11dC1jdHJsIiwKLSAgICB2ZW5kb3I6IHRydWUsCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogInRydXN0eS11dC1jdHJsLmRlZmF1bHRzIiwKIAogICAgIHNyY3M6IFsidXQtY3RybC5jIl0sCiAgICAgc2hhcmVkX2xpYnM6IFsKQEAgLTMzLDMgKzMyLDE1IEBACiAgICAgICAgICItV2Vycm9yIiwKICAgICBdLAogfQorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJ0cnVzdHktdXQtY3RybCIsCisgICAgZGVmYXVsdHM6IFsidHJ1c3R5LXV0LWN0cmwuZGVmYXVsdHMiXSwKKyAgICB2ZW5kb3I6IHRydWUsCit9CisKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogInRydXN0eS11dC1jdHJsLnN5c3RlbSIsCisgICAgZGVmYXVsdHM6IFsidHJ1c3R5LXV0LWN0cmwuZGVmYXVsdHMiXSwKKyAgICBzeXN0ZW1fZXh0X3NwZWNpZmljOiB0cnVlLAorfQpkaWZmIC0tZ2l0IGEvdHJ1c3R5L3V0aWxzL3RydXN0eS11dC1jdHJsL3V0LWN0cmwuYyBiL3RydXN0eS91dGlscy90cnVzdHktdXQtY3RybC91dC1jdHJsLmMKaW5kZXggNmNjNjY3MC4uMzFjZmQ0YyAxMDA2NDQKLS0tIGEvdHJ1c3R5L3V0aWxzL3RydXN0eS11dC1jdHJsL3V0LWN0cmwuYworKysgYi90cnVzdHkvdXRpbHMvdHJ1c3R5LXV0LWN0cmwvdXQtY3RybC5jCkBAIC05NSwxMiArOTUsMjYgQEAKICAgICBURVNUX0ZBSUxFRCA9IDEsCiAgICAgVEVTVF9NRVNTQUdFID0gMiwKICAgICBURVNUX1RFWFQgPSAzLAorICAgIFRFU1RfT1BDT0RFX0NPVU5ULAogfTsKIAorc3RhdGljIGludCBnZXRfbXNnX2xlbihjb25zdCBjaGFyKiBidWYsIGludCBtYXhfYnVmX2xlbikgeworICAgIGludCBidWZfbGVuOworICAgIGZvciAoYnVmX2xlbiA9IDA7IGJ1Zl9sZW4gPCBtYXhfYnVmX2xlbjsgYnVmX2xlbisrKSB7CisgICAgICAgIGlmICgodW5zaWduZWQgY2hhcilidWZbYnVmX2xlbl0gPCBURVNUX09QQ09ERV9DT1VOVCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJ1Zl9sZW47Cit9CisKIHN0YXRpYyBpbnQgcnVuX3RydXN0eV91bml0ZXN0KGNvbnN0IGNoYXIqIHV0YXBwKSB7CiAgICAgaW50IGZkOwotICAgIGludCByYzsKLSAgICBjaGFyIHJ4X2J1ZlsxMDI0XTsKKyAgICBjaGFyIHJlYWRfYnVmWzEwMjRdOworICAgIGludCByZWFkX2xlbjsKKyAgICBjaGFyKiByeF9idWY7CisgICAgaW50IHJ4X2J1Zl9sZW47CisgICAgaW50IGNtZCA9IC0xOwogCiAgICAgLyogY29ubmVjdCB0byB1bml0ZXN0IGFwcCAqLwogICAgIGZkID0gdGlwY19jb25uZWN0KGRldl9uYW1lLCB1dGFwcCk7CkBAIC0xMTAsMjIgKzEyNCwzOSBAQAogICAgIH0KIAogICAgIC8qIHdhaXQgZm9yIHRlc3QgdG8gY29tcGxldGUgKi8KKyAgICByeF9idWZfbGVuID0gMDsKICAgICBmb3IgKDs7KSB7Ci0gICAgICAgIHJjID0gcmVhZChmZCwgcnhfYnVmLCBzaXplb2YocnhfYnVmKSk7Ci0gICAgICAgIGlmIChyYyA8PSAwIHx8IHJjID49IChpbnQpc2l6ZW9mKHJ4X2J1ZikpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IFJlYWQgZmFpbGVkOiAlZFxuIiwgX19mdW5jX18sIHJjKTsKLSAgICAgICAgICAgIHRpcGNfY2xvc2UoZmQpOwotICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAocnhfYnVmX2xlbiA9PSAwKSB7CisgICAgICAgICAgICByZWFkX2xlbiA9IHJlYWQoZmQsIHJlYWRfYnVmLCBzaXplb2YocmVhZF9idWYpKTsKKyAgICAgICAgICAgIGlmIChyZWFkX2xlbiA8PSAwIHx8IHJlYWRfbGVuID4gKGludClzaXplb2YocmVhZF9idWYpKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogUmVhZCBmYWlsZWQ6ICVkLCAlc1xuIiwgX19mdW5jX18sIHJlYWRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9sZW4gPCAwID8gc3RyZXJyb3IoZXJybm8pIDogIiIpOworICAgICAgICAgICAgICAgIHRpcGNfY2xvc2UoZmQpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJ4X2J1ZiA9IHJlYWRfYnVmOworICAgICAgICAgICAgcnhfYnVmX2xlbiA9IHJlYWRfbGVuOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHJ4X2J1ZlswXSA9PSBURVNUX1BBU1NFRCkgeworICAgICAgICBpbnQgbXNnX2xlbiA9IGdldF9tc2dfbGVuKHJ4X2J1ZiwgcnhfYnVmX2xlbik7CisgICAgICAgIGlmIChtc2dfbGVuID09IDApIHsKKyAgICAgICAgICAgIGNtZCA9IHJ4X2J1ZlswXTsKKyAgICAgICAgICAgIHJ4X2J1ZisrOworICAgICAgICAgICAgcnhfYnVmX2xlbi0tOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNtZCA9PSBURVNUX1BBU1NFRCkgewogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSBpZiAocnhfYnVmWzBdID09IFRFU1RfRkFJTEVEKSB7CisgICAgICAgIH0gZWxzZSBpZiAoY21kID09IFRFU1RfRkFJTEVEKSB7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIGlmIChyeF9idWZbMF0gPT0gVEVTVF9NRVNTQUdFIHx8IHJ4X2J1ZlswXSA9PSBURVNUX1RFWFQpIHsKLSAgICAgICAgICAgIHdyaXRlKFNURE9VVF9GSUxFTk8sIHJ4X2J1ZiArIDEsIHJjIC0gMSk7CisgICAgICAgIH0gZWxzZSBpZiAoY21kID09IFRFU1RfTUVTU0FHRSB8fCBjbWQgPT0gVEVTVF9URVhUKSB7CisgICAgICAgICAgICBpZiAobXNnX2xlbikgeworICAgICAgICAgICAgICAgIHdyaXRlKFNURE9VVF9GSUxFTk8sIHJ4X2J1ZiwgbXNnX2xlbik7CisgICAgICAgICAgICAgICAgcnhfYnVmICs9IG1zZ19sZW47CisgICAgICAgICAgICAgICAgcnhfYnVmX2xlbiAtPSBtc2dfbGVuOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogQmFkIG1lc3NhZ2UgaGVhZGVyOiAlZFxuIiwgX19mdW5jX18sIHJ4X2J1ZlswXSk7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBCYWQgbWVzc2FnZSBoZWFkZXI6ICVkXG4iLCBfX2Z1bmNfXywgY21kKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpAQCAtMTMzLDcgKzE2NCw3IEBACiAgICAgLyogY2xvc2UgY29ubmVjdGlvbiB0byB1bml0ZXN0IGFwcCAqLwogICAgIHRpcGNfY2xvc2UoZmQpOwogCi0gICAgcmV0dXJuIHJ4X2J1ZlswXSA9PSBURVNUX1BBU1NFRCA/IDAgOiAtMTsKKyAgICByZXR1cm4gY21kID09IFRFU1RfUEFTU0VEID8gMCA6IC0xOwogfQogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsK